|
|
我先确认这次“等两分钟仍无 U 盘”时,系统 USB 拓扑里到底有没有 hub 端口、U 盘端口状态。现在不写控制项,只读 /sys 和 dmesg。
我查到关键点了:这次等 2 分钟后系统里只有 USB hub、USB 转串口和 USB 网卡,没有 U 盘对应的 2-1.2 设备,也没有 /dev/sda1。也就是说 U 盘所在 hub 端口没有枚举。
我不会再动 EHCI/OHCI 控制器。现在只检查 hub 的单独端口控制能力;如果系统支持只复位 U 盘那个端口 2-1.2,就可以不影响 USB 转串口。先只读检查。
我继续做“只针对 U 盘所在 hub 端口 2,不碰整个 EHCI/OHCI 控制器”的方案。先确认系统有没有 lsusb、usbfs 节点和 hub 描述信息,看能不能安全地只复位 hub 的 2 号端口。
现在已经确认:U 盘应在内置 USB Hub 的 2-1.2 端口;开机时这个端口没有枚举设备,拔插后才出现。下一步我只尝试“复位 Hub 的 2 号端口”,不复位 EHCI/OHCI,不影响 1 号口的 USB 转串口。先检查系统是否有可用的 usbfs 控制节点。
我继续做“只复位 Hub 的 U 盘端口 2”的修复,不再动 EHCI/OHCI。这个操作目标是 /dev/bus/usb/002/002 这个内置 Hub 的 2 号端口,理论上不影响 1 号口的 USB 转串口和 4 号口网卡。先编一个很小的 ARM 工具测试端口 2 上电/复位。
准备测试 Hub 2 号端口复位。这个只作用于内置 Hub 的 2 号端口,也就是 U 盘应在的端口;我会立刻检查 USB 转串口 /dev/ttyACM0 是否仍在。如果有异常就停止。
我测试了“只复位内置 Hub 的 U 盘端口 2”,没有影响 USB 转串口,但也没有让 U 盘枚举出来。说明这个 Hub/端口在当前状态下没有把“已插入 U 盘”的连接状态上报给内核;软件层面的安全复位没有触发到它。
我再读一下 Hub 端口状态位,确认端口 2 是否认为有设备连接。
我进一步确认了,这次不是挂载问题,也不是程序没有检测到 /dev/sda1。
当前开机等待 2 分钟后,系统状态是:
USB 转串口正常:/dev/ttyACM0 存在;
内置 USB Hub 正常;
USB 网卡正常;
但是 U 盘所在的 Hub 端口没有检测到连接。
我读取了内置 Hub 各端口状态:
端口 1:有设备,正常启用 —— USB 转串口;
端口 2:供电是开的,但 connection=0 —— U 盘所在端口没有检测到设备;
端口 4:有设备,正常启用 —— USB 网卡;
端口 2 单独复位后,仍然 connection=0,U 盘没有枚举。
也就是说:
插着 U 盘开机时,Hub 的 2 号口没有检测到 U 盘连接。拔插后才产生连接变化,系统才枚举出 U 盘。
这已经低于 Qt 程序挂载层。20260525_1620 只要系统出现 /dev/sda1,就能自动挂载;但现在问题是开机时 Hub 端口没有上报 U 盘连接。
我目前认为可行的修复只剩一个方案:
方案:程序启动早期只重置内置 USB Hub 一次
不是重置 EHCI/OHCI 控制器,而是只对内置 Hub 2-1 做一次重新枚举。
这会瞬间影响 Hub 下的设备:
USB 转串口;
USB 网卡;
U 盘端口。
但如果放在程序刚启动、串口打开之前执行,风险比之前小很多。流程是:
程序启动;
延时几秒;
只对内置 Hub 2-1 做一次重新枚举;
等待 USB 转串口、U 盘、网卡重新出现;
再启动串口通信;
检测 /dev/sda1 并自动挂载。
这个方案可能会让启动过程多等 8~15 秒,但有机会解决“插着 U 盘上电不识别”。
需要注意:这个方案会短时间断开 USB 转串口和 USB 网卡,所以我不建议在程序运行中周期执行,只能开机启动早期执行一次。
请确认是否允许我继续做这个版本。
如果确认,我会做成:
版本:20260525_1630
只启动早期执行一次 Hub 重新枚举;
不再碰 EHCI/OHCI;
不周期重置;
串口启动延后,避免运行中断串口;
保留 1620 的安全自动挂载和故障文件补同步逻辑。 |
|