【问题标题】:Raspberry Pi 3 USB Bare Metal树莓派 3 USB 裸机
【发布时间】:2018-06-07 05:51:24
【问题描述】:

我正在裸机环境(32 位)中开发新的 Raspberry Pi 3 B+ 板。我有一个适用于较旧的 Pi 1 板的 USB 驱动程序。据我了解,Pi 1 和 Pi 3 B+ 具有相同的 USB 主机控制器(Synopsis DesignWare 2.0 USB 主机控制器;或简称 dwc),但适用于 Pi 1 的 USB 驱动程序不适用于我Pi 3 B+(或 Pi 3 B)。

经过一些调试信息,我发现问题是当DWC枚举设备时,它会尝试读取设备描述符,我猜是板载USB集线器/以太网设备(LAN7515),但它会返回传输错误,因此无法枚举设备。

我的问题是为什么会这样?如果 Pi 1 和 Pi 3 具有相同的主机控制器,那么理论上它至少应该能够正确枚举设备。

如果有人可以为我指出发生这种情况的正确方向,将不胜感激。

提前谢谢你。

【问题讨论】:

  • 我很想知道这个枚举问题的解决方案。我在 GitHub 上看到了一些裸机 USB 存储库(例如 github.com/rsta2/uspi)。我过去曾与裸机 Pi 项目合作过,您认为枚举应该在理论上是正确的,因为 DWC 外围设备没有改变。我的猜测是:您的 Pi 3 驱动程序在初始化过程中有一些怪癖,无法连接设备。

标签: raspberry-pi usb raspberry-pi3 bare-metal usb-hostcontroller


【解决方案1】:

Pi3 存在对齐问题,因为某些 USB 结构本身未对齐并且已打包。它通常需要在一些未对齐的结构上插入一些打包和对齐属性“attribute((packed,aligned(1)))”。

规则是 uint16_t* 指针必须是读/写对齐 2 个地址 uint32_t* 指针必须是读/写对齐 4 个地址

所以像这样的结构是错位的。

struct BadStruct __attribute__((__packed__)){
     uint8_t a;
     uint16_t b;
};

【讨论】:

  • 我可以看到这将如何导致问题。是否有任何结构特别需要具有这些属性?还是只是一般的所有结构?
猜你喜欢
  • 2017-02-04
  • 1970-01-01
  • 2020-09-16
  • 2022-11-14
  • 2018-02-07
  • 2017-03-30
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多