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

sam9x60 USB驱动适配(一)

通过mplab添加harmony框架提供的sam9x60的usb驱动,总比自己适配tinyUSB之类的要快嘛

然后就发现遇到第一个坑。仅添加usb host layer 驱动后编译就报错了

volatile uint32_t * interruptList = hDriver->hcHCCA->hccaInterruptTable; 

说它
drv_usb_ohci.c:142:41: error: taking address of packed member of 'struct USB_OHCI_HCCA' may result in an unaligned pointer value
以及后面凡是对这个hcHCCA->hccaInterruptTable 进行32位指针化都会报这个错。

原因是它的结构体定义USB_OHCI_HCCA ,是添加了__attribute__((packed)) 修饰符的。
导致结构体成员可能没有按照自然对齐要求排列,直接获取 hccaInterruptTable 成员的地址会产生未对齐指针。

typedef struct __attribute__((packed)) USB_OHCI_HCCA
{volatile uint32_t hccaInterruptTable[32];volatile uint16_t hccaFrameNumber;volatile uint16_t hccaPad1;volatile uint32_t hccaDoneHead;volatile uint8_t  reserved[116];} USB_OHCI_HCCA;

这是因为大多数CPU要求特定类型的数据必须存储在特定地址上(例如32位数据必须存储在4字节对齐的地址上),而USB OHCI控制器的硬件通信区域定义,它们的内存布局必须与硬件规范完全一致。
这些结构体是硬件寄存器的直接映射,任何内存布局的变化都可能导致与硬件通信失败。使用 attribute((packed)) 修饰的结构体,编译器会压缩存储,不考虑自然对齐要求。
于是进行32位指针化时错误就发生了。

解决方案有多种,反正都是ai给的,我只说说能编译的。
第一个,获取的时候计算成员地址。
volatile uint32_t * interruptList = (volatile uint32_t *)((uint32_t)hDriver->hcHCCA + offsetof(USB_OHCI_HCCA, hccaInterruptTable));
方案特点:

  • 保持了结构体的 packed 布局(与硬件兼容)
  • 使用 offsetof 宏安全计算成员地址,避免未对齐访问
  • 不改变硬件通信区域的内存布局,确保系统稳定性
  • 是处理packed结构体成员访问的标准做法

第二种修改结构体成员 hccaInterruptTable 的对齐属性,给它单独添加修饰符

typedef struct __attribute__((packed)) USB_OHCI_HCCA
{volatile uint32_t hccaInterruptTable[32] __attribute__((aligned(4)));volatile uint16_t hccaFrameNumber;volatile uint16_t hccaPad1;volatile uint32_t hccaDoneHead;volatile uint8_t  reserved[116];} USB_OHCI_HCCA;

既能保留结构体其他成员的紧凑排列(packed 作用),又能强制该成员 4 字节对齐,彻底消除警告。

此外还有些需要特定编译器(gcc等,但我这是microchip的xc32编译器,我就不试了)
目前我选择第二个方案,单独给数组成员hccaInterruptTable添加修饰符使其对齐4k。能编译就行。

吐槽,这个是芯片官方框架提供的usb驱动的最新版本,当然我看了下前几个版本也是这个样子的。也不知道他们是怎么编译通过然后上传的。
如果是因为他们内部开发人员用的付费版编译器,那我真是无语了。
还有这个驱动能编译了也不代表能用,目前压根初始化不了,调试发现就是卡死在这个host layer 的初始化阶段。慢慢再继续给阿三擦屁股吧。

http://www.jsqmd.com/news/122216/

相关文章:

  • Laravel 中 Http::get() 默认同步,切勿在循环中直接使用!
  • 杰理之通过earphone端按键无法恢复播放的问题处理【篇】
  • AI智能客服机器人哪个品牌好?2025年最新技术趋势与五大实力厂商推荐 - 十大品牌推荐
  • 2025年年终济南家电搬运公司推荐:深度评测报告与关键指标对比分析 - 十大品牌推荐
  • vxe-table 如何给分组表头下方的每一列增加一个筛选框
  • 杰理之mic 数据到PCmic 录音这一音频流无数据解码【篇】
  • LangFlow与Google Docs联动编辑AI生成内容实测
  • 2025年全球市场证明公司TOP5权威推荐榜:基于服务案例与资质覆盖的深度解析 - 十大品牌推荐
  • 10.17
  • 2025创新型文旅业务中台厂商TOP5权威推荐:数字化转型核心引擎 - 工业推荐榜
  • sam9x60 tcp协议栈 小记
  • Open-AutoGLM输入法频繁崩溃?3步精准定位并修复切换异常
  • 2025年靠谱宁波农家乐厨房装修、厨房装修翻新公司排行榜 - myqiye
  • 【Open-AutoGLM输入法异常处理指南】:99%开发者忽略的5大切换故障根源揭秘
  • 揭秘Open-AutoGLM缩放卡顿真相:5个常被忽略的触发条件与解决方案
  • 如何选择靠谱的全球市场证明公司?2025年最新避坑指南及五大权威机构推荐 - 十大品牌推荐
  • 风琴过滤纸生产商哪家好?多维度为你剖析 - mypinpai
  • 揭秘Open-AutoGLM特殊符号输入失败:99%开发者忽略的底层机制
  • 2025年年终济南家电搬运公司推荐:服务排行深度解读与关键指标对比 - 十大品牌推荐
  • Open-AutoGLM输入法切换卡顿问题深度剖析(工程师私藏排错手册)
  • 2025年年终济南家电搬运公司推荐:专业榜单排行与多维度服务对比分析 - 十大品牌推荐
  • 深度学习——神经网络 - 实践
  • LangFlow中的条件分支节点如何配置?逻辑控制进阶教学
  • LangFlow在高校教学中的应用前景:AI课程实验平台搭建
  • 2025年高性价比短视频代运营公司排行榜,专业服务商推荐 - 工业推荐榜
  • 【Open-AutoGLM文本修复终极指南】:5步彻底解决输入重复顽疾
  • Open-AutoGLM输入异常终极解决方案(工程师私藏修复手册)
  • 2025年资深技术顾问推荐:当前最值得关注的五大AI智能客服机器人品牌全景报告 - 十大品牌推荐
  • 2025年机油供应商靠谱推荐,口碑好的汽轮机油机油源头厂家有哪些? - myqiye
  • 2025年年终成都管道疏通推荐:专业排行解析与多维度服务对比评测 - 十大品牌推荐