PDA_FILE.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. /*
  2. * PDA_FILE.c
  3. *
  4. * Created on: 2012-12-19
  5. * Author: yangshuang
  6. */
  7. #include "head.h"
  8. #define PDA_TYPE_FILE 0X20
  9. #define PDA_FILE_ACK 0X80
  10. #define PDA_FILE_NAK 0X40
  11. #define FILE_ERR_OK 0x00
  12. #define FILE_ERR_NAME 0x01
  13. #define FILE_ERR_TYPE 0x02
  14. #define FILE_ERR_BUSY 0x03
  15. #define FILE_ERR_ADDR 0x04
  16. #define FILE_ERR_SIZE 0x05
  17. #define FILE_ERR_CRC 0x06
  18. #define FILE_ERR_SAVE 0x07
  19. #define FILE_ERR_PHASE 0x08
  20. #define FILE_ERR_MEM 0x09
  21. #define FILE_ERR_STATE 0x0a
  22. #define FILE_ERR_OTHER 0xff
  23. #define FILE_ATTR_UP 0X01
  24. #define FILE_ATTR_DOWN 0X02
  25. enum fState
  26. {
  27. FS_IDLE = 0,
  28. FS_VERIFY_DOWN,
  29. FS_VERIFY_UP,
  30. FS_INFO_DOWN,
  31. FS_INFO_UP,
  32. FS_DATA_DOWN,
  33. FS_DATA_UP,
  34. FS_RESULT_DOWN,
  35. FS_RESULT_UP,
  36. };
  37. struct filePDA
  38. {
  39. enum fState state;
  40. s32 file_index;
  41. u8 file_type;
  42. u16 file_type_key;
  43. u16 file_nFrameSum;
  44. u16 file_nFrame;
  45. u32 file_length;
  46. u16 file_crc;
  47. u32 file_offset;
  48. u8 file_name[13];
  49. u8 * file_buf;
  50. };
  51. struct file_item_pda
  52. {
  53. s8 *file_name;
  54. s8 *file_dir;
  55. u32 file_attr;
  56. int (* file_func)(int);
  57. };
  58. static int _PDA_file_check(s8 * name,u32 attr);
  59. static int _PDA_file_up_info(int index);
  60. static int _PDA_file_save_app(int index);
  61. static int _PDA_file_save_set(int index);
  62. static int _PDA_file_check_info(int index);
  63. static void _PDA_file_state_reset(void);
  64. extern void pda_data_echo(BYTE cmd,BYTE sum,BYTE *para);
  65. int printf_filePDA(void);
  66. static const char * szPdaTool = "ZHOL PDA DTU TOOL V1.00.01";
  67. struct filePDA p_filePDA= {0};
  68. struct file_item_pda p_file_item[] =
  69. {
  70. {"f308.ko","/app/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  71. {"iectable.bin","/app/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  72. {"sm2key0.bin","/app/data/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  73. {"sm2key1.bin","/app/data/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  74. {"sm2key2.bin","/app/data/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  75. {"sm2key3.bin","/app/data/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  76. {"userid.bin","/app/data/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  77. {FILE_NAME_SET_DESC,"/tmp/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  78. {"set_data.bin","/tmp/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_set},
  79. {"set_data_h.bin","/tmp/",FILE_ATTR_UP,NULL},
  80. {"tmp.bin","/app/",FILE_ATTR_UP|FILE_ATTR_DOWN,_PDA_file_save_app},
  81. };
  82. #define PDAFILE_ITEM_NUM (sizeof(p_file_item)/sizeof(struct file_item_pda))
  83. int PDA_TransFile(PDA_COMM *pt,unsigned char *buf)
  84. {
  85. u8 cmd_len;
  86. u32 offset,NumOfData;
  87. s32 file_index;
  88. static u8 cmd_buf[256];
  89. char name[256];
  90. char from_file_name[64];
  91. char to_file_name[64];
  92. cmd_buf[0] = PDA_TYPE_FILE;
  93. cmd_buf[1] = buf[0];
  94. file_index = 0;
  95. cmd_len =0;
  96. switch(buf[0])
  97. {
  98. case 0x01:
  99. // 下载请求验证
  100. // 复位状态机
  101. _PDA_file_state_reset();
  102. sprintf(cmd_buf+2,"ZHOL " EQUIP_NAME_STRING "版本号:V%d.%02d.%02d",(VER_NUM>>16)&0XFF,(VER_NUM>>8)&0XFF,VER_NUM&0XFF, VER_TIME "CRC:%04XH",m_CodeCrc);
  103. cmd_len = strlen(cmd_buf+2)+1+2;
  104. if(memcmp(buf+1,szPdaTool,20) != 0) // 具体版本号暂时不检查(匹配V1.XX.XX)
  105. {
  106. cmd_buf[1] |= PDA_FILE_NAK;
  107. break;
  108. }
  109. cmd_buf[1] |= PDA_FILE_ACK;
  110. p_filePDA.state = FS_VERIFY_DOWN;
  111. break;
  112. case 0x02:
  113. // 上传请求验证
  114. // 复位状态机
  115. _PDA_file_state_reset();
  116. sprintf(cmd_buf+2,"ZHOL " EQUIP_NAME_STRING "版本号:V%d.%02d.%02d",(VER_NUM>>16)&0XFF,(VER_NUM>>8)&0XFF,VER_NUM&0XFF, VER_TIME "CRC:%04XH",m_CodeCrc);
  117. cmd_len = strlen(cmd_buf+2)+1+2;
  118. if(memcmp(buf+1,szPdaTool,20) != 0) // 具体版本号暂时不检查(匹配V1.XX.XX)
  119. {
  120. cmd_buf[1] |= PDA_FILE_NAK;
  121. break;
  122. }
  123. cmd_buf[1] |= PDA_FILE_ACK;
  124. p_filePDA.state = FS_VERIFY_UP;
  125. break;
  126. case 0x03:
  127. // 下载文件信息
  128. p_filePDA.file_type = (int)buf[1];
  129. p_filePDA.file_length = ((DWORD)buf[2]<<24)+((DWORD)buf[3]<<16)+((DWORD)buf[4]<<8)+buf[5];
  130. p_filePDA.file_nFrameSum = ((DWORD)buf[6]<<8)+buf[7];
  131. p_filePDA.file_offset = 0;
  132. memcpy(cmd_buf+2,buf+11,16); // copy file name
  133. cmd_buf[18] = 0;
  134. file_index = (int)p_filePDA.file_type;
  135. if(file_index == 1)
  136. {
  137. memcpy(&p_filePDA.file_crc,buf+8,2); // copy file_crc
  138. swap16(&p_filePDA.file_crc);
  139. }
  140. else
  141. {
  142. Swap_16_memcpy((BYTE*)&p_filePDA.file_crc,buf+8); // modify for am335x xxxxxx
  143. }
  144. // 检查文件阶段
  145. if((p_filePDA.state != FS_VERIFY_DOWN) && (p_filePDA.state != FS_INFO_DOWN))
  146. {
  147. _PDA_file_state_reset();
  148. cmd_buf[1] |= PDA_FILE_NAK;
  149. cmd_buf[18] = FILE_ERR_PHASE;
  150. cmd_len = 19;
  151. break;
  152. }
  153. //检查文件名
  154. if(file_index == 0)
  155. {
  156. memcpy(p_filePDA.file_name,buf+11,(int)buf[10]);
  157. p_filePDA.file_name[(int)buf[10]] = '\0';
  158. rt_printf("%s\r\n",p_filePDA.file_name);
  159. p_filePDA.file_index = _PDA_file_check(p_filePDA.file_name,FILE_ATTR_DOWN);
  160. if(p_filePDA.file_index < 0 || p_filePDA.file_index != file_index )
  161. {
  162. rt_printf("p_filePDA.file_index:%d\r\n",p_filePDA.file_index);
  163. _PDA_file_state_reset();
  164. cmd_buf[1] |= PDA_FILE_NAK;
  165. cmd_buf[18] = FILE_ERR_NAME;
  166. cmd_len = 19;
  167. break;
  168. }
  169. }
  170. else if(file_index == 10)
  171. {
  172. p_filePDA.file_index = file_index;
  173. memcpy(p_filePDA.file_name,buf+11,(int)buf[10]);
  174. p_filePDA.file_name[(int)buf[10]] = '\0';
  175. rt_printf("switch3:%s\r\n",p_filePDA.file_name);
  176. }
  177. else
  178. {
  179. p_filePDA.file_index = _PDA_file_check(cmd_buf+2,FILE_ATTR_DOWN);
  180. if(p_filePDA.file_index < 0 || p_filePDA.file_index != file_index )
  181. {
  182. _PDA_file_state_reset();
  183. cmd_buf[1] |= PDA_FILE_NAK;
  184. cmd_buf[18] = FILE_ERR_NAME;
  185. cmd_len = 19;
  186. break;
  187. }
  188. }
  189. //检查文件长度
  190. if(p_filePDA.file_length > 4*1024*1024)
  191. {
  192. _PDA_file_state_reset();
  193. cmd_buf[1] |= PDA_FILE_NAK;
  194. cmd_buf[18] = FILE_ERR_SIZE;
  195. cmd_len = 19;
  196. break;
  197. }
  198. // 分配内存
  199. p_filePDA.file_buf = rt_malloc(p_filePDA.file_length);
  200. if((p_filePDA.file_buf) == NULL)
  201. {
  202. _PDA_file_state_reset();
  203. cmd_buf[1] |= PDA_FILE_NAK;
  204. cmd_buf[18] = FILE_ERR_MEM;
  205. cmd_len = 19;
  206. break;
  207. }
  208. printf_filePDA();
  209. // 所有检查通过,应答ACK
  210. cmd_buf[1] |= PDA_FILE_ACK;
  211. cmd_len = 18;
  212. // 修改状态
  213. p_filePDA.state = FS_INFO_DOWN;
  214. break;
  215. case 0x04:
  216. // 上传文件信息
  217. // 文件类型
  218. file_index = (int)buf[1];
  219. memcpy(cmd_buf+2,buf+2,16); // copy file name
  220. // 检查文件阶段
  221. if((p_filePDA.state != FS_VERIFY_UP) && (p_filePDA.state != FS_INFO_UP))
  222. {
  223. // 阶段不对
  224. _PDA_file_state_reset();
  225. cmd_buf[1] |= PDA_FILE_NAK;
  226. cmd_buf[2] = FILE_ERR_PHASE;
  227. cmd_len = 3;
  228. break;
  229. }
  230. // 检查文件名称
  231. p_filePDA.file_index = _PDA_file_check(cmd_buf+2,FILE_ATTR_UP);
  232. if(p_filePDA.file_index < 0 || p_filePDA.file_index != file_index)
  233. {
  234. _PDA_file_state_reset();
  235. cmd_buf[1] |= PDA_FILE_NAK;
  236. cmd_buf[2] = FILE_ERR_NAME;
  237. cmd_len = 3;
  238. break;
  239. }
  240. // 取得文件信息
  241. if(_PDA_file_up_info(p_filePDA.file_index) != 0)
  242. {
  243. _PDA_file_state_reset();
  244. cmd_buf[1] |= PDA_FILE_NAK;
  245. cmd_buf[2] = FILE_ERR_NAME;
  246. cmd_len = 3;
  247. break;
  248. }
  249. printf_filePDA();
  250. // 文件准备就绪,应答ACK
  251. memcpy(cmd_buf+2,p_file_item[file_index].file_name,16); // copy file name
  252. memcpy(cmd_buf+18,&p_filePDA.file_type,1);
  253. memcpy(cmd_buf+19,&p_filePDA.file_length,4);
  254. Swap_32(cmd_buf+19);
  255. Swap_16_memcpy(cmd_buf+23,(BYTE*)&p_filePDA.file_crc); // modify for am335x xxxxxx
  256. cmd_buf[1] |= PDA_FILE_ACK;
  257. cmd_len = 25;
  258. // 修改状态
  259. p_filePDA.state = FS_INFO_UP;
  260. break;
  261. case 0x05:
  262. // 下载文件正文
  263. NumOfData = (int)buf[1];
  264. offset = ((DWORD)buf[2]<<24)+((DWORD)buf[3]<<16)+((DWORD)buf[4]<<8)+buf[5];
  265. // 检查文件阶段
  266. if((p_filePDA.state != FS_INFO_DOWN) && (p_filePDA.state != FS_DATA_DOWN))
  267. {
  268. _PDA_file_state_reset();
  269. cmd_buf[1] |= PDA_FILE_NAK;
  270. cmd_buf[6] = FILE_ERR_PHASE;
  271. cmd_len = 7;
  272. break;
  273. }
  274. // 检查文件buf
  275. if(p_filePDA.file_buf == NULL)
  276. {
  277. _PDA_file_state_reset();
  278. cmd_buf[1] |= PDA_FILE_NAK;
  279. cmd_buf[6] = FILE_ERR_STATE;
  280. cmd_len = 7;
  281. break;
  282. }
  283. // 检查文件offset
  284. if(offset == p_filePDA.file_offset)
  285. {
  286. // 一切正常,获取数据
  287. memcpy(p_filePDA.file_buf + offset,buf+6,NumOfData);
  288. p_filePDA.file_offset += NumOfData;
  289. }
  290. else
  291. {
  292. rt_printf("PDA_TransFile:offset\r\n");
  293. }
  294. rt_printf("offset=%d\r\n",offset);
  295. // 发送ACK
  296. cmd_buf[1] |= PDA_FILE_ACK;
  297. memcpy(cmd_buf+3,&p_filePDA.file_offset,4);
  298. Swap_32(cmd_buf+3);
  299. cmd_buf[2] = (char)NumOfData;
  300. cmd_len = 7;
  301. // 修改状态
  302. p_filePDA.state = FS_DATA_DOWN;
  303. break;
  304. case 0x06:
  305. // 上传文件正文
  306. offset = ((DWORD)buf[2]<<24)+((DWORD)buf[3]<<16)+((DWORD)buf[4]<<8)+buf[5];
  307. // 检查文件阶段
  308. if((p_filePDA.state != FS_INFO_UP) && (p_filePDA.state != FS_DATA_UP))
  309. {
  310. _PDA_file_state_reset();
  311. cmd_buf[1] |= PDA_FILE_NAK;
  312. cmd_buf[6] = FILE_ERR_PHASE;
  313. cmd_len = 7;
  314. break;
  315. }
  316. // 检查文件file_buf
  317. if(p_filePDA.file_buf == NULL)
  318. {
  319. _PDA_file_state_reset();
  320. cmd_buf[1] |= PDA_FILE_NAK;
  321. cmd_buf[6] = FILE_ERR_STATE;
  322. cmd_len = 7;
  323. break;
  324. }
  325. // 检查文件offset
  326. if(offset >= p_filePDA.file_length)
  327. {
  328. _PDA_file_state_reset();
  329. cmd_buf[1] |= PDA_FILE_NAK;
  330. cmd_buf[6] = FILE_ERR_ADDR;
  331. cmd_len = 7;
  332. break;
  333. }
  334. // 发送ACK
  335. cmd_buf[1] |= PDA_FILE_ACK;
  336. if(p_filePDA.file_length - offset > 228)
  337. {
  338. cmd_len = 228;
  339. }
  340. else
  341. {
  342. cmd_len = p_filePDA.file_length - offset;
  343. }
  344. memcpy(cmd_buf+6,p_filePDA.file_buf + offset,cmd_len);
  345. offset += cmd_len;
  346. memcpy(cmd_buf+2,&offset,4);
  347. Swap_32(cmd_buf+2);
  348. cmd_len += 6;
  349. // 修改状态
  350. p_filePDA.state = FS_DATA_UP;
  351. break;
  352. break;
  353. case 0x07:
  354. // 下载结果确认
  355. // 检查文件阶段
  356. if((p_filePDA.state != FS_DATA_DOWN) && (p_filePDA.state != FS_RESULT_DOWN))
  357. {
  358. _PDA_file_state_reset();
  359. cmd_buf[1] |= PDA_FILE_NAK;
  360. cmd_buf[2] = FILE_ERR_PHASE;
  361. cmd_len = 3;
  362. break;
  363. }
  364. // 如果是重复报文,继续肯定应答。
  365. if(p_filePDA.state == FS_RESULT_DOWN)
  366. {
  367. // 判断是否需要复位
  368. if(buf[1] ==0x01) // 0:不复位;1:复位
  369. {
  370. rt_irq_disable();
  371. while(1) ;
  372. }
  373. cmd_buf[1] |= PDA_FILE_ACK;
  374. cmd_len = 2;
  375. break;
  376. }
  377. //检查文件长度
  378. if(p_filePDA.file_offset != p_filePDA.file_length)
  379. {
  380. _PDA_file_state_reset();
  381. cmd_buf[1] |= PDA_FILE_NAK;
  382. cmd_buf[2] = FILE_ERR_SIZE;
  383. cmd_len = 3;
  384. break;
  385. }
  386. // 检查文件CRC
  387. if(p_filePDA.file_index < 2 ||( p_filePDA.file_index >6 && p_filePDA.file_index < 10 ))
  388. {
  389. if( CrcStr(p_filePDA.file_buf,(p_filePDA.file_length-2)) != p_filePDA.file_crc)
  390. {
  391. _PDA_file_state_reset();
  392. cmd_buf[1] |= PDA_FILE_NAK;
  393. cmd_buf[2] = FILE_ERR_CRC;
  394. cmd_len = 3;
  395. rt_printf("// CRC错误\r\n");
  396. break;
  397. }
  398. }
  399. // 文件保存
  400. rt_printf("// 文件保存\r\n");
  401. if(p_file_item[p_filePDA.file_index].file_func(p_filePDA.file_index) != 0)
  402. {
  403. printf_filePDA();
  404. _PDA_file_state_reset();
  405. cmd_buf[1] |= PDA_FILE_NAK;
  406. cmd_buf[2] = FILE_ERR_SAVE;
  407. cmd_len = 3;
  408. break;
  409. }
  410. if(_PDA_file_check_info(p_filePDA.file_index) == 0)
  411. {
  412. char log_buf[128]={0};
  413. sprintf(to_file_name,"%s%s",p_file_item[p_filePDA.file_index].file_dir,p_file_item[p_filePDA.file_index].file_name);
  414. sprintf(from_file_name,"%s%s","/tmp/",p_file_item[p_filePDA.file_index].file_name);
  415. rt_file_mv(from_file_name,to_file_name);
  416. sprintf(name,"%s%s%s","文件更新",p_file_item[p_filePDA.file_index].file_dir,p_file_item[p_filePDA.file_index].file_name);
  417. log_str_time(LOG_OPERATE,name,0,1);
  418. sprintf(log_buf,"%s updated",p_file_item[p_filePDA.file_index].file_name);
  419. load_hs_log_rcd(TYPE_SW_UPDATE,true,NULL,log_buf,1);
  420. rt_printf("// yes\r\n");
  421. }
  422. else
  423. {
  424. _PDA_file_state_reset();
  425. cmd_buf[1] |= PDA_FILE_NAK;
  426. cmd_buf[2] = FILE_ERR_CRC;
  427. cmd_len = 3;
  428. rt_printf("// check错误\r\n");
  429. break;
  430. }
  431. // 一切正常,肯定应答
  432. cmd_buf[1] |= PDA_FILE_ACK;
  433. cmd_len = 2;
  434. // 复位全部状态后,设置状态为FS_RESULT_DOWN,继续应答重发确认帧。
  435. _PDA_file_state_reset();
  436. p_filePDA.state = FS_RESULT_DOWN;
  437. break;
  438. case 0x08:
  439. // 上传结果确认
  440. // 检查文件阶段
  441. if((p_filePDA.state != FS_DATA_UP) && (p_filePDA.state != FS_RESULT_UP))
  442. {
  443. _PDA_file_state_reset();
  444. cmd_buf[1] |= PDA_FILE_NAK;
  445. cmd_buf[2] = FILE_ERR_PHASE;
  446. cmd_len = 3;
  447. break;
  448. }
  449. // 如果是重复报文,继续肯定应答。
  450. if(p_filePDA.state == FS_RESULT_UP)
  451. {
  452. cmd_buf[1] |= PDA_FILE_ACK;
  453. cmd_len = 2;
  454. break;
  455. }
  456. // 一切正常,肯定应答
  457. cmd_buf[1] |= PDA_FILE_ACK;
  458. cmd_len = 2;
  459. // 复位全部状态后,设置状态为FS_RESULT_UP,继续应答重发确认帧。
  460. _PDA_file_state_reset();
  461. p_filePDA.state = FS_RESULT_UP;
  462. break;
  463. break;
  464. default:
  465. rt_printf("PDA_TransFile:不支持的命令(%d)\r\n",buf[0]);
  466. _PDA_file_state_reset();
  467. cmd_buf[1] |= PDA_FILE_NAK;
  468. cmd_buf[2] = FILE_ERR_OTHER;
  469. cmd_len = 3;
  470. break;
  471. }
  472. pda_data_echo(0xE7,cmd_len,cmd_buf);
  473. return 0;
  474. }
  475. static int _PDA_file_check(s8 * name,u32 attr)
  476. {
  477. int i;
  478. for(i=0; i< PDAFILE_ITEM_NUM; i++)
  479. {
  480. if(strcmp(name,p_file_item[i].file_name) == 0)
  481. {
  482. if(attr & p_file_item[i].file_attr)
  483. {
  484. return i;
  485. }
  486. }
  487. }
  488. return -1;
  489. }
  490. static void _PDA_file_state_reset(void)
  491. {
  492. p_filePDA.state = FS_IDLE;
  493. if(p_filePDA.file_buf)
  494. {
  495. rt_free(p_filePDA.file_buf);
  496. p_filePDA.file_buf = 0;
  497. }
  498. }
  499. static int _PDA_file_up_info(int index)
  500. {
  501. char file_name[64];
  502. struct file * pfile;
  503. loff_t pos;
  504. sprintf(file_name,"%s%s",p_file_item[index].file_dir,p_file_item[index].file_name);
  505. // 打开文件
  506. pfile = rt_file_open(file_name,O_RDONLY ,0);
  507. if(IS_ERR(pfile))
  508. {
  509. return -1;
  510. }
  511. // 得到文件长度
  512. p_filePDA.file_length = rt_file_getfile_size(pfile);
  513. if(p_filePDA.file_length <= 0)
  514. {
  515. rt_file_close(pfile,0);
  516. return -11;
  517. }
  518. // 分配内存
  519. p_filePDA.file_buf = rt_malloc(p_filePDA.file_length);
  520. if((p_filePDA.file_buf) == NULL)
  521. {
  522. rt_file_close(pfile,0);
  523. return -2;
  524. }
  525. // 读出内容
  526. pos = 0;
  527. if(rt_file_read(pfile,p_filePDA.file_buf,p_filePDA.file_length,&pos) != p_filePDA.file_length)
  528. {
  529. rt_file_close(pfile,0);
  530. rt_free(p_filePDA.file_buf);
  531. p_filePDA.file_buf = 0;
  532. return -3;
  533. }
  534. // 关闭文件
  535. rt_file_close(pfile,0);
  536. // 计算CRC
  537. p_filePDA.file_crc = CrcStr(p_filePDA.file_buf,p_filePDA.file_length);
  538. // offset
  539. p_filePDA.file_offset = 0;
  540. // 文件类型
  541. p_filePDA.file_type = (char)index;
  542. return 0;
  543. }
  544. static int _PDA_file_save_set(int index)
  545. {
  546. int ret;
  547. ret = set_save_data_file(index);//p_filePDA.file_buf,p_filePDA.file_length);
  548. return ret;
  549. }
  550. static int _PDA_file_save_app(int index)
  551. {
  552. char file_name[64];
  553. struct file * pfile;
  554. loff_t pos;
  555. if(p_filePDA.file_index == 0)
  556. {
  557. //sprintf(file_name,"%s%s.new",p_file_item[index].file_dir,p_file_item[index].file_name);
  558. sprintf(file_name,"%s%s","/tmp/",p_file_item[index].file_name);
  559. }
  560. else if(p_filePDA.file_index == 10)
  561. {
  562. if(p_filePDA.file_name == NULL)
  563. {
  564. sprintf(file_name,"%s%s","/tmp/",p_file_item[index].file_name);
  565. }
  566. else
  567. {
  568. sprintf(file_name,"%s%s","/tmp/",p_filePDA.file_name);
  569. }
  570. }
  571. else
  572. {
  573. sprintf(file_name,"%s%s","/tmp/",p_file_item[index].file_name);
  574. }
  575. // 创建并打开文件
  576. pfile = rt_file_open(file_name,O_CREAT|O_RDWR|O_TRUNC|O_SYNC,0);
  577. if(IS_ERR(pfile))
  578. {
  579. return -1;
  580. }
  581. // 写文件
  582. pos = 0;
  583. if(rt_file_write(pfile,p_filePDA.file_buf,p_filePDA.file_length,&pos) != p_filePDA.file_length)
  584. {
  585. rt_file_close(pfile,0);
  586. return -2;
  587. }
  588. // 关闭文件
  589. rt_file_close(pfile,0);
  590. sprintf(file_name,"%s%s",p_file_item[index].file_dir,p_file_item[index].file_name);
  591. rt_printf("close%s\r\n",file_name);
  592. if(p_filePDA.file_index == 1)
  593. {
  594. //RmtInf_Init();
  595. }
  596. return 0;
  597. }
  598. int _PDA_file_check_info(int index)
  599. {
  600. char file_name[64];
  601. u32 len;
  602. u16 crc;
  603. u8 *buf;
  604. struct file * pfile;
  605. loff_t pos;
  606. sprintf(file_name,"%s%s","/tmp/",p_file_item[index].file_name);
  607. // 打开文件
  608. pfile = rt_file_open(file_name,O_RDONLY ,0);
  609. if(IS_ERR(pfile))
  610. {
  611. rt_printf("-1\r\n");
  612. return -1;
  613. }
  614. // 得到文件长度
  615. len = rt_file_getfile_size(pfile);
  616. if(len <= 0)
  617. {
  618. rt_file_close(pfile,0);
  619. return -11;
  620. }
  621. // 分配内存
  622. buf = rt_malloc(len);
  623. if((buf) == NULL)
  624. {
  625. rt_file_close(pfile,0);
  626. rt_printf("-2\r\n");
  627. return -2;
  628. }
  629. // 读出内容
  630. pos = 0;
  631. if(rt_file_read(pfile,buf,len,&pos) != len)
  632. {
  633. rt_file_close(pfile,0);
  634. rt_free(buf);
  635. rt_printf("-3\r\n");
  636. return -3;
  637. }
  638. // 关闭文件
  639. rt_file_close(pfile,0);
  640. // 检查CRC
  641. crc = CrcStr(buf,len-2);
  642. if(crc != *(u16*)(buf+len-2))
  643. {
  644. rt_free(buf);
  645. rt_printf("-4\r\n");
  646. return -4;
  647. }
  648. rt_free(buf); // sunxi 20180719 added
  649. return 0;
  650. }
  651. int printf_filePDA(void)
  652. {
  653. rt_printf("p_filePDA:\t%p\r\n",&p_filePDA);
  654. rt_printf("state:\t\t%d\r\n",p_filePDA.state);
  655. rt_printf("file_name:\t%s\r\n",p_file_item[p_filePDA.file_index].file_name);
  656. rt_printf("file_index:\t%d\r\n",p_filePDA.file_index);
  657. rt_printf("file_type:\t%d\r\n",p_filePDA.file_type);
  658. rt_printf("file_crc:\t0x%04x\r\n",p_filePDA.file_crc);
  659. rt_printf("file_length:\t%d\r\n",p_filePDA.file_length);
  660. rt_printf("file_offset:\t%d\r\n",p_filePDA.file_offset);
  661. rt_printf("file_buf:\t%p\r\n",p_filePDA.file_buf);
  662. return 0;
  663. }