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; } }
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); } }