Exemple #1
0
/* 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;
}
Exemple #2
0
/* data interface speed reset function, enable EP's speed-specific descriptor */
void USB_Acm_DataIf_Speed_Reset(kal_bool b_other_speed)
{
#ifdef USB_20_ENABLE
	if(USB_Is_High_Speed() == KAL_TRUE)
	{
		if(b_other_speed == KAL_FALSE)
		{
			g_UsbACM.data_ep_in_info->epdesc.stdep.wMaxPacketSize[0] = USB_EP_BULK_MAXP_HS&0xff;
			g_UsbACM.data_ep_in_info->epdesc.stdep.wMaxPacketSize[1] = (USB_EP_BULK_MAXP_HS>>8)&0xff;
			g_UsbACM.data_ep_out_info->epdesc.stdep.wMaxPacketSize[0] = USB_EP_BULK_MAXP_HS&0xff;
			g_UsbACM.data_ep_out_info->epdesc.stdep.wMaxPacketSize[1] = (USB_EP_BULK_MAXP_HS>>8)&0xff;
		}
		else
		{
Exemple #3
0
/************************************************************
	Bulk EP OUT handle functions (clear rx fifo data, read them out and drop)
*************************************************************/
void USB_Acm_Rx_ClrFifo(void)
{
	kal_uint32        nCount;
#ifdef USB_20_ENABLE
	kal_uint32	max_bulk_pkt_size;
	kal_uint8         data[USB_EP_BULK_MAXP_HS];
#else
	kal_uint8         data[USB_EP_BULK_MAXP];
#endif
	
	/* check if data received */
	nCount = USB_EP_Rx_Pkt_Len(g_UsbACM.rxpipe->byEP);

#ifdef USB_20_ENABLE	
	if(USB_Is_High_Speed() == KAL_TRUE)
		max_bulk_pkt_size = USB_EP_BULK_MAXP_HS;
	else
		max_bulk_pkt_size = USB_EP_BULK_MAXP_FS;

	#ifdef  __PRODUCTION_RELEASE__	
	if(nCount > max_bulk_pkt_size)
	{
		nCount = max_bulk_pkt_size;
	}
	#else
	EXT_ASSERT((nCount <= max_bulk_pkt_size), nCount, max_bulk_pkt_size, 0);
	#endif
#else  /* USB_20_ENABLE */
	#ifdef  __PRODUCTION_RELEASE__	
	if(nCount > USB_EP_BULK_MAXP)
	{
		nCount = USB_EP_BULK_MAXP;
	}
	#else
	EXT_ASSERT((nCount <= USB_EP_BULK_MAXP), nCount, USB_EP_BULK_MAXP, 0);
	#endif
#endif  /* USB_20_ENABLE */


	if(nCount>0)
	{
		/* get the data from fifo */
		USB_EPFIFORead(g_UsbACM.rxpipe->byEP, nCount, data);

		/* Clear RxPktRdy */
		USB_EP_Bulk_Rx_Ready(g_UsbACM.rxpipe->byEP);
	}
}
Exemple #4
0
/* 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;
}
Exemple #5
0
static void USB2UART_CtrlDCD(UART_PORT port, IO_level SDCD, module_type ownerid)
{
    kal_uint32 savedMask;
    kal_bool  b_set_intr;
    kal_uint8  ep_num = 0;
#ifdef USB_20_ENABLE
    kal_uint32 max_intr_pkt_size;
#endif


#ifndef  __PRODUCTION_RELEASE__
    USB_Dbg_Trace(USB_ACM_SEND_INTERRUPT, drv_get_current_time(), g_UsbACM.intr_state, 0);

    if(ownerid != USB2UARTPort.ownerid)
    {
        EXT_ASSERT( 0, (kal_uint32) ownerid, USB2UARTPort.ownerid, 0);
    }
#endif

    savedMask = SaveAndSetIRQMask();
    if((g_UsbACM.intr_state == ACM_INTR_IDLE)&&(gUsbDevice.is_configured_now == KAL_TRUE))
    {
        b_set_intr = KAL_TRUE;
        g_UsbACM.is_intr_pending_pkt = KAL_FALSE;
        ep_num = g_UsbACM.intrpipe->byEP;
    }
    else
    {
        b_set_intr = KAL_FALSE;
        g_UsbACM.is_intr_pending_pkt = KAL_TRUE;
    }

    if(SDCD == io_high)
        g_UsbACM.intr_pkt.Data = SERIAL_STATE_BRXCARRIER;
    else if (SDCD == io_low)
        g_UsbACM.intr_pkt.Data = 0x00;
    else
        ASSERT(0);
    RestoreIRQMask(savedMask);

    if(b_set_intr == KAL_TRUE)
    {
#ifdef USB_20_ENABLE
        if(USB_Is_High_Speed() == KAL_TRUE)
            max_intr_pkt_size = USB_EP_INTR_MAXP_HS;
        else
            max_intr_pkt_size = USB_EP_INTR_MAXP_FS;

        if(max_intr_pkt_size > sizeof(UsbAcm_Intr_Pkt))
#else
        if(USB_EP_INTR_MAXP > sizeof(UsbAcm_Intr_Pkt))
#endif
        {
            g_UsbACM.intr_state = ACM_INTR_SEND_LAST_PKT;

#ifndef  __PRODUCTION_RELEASE__
            /* send only one short packet */
            USB_Dbg_Trace(USB_ACM_SEND_INTERRUPT2, drv_get_current_time(), g_UsbACM.intr_state, 0);
            drv_trace1(TRACE_FUNC, USBACM_INTR, g_UsbACM.intr_pkt.Data);
//			kal_prompt_trace(MOD_USB, "ACM INTR %d", g_UsbACM.intr_pkt.Data);
#endif
            USB_EPFIFOWrite(ep_num, sizeof(UsbAcm_Intr_Pkt), (kal_uint8 *)&g_UsbACM.intr_pkt);
            USB_EP_Bulk_Tx_Ready(ep_num);
        }
        else
        {
            g_UsbACM.intr_state = ACM_INTR_SEND_ONE_PKT;

#ifndef  __PRODUCTION_RELEASE__
            /* send one max packet */
            USB_Dbg_Trace(USB_ACM_SEND_INTERRUPT1, drv_get_current_time(), g_UsbACM.intr_state, 0);
            drv_trace1(TRACE_FUNC, USBACM_INTR, g_UsbACM.intr_pkt.Data);
//			kal_prompt_trace(MOD_USB, "ACM INTR %d", g_UsbACM.intr_pkt.Data);
#endif
#ifdef USB_20_ENABLE
            USB_EPFIFOWrite(ep_num, max_intr_pkt_size, (kal_uint8 *)&g_UsbACM.intr_pkt);
#else
            USB_EPFIFOWrite(ep_num, USB_EP_INTR_MAXP, (kal_uint8 *)&g_UsbACM.intr_pkt);
#endif
            USB_EP_Bulk_Tx_Ready(ep_num);
        }
    }
}