Linux USB驱动实验:鼠标、键盘、U盘及OTG功能测试全流程
一、USB鼠标与键盘测试(基于HID输入子系统)
1. 内核配置前提
需确保Linux内核已开启关键驱动:进入`make menuconfig`,在`Device Drivers`中依次开启`Input device support`下的`USB HID support`,以及`USB support`下的`Support for Host-side USB`,部分内核还需使能HIDRAP和UHID(通常默认集成),配置完成后编译生成zImage并启动开发板。
2. USB鼠标测试实操
- 插入USB鼠标后,串口会打印识别日志,例如提示检测到罗技鼠标,并生成输入子系统设备节点,路径为`/dev/input/eventX`(X为动态序号,以日志为准)。
- 验证驱动有效性:执行`hexdump /dev/input/eventX`,移动鼠标或点击按键,终端会持续输出十六进制原始数据,证明鼠标驱动正常;后续移植QT等GUI图形库后,可直接调用该设备实现鼠标交互。
- 常见问题排查:部分鼠标会出现闲置自动断开重连的情况,持续使用(如保持hexdump读取或在GUI中持续操作)可避免该问题,无需额外配置。
3. USB键盘测试实操
- 核心配置:修改开发板根文件系统的`/etc/inittab`,添加`tty1::askfirst:-/bin/sh`配置,让LCD屏幕作为终端控制台。
- 激活流程:重启开发板后,屏幕会提示“Please press Enter to activate this console”,插入USB键盘并按下回车键,即可激活LCD终端,直接通过键盘输入Linux命令操作开发板,无需依赖串口调试。
二、U盘挂载实验(基于USB Mass Storage与SCSI协议)
1. 内核配置要求
U盘依赖SCSI协议和USB大容量存储驱动,需在`make menuconfig`中完成两步配置:
- 开启SCSI磁盘支持:进入`Device Drivers → SCSI device support`,勾选`SCSI disk support`;
- 开启USB大容量存储:进入`Device Drivers → USB support`,勾选`USB Mass Storage support`,配置完成后重新编译内核并启动。
2. 测试实操与注意事项
- 硬件与格式要求:U盘需格式化为FAT32格式,NTFS和exFAT因版权问题,Linux支持不完善,易出现只读、无法识别等问题;将U盘插入开发板的USB HUB扩展口后,内核会打印识别日志,生成设备节点`/dev/sda`(U盘整体)和`/dev/sda1`(U盘分区)。
- 挂载与访问:创建挂载目录`mkdir -p /mnt/usb_disk`,执行挂载命令`mount -t vfat /dev/sda1 /mnt/usb_disk/ -o iocharset=utf8`,其中`-o iocharset=utf8`可避免中文文件名乱码;挂载后进入目录,通过`ls`命令即可查看U盘文件。
- 安全卸载流程:先执行`sync`同步数据,避免硬件缓存丢失;再退出挂载目录(`cd /`),最后执行`umount /mnt/usb_disk`卸载,防止提示“设备忙”导致卸载失败。
三、USB OTG双模式实验(主机/从机切换)
1. 设备树配置(核心前提)
以正点原子I.MX6ULL-ALPHA开发板为例,OTG的ID引脚为GPIO1_IO00,默认工作主机模式需配置为下拉电平。打开设备树`imx6ull-alientek-emmc.dts`,在`iomuxc`节点的`pinctrl_hog_1`子节点中,添加该引脚的复用与电气属性配置,确保OTG默认处于主机模式,配置完成后编译dtb文件并重启开发板。
2. OTG主机模式测试
无需额外操作,直接在开发板的OTG HOST接口插入鼠标、键盘或U盘,测试流程与前文USB主机测试完全一致;注意不可使用Mini OTG线外接设备,需直接插入板载OTG HOST接口,避免硬件电路不兼容。
3. OTG从机模式测试(开发板作为USB外设)
从机模式通过USB Gadget框架实现,支持模拟U盘和USB声卡两个核心实验,需将驱动编译为模块动态加载。
- 模拟U盘实验
- 内核配置:在`make menuconfig`中,进入`Device Drivers → USB support → USB Gadget Support`,勾选`USB Gadget Drivers`和`Mass Storage Gadget`,编译后生成`libcomposite.ko`、`usb_f_mass_storage.ko`、`g_mass_storage.ko`三个模块。
- 实操流程:将三个模块拷贝至开发板`/lib/modules/4.1.15/`目录,用Mini USB线连接开发板OTG口与电脑;开发板插入U盘,依次加载模块:先`insmod libcomposite.ko`,再`insmod usb_f_mass_storage.ko`,最后`insmod g_mass_storage.ko file=/dev/sda1 removable=1`,其中`file`参数指定U盘分区作为存储介质,`removable=1`模拟可拔插U盘;加载成功后,电脑会识别出新U盘,读写操作直接作用于开发板上的U盘,卸载时执行`rmmod g_mass_storage.ko`即可。
- 关键限制:不可将开发板的EMMC或NAND作为模拟U盘的存储区域,因其文件系统为EXT3/EXT4/UBIFS,与Windows不兼容,会导致电脑弹窗提示格式化。
- USB声卡实验
- 内核配置:在Gadget框架下,勾选`Audio Gadget`和`UAC 1.0 (Legacy)`,编译生成`libcomposite.ko`、`usb_f_uac1.ko`、`g_audio.ko`三个模块。
- 实操流程:将模块拷贝至开发板对应目录,连接Mini USB线后,依次加载三个模块;加载完成后,电脑会识别出USB音频设备,将系统音频输出切换至该设备,即可通过开发板板载音频解码芯片播放声音,实现外置USB声卡功能。
四、核心排查与避坑要点
- 设备无识别日志:优先检查USB硬件接线、内核驱动是否编译进内核、设备树USB节点配置是否正确。
- U盘挂载失败:确认U盘为FAT32格式,挂载命令需指定`-t vfat`参数,同时添加`iocharset=utf8`解决中文乱码。
- OTG从机模块加载失败:严格按顺序加载模块,先加载核心库,再加载功能函数,最后加载主驱动,不可颠倒顺序。
- 键盘无法激活终端:检查`/etc/inittab`的tty节点与屏幕匹配,确认键盘驱动已加载,同时确保LCD终端配置正确。