-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathpatch1.patch
More file actions
167 lines (159 loc) · 7.18 KB
/
patch1.patch
File metadata and controls
167 lines (159 loc) · 7.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
diff --git a/hidtest/hidtest.cpp b/hidtest/hidtest.cpp
index ecbe8cf..797a0e8 100644
--- a/hidtest/hidtest.cpp
+++ b/hidtest/hidtest.cpp
@@ -47,7 +47,72 @@ fsm_cpl = 0,
fsm_ongoing = 1,
}fsm_type;
+#if 1
+ // CRC 字节值表
+ //字地址 0 - 255 (只取低8位)
+ //位地址 0 - 255 (只取低8位)
+ /* CRC 高位字节值表 */
+static unsigned char auchCRCHi[] = {
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
+ 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
+ 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
+ 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
+ };
+ /* CRC低位字节值表*/
+static unsigned char auchCRCLo[] = {
+ 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
+ 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
+ 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
+ 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
+ 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
+ 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
+ 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
+ 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
+ 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
+ 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
+ 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
+ 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
+ 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
+ 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
+ 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
+ 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
+ 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
+ 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
+ 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
+ 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
+ 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
+ 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
+ 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
+ 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
+ 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
+ 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
+ };
+
+#endif
static int receive_file_data(hid_device *dev, void * data, unsigned size, const char *name, int fsize);
+unsigned short crc16(unsigned char *puchMsg,unsigned short usDataLen);
static fsm_type xmodem_send_char(hid_device *handle, char c,int timeout)
{
@@ -72,7 +137,7 @@ static fsm_type xmodem_send_char(hid_device *handle, char c,int timeout)
static fsm_type do_xmodem(hid_device * handle)
{
- int res;
+ int res,rec_count;
unsigned char i,buf[61];
char bufout[61*2+1];
static enum {
@@ -90,11 +155,12 @@ static fsm_type do_xmodem(hid_device * handle)
int fsize;
int retry;
unsigned char *pBuf = NULL;
-
+ unsigned short crc;
switch(s_state) {
case STATE_START:
s_state = STATE_SEND_REQUEST;
+ rec_count = 0;
break;
case STATE_SEND_REQUEST:/* C */
printf("send C \n");
@@ -109,8 +175,15 @@ static fsm_type do_xmodem(hid_device * handle)
case STATE_SEND_ACK:/* D */ //这里需要读出文件名,并判断文件名是否等于file(1..2..3).bin等。
res = hid_read(handle, buf, sizeof(buf));
if(res > 0){
- if((buf[0]==SOH)&&(buf[3] == 'f')&&(buf[4] == 'i')){ //判断首字节和文件名是否在文件规则内
+ crc= crc16(buf,(sizeof(buf)-2));
+ if((buf[0]==SOH)&&(buf[3] == 'f')&&(buf[59] ==(unsigned char)(crc>>8))&&(buf[60] ==(unsigned char)(crc&0x00ff))){ //判断首字节和文件名是否在文件规则内
printf("send D \n");
+ printf("we have receive the file name and the capacity \n");
+ // for(i=0;i<56;i++){
+ // if(buf[i+3] !=SUB){
+ // pBuf[rec_count++] = buf[i+3];
+ // }
+ // }
//COPY the filename to pbuf;
xmodem_send_char(handle, 'D', -1);
s_state = STATE_SEND_ACK_WAIT;
@@ -142,7 +215,8 @@ static fsm_type do_xmodem(hid_device * handle)
Sleep(500);
res = hid_read(handle, buf, sizeof(buf));
if(res >0){ //
- if(buf[0]==SOH){ //接收文件中
+ crc= crc16(buf,(sizeof(buf)-2));
+ if((buf[0]==SOH)&&(buf[59] ==(unsigned char)(crc>>8))&&(buf[60] ==(unsigned char)(crc&0x00ff))){ //接收文件中
//COPY filedata to pbuf;
s_state = STATE_RECV_ACK;
for(i=0;i<61*2;i=i+2){
@@ -176,10 +250,12 @@ static fsm_type do_xmodem(hid_device * handle)
fsize = 128;
pBuf =(unsigned char *) malloc(fsize); //debug
printf("recv file\n");
- receive_file_data(handle, pBuf, fsize, "data.dat", fsize);
+ while(1);
+ receive_file_data(handle, pBuf, fsize, "data.dat", fsize);//这个文件有错,没能保存数据
Sleep(200);
s_state = STATE_START;
+ while(1);
return fsm_cpl;
}
return fsm_ongoing;
@@ -402,5 +478,25 @@ eof: fprintf(stderr, "\nINFO: End Of File Found:(last pack:%d bytes)\n",
return -1;
}
+unsigned short crc16(unsigned char *puchMsg,unsigned short usDataLen)
+{
+ unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
+ unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
+ unsigned char uIndex ; /* CRC循环中的索引 */
+ while (usDataLen--) /* 传输消息缓冲区 */
+ {
+ uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
+ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
+ uchCRCLo = auchCRCLo[uIndex] ;
+ }
+ return (uchCRCHi << 8 | uchCRCLo) ;
+}
+
+
+
+
+
+
+