/* 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; }
uint16 uart_get_avail(void) { BUFFER_INFO *puart_rb_info = &uart_rb_info; uint16 count; Buf_GetBytesAvail(puart_rb_info, count); return count; }
/* get available bytes in rx buffer */ static kal_uint16 USB2UART_GetRxAvail(UART_PORT port) { kal_uint16 real_count; kal_uint32 savedMask; savedMask = SaveAndSetIRQMask(); Buf_GetBytesAvail(&(USB2UARTPort.Rx_Buffer),real_count); RestoreIRQMask(savedMask); return real_count; }
/* get bytes from rx buffer, parameter status shows escape and break status return value is the actually get bytes */ static kal_uint16 USB2UART_GetBytes(UART_PORT port, kal_uint8 *buffaddr, kal_uint16 length, kal_uint8 *status, module_type ownerid) { kal_uint16 real_count; // kal_uint16 index; kal_uint16 RoomLeft; kal_uint32 savedMask; kal_uint32 error_count; kal_int32 remain; BUFFER_INFO *rx_info = &(USB2UARTPort.Rx_Buffer); if(ownerid != USB2UARTPort.ownerid) { #ifdef __PRODUCTION_RELEASE__ return 0; #else /* __PRODUCTION_RELEASE__ */ EXT_ASSERT( 0, (kal_uint32) ownerid, USB2UARTPort.ownerid, 0); #endif } /* return directly if not match condition */ if ( (gUsbDevice.device_type != USB_CDC_ACM) || (USB2UARTPort.initialized == KAL_FALSE) || (gUsbDevice.nDevState!=DEVSTATE_CONFIG)) return 0; /* determine real data count */ /* Note that the area to determine send_Rxilm must also contain in critical section. Otherwise if USB HISR activated before send_Rxilm setting as true, this message will be lost */ savedMask = SaveAndSetIRQMask(); Buf_GetBytesAvail(rx_info, real_count); if(real_count >= length) { real_count = length; } else { g_UsbACM.send_Rxilm = KAL_TRUE; /*After this time get byte, buffer will be empty */ } RestoreIRQMask(savedMask); #ifndef __PRODUCTION_RELEASE__ if(g_UsbACM.send_Rxilm == KAL_TRUE) { drv_trace1(TRACE_FUNC, USBACM_GET_BYTES_BUF_EMPTY, ownerid); // kal_prompt_trace(MOD_USB, "RDY R %d", ownerid); } #endif if(real_count != 0) { remain = (BRead(rx_info) + real_count) - BLength(rx_info); if(remain < 0) { /* dest, src, len */ kal_mem_cpy(buffaddr, BuffRead(rx_info), real_count); BRead(rx_info) += real_count; } else { kal_mem_cpy(buffaddr, BuffRead(rx_info), real_count-remain); kal_mem_cpy((kal_uint8 *)(buffaddr+real_count-remain), BStartAddr(rx_info), remain); BRead(rx_info) = remain; } } /* pop data from ring buffer to caller buffer */ /* for (index = 0; index < real_count; index++) { Buf_Pop(rx_info, *(buffaddr+index)); } */ /* update status */ if (status != NULL) { *status = 0; if (USB2UARTPort.EscFound) { *status |= UART_STAT_EscDet; USB2UARTPort.EscFound = KAL_FALSE; } if (USB2UARTPort.breakDet) { *status |= UART_STAT_Break; USB2UARTPort.breakDet = KAL_FALSE; } } IRQMask(IRQ_USB_CODE); Buf_GetRoomLeft(rx_info, RoomLeft); #ifdef USB_20_ENABLE /* only unmask IRQ if ring buffer room left >= MAX BULK PKT SIZE */ if((USB_Is_High_Speed() == KAL_TRUE)&&(RoomLeft >= USB_EP_BULK_MAXP_HS) ||(USB_Is_High_Speed() == KAL_FALSE)&&(RoomLeft >= USB_EP_BULK_MAXP_FS)) { error_count = USB_Get_HW_Error_Count(); if(error_count <= 8) { USB_Set_UnMask_Irq(KAL_TRUE); IRQUnmask(IRQ_USB_CODE); } else { drv_trace0(TRACE_FUNC, USBACM_FAIL_NOT_UNMASK); // kal_prompt_trace(MOD_USB, "UNMASK USB FAIL"); } } #else /* only unmask IRQ if ring buffer room left >= 64 */ if(RoomLeft >= USB_EP_BULK_MAXP) { error_count = USB_Get_HW_Error_Count(); if(error_count <= 8) { USB_Set_UnMask_Irq(KAL_TRUE); IRQUnmask(IRQ_USB_CODE); } else { drv_trace0(TRACE_FUNC, USBACM_FAIL_NOT_UNMASK); // kal_prompt_trace(MOD_USB, "UNMASK USB FAIL"); } } #endif #ifndef __PRODUCTION_RELEASE__ if(ownerid != USB2UARTPort.ownerid) { EXT_ASSERT( 0, (kal_uint32) ownerid, (kal_uint32)USB2UARTPort.ownerid, 0); } drv_trace1(TRACE_FUNC, USBACM_GET_BYTES, real_count); // kal_prompt_trace(MOD_USB, "Get %d", real_count); #endif /* __PRODUCTION_RELEASE__ */ return real_count; }