对比了两个系列里Middlewares\ST\STM32_USB_Device_Library\Class路径下实现的代码差异,哪个系列写的更全面?像MSC的USBD_MSC_Setup函数
USB_REQ_CLEAR_FEATURE请求里
F4实现的比较简单- case USB_REQ_CLEAR_FEATURE:
- if (pdev->dev_state == USBD_STATE_CONFIGURED)
- {
- if (req->wValue == USB_FEATURE_EP_HALT)
- {
- /* Flush the FIFO */
- (void)USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex);
- /* Handle BOT error */
- MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
- }
- }
- break;
复制代码 F3实现的比较复杂
- 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) & 0x80U) == 0x80U)
- {
- pdev->ep_in[(uint8_t)req->wIndex & 0xFU].is_used = 0U;
- 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);
- }
- pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U;
- }
- else
- {
- pdev->ep_out[(uint8_t)req->wIndex & 0xFU].is_used = 0U;
- 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);
- }
- else
- {
- /* Open EP OUT */
- USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK,
- MSC_MAX_FS_PACKET);
- }
- pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U;
- }
- /* Handle BOT error */
- MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
- break;
复制代码
另外还有MSC_BOT_Abort函数
F4实现的是:
- static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev)
- {
- USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;
- if ((hmsc->cbw.bmFlags == 0U) &&
- (hmsc->cbw.dDataLength != 0U) &&
- (hmsc->bot_status == USBD_BOT_STATUS_NORMAL))
- {
- (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
- }
- (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
- if (hmsc->bot_status == USBD_BOT_STATUS_ERROR)
- {
- (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
- (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
- }
- }
复制代码 F3实现的是
- static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev)
- {
- USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;
- if ((hmsc->cbw.bmFlags == 0U) &&
- (hmsc->cbw.dDataLength != 0U) &&
- (hmsc->bot_status == USBD_BOT_STATUS_NORMAL))
- {
- USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
- }
- USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
- if (hmsc->bot_status == USBD_BOT_STATUS_ERROR)
- {
- USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw,
- USBD_BOT_CBW_LENGTH);
- }
- }
复制代码 还有其他的函数就不一一举例了,不明白为什么写的不一样?
|
F3系列内置的USB只能做单纯的全速device,而F4系列是支持OTG的,即可以做DEVICE或MASTER,
也支持全速或高速。
硬件上也有诸多不同,相应的驱动不一样就不难理解了。
两个驱动库 也不能简单说哪个更全面来概括,应该说各个驱动跟各自硬件相匹配。
刚开始接触USB,如果说的有误请指正,我的理解底层实现肯定是不一样的,但应用层的实现应该没什么差异才对,像MSC里usbd_msc_data.c里定义的数组值也不一样,另外F4系列有SCSI_Read12函数,F3系列没有