跳到主要内容

USB、TF 卡与按键测试

本章测试 USB Device/ADB、USB Host、TF 卡热插拔与板载按键。USB Type-A Host 和 OTG/Device 接口用途不同:U 盘接 Host,主机 ADB 接 Device,插错接口不会自动切换角色。

功能使用的接口或节点通过条件
ADBOTG/Device 口主机显示 device,可 adb pushadb shell
USB HostType-A Host 口外设枚举,U 盘出现分区并可读写
TF 卡TF 卡座插卡自动挂载,拔卡后挂载被清理
按键/dev/input/event*按下和松开均上报事件

准备工作

  • 一根 USB 数据线
  • 一个普通 USB U 盘或读卡器
  • 一张没有重要数据的 TF 卡
  • 已通过串口进入 Linux Shell

USB ADB 测试

使用 USB 数据线连接开发板 OTG/Device 口和 Ubuntu 主机。

Ubuntu 主机执行:

adb devices

设备列表中出现序列号和 device,表示 ADB 连接成功。

上传一个文本文件:

echo 'OmniGate-T153 USB test' > /tmp/t153-usb.txt
adb push /tmp/t153-usb.txt /tmp/
adb shell cat /tmp/t153-usb.txt

板端输出相同文字,说明 USB 数据传输正常。

USB Host 测试

当前固件已启用 USB1 的 EHCI(USB 2.0 High-Speed)和 OHCI(Full/Low-Speed)控制器。插入 U 盘 前,在 开发板 Linux Shell运行:

dmesg -w

把 U 盘插入 Type-A Host 口,预期依次看到 new high-speed USB deviceusb-storagesda 和 分区如 sda1。另一个终端执行:

lsusb
lsblk 2>/dev/null || cat /proc/partitions

一次真实的 U 盘操作记录

插入一只 64 GB USB 存储设备后,内核输出如下。新手只需先找到四类关键词:

usb 1-1.3: new high-speed USB device number 3 using sunxi-ehci
usb 1-1.3: New USB device found, idVendor=14cd, idProduct=1212
usb 1-1.3: Product: Mass Storage Device
usb-storage 1-1.3:1.0: USB Mass Storage device detected
scsi 0:0:0:0: Direct-Access Mass Storage Device
sd 0:0:0:0: [sda] 124735488 512-byte logical blocks: (63.9 GB/59.5 GiB)
sda: sda1
sd 0:0:0:0: [sda] Attached SCSI removable disk
usb 1-1.3: USB disconnect, device number 3
  • new high-speed USB device:Host 控制器已经检测到外设;
  • Mass Storage device:USB 存储驱动已经匹配;
  • [sda]sda1:整盘节点为 /dev/sda,第一分区为 /dev/sda1
  • USB disconnect:拔出动作已经被内核识别。

设备编号 3、拓扑 1-1.3 和磁盘名 sda 都可能变化,不要把这些值写死在脚本里。板载 Hub 的 另一个下行口实测会显示为 1-1.4,这表示换了 Hub 端口,不是出现了第二块磁盘。

若要手动读写:

mkdir -p /mnt/usb
mount /dev/sda1 /mnt/usb
ls -al /mnt/usb
sync
umount /mnt/usb

设备节点可能不是 sda1,必须根据本次插入新增的分区替换。卸载成功后再拔 U 盘。

为什么 lsusb 默认会显示多个设备

Bus 001 Device 001Bus 002 Device 001 通常是 Linux 为 EHCI/OHCI 注册的根 Hub,不是外接 设备。板载 CH334F USB Hub 会再显示为一个设备,插入 U 盘后会出现新的 Device 编号。

本次 ADB 采集时 Host 口没有外接设备,基线输出为:

# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 1a86:8091
Bus 002 Device 001: ID 1d6b:0001

1d6b:0002 是 EHCI 根 Hub,1d6b:0001 是 OHCI 根 Hub,1a86:8091 是板载 CH334F Hub。 这证明 Host 控制器和板载 Hub 已枚举,但仍需插入 U 盘才能验证下行端口、5 V 供电和存储读写。

