USB库的MSC类里用到的callback回调函数

来源:互联网 发布:modo软件 编辑:程序博客网 时间:2024/06/05 00:56

在STM32F4上开发USB高速接口。在其USBH_USR_MSC_Application()函数下编写用户程序。发现之后函数调用完之后,返回值0。程序跑usbh_msc_core.h里去了。

 case USBH_MSC_DEFAULT_APPLI_STATE:      /* Process Application callback for MSC */      appliStatus = pphost->usr_cb->UserApplication();  --> if(appliStatus == 0)      {        USBH_MSC_BOTXferParam.MSCState = USBH_MSC_DEFAULT_APPLI_STATE;      }

执行完这条if 语句

    上面的语句被包含在函数static USBH_Status USBH_MSC_Handle() 

static USBH_Status USBH_MSC_Handle(USB_OTG_CORE_HANDLE *pdev ,                                    void   *phost)

 if(HCD_IsDeviceConnected(pdev))  {       switch(USBH_MSC_BOTXferParam.MSCState)

然后   return status;

也就是USBH_Status USBH_MSC_Handle() 函数被执行完。

     接着程序跳转到

  case HOST_CLASS:       /* process class state machine */    status = phost->class_cb->Machine(pdev, phost);    USBH_ErrorHandle(phost, status);   -->           break;     

最后执行到USBH_ErrorHandle()这个函数下,

void USBH_ErrorHandle(USBH_HOST *phost, USBH_Status errType){  /* Error unrecovered or not supported device speed */  if ( (errType == USBH_ERROR_SPEED_UNKNOWN) ||       (errType == USBH_UNRECOVERED_ERROR) )  {    phost->usr_cb->UnrecoveredError();     phost->gState = HOST_ERROR_STATE;     }    /* USB host restart requested from application layer */  else if(errType == USBH_APPLY_DEINIT)  {    phost->gState = HOST_ERROR_STATE;      /* user callback for initalization */    phost->usr_cb->Init();  } 

然后跳出。

结论:

执行完这段代码后,USB状态进入错误状态,必须重新启动USB

内核库,这个用户函数用swtich()语句还是有道理的。实现无限状

态机的效果。

实践证明,加了swtich语句还是跳进错误。说明这完全跟用户代码无关。