在调用完上面的UFI命令后,ufiCmdRunning.state就被设置为UFI_STATE_BEGIN态,在主循环中调用本函数,用来判断UFI命令是否执行完毕,以及是否执行成功。
/**
 * UFI命令监视函数,判断命令是否执行完毕,底层有错误则进行容错处理
 */
short funUfiRunning(void)
{
    switch(ufiCmdRunning.state)
    {
       //开始运行命令
       case UFI_STATE_BEGIN:
           usbTimer = 0;
           ufiCmdRunning.count = 0;
           ufiCmdRunning.state = UFI_STATE_RUNNING;
           break;
       //命令运行中
       case UFI_STATE_RUNNING:
           //检查命令是否执行完毕
           if(usbIsCmdOver() == USB_CMD_OVER)
           {
              //USB协议层命令执行失败
              if (usbGetCmdResult() != 0)
              {
                  //底层命令执行失败后,对端口复位后重新执行,重新执行超过150次则认为失败
                  ufiCmdRunning.count++;
                  if (ufiCmdRunning.count > 150)
                  {
                     ufiCmdRunning.error = UFI_ERR_MUCH_ERR;
                     ufiCmdRunning.state = UFI_STATE_OVER;
                  }
                  else
                  {
                     //复位BulkOut端口
                     usbClearBulkOut();
                     ufiCmdRunning.state = UFI_STATE_RESET_OUT;
                  }
                  break;
              }
              //UFI命令执行成功
              if ((ufiCmdRunning.csw.bCSW_Status) == 0x00 && (ufiCmdRunning.csw.dCSW_Signature == 0x53425355))
              {
                  ufiCmdRunning.error = 0;
              }
              //UFI命令执行失败
              else
              {
                  ufiCmdRunning.error = UFI_ERR_CSW;
              }
              ufiCmdRunning.state = UFI_STATE_OVER;
           }
           //底层命令超时,返回失败
           else if (usbTimer >= 200)
           {
              ufiCmdRunning.error = UFI_ERR_TIMEOUT;
              ufiCmdRunning.state = UFI_STATE_OVER;
           }
           break;
       //BulkOut端口复位结束
       case UFI_STATE_RESET_OUT:
           if(usbIsCmdOver() == USB_CMD_OVER)
           {
              //复位BulkIn端口
              usbClearBulkIn();
              ufiCmdRunning.state = UFI_STATE_RESET_IN;
           }
           break;
       //BulkIn端口复位结束
       case UFI_STATE_RESET_IN:
           if(usbIsCmdOver() == USB_CMD_OVER)
           {
              //读取端口错误原因
              ufiRequestSense(bulkDataBuf);
              ufiCmdRunning.state = UFI_STATE_REQUEST_SENSE;
           }
           break;
       //端口错误原因读取完毕
       case UFI_STATE_REQUEST_SENSE:
           if(usbIsCmdOver() == USB_CMD_OVER)
           {
              //重新执行底层Bulk命令
              ufiCmdRunning.funUfiCmd((unsigned char *)&ufiCmdRunning.cbw, ufiCmdRunning.pBuf, (unsigned char *)&ufiCmdRunning.csw);
              usbTimer = 0;
              ufiCmdRunning.state = UFI_STATE_RUNNING;
           }
           break;
    }
    return ufiCmdRunning.state;
}
本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/318291,如需转载请自行联系原作者

