Android 2.3.7移植USB Accessory驱动初探

需积分: 12 30 下载量 5 浏览量 更新于2024-08-13 收藏 58KB PPT 举报
"本文主要介绍了如何进行Android USB Accessory的移植工作,特别是在Android 2.3.7版本上的实践过程。作者首先从Android 4.0的代码开始研究,因为该版本的USB Accessory功能已经相对成熟。然而,实际目标平台是基于Android 2.3.7的ATB1005电路板,因此需要对内核进行相应的修改和移植。" 在Android USB Accessory移植的过程中,作者遇到了以下关键步骤和问题: 1. **代码研究**:作者开始从Android 4.0的源码中学习USB Accessory的功能实现,尽管此版本的代码较为完善,但由于实际使用的是Android 2.3.7,因此4.0的代码只能作为参考。 2. **内核驱动缺失**:在ATB1005的内核代码中未找到USB Accessory的驱动。考虑到可能是版本差异,作者查阅了Android 4.0(内核3.0.8)的代码,发现官方已支持USB Accessory。 3. **移植内核驱动**:作者得到了一个名为`f_accessory.c`的内核驱动文件,将其放入`drivers/usb/gadget`目录下,并相应地修改了`Kconfig`和`Makefile`,完成初步的移植。 4. **编译问题**:在编译过程中遇到头文件`linux/f_accessory.h`缺失以及结构体元素名称变化的问题(如`hidden`变为`disabled`)。通过修改解决了这些问题,使编译得以通过。 5. **功能实现**:在修复编译问题后,虽然能通过编译,但功能并未正常实现。为了解决这个问题,作者修改了`arch/arm/mach-xxx/board-device.c`,添加了关于USB Accessory的描述,使得功能看似可以实现。 6. **调试与问题**:在替换内核并重启后,系统并未按照预期弹出对话框或应用。作者通过分析framework代码和检查uevent日志,发现没有正确的uevent被触发。对比Android 4.0和OK6410的内核,发现可能的原因是设备注册时机和uevent触发条件的不同。 7. **问题分析与解决**:作者注意到在Android 4.0中,只有在与USB Accessory设备成功通信后才会注册设备并发送uevent。而在当前移植的内核中,可能缺少了这个关键步骤。因此,需要进一步分析`android_enable_function`函数,寻找触发change事件的方法。 整个移植过程展示了Android USB Accessory在不同版本间的兼容性挑战,以及在实际硬件平台上的适配问题。作者通过逐步分析、比对代码和调试,力求在Android 2.3.7上实现USB Accessory功能。这为其他开发者提供了关于Android系统USB Accessory移植的宝贵经验和参考。