OpenEdv-开源电子网

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

UCOS中如何移植stm32 usb的库

[复制链接]

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
发表于 2017-6-21 10:39:11 | 显示全部楼层 |阅读模式
1金钱
UCOS中如何移植stm32 usb的库,直接拿去用就可以了吗?

最佳答案

查看完整内容[请看2#楼]

移植到UCOSII,我们综合是研究帮你搞好了。。。,参考着移植过来就行了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-6-21 10:39:12 | 显示全部楼层
yuer19900712 发表于 2017-6-21 10:47
看了原子哥的STM32F407中关于USB读卡器的视频,感觉讲的很笼统,只是讲了讲移植,那些函数如何用,为啥那么 ...

移植到UCOSII,我们综合是研究帮你搞好了。。。,参考着移植过来就行了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-21 10:47:38 | 显示全部楼层
看了原子哥的STM32F407中关于USB读卡器的视频,感觉讲的很笼统,只是讲了讲移植,那些函数如何用,为啥那么改的,都没有说。换个其他的usb设备就不知道怎么用了,想移植到ucos上,也是毫无头绪,求指导
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-23 10:35:50 | 显示全部楼层
正点原子 发表于 2017-6-23 00:02
移植到UCOSII,我们综合是研究帮你搞好了。。。,参考着移植过来就行了

好的,我研究一下综合例程。另外,再向您请教一下USB的相关问题,有点卡住想不明白了。在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:
才能转换到用户自己的应用程序当中,这如何过来的?
回复

使用道具 举报

12

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-14
在线时间
18 小时
 楼主| 发表于 2017-6-23 10:43:04 | 显示全部楼层
正点原子 发表于 2017-6-23 00:02
移植到UCOSII,我们综合是研究帮你搞好了。。。,参考着移植过来就行了

关于usb host msc处理函数的问题 我新建了一个悬赏帖 http://www.openedv.com/thread-104407-1-1.html 希望您能解答,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 16:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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