zephyr/modules/littlefs/zephyr_lfs_crc.c
Torsten Rasmussen 6b56b3c14e modules: littlefs copy the naive crc function from LittleFS
LittleFS requires a `lfs_crc()` function, however the basic crc
function provided by LittleFS gets disabled when a custom configuration
header is used.

To ensure identical crc behavior let Zephyr have a copy of the basic
lfs_crc.

This allows to ensure identical behavior when moving glue code into
Zephyr repo, and allow us to change to an existing crc implementation
provided natively by Zephyr at a later time.

Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
2022-03-02 15:34:11 +01:00

32 lines
831 B
C

/*
* lfs util functions
*
* Copyright (c) 2017, Arm Limited. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "lfs_util.h"
/* Use the LFS naive CRC implementation until it has been decided which CRC to
* use for LittleFS.
*/
/* Software CRC implementation with small lookup table */
uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size)
{
static const uint32_t rtable[16] = {
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c,
};
const uint8_t *data = buffer;
for (size_t i = 0; i < size; i++) {
crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf];
crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf];
}
return crc;
}