TF 卡测试

当前板卡 PF6 硬件检测信号不可靠,设备树保留了 PF6 配置注释,并使用 broken-cd 轮询 SD 总线。 因此支持热插拔,但从插拔到日志出现会有短暂延迟。

插入 TF 卡后,在 开发板 Linux Shell执行:

dmesg | tail -n 30
cat /proc/partitions

正常日志应包含 new ... SDXC cardmmcblk1: p1。当前固件会通过 udev 自动挂载第一分区。

本次从实板 dmesg 中读到的一次完整插拔记录为:

mmc1: host does not support reading read-only switch, assuming write-enable
mmc1: new ultra high speed SDR104 SDXC card at address aaaa
mmcblk1: mmc1:aaaa SD64G 59.5 GiB
mmcblk1: p1
exFAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
mmc1: card aaaa removed

这组记录表明识别、分区发现和拔卡检测均发生过。Volume was not properly unmounted 是卡内 exFAT 文件系统上一次未安全卸载的提示,不是本次热插拔检测失败;有重要数据时仍应先运行文件系统检查。

mount | grep mmcblk1
ls -al /mnt/sdcard/mmcblk1p1

通常不需要手动 mount。主动拔卡前仍建议先同步并卸载,避免文件系统损坏:

sync
umount /mnt/sdcard/mmcblk1p1

如果直接拔卡,热插拔脚本会做延迟卸载,但它无法保证刚写入缓存的数据不丢失。出现:

exFAT-fs (mmcblk1p1): Volume was not properly unmounted

表示这张卡上一次没有正常卸载。只读测试通常可以继续,但有重要数据时应在电脑上运行文件系统 检查;不要长期忽略该提示。拔卡后还持续出现 cmd 13, RTO 时,轮询最终应识别 card removed 并停止,若长时间不停再保存完整日志排查。

按键测试

查看输入设备:

cat /proc/bus/input/devices
ls -l /dev/input/event*

当前设备树定义了 Power、Volume Up、Volume Down 按键。根据 Handlers= 找到实际事件节点,然后执行:

od -Ax -tx1 /dev/input/event0

event0 只是示例,必须替换成 /proc/bus/input/devices 中对应按键的 Handlers= 节点。按下和 释放时终端出现新的事件数据,说明输入正常。按 Ctrl+C 结束测试。

一次真实的按键操作记录

先查看输入设备,实测按键设备和触摸设备会同时出现:

# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-gpadc1/channel6/input0"
H: Handlers=event0
B: EV=100003
B: KEY=800 c0000 0 0 0

I: Bus=0018 Vendor=0416 Product=03c7 Version=1060
N: Name="Goodix Capacitive TouchScreen"
H: Handlers=event1

NameHandlers 可知,本次按键对应 /dev/input/event0,Goodix 触摸屏对应 event1。 因此本次执行:

# cat /dev/input/event0 | hexdump
0000000 3f5a 0000 52cb 000a 0001 0073 0001 0000
0000010 3f5a 0000 52cb 000a 0000 0000 0000 0000
0000020 3f5a 0000 3f00 000c 0001 0073 0000 0000
...
^C

每次按下和松开都有新行,说明驱动已经上报输入事件。十六进制内容不适合人工直接识别键名; 这里的目标只是确认按键有事件。若系统带 evtest,使用 evtest /dev/input/event0 会显示更 直观的事件类型、键值和按下/释放状态。

测试通过标准

功能通过条件
USB ADB主机能识别设备,文件上传后板端读取内容一致
USB Host外设枚举,存储分区可以挂载、读取并安全卸载
TF 卡插卡产生内核日志并自动挂载,拔卡后挂载点被清理
按键按下和释放时对应 event 节点持续产生输入事件

ADB 不识别时先确认连接的是 OTG/Device 口以及当前固件已启用 Gadget;USB Host 插入无反应时 检查 ehci1ohci1 和 5 V 供电;TF 卡测试禁止直接格式化包含重要数据的卡;按键无事件时 根据 /proc/bus/input/devices 重新确认节点。