xref: /rkdeveloptool/crc.cpp (revision 76af099afcbcafd97801028de2ba3421d3c12865)
1*76af099aSliuyi /*
2*76af099aSliuyi  * (C) Copyright 2017 Fuzhou Rockchip Electronics Co., Ltd
3*76af099aSliuyi  * Seth Liu 2017.03.01
4*76af099aSliuyi  *
5*76af099aSliuyi  * SPDX-License-Identifier:	GPL-2.0+
6*76af099aSliuyi  */
7*76af099aSliuyi #include "DefineHeader.h"
8*76af099aSliuyi UINT gTable_Crc32[256] =
9*76af099aSliuyi {//crfc32 factor 0x04C10DB7
10*76af099aSliuyi 		0x00000000, 0x04c10db7, 0x09821b6e, 0x0d4316d9,
11*76af099aSliuyi 		0x130436dc, 0x17c53b6b, 0x1a862db2, 0x1e472005,
12*76af099aSliuyi 		0x26086db8, 0x22c9600f, 0x2f8a76d6, 0x2b4b7b61,
13*76af099aSliuyi 		0x350c5b64, 0x31cd56d3, 0x3c8e400a, 0x384f4dbd,
14*76af099aSliuyi 		0x4c10db70, 0x48d1d6c7, 0x4592c01e, 0x4153cda9,
15*76af099aSliuyi 		0x5f14edac, 0x5bd5e01b, 0x5696f6c2, 0x5257fb75,
16*76af099aSliuyi 		0x6a18b6c8, 0x6ed9bb7f, 0x639aada6, 0x675ba011,
17*76af099aSliuyi 		0x791c8014, 0x7ddd8da3, 0x709e9b7a, 0x745f96cd,
18*76af099aSliuyi 		0x9821b6e0, 0x9ce0bb57, 0x91a3ad8e, 0x9562a039,
19*76af099aSliuyi 		0x8b25803c, 0x8fe48d8b, 0x82a79b52, 0x866696e5,
20*76af099aSliuyi 		0xbe29db58, 0xbae8d6ef, 0xb7abc036, 0xb36acd81,
21*76af099aSliuyi 		0xad2ded84, 0xa9ece033, 0xa4aff6ea, 0xa06efb5d,
22*76af099aSliuyi 		0xd4316d90, 0xd0f06027, 0xddb376fe, 0xd9727b49,
23*76af099aSliuyi 		0xc7355b4c, 0xc3f456fb, 0xceb74022, 0xca764d95,
24*76af099aSliuyi 		0xf2390028, 0xf6f80d9f, 0xfbbb1b46, 0xff7a16f1,
25*76af099aSliuyi 		0xe13d36f4, 0xe5fc3b43, 0xe8bf2d9a, 0xec7e202d,
26*76af099aSliuyi 		0x34826077, 0x30436dc0, 0x3d007b19, 0x39c176ae,
27*76af099aSliuyi 		0x278656ab, 0x23475b1c, 0x2e044dc5, 0x2ac54072,
28*76af099aSliuyi 		0x128a0dcf, 0x164b0078, 0x1b0816a1, 0x1fc91b16,
29*76af099aSliuyi 		0x018e3b13, 0x054f36a4, 0x080c207d, 0x0ccd2dca,
30*76af099aSliuyi 		0x7892bb07, 0x7c53b6b0, 0x7110a069, 0x75d1adde,
31*76af099aSliuyi 		0x6b968ddb, 0x6f57806c, 0x621496b5, 0x66d59b02,
32*76af099aSliuyi 		0x5e9ad6bf, 0x5a5bdb08, 0x5718cdd1, 0x53d9c066,
33*76af099aSliuyi 		0x4d9ee063, 0x495fedd4, 0x441cfb0d, 0x40ddf6ba,
34*76af099aSliuyi 		0xaca3d697, 0xa862db20, 0xa521cdf9, 0xa1e0c04e,
35*76af099aSliuyi 		0xbfa7e04b, 0xbb66edfc, 0xb625fb25, 0xb2e4f692,
36*76af099aSliuyi 		0x8aabbb2f, 0x8e6ab698, 0x8329a041, 0x87e8adf6,
37*76af099aSliuyi 		0x99af8df3, 0x9d6e8044, 0x902d969d, 0x94ec9b2a,
38*76af099aSliuyi 		0xe0b30de7, 0xe4720050, 0xe9311689, 0xedf01b3e,
39*76af099aSliuyi 		0xf3b73b3b, 0xf776368c, 0xfa352055, 0xfef42de2,
40*76af099aSliuyi 		0xc6bb605f, 0xc27a6de8, 0xcf397b31, 0xcbf87686,
41*76af099aSliuyi 		0xd5bf5683, 0xd17e5b34, 0xdc3d4ded, 0xd8fc405a,
42*76af099aSliuyi 		0x6904c0ee, 0x6dc5cd59, 0x6086db80, 0x6447d637,
43*76af099aSliuyi 		0x7a00f632, 0x7ec1fb85, 0x7382ed5c, 0x7743e0eb,
44*76af099aSliuyi 		0x4f0cad56, 0x4bcda0e1, 0x468eb638, 0x424fbb8f,
45*76af099aSliuyi 		0x5c089b8a, 0x58c9963d, 0x558a80e4, 0x514b8d53,
46*76af099aSliuyi 		0x25141b9e, 0x21d51629, 0x2c9600f0, 0x28570d47,
47*76af099aSliuyi 		0x36102d42, 0x32d120f5, 0x3f92362c, 0x3b533b9b,
48*76af099aSliuyi 		0x031c7626, 0x07dd7b91, 0x0a9e6d48, 0x0e5f60ff,
49*76af099aSliuyi 		0x101840fa, 0x14d94d4d, 0x199a5b94, 0x1d5b5623,
50*76af099aSliuyi 		0xf125760e, 0xf5e47bb9, 0xf8a76d60, 0xfc6660d7,
51*76af099aSliuyi 		0xe22140d2, 0xe6e04d65, 0xeba35bbc, 0xef62560b,
52*76af099aSliuyi 		0xd72d1bb6, 0xd3ec1601, 0xdeaf00d8, 0xda6e0d6f,
53*76af099aSliuyi 		0xc4292d6a, 0xc0e820dd, 0xcdab3604, 0xc96a3bb3,
54*76af099aSliuyi 		0xbd35ad7e, 0xb9f4a0c9, 0xb4b7b610, 0xb076bba7,
55*76af099aSliuyi 		0xae319ba2, 0xaaf09615, 0xa7b380cc, 0xa3728d7b,
56*76af099aSliuyi 		0x9b3dc0c6, 0x9ffccd71, 0x92bfdba8, 0x967ed61f,
57*76af099aSliuyi 		0x8839f61a, 0x8cf8fbad, 0x81bbed74, 0x857ae0c3,
58*76af099aSliuyi 		0x5d86a099, 0x5947ad2e, 0x5404bbf7, 0x50c5b640,
59*76af099aSliuyi 		0x4e829645, 0x4a439bf2, 0x47008d2b, 0x43c1809c,
60*76af099aSliuyi 		0x7b8ecd21, 0x7f4fc096, 0x720cd64f, 0x76cddbf8,
61*76af099aSliuyi 		0x688afbfd, 0x6c4bf64a, 0x6108e093, 0x65c9ed24,
62*76af099aSliuyi 		0x11967be9, 0x1557765e, 0x18146087, 0x1cd56d30,
63*76af099aSliuyi 		0x02924d35, 0x06534082, 0x0b10565b, 0x0fd15bec,
64*76af099aSliuyi 		0x379e1651, 0x335f1be6, 0x3e1c0d3f, 0x3add0088,
65*76af099aSliuyi 		0x249a208d, 0x205b2d3a, 0x2d183be3, 0x29d93654,
66*76af099aSliuyi 		0xc5a71679, 0xc1661bce, 0xcc250d17, 0xc8e400a0,
67*76af099aSliuyi 		0xd6a320a5, 0xd2622d12, 0xdf213bcb, 0xdbe0367c,
68*76af099aSliuyi 		0xe3af7bc1, 0xe76e7676, 0xea2d60af, 0xeeec6d18,
69*76af099aSliuyi 		0xf0ab4d1d, 0xf46a40aa, 0xf9295673, 0xfde85bc4,
70*76af099aSliuyi 		0x89b7cd09, 0x8d76c0be, 0x8035d667, 0x84f4dbd0,
71*76af099aSliuyi 		0x9ab3fbd5, 0x9e72f662, 0x9331e0bb, 0x97f0ed0c,
72*76af099aSliuyi 		0xafbfa0b1, 0xab7ead06, 0xa63dbbdf, 0xa2fcb668,
73*76af099aSliuyi 		0xbcbb966d, 0xb87a9bda, 0xb5398d03, 0xb1f880b4,
74*76af099aSliuyi };
75*76af099aSliuyi #define rr_max  104	/* Number of parity checks, rr = deg[g(x)] */
76*76af099aSliuyi #define parallel 8 //bit count
77*76af099aSliuyi #define mm 13//limit count
78*76af099aSliuyi #define nn 8191//code size
79*76af099aSliuyi #define kk 4120//info length
80*76af099aSliuyi #define tt 8//correct count
81*76af099aSliuyi 
82*76af099aSliuyi #define tt2 2*tt
83*76af099aSliuyi UINT s[tt2+1]; // Syndrome values
84*76af099aSliuyi 
85*76af099aSliuyi UINT rr;//redundant length		// BCH code parameters
86*76af099aSliuyi 
87*76af099aSliuyi 
88*76af099aSliuyi UINT p[mm + 1];
89*76af099aSliuyi UINT alpha_to[nn+1], index_of[nn+1] ;	// Galois field
90*76af099aSliuyi UINT gg[rr_max+1] ;		// Generator polynomial
91*76af099aSliuyi 
92*76af099aSliuyi UINT ggx1=0;
93*76af099aSliuyi UINT ggx2=0;
94*76af099aSliuyi UINT ggx3=0;
95*76af099aSliuyi UINT ggx4=0;
96*76af099aSliuyi // get crc32 value
97*76af099aSliuyi UINT CRC_32(unsigned char* pData, UINT ulSize)
98*76af099aSliuyi {
99*76af099aSliuyi     UINT i;
100*76af099aSliuyi     UINT nAccum = 0;
101*76af099aSliuyi 
102*76af099aSliuyi     for ( i=0; i<ulSize; i++)
103*76af099aSliuyi         nAccum = (nAccum<<8)^gTable_Crc32[(nAccum>>24)^(*pData++)];
104*76af099aSliuyi     return nAccum;
105*76af099aSliuyi }
106*76af099aSliuyi #define CRC16_CCITT         0x1021  //CRC operator
107*76af099aSliuyi void CRCBuildTable16(unsigned short aPoly , unsigned short *crcTable)
108*76af099aSliuyi {
109*76af099aSliuyi     unsigned short i, j;
110*76af099aSliuyi     unsigned short nData;
111*76af099aSliuyi     unsigned short nAccum;
112*76af099aSliuyi 
113*76af099aSliuyi     for (i = 0; i < 256; i++)
114*76af099aSliuyi     {
115*76af099aSliuyi         nData = (unsigned short)(i << 8);
116*76af099aSliuyi         nAccum = 0;
117*76af099aSliuyi         for (j = 0; j < 8; j++)
118*76af099aSliuyi         {
119*76af099aSliuyi             if ((nData ^ nAccum) & 0x8000)
120*76af099aSliuyi                 nAccum = (nAccum << 1) ^ aPoly;
121*76af099aSliuyi             else
122*76af099aSliuyi                 nAccum <<= 1;
123*76af099aSliuyi             nData <<= 1;
124*76af099aSliuyi         }
125*76af099aSliuyi         crcTable[i] = nAccum;
126*76af099aSliuyi     }
127*76af099aSliuyi }
128*76af099aSliuyi 
129*76af099aSliuyi unsigned short CRC_16(unsigned char* aData, UINT aSize)
130*76af099aSliuyi {
131*76af099aSliuyi     UINT i;
132*76af099aSliuyi     unsigned short nAccum = 0;
133*76af099aSliuyi     unsigned short crcTable[256];
134*76af099aSliuyi 
135*76af099aSliuyi     CRCBuildTable16(CRC16_CCITT , crcTable);
136*76af099aSliuyi     for (i = 0; i < aSize; i++)
137*76af099aSliuyi         nAccum = (nAccum << 8) ^ crcTable[(nAccum >> 8) ^ *aData++];
138*76af099aSliuyi 
139*76af099aSliuyi     return nAccum;
140*76af099aSliuyi }
141*76af099aSliuyi 
142*76af099aSliuyi void P_RC4(unsigned char* buf, unsigned short len)
143*76af099aSliuyi {
144*76af099aSliuyi 	unsigned char S[256],K[256],temp;
145*76af099aSliuyi 	unsigned short i,j,t,x;
146*76af099aSliuyi 	unsigned char key[16]={124,78,3,4,85,5,9,7,45,44,123,56,23,13,23,17};
147*76af099aSliuyi 
148*76af099aSliuyi 	j = 0;
149*76af099aSliuyi 	for(i=0; i<256; i++){
150*76af099aSliuyi 		S[i] = (unsigned char)i;
151*76af099aSliuyi 		j&=0x0f;
152*76af099aSliuyi 		K[i] = key[j];
153*76af099aSliuyi 		j++;
154*76af099aSliuyi 	}
155*76af099aSliuyi 
156*76af099aSliuyi 	j = 0;
157*76af099aSliuyi 	for(i=0; i<256; i++){
158*76af099aSliuyi 		j = (j + S[i] + K[i]) % 256;
159*76af099aSliuyi 		temp = S[i];
160*76af099aSliuyi 		S[i] = S[j];
161*76af099aSliuyi 		S[j] = temp;
162*76af099aSliuyi 	}
163*76af099aSliuyi 
164*76af099aSliuyi 	i = j = 0;
165*76af099aSliuyi 	for(x=0; x<len; x++){
166*76af099aSliuyi 		i = (i+1) % 256;
167*76af099aSliuyi 		j = (j + S[i]) % 256;
168*76af099aSliuyi 		temp = S[i];
169*76af099aSliuyi 		S[i] = S[j];
170*76af099aSliuyi 		S[j] = temp;
171*76af099aSliuyi 		t = (S[i] + (S[j] % 256)) % 256;
172*76af099aSliuyi 		buf[x] = buf[x] ^ S[t];
173*76af099aSliuyi 	}
174*76af099aSliuyi }
175*76af099aSliuyi 
176*76af099aSliuyi void bch_encode(unsigned char* encode_in, unsigned char* encode_out)
177*76af099aSliuyi {
178*76af099aSliuyi 	UINT i,j;
179*76af099aSliuyi 	bool feed_back;
180*76af099aSliuyi 	UINT bch1=0;
181*76af099aSliuyi 	UINT bch2=0;
182*76af099aSliuyi 	UINT bch3=0;
183*76af099aSliuyi 	UINT bch4=0;
184*76af099aSliuyi 
185*76af099aSliuyi 	for (i=0;i<515;i++)
186*76af099aSliuyi 	{
187*76af099aSliuyi 		for (j=0;j<8;j++)
188*76af099aSliuyi 		{
189*76af099aSliuyi 			feed_back = (bch1&1) ^ ((encode_in[i]>>j) & 1);
190*76af099aSliuyi 			bch1=((bch1>>1)|((bch2&1)*0x80000000))^(ggx1*feed_back);
191*76af099aSliuyi 			bch2=((bch2>>1)|((bch3&1)*0x80000000))^(ggx2*feed_back);
192*76af099aSliuyi 			bch3=((bch3>>1)|((bch4&1)*0x80000000))^(ggx3*feed_back);
193*76af099aSliuyi 			bch4=(((bch4>>1)^(ggx4*feed_back))) | (feed_back*0x80);
194*76af099aSliuyi 		}
195*76af099aSliuyi 	}
196*76af099aSliuyi 
197*76af099aSliuyi 	//********Handle FF***********************
198*76af099aSliuyi 	bch1 = ~(bch1 ^ 0xad6273b1);
199*76af099aSliuyi 	bch2 = ~(bch2 ^ 0x348393d2);
200*76af099aSliuyi 	bch3 = ~(bch3 ^ 0xe6ebed3c);
201*76af099aSliuyi 	bch4 = ~(bch4 ^ 0xc8);
202*76af099aSliuyi 	//*********************************************
203*76af099aSliuyi 
204*76af099aSliuyi 	for (i=0;i<515;i++)
205*76af099aSliuyi 		encode_out[i] = encode_in[i];
206*76af099aSliuyi 	encode_out[515] = bch1&0x000000ff;
207*76af099aSliuyi 	encode_out[516] = (bch1&0x0000ff00)>>8;
208*76af099aSliuyi 	encode_out[517] = (bch1&0x00ff0000)>>16;
209*76af099aSliuyi 	encode_out[518] = (bch1&0xff000000)>>24;
210*76af099aSliuyi 	encode_out[519] = bch2&0x000000ff;
211*76af099aSliuyi 	encode_out[520] = (bch2&0x0000ff00)>>8;
212*76af099aSliuyi 	encode_out[521] = (bch2&0x00ff0000)>>16;
213*76af099aSliuyi 	encode_out[522] = (bch2&0xff000000)>>24;
214*76af099aSliuyi 	encode_out[523] = bch3&0x000000ff;
215*76af099aSliuyi 	encode_out[524] = (bch3&0x0000ff00)>>8;
216*76af099aSliuyi 	encode_out[525] = (bch3&0x00ff0000)>>16;
217*76af099aSliuyi 	encode_out[526] = (bch3&0xff000000)>>24;
218*76af099aSliuyi 	encode_out[527] = bch4&0x000000ff;
219*76af099aSliuyi }
220*76af099aSliuyi 
221*76af099aSliuyi #define poly16_CCITT	0x1021          /* crc-ccitt mask */
222*76af099aSliuyi 
223*76af099aSliuyi unsigned short CRC_Calculate(unsigned short crc, unsigned char ch)
224*76af099aSliuyi {
225*76af099aSliuyi 	UINT i;
226*76af099aSliuyi 	for(i=0x80; i!=0; i>>=1)
227*76af099aSliuyi 	{
228*76af099aSliuyi 		if((crc & 0x8000) != 0)
229*76af099aSliuyi 		{
230*76af099aSliuyi 			crc <<= 1;
231*76af099aSliuyi 			crc ^= poly16_CCITT;
232*76af099aSliuyi 		}
233*76af099aSliuyi 		else
234*76af099aSliuyi 			crc <<= 1;
235*76af099aSliuyi 		if((ch & i)!=0)
236*76af099aSliuyi 			crc ^= poly16_CCITT;
237*76af099aSliuyi 	}
238*76af099aSliuyi 	return crc;
239*76af099aSliuyi }
240*76af099aSliuyi unsigned short CRC_CCITT(unsigned char* p, UINT CalculateNumber)
241*76af099aSliuyi {
242*76af099aSliuyi     unsigned short crc = 0xffff;
243*76af099aSliuyi     while(CalculateNumber--)
244*76af099aSliuyi 	{
245*76af099aSliuyi 		crc = CRC_Calculate(crc, *p);
246*76af099aSliuyi 		p++;
247*76af099aSliuyi     }
248*76af099aSliuyi     return crc;
249*76af099aSliuyi }
250*76af099aSliuyi void gen_poly()
251*76af099aSliuyi {
252*76af099aSliuyi 	UINT gen_roots[nn + 1], gen_roots_true[nn + 1] ; 	// Roots of generator polynomial
253*76af099aSliuyi 	UINT i, j, Temp ;
254*76af099aSliuyi 
255*76af099aSliuyi // Initialization of gen_roots
256*76af099aSliuyi 	for (i = 0; i <= nn; i++)
257*76af099aSliuyi 	{	gen_roots_true[i] = 0;
258*76af099aSliuyi 		gen_roots[i] = 0;
259*76af099aSliuyi 	}
260*76af099aSliuyi 
261*76af099aSliuyi // Cyclotomic cosets of gen_roots
262*76af099aSliuyi 	for (i = 1; i <= 2*tt ; i++)
263*76af099aSliuyi 	{
264*76af099aSliuyi 		for (j = 0; j < mm; j++)
265*76af099aSliuyi 		{
266*76af099aSliuyi 			Temp = ((1<<j)*i)%nn;
267*76af099aSliuyi 			gen_roots_true[Temp] = 1;
268*76af099aSliuyi 		}
269*76af099aSliuyi 	}
270*76af099aSliuyi 	rr = 0;		// Count thenumber of parity check bits
271*76af099aSliuyi 	for (i = 0; i < nn; i++)
272*76af099aSliuyi 	{
273*76af099aSliuyi 		if (gen_roots_true[i] == 1)
274*76af099aSliuyi 		{
275*76af099aSliuyi 			rr++;
276*76af099aSliuyi 			gen_roots[rr] = i;
277*76af099aSliuyi 		}
278*76af099aSliuyi 	}
279*76af099aSliuyi // Compute generator polynomial based on its roots
280*76af099aSliuyi 	gg[0] = 2 ;	// g(x) = (X + alpha) initially
281*76af099aSliuyi 	gg[1] = 1 ;
282*76af099aSliuyi 	for (i = 2; i <= rr; i++)
283*76af099aSliuyi 	{
284*76af099aSliuyi 		gg[i] = 1 ;
285*76af099aSliuyi 		for (j = i - 1; j > 0; j--)
286*76af099aSliuyi 			if (gg[j] != 0)
287*76af099aSliuyi 				gg[j] = gg[j-1]^ alpha_to[(index_of[gg[j]] + index_of[alpha_to[gen_roots[i]]]) % nn] ;
288*76af099aSliuyi 			else
289*76af099aSliuyi 				gg[j] = gg[j-1] ;
290*76af099aSliuyi 		gg[0] = alpha_to[(index_of[gg[0]] + index_of[alpha_to[gen_roots[i]]]) % nn] ;
291*76af099aSliuyi 	}
292*76af099aSliuyi 
293*76af099aSliuyi ggx1 = gg[103] | (gg[102]<<1) | (gg[101]<<2) | (gg[100]<<3) | (gg[99]<<4) |(gg[98]<<5)| (gg[97]<<6)|(gg[96]<<7)
294*76af099aSliuyi 	| (gg[95]<<8) | (gg[94]<<9) | (gg[93]<<10) | (gg[92]<<11) |(gg[91]<<12)| (gg[90]<<13)|(gg[89]<<14) |(gg[88]<<15)
295*76af099aSliuyi 	| (gg[87]<<16) | (gg[86]<<17) | (gg[85]<<18) | (gg[84]<<19) | (gg[83]<<20) |(gg[82]<<21)| (gg[81]<<22)|(gg[80]<<23)
296*76af099aSliuyi 	| (gg[79]<<24) | (gg[78]<<25) | (gg[77]<<26) | (gg[76]<<27) |(gg[75]<<28)| (gg[74]<<29)|(gg[73]<<30) |(gg[72]<<31);
297*76af099aSliuyi ggx2 = gg[71] | (gg[70]<<1) | (gg[69]<<2) | (gg[68]<<3) | (gg[67]<<4) |(gg[66]<<5)| (gg[65]<<6)|(gg[64]<<7)
298*76af099aSliuyi 	| (gg[63]<<8) | (gg[62]<<9) | (gg[61]<<10) | (gg[60]<<11) |(gg[59]<<12)| (gg[58]<<13)|(gg[57]<<14) |(gg[56]<<15)
299*76af099aSliuyi 	| (gg[55]<<16) | (gg[54]<<17) | (gg[53]<<18) | (gg[52]<<19) | (gg[51]<<20) |(gg[50]<<21)| (gg[49]<<22)|(gg[48]<<23)
300*76af099aSliuyi 	| (gg[47]<<24) | (gg[46]<<25) | (gg[45]<<26) | (gg[44]<<27) |(gg[43]<<28)| (gg[42]<<29)|(gg[41]<<30) |(gg[40]<<31);
301*76af099aSliuyi ggx3 = gg[39] | (gg[38]<<1) | (gg[37]<<2) | (gg[36]<<3) | (gg[35]<<4) |(gg[34]<<5)| (gg[33]<<6)|(gg[32]<<7)
302*76af099aSliuyi 	| (gg[31]<<8) | (gg[30]<<9) | (gg[29]<<10) | (gg[28]<<11) |(gg[27]<<12)| (gg[26]<<13)|(gg[25]<<14) |(gg[24]<<15)
303*76af099aSliuyi 	| (gg[23]<<16) | (gg[22]<<17) | (gg[21]<<18) | (gg[20]<<19) | (gg[19]<<20) |(gg[18]<<21)| (gg[17]<<22)|(gg[16]<<23)
304*76af099aSliuyi 	| (gg[15]<<24) | (gg[14]<<25) | (gg[13]<<26) | (gg[12]<<27) |(gg[11]<<28)| (gg[10]<<29)|(gg[9]<<30) |(gg[8]<<31);
305*76af099aSliuyi ggx4 = gg[7] | (gg[6]<<1) | (gg[5]<<2) | (gg[4]<<3) | (gg[3]<<4) |(gg[2]<<5)| (gg[1]<<6);
306*76af099aSliuyi 
307*76af099aSliuyi }
308*76af099aSliuyi 
309*76af099aSliuyi void generate_gf()
310*76af099aSliuyi {
311*76af099aSliuyi 	UINT i;
312*76af099aSliuyi 	UINT mask ;	// Register states
313*76af099aSliuyi 
314*76af099aSliuyi 	// Primitive polynomials
315*76af099aSliuyi 	for (i = 1; i < mm; i++)
316*76af099aSliuyi 		p[i] = 0;
317*76af099aSliuyi 	p[0] = p[mm] = 1;
318*76af099aSliuyi 	if (mm == 2)		p[1] = 1;
319*76af099aSliuyi 	else if (mm == 3)	p[1] = 1;
320*76af099aSliuyi 	else if (mm == 4)	p[1] = 1;
321*76af099aSliuyi 	else if (mm == 5)	p[2] = 1;
322*76af099aSliuyi 	else if (mm == 6)	p[1] = 1;
323*76af099aSliuyi 	else if (mm == 7)	p[1] = 1;
324*76af099aSliuyi 	else if (mm == 8)	p[4] = p[5] = p[6] = 1;
325*76af099aSliuyi 	else if (mm == 9)	p[4] = 1;
326*76af099aSliuyi 	else if (mm == 10)	p[3] = 1;
327*76af099aSliuyi 	else if (mm == 11)	p[2] = 1;
328*76af099aSliuyi 	else if (mm == 12)	p[3] = p[4] = p[7] = 1;
329*76af099aSliuyi 	else if (mm == 13)	p[1] = p[2] = p[3] = p[5] = p[7] = p[8] = p[10] = 1;	// 25AF
330*76af099aSliuyi 	else if (mm == 14)	p[2] = p[4] = p[6] = p[7] = p[8] = 1;	// 41D5
331*76af099aSliuyi 	else if (mm == 15)	p[1] = 1;
332*76af099aSliuyi 	else if (mm == 16)	p[2] = p[3] = p[5] = 1;
333*76af099aSliuyi 	else if (mm == 17)	p[3] = 1;
334*76af099aSliuyi 	else if (mm == 18)	p[7] = 1;
335*76af099aSliuyi 	else if (mm == 19)	p[1] = p[5] = p[6] = 1;
336*76af099aSliuyi 	else if (mm == 20)	p[3] = 1;
337*76af099aSliuyi 	// Galois field implementation with shift registers
338*76af099aSliuyi 	// Ref: L&C, Chapter 6.7, pp. 217
339*76af099aSliuyi 	mask = 1 ;
340*76af099aSliuyi 	alpha_to[mm] = 0 ;
341*76af099aSliuyi 	for (i = 0; i < mm; i++)
342*76af099aSliuyi 	{
343*76af099aSliuyi 		alpha_to[i] = mask ;
344*76af099aSliuyi 		index_of[alpha_to[i]] = i ;
345*76af099aSliuyi 		if (p[i] != 0)
346*76af099aSliuyi 			alpha_to[mm] ^= mask ;
347*76af099aSliuyi 		mask <<= 1 ;
348*76af099aSliuyi 	}
349*76af099aSliuyi 
350*76af099aSliuyi 	index_of[alpha_to[mm]] = mm ;
351*76af099aSliuyi 	mask >>= 1 ;
352*76af099aSliuyi 	for (i = mm + 1; i < nn; i++)
353*76af099aSliuyi 	{
354*76af099aSliuyi 		if (alpha_to[i-1] >= mask)
355*76af099aSliuyi 			alpha_to[i] = alpha_to[mm] ^ ((alpha_to[i-1] ^ mask) << 1) ;
356*76af099aSliuyi 		else
357*76af099aSliuyi 			alpha_to[i] = alpha_to[i-1] << 1 ;
358*76af099aSliuyi 
359*76af099aSliuyi 		index_of[alpha_to[i]] = i ;
360*76af099aSliuyi 	}
361*76af099aSliuyi 	index_of[0] = -1 ;
362*76af099aSliuyi }