USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { /* Open EP0 OUT */ USBD_LL_OpenEP(pdev, 0x00, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; /* Open EP0 IN */ USBD_LL_OpenEP(pdev, 0x80, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; /* Upon Reset call user call back */ pdev->dev_state = USBD_STATE_DEFAULT; if (pdev->pClassData) pdev->pClass->DeInit(pdev, pdev->dev_config); return USBD_OK; }
uint8_t* USBD_HID_GetReportDescriptor_impl(uint16_t* len) { switch (USBD_Device.request.wIndex&0xFF) { case 0: // very dirty work due to lack of callback when USB_HID_Init is called USBD_LL_OpenEP(&USBD_Device, 0x81, USBD_EP_TYPE_INTR, 8); USBD_LL_OpenEP(&USBD_Device, 0x01, USBD_EP_TYPE_INTR, 8); /* Prepare Out endpoint to receive 1st packet */ USBD_LL_PrepareReceive(&USBD_Device, 0x01, 8); *len = sizeof(HID_ReportDesc_kbd); return (uint8_t*)HID_ReportDesc_kbd; case 1: *len = sizeof(HID_ReportDesc); return (uint8_t*)HID_ReportDesc; } *len = 0; return 0; }
static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { USBD_CDC_HandleTypeDef *hcdc = context; unsigned index; for (index = 0; index < NUM_OF_CDC_UARTS; index++,hcdc++) { /* Open EP IN */ USBD_LL_OpenEP(pdev, parameters[index].data_in_ep, USBD_EP_TYPE_BULK, USB_FS_MAX_PACKET_SIZE); /* Open EP OUT */ USBD_LL_OpenEP(pdev, parameters[index].data_out_ep, USBD_EP_TYPE_BULK, USB_FS_MAX_PACKET_SIZE); /* Open Command IN EP */ USBD_LL_OpenEP(pdev, parameters[index].command_ep, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); /* Configure the UART peripheral */ hcdc->InboundBufferReadIndex = 0; hcdc->InboundTransferInProgress = 0; hcdc->OutboundTransferNeedsRenewal = 0; hcdc->UartHandle.Instance = parameters[index].Instance; hcdc->LineCoding = defaultLineCoding; __HAL_LINKDMA(&hcdc->UartHandle, hdmatx, hcdc->hdma_tx); __HAL_LINKDMA(&hcdc->UartHandle, hdmarx, hcdc->hdma_rx); ComPort_Config(hcdc); /* Prepare Out endpoint to receive next packet */ USBD_CDC_ReceivePacket(pdev, index); } return USBD_OK; }
USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { #if 0 // fastpath, done on the L4 for MOAR SPEED /* Open EP0 OUT */ USBD_LL_OpenEP(pdev, 0x00, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); /* Open EP0 IN */ USBD_LL_OpenEP(pdev, 0x80, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); #endif // 0 pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; /* Upon Reset call user call back */ pdev->dev_state = USBD_STATE_DEFAULT; if (pdev->pClass) { ((DeInit_t)PIC(pdev->pClass->DeInit))(pdev, pdev->dev_config); } return USBD_OK; }
/** * @brief USBD_CDC_HID_Init * Initialize the CDC interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_CDC_HID_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { pdev->pClassData = &cdc_hid; USBD_CDC_HID_HandleTypeDef *handle = (USBD_CDC_HID_HandleTypeDef*) pdev->pClassData; NOT_USED(cfgidx); uint8_t ret = 0; /* Open EP IN */ USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_IN_PACKET_SIZE); /* Open EP OUT */ USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_OUT_PACKET_SIZE); /* Open Command IN EP */ USBD_LL_OpenEP(pdev, CDC_CMD_EP, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); /* Init Xfer states */ handle->cdcState = CDC_IDLE; /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, handle->cdcRX, CDC_DATA_FS_OUT_PACKET_SIZE); #ifdef USE_USB_HID unsigned int reportSize = 0; handle->hidReportDesc = USB_GetHIDReportDesc(&reportSize); handle->hidReportDescSize = (uint16_t)reportSize; /* Open HID EP IN - even if we're not using it */ USBD_LL_OpenEP(pdev, HID_IN_EP, USBD_EP_TYPE_INTR, HID_DATA_IN_PACKET_SIZE); handle->hidState = HID_IDLE; #endif return ret; }
/** * @brief USBD_MSC_Init * Initialize the mass storage configuration * @param pdev: device instance * @param cfgidx: configuration index * @retval status */ uint8_t USBD_MSC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { int16_t ret = 0; if(pdev->dev_speed == USBD_SPEED_HIGH ) { /* Open EP OUT */ USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); } else { /* Open EP OUT */ USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); } //JD pdev->pClassData = USBD_malloc(sizeof (USBD_MSC_BOT_HandleTypeDef)); pdev->pClassData = &hUSBD_MSC; if(pdev->pClassData == NULL) { ret = 1; } else { /* Init the BOT layer */ MSC_BOT_Init(pdev); ret = 0; } return ret; }
/** * @brief USBD_RAW_Init * Initialize the TEMPLATE interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_RAW_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { /* Open EP OUT */ USBD_LL_OpenEP(pdev, RAW_EPOUT_ADDR, USBD_EP_TYPE_BULK, RAW_EP_SIZE); /* Open EP IN */ USBD_LL_OpenEP(pdev, RAW_EPIN_ADDR, USBD_EP_TYPE_BULK, RAW_EP_SIZE); //Prepare to receive a packet USBD_LL_PrepareReceive(pdev,RAW_EPOUT_ADDR,rx_raw_packet,RAW_EP_SIZE); return USBD_OK; }
/** * @brief USBD_CUSTOM_HID_Init * Initialize the CUSTOM_HID interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_CUSTOM_HID_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; USBD_CUSTOM_HID_HandleTypeDef *hhid; /* Open EP IN */ USBD_LL_OpenEP(pdev, CUSTOM_HID_EPIN_ADDR, USBD_EP_TYPE_INTR, CUSTOM_HID_EPIN_SIZE); /* Open EP OUT */ USBD_LL_OpenEP(pdev, CUSTOM_HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, CUSTOM_HID_EPOUT_SIZE); pdev->pClassData = USBD_malloc(sizeof (USBD_CUSTOM_HID_HandleTypeDef)); if(pdev->pClassData == NULL) { ret = 1; } else { hhid = (USBD_CUSTOM_HID_HandleTypeDef*) pdev->pClassData; hhid->state = CUSTOM_HID_IDLE; ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->Init(); /* Prepare Out endpoint to receive 1st packet */ USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR, hhid->Report_buf, USBD_CUSTOMHID_OUTREPORT_BUF_SIZE); } return ret; }
/** * @brief USBD_AUDIO_Init * Initialize the AUDIO interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_AUDIO_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { USBD_AUDIO_HandleTypeDef *haudio; /* Open EP OUT */ USBD_LL_OpenEP(pdev, AUDIO_OUT_EP, USBD_EP_TYPE_ISOC, AUDIO_OUT_PACKET); /* Allocate Audio structure */ pdev->pClassData = USBD_malloc(sizeof (USBD_AUDIO_HandleTypeDef)); if(pdev->pClassData == NULL) { return USBD_FAIL; } else { haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData; haudio->alt_setting = 0; haudio->offset = AUDIO_OFFSET_UNKNOWN; haudio->wr_ptr = 0; haudio->rd_ptr = 0; haudio->rd_enable = 0; /* Initialize the Audio output Hardware layer */ if (((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->Init(USBD_AUDIO_FREQ, AUDIO_DEFAULT_VOLUME, 0) != USBD_OK) { return USBD_FAIL; } /* Prepare Out endpoint to receive 1st packet */ USBD_LL_PrepareReceive(pdev, AUDIO_OUT_EP, haudio->buffer, AUDIO_OUT_PACKET); } return USBD_OK; }
/** * @brief USBD_HID_Init * Initialize the HID interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; /* Open EP IN */ USBD_LL_OpenEP(pdev, HID_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_EPIN_SIZE); pdev->pClassData = USBD_malloc(sizeof (USBD_HID_HandleTypeDef)); if(pdev->pClassData == NULL) { ret = 1; } else { ((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE; } return ret; }
/** * @brief USBD_CDC_Init * Initilaize the CDC interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; USBD_CDC_HandleTypeDef *hcdc; if(pdev->dev_speed == USBD_SPEED_HIGH ) { /* Open EP IN */ USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_HS_IN_PACKET_SIZE); /* Open EP OUT */ USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Open EP IN */ USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_IN_PACKET_SIZE); /* Open EP OUT */ USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_OUT_PACKET_SIZE); } /* Open Command IN EP */ USBD_LL_OpenEP(pdev, CDC_CMD_EP, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); if(pdev->pClassData == NULL) { ret = 1; } else { hcdc = pdev->pClassData; /* Init physical Interface components */ ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Init(); /* Init Xfer states */ hcdc->TxState =0; hcdc->RxState =0; if(pdev->dev_speed == USBD_SPEED_HIGH ) { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, CDC_DATA_FS_OUT_PACKET_SIZE); } } return ret; }
/** * @brief USBD_MSC_Setup * Handle the MSC specific requests * @param pdev: device instance * @param req: USB request * @retval status */ uint8_t USBD_MSC_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; switch (req->bmRequest & USB_REQ_TYPE_MASK) { /* Class request */ case USB_REQ_TYPE_CLASS : switch (req->bRequest) { case BOT_GET_MAX_LUN : if((req->wValue == 0) && (req->wLength == 1) && ((req->bmRequest & 0x80) == 0x80)) { hmsc->max_lun = ((USBD_StorageTypeDef *)pdev->pUserData)->GetMaxLun(); USBD_CtlSendData (pdev, (uint8_t *)&hmsc->max_lun, 1); } else { USBD_CtlError(pdev , req); return USBD_FAIL; } break; case BOT_RESET : if((req->wValue == 0) && (req->wLength == 0) && ((req->bmRequest & 0x80) != 0x80)) { MSC_BOT_Reset(pdev); } else { USBD_CtlError(pdev , req); return USBD_FAIL; } break; default: USBD_CtlError(pdev , req); return USBD_FAIL; } break; /* Interface & Endpoint request */ case USB_REQ_TYPE_STANDARD: switch (req->bRequest) { case USB_REQ_GET_INTERFACE : USBD_CtlSendData (pdev, (uint8_t *)&hmsc->interface, 1); break; case USB_REQ_SET_INTERFACE : hmsc->interface = (uint8_t)(req->wValue); break; case USB_REQ_CLEAR_FEATURE: /* Flush the FIFO and Clear the stall status */ USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex); /* Reactivate the EP */ USBD_LL_CloseEP (pdev , (uint8_t)req->wIndex); if((((uint8_t)req->wIndex) & 0x80) == 0x80) { if(pdev->dev_speed == USBD_SPEED_HIGH ) { /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); } else { /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); } } else { if(pdev->dev_speed == USBD_SPEED_HIGH ) { /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); } else { /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); } } /* Handle BOT error */ MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex); break; } break; default: break; } return 0; }