当前位置: 首页 > news >正文

使用CUBEMX配置的USB大容量存储设备主机库获取LUN数量的不严谨代码纠正

最近在使用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实现了MSc,Handle->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

http://www.lryc.cn/news/415194.html

相关文章:

  • 合并重叠的区间
  • docker和运维
  • 苍穹外面day13(day10)---订单状态定时处理、来单提醒和客户催单
  • RCE和php文件上传
  • nextjs 实现TodoList网页应用案例
  • U盘格式化了怎么恢复数据?教你U盘恢复妙招
  • 化工厂室内外4G/5G+蓝牙+GPS/北斗RTK人员定位系统解决方案
  • 【知识跨境电商API接口丨python数分实战】国际电商平台用户成交转化分析
  • 【SpringBoot】Java对象级联校验
  • 【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)
  • CSS实现元素hover时背景色拉伸渐变
  • Activity收不到bundle值
  • ZBrush
  • 【多线程-从零开始-贰】线程的构造方法和常见属性
  • 力扣:100379. 新增道路查询后的最短距离 I(Java,BFS)
  • 程序开发的常用设计思想
  • Qt之Gui
  • Linux操作系统之进程信号
  • 科普文:微服务之Spring Cloud Alibaba消息队列组件RocketMQ工作原理
  • 黑马头条vue2.0项目实战(五)——首页—频道编辑
  • Java:基础语法
  • 安装bedtools详细步骤和详细介绍bedtools用法
  • 21 - grace数据处理 - 补充 - 泄露误差改正 - Slepian局部谱分析法(一) - slepian分析法理论理解
  • WLAN国家码与信道顺从表
  • 行为型设计模式1:状态/策略/命令
  • 【知识专栏丨python数分实战】天猫订单数据分析及可视化|taobao天猫订单接口
  • [kimi笔记]为什么csc.exe不可以双击运行
  • 护眼大路灯哪个牌子好?2024学生护眼大路灯推荐
  • Vue项目中手搓滑动校验模块-demo
  • Socket如何实现客户端和服务器间的通信