OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6427|回复: 9

usb host msc模式下的USBH_Process函数疑惑,求解释

[复制链接]

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
发表于 2017-6-23 11:22:08 | 显示全部楼层 |阅读模式
3金钱
在usb host msc模式中,在轮询处理函数中void USBH_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost)
对枚举完成后的程序不太理解,尤其是这里
[mw_shl_code=applescript,true]case HOST_CLASS:  
  /* process class state machine */
  status = phost->class_cb->Machine(pdev, phost);
  USBH_ErrorHandle(phost, status);
  break;[/mw_shl_code]
第3行进入对应的函数后,经过
USBH_MSC_BOT_INIT_STATE
USBH_MSC_BOT_RESET
USBH_MSC_GET_MAX_LUN
进入case USBH_MSC_TEST_UNIT_READY
[mw_shl_code=applescript,true]case USBH_MSC_TEST_UNIT_READY:
  /* Issue SCSI command TestUnitReady */
  mscStatus = USBH_MSC_TestUnitReady(pdev);
   
  if(mscStatus == USBH_MSC_OK )
  {
    USBH_MSC_BOTXferParam.MSCState = USBH_MSC_READ_CAPACITY10;
    MSCErrorCount = 0;
    status = USBH_OK;
  }
  else
  {
    USBH_MSC_ErrorHandle(mscStatus);
  }
  break;[/mw_shl_code]
进入第3行的子函数
[mw_shl_code=applescript,true]uint8_t USBH_MSC_TestUnitReady (USB_OTG_CORE_HANDLE *pdev)
{
  uint8_t index;
  USBH_MSC_Status_TypeDef status = USBH_MSC_BUSY;
   
  if(HCD_IsDeviceConnected(pdev))
  {
    switch(USBH_MSC_BOTXferParam.CmdStateMachine)
    {
    case CMD_SEND_STATE:
      /*Prepare the CBW and relevent field*/
      USBH_MSC_CBWData.field.CBWTransferLength = 0;       /* No Data Transfer */
      USBH_MSC_CBWData.field.CBWFlags = USB_EP_DIR_OUT;
      USBH_MSC_CBWData.field.CBWLength = CBW_LENGTH_TEST_UNIT_READY;
      USBH_MSC_BOTXferParam.pRxTxBuff = USBH_MSC_CSWData.CSWArray;
      USBH_MSC_BOTXferParam.DataLength = USBH_MSC_CSW_MAX_LENGTH;
      USBH_MSC_BOTXferParam.MSCStateCurrent = USBH_MSC_TEST_UNIT_READY;
      
      for(index = CBW_CB_LENGTH; index != 0; index--)
      {
        USBH_MSC_CBWData.field.CBWCB[index] = 0x00;
      }
      
      USBH_MSC_CBWData.field.CBWCB[0]  = OPCODE_TEST_UNIT_READY;
      USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SEND_CBW;
      /* Start the transfer, then let the state
      machine magage the other transactions */
      USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_USB_TRANSFERS;
      USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_BUSY;
      USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS;
      
      status = USBH_MSC_BUSY;
      break;
      
    case CMD_WAIT_STATUS:
      if(USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_OK)
      {
        /* Commands successfully sent and Response Received  */      
        USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE;
        
        status = USBH_MSC_OK;      
      }
      else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_FAIL )
      {
        /* Failure Mode */
        USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE;
        status = USBH_MSC_FAIL;
      }
      
      else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_PHASE_ERROR )
      {
        /* Failure Mode */
        USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE;
        status = USBH_MSC_PHASE_ERROR;   
      }
      break;
      
    default:
      break;
    }
  }
  return status;
}[/mw_shl_code]
执行完第一个case CMD_SEND_STATE后,返回的状态不就成了USBH_MSC_BUSY了,返回到上一层
[mw_shl_code=applescript,true]case USBH_MSC_TEST_UNIT_READY:
  /* Issue SCSI command TestUnitReady */
  mscStatus = USBH_MSC_TestUnitReady(pdev);
   
  if(mscStatus == USBH_MSC_OK )
  {
    USBH_MSC_BOTXferParam.MSCState = USBH_MSC_READ_CAPACITY10;
    MSCErrorCount = 0;
    status = USBH_OK;
  }
  else
  {
    USBH_MSC_ErrorHandle(mscStatus);
  }
  break;[/mw_shl_code]
这不是要执行USBH_MSC_ErrorHandle(mscStatus);这个语句了,还如何往下执行呢?
我看process这个程序是一直要执行到    case USBH_MSC_DEFAULT_APPLI_STATE:
才能转换到用户自己的应用程序当中,这如何过来的?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-23 11:30:04 | 显示全部楼层
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-23 17:17:44 | 显示全部楼层
usb感觉好复杂
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-6-26 00:44:42 | 显示全部楼层
必须复杂啊
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-26 09:29:20 | 显示全部楼层

原子哥能给稍微解释下吗
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-26 10:00:49 | 显示全部楼层

对USB协议有个大概的了解,枚举的时候以SETUP包的形式,去获取各类描述符,设置地址等工作,随后通过CBW-DATAIN/DATAOUT-CSW的形式接收或发送数据(msc类),枚举的都能和程序对应上,但在CBW-DATAIN/DATAOUT-CSW过程的时候卡在上面程序那里,不太明白了
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-28 10:36:05 | 显示全部楼层
石沉大海了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-8-5
在线时间
4 小时
发表于 2019-8-5 22:10:22 | 显示全部楼层
视频中讲解的说在识别阶段调用USBH_Process轮询怎样实现?请大神指教。
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-1-17
在线时间
6 小时
发表于 2020-7-10 16:41:44 | 显示全部楼层
楼主怎么解决的  我现在调程序遇到了跟你一样的问题 到这执行不到USBH_MSC_OK
回复

使用道具 举报

2

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-9-14
在线时间
36 小时
发表于 2020-10-15 14:01:27 | 显示全部楼层
楼主有解决这个问题吗 我也遇到了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-29 22:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表