Skip to content

Commit 4d7fdfc

Browse files
DeepikaCruz Monrreal II
authored andcommitted
Use MbedCRC for LittleFS (0xEDB88320)
CRC used in LittleFS is Reversed ANSI, hence new polynomial added. Reversed polynomials perform shift in reverse direction of standard polynomial, and we do not have option to notify reverse shift to hardware. Hence this option is available in software only.
1 parent e7c166e commit 4d7fdfc

File tree

7 files changed

+86
-9
lines changed

7 files changed

+86
-9
lines changed

drivers/MbedCRC.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ MbedCRC<POLY_32BIT_ANSI, 32>::MbedCRC():
3434
mbed_crc_ctor();
3535
}
3636

37+
template<>
38+
MbedCRC<POLY_32BIT_REV_ANSI, 32>::MbedCRC():
39+
_initial_value(~(0x0)), _final_xor(~(0x0)), _reflect_data(false), _reflect_remainder(false),
40+
_crc_table((uint32_t *)Table_CRC_32bit_Rev_ANSI)
41+
{
42+
mbed_crc_ctor();
43+
}
44+
3745
template<>
3846
MbedCRC<POLY_16BIT_IBM, 16>::MbedCRC():
3947
_initial_value(0), _final_xor(0), _reflect_data(true), _reflect_remainder(true),

