触发pullup D - 这个为什么通讯就能正常了呢?
触发pullup D-电压降为 0V相当于在不重启机器的前提下给母 设备 和子 设备 的USB 软件协议栈做了一次“彻底的重启复位”我们可以用最通俗的语言从子 设备和母 设备两个视角来解释为什么触发了这个通讯立马就正常了1. 对【子 设备Device 侧】的作用彻底“解毒”清空卡死在触发pullup D-之前子 设备 的内核里全是“陈年垃圾”ConfigFS 处于半绑定半崩溃状态之前发送失败、卡在内存里的串口缓存数据塞满了缓冲区联发科驱动的唤醒锁ssusb.wakelock死锁着。一旦触发pullup D-降为 0V子 设备 的 Linux 内核udc-core驱动会强制清空所有卡死的 Endpoint端点缓冲区释放死锁的唤醒锁把 ConfigFS 逻辑重置归零。效果子 设备 侧的“死锁和内存垃圾”被一扫而空恢复成了刚开机时的纯净状态2. 对【母 设备Host 侧】的作用强行销毁“死句柄”重新枚举在触发pullup D-之前母 设备 以为子 设备早就坏掉了母 设备 内核里的那个/dev/ttyACM0串口句柄其实已经变成了一个毫无反应的“死句柄”假死。一旦触发pullup D-降为 0V随后pullup D升为 3.3V母 设备 看到 0V母 设备 的 Linux 内核立刻触发拔线逻辑彻底销毁并释放掉那个已经假死的旧/dev/ttyACM0节点。母 设备 看到 3.3V母 设备以为插进来一台全新的设备触发标准USB 重新枚举Re-enumeration。母 设备 读取子 设备 纯净的新描述符在/dev/下重新生成一个崭新、畅通无阻的/dev/ttyACM0串口节点母 设备的 设备 软件重新打开这个新节点数据流瞬间畅通 形象的比喻挂电话与重拨不触发pullup D-时就像两人的电话线已经断线卡死了但两人都还把听筒贴在耳朵上发呆。子 设备 在对着死电话喊“12345”母 设备 听不到喊再多也没用。触发pullup D--pullup D就像子 设备 主动**“咔哒”一声把电话挂断pullup D-然后重新拨号打过去pullup D**。双方重新接通了一条全新的电话线通讯自然 100% 恢复正常