119ea8026Sopenharmony_ci/*
219ea8026Sopenharmony_ci * lfs util functions
319ea8026Sopenharmony_ci *
419ea8026Sopenharmony_ci * Copyright (c) 2022, The littlefs authors.
519ea8026Sopenharmony_ci * Copyright (c) 2017, Arm Limited. All rights reserved.
619ea8026Sopenharmony_ci * SPDX-License-Identifier: BSD-3-Clause
719ea8026Sopenharmony_ci */
819ea8026Sopenharmony_ci#include "lfs_util.h"
919ea8026Sopenharmony_ci
1019ea8026Sopenharmony_ci// Only compile if user does not provide custom config
1119ea8026Sopenharmony_ci#ifndef LFS_CONFIG
1219ea8026Sopenharmony_ci
1319ea8026Sopenharmony_ci
1419ea8026Sopenharmony_ci// Software CRC implementation with small lookup table
1519ea8026Sopenharmony_ciuint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size) {
1619ea8026Sopenharmony_ci    static const uint32_t rtable[16] = {
1719ea8026Sopenharmony_ci        0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
1819ea8026Sopenharmony_ci        0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
1919ea8026Sopenharmony_ci        0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
2019ea8026Sopenharmony_ci        0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c,
2119ea8026Sopenharmony_ci    };
2219ea8026Sopenharmony_ci
2319ea8026Sopenharmony_ci    const uint8_t *data = buffer;
2419ea8026Sopenharmony_ci
2519ea8026Sopenharmony_ci    for (size_t i = 0; i < size; i++) {
2619ea8026Sopenharmony_ci        crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf];
2719ea8026Sopenharmony_ci        crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf];
2819ea8026Sopenharmony_ci    }
2919ea8026Sopenharmony_ci
3019ea8026Sopenharmony_ci    return crc;
3119ea8026Sopenharmony_ci}
3219ea8026Sopenharmony_ci
3319ea8026Sopenharmony_ci
3419ea8026Sopenharmony_ci#endif
35