📄 drv_serial.c
字号:
serial_buf[in_rcv_ptr++] = poll_addr;//save the slot addr in the end of msg
inc_rcv_ptr(in_rcv_ptr);
if(poll_addr==slot_no)
{
seize_bus;
if( serial_buf[xmt_out_ptr]) /* send data to master*/
{
enable_tx;
put_char(USART_pt, slot_no);
xmt_length = serial_buf[xmt_out_ptr] + 4;
state = STATE_XMT_MSG;
}
else /* send board type and its complement to master*/
{
enable_tx;
put_char(USART_pt, BOARD_TYPE);
state = STATE_XMT_BOARD;
}
}
else
disable_rcv;
}
break;
case STATE_WAIT_ACK:
if( ch == ACK)
{
serial_buf[xmt_out_ptr] = 0; /* clear length to indicate that buffer is no longer valid to send*/
inc_xmt_ptr(xmt_out_ptr);
release_bus;
state = STATE_IDLE;
disable_rcv; /* disable 8 bits interrupt */
}
else
{
xmt_length = serial_buf[xmt_out_ptr] + 3;
enable_tx;
put_char(USART_pt, serial_buf[xmt_out_ptr++]);
state = STATE_XMT_MSG;
}
break;
case STATE_XMT_BOARD:
case STATE_XMT_1STBOARD:
case STATE_XMT_2NDBOARD:
case STATE_XMT_SLOT:
break;
case STATE_XMT_NACK:
break;
case STATE_XMT_MSG:
if(NACK == ch)
{
enable_tx;
put_char(USART_pt, slot_no);
reset_xmt_ptr(xmt_out_ptr);
xmt_length = serial_buf[xmt_out_ptr] + 3;
state = STATE_XMT_MSG;
}
break;
default:
state = STATE_IDLE;
disable_rcv; /* disable 8 bits interrupt */
break;
}
}
/*only receive own message*/
else
{
switch(state)
{
case STATE_IDLE:
break;
case STATE_RCV_SLOT:
if( ch == slot_no)
state = STATE_RCV_LENGTH;
else
{
disable_rcv;
state = STATE_IDLE;
}
break;
case STATE_RCV_LENGTH:
comm_cnt=0;
if( ch == 0)
{
seize_bus;
if( serial_buf[xmt_out_ptr] ) /* send data to master*/
{
enable_tx;
put_char(USART_pt, slot_no);
xmt_length = serial_buf[xmt_out_ptr] + 4;
state = STATE_XMT_MSG;
}
else /* send board type only to master*/
{
enable_tx;
put_char(USART_pt, BOARD_TYPE);
state = STATE_XMT_BOARD;
}
}
else
if (ch == 0xff) /*send board type and its complement to master*/
{
seize_bus;
enable_tx;
put_char(USART_pt, BOARD_TYPE);
state = STATE_XMT_1STBOARD; /*enable transmission*/
disable_rcv;
}
else /* normal data packet from master*/
{
if(ch >= RCV_BUF )
{
err_count++;
}
else
if(received == RCV_QUE) /* need more considerations */
{
rcv_full++;
reset_rcv_ptr(in_rcv_ptr);
disable_rcv;
}
else
{
rcv_length = ch;
checksum = 00;
serial_buf[in_rcv_ptr++] = ch;
state = STATE_RCV_DATA;
}
}
break;
case STATE_RCV_DATA:
serial_buf[in_rcv_ptr++] = ch;
checksum += ch;
if( --rcv_length == 0) state = STATE_RCV_1STCHECK;
break;
case STATE_RCV_1STCHECK:
if( ch == checksum)
state = STATE_RCV_2NDCHECK;
else
{
seize_bus;
disable_rcv;
enable_tx;
put_char(USART_pt, NACK);
reset_rcv_ptr(in_rcv_ptr);
state = STATE_XMT_NACK;
nack_sent++;
}
break;
case STATE_RCV_2NDCHECK:
if( (ch&checksum))
{
seize_bus;
disable_rcv;
enable_tx;
put_char(USART_pt, NACK);
reset_rcv_ptr(in_rcv_ptr);
state = STATE_XMT_NACK;
nack_sent++;
}
else /* checksum correct */
{
l2_received++;
if(received < RCV_QUE)
received ++;
else
rcv_full++;
serial_buf[in_rcv_ptr++] = slot_no;//save the slot addr in the end of msg
inc_rcv_ptr(in_rcv_ptr);
seize_bus;
if( serial_buf[xmt_out_ptr]) /* send data to master*/
{
enable_tx;
put_char(USART_pt, slot_no);
xmt_length = serial_buf[xmt_out_ptr] + 4;
state = STATE_XMT_MSG;
}
else /* send board type and its complement to master*/
{
enable_tx;
put_char(USART_pt, BOARD_TYPE);
state = STATE_XMT_BOARD;
}
}
break;
case STATE_WAIT_ACK:
if( ch == ACK)
{
serial_buf[xmt_out_ptr] = 0; /* clear length to indicate that buffer is no longer valid to send*/
inc_xmt_ptr(xmt_out_ptr);
release_bus;
state = STATE_IDLE;
disable_rcv; /* disable 8 bits interrupt */
}
else
{
xmt_length = serial_buf[xmt_out_ptr] + 3;
enable_tx;
put_char(USART_pt, serial_buf[xmt_out_ptr++]);
state = STATE_XMT_MSG;
}
break;
case STATE_XMT_BOARD:
case STATE_XMT_1STBOARD:
case STATE_XMT_2NDBOARD:
case STATE_XMT_SLOT:
break;
case STATE_XMT_NACK:
break;
case STATE_XMT_MSG:
if(NACK == ch)
{
enable_tx;
put_char(USART_pt, slot_no);
reset_xmt_ptr(xmt_out_ptr);
xmt_length = serial_buf[xmt_out_ptr] + 3;
state = STATE_XMT_MSG;
}
break;
default:
state = STATE_IDLE;
disable_rcv; /* disable 8 bits interrupt */
break;
}
}
}/*end of if (RI)*/
else if((status & AT91C_US_TXEMPTY) && tx_enable)
{
switch(state)
{
case STATE_XMT_BOARD:
state = STATE_IDLE;
disable_rcv;
release_bus;
disable_tx;
break;
case STATE_XMT_1STBOARD:
put_char(USART_pt, (INT8)~(BOARD_TYPE));
state = STATE_XMT_2NDBOARD;
break;
case STATE_XMT_2NDBOARD:
state = STATE_IDLE;
release_bus;
disable_rcv;
disable_tx;
break;
case STATE_XMT_SLOT: /*send message packet */
disable_tx;
break;
case STATE_XMT_MSG: /*send message packet */
put_char(USART_pt, serial_buf[xmt_out_ptr]);
if(--xmt_length == 0)
{
reset_xmt_ptr(xmt_out_ptr);
state = STATE_WAIT_ACK;
}
else
xmt_out_ptr++;
break;
case STATE_XMT_NACK:
state = STATE_IDLE;
release_bus;
disable_rcv;
disable_tx;
break;
case STATE_WAIT_ACK:
release_bus;
disable_tx;
break;
default:
release_bus;
disable_tx;
break;
}/* end of switch */
}/* end of if(TI) */
//* Reset the satus bit
USART_pt->US_CR = AT91C_US_RSTSTA;
USART_pt->US_CSR = 0;
}
/****************************************************************************
**
** Function Name: response_NACK_dwnl_inq, response_ACK_dwnl_inq
**
** Description:
** Download inquire NACK response from FW to HIP, two bytes message
**
** Argument Type IO Description
** --------------- -------- -- ---------------------------------
** dwnl_obj UINT8 I
**
** Return Value: N/A
**
****************************************************************************/
void response_NACK_dwnl_inq(void)
{
UINT8 tmp[10];
tmp[0] = DL_INQ_NRES;
tmp[1] = 0x02;
dispatch_to_serial(2, tmp);
#ifdef DEBUG
usart_print(DBG_PORT_ID,"response_NACK_dwnl_inq\n");
#endif
return;
}
/****************************************************************************
**
** Function Name: response_NACK_dwnl_inq, response_ACK_dwnl_inq
**
** Description:
** Download inquire ACK response from FW to HIP, two bytes message
**
** Argument Type IO Description
** --------------- -------- -- ---------------------------------
** board_type UINT8 I
**
** Return Value: N/A
**
****************************************************************************/
void response_ACK_dwnl_inq(void)
{
UINT8 tmp[10];
tmp[0] = DL_INQ_RES;
tmp[1] = DNLD_VER_TYPE;
dispatch_to_serial(2, tmp);
#ifdef DEBUG
usart_print(DBG_PORT_ID,"response_ACK_dwnl_inq\n");
#endif
return;
}
/****************************************************************************
**
** Function Name: response_NACK_dwnl_cmd
**
** Description:
** Download command NACK response from FW to HIP, multi bytes message
**
** Argument Type IO Description
** --------------- -------- -- ---------------------------------
** dwnl_obj UINT8 I
** sequence_num UINT8 I block sequence number
**
** Return Value: N/A
**
****************************************************************************/
void response_NACK_dwnl_cmd(UINT16 seq_num)
{
UINT8 tmp[10];
tmp[0] = DL_NACK;
tmp[1] = seq_num;
dispatch_to_serial(2, tmp);
#ifdef DEBUG
usart_print(DBG_PORT_ID,"response_NACK_dwnl_cmd, sequence num: ");
usart_print(DBG_PORT_ID,byte2decstr(tmp[1]));
usart_print(DBG_PORT_ID,"\n");
#endif
return;
}
/****************************************************************************
**
** Function Name: response_ACK_dwnl_cmd
**
** Description:
** Download command ACK response from FW to HIP, multi bytes message
**
** Argument Type IO Description
** --------------- -------- -- ---------------------------------
** dwnl_obj UINT8 I
** seq_num UINT8 I block sequence number
** rcv_status INT16
** Return Value: N/A
**
****************************************************************************/
void response_ACK_dwnl_cmd(UINT16 seq_num)
{
UINT8 tmp[10];
tmp[0] = DL_ACK;
tmp[1] = seq_num;
dispatch_to_serial(2, tmp);
#ifdef DEBUG
usart_print(DBG_PORT_ID,"response_ACK_dwnl_cmd, sequence num: ");
usart_print(DBG_PORT_ID,byte2decstr(tmp[1]));
usart_print(DBG_PORT_ID,"\n");
#endif
return;
}
/****************************************************************************
**
** Function Name: serial_process_dwnl_cmd
**
** Description:
** process download command from hip
**
** Argument Type IO Description
** --------------- -------- -- ---------------------------------
** ptr UINT8* I Receive data buffer pointer
**
** Return Value: N/A
**
****************************************************************************/
void serial_process_dwnl_cmd (UINT8 cmd, UINT8 *ptr)
{
UINT8 *dataptr;
UINT16 start_addr;
UINT8 packet_size;
UINT8 total_seq;
UINT16 tmp;
UINT32 ret;
UINT8 * boot_ver_ptr = (UINT8 *)BOOT_VERSION;
UINT8 i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -