⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_serial.c

📁 Atmel公司的AT91 ARM7平台上的串口驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
						   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 + -