基于OHCI的USB主机 —— 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;
}
|
基于OHCI的USB主机 —— UFI命令监视代码相关推荐
- 基于OHCI的USB主机 —— UFI命令 USB Mass Storage Class Bulk-Only Transport协议介绍
USB Mass Storage Class Bulk-Only Transport Microsoft公司至Windows98后,USB主机 都支持Bulk-Only标准,所以现在的大容量存储类设备 ...
- 基于OHCI的USB主机 —— UFI读容量代码
/** * 读磁盘容量命令 * @param *buf 数据缓冲区指针 * @return 0 - 成功 */ short ufiReadCapacity(BYTE *buf) { R ...
- 基于OHCI的USB主机 —— UFI写扇区代码
/** * 写磁盘扇区命令 * @param sect 物理扇区号 * @param *buf 数据缓冲区指针 * @return 0 - 成功 */ short ufiWriteSect( ...
- 基于OHCI的USB主机 —— UFI读状态代码
/** * 读取错误原因 * @param *buf 存放读取出来数据的缓冲区 * @return 0 - 成功 */ short ufiRequestSense(BYTE *buf) { ...
- 基于OHCI的USB主机 —— UFI数据结构2
UFI命令块 /** * UFI命令块 */ typedef union _CDB_RBC { READ_10 ufiRead10; //!&l ...
- 基于OHCI的USB主机 —— UFI查询代码
/** * 磁盘查询命令 * @param *buf 数据缓冲区指针 * @return 0 - 成功 */ short ufiInquiry(BYTE *buf) { INQUIRY ...
- 基于OHCI的USB主机 —— UFI数据结构3
UFI命令运行状态结构,用于判断UFI命令是否执行完毕. typedef struct _UFI_CMD_RUNNING{ unsigned char state; //!< ...
- 基于OHCI的USB主机——UFI查询命令(Inquiry)
查询命令(INQUIRY)请求获取UFI设备参数的信息.他被用作主机上的驱动器访问FUI设备的配置,特别是在接通电源和硬件复位之后使用.命令内容如下表: 位 字节 7 6 5 4 3 2 1 0 0 ...
- 基于OHCI的USB主机——UFI读扇区命令(Read10)
读命令要求UFI设备传输数据到主机,记录在逻辑块地址的最新数据值将被返回,命令格式如下表: 位 字节 7 6 5 4 3 2 1 0 0 操作代码(0x28) 1 逻辑单元号(LUN) DPO FU ...
最新文章
- 关于学习Python的一点学习总结(16->popitem()->sedefault()->update()->values())
- win7启动后报丢失nscmk.dll解决解决方式
- 双击Jar的启动方法
- LeetCode MySQL 1308. 不同性别每日分数总计(累加/变量/窗口函数)
- 大数据_Flink_数据处理_yarn和k8s平台的flink部署---Flink工作笔记0015
- 异常:org.springframework.http.converter.HttpMessageNotReadableException
- NoteBurner iTunes DRM Audio Converter for Mac(苹果DRM音频转换器)
- ELK日志分析系统迁移记录
- 前任3丨《前任3》里的这三种爱情,你都有过哪一种
- Kali Linux信息收集工具
- php xheditor 上传图片,WordPress投稿集成xheditor编辑器(支持图片上传)
- Unity3D之FingerGestures学习
- python决策树例题经典案例-决策树python实现小样例
- Java基础eclipse版(二)——JDK、Eclipse的下载与安装
- 配置 七牛云cdn 加速
- 大数据开发好找工作么?还能入行么?
- 计算机软件 大shen
- Metal 框架之 MTKView
- oracle分区表导入数据,Oracle 分区表数据的导入与导出(2)
- 中国不锈钢行业需求态势及发展形势展望报告(新版)2022-2027年