uart_api.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:19k
- /*****************************************************************************
- Copyright (c) 2000 ZORAN Corporation, All Rights Reserved
- THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
- File: "uart_api.c" 07/11/01
- Created by: Rinat Alfia rinata@zoran.co.il
- Description:
- Uart driver for UART 0 - use by Boot ROM only.
- *****************************************************************************/
- #include "config.h"
- #ifdef SUPPORT_KEYS_UPDATE
- /* Includes */
- #include "UARTStore_Keys.h"
- #include "Uartuart_api.h"
- #include "eeprom.h"
-
- /* Defines */
- //#define I49_IC
- //#ifdef I49_IC
- #define BAUDDIV 0xdc//0xb0 // 54000000/19200/16
- //#else
- //#error "Set baud rate for I64"
- //#endif
- #define UART_CON 0xff80U
- #define UART_BDIV 0xff88U
- #define UART_STS 0xff82U
- #define UART_TDATA 0xff84U
- #define UART_RDATA 0xff86U
- #define UART_RMODE1 0x0001 /* MODE bit 0 mask */
- #define UART_TMODE 0x0040 /* TMODE enable mask */
- #define UART_RMODE 0x0020 /* RMODE enable mask */
- #define TIME_OUT_LIMIT 0x7ffffUL
- static DWORD crc32;
- static BOOL timeout=FALSE;
- extern CONST BYTE Store_Keys_Num;
- extern CONST KEYS_STORE_STRUCT Store_Keys_Map[];
- extern BYTE* new_keys;
- #define START_CODE_LENGHT 12
- CONST BYTE Start_Code[START_CODE_LENGHT]={0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00};
- static CONST DWORD crc32_table[256] = {
- 0x00000000UL,0x77073096UL,0xee0e612cUL,0x990951baUL,0x076dc419UL,0x706af48fUL,0xe963a535UL,0x9e6495a3UL,
- 0x0edb8832UL,0x79dcb8a4UL,0xe0d5e91eUL,0x97d2d988UL,0x09b64c2bUL,0x7eb17cbdUL,0xe7b82d07UL,0x90bf1d91UL,
- 0x1db71064UL,0x6ab020f2UL,0xf3b97148UL,0x84be41deUL,0x1adad47dUL,0x6ddde4ebUL,0xf4d4b551UL,0x83d385c7UL,
- 0x136c9856UL,0x646ba8c0UL,0xfd62f97aUL,0x8a65c9ecUL,0x14015c4fUL,0x63066cd9UL,0xfa0f3d63UL,0x8d080df5UL,
- 0x3b6e20c8UL,0x4c69105eUL,0xd56041e4UL,0xa2677172UL,0x3c03e4d1UL,0x4b04d447UL,0xd20d85fdUL,0xa50ab56bUL,
- 0x35b5a8faUL,0x42b2986cUL,0xdbbbc9d6UL,0xacbcf940UL,0x32d86ce3UL,0x45df5c75UL,0xdcd60dcfUL,0xabd13d59UL,
- 0x26d930acUL,0x51de003aUL,0xc8d75180UL,0xbfd06116UL,0x21b4f4b5UL,0x56b3c423UL,0xcfba9599UL,0xb8bda50fUL,
- 0x2802b89eUL,0x5f058808UL,0xc60cd9b2UL,0xb10be924UL,0x2f6f7c87UL,0x58684c11UL,0xc1611dabUL,0xb6662d3dUL,
- 0x76dc4190UL,0x01db7106UL,0x98d220bcUL,0xefd5102aUL,0x71b18589UL,0x06b6b51fUL,0x9fbfe4a5UL,0xe8b8d433UL,
- 0x7807c9a2UL,0x0f00f934UL,0x9609a88eUL,0xe10e9818UL,0x7f6a0dbbUL,0x086d3d2dUL,0x91646c97UL,0xe6635c01UL,
- 0x6b6b51f4UL,0x1c6c6162UL,0x856530d8UL,0xf262004eUL,0x6c0695edUL,0x1b01a57bUL,0x8208f4c1UL,0xf50fc457UL,
- 0x65b0d9c6UL,0x12b7e950UL,0x8bbeb8eaUL,0xfcb9887cUL,0x62dd1ddfUL,0x15da2d49UL,0x8cd37cf3UL,0xfbd44c65UL,
- 0x4db26158UL,0x3ab551ceUL,0xa3bc0074UL,0xd4bb30e2UL,0x4adfa541UL,0x3dd895d7UL,0xa4d1c46dUL,0xd3d6f4fbUL,
- 0x4369e96aUL,0x346ed9fcUL,0xad678846UL,0xda60b8d0UL,0x44042d73UL,0x33031de5UL,0xaa0a4c5fUL,0xdd0d7cc9UL,
- 0x5005713cUL,0x270241aaUL,0xbe0b1010UL,0xc90c2086UL,0x5768b525UL,0x206f85b3UL,0xb966d409UL,0xce61e49fUL,
- 0x5edef90eUL,0x29d9c998UL,0xb0d09822UL,0xc7d7a8b4UL,0x59b33d17UL,0x2eb40d81UL,0xb7bd5c3bUL,0xc0ba6cadUL,
- 0xedb88320UL,0x9abfb3b6UL,0x03b6e20cUL,0x74b1d29aUL,0xead54739UL,0x9dd277afUL,0x04db2615UL,0x73dc1683UL,
- 0xe3630b12UL,0x94643b84UL,0x0d6d6a3eUL,0x7a6a5aa8UL,0xe40ecf0bUL,0x9309ff9dUL,0x0a00ae27UL,0x7d079eb1UL,
- 0xf00f9344UL,0x8708a3d2UL,0x1e01f268UL,0x6906c2feUL,0xf762575dUL,0x806567cbUL,0x196c3671UL,0x6e6b06e7UL,
- 0xfed41b76UL,0x89d32be0UL,0x10da7a5aUL,0x67dd4accUL,0xf9b9df6fUL,0x8ebeeff9UL,0x17b7be43UL,0x60b08ed5UL,
- 0xd6d6a3e8UL,0xa1d1937eUL,0x38d8c2c4UL,0x4fdff252UL,0xd1bb67f1UL,0xa6bc5767UL,0x3fb506ddUL,0x48b2364bUL,
- 0xd80d2bdaUL,0xaf0a1b4cUL,0x36034af6UL,0x41047a60UL,0xdf60efc3UL,0xa867df55UL,0x316e8eefUL,0x4669be79UL,
- 0xcb61b38cUL,0xbc66831aUL,0x256fd2a0UL,0x5268e236UL,0xcc0c7795UL,0xbb0b4703UL,0x220216b9UL,0x5505262fUL,
- 0xc5ba3bbeUL,0xb2bd0b28UL,0x2bb45a92UL,0x5cb36a04UL,0xc2d7ffa7UL,0xb5d0cf31UL,0x2cd99e8bUL,0x5bdeae1dUL,
- 0x9b64c2b0UL,0xec63f226UL,0x756aa39cUL,0x026d930aUL,0x9c0906a9UL,0xeb0e363fUL,0x72076785UL,0x05005713UL,
- 0x95bf4a82UL,0xe2b87a14UL,0x7bb12baeUL,0x0cb61b38UL,0x92d28e9bUL,0xe5d5be0dUL,0x7cdcefb7UL,0x0bdbdf21UL,
- 0x86d3d2d4UL,0xf1d4e242UL,0x68ddb3f8UL,0x1fda836eUL,0x81be16cdUL,0xf6b9265bUL,0x6fb077e1UL,0x18b74777UL,
- 0x88085ae6UL,0xff0f6a70UL,0x66063bcaUL,0x11010b5cUL,0x8f659effUL,0xf862ae69UL,0x616bffd3UL,0x166ccf45UL,
- 0xa00ae278UL,0xd70dd2eeUL,0x4e048354UL,0x3903b3c2UL,0xa7672661UL,0xd06016f7UL,0x4969474dUL,0x3e6e77dbUL,
- 0xaed16a4aUL,0xd9d65adcUL,0x40df0b66UL,0x37d83bf0UL,0xa9bcae53UL,0xdebb9ec5UL,0x47b2cf7fUL,0x30b5ffe9UL,
- 0xbdbdf21cUL,0xcabac28aUL,0x53b39330UL,0x24b4a3a6UL,0xbad03605UL,0xcdd70693UL,0x54de5729UL,0x23d967bfUL,
- 0xb3667a2eUL,0xc4614ab8UL,0x5d681b02UL,0x2a6f2b94UL,0xb40bbe37UL,0xc30c8ea1UL,0x5a05df1bUL,0x2d02ef8dUL
- };
- void _calculate_CRC(BYTE *data, int len)
- {
- unsigned long oldcrc32;
- unsigned long oldcrc;
- unsigned int charcnt;
- BYTE c,t;
-
- oldcrc32 = crc32; //
- charcnt=0;
- while (len--)
- {
- t= (BYTE)((oldcrc32 >> 24) & 0xFF);
- oldcrc=crc32_table[t];
- c=data[charcnt];
- oldcrc32= ((oldcrc32 << 8)&0xFFFFFF00) | (DWORD)c;
- oldcrc32^=oldcrc;
- charcnt++;
- }
- crc32=oldcrc32;
- return;
- }
- void _switch_word(WORD *data)
- {
- *data = (*data&0x00ff)<<8 | (*data&0xff00) >> 8;
- }
- void _switch_dword(DWORD *data)
- {
- *data = (*data&0xff)<<24 | (*data&0xff00)<<8 | (*data&0xff0000)>>8 | (*data&0xff000000)>>24;
- }
- /*---------------------------------------------------------------------------------
- Purpose : Initialization of UART 0
- Description : Set UART Control and UART baud rate div registers
- Input Parameters : none
- Return Value : none
- ---------------------------------------------------------------------------------*/
- void _uartOpen(void)
- {
- boot_outport( UART_CON, UART_RMODE1 | UART_TMODE | UART_RMODE ); // 8 bit word, 1 stop bit, no parity
- //#if defined(__JTAG__) || defined(__PDREMOTE__)
- // _uartBaudRate(0x50); // to debug on vautomation board
- //#else
- _uartBaudRate( BAUDDIV );
- //#endif
- }
- /*---------------------------------------------------------------------------------
- Purpose : Set UART baud rate
- Description : Set UART_BDIV register
- Input Parameters : baud_rate - the baud rate to set
- Return Value : void
- ---------------------------------------------------------------------------------*/
- void _uartBaudRate( unsigned int baud_rate )
- {
- while (!_uartIsTxReady()); // wait for tx ready to be set
- boot_outport(UART_BDIV, baud_rate);
- }
- /*---------------------------------------------------------------------------------
- Purpose : Return if TX is ready
- Description : Read UART_STS TX bit
- Input Parameters : none
- Return Value : TRUE - When TX is ready, else FLASE
- ---------------------------------------------------------------------------------*/
- BOOL _uartIsTxReady(void)
- {
- return (boot_inport(UART_STS) & 0x40) != 0; // is tx ready set
- }
- /*---------------------------------------------------------------------------------
- Purpose : Return if RX is ready
- Description : Read UART_STS RX bit
- Input Parameters : none
- Return Value : TRUE - When RX is ready, else FLASE
- ---------------------------------------------------------------------------------*/
- BOOL _uartIsRxReady(void)
- {
- return (boot_inport(UART_STS) & 0x80) != 0; // is rx ready set
- }
- /*---------------------------------------------------------------------------------
- Purpose : Send one byte through UART 0
- Description : Wait Tx ready and then write to TDATA register.
- Input Parameters : byte - the byte to send
- Return Value : void
- ---------------------------------------------------------------------------------*/
- void _uartSndByte( unsigned char byte)
- {
- while (!_uartIsTxReady()) ; // wait for tx ready to be set
- boot_outport(UART_TDATA, (int)byte);
- }
- /*---------------------------------------------------------------------------------
- Purpose : Get one byte through UART 0
- Description : Wait Rx ready and then read from RDATA register.
- Input Parameters : none
- Return Value : The read byte
- ---------------------------------------------------------------------------------*/
- unsigned char _uartRcvByte(void)
- {
- unsigned char c;
- DWORD times=0;
- while (!_uartIsRxReady())
- if( times++ > TIME_OUT_LIMIT)
- {
- timeout=TRUE;
- return 0;
- }
- c = (char)boot_inport(UART_RDATA);
- return c;
- }
- /*---------------------------------------------------------------------------------
- Purpose : Send N bytes through uart 0
- Description : Call _uartSndByte N times
- Input Parameters : buff - pointer to array of bytes to send
- N - number of bytes to send
- Return Value : none
- ---------------------------------------------------------------------------------*/
- void _uartSndNBytes(unsigned char *buff , int N )
- {
- while (N--)
- {
- _calculate_CRC(buff, 1);
- _uartSndByte(*buff++);
-
- }
- }
- /*---------------------------------------------------------------------------------
- Purpose : Recived N bytes through uart 0
- Description : Call _uartRcvByte N times
- Input Parameters : buff - pointer the recived buffer
- N - number of bytes to recived
- Return Value : none
- ---------------------------------------------------------------------------------*/
- BOOL _uartRcvNBytes( unsigned char *buff, int N)
- {
- //tr_printf(("_uartRcvNBytes(%d)n",N));
- while (N--)
- {
- *buff =_uartRcvByte();
- if(timeout)
- {
- tr_printf(("Receive data timeout!n"));
- timeout = 0;
- return FALSE;
- }
- tr_printf(("%02x ",*buff));
- _calculate_CRC(buff, 1);
- buff++;
- }
- tr_printf(("n"));
- return TRUE;
- }
- /*---------------------------------------------------------------------------------
- Purpose : out "data" register to "port" register
- Description : Implimentation in assembler
- Input Parameters : port - destination register
- data - source register
- Return Value : none
- ---------------------------------------------------------------------------------*/
- void boot_outport(unsigned int port, unsigned int data)
- {
- asm {
- mov dx, port;
- mov ax, data;
- out dx, ax;
- }
- }
- /*---------------------------------------------------------------------------------
- Purpose : Read from "port" register
- Description : Implimentation in assembler
- Input Parameters : port - destination register
- Return Value : return the read value
- ---------------------------------------------------------------------------------*/
- unsigned int boot_inport(unsigned int port)
- {
- asm {
- mov dx, port;
- in ax, dx;
- }
- return (_AX);
- }
- BOOL b_disable_interrupt = FALSE;
- UINT16 disable_interrupt (void)
- {
- asm
- {
- pushf
- pop ax
- cli
- }
- b_disable_interrupt = TRUE;
- return (_AX);
- }
- void resume_interrupt ( UINT16 sr )
- {
- if( !b_disable_interrupt )
- return;
- b_disable_interrupt = FALSE;
- asm
- {
- push sr
- popf
- }
- }
- BOOL _receive_message(WORD *o_type, WORD *o_length, BYTE *o_data, BYTE *o_extend_data)
- {
- WORD buff_len;
- BYTE buff_startcode[START_CODE_LENGHT];
- DWORD buff_CRC;
- DWORD crc_data;
- BYTE index;
- crc32 = 0;
- //read start code
- if( !_uartRcvNBytes((BYTE*)&buff_startcode, START_CODE_LENGHT) )
- return FALSE;
- //_switch_word(&buff);
- if( !memcmp(buff_startcode, Start_Code,START_CODE_LENGHT) )
- {
- //read message type
- if( !_uartRcvNBytes((BYTE*)o_type, 2) )
- return FALSE;
- _switch_word(o_type);
- //read message length
- if( !_uartRcvNBytes((BYTE*)o_length, 2) )
- return FALSE;
- _switch_word(o_length);
- buff_len = *o_length;
- //read message data
- if( *o_type != MESSAGE_KEY_DOWNLOAD )
- {
- if( !_uartRcvNBytes(o_data, buff_len) )
- return FALSE;
- }
- else
- {
- if( !_uartRcvNBytes(o_data, 1) )
- return FALSE;
- for(index=0; index<Store_Keys_Num; index++)
- {
- if( Store_Keys_Map[index].Keys_type == *o_data)
- break;
- }
- if(index == Store_Keys_Num)
- return FALSE;
- if( buff_len>MAX_MESSAGE_DATA_LENGTH )
- {
- tr_printf(("Error: Message data length is too long.n"));
- return FALSE;
- }
- 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 )
- {
- *(o_extend_data+Store_Keys_Map[index].Keys_offset+sizeof(DWORD)) = *o_data;
- if( !_uartRcvNBytes(o_extend_data+Store_Keys_Map[index].Keys_offset+sizeof(DWORD)+1, buff_len -1 ) )
- return FALSE;
- }
- else
- {
- if( !_uartRcvNBytes(o_extend_data+Store_Keys_Map[index].Keys_offset+sizeof(DWORD), buff_len -1 ) )
- return FALSE;
- }
- *((DWORD*)(o_extend_data+Store_Keys_Map[index].Keys_offset)) = STORE_KEYS_HEADER;
- }
- //read message crc
- crc_data = crc32;
- if( !_uartRcvNBytes((BYTE*)&buff_CRC, 4) )
- return FALSE;
- _switch_dword(&buff_CRC);
- if( buff_CRC == crc_data )
- return TRUE;
- else
- tr_printf(("CRC error! The correct CRC code is 0x%08lx, current CRC code is 0x%08lxn",crc_data,buff_CRC));
- }
- return FALSE;
- }
- BOOL _send_message(WORD i_type, WORD i_length, BYTE *i_data)
- {
- WORD length=i_length;
- DWORD crc_data;
- crc32=0;
- tr_printf(("SEND: message: 0x%04x length: 0x%04x n",i_type,i_length));
- //if( _uartIsTxReady() )
- {
- //send start code
-
- _uartSndNBytes((BYTE*)&Start_Code, START_CODE_LENGHT);
- //if(1) //start code
- {
- _switch_word(&i_type);
- _uartSndNBytes((BYTE*)&i_type, 2);
- _switch_word(&i_length);
- _uartSndNBytes((BYTE*)&i_length, 2);
- _uartSndNBytes((BYTE*)i_data, length);
- crc_data = crc32;
- _switch_dword(&crc_data);
- _uartSndNBytes((BYTE*)&crc_data, 4);
- return TRUE;
- }
- }
- return FALSE;
- }
- void Check_Uart_Rx(UINT8 hTimer)
- {
- WORD message_type,message_length;
- int i;
- BYTE buff[4];
- DWORD CRC;
- UINT16 srValue;
- static BOOL b_received_release_msg=FALSE;
- BOOL first_message = TRUE;
- #ifndef STORE_KEYS_IN_FLASH
- DWORD header;
- #endif
- b_disable_interrupt = FALSE;
- if( _uartIsRxReady() && !b_received_release_msg )
- {
- if( !b_disable_interrupt )
- srValue = disable_interrupt();
- tr_printf(("Begin debuging mode!n"));
- _uartRcvNBytes(buff,1);
- while(1)
- {
- while (!_uartIsRxReady());
- //receive HDCP keys
- if( !_receive_message( &message_type, &message_length, buff, new_keys) )
- {
- tr_printf(("Error: The message hasn't beem received.n"));
- //resume_interrupt(srValue);
- //return;
- message_type = MESSAGE_ACKNOWLEDGE_ERROR;
- //continue;
- }
- else
- tr_printf(("RECEIVE: message: 0x%04x length: 0x%04x n",message_type,message_length));
- if( first_message && message_type != MESSAGE_PING )
- {
- while (1)
- {
- *buff =_uartRcvByte();
- if(timeout)
- {
- timeout = 0;
- break;
- }
- }
- resume_interrupt(srValue);
- return;
- }
- else
- first_message = FALSE;
-
- //check key available
- switch(message_type)
- {
- case MESSAGE_PING:
- //acknowledge
-
- message_type = MESSAGE_ACKNOWLEDGE_PING;
- message_length = Store_Keys_Num;
- for( i=0; i<message_length; i++)
- {
- buff[i] = Store_Keys_Map[i].Keys_type;
- #ifdef STORE_KEYS_IN_FLASH
- if( *((DWORD*)Store_Keys_Map[i].Keys_store_address) == STORE_KEYS_HEADER )
- #else
- if( eeprom_read((WORD)Store_Keys_Map[i].Keys_store_address,(BYTE*)&header, sizeof(DWORD) )
- && header == STORE_KEYS_HEADER )
- #endif
- buff[i] |= KEY_IS_DOWNLOADED;
- }
- _send_message(message_type, message_length, buff);
- break;
-
- case MESSAGE_RELEASE_DEVICE:
- //acknowledge
- message_type = MESSAGE_ACKNOWLEDGE_RELEASE_DEVICE;
- message_length = 0;
- b_received_release_msg= TRUE;
- _send_message(message_type, message_length, buff);
- resume_interrupt(srValue);
- return;
-
- case MESSAGE_KEY_DOWNLOAD:
- message_type = MESSAGE_ACKNOWLEDGE_KEY_DOWNLOAD;
- message_length = 1;
- //save other keys to the new_keys memory
- for(i=0; i<Store_Keys_Num; i++)
- {
- if( buff[0] != Store_Keys_Map[i].Keys_type)
- #ifdef STORE_KEYS_IN_FLASH
- memcpy(new_keys+Store_Keys_Map[i].Keys_offset, (BYTE*)Store_Keys_Map[i].Keys_store_address, Store_Keys_Map[i].Keys_length);
- #else
- eeprom_read((WORD)Store_Keys_Map[i].Keys_store_address, new_keys+Store_Keys_Map[i].Keys_offset, Store_Keys_Map[i].Keys_length);
- #endif
- }
- for(i=0;i<STORE_KEYS_END_OFFSET;i++)
- {
- if( i%16 == 0 )
- tr_printf(("n"));
- tr_printf(("%02x ",new_keys[i]));
- }
- tr_printf(("n"));
- if( Store_Keys_Save(new_keys) )
- buff[0] = 0x00;
- else
- buff[0] = 0x01;
- _send_message(message_type, message_length, buff);
- break;
-
- /* case MESSAGE_KEY_UPLOAD:
- message_type = MESSAGE_ACKNOWLEDGE_KEY_UPLOAD;
- for(i=0; i<Store_Keys_Num; i++)
- {
- if( buff[0] == Store_Keys_Map[i].Keys_type)
- break;
- }
- if( i == Store_Keys_Num )
- {
- buff[0] = 0x01;//fail: this key isn't exist
- }
-
- message_length = Store_Keys_Map[i].Keys_length - sizeof(DWORD) +1;
- *new_keys = Store_Keys_Map[i].Keys_type;
- memcpy(new_keys+1, (BYTE*)Store_Keys_Map[i].Keys_store_address, message_length-1);
- _send_message(message_type, message_length, new_keys);
- break;
- */
- case MESSAGE_KEY_DELETE:
- message_type = MESSAGE_ACKNOWLEDGE_KEY_DELETE;
- message_length = 1;
- for(i=0; i<Store_Keys_Num; i++)
- {
- if( buff[0] == Store_Keys_Map[i].Keys_type)
- break;
- }
- if( i == Store_Keys_Num )
- {
- tr_printf(("Error: This key isn't support.n"));
- buff[0] = 0x01;
- }
- #ifdef STORE_KEYS_IN_FLASH
- else if( *((DWORD*)Store_Keys_Map[i].Keys_store_address) != STORE_KEYS_HEADER )
- #else
- else if( eeprom_read((WORD)Store_Keys_Map[i].Keys_store_address,(BYTE*)&header, sizeof(DWORD) )
- && header != STORE_KEYS_HEADER )
- #endif
- {
- tr_printf(("Error: This key isn't exist.n"));
- buff[0] = 0x01;
- }
- else
- {
- for(i=0; i<Store_Keys_Num; i++)
- {
- if( buff[0] != Store_Keys_Map[i].Keys_type)
- #ifdef STORE_KEYS_IN_FLASH
- memcpy(new_keys+Store_Keys_Map[i].Keys_offset, (BYTE*)Store_Keys_Map[i].Keys_store_address, Store_Keys_Map[i].Keys_length);
- #else
- eeprom_read(Store_Keys_Map[i].Keys_store_address, new_keys+Store_Keys_Map[i].Keys_offset, Store_Keys_Map[i].Keys_length);
- #endif
- else
- memset(new_keys+Store_Keys_Map[i].Keys_offset,0,Store_Keys_Map[i].Keys_length);
- }
-
- if( Store_Keys_Save(new_keys) )
- buff[0] = 0x00;
- else
- buff[0] = 0x01;
- }
- _send_message(message_type, message_length, buff);
- break;
-
- case MESSAGE_ACKNOWLEDGE_ERROR:
- while (1)
- {
- *buff =_uartRcvByte();
- if(timeout)
- {
- timeout = 0;
- break;
- }
- }
- message_type = MESSAGE_ACKNOWLEDGE_ERROR;
- message_length = 0;
- _send_message(message_type, message_length, buff);
- resume_interrupt(srValue);
- return;
- default:
- tr_printf(("Error: Message type is unknown.n"));
- message_type = MESSAGE_ACKNOWLEDGE_ERROR;
- message_length = 0;
- _send_message(message_type, message_length, buff);
- resume_interrupt(srValue);
- break;
- }
-
-
- }
- }
- return;
- }
- #endif //SUPPORT_KEYS_UPDATE