/[PAMELA software]/yoda/event/CRC.c
ViewVC logotype

Contents of /yoda/event/CRC.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3.0 - (show annotations) (download)
Fri Mar 4 15:54:11 2005 UTC (19 years, 11 months ago) by kusanagi
Branch: MAIN
Changes since 2.0: +3 -3 lines
File MIME type: text/plain
Error proof version.
Implemented all detectors packets plus all the main telemetries packets.
Missing all the Init and Alarm packets.
Disabled CRC control on VarDump, ArrDump, TabDump for CPU debugging needs
(the data formats seems correct even if CRC get wrong)

1 /****************************************************************************
2 * F i l e D a t a
3 * $Id: CRC.c,v 2.0 2004/09/21 20:49:57 kusanagi Exp $
4 * $Revision: 2.0 $
5 * $Date: 2004/09/21 20:49:57 $
6 * $RCSfile: CRC.c,v $
7 *
8 ****************************************************************************
9 * S W D e v e l o p m e n t E n v i r o n m e n t
10 *
11 * $Author: kusanagi $
12 * :
13 ****************************************************************************
14 * U p d a t i n g
15
16 *****************************************************************************/
17
18
19 /*============================= Include File ================================*/
20 #include <CRC.h>
21
22 /*============================ Global define ================================*/
23
24
25 /*============================== global types ==============================*/
26
27
28
29 /*****************************************************************************/
30 /*=========================== Structure define ==============================*/
31
32
33 /*****************************************************************************/
34 /*============================ Enumerate define =============================*/
35
36 /*****************************************************************************/
37
38 /*=== Common I N T E R N A L ==*/
39
40 /*****************************************************************************/
41
42 /*************************************************************************/
43 /* @Constant: Ccrc_lookup */
44 /* @Purpose : */
45 /* CRC-TABLE CRCINIT=0x0000 POLY=0x1021 CCITT V.41 */
46 /* */
47 /* @@ */
48 /*************************************************************************/
49
50 static const unsigned int Crc_lookup[256] = {
51 0x0000,0x1021,0x2042,0x3063,0x4084,0x50A5,0x60C6,0x70E7,
52 0x8108,0x9129,0xA14A,0xB16B,0xC18C,0xD1AD,0xE1CE,0xF1EF,
53 0x1231,0x0210,0x3273,0x2252,0x52B5,0x4294,0x72F7,0x62D6,
54 0x9339,0x8318,0xB37B,0xA35A,0xD3BD,0xC39C,0xF3FF,0xE3DE,
55 0x2462,0x3443,0x0420,0x1401,0x64E6,0x74C7,0x44A4,0x5485,
56 0xA56A,0xB54B,0x8528,0x9509,0xE5EE,0xF5CF,0xC5AC,0xD58D,
57 0x3653,0x2672,0x1611,0x0630,0x76D7,0x66F6,0x5695,0x46B4,
58 0xB75B,0xA77A,0x9719,0x8738,0xF7DF,0xE7FE,0xD79D,0xC7BC,
59 0x48C4,0x58E5,0x6886,0x78A7,0x0840,0x1861,0x2802,0x3823,
60 0xC9CC,0xD9ED,0xE98E,0xF9AF,0x8948,0x9969,0xA90A,0xB92B,
61 0x5AF5,0x4AD4,0x7AB7,0x6A96,0x1A71,0x0A50,0x3A33,0x2A12,
62 0xDBFD,0xCBDC,0xFBBF,0xEB9E,0x9B79,0x8B58,0xBB3B,0xAB1A,
63 0x6CA6,0x7C87,0x4CE4,0x5CC5,0x2C22,0x3C03,0x0C60,0x1C41,
64 0xEDAE,0xFD8F,0xCDEC,0xDDCD,0xAD2A,0xBD0B,0x8D68,0x9D49,
65 0x7E97,0x6EB6,0x5ED5,0x4EF4,0x3E13,0x2E32,0x1E51,0x0E70,
66 0xFF9F,0xEFBE,0xDFDD,0xCFFC,0xBF1B,0xAF3A,0x9F59,0x8F78,
67 0x9188,0x81A9,0xB1CA,0xA1EB,0xD10C,0xC12D,0xF14E,0xE16F,
68 0x1080,0x00A1,0x30C2,0x20E3,0x5004,0x4025,0x7046,0x6067,
69 0x83B9,0x9398,0xA3FB,0xB3DA,0xC33D,0xD31C,0xE37F,0xF35E,
70 0x02B1,0x1290,0x22F3,0x32D2,0x4235,0x5214,0x6277,0x7256,
71 0xB5EA,0xA5CB,0x95A8,0x8589,0xF56E,0xE54F,0xD52C,0xC50D,
72 0x34E2,0x24C3,0x14A0,0x0481,0x7466,0x6447,0x5424,0x4405,
73 0xA7DB,0xB7FA,0x8799,0x97B8,0xE75F,0xF77E,0xC71D,0xD73C,
74 0x26D3,0x36F2,0x0691,0x16B0,0x6657,0x7676,0x4615,0x5634,
75 0xD94C,0xC96D,0xF90E,0xE92F,0x99C8,0x89E9,0xB98A,0xA9AB,
76 0x5844,0x4865,0x7806,0x6827,0x18C0,0x08E1,0x3882,0x28A3,
77 0xCB7D,0xDB5C,0xEB3F,0xFB1E,0x8BF9,0x9BD8,0xABBB,0xBB9A,
78 0x4A75,0x5A54,0x6A37,0x7A16,0x0AF1,0x1AD0,0x2AB3,0x3A92,
79 0xFD2E,0xED0F,0xDD6C,0xCD4D,0xBDAA,0xAD8B,0x9DE8,0x8DC9,
80 0x7C26,0x6C07,0x5C64,0x4C45,0x3CA2,0x2C83,0x1CE0,0x0CC1,
81 0xEF1F,0xFF3E,0xCF5D,0xDF7C,0xAF9B,0xBFBA,0x8FD9,0x9FF8,
82 0x6E17,0x7E36,0x4E55,0x5E74,0x2E93,0x3EB2,0x0ED1,0x1EF0
83 };
84
85
86
87
88
89
90
91
92 /*****************************************************************************/
93 /*
94 * TRK_crc8_8
95 *
96 * calculate single 8 bit crc
97 *
98 * Input parameters:
99 * old = old value
100 * data = new value
101 * outcrc = pointer to calculated crc
102 *
103 * Output parameters: status_code
104 *
105 */
106 /*****************************************************************************/
107
108 typedef union {
109 BYTE word;
110
111 //#ifdef ERC32
112 /* ERC 32 arch is BIG endian */
113 /* struct bit_field_w
114 {
115 unsigned b7:1;
116 unsigned b6:1;
117 unsigned b5:1;
118 unsigned b4:1;
119 unsigned b3:1;
120 unsigned b2:1;
121 unsigned b1:1;
122 unsigned b0:1;
123 } bit;
124 #else*/
125 /* IA32 arch is LITTLE endian */
126 struct bit_field_w
127 {
128 unsigned b0:1;
129 unsigned b1:1;
130 unsigned b2:1;
131 unsigned b3:1;
132 unsigned b4:1;
133 unsigned b5:1;
134 unsigned b6:1;
135 unsigned b7:1;
136 } bit;
137 //#endif
138 } CM_crc8_8_word ;
139
140
141 #define CM_CRC8_8(old,data,crc,c,d,r) do { \
142 c.word = (old); \
143 d.word = (data); \
144 r.bit.b0 = c.bit.b0 ^ c.bit.b6 ^ c.bit.b7 ^ d.bit.b0 ^ d.bit.b6 ^ d.bit.b7; \
145 r.bit.b1 = c.bit.b0 ^ c.bit.b1 ^ c.bit.b6 ^ d.bit.b0 ^ d.bit.b1 ^ d.bit.b6; \
146 r.bit.b2 = c.bit.b0 ^ c.bit.b1 ^ c.bit.b2 ^ c.bit.b6 ^ d.bit.b0 ^ d.bit.b1 ^d.bit.b2 ^ d.bit.b6; \
147 r.bit.b3 = c.bit.b1 ^ c.bit.b2 ^ c.bit.b3 ^ c.bit.b7 ^ d.bit.b1 ^ d.bit.b2 ^d.bit.b3 ^ d.bit.b7; \
148 r.bit.b4 = c.bit.b2 ^ c.bit.b3 ^ c.bit.b4 ^ d.bit.b2 ^ d.bit.b3 ^ d.bit.b4; \
149 r.bit.b5 = c.bit.b3 ^ c.bit.b4 ^ c.bit.b5 ^ d.bit.b3 ^ d.bit.b4 ^ d.bit.b5; \
150 r.bit.b6 = c.bit.b4 ^ c.bit.b5 ^ c.bit.b6 ^ d.bit.b4 ^ d.bit.b5 ^ d.bit.b6; \
151 r.bit.b7 = c.bit.b5 ^ c.bit.b6 ^ c.bit.b7 ^ d.bit.b5 ^ d.bit.b6 ^ d.bit.b7; \
152 crc = r.word; \
153 } while(0)
154
155
156 BYTE CM_crc8_8(BYTE old,BYTE data) {
157 CM_crc8_8_word c,d,r;
158 BYTE Crc;
159
160 CM_CRC8_8(old,data,Crc,c,d,r);
161
162 return Crc;
163 }
164
165 /**
166 Compute a 8 CRC based over a \a buffer data of length \a length, whith a starting crc of \a oldcrc
167 and returns the 32 bit crc on the whole buffer
168 */
169 UINT32 CM_Compute_CRC8_8(UINT32 oldcrc /** the starting CRC value. changing this value also change the returning value. usually 0. */
170 ,BYTE *buffer /** the starting pointer to start crc computing */
171 ,UINT32 length /** the length in byte of the buffer */
172 )
173 {
174 int i;
175 BYTE tmpcrc,crc = oldcrc;
176 CM_crc8_8_word c,d,r;
177
178 for (i=0; i < length; i++) {
179 tmpcrc=crc;
180 CM_CRC8_8(tmpcrc,*buffer,crc,c,d,r);
181 buffer++;
182 }
183 return crc;
184 }
185
186
187 /*****************************************************************************/
188 /* @Function: CM_Crc16 */
189 /* @Purpose : */
190 /* This function calculates the CRC. */
191 /* */
192 /* @@ */
193 /* @Parameter Name @Mode @Description */
194 /* @@ */
195 /*****************************************************************************/
196
197 /* adrs_ptr: is BYTE*
198 * crc : is UINT16
199 */
200 #define CM_MACRO_CRC16(Crc16,adrs_ptr) do { \
201 Crc16 = \
202 (UINT32)(Crc16 << 8) ^ \
203 (UINT32)(Crc_lookup[ (UINT32) ( ((Crc16 >> 8) & 0xFF) ^ *adrs_ptr) ]); \
204 } while(0)
205
206 UINT16 CM_CRC16(BYTE* adrs, UINT16 Crc)
207 {
208 UINT32 Crc16Value=Crc;
209 // Calculating the CRC16 by using a LookUp table
210 CM_MACRO_CRC16(Crc16Value,adrs);
211 return ((UINT16)Crc16Value);
212 }
213
214 UINT16 CM_Compute_CRC16(UINT16 oldcrc,BYTE *buffer,UINT32 length) {
215 unsigned int i;
216 UINT32 Crc16Value=oldcrc;
217 for (i=0; i < length; i++) {
218 CM_MACRO_CRC16(Crc16Value,buffer);
219 buffer++;
220 }
221 return ((UINT16)Crc16Value);
222 }
223
224 BYTE* charToUnsignedChar(char *buffer, UINT32 length){
225 BYTE buff[length];
226 unsigned int i;
227 for (i=0; i < length; i++){
228 buff[i] = (BYTE)buffer[i];
229 }
230 return buff;
231 }
232

  ViewVC Help
Powered by ViewVC 1.1.23