uint8 uart_rb_pop(void) { BUFFER_INFO *puart_rb_info = &uart_rb_info; uint8 ch; Buf_Pop(puart_rb_info, ch); return ch; }
/* This function is only used for retrive exception log*/ static kal_uint8 USB2UART_GetUARTByte(UART_PORT port) { kal_uint32 real_count = 0; kal_uint32 RoomLeft = 0; kal_uint8 data; /* This function can only be called after exception*/ if(INT_Exception_Enter == 0) ASSERT(0); if ((gUsbDevice.device_type != USB_CDC_ACM)||(USB2UARTPort.initialized == KAL_FALSE)) { /* This function should only be called when assertion, if not CDC_ACM type, trap in while loop*/ while(1); } Buf_GetBytesAvail(&(USB2UARTPort.Rx_Buffer),real_count); while(real_count==0) { /* polling received data*/ USB2UART_Polling_Recv_Data(); Buf_GetBytesAvail(&(USB2UARTPort.Rx_Buffer),real_count); } Buf_Pop(&(USB2UARTPort.Rx_Buffer),data); /* one byte at a time */ /* set unmask flag if room left is larger than USB_EP_BULK_MAXP */ Buf_GetRoomLeft(&(USB2UARTPort.Rx_Buffer),RoomLeft); /* only unmask IRQ if ring buffer romm left >= MAX BULK PKt SIZE */ #ifdef USB_20_ENABLE if(USB_Is_High_Speed() == KAL_TRUE) { if(RoomLeft >= USB_EP_BULK_MAXP_HS) { USB_Set_UnMask_Irq(KAL_TRUE); } } else { if(RoomLeft >= USB_EP_BULK_MAXP_FS) { USB_Set_UnMask_Irq(KAL_TRUE); } } #else if(RoomLeft >= USB_EP_BULK_MAXP) { USB_Set_UnMask_Irq(KAL_TRUE); } #endif return data; }
/********************************************************************************************************* ** Function name: UART1_ISR ** Descriptions: 处理wifi消息 ** input parameters: 无 ** Output parameters:: 无 ** Returned value: 无 ** Created by: ** Created Date: 2014.10.03 **-------------------------------------------------------------------------------------------------------- ** Modified by: ** Modified date: 2014.10.03 **-------------------------------------------------------------------------------------------------------- *********************************************************************************************************/ void ProcessWifiMsg() { PKT_FIFO *infor; PKT_DESC *rx_desc = &(UART1Port.Rx_desc); BUFFER_INFO *rx_ring = &(UART1Port.Rx_Buffer); PKT_TYPE rxpkt_type; u16 rxpkt_len; u16 i; while (rx_desc->pkt_num) { //simulate FIFO,1st in,1st out infor = &(rx_desc->infor[0]); rxpkt_type = infor->pkt_type; rxpkt_len = infor->pkt_len; memset(pCmdWifiBuf, 0, UART1RX_RING_LEN); //copy from uart rx ring for(i = 0;i < rxpkt_len;i++) //O(n) { Buf_Pop(rx_ring,pCmdWifiBuf[i]); //AC_Printf("Buf_Pop=%x \n",pCmdBuf[i]); } //reset value infor->pkt_type = PKT_UNKNOWN; infor->pkt_len = 0; //shift FIFO for (i=0; i<(rx_desc->pkt_num)-1; i++) //O(n) { rx_desc->infor[i]= rx_desc->infor[i+1]; } rx_desc->pkt_num--; //handle previous packet switch (rxpkt_type) { case PKT_PUREDATA: AC_RecvMessage((AC_MessageHead*)(pCmdWifiBuf + 4)); break; default: break; } } }
/* * task context * fucntion: dispatch and handle packet from rx ring buffer */ void uart_rx_dispatch(void) { PKT_FIFO *infor; PKT_DESC *rx_desc = &(UARTPort.Rx_desc); BUFFER_INFO *rx_ring = &(UARTPort.Rx_Buffer); PKT_TYPE rxpkt_type; uint16 rxpkt_len; uint16 i; uint8 pCmdBuf[UARTRX_RING_LEN]; while (rx_desc->pkt_num) { //simulate FIFO,1st in,1st out infor = &(rx_desc->infor[0]); rxpkt_type = infor->pkt_type; rxpkt_len = infor->pkt_len; memset(pCmdBuf, 0, UARTRX_RING_LEN); //copy from uart rx ring for (i = 0; i < rxpkt_len; i++) { Buf_Pop(rx_ring, pCmdBuf[i]); } //reset value infor->pkt_type = PKT_UNKNOWN; infor->pkt_len = 0; //shift FIFO for (i=0; i<(rx_desc->pkt_num)-1; i++) { rx_desc->infor[i]= rx_desc->infor[i+1]; } rx_desc->pkt_num--; //handle previous packet switch (rxpkt_type) { case PKT_ATCMD: iot_atcmd_parser(pCmdBuf, rxpkt_len); break; case PKT_IWCMD: iot_iwcmd_parser(pCmdBuf, rxpkt_len); break; // <----custom defined packet dispatch default: break; } } }