mirror of
https://github.com/openmv/openmv.git
synced 2025-09-26 23:09:13 +08:00
tools: Add CRC table generator.
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
This commit is contained in:
parent
9b65da9cb7
commit
26aa191ad7
92
tools/gen_crc_table.py
Executable file
92
tools/gen_crc_table.py
Executable file
@ -0,0 +1,92 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# This file is part of the OpenMV project.
|
||||
# Copyright (C) 2025 OpenMV, LLC.
|
||||
#
|
||||
# This work is licensed under the MIT license, see the file LICENSE for details.
|
||||
#
|
||||
# Generate CRC lookup tables for OpenMV CRC implementation
|
||||
|
||||
import argparse
|
||||
|
||||
|
||||
def generate_crc16_table(polynomial):
|
||||
"""Generate CRC16 lookup table"""
|
||||
table = []
|
||||
for i in range(256):
|
||||
crc = i << 8
|
||||
for _ in range(8):
|
||||
if crc & 0x8000:
|
||||
crc = (crc << 1) ^ polynomial
|
||||
else:
|
||||
crc = crc << 1
|
||||
crc &= 0xFFFF
|
||||
table.append(crc)
|
||||
return table
|
||||
|
||||
|
||||
def generate_crc32_table(polynomial):
|
||||
"""Generate CRC32 lookup table"""
|
||||
table = []
|
||||
for i in range(256):
|
||||
crc = i << 24
|
||||
for _ in range(8):
|
||||
if crc & 0x80000000:
|
||||
crc = (crc << 1) ^ polynomial
|
||||
else:
|
||||
crc = crc << 1
|
||||
crc &= 0xFFFFFFFF
|
||||
table.append(crc)
|
||||
return table
|
||||
|
||||
|
||||
def format_c_array(table, name, data_type):
|
||||
"""Format array as C code"""
|
||||
lines = [f"static const {data_type} {name}[256] = {{"]
|
||||
|
||||
for i in range(0, len(table), 8):
|
||||
row = table[i : i + 8]
|
||||
if data_type == "uint16_t":
|
||||
formatted_row = ", ".join(f"0x{val:04X}" for val in row)
|
||||
else: # uint32_t
|
||||
formatted_row = ", ".join(f"0x{val:08X}" for val in row)
|
||||
lines.append(f" {formatted_row},")
|
||||
|
||||
lines.append("};")
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Generate CRC lookup tables for OpenMV CRC implementation"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--crc16-poly",
|
||||
type=lambda x: int(x, 0),
|
||||
default=0xF94F,
|
||||
help="CRC16 polynomial (default: 0xF94F)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--crc32-poly",
|
||||
type=lambda x: int(x, 0),
|
||||
default=0xFA567D89,
|
||||
help="CRC32 polynomial (default: 0xFA567D89)",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Generate CRC16 table
|
||||
crc16_table = generate_crc16_table(args.crc16_poly)
|
||||
|
||||
# Generate CRC32 table
|
||||
crc32_table = generate_crc32_table(args.crc32_poly)
|
||||
|
||||
print(f"// CRC16 lookup table for polynomial 0x{args.crc16_poly:04X}")
|
||||
print(format_c_array(crc16_table, "crc16_table", "uint16_t"))
|
||||
print()
|
||||
print(f"// CRC32 lookup table for polynomial 0x{args.crc32_poly:08X}")
|
||||
print(format_c_array(crc32_table, "crc32_table", "uint32_t"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user