做网站优化有什么方法,大连互联网公司排名,自己做网站的成本,平面排版网站最近在使用usb主机库驱动U盘直接进行扇区读写。
发现MSC库中获取LUN相关代码有问题
代码如下
其中
status USBH_MSC_BOT_REQ_GetMaxLUN(phost, (uint8_t *)(void *)MSC_Handle-max_lun);
MSC_Handle-max_lun (MSC_Handle-max_lun MAX_SUPPORTED_L…最近在使用usb主机库驱动U盘直接进行扇区读写。
发现MSC库中获取LUN相关代码有问题
代码如下
其中
status USBH_MSC_BOT_REQ_GetMaxLUN(phost, (uint8_t *)(void *)MSC_Handle-max_lun);
MSC_Handle-max_lun (MSC_Handle-max_lun MAX_SUPPORTED_LUN)? MAX_SUPPORTED_LUN : (uint8_t )(MSC_Handle-max_lun) 1U;
这两行代码造成的这个问题
具体解释如下
ST 实现驱动程序“最大 LUN”部分的方式令人困惑因为它不符合usb.org 规范中“获取最大 LUN”的定义请参阅 https://www.usb.org/document library/mass-storage-bulk-only_10 并搜索“aet max lun”。
ST实现了MScHandle-max lun值来指示LuN的“数量”而 USB.org 将其定义为“最大 LUN 索引”即有 2 个 LUN 时最大 LUN 索引为 1。
主要代码修复是增加从 USB 驱动器读取的“最大 lun”值然后再将其用于 ST 的其余部分
司机。
ST 如何实现驱动程序的另一个问题是 MSC Handle-max lun 被定义为 uint32 t但是
调用 USB 驱动器来检索它需要一个 (uint8 t *)因此只有该值的低 8 位被设置留下
高 24 位不变。因此在使用或之前必须清除高 24 位或类型转换为 uint8 t
比较该值。
在上述代码修改之前具有 1 个 LUT 的驱动器返回一个具有非常大值的 MSc Handle-max lun
如预期低 8 位为零但高 24 位是一些较大的值因此 MSC Handle-max lun 得到
限制为最大支持的 LUN为 2而不是 1并且驱动器无法安装。
简单来说当你插入U盘U盘返回LUN为1的时候USB函数只会写入buf的低8位导致高24位的值为未知导致返回的值作为32位解析后显示特别大。之后在经过三目运算符的纠错后被修改为默认的最大值这是一般是2 而U盘本身不支持2所以在进行lun为2的轮询时出现了驱动加载的失败。
下面是原文
STM32Cube USB Host Mass Storage Class problem: som... - STMicroelectronics Community 那么如何解决呢
我刚开始想着既然只有低八位有效那就在获取到LUN值后清零高24位即可具体
MSC_Handle-max_lun 0x000000FF; 事实也是如此插入U盘后成功的只有一位LUN值了 但是这样是有风险的因为谁也不知道高24位也许就变成了其他用处的地址了呢。 之后我再采用了宁外的方法即再请求LUN之前将32位的区域清零 如上结果也是正常的 参考文章STM32Cube USB Host Mass Storage Class problem: som... - STMicroelectronics Community