基于OHCI的USB主机 —— UFI命令监视代码相关推荐

  1. 基于OHCI的USB主机 —— UFI命令 USB Mass Storage Class Bulk-Only Transport协议介绍

    USB Mass Storage Class Bulk-Only Transport Microsoft公司至Windows98后,USB主机 都支持Bulk-Only标准,所以现在的大容量存储类设备 ...

  2. 基于OHCI的USB主机 —— UFI读容量代码

    /**  * 读磁盘容量命令  * @param *buf 数据缓冲区指针  * @return 0 - 成功  */ short ufiReadCapacity(BYTE *buf) {     R ...

  3. 基于OHCI的USB主机 —— UFI写扇区代码

    /**  * 写磁盘扇区命令  * @param sect 物理扇区号  * @param *buf 数据缓冲区指针  * @return 0 - 成功  */ short ufiWriteSect( ...

  4. 基于OHCI的USB主机 —— UFI读状态代码

    /**  * 读取错误原因  * @param *buf 存放读取出来数据的缓冲区  * @return 0 - 成功  */ short ufiRequestSense(BYTE *buf) {   ...

  5. 基于OHCI的USB主机 —— UFI数据结构2

    UFI命令块 /**  * UFI命令块  */ typedef union _CDB_RBC {     READ_10             ufiRead10;           //!&l ...

  6. 基于OHCI的USB主机 —— UFI查询代码

    /**  * 磁盘查询命令  * @param *buf 数据缓冲区指针  * @return 0 - 成功  */ short ufiInquiry(BYTE *buf) {     INQUIRY ...

  7. 基于OHCI的USB主机 —— UFI数据结构3

    UFI命令运行状态结构,用于判断UFI命令是否执行完毕. typedef struct _UFI_CMD_RUNNING{     unsigned char state;        //!< ...

  8. 基于OHCI的USB主机——UFI查询命令(Inquiry)

    查询命令(INQUIRY)请求获取UFI设备参数的信息.他被用作主机上的驱动器访问FUI设备的配置,特别是在接通电源和硬件复位之后使用.命令内容如下表:  位 字节 7 6 5 4 3 2 1 0 0 ...

  9. 基于OHCI的USB主机——UFI读扇区命令(Read10)

    读命令要求UFI设备传输数据到主机,记录在逻辑块地址的最新数据值将被返回,命令格式如下表:  位 字节 7 6 5 4 3 2 1 0 0 操作代码(0x28) 1 逻辑单元号(LUN) DPO FU ...

最新文章

  1. 关于学习Python的一点学习总结(16->popitem()->sedefault()->update()->values())
  2. win7启动后报丢失nscmk.dll解决解决方式
  3. 双击Jar的启动方法
  4. LeetCode MySQL 1308. 不同性别每日分数总计(累加/变量/窗口函数)
  5. 大数据_Flink_数据处理_yarn和k8s平台的flink部署---Flink工作笔记0015
  6. 异常:org.springframework.http.converter.HttpMessageNotReadableException
  7. NoteBurner iTunes DRM Audio Converter for Mac(苹果DRM音频转换器)
  8. ELK日志分析系统迁移记录
  9. 前任3丨《前任3》里的这三种爱情,你都有过哪一种
  10. Kali Linux信息收集工具
  11. php xheditor 上传图片,WordPress投稿集成xheditor编辑器(支持图片上传)
  12. Unity3D之FingerGestures学习
  13. python决策树例题经典案例-决策树python实现小样例
  14. Java基础eclipse版(二)——JDK、Eclipse的下载与安装
  15. 配置 七牛云cdn 加速
  16. 大数据开发好找工作么?还能入行么?
  17. 计算机软件 大shen
  18. Metal 框架之 MTKView
  19. oracle分区表导入数据,Oracle 分区表数据的导入与导出(2)
  20. 中国不锈钢行业需求态势及发展形势展望报告(新版)2022-2027年

热门文章

  1. 10组团队项目-Beta冲刺-4/5
  2. unity3d中通过代码实现创建一堵墙的功能
  3. springcloud gateway 整合swagger3.0.0
  4. 【华人学者风采】汪建军 华北电力大学
  5. linux ftp服务器配置本地账号,CentOS7 下安装和配置本地用户登录VSFTP服务器
  6. 密码的常见加密方式,你都了解多少?
  7. AD原理图库元件标识等字符上方的横线
  8. 【硬十宝典】——7.2【动态RAM】DDR4与DDR3区别解析
  9. slam之视觉+IMU
  10. 软件测试面试题:什么是数据的对立性,有几个层次?