]> begriffs open source - freertos/blob - FreeRTOS-Labs/Source/FreeRTOS-Plus-FAT/ff_crc.c
Update TCP to last release versions in preparation for kernel V10.3.0 release.
[freertos] / FreeRTOS-Labs / Source / FreeRTOS-Plus-FAT / ff_crc.c
1 /*\r
2  * FreeRTOS+FAT build 191128 - Note:  FreeRTOS+FAT is still in the lab!\r
3  * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  * Authors include James Walmsley, Hein Tibosch and Richard Barry\r
5  *\r
6  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
7  * this software and associated documentation files (the "Software"), to deal in\r
8  * the Software without restriction, including without limitation the rights to\r
9  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
10  * the Software, and to permit persons to whom the Software is furnished to do so,\r
11  * subject to the following conditions:\r
12  *\r
13  * The above copyright notice and this permission notice shall be included in all\r
14  * copies or substantial portions of the Software.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * https://www.FreeRTOS.org\r
24  *\r
25  */\r
26 \r
27 /**\r
28  *      @file           ff_crc.c\r
29  *      @ingroup        CRC\r
30  *\r
31  *      @defgroup       CRC CRC Checksums for Strings\r
32  *      @brief          Provides fast hashing functions.\r
33  *\r
34  **/\r
35 \r
36 #include "ff_headers.h"\r
37 \r
38 /*static*/ const uint32_t crc32_table[ 256 ] =\r
39 {\r
40         0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, \r
41     0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, \r
42     0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, \r
43     0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, \r
44     0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, \r
45     0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, \r
46     0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, \r
47     0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, \r
48     0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, \r
49     0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, \r
50     0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, \r
51     0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, \r
52     0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, \r
53     0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, \r
54     0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, \r
55     0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, \r
56     0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, \r
57     0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, \r
58     0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, \r
59     0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, \r
60     0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, \r
61     0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, \r
62     0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, \r
63     0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, \r
64     0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, \r
65     0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, \r
66     0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, \r
67     0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, \r
68     0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, \r
69     0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, \r
70     0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, \r
71     0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, \r
72     0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, \r
73     0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, \r
74     0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, \r
75     0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, \r
76     0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, \r
77     0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, \r
78     0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, \r
79     0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, \r
80     0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, \r
81     0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, \r
82     0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\r
83 };\r
84 \r
85 uint32_t FF_GetCRC32( uint8_t *pbyData, uint32_t stLength )\r
86 {\r
87         \r
88         register uint32_t crc = 0xFFFFFFFF;\r
89         \r
90         while( stLength-- != 0 )\r
91         {\r
92                 crc = ( ( crc >> 8 ) & 0x00FFFFFF ) ^ crc32_table[ ( crc ^ *( pbyData++ ) ) & 0x000000FF ];\r
93         }\r
94 \r
95         return crc ^ 0xFFFFFFFF;\r
96 }\r
97 \r
98 \r
99 \r
100 \r
101 static const uint8_t crc16_table_low[ 256 ] =\r
102 {\r
103     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
104     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040, \r
105     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
106     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
107     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
108     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
109     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
110     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
111     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
112     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
113     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
114     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
115     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
116     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
117     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
118     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
119     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
120     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
121     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
122     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
123     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
124     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
125     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
126     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
127     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
128     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
129     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
130     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
131     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
132     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
133     0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041,\r
134     0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040,\r
135 };\r
136 \r
137 static const uint8_t crc16_table_high[256] = \r
138 {\r
139     0x000, 0x0c0, 0x0c1, 0x001, 0x0c3, 0x003, 0x002, 0x0c2,\r
140     0x0c6, 0x006, 0x007, 0x0c7, 0x005, 0x0c5, 0x0c4, 0x004,\r
141     0x0cc, 0x00c, 0x00d, 0x0cd, 0x00f, 0x0cf, 0x0ce, 0x00e,\r
142     0x00a, 0x0ca, 0x0cb, 0x00b, 0x0c9, 0x009, 0x008, 0x0c8,\r
143     0x0d8, 0x018, 0x019, 0x0d9, 0x01b, 0x0db, 0x0da, 0x01a,\r
144     0x01e, 0x0de, 0x0df, 0x01f, 0x0dd, 0x01d, 0x01c, 0x0dc,\r
145     0x014, 0x0d4, 0x0d5, 0x015, 0x0d7, 0x017, 0x016, 0x0d6,\r
146     0x0d2, 0x012, 0x013, 0x0d3, 0x011, 0x0d1, 0x0d0, 0x010,\r
147     0x0f0, 0x030, 0x031, 0x0f1, 0x033, 0x0f3, 0x0f2, 0x032,\r
148     0x036, 0x0f6, 0x0f7, 0x037, 0x0f5, 0x035, 0x034, 0x0f4,\r
149     0x03c, 0x0fc, 0x0fd, 0x03d, 0x0ff, 0x03f, 0x03e, 0x0fe,\r
150     0x0fa, 0x03a, 0x03b, 0x0fb, 0x039, 0x0f9, 0x0f8, 0x038,\r
151     0x028, 0x0e8, 0x0e9, 0x029, 0x0eb, 0x02b, 0x02a, 0x0ea,\r
152     0x0ee, 0x02e, 0x02f, 0x0ef, 0x02d, 0x0ed, 0x0ec, 0x02c,\r
153     0x0e4, 0x024, 0x025, 0x0e5, 0x027, 0x0e7, 0x0e6, 0x026,\r
154     0x022, 0x0e2, 0x0e3, 0x023, 0x0e1, 0x021, 0x020, 0x0e0,\r
155     0x0a0, 0x060, 0x061, 0x0a1, 0x063, 0x0a3, 0x0a2, 0x062,\r
156     0x066, 0x0a6, 0x0a7, 0x067, 0x0a5, 0x065, 0x064, 0x0a4,\r
157     0x06c, 0x0ac, 0x0ad, 0x06d, 0x0af, 0x06f, 0x06e, 0x0ae,\r
158     0x0aa, 0x06a, 0x06b, 0x0ab, 0x069, 0x0a9, 0x0a8, 0x068,\r
159     0x078, 0x0b8, 0x0b9, 0x079, 0x0bb, 0x07b, 0x07a, 0x0ba,\r
160     0x0be, 0x07e, 0x07f, 0x0bf, 0x07d, 0x0bd, 0x0bc, 0x07c,\r
161     0x0b4, 0x074, 0x075, 0x0b5, 0x077, 0x0b7, 0x0b6, 0x076,\r
162     0x072, 0x0b2, 0x0b3, 0x073, 0x0b1, 0x071, 0x070, 0x0b0,\r
163     0x050, 0x090, 0x091, 0x051, 0x093, 0x053, 0x052, 0x092,\r
164     0x096, 0x056, 0x057, 0x097, 0x055, 0x095, 0x094, 0x054,\r
165     0x09c, 0x05c, 0x05d, 0x09d, 0x05f, 0x09f, 0x09e, 0x05e,\r
166     0x05a, 0x09a, 0x09b, 0x05b, 0x099, 0x059, 0x058, 0x098,\r
167     0x088, 0x048, 0x049, 0x089, 0x04b, 0x08b, 0x08a, 0x04a,\r
168     0x04e, 0x08e, 0x08f, 0x04f, 0x08d, 0x04d, 0x04c, 0x08c,\r
169     0x044, 0x084, 0x085, 0x045, 0x087, 0x047, 0x046, 0x086,\r
170     0x082, 0x042, 0x043, 0x083, 0x041, 0x081, 0x080, 0x040,\r
171 };\r
172 \r
173 /*****************************************************************************\r
174  * Description: Function to 16 bit CRC check a block of memory\r
175 \r
176  *\r
177  * Parameters:  pbyData - Pointer to the source data\r
178  *              stLength - The length to CRC\r
179  *\r
180  * Return value: The 16 bit CRC value\r
181  *\r
182  *****************************************************************************/\r
183 \r
184 uint16_t FF_GetCRC16( uint8_t *pbyData, uint32_t stLength )\r
185 {\r
186     uint8_t     bTableValue;\r
187     uint16_t wCRC = 0;\r
188 \r
189     while( stLength-- != 0 )\r
190         {\r
191         bTableValue = ( uint8_t ) ( (wCRC & 0x00FF ) ^ *pbyData++ );\r
192         wCRC = ( uint16_t ) ( ( ( crc16_table_high[ bTableValue ] ) << 8 ) +\r
193              ( crc16_table_low[ bTableValue ] ^ ( ( wCRC >> 8 ) & 0x00FF ) ) );\r
194     }\r
195 \r
196     return wCRC;\r
197 }\r
198 \r
199 \r
200 static const uint8_t crc8_table[256] =\r
201 {\r
202     0,   94,  188, 226, 97,  63,  221, 131, \r
203     194, 156, 126, 32,  163, 253, 31,  65,\r
204     157, 195, 33,  127, 252, 162, 64,  30,\r
205     95,  1,   227, 189, 62,  96,  130, 220,\r
206     35,  125, 159, 193, 66,  28,  254, 160,\r
207     225, 191, 93,  3,   128, 222, 60,  98,\r
208     190, 224, 2,   92,  223, 129, 99,  61,\r
209     124, 34,  192, 158, 29,  67,  161, 255,\r
210     70,  24,  250, 164, 39,  121, 155, 197,\r
211     132, 218, 56,  102, 229, 187, 89,  7,\r
212     219, 133, 103, 57,  186, 228, 6,   88,\r
213     25,  71,  165, 251, 120, 38,  196, 154,\r
214     101, 59,  217, 135, 4,   90,  184, 230,\r
215     167, 249, 27,  69,  198, 152, 122, 36,\r
216     248, 166, 68,  26,  153, 199, 37,  123,\r
217     58,  100, 134, 216, 91,  5,   231, 185,\r
218     140, 210, 48,  110, 237, 179, 81,  15, \r
219     78,  16,  242, 172, 47,  113, 147, 205,\r
220     17,  79,  173, 243, 112, 46,  204, 146,\r
221     211, 141, 111, 49,  178, 236, 14,  80,\r
222     175, 241, 19,  77,  206, 144, 114, 44,\r
223     109, 51,  209, 143, 12,  82,  176, 238,\r
224     50,  108, 142, 208, 83,  13,  239, 177,\r
225     240, 174, 76,  18,  145, 207, 45,  115,\r
226     202, 148, 118, 40,  171, 245, 23,  73, \r
227     8,   86,  180, 234, 105, 55,  213, 139,\r
228     87,  9,   235, 181, 54,  104, 138, 212,\r
229     149, 203, 41,  119, 244, 170, 72,  22,\r
230     233, 183, 85,  11,  136, 214, 52,  106,\r
231     43,  117, 151, 201, 74,  20,  246, 168,\r
232     116, 42,  200, 150, 21,  75,  169, 247,\r
233     182, 232, 10,  84,  215, 137, 107, 53\r
234 };\r
235  \r
236 /*****************************************************************************\r
237  * Description: Function to CRC check a block of memory\r
238  *\r
239  * Parameters:  pbyData - Pointer to the source data\r
240  *              stLength - The length to CRC\r
241  *\r
242  * Return value: The 8 bit CRC value\r
243  *\r
244  *****************************************************************************/\r
245 \r
246 uint8_t FF_GetCRC8( uint8_t *pbyData, uint32_t stLength )\r
247 {\r
248     uint8_t byCRC = 0, byData;\r
249     while( stLength-- != 0 )\r
250         {\r
251         byData = *pbyData++;\r
252         byCRC = crc8_table[ ( byCRC ^ byData ) ];\r
253     }\r
254 \r
255     return byCRC;\r
256 }\r