=== CRC === Overview ======== NuttX provides CRC (Cyclic Redundancy Check) implementations for CRC8, CRC16, and CRC32 in ``libs/libc/misc/``. Each family offers multiple polynomial variants, following a consistent naming convention. CRC32 Variants ============== NuttX ships several CRC32 variants that differ in polynomial, init value, and final XOR. The two most commonly used are ``crc32()`` and ``crc32_ieee()``. crc32() — NuttX Native ----------------------- The original NuttX CRC32 implementation using the standard ISO 3309 / ITU-T V.42 polynomial (0xEDB88320 reflected). It uses **init value 0** with **no final XOR**: .. code-block:: c uint32_t crc32(FAR const uint8_t *src, size_t len); uint32_t crc32part(FAR const uint8_t *src, size_t len, uint32_t crc32val); This is the default CRC32 used by internal NuttX subsystems (bbsram, sbram, etc.) and is maintained for backward compatibility. crc32_ieee() — Linux/zlib Compatible ------------------------------------- An IEEE-standard CRC32 compatible with Linux ``crc32()`` (from zlib). It uses the same polynomial but with **init value 0xFFFFFFFF** and **final XOR 0xFFFFFFFF**: .. code-block:: c uint32_t crc32_ieee(FAR const uint8_t *src, size_t len); uint32_t crc32_ieeepart(FAR const uint8_t *src, size_t len, uint32_t crc32val); Use this variant when interoperating with Linux systems, e.g., for CRC checksums in network protocols, file transfers, or UART communication layers. Comparison ---------- ============== ============ ========== ========== Function Init Value Final XOR Polynomial ============== ============ ========== ========== crc32() 0x00000000 None 0xEDB88320 crc32_ieee() 0xFFFFFFFF 0xFFFFFFFF 0xEDB88320 ============== ============ ========== ========== Example: computing CRC32 of the string ``"123456789"``: - ``crc32("123456789", 9)`` returns ``0x2DFD2D88`` - ``crc32_ieee("123456789", 9)`` returns ``0xCBF43926`` (matches Linux/zlib) Incremental Calculation ----------------------- Both variants support incremental (chunked) CRC calculation via the ``_part`` functions. For ``crc32_ieee``, the first call should pass ``0`` as the initial value: .. code-block:: c uint32_t crc = 0; crc = crc32_ieeepart(chunk1, len1, crc); crc = crc32_ieeepart(chunk2, len2, crc); /* crc now contains the final CRC of chunk1+chunk2 */ Other CRC32 Variants -------------------- NuttX also provides CRC32 variants using different polynomials: - ``crc32h04c11db7()`` / ``crc32h04c11db7_part()`` — Castagnoli (CRC-32C) - ``crc32hf4acfb13()`` / ``crc32hf4acfb13_part()`` — CRC-32Q CRC16 and CRC8 ============== CRC16 and CRC8 follow the same naming pattern with multiple variant functions. See ``include/nuttx/crc16.h`` and ``include/nuttx/crc8.h`` for available variants.