• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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