Example #1
0
PRIVATE VOID boot_UsbDecodeEp0Packet(VOID)
{
    HAL_USB_SETUP_T* setup = NULL;
    UINT16           size;
    UINT8            setup_completed = 0;

    switch(g_BootUsbVar.Ep0State)
    {
    case EP0_STATE_IDLE  :
        setup =
            (HAL_USB_SETUP_T*) HAL_SYS_GET_UNCACHED_ADDR(g_BootUsbBufferEp0Out);

        // Change endian less
        setup->value     = HAL_ENDIAN_LITTLE_16(setup->value );
        setup->index     = HAL_ENDIAN_LITTLE_16(setup->index );
        setup->lenght    = HAL_ENDIAN_LITTLE_16(setup->lenght);

        g_BootUsbVar.RequestDesc = setup->requestDesc;
        g_BootUsbVar.Ep0Index    = setup->index&0xff;

        if(setup->lenght == 0)
        {
            if(setup->requestDesc.requestDirection)
            {
                g_BootUsbVar.Ep0State = EP0_STATE_STATUS_OUT;
            }
            else
            {
                g_BootUsbVar.Ep0State = EP0_STATE_STATUS_IN;
            }
        }
        else
        {
            if(setup->requestDesc.requestDirection)
            {
                g_BootUsbVar.Ep0State = EP0_STATE_IN;
            }
            else
            {
                g_BootUsbVar.Ep0State = EP0_STATE_OUT;
            }
        }

        switch(setup->requestDesc.requestDest)
        {
        case BOOT_USB_REQUEST_DESTINATION_DEVICE:
            switch(setup->request)
            {
            case BOOT_USB_REQUEST_DEVICE_SETADDR:
                hwp_usbc->DCFG |= USBC_DEVADDR(setup->value);
                setup_completed = 1;
                break;
            case BOOT_USB_REQUEST_DEVICE_SETCONF:
                if(g_BootUsbVar.Desc == 0)
                {
                    break;
                }

                if((setup->value&0xFF)  <= g_BootUsbVar.NbConfig)
                {
                    setup_completed = 1;
                    boot_UsbSetConfig((setup->value&0xFF)-1);
                }
                break;
            case BOOT_USB_REQUEST_DEVICE_GETDESC:
                if(g_BootUsbVar.Desc == 0)
                {
                    break;
                }
                size = 0;
                switch(setup->value>>8)
                {
                case 1: /* Device */
                    boot_generateDescDevice(g_BootUsbVar.Desc,
                                            g_BootUsbBufferEp0In);
                    size = sizeof(BOOT_USB_DEVICE_DESCRIPTOR_REAL_T);
                    break;
                case 2: /* Config */
                    size = boot_generateDescConfig(
                        g_BootUsbVar.Desc->configList[(setup->value&0xFF)],
                        g_BootUsbBufferEp0In, (setup->value&0xFF)+1);
                    break;
                case 3: /* String */
                    if((setup->value&0xFF) == 0)
                    {
                        size                    = 0x04;
                        g_BootUsbBufferEp0In[0] = 0x04;
                        g_BootUsbBufferEp0In[1] = 0x03;
                        g_BootUsbBufferEp0In[2] = 0x09;
                        g_BootUsbBufferEp0In[3] = 0x04;
                    }
                    else
                    {
                        size = 0;
                        if((setup->value&0xFF) <= g_BootUsbVar.NbString)
                        {
                            size =
                                strlen(g_BootUsbVar.String[(setup->value&0xFF)-1])*2
                                + 2;
                            g_BootUsbBufferEp0In[0] = size;
                            g_BootUsbBufferEp0In[1] = 0x03;
                            boot_usbAsciiToUtf8(&g_BootUsbBufferEp0In[2],
                                               g_BootUsbVar.String
                                               [(setup->value&0xFF)-1]);
                        }
                    }
                    break;
                }
                if(setup->lenght < size)
                {
                    size = setup->lenght;
                }
                /* Data in */
                boot_UsbSend(0, g_BootUsbBufferEp0In, size, 0);
                setup_completed = 1;
                break;
            }
            break;
        case BOOT_USB_REQUEST_DESTINATION_INTERFACE:
            switch(boot_UsbCallbackInterface(setup->index&0xFF,
                                             HAL_USB_CALLBACK_TYPE_CMD, setup))
            {
            case HAL_USB_CALLBACK_RETURN_OK:
                setup_completed = 1;
                break;
            case HAL_USB_CALLBACK_RETURN_RUNNING:
                setup_completed = 2;
                break;
            case HAL_USB_CALLBACK_RETURN_KO:
                break;
            }
            break;
        case BOOT_USB_REQUEST_DESTINATION_EP:
            switch(setup->request)
            {
            case BOOT_USB_REQUEST_EP_GET_STATUS   :
                break;
            case BOOT_USB_REQUEST_EP_CLEAR_FEATURE:
                if(setup->value == 0 || setup->value & 0x01)
                {
                    boot_UsbEpStall(setup->index&0xFF, FALSE);
                }
                setup_completed = 1;
                break;
            case BOOT_USB_REQUEST_EP_SET_FEATURE  :
                break;
            default:
                break;
            }
            switch(boot_UsbCallbackEp(setup->index&0xFF,
                                      HAL_USB_CALLBACK_TYPE_CMD, setup))
            {
            case HAL_USB_CALLBACK_RETURN_OK:
                setup_completed = 1;
                break;
            case HAL_USB_CALLBACK_RETURN_RUNNING:
                setup_completed = 2;
                break;
            case HAL_USB_CALLBACK_RETURN_KO:
                break;
            }
            break;
        default:
            break;
        }
        if(setup_completed == 0 || setup_completed == 1)
        {
            if(setup->lenght == 0)
            {
                if(setup->requestDesc.requestDirection)
                {
                    boot_UsbStatusOut();
                }
                else
                {
                    boot_UsbStatusIn();
                }
            }
        }
        if(setup_completed == 0)
        {
            if(setup->lenght != 0)
            {
                if(setup->requestDesc.requestDirection)
                {
                    boot_UsbSend(0, g_BootUsbBufferEp0In, 0, 0);
                }
                else
                {
                    boot_UsbRecv(0, g_BootUsbBufferEp0Out, HAL_USB_MPS, 0);
                }
            }
        }
        break;
    case EP0_STATE_IN    :
        /* Transfert finish */
        if(boot_UsbContinueTransfert(HAL_USB_EP_DIRECTION_IN(0)))
        {
            switch(g_BootUsbVar.RequestDesc.requestDest)
            {
            case BOOT_USB_REQUEST_DESTINATION_DEVICE:
                break;
            case BOOT_USB_REQUEST_DESTINATION_INTERFACE:
                boot_UsbCallbackInterface(g_BootUsbVar.Ep0Index&0xFF,
                                          HAL_USB_CALLBACK_TYPE_DATA_CMD,
                                          setup);
                break;
            case BOOT_USB_REQUEST_DESTINATION_EP:
                boot_UsbCallbackEp(setup->index&0xFF,
                                   HAL_USB_CALLBACK_TYPE_CMD, setup);
                break;
            }
            boot_UsbStatusOut();
        }
        break;
    case EP0_STATE_OUT   :
        /* Transfert finish */
        if(boot_UsbContinueTransfert(HAL_USB_EP_DIRECTION_OUT(0)))
        {
            switch(g_BootUsbVar.RequestDesc.requestDest)
            {
            case BOOT_USB_REQUEST_DESTINATION_DEVICE:
                break;
            case BOOT_USB_REQUEST_DESTINATION_INTERFACE:
                boot_UsbCallbackInterface(g_BootUsbVar.Ep0Index&0xFF,
                                          HAL_USB_CALLBACK_TYPE_DATA_CMD,
                                          setup);
                break;
            case BOOT_USB_REQUEST_DESTINATION_EP:
                boot_UsbCallbackEp(setup->index&0xFF,
                                   HAL_USB_CALLBACK_TYPE_CMD, setup);
                break;
            }
            boot_UsbStatusIn();
            }
        break;
    case EP0_STATE_STATUS_IN:
        boot_UsbContinueTransfert(HAL_USB_EP_DIRECTION_IN(0));
        g_BootUsbVar.Ep0State = EP0_STATE_IDLE;
        boot_getSetupPacket();
        break;
    case EP0_STATE_STATUS_OUT:
        boot_UsbContinueTransfert(HAL_USB_EP_DIRECTION_OUT(0));
        g_BootUsbVar.Ep0State = EP0_STATE_IDLE;
        boot_getSetupPacket();
        break;
    }
}
Example #2
0
void DealWith_UartRxIrq(DEVICE *pDev,BOOL  DMA_used, BOOL  Timeout)
{
   UINT32 uDataSize, real_len=0;
    UINT8 *rxDmaBufEmpty, *data;
   // UINT8 *rxDmaBufLoad;
	rxDmaBufEmpty =  SRAM_BUF.rx_buf1 ;
	UINT32 rxdmalen=0;
      if( rxDmaBufEmpty == NULL )  return;
	if(DMA_used)
	{   	
   		uDataSize = STATIC_RX_BUF_LEN;
   		if(Timeout)
     	{	      
            hal_UartRxDmaPurgeFifo(pDev->port);
            while(!hal_UartRxDmaFifoEmpty(pDev->port));
		 rxdmalen = hal_UartRxDmaLevel(pDev->port);
		 
		//SXS_TRACE(TSTDOUT,",DealWith_UartRxIrq  rxdmalen = %d\n",rxdmalen);
		if(rxdmalen <STATIC_RX_BUF_LEN)
	            uDataSize = STATIC_RX_BUF_LEN- rxdmalen;	
		else
			uDataSize = 0;
		
         //                SXS_TRACE(TSTDOUT,"Timeout  !!!uDataSize = %d \n",uDataSize);
            while(!hal_UartRxDmaStop(pDev->port));
        }

        data = rxDmaBufEmpty;
#ifdef BT_UART_BREAK_INT_WAKEUP
        if (g_Uart1BreakDetected)
        {
            g_Uart1BreakDetected = FALSE;
            if (uDataSize > 0)
            {
                uDataSize--;
                data = rxDmaBufEmpty+1;
            }
        }
#endif
        real_len = put_data_to_CircularBuffer(
                            &pDev->readBuf,
                            (VOID*)HAL_SYS_GET_UNCACHED_ADDR((UINT32)data),
                            uDataSize);    
        if (real_len <= STATIC_RX_BUF_LEN*2)
        {
            hal_UartSetRts(pDev->port, FALSE);
            pDev->RxPending = 0;
            SXS_TRACE(TSTDOUT,",hal_UartSetRts FLASE real_len = %d\n",real_len);
        }
        else
        {
          hal_UartSetRts(pDev->port,TRUE); 
		  hal_UartGetData (pDev->port,rxDmaBufEmpty, STATIC_RX_BUF_LEN);
          pDev->RxPending = 1;
       }
	}
	else
	{			
		uDataSize  = 1;
 		while(uDataSize>0)
 		{
	 		uDataSize = hal_UartGetData (pDev->port,rxDmaBufEmpty, STATIC_RX_BUF_LEN);			
            data = rxDmaBufEmpty;
#ifdef BT_UART_BREAK_INT_WAKEUP
            if (g_Uart1BreakDetected)
            {
                g_Uart1BreakDetected = FALSE;
                if (uDataSize > 0)
                {
                    uDataSize--;
                    data = rxDmaBufEmpty+1;
                }
            }
#endif
            if(uDataSize>0)
            {
               real_len = put_data_to_CircularBuffer(&pDev->readBuf, data,uDataSize);
                if (real_len <=32)
                {
                  hal_UartSetRts(pDev->port, FALSE);
                  SXS_TRACE(TSTDOUT,",hal_UartSetRts FLASE real_len = %d\n",real_len);
                }
            }  
            //SXS_TRACE(TSTDOUT,"Rx laixf %x: %x,%x,%x,%x,\n",uDataSize,rxDmaBufEmpty[0],rxDmaBufEmpty[1],rxDmaBufEmpty[2],rxDmaBufEmpty[3]);
            uDataSize  = hal_UartRxFifoLevel(pDev->port);
        } 
    }
    if(pDev->registered_func!=NULL)
    {
        pDev->registered_func(pDev->port);
    } 
}