drivers/MbedCRC.h

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ class MbedCRC {
275275
p_crc = (uint32_t)(p_crc << (8 - width));
276276
}
277277
// Optimized algorithm for 32BitANSI does not need additional reflect_remainder
278-
if ((TABLE == _mode) && (POLY_32BIT_ANSI == polynomial)) {
278+
if ((TABLE == _mode) && (POLY_32BIT_REV_ANSI == polynomial)) {
279279
*crc = (p_crc ^ _final_xor) & get_crc_mask();
280280
} else {
281281
*crc = (reflect_remainder(p_crc) ^ _final_xor) & get_crc_mask();
@@ -480,9 +480,17 @@ class MbedCRC {
480480
}
481481
} else {
482482
uint32_t *crc_table = (uint32_t *)_crc_table;
483-
for (crc_data_size_t i = 0; i < size; i++) {
484-
p_crc = (p_crc >> 4) ^ crc_table[(p_crc ^ (data[i] >> 0)) & 0xf];
485-
p_crc = (p_crc >> 4) ^ crc_table[(p_crc ^ (data[i] >> 4)) & 0xf];
483+
if (POLY_32BIT_REV_ANSI == polynomial) {
484+
for (crc_data_size_t i = 0; i < size; i++) {
485+
p_crc = (p_crc >> 4) ^ crc_table[(p_crc ^ (data[i] >> 0)) & 0xf];
486+
p_crc = (p_crc >> 4) ^ crc_table[(p_crc ^ (data[i] >> 4)) & 0xf];
487+
}
488+
}
489+
else {
490+
for (crc_data_size_t byte = 0; byte < size; byte++) {
491+
data_byte = reflect_bytes(data[byte]) ^ (p_crc >> (width - 8));
492+
p_crc = crc_table[data_byte] ^ (p_crc << 8);
493+
}
486494
}
487495
}
488496
*crc = p_crc & get_crc_mask();
@@ -497,6 +505,11 @@ class MbedCRC {
497505
MBED_STATIC_ASSERT(width <= 32, "Max 32-bit CRC supported");
498506

499507
#ifdef DEVICE_CRC
508+
if (POLY_32BIT_REV_ANSI == polynomial) {
509+
_crc_table = (uint32_t *)Table_CRC_32bit_Rev_ANSI;
510+
_mode = TABLE;
511+
return;
512+
}
500513
crc_mbed_config_t config;
501514
config.polynomial = polynomial;
502515
config.width = width;
@@ -510,10 +523,14 @@ class MbedCRC {
510523
return;
511524
}
512525
#endif
526+
513527
switch (polynomial) {
514528
case POLY_32BIT_ANSI:
515529
_crc_table = (uint32_t *)Table_CRC_32bit_ANSI;
516530
break;
531+
case POLY_32BIT_REV_ANSI:
532+
_crc_table = (uint32_t *)Table_CRC_32bit_Rev_ANSI;
533+
break;
517534
case POLY_8BIT_CCITT:
518535
_crc_table = (uint32_t *)Table_CRC_8bit_CCITT;
519536
break;

drivers/TableCRC.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,48 @@ extern const uint16_t Table_CRC_16bit_IBM[MBED_CRC_TABLE_SIZE] = {
108108
0x220, 0x8225, 0x822f, 0x22a, 0x823b, 0x23e, 0x234, 0x8231, 0x8213, 0x216, 0x21c, 0x8219
109109
};
110110

111-
extern const uint32_t Table_CRC_32bit_ANSI[MBED_OPTIMIZED_CRC_TABLE_SIZE] = {
111+
extern const uint32_t Table_CRC_32bit_ANSI[MBED_CRC_TABLE_SIZE] = {
112+
0x0, 0x4c11db7, 0x9823b6e, 0xd4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
113+
0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
114+
0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
115+
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
116+
0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
117+
0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
118+
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
119+
0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
120+
0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
121+
0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x18aeb13, 0x54bf6a4, 0x808d07d, 0xcc9cdca,
122+
0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
123+
0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
124+
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
125+
0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
126+
0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
127+
0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
128+
0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
129+
0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
130+
0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
131+
0x315d626, 0x7d4cb91, 0xa97ed48, 0xe56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
132+
0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
133+
0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
134+
0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
135+
0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
136+
0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
137+
0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
138+
0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x29f3d35, 0x65e2082, 0xb1d065b, 0xfdc1bec,
139+
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
140+
0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
141+
0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
142+
0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
143+
0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
144+
};
145+
146+
extern const uint32_t Table_CRC_32bit_Rev_ANSI[MBED_OPTIMIZED_CRC_TABLE_SIZE] = {
112147
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
113148
0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
114149
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
115150
0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
116151
};
117152

153+
118154
/** @}*/
119155
} // namespace mbed

drivers/TableCRC.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ extern const uint8_t Table_CRC_7Bit_SD[MBED_CRC_TABLE_SIZE];
3030
extern const uint8_t Table_CRC_8bit_CCITT[MBED_CRC_TABLE_SIZE];
3131
extern const uint16_t Table_CRC_16bit_CCITT[MBED_CRC_TABLE_SIZE];
3232
extern const uint16_t Table_CRC_16bit_IBM[MBED_CRC_TABLE_SIZE];
33-
extern const uint32_t Table_CRC_32bit_ANSI[MBED_OPTIMIZED_CRC_TABLE_SIZE];
33+
extern const uint32_t Table_CRC_32bit_ANSI[MBED_CRC_TABLE_SIZE];
34+
extern const uint32_t Table_CRC_32bit_Rev_ANSI[MBED_OPTIMIZED_CRC_TABLE_SIZE];
3435

3536
/** @}*/
3637
} // namespace mbed

features/storage/filesystem/littlefs/LittleFileSystem.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@
1818
#include "errno.h"
1919
#include "lfs.h"
2020
#include "lfs_util.h"
21+
#include "MbedCRC.h"
2122

23+
extern "C" void mbed_lfs_crc(uint32_t *crc, const void *buffer, size_t size)
24+
{
25+
uint32_t initial_xor = *crc;
26+
MbedCRC<POLY_32BIT_REV_ANSI, 32> ct(initial_xor, 0x0, true, false);
27+
ct.compute((void *)buffer, size, (uint32_t *) crc);
28+
}
2229

2330
////// Conversion functions //////
2431
static int lfs_toerror(int err)

features/storage/filesystem/littlefs/littlefs/lfs_util.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,19 @@
66
*/
77
#include "lfs_util.h"
88

9+
910
// Only compile if user does not provide custom config
1011
#ifndef LFS_CONFIG
1112

13+
#ifdef __MBED__
14+
extern void mbed_lfs_crc(uint32_t *crc, const void *buffer, size_t size);
1215

1316
// Software CRC implementation with small lookup table
17+
void lfs_crc(uint32_t *restrict crc, const void *buffer, size_t size) {
18+
mbed_lfs_crc(crc, buffer, size);
19+
}
20+
21+
#else
1422
void lfs_crc(uint32_t *restrict crc, const void *buffer, size_t size) {
1523
static const uint32_t rtable[16] = {
1624
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
@@ -20,12 +28,11 @@ void lfs_crc(uint32_t *restrict crc, const void *buffer, size_t size) {
2028
};
2129

2230
const uint8_t *data = buffer;
23-
2431
for (size_t i = 0; i < size; i++) {
2532
*crc = (*crc >> 4) ^ rtable[(*crc ^ (data[i] >> 0)) & 0xf];
2633
*crc = (*crc >> 4) ^ rtable[(*crc ^ (data[i] >> 4)) & 0xf];
2734
}
2835
}
29-
30-
3136
#endif
37+
38+
#endif

hal/crc_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ typedef enum crc_polynomial {
3333
POLY_16BIT_CCITT = 0x1021, // x16+x12+x5+1
3434
POLY_16BIT_IBM = 0x8005, // x16+x15+x2+1
3535
POLY_32BIT_ANSI = 0x04C11DB7, // x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
36+
POLY_32BIT_REV_ANSI = 0xEDB88320
3637
} crc_polynomial_t;
3738

3839
typedef struct crc_mbed_config {

0 commit comments

Comments
 (0)