176af099aSliuyi /*
276af099aSliuyi * (C) Copyright 2017 Fuzhou Rockchip Electronics Co., Ltd
376af099aSliuyi * Seth Liu 2017.03.01
476af099aSliuyi *
576af099aSliuyi * SPDX-License-Identifier: GPL-2.0+
676af099aSliuyi */
776af099aSliuyi #include "DefineHeader.h"
876af099aSliuyi UINT gTable_Crc32[256] =
9c30d921cSKever Yang {//crc32 factor 0x04C10DB7
1076af099aSliuyi 0x00000000, 0x04c10db7, 0x09821b6e, 0x0d4316d9,
1176af099aSliuyi 0x130436dc, 0x17c53b6b, 0x1a862db2, 0x1e472005,
1276af099aSliuyi 0x26086db8, 0x22c9600f, 0x2f8a76d6, 0x2b4b7b61,
1376af099aSliuyi 0x350c5b64, 0x31cd56d3, 0x3c8e400a, 0x384f4dbd,
1476af099aSliuyi 0x4c10db70, 0x48d1d6c7, 0x4592c01e, 0x4153cda9,
1576af099aSliuyi 0x5f14edac, 0x5bd5e01b, 0x5696f6c2, 0x5257fb75,
1676af099aSliuyi 0x6a18b6c8, 0x6ed9bb7f, 0x639aada6, 0x675ba011,
1776af099aSliuyi 0x791c8014, 0x7ddd8da3, 0x709e9b7a, 0x745f96cd,
1876af099aSliuyi 0x9821b6e0, 0x9ce0bb57, 0x91a3ad8e, 0x9562a039,
1976af099aSliuyi 0x8b25803c, 0x8fe48d8b, 0x82a79b52, 0x866696e5,
2076af099aSliuyi 0xbe29db58, 0xbae8d6ef, 0xb7abc036, 0xb36acd81,
2176af099aSliuyi 0xad2ded84, 0xa9ece033, 0xa4aff6ea, 0xa06efb5d,
2276af099aSliuyi 0xd4316d90, 0xd0f06027, 0xddb376fe, 0xd9727b49,
2376af099aSliuyi 0xc7355b4c, 0xc3f456fb, 0xceb74022, 0xca764d95,
2476af099aSliuyi 0xf2390028, 0xf6f80d9f, 0xfbbb1b46, 0xff7a16f1,
2576af099aSliuyi 0xe13d36f4, 0xe5fc3b43, 0xe8bf2d9a, 0xec7e202d,
2676af099aSliuyi 0x34826077, 0x30436dc0, 0x3d007b19, 0x39c176ae,
2776af099aSliuyi 0x278656ab, 0x23475b1c, 0x2e044dc5, 0x2ac54072,
2876af099aSliuyi 0x128a0dcf, 0x164b0078, 0x1b0816a1, 0x1fc91b16,
2976af099aSliuyi 0x018e3b13, 0x054f36a4, 0x080c207d, 0x0ccd2dca,
3076af099aSliuyi 0x7892bb07, 0x7c53b6b0, 0x7110a069, 0x75d1adde,
3176af099aSliuyi 0x6b968ddb, 0x6f57806c, 0x621496b5, 0x66d59b02,
3276af099aSliuyi 0x5e9ad6bf, 0x5a5bdb08, 0x5718cdd1, 0x53d9c066,
3376af099aSliuyi 0x4d9ee063, 0x495fedd4, 0x441cfb0d, 0x40ddf6ba,
3476af099aSliuyi 0xaca3d697, 0xa862db20, 0xa521cdf9, 0xa1e0c04e,
3576af099aSliuyi 0xbfa7e04b, 0xbb66edfc, 0xb625fb25, 0xb2e4f692,
3676af099aSliuyi 0x8aabbb2f, 0x8e6ab698, 0x8329a041, 0x87e8adf6,
3776af099aSliuyi 0x99af8df3, 0x9d6e8044, 0x902d969d, 0x94ec9b2a,
3876af099aSliuyi 0xe0b30de7, 0xe4720050, 0xe9311689, 0xedf01b3e,
3976af099aSliuyi 0xf3b73b3b, 0xf776368c, 0xfa352055, 0xfef42de2,
4076af099aSliuyi 0xc6bb605f, 0xc27a6de8, 0xcf397b31, 0xcbf87686,
4176af099aSliuyi 0xd5bf5683, 0xd17e5b34, 0xdc3d4ded, 0xd8fc405a,
4276af099aSliuyi 0x6904c0ee, 0x6dc5cd59, 0x6086db80, 0x6447d637,
4376af099aSliuyi 0x7a00f632, 0x7ec1fb85, 0x7382ed5c, 0x7743e0eb,
4476af099aSliuyi 0x4f0cad56, 0x4bcda0e1, 0x468eb638, 0x424fbb8f,
4576af099aSliuyi 0x5c089b8a, 0x58c9963d, 0x558a80e4, 0x514b8d53,
4676af099aSliuyi 0x25141b9e, 0x21d51629, 0x2c9600f0, 0x28570d47,
4776af099aSliuyi 0x36102d42, 0x32d120f5, 0x3f92362c, 0x3b533b9b,
4876af099aSliuyi 0x031c7626, 0x07dd7b91, 0x0a9e6d48, 0x0e5f60ff,
4976af099aSliuyi 0x101840fa, 0x14d94d4d, 0x199a5b94, 0x1d5b5623,
5076af099aSliuyi 0xf125760e, 0xf5e47bb9, 0xf8a76d60, 0xfc6660d7,
5176af099aSliuyi 0xe22140d2, 0xe6e04d65, 0xeba35bbc, 0xef62560b,
5276af099aSliuyi 0xd72d1bb6, 0xd3ec1601, 0xdeaf00d8, 0xda6e0d6f,
5376af099aSliuyi 0xc4292d6a, 0xc0e820dd, 0xcdab3604, 0xc96a3bb3,
5476af099aSliuyi 0xbd35ad7e, 0xb9f4a0c9, 0xb4b7b610, 0xb076bba7,
5576af099aSliuyi 0xae319ba2, 0xaaf09615, 0xa7b380cc, 0xa3728d7b,
5676af099aSliuyi 0x9b3dc0c6, 0x9ffccd71, 0x92bfdba8, 0x967ed61f,
5776af099aSliuyi 0x8839f61a, 0x8cf8fbad, 0x81bbed74, 0x857ae0c3,
5876af099aSliuyi 0x5d86a099, 0x5947ad2e, 0x5404bbf7, 0x50c5b640,
5976af099aSliuyi 0x4e829645, 0x4a439bf2, 0x47008d2b, 0x43c1809c,
6076af099aSliuyi 0x7b8ecd21, 0x7f4fc096, 0x720cd64f, 0x76cddbf8,
6176af099aSliuyi 0x688afbfd, 0x6c4bf64a, 0x6108e093, 0x65c9ed24,
6276af099aSliuyi 0x11967be9, 0x1557765e, 0x18146087, 0x1cd56d30,
6376af099aSliuyi 0x02924d35, 0x06534082, 0x0b10565b, 0x0fd15bec,
6476af099aSliuyi 0x379e1651, 0x335f1be6, 0x3e1c0d3f, 0x3add0088,
6576af099aSliuyi 0x249a208d, 0x205b2d3a, 0x2d183be3, 0x29d93654,
6676af099aSliuyi 0xc5a71679, 0xc1661bce, 0xcc250d17, 0xc8e400a0,
6776af099aSliuyi 0xd6a320a5, 0xd2622d12, 0xdf213bcb, 0xdbe0367c,
6876af099aSliuyi 0xe3af7bc1, 0xe76e7676, 0xea2d60af, 0xeeec6d18,
6976af099aSliuyi 0xf0ab4d1d, 0xf46a40aa, 0xf9295673, 0xfde85bc4,
7076af099aSliuyi 0x89b7cd09, 0x8d76c0be, 0x8035d667, 0x84f4dbd0,
7176af099aSliuyi 0x9ab3fbd5, 0x9e72f662, 0x9331e0bb, 0x97f0ed0c,
7276af099aSliuyi 0xafbfa0b1, 0xab7ead06, 0xa63dbbdf, 0xa2fcb668,
7376af099aSliuyi 0xbcbb966d, 0xb87a9bda, 0xb5398d03, 0xb1f880b4,
7476af099aSliuyi };
75c30d921cSKever Yang #define tole(x) (x)
76c30d921cSKever Yang /*factor is 0xedb88320*/
77c30d921cSKever Yang unsigned int crc32table_le[] = {
78c30d921cSKever Yang tole(0x00000000L), tole(0x77073096L), tole(0xee0e612cL), tole(0x990951baL),
79c30d921cSKever Yang tole(0x076dc419L), tole(0x706af48fL), tole(0xe963a535L), tole(0x9e6495a3L),
80c30d921cSKever Yang tole(0x0edb8832L), tole(0x79dcb8a4L), tole(0xe0d5e91eL), tole(0x97d2d988L),
81c30d921cSKever Yang tole(0x09b64c2bL), tole(0x7eb17cbdL), tole(0xe7b82d07L), tole(0x90bf1d91L),
82c30d921cSKever Yang tole(0x1db71064L), tole(0x6ab020f2L), tole(0xf3b97148L), tole(0x84be41deL),
83c30d921cSKever Yang tole(0x1adad47dL), tole(0x6ddde4ebL), tole(0xf4d4b551L), tole(0x83d385c7L),
84c30d921cSKever Yang tole(0x136c9856L), tole(0x646ba8c0L), tole(0xfd62f97aL), tole(0x8a65c9ecL),
85c30d921cSKever Yang tole(0x14015c4fL), tole(0x63066cd9L), tole(0xfa0f3d63L), tole(0x8d080df5L),
86c30d921cSKever Yang tole(0x3b6e20c8L), tole(0x4c69105eL), tole(0xd56041e4L), tole(0xa2677172L),
87c30d921cSKever Yang tole(0x3c03e4d1L), tole(0x4b04d447L), tole(0xd20d85fdL), tole(0xa50ab56bL),
88c30d921cSKever Yang tole(0x35b5a8faL), tole(0x42b2986cL), tole(0xdbbbc9d6L), tole(0xacbcf940L),
89c30d921cSKever Yang tole(0x32d86ce3L), tole(0x45df5c75L), tole(0xdcd60dcfL), tole(0xabd13d59L),
90c30d921cSKever Yang tole(0x26d930acL), tole(0x51de003aL), tole(0xc8d75180L), tole(0xbfd06116L),
91c30d921cSKever Yang tole(0x21b4f4b5L), tole(0x56b3c423L), tole(0xcfba9599L), tole(0xb8bda50fL),
92c30d921cSKever Yang tole(0x2802b89eL), tole(0x5f058808L), tole(0xc60cd9b2L), tole(0xb10be924L),
93c30d921cSKever Yang tole(0x2f6f7c87L), tole(0x58684c11L), tole(0xc1611dabL), tole(0xb6662d3dL),
94c30d921cSKever Yang tole(0x76dc4190L), tole(0x01db7106L), tole(0x98d220bcL), tole(0xefd5102aL),
95c30d921cSKever Yang tole(0x71b18589L), tole(0x06b6b51fL), tole(0x9fbfe4a5L), tole(0xe8b8d433L),
96c30d921cSKever Yang tole(0x7807c9a2L), tole(0x0f00f934L), tole(0x9609a88eL), tole(0xe10e9818L),
97c30d921cSKever Yang tole(0x7f6a0dbbL), tole(0x086d3d2dL), tole(0x91646c97L), tole(0xe6635c01L),
98c30d921cSKever Yang tole(0x6b6b51f4L), tole(0x1c6c6162L), tole(0x856530d8L), tole(0xf262004eL),
99c30d921cSKever Yang tole(0x6c0695edL), tole(0x1b01a57bL), tole(0x8208f4c1L), tole(0xf50fc457L),
100c30d921cSKever Yang tole(0x65b0d9c6L), tole(0x12b7e950L), tole(0x8bbeb8eaL), tole(0xfcb9887cL),
101c30d921cSKever Yang tole(0x62dd1ddfL), tole(0x15da2d49L), tole(0x8cd37cf3L), tole(0xfbd44c65L),
102c30d921cSKever Yang tole(0x4db26158L), tole(0x3ab551ceL), tole(0xa3bc0074L), tole(0xd4bb30e2L),
103c30d921cSKever Yang tole(0x4adfa541L), tole(0x3dd895d7L), tole(0xa4d1c46dL), tole(0xd3d6f4fbL),
104c30d921cSKever Yang tole(0x4369e96aL), tole(0x346ed9fcL), tole(0xad678846L), tole(0xda60b8d0L),
105c30d921cSKever Yang tole(0x44042d73L), tole(0x33031de5L), tole(0xaa0a4c5fL), tole(0xdd0d7cc9L),
106c30d921cSKever Yang tole(0x5005713cL), tole(0x270241aaL), tole(0xbe0b1010L), tole(0xc90c2086L),
107c30d921cSKever Yang tole(0x5768b525L), tole(0x206f85b3L), tole(0xb966d409L), tole(0xce61e49fL),
108c30d921cSKever Yang tole(0x5edef90eL), tole(0x29d9c998L), tole(0xb0d09822L), tole(0xc7d7a8b4L),
109c30d921cSKever Yang tole(0x59b33d17L), tole(0x2eb40d81L), tole(0xb7bd5c3bL), tole(0xc0ba6cadL),
110c30d921cSKever Yang tole(0xedb88320L), tole(0x9abfb3b6L), tole(0x03b6e20cL), tole(0x74b1d29aL),
111c30d921cSKever Yang tole(0xead54739L), tole(0x9dd277afL), tole(0x04db2615L), tole(0x73dc1683L),
112c30d921cSKever Yang tole(0xe3630b12L), tole(0x94643b84L), tole(0x0d6d6a3eL), tole(0x7a6a5aa8L),
113c30d921cSKever Yang tole(0xe40ecf0bL), tole(0x9309ff9dL), tole(0x0a00ae27L), tole(0x7d079eb1L),
114c30d921cSKever Yang tole(0xf00f9344L), tole(0x8708a3d2L), tole(0x1e01f268L), tole(0x6906c2feL),
115c30d921cSKever Yang tole(0xf762575dL), tole(0x806567cbL), tole(0x196c3671L), tole(0x6e6b06e7L),
116c30d921cSKever Yang tole(0xfed41b76L), tole(0x89d32be0L), tole(0x10da7a5aL), tole(0x67dd4accL),
117c30d921cSKever Yang tole(0xf9b9df6fL), tole(0x8ebeeff9L), tole(0x17b7be43L), tole(0x60b08ed5L),
118c30d921cSKever Yang tole(0xd6d6a3e8L), tole(0xa1d1937eL), tole(0x38d8c2c4L), tole(0x4fdff252L),
119c30d921cSKever Yang tole(0xd1bb67f1L), tole(0xa6bc5767L), tole(0x3fb506ddL), tole(0x48b2364bL),
120c30d921cSKever Yang tole(0xd80d2bdaL), tole(0xaf0a1b4cL), tole(0x36034af6L), tole(0x41047a60L),
121c30d921cSKever Yang tole(0xdf60efc3L), tole(0xa867df55L), tole(0x316e8eefL), tole(0x4669be79L),
122c30d921cSKever Yang tole(0xcb61b38cL), tole(0xbc66831aL), tole(0x256fd2a0L), tole(0x5268e236L),
123c30d921cSKever Yang tole(0xcc0c7795L), tole(0xbb0b4703L), tole(0x220216b9L), tole(0x5505262fL),
124c30d921cSKever Yang tole(0xc5ba3bbeL), tole(0xb2bd0b28L), tole(0x2bb45a92L), tole(0x5cb36a04L),
125c30d921cSKever Yang tole(0xc2d7ffa7L), tole(0xb5d0cf31L), tole(0x2cd99e8bL), tole(0x5bdeae1dL),
126c30d921cSKever Yang tole(0x9b64c2b0L), tole(0xec63f226L), tole(0x756aa39cL), tole(0x026d930aL),
127c30d921cSKever Yang tole(0x9c0906a9L), tole(0xeb0e363fL), tole(0x72076785L), tole(0x05005713L),
128c30d921cSKever Yang tole(0x95bf4a82L), tole(0xe2b87a14L), tole(0x7bb12baeL), tole(0x0cb61b38L),
129c30d921cSKever Yang tole(0x92d28e9bL), tole(0xe5d5be0dL), tole(0x7cdcefb7L), tole(0x0bdbdf21L),
130c30d921cSKever Yang tole(0x86d3d2d4L), tole(0xf1d4e242L), tole(0x68ddb3f8L), tole(0x1fda836eL),
131c30d921cSKever Yang tole(0x81be16cdL), tole(0xf6b9265bL), tole(0x6fb077e1L), tole(0x18b74777L),
132c30d921cSKever Yang tole(0x88085ae6L), tole(0xff0f6a70L), tole(0x66063bcaL), tole(0x11010b5cL),
133c30d921cSKever Yang tole(0x8f659effL), tole(0xf862ae69L), tole(0x616bffd3L), tole(0x166ccf45L),
134c30d921cSKever Yang tole(0xa00ae278L), tole(0xd70dd2eeL), tole(0x4e048354L), tole(0x3903b3c2L),
135c30d921cSKever Yang tole(0xa7672661L), tole(0xd06016f7L), tole(0x4969474dL), tole(0x3e6e77dbL),
136c30d921cSKever Yang tole(0xaed16a4aL), tole(0xd9d65adcL), tole(0x40df0b66L), tole(0x37d83bf0L),
137c30d921cSKever Yang tole(0xa9bcae53L), tole(0xdebb9ec5L), tole(0x47b2cf7fL), tole(0x30b5ffe9L),
138c30d921cSKever Yang tole(0xbdbdf21cL), tole(0xcabac28aL), tole(0x53b39330L), tole(0x24b4a3a6L),
139c30d921cSKever Yang tole(0xbad03605L), tole(0xcdd70693L), tole(0x54de5729L), tole(0x23d967bfL),
140c30d921cSKever Yang tole(0xb3667a2eL), tole(0xc4614ab8L), tole(0x5d681b02L), tole(0x2a6f2b94L),
141c30d921cSKever Yang tole(0xb40bbe37L), tole(0xc30c8ea1L), tole(0x5a05df1bL), tole(0x2d02ef8dL)
142c30d921cSKever Yang };
143c30d921cSKever Yang
144c30d921cSKever Yang
14576af099aSliuyi #define rr_max 104 /* Number of parity checks, rr = deg[g(x)] */
14676af099aSliuyi #define parallel 8 //bit count
14776af099aSliuyi #define mm 13//limit count
14876af099aSliuyi #define nn 8191//code size
14976af099aSliuyi #define kk 4120//info length
15076af099aSliuyi #define tt 8//correct count
15176af099aSliuyi
15276af099aSliuyi #define tt2 2*tt
15376af099aSliuyi UINT s[tt2+1]; // Syndrome values
15476af099aSliuyi
15576af099aSliuyi UINT rr;//redundant length // BCH code parameters
15676af099aSliuyi
15776af099aSliuyi
15876af099aSliuyi UINT p[mm + 1];
15976af099aSliuyi UINT alpha_to[nn+1], index_of[nn+1] ; // Galois field
16076af099aSliuyi UINT gg[rr_max+1] ; // Generator polynomial
16176af099aSliuyi
16276af099aSliuyi UINT ggx1=0;
16376af099aSliuyi UINT ggx2=0;
16476af099aSliuyi UINT ggx3=0;
16576af099aSliuyi UINT ggx4=0;
166c30d921cSKever Yang
16776af099aSliuyi // get crc32 value
CRC_32(unsigned char * pData,UINT ulSize)16876af099aSliuyi UINT CRC_32(unsigned char* pData, UINT ulSize)
16976af099aSliuyi {
17076af099aSliuyi UINT i;
17176af099aSliuyi UINT nAccum = 0;
17276af099aSliuyi
17376af099aSliuyi for ( i = 0; i < ulSize; i++)
17476af099aSliuyi nAccum = (nAccum << 8) ^ gTable_Crc32[(nAccum >> 24) ^ (*pData++)];
17576af099aSliuyi return nAccum;
17676af099aSliuyi }
177c30d921cSKever Yang #define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8)
178c30d921cSKever Yang
crc32_le(unsigned int crc,unsigned char * p,unsigned int len)179c30d921cSKever Yang unsigned int crc32_le(unsigned int crc, unsigned char *p, unsigned int len)
180c30d921cSKever Yang {
181c30d921cSKever Yang /*
182c30d921cSKever Yang UINT i;
183c30d921cSKever Yang UINT nAccum = crc;
184c30d921cSKever Yang
185c30d921cSKever Yang for ( i = 0; i < len; i++) {
186c30d921cSKever Yang nAccum = (nAccum >> 8) ^ crc32table_le[(nAccum ^ (*p)) & 0xFF];
187c30d921cSKever Yang p++;
188c30d921cSKever Yang }
189c30d921cSKever Yang return nAccum;
190c30d921cSKever Yang */
191c30d921cSKever Yang unsigned int *b =(unsigned int *)p;
192c30d921cSKever Yang unsigned int *tab = crc32table_le;
193c30d921cSKever Yang crc = crc ^ 0xFFFFFFFF;
194*21b25fd4SDave Murphy if((((uintptr_t)b)&3 && len)){
195c30d921cSKever Yang do {
196c30d921cSKever Yang unsigned char *p = (unsigned char *)b;
197c30d921cSKever Yang DO_CRC(*p++);
198c30d921cSKever Yang b = (unsigned int *)p;
199*21b25fd4SDave Murphy } while ((--len) && ((uintptr_t)b)&3 );
200c30d921cSKever Yang }
201c30d921cSKever Yang if((len >= 4)){
202c30d921cSKever Yang unsigned int save_len = len & 3;
203c30d921cSKever Yang len = len >> 2;
204c30d921cSKever Yang --b;
205c30d921cSKever Yang do {
206c30d921cSKever Yang crc ^= *++b;
207c30d921cSKever Yang DO_CRC(0);
208c30d921cSKever Yang DO_CRC(0);
209c30d921cSKever Yang DO_CRC(0);
210c30d921cSKever Yang DO_CRC(0);
211c30d921cSKever Yang } while (--len);
212c30d921cSKever Yang b++;
213c30d921cSKever Yang len = save_len;
214c30d921cSKever Yang }
215c30d921cSKever Yang if(len){
216c30d921cSKever Yang do {
217c30d921cSKever Yang unsigned char *p = (unsigned char *)b;
218c30d921cSKever Yang DO_CRC(*p++);
219c30d921cSKever Yang b = (unsigned int *)p;
220c30d921cSKever Yang } while (--len);
221c30d921cSKever Yang }
222c30d921cSKever Yang crc = crc ^ 0xFFFFFFFF;
223c30d921cSKever Yang return crc;
224c30d921cSKever Yang
225c30d921cSKever Yang }
226c30d921cSKever Yang
22776af099aSliuyi #define CRC16_CCITT 0x1021 //CRC operator
CRCBuildTable16(unsigned short aPoly,unsigned short * crcTable)22876af099aSliuyi void CRCBuildTable16(unsigned short aPoly , unsigned short *crcTable)
22976af099aSliuyi {
23076af099aSliuyi unsigned short i, j;
23176af099aSliuyi unsigned short nData;
23276af099aSliuyi unsigned short nAccum;
23376af099aSliuyi
23476af099aSliuyi for (i = 0; i < 256; i++)
23576af099aSliuyi {
23676af099aSliuyi nData = (unsigned short)(i << 8);
23776af099aSliuyi nAccum = 0;
23876af099aSliuyi for (j = 0; j < 8; j++)
23976af099aSliuyi {
24076af099aSliuyi if ((nData ^ nAccum) & 0x8000)
24176af099aSliuyi nAccum = (nAccum << 1) ^ aPoly;
24276af099aSliuyi else
24376af099aSliuyi nAccum <<= 1;
24476af099aSliuyi nData <<= 1;
24576af099aSliuyi }
24676af099aSliuyi crcTable[i] = nAccum;
24776af099aSliuyi }
24876af099aSliuyi }
24976af099aSliuyi
CRC_16(unsigned char * aData,UINT aSize)25076af099aSliuyi unsigned short CRC_16(unsigned char* aData, UINT aSize)
25176af099aSliuyi {
25276af099aSliuyi UINT i;
25376af099aSliuyi unsigned short nAccum = 0;
25476af099aSliuyi unsigned short crcTable[256];
25576af099aSliuyi
25676af099aSliuyi CRCBuildTable16(CRC16_CCITT , crcTable);
25776af099aSliuyi for (i = 0; i < aSize; i++)
25876af099aSliuyi nAccum = (nAccum << 8) ^ crcTable[(nAccum >> 8) ^ *aData++];
25976af099aSliuyi
26076af099aSliuyi return nAccum;
26176af099aSliuyi }
26276af099aSliuyi
P_RC4(unsigned char * buf,unsigned short len)26376af099aSliuyi void P_RC4(unsigned char* buf, unsigned short len)
26476af099aSliuyi {
26576af099aSliuyi unsigned char S[256],K[256],temp;
26676af099aSliuyi unsigned short i,j,t,x;
26776af099aSliuyi unsigned char key[16]={124,78,3,4,85,5,9,7,45,44,123,56,23,13,23,17};
26876af099aSliuyi
26976af099aSliuyi j = 0;
27076af099aSliuyi for(i=0; i<256; i++){
27176af099aSliuyi S[i] = (unsigned char)i;
27276af099aSliuyi j&=0x0f;
27376af099aSliuyi K[i] = key[j];
27476af099aSliuyi j++;
27576af099aSliuyi }
27676af099aSliuyi
27776af099aSliuyi j = 0;
27876af099aSliuyi for(i=0; i<256; i++){
27976af099aSliuyi j = (j + S[i] + K[i]) % 256;
28076af099aSliuyi temp = S[i];
28176af099aSliuyi S[i] = S[j];
28276af099aSliuyi S[j] = temp;
28376af099aSliuyi }
28476af099aSliuyi
28576af099aSliuyi i = j = 0;
28676af099aSliuyi for(x=0; x<len; x++){
28776af099aSliuyi i = (i+1) % 256;
28876af099aSliuyi j = (j + S[i]) % 256;
28976af099aSliuyi temp = S[i];
29076af099aSliuyi S[i] = S[j];
29176af099aSliuyi S[j] = temp;
29276af099aSliuyi t = (S[i] + (S[j] % 256)) % 256;
29376af099aSliuyi buf[x] = buf[x] ^ S[t];
29476af099aSliuyi }
29576af099aSliuyi }
29676af099aSliuyi
bch_encode(unsigned char * encode_in,unsigned char * encode_out)29776af099aSliuyi void bch_encode(unsigned char* encode_in, unsigned char* encode_out)
29876af099aSliuyi {
29976af099aSliuyi UINT i,j;
30076af099aSliuyi bool feed_back;
30176af099aSliuyi UINT bch1=0;
30276af099aSliuyi UINT bch2=0;
30376af099aSliuyi UINT bch3=0;
30476af099aSliuyi UINT bch4=0;
30576af099aSliuyi
30676af099aSliuyi for (i=0;i<515;i++)
30776af099aSliuyi {
30876af099aSliuyi for (j=0;j<8;j++)
30976af099aSliuyi {
31076af099aSliuyi feed_back = (bch1&1) ^ ((encode_in[i]>>j) & 1);
31176af099aSliuyi bch1=((bch1>>1)|((bch2&1)*0x80000000))^(ggx1*feed_back);
31276af099aSliuyi bch2=((bch2>>1)|((bch3&1)*0x80000000))^(ggx2*feed_back);
31376af099aSliuyi bch3=((bch3>>1)|((bch4&1)*0x80000000))^(ggx3*feed_back);
31476af099aSliuyi bch4=(((bch4>>1)^(ggx4*feed_back))) | (feed_back*0x80);
31576af099aSliuyi }
31676af099aSliuyi }
31776af099aSliuyi
31876af099aSliuyi //********Handle FF***********************
31976af099aSliuyi bch1 = ~(bch1 ^ 0xad6273b1);
32076af099aSliuyi bch2 = ~(bch2 ^ 0x348393d2);
32176af099aSliuyi bch3 = ~(bch3 ^ 0xe6ebed3c);
32276af099aSliuyi bch4 = ~(bch4 ^ 0xc8);
32376af099aSliuyi //*********************************************
32476af099aSliuyi
32576af099aSliuyi for (i=0;i<515;i++)
32676af099aSliuyi encode_out[i] = encode_in[i];
32776af099aSliuyi encode_out[515] = bch1&0x000000ff;
32876af099aSliuyi encode_out[516] = (bch1&0x0000ff00)>>8;
32976af099aSliuyi encode_out[517] = (bch1&0x00ff0000)>>16;
33076af099aSliuyi encode_out[518] = (bch1&0xff000000)>>24;
33176af099aSliuyi encode_out[519] = bch2&0x000000ff;
33276af099aSliuyi encode_out[520] = (bch2&0x0000ff00)>>8;
33376af099aSliuyi encode_out[521] = (bch2&0x00ff0000)>>16;
33476af099aSliuyi encode_out[522] = (bch2&0xff000000)>>24;
33576af099aSliuyi encode_out[523] = bch3&0x000000ff;
33676af099aSliuyi encode_out[524] = (bch3&0x0000ff00)>>8;
33776af099aSliuyi encode_out[525] = (bch3&0x00ff0000)>>16;
33876af099aSliuyi encode_out[526] = (bch3&0xff000000)>>24;
33976af099aSliuyi encode_out[527] = bch4&0x000000ff;
34076af099aSliuyi }
34176af099aSliuyi
34276af099aSliuyi #define poly16_CCITT 0x1021 /* crc-ccitt mask */
34376af099aSliuyi
CRC_Calculate(unsigned short crc,unsigned char ch)34476af099aSliuyi unsigned short CRC_Calculate(unsigned short crc, unsigned char ch)
34576af099aSliuyi {
34676af099aSliuyi UINT i;
34776af099aSliuyi for(i=0x80; i!=0; i>>=1)
34876af099aSliuyi {
34976af099aSliuyi if((crc & 0x8000) != 0)
35076af099aSliuyi {
35176af099aSliuyi crc <<= 1;
35276af099aSliuyi crc ^= poly16_CCITT;
35376af099aSliuyi }
35476af099aSliuyi else
35576af099aSliuyi crc <<= 1;
35676af099aSliuyi if((ch & i)!=0)
35776af099aSliuyi crc ^= poly16_CCITT;
35876af099aSliuyi }
35976af099aSliuyi return crc;
36076af099aSliuyi }
CRC_CCITT(unsigned char * p,UINT CalculateNumber)36176af099aSliuyi unsigned short CRC_CCITT(unsigned char* p, UINT CalculateNumber)
36276af099aSliuyi {
36376af099aSliuyi unsigned short crc = 0xffff;
36476af099aSliuyi while(CalculateNumber--)
36576af099aSliuyi {
36676af099aSliuyi crc = CRC_Calculate(crc, *p);
36776af099aSliuyi p++;
36876af099aSliuyi }
36976af099aSliuyi return crc;
37076af099aSliuyi }
gen_poly()37176af099aSliuyi void gen_poly()
37276af099aSliuyi {
37376af099aSliuyi UINT gen_roots[nn + 1], gen_roots_true[nn + 1] ; // Roots of generator polynomial
37476af099aSliuyi UINT i, j, Temp ;
37576af099aSliuyi
37676af099aSliuyi // Initialization of gen_roots
37776af099aSliuyi for (i = 0; i <= nn; i++)
37876af099aSliuyi { gen_roots_true[i] = 0;
37976af099aSliuyi gen_roots[i] = 0;
38076af099aSliuyi }
38176af099aSliuyi
38276af099aSliuyi // Cyclotomic cosets of gen_roots
38376af099aSliuyi for (i = 1; i <= 2*tt ; i++)
38476af099aSliuyi {
38576af099aSliuyi for (j = 0; j < mm; j++)
38676af099aSliuyi {
38776af099aSliuyi Temp = ((1<<j)*i)%nn;
38876af099aSliuyi gen_roots_true[Temp] = 1;
38976af099aSliuyi }
39076af099aSliuyi }
39176af099aSliuyi rr = 0; // Count thenumber of parity check bits
39276af099aSliuyi for (i = 0; i < nn; i++)
39376af099aSliuyi {
39476af099aSliuyi if (gen_roots_true[i] == 1)
39576af099aSliuyi {
39676af099aSliuyi rr++;
39776af099aSliuyi gen_roots[rr] = i;
39876af099aSliuyi }
39976af099aSliuyi }
40076af099aSliuyi // Compute generator polynomial based on its roots
40176af099aSliuyi gg[0] = 2 ; // g(x) = (X + alpha) initially
40276af099aSliuyi gg[1] = 1 ;
40376af099aSliuyi for (i = 2; i <= rr; i++)
40476af099aSliuyi {
40576af099aSliuyi gg[i] = 1 ;
40676af099aSliuyi for (j = i - 1; j > 0; j--)
40776af099aSliuyi if (gg[j] != 0)
40876af099aSliuyi gg[j] = gg[j-1]^ alpha_to[(index_of[gg[j]] + index_of[alpha_to[gen_roots[i]]]) % nn] ;
40976af099aSliuyi else
41076af099aSliuyi gg[j] = gg[j-1] ;
41176af099aSliuyi gg[0] = alpha_to[(index_of[gg[0]] + index_of[alpha_to[gen_roots[i]]]) % nn] ;
41276af099aSliuyi }
41376af099aSliuyi
41476af099aSliuyi ggx1 = gg[103] | (gg[102]<<1) | (gg[101]<<2) | (gg[100]<<3) | (gg[99]<<4) |(gg[98]<<5)| (gg[97]<<6)|(gg[96]<<7)
41576af099aSliuyi | (gg[95]<<8) | (gg[94]<<9) | (gg[93]<<10) | (gg[92]<<11) |(gg[91]<<12)| (gg[90]<<13)|(gg[89]<<14) |(gg[88]<<15)
41676af099aSliuyi | (gg[87]<<16) | (gg[86]<<17) | (gg[85]<<18) | (gg[84]<<19) | (gg[83]<<20) |(gg[82]<<21)| (gg[81]<<22)|(gg[80]<<23)
41776af099aSliuyi | (gg[79]<<24) | (gg[78]<<25) | (gg[77]<<26) | (gg[76]<<27) |(gg[75]<<28)| (gg[74]<<29)|(gg[73]<<30) |(gg[72]<<31);
41876af099aSliuyi ggx2 = gg[71] | (gg[70]<<1) | (gg[69]<<2) | (gg[68]<<3) | (gg[67]<<4) |(gg[66]<<5)| (gg[65]<<6)|(gg[64]<<7)
41976af099aSliuyi | (gg[63]<<8) | (gg[62]<<9) | (gg[61]<<10) | (gg[60]<<11) |(gg[59]<<12)| (gg[58]<<13)|(gg[57]<<14) |(gg[56]<<15)
42076af099aSliuyi | (gg[55]<<16) | (gg[54]<<17) | (gg[53]<<18) | (gg[52]<<19) | (gg[51]<<20) |(gg[50]<<21)| (gg[49]<<22)|(gg[48]<<23)
42176af099aSliuyi | (gg[47]<<24) | (gg[46]<<25) | (gg[45]<<26) | (gg[44]<<27) |(gg[43]<<28)| (gg[42]<<29)|(gg[41]<<30) |(gg[40]<<31);
42276af099aSliuyi ggx3 = gg[39] | (gg[38]<<1) | (gg[37]<<2) | (gg[36]<<3) | (gg[35]<<4) |(gg[34]<<5)| (gg[33]<<6)|(gg[32]<<7)
42376af099aSliuyi | (gg[31]<<8) | (gg[30]<<9) | (gg[29]<<10) | (gg[28]<<11) |(gg[27]<<12)| (gg[26]<<13)|(gg[25]<<14) |(gg[24]<<15)
42476af099aSliuyi | (gg[23]<<16) | (gg[22]<<17) | (gg[21]<<18) | (gg[20]<<19) | (gg[19]<<20) |(gg[18]<<21)| (gg[17]<<22)|(gg[16]<<23)
42576af099aSliuyi | (gg[15]<<24) | (gg[14]<<25) | (gg[13]<<26) | (gg[12]<<27) |(gg[11]<<28)| (gg[10]<<29)|(gg[9]<<30) |(gg[8]<<31);
42676af099aSliuyi ggx4 = gg[7] | (gg[6]<<1) | (gg[5]<<2) | (gg[4]<<3) | (gg[3]<<4) |(gg[2]<<5)| (gg[1]<<6);
42776af099aSliuyi
42876af099aSliuyi }
42976af099aSliuyi
generate_gf()43076af099aSliuyi void generate_gf()
43176af099aSliuyi {
43276af099aSliuyi UINT i;
43376af099aSliuyi UINT mask ; // Register states
43476af099aSliuyi
43576af099aSliuyi // Primitive polynomials
43676af099aSliuyi for (i = 1; i < mm; i++)
43776af099aSliuyi p[i] = 0;
43876af099aSliuyi p[0] = p[mm] = 1;
43976af099aSliuyi if (mm == 2) p[1] = 1;
44076af099aSliuyi else if (mm == 3) p[1] = 1;
44176af099aSliuyi else if (mm == 4) p[1] = 1;
44276af099aSliuyi else if (mm == 5) p[2] = 1;
44376af099aSliuyi else if (mm == 6) p[1] = 1;
44476af099aSliuyi else if (mm == 7) p[1] = 1;
44576af099aSliuyi else if (mm == 8) p[4] = p[5] = p[6] = 1;
44676af099aSliuyi else if (mm == 9) p[4] = 1;
44776af099aSliuyi else if (mm == 10) p[3] = 1;
44876af099aSliuyi else if (mm == 11) p[2] = 1;
44976af099aSliuyi else if (mm == 12) p[3] = p[4] = p[7] = 1;
45076af099aSliuyi else if (mm == 13) p[1] = p[2] = p[3] = p[5] = p[7] = p[8] = p[10] = 1; // 25AF
45176af099aSliuyi else if (mm == 14) p[2] = p[4] = p[6] = p[7] = p[8] = 1; // 41D5
45276af099aSliuyi else if (mm == 15) p[1] = 1;
45376af099aSliuyi else if (mm == 16) p[2] = p[3] = p[5] = 1;
45476af099aSliuyi else if (mm == 17) p[3] = 1;
45576af099aSliuyi else if (mm == 18) p[7] = 1;
45676af099aSliuyi else if (mm == 19) p[1] = p[5] = p[6] = 1;
45776af099aSliuyi else if (mm == 20) p[3] = 1;
45876af099aSliuyi // Galois field implementation with shift registers
45976af099aSliuyi // Ref: L&C, Chapter 6.7, pp. 217
46076af099aSliuyi mask = 1 ;
46176af099aSliuyi alpha_to[mm] = 0 ;
46276af099aSliuyi for (i = 0; i < mm; i++)
46376af099aSliuyi {
46476af099aSliuyi alpha_to[i] = mask ;
46576af099aSliuyi index_of[alpha_to[i]] = i ;
46676af099aSliuyi if (p[i] != 0)
46776af099aSliuyi alpha_to[mm] ^= mask ;
46876af099aSliuyi mask <<= 1 ;
46976af099aSliuyi }
47076af099aSliuyi
47176af099aSliuyi index_of[alpha_to[mm]] = mm ;
47276af099aSliuyi mask >>= 1 ;
47376af099aSliuyi for (i = mm + 1; i < nn; i++)
47476af099aSliuyi {
47576af099aSliuyi if (alpha_to[i-1] >= mask)
47676af099aSliuyi alpha_to[i] = alpha_to[mm] ^ ((alpha_to[i-1] ^ mask) << 1) ;
47776af099aSliuyi else
47876af099aSliuyi alpha_to[i] = alpha_to[i-1] << 1 ;
47976af099aSliuyi
48076af099aSliuyi index_of[alpha_to[i]] = i ;
48176af099aSliuyi }
48276af099aSliuyi index_of[0] = -1 ;
48376af099aSliuyi }
484