1 /*
2 * Copyright (c) 2021 Chipsea Technologies (Shenzhen) Corp., Ltd. All rights reserved.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "wb_co_math.h"
17 #include "wb_co_utils.h"
18
19 /// CRC lookup table
20 static const uint32_t crc_tab[256] =
21 {
22 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
23 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
24 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
25 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
26 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
27 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
28 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
29 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
30 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
31 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
32 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
33 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
34 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
35 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
36 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
37 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
38 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
39 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
40 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
41 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
42 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
43 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
44 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
45 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
46 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
47 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
48 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
49 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
50 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
51 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
52 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
53 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
54 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
55 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
56 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
57 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
58 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
59 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
60 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
61 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
62 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
63 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
64 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
65 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
66 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
67 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
68 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
69 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
70 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
71 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
72 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
73 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
74 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
75 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
76 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
77 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
78 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
79 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
80 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
81 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
82 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
83 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
84 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
85 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
86 };
87
88 static const uint8_t crc8_tab[] =
89 {
90 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
91 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
92 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
93 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
94 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
95 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
96 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
97 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
98 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
99 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
100 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
101 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
102 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
103 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
104 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
105 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
106 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
107 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
108 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
109 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
110 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
111 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
112 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
113 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
114 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
115 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
116 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
117 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
118 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
119 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
120 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
121 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
122 };
123
co_crc32(uint32_t addr,uint32_t len,uint32_t crc)124 uint32_t co_crc32(uint32_t addr, uint32_t len, uint32_t crc)
125 {
126 while (len--)
127 {
128 crc = (crc << 8) ^ crc_tab[(crc >> 24) ^ co_read8p(addr++)];
129 }
130
131 return crc;
132 }
133
co_crc8(uint8_t * pdata,uint32_t len,uint8_t crc)134 uint8_t co_crc8(uint8_t *pdata, uint32_t len, uint8_t crc)
135 {
136 while (len --)
137 {
138 crc = crc8_tab[(crc ^ *pdata++) & 0xFF];
139 }
140
141 return crc;
142 }
143
144