uart_api.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:19k
源码类别:

DVD

开发平台:

Others

  1. /*****************************************************************************
  2. Copyright (c) 2000 ZORAN Corporation, All Rights Reserved
  3. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4. File: "uart_api.c"                                      07/11/01
  5.      Created by: Rinat Alfia rinata@zoran.co.il
  6. Description:
  7.       Uart driver for UART 0 - use by Boot ROM only.
  8. *****************************************************************************/
  9. #include "config.h"
  10. #ifdef SUPPORT_KEYS_UPDATE
  11. /* Includes */
  12. #include "UARTStore_Keys.h"
  13. #include "Uartuart_api.h"
  14. #include "eeprom.h"
  15.                                      
  16. /* Defines */
  17. //#define I49_IC
  18. //#ifdef I49_IC
  19. #define BAUDDIV  0xdc//0xb0 // 54000000/19200/16
  20. //#else
  21. //#error "Set baud rate for I64"
  22. //#endif
  23. #define UART_CON     0xff80U
  24. #define UART_BDIV    0xff88U
  25. #define UART_STS     0xff82U
  26. #define UART_TDATA   0xff84U
  27. #define UART_RDATA   0xff86U
  28. #define UART_RMODE1 0x0001 /* MODE bit 0 mask */
  29. #define UART_TMODE 0x0040 /* TMODE enable mask */
  30. #define UART_RMODE 0x0020 /* RMODE enable mask */
  31. #define TIME_OUT_LIMIT 0x7ffffUL
  32. static DWORD crc32;
  33. static BOOL timeout=FALSE;
  34. extern CONST BYTE Store_Keys_Num;
  35. extern CONST KEYS_STORE_STRUCT Store_Keys_Map[];
  36. extern BYTE* new_keys;
  37. #define START_CODE_LENGHT 12
  38. CONST BYTE Start_Code[START_CODE_LENGHT]={0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00};
  39. static CONST DWORD crc32_table[256] = {
  40.    0x00000000UL,0x77073096UL,0xee0e612cUL,0x990951baUL,0x076dc419UL,0x706af48fUL,0xe963a535UL,0x9e6495a3UL,
  41.    0x0edb8832UL,0x79dcb8a4UL,0xe0d5e91eUL,0x97d2d988UL,0x09b64c2bUL,0x7eb17cbdUL,0xe7b82d07UL,0x90bf1d91UL,
  42.    0x1db71064UL,0x6ab020f2UL,0xf3b97148UL,0x84be41deUL,0x1adad47dUL,0x6ddde4ebUL,0xf4d4b551UL,0x83d385c7UL,
  43.    0x136c9856UL,0x646ba8c0UL,0xfd62f97aUL,0x8a65c9ecUL,0x14015c4fUL,0x63066cd9UL,0xfa0f3d63UL,0x8d080df5UL,
  44.    0x3b6e20c8UL,0x4c69105eUL,0xd56041e4UL,0xa2677172UL,0x3c03e4d1UL,0x4b04d447UL,0xd20d85fdUL,0xa50ab56bUL,
  45.    0x35b5a8faUL,0x42b2986cUL,0xdbbbc9d6UL,0xacbcf940UL,0x32d86ce3UL,0x45df5c75UL,0xdcd60dcfUL,0xabd13d59UL,
  46.    0x26d930acUL,0x51de003aUL,0xc8d75180UL,0xbfd06116UL,0x21b4f4b5UL,0x56b3c423UL,0xcfba9599UL,0xb8bda50fUL,
  47.    0x2802b89eUL,0x5f058808UL,0xc60cd9b2UL,0xb10be924UL,0x2f6f7c87UL,0x58684c11UL,0xc1611dabUL,0xb6662d3dUL,
  48.    0x76dc4190UL,0x01db7106UL,0x98d220bcUL,0xefd5102aUL,0x71b18589UL,0x06b6b51fUL,0x9fbfe4a5UL,0xe8b8d433UL,
  49.    0x7807c9a2UL,0x0f00f934UL,0x9609a88eUL,0xe10e9818UL,0x7f6a0dbbUL,0x086d3d2dUL,0x91646c97UL,0xe6635c01UL,
  50.    0x6b6b51f4UL,0x1c6c6162UL,0x856530d8UL,0xf262004eUL,0x6c0695edUL,0x1b01a57bUL,0x8208f4c1UL,0xf50fc457UL,
  51.    0x65b0d9c6UL,0x12b7e950UL,0x8bbeb8eaUL,0xfcb9887cUL,0x62dd1ddfUL,0x15da2d49UL,0x8cd37cf3UL,0xfbd44c65UL,
  52.    0x4db26158UL,0x3ab551ceUL,0xa3bc0074UL,0xd4bb30e2UL,0x4adfa541UL,0x3dd895d7UL,0xa4d1c46dUL,0xd3d6f4fbUL,
  53.    0x4369e96aUL,0x346ed9fcUL,0xad678846UL,0xda60b8d0UL,0x44042d73UL,0x33031de5UL,0xaa0a4c5fUL,0xdd0d7cc9UL,
  54.    0x5005713cUL,0x270241aaUL,0xbe0b1010UL,0xc90c2086UL,0x5768b525UL,0x206f85b3UL,0xb966d409UL,0xce61e49fUL,
  55.    0x5edef90eUL,0x29d9c998UL,0xb0d09822UL,0xc7d7a8b4UL,0x59b33d17UL,0x2eb40d81UL,0xb7bd5c3bUL,0xc0ba6cadUL,
  56.    0xedb88320UL,0x9abfb3b6UL,0x03b6e20cUL,0x74b1d29aUL,0xead54739UL,0x9dd277afUL,0x04db2615UL,0x73dc1683UL,
  57.    0xe3630b12UL,0x94643b84UL,0x0d6d6a3eUL,0x7a6a5aa8UL,0xe40ecf0bUL,0x9309ff9dUL,0x0a00ae27UL,0x7d079eb1UL,
  58.    0xf00f9344UL,0x8708a3d2UL,0x1e01f268UL,0x6906c2feUL,0xf762575dUL,0x806567cbUL,0x196c3671UL,0x6e6b06e7UL,
  59.    0xfed41b76UL,0x89d32be0UL,0x10da7a5aUL,0x67dd4accUL,0xf9b9df6fUL,0x8ebeeff9UL,0x17b7be43UL,0x60b08ed5UL,
  60.    0xd6d6a3e8UL,0xa1d1937eUL,0x38d8c2c4UL,0x4fdff252UL,0xd1bb67f1UL,0xa6bc5767UL,0x3fb506ddUL,0x48b2364bUL,
  61.    0xd80d2bdaUL,0xaf0a1b4cUL,0x36034af6UL,0x41047a60UL,0xdf60efc3UL,0xa867df55UL,0x316e8eefUL,0x4669be79UL,
  62.    0xcb61b38cUL,0xbc66831aUL,0x256fd2a0UL,0x5268e236UL,0xcc0c7795UL,0xbb0b4703UL,0x220216b9UL,0x5505262fUL,
  63.    0xc5ba3bbeUL,0xb2bd0b28UL,0x2bb45a92UL,0x5cb36a04UL,0xc2d7ffa7UL,0xb5d0cf31UL,0x2cd99e8bUL,0x5bdeae1dUL,
  64.    0x9b64c2b0UL,0xec63f226UL,0x756aa39cUL,0x026d930aUL,0x9c0906a9UL,0xeb0e363fUL,0x72076785UL,0x05005713UL,
  65.    0x95bf4a82UL,0xe2b87a14UL,0x7bb12baeUL,0x0cb61b38UL,0x92d28e9bUL,0xe5d5be0dUL,0x7cdcefb7UL,0x0bdbdf21UL,
  66.    0x86d3d2d4UL,0xf1d4e242UL,0x68ddb3f8UL,0x1fda836eUL,0x81be16cdUL,0xf6b9265bUL,0x6fb077e1UL,0x18b74777UL,
  67.    0x88085ae6UL,0xff0f6a70UL,0x66063bcaUL,0x11010b5cUL,0x8f659effUL,0xf862ae69UL,0x616bffd3UL,0x166ccf45UL,
  68.    0xa00ae278UL,0xd70dd2eeUL,0x4e048354UL,0x3903b3c2UL,0xa7672661UL,0xd06016f7UL,0x4969474dUL,0x3e6e77dbUL,
  69.    0xaed16a4aUL,0xd9d65adcUL,0x40df0b66UL,0x37d83bf0UL,0xa9bcae53UL,0xdebb9ec5UL,0x47b2cf7fUL,0x30b5ffe9UL,
  70.    0xbdbdf21cUL,0xcabac28aUL,0x53b39330UL,0x24b4a3a6UL,0xbad03605UL,0xcdd70693UL,0x54de5729UL,0x23d967bfUL,
  71.    0xb3667a2eUL,0xc4614ab8UL,0x5d681b02UL,0x2a6f2b94UL,0xb40bbe37UL,0xc30c8ea1UL,0x5a05df1bUL,0x2d02ef8dUL
  72. };
  73. void _calculate_CRC(BYTE *data, int len)
  74. {
  75. unsigned long oldcrc32;
  76. unsigned long oldcrc;
  77. unsigned  int charcnt;
  78. BYTE c,t;
  79. oldcrc32 = crc32; //
  80. charcnt=0;
  81. while (len--) 
  82. {
  83. t= (BYTE)((oldcrc32 >> 24) & 0xFF);
  84. oldcrc=crc32_table[t];
  85. c=data[charcnt];
  86. oldcrc32= ((oldcrc32 << 8)&0xFFFFFF00) | (DWORD)c;
  87. oldcrc32^=oldcrc;
  88. charcnt++;
  89. }
  90. crc32=oldcrc32;
  91. return;
  92. }
  93. void _switch_word(WORD *data)
  94. {
  95. *data = (*data&0x00ff)<<8 | (*data&0xff00) >> 8;
  96. }
  97. void _switch_dword(DWORD *data)
  98. {
  99. *data = (*data&0xff)<<24 | (*data&0xff00)<<8 | (*data&0xff0000)>>8 | (*data&0xff000000)>>24;
  100. }
  101. /*---------------------------------------------------------------------------------
  102.  Purpose          :  Initialization of UART 0
  103.  Description :  Set UART Control and UART baud rate div registers
  104.  Input Parameters :  none
  105.  Return Value     :  none
  106. ---------------------------------------------------------------------------------*/
  107. void _uartOpen(void)
  108. {
  109. boot_outport( UART_CON, UART_RMODE1 | UART_TMODE | UART_RMODE );   // 8 bit word, 1 stop bit, no parity
  110. //#if defined(__JTAG__) || defined(__PDREMOTE__)
  111. // _uartBaudRate(0x50); // to debug on vautomation board
  112. //#else
  113. _uartBaudRate( BAUDDIV );
  114. //#endif
  115. }
  116. /*---------------------------------------------------------------------------------
  117.  Purpose          : Set UART baud rate
  118.  Description : Set UART_BDIV register
  119.  Input Parameters : baud_rate - the baud rate to set
  120.  Return Value     : void
  121. ---------------------------------------------------------------------------------*/
  122. void _uartBaudRate( unsigned int baud_rate )
  123. {
  124. while (!_uartIsTxReady());   // wait for tx ready to be set
  125. boot_outport(UART_BDIV, baud_rate);
  126. }
  127. /*---------------------------------------------------------------------------------
  128.  Purpose          :  Return if TX is ready
  129.  Description :  Read UART_STS TX bit
  130.  Input Parameters :  none
  131.  Return Value     :  TRUE - When TX is ready, else FLASE
  132. ---------------------------------------------------------------------------------*/
  133. BOOL _uartIsTxReady(void)
  134. {
  135. return (boot_inport(UART_STS) & 0x40) != 0; // is tx ready set
  136. }
  137. /*---------------------------------------------------------------------------------
  138.  Purpose          :  Return if RX is ready
  139.  Description :  Read UART_STS RX bit
  140.  Input Parameters :  none
  141.  Return Value     :  TRUE - When RX is ready, else FLASE
  142. ---------------------------------------------------------------------------------*/
  143. BOOL _uartIsRxReady(void)
  144. {
  145. return (boot_inport(UART_STS) & 0x80) != 0; // is rx ready set
  146. }
  147. /*---------------------------------------------------------------------------------
  148.  Purpose          :  Send one byte through UART 0
  149.  Description :  Wait Tx ready and then write to TDATA register.
  150.  Input Parameters :  byte - the byte to send
  151.  Return Value     :  void
  152. ---------------------------------------------------------------------------------*/
  153. void _uartSndByte( unsigned char byte)
  154. {
  155. while (!_uartIsTxReady()) ; // wait for tx ready to be set
  156. boot_outport(UART_TDATA, (int)byte);
  157. }
  158. /*---------------------------------------------------------------------------------
  159.  Purpose          :  Get one byte through UART 0
  160.  Description :  Wait Rx ready and then read from RDATA register.
  161.  Input Parameters :  none
  162.  Return Value     :  The read byte
  163. ---------------------------------------------------------------------------------*/
  164. unsigned char _uartRcvByte(void)
  165. {
  166. unsigned char c;
  167. DWORD times=0;
  168. while (!_uartIsRxReady())
  169. if( times++ > TIME_OUT_LIMIT)
  170. {
  171. timeout=TRUE;
  172. return 0;
  173. }
  174. c = (char)boot_inport(UART_RDATA);
  175. return c;
  176. }
  177. /*---------------------------------------------------------------------------------
  178.  Purpose          :  Send N bytes through uart 0
  179.  Description :  Call _uartSndByte N times
  180.  Input Parameters :  buff - pointer to array of bytes to send
  181.   N - number of bytes to send
  182.  Return Value     :  none
  183. ---------------------------------------------------------------------------------*/
  184. void _uartSndNBytes(unsigned char *buff , int N )
  185. {
  186. while (N--)
  187. {
  188. _calculate_CRC(buff, 1);
  189. _uartSndByte(*buff++);
  190. }
  191. }
  192. /*---------------------------------------------------------------------------------
  193.  Purpose          :  Recived N bytes through uart 0
  194.  Description :  Call _uartRcvByte N times
  195.  Input Parameters :  buff - pointer the recived buffer
  196.   N - number of bytes to recived
  197.  Return Value     :  none
  198. ---------------------------------------------------------------------------------*/
  199. BOOL _uartRcvNBytes( unsigned char *buff, int N)
  200. {
  201. //tr_printf(("_uartRcvNBytes(%d)n",N));
  202. while (N--)
  203. {
  204. *buff =_uartRcvByte();
  205. if(timeout)
  206. {
  207. tr_printf(("Receive data timeout!n"));
  208. timeout = 0;
  209. return FALSE;
  210. }
  211. tr_printf(("%02x  ",*buff));
  212. _calculate_CRC(buff, 1);
  213. buff++;
  214. }
  215. tr_printf(("n"));
  216. return TRUE;
  217. }
  218. /*---------------------------------------------------------------------------------
  219.  Purpose          :  out "data" register to "port" register
  220.  Description :  Implimentation in assembler
  221.  Input Parameters :  port  - destination register
  222.   data  - source register
  223.  Return Value     :  none
  224. ---------------------------------------------------------------------------------*/
  225. void  boot_outport(unsigned int port, unsigned int data)
  226. {
  227. asm {
  228. mov dx, port;
  229. mov ax, data;
  230. out dx, ax;
  231. }
  232. }
  233. /*---------------------------------------------------------------------------------
  234.  Purpose          :  Read from "port" register
  235.  Description :  Implimentation in assembler
  236.  Input Parameters :  port  - destination register
  237.  Return Value     :  return the read value
  238. ---------------------------------------------------------------------------------*/
  239. unsigned int boot_inport(unsigned int port)
  240. {
  241. asm {
  242. mov dx, port;
  243. in  ax, dx;
  244. }
  245. return (_AX);
  246. }
  247. BOOL b_disable_interrupt = FALSE;
  248. UINT16 disable_interrupt (void)
  249. {
  250. asm
  251. {
  252. pushf
  253. pop ax
  254. cli
  255. }
  256. b_disable_interrupt = TRUE;
  257. return (_AX);
  258. }
  259. void resume_interrupt ( UINT16 sr )
  260. {
  261. if( !b_disable_interrupt )
  262. return;
  263. b_disable_interrupt = FALSE;
  264. asm
  265. {
  266. push sr
  267. popf
  268. }
  269. }
  270. BOOL _receive_message(WORD *o_type, WORD *o_length, BYTE *o_data, BYTE *o_extend_data)
  271. {
  272. WORD buff_len;
  273. BYTE buff_startcode[START_CODE_LENGHT];
  274. DWORD buff_CRC;
  275. DWORD crc_data;
  276. BYTE index;
  277. crc32 = 0;
  278. //read start code
  279. if( !_uartRcvNBytes((BYTE*)&buff_startcode, START_CODE_LENGHT) )
  280. return FALSE;
  281. //_switch_word(&buff);
  282. if( !memcmp(buff_startcode, Start_Code,START_CODE_LENGHT) )
  283. {
  284. //read message type
  285. if( !_uartRcvNBytes((BYTE*)o_type, 2) )
  286. return FALSE;
  287. _switch_word(o_type);
  288. //read message length
  289. if( !_uartRcvNBytes((BYTE*)o_length, 2) )
  290. return FALSE;
  291. _switch_word(o_length);
  292. buff_len = *o_length;
  293. //read message data
  294. if( *o_type != MESSAGE_KEY_DOWNLOAD )
  295. {
  296. if( !_uartRcvNBytes(o_data, buff_len) )
  297. return FALSE;
  298. }
  299. else
  300. {
  301. if( !_uartRcvNBytes(o_data, 1) )
  302. return FALSE;
  303. for(index=0; index<Store_Keys_Num; index++)
  304. {
  305. if( Store_Keys_Map[index].Keys_type == *o_data)
  306. break;
  307. }
  308. if(index == Store_Keys_Num)
  309. return FALSE;
  310. if( buff_len>MAX_MESSAGE_DATA_LENGTH )
  311. {
  312. tr_printf(("Error: Message data length is too long.n"));
  313. return FALSE;
  314. }
  315. if( *o_data == KEY_TYPE_DVDA_CPRM_TYPE_A || *o_data == KEY_TYPE_DVDA_CPRM_TYPE_B || *o_data == KEY_TYPE_DVDA_CPRM_TYPE_C )
  316. {
  317. *(o_extend_data+Store_Keys_Map[index].Keys_offset+sizeof(DWORD)) = *o_data;
  318. if( !_uartRcvNBytes(o_extend_data+Store_Keys_Map[index].Keys_offset+sizeof(DWORD)+1, buff_len -1 ) )
  319. return FALSE;
  320. }
  321. else
  322. {
  323. if( !_uartRcvNBytes(o_extend_data+Store_Keys_Map[index].Keys_offset+sizeof(DWORD), buff_len -1 ) )
  324. return FALSE;
  325. }
  326. *((DWORD*)(o_extend_data+Store_Keys_Map[index].Keys_offset)) = STORE_KEYS_HEADER;
  327. }
  328. //read message crc
  329. crc_data = crc32;
  330. if( !_uartRcvNBytes((BYTE*)&buff_CRC, 4) )
  331. return FALSE;
  332. _switch_dword(&buff_CRC);
  333. if( buff_CRC == crc_data )
  334. return TRUE;
  335. else
  336. tr_printf(("CRC error! The correct CRC code is 0x%08lx, current CRC code is 0x%08lxn",crc_data,buff_CRC));
  337. }
  338. return FALSE;
  339. }
  340. BOOL _send_message(WORD i_type, WORD i_length, BYTE *i_data)
  341. {
  342. WORD length=i_length;
  343. DWORD crc_data;
  344. crc32=0;
  345. tr_printf(("SEND:    message: 0x%04x length: 0x%04x n",i_type,i_length));
  346. //if( _uartIsTxReady() )
  347. {
  348. //send start code
  349. _uartSndNBytes((BYTE*)&Start_Code, START_CODE_LENGHT);
  350. //if(1) //start code
  351. {
  352. _switch_word(&i_type);
  353. _uartSndNBytes((BYTE*)&i_type, 2);
  354. _switch_word(&i_length);
  355. _uartSndNBytes((BYTE*)&i_length, 2);
  356. _uartSndNBytes((BYTE*)i_data, length);
  357. crc_data = crc32;
  358. _switch_dword(&crc_data);
  359. _uartSndNBytes((BYTE*)&crc_data, 4);
  360. return TRUE;
  361. }
  362. }
  363. return FALSE;
  364. }
  365. void Check_Uart_Rx(UINT8 hTimer)
  366. {
  367. WORD message_type,message_length;
  368. int i;
  369. BYTE buff[4];
  370. DWORD CRC;
  371. UINT16 srValue;
  372. static BOOL b_received_release_msg=FALSE;
  373. BOOL first_message = TRUE;
  374. #ifndef STORE_KEYS_IN_FLASH
  375. DWORD header;
  376. #endif
  377. b_disable_interrupt = FALSE;
  378. if( _uartIsRxReady() && !b_received_release_msg )
  379. {
  380. if( !b_disable_interrupt )
  381. srValue = disable_interrupt();
  382. tr_printf(("Begin debuging mode!n"));
  383. _uartRcvNBytes(buff,1);
  384. while(1)
  385. {
  386. while (!_uartIsRxReady());
  387. //receive HDCP keys
  388. if( !_receive_message( &message_type, &message_length, buff, new_keys) )
  389. {
  390. tr_printf(("Error: The message hasn't beem received.n"));
  391. //resume_interrupt(srValue);
  392. //return;
  393. message_type = MESSAGE_ACKNOWLEDGE_ERROR;
  394. //continue;
  395. }
  396. else
  397. tr_printf(("RECEIVE: message: 0x%04x length: 0x%04x n",message_type,message_length));
  398. if( first_message && message_type != MESSAGE_PING )
  399. {
  400. while (1)
  401. {
  402. *buff =_uartRcvByte();
  403. if(timeout)
  404. {
  405. timeout = 0;
  406. break;
  407. }
  408. }
  409. resume_interrupt(srValue);
  410. return;
  411. }
  412. else
  413. first_message = FALSE;
  414. //check key available
  415. switch(message_type)
  416. {
  417. case MESSAGE_PING:
  418. //acknowledge
  419. message_type = MESSAGE_ACKNOWLEDGE_PING;
  420. message_length = Store_Keys_Num;
  421. for( i=0; i<message_length; i++)
  422. {
  423. buff[i] = Store_Keys_Map[i].Keys_type;
  424. #ifdef STORE_KEYS_IN_FLASH
  425. if( *((DWORD*)Store_Keys_Map[i].Keys_store_address) == STORE_KEYS_HEADER )
  426. #else
  427. if( eeprom_read((WORD)Store_Keys_Map[i].Keys_store_address,(BYTE*)&header, sizeof(DWORD) )
  428. && header == STORE_KEYS_HEADER )
  429. #endif
  430. buff[i] |= KEY_IS_DOWNLOADED;
  431. }
  432. _send_message(message_type, message_length, buff);
  433. break;
  434. case MESSAGE_RELEASE_DEVICE:
  435. //acknowledge
  436. message_type = MESSAGE_ACKNOWLEDGE_RELEASE_DEVICE;
  437. message_length = 0;
  438. b_received_release_msg= TRUE;
  439. _send_message(message_type, message_length, buff);
  440. resume_interrupt(srValue);
  441. return;
  442. case MESSAGE_KEY_DOWNLOAD:
  443. message_type = MESSAGE_ACKNOWLEDGE_KEY_DOWNLOAD;
  444. message_length = 1;
  445. //save other keys to the new_keys memory
  446. for(i=0; i<Store_Keys_Num; i++)
  447. {
  448. if( buff[0] != Store_Keys_Map[i].Keys_type)
  449. #ifdef STORE_KEYS_IN_FLASH
  450. memcpy(new_keys+Store_Keys_Map[i].Keys_offset, (BYTE*)Store_Keys_Map[i].Keys_store_address, Store_Keys_Map[i].Keys_length);
  451. #else
  452. eeprom_read((WORD)Store_Keys_Map[i].Keys_store_address, new_keys+Store_Keys_Map[i].Keys_offset, Store_Keys_Map[i].Keys_length);
  453. #endif
  454. }
  455. for(i=0;i<STORE_KEYS_END_OFFSET;i++)
  456. {
  457. if( i%16 == 0 )
  458. tr_printf(("n"));
  459. tr_printf(("%02x ",new_keys[i]));
  460. }
  461. tr_printf(("n"));
  462. if( Store_Keys_Save(new_keys) )
  463. buff[0] = 0x00;
  464. else
  465. buff[0] = 0x01;
  466. _send_message(message_type, message_length, buff);
  467. break;
  468. /* case MESSAGE_KEY_UPLOAD:
  469. message_type = MESSAGE_ACKNOWLEDGE_KEY_UPLOAD;
  470. for(i=0; i<Store_Keys_Num; i++)
  471. {
  472. if( buff[0] == Store_Keys_Map[i].Keys_type)
  473. break;
  474. }
  475. if( i == Store_Keys_Num )
  476. {
  477. buff[0] = 0x01;//fail: this key isn't exist
  478. }
  479. message_length = Store_Keys_Map[i].Keys_length - sizeof(DWORD) +1;
  480. *new_keys = Store_Keys_Map[i].Keys_type;
  481. memcpy(new_keys+1, (BYTE*)Store_Keys_Map[i].Keys_store_address, message_length-1);
  482. _send_message(message_type, message_length, new_keys);
  483. break;
  484. */
  485. case MESSAGE_KEY_DELETE:
  486. message_type = MESSAGE_ACKNOWLEDGE_KEY_DELETE;
  487. message_length = 1;
  488. for(i=0; i<Store_Keys_Num; i++)
  489. {
  490. if( buff[0] == Store_Keys_Map[i].Keys_type)
  491. break;
  492. }
  493. if( i == Store_Keys_Num )
  494. {
  495. tr_printf(("Error: This key isn't support.n"));
  496. buff[0] = 0x01;
  497. }
  498. #ifdef STORE_KEYS_IN_FLASH
  499. else if( *((DWORD*)Store_Keys_Map[i].Keys_store_address) != STORE_KEYS_HEADER )
  500. #else
  501. else if( eeprom_read((WORD)Store_Keys_Map[i].Keys_store_address,(BYTE*)&header, sizeof(DWORD) )
  502. && header != STORE_KEYS_HEADER )
  503. #endif
  504. {
  505. tr_printf(("Error: This key isn't exist.n"));
  506. buff[0] = 0x01;
  507. }
  508. else
  509. {
  510. for(i=0; i<Store_Keys_Num; i++)
  511. {
  512. if( buff[0] != Store_Keys_Map[i].Keys_type)
  513. #ifdef STORE_KEYS_IN_FLASH
  514. memcpy(new_keys+Store_Keys_Map[i].Keys_offset, (BYTE*)Store_Keys_Map[i].Keys_store_address, Store_Keys_Map[i].Keys_length);
  515. #else
  516. eeprom_read(Store_Keys_Map[i].Keys_store_address, new_keys+Store_Keys_Map[i].Keys_offset, Store_Keys_Map[i].Keys_length);
  517. #endif
  518. else
  519. memset(new_keys+Store_Keys_Map[i].Keys_offset,0,Store_Keys_Map[i].Keys_length);
  520. }
  521. if( Store_Keys_Save(new_keys) )
  522. buff[0] = 0x00;
  523. else
  524. buff[0] = 0x01;
  525. }
  526. _send_message(message_type, message_length, buff);
  527. break;
  528. case MESSAGE_ACKNOWLEDGE_ERROR:
  529. while (1)
  530. {
  531. *buff =_uartRcvByte();
  532. if(timeout)
  533. {
  534. timeout = 0;
  535. break;
  536. }
  537. }
  538. message_type = MESSAGE_ACKNOWLEDGE_ERROR;
  539. message_length = 0;
  540. _send_message(message_type, message_length, buff);
  541. resume_interrupt(srValue);
  542. return;
  543. default:
  544. tr_printf(("Error: Message type is unknown.n"));
  545. message_type = MESSAGE_ACKNOWLEDGE_ERROR;
  546. message_length = 0;
  547. _send_message(message_type, message_length, buff);
  548. resume_interrupt(srValue);
  549. break;
  550. }
  551. }
  552. }
  553. return;
  554. }
  555. #endif //SUPPORT_KEYS_UPDATE