OTG roleswitch(Apple CarPlay)
关于roleswitch驱动层状态机变化流程
插入时的状态
- 车机作为 a_host
- 手机作为 b_peripheral
- 车机枚举手机,完成正常的USB枚举。
roleswitch时的状态
车机发送私有协议(见下图)给手机,通知手机切成 b_host。
此时VBUS仍然是车机供电。手机会一直枚举车机。只要车机状态变更到 a_peripheral,就能枚举成功。
车机触发状态机进行状态机变换,最终切到 a_periphera l状态。
手机枚举车机,完成一次正常的USB枚举。
拔出后的状态
- 车机切回 a_wait_bcon 状态。
- 手机切回 b_wait_acon 状态。
OTG 状态机转换
A Device状态机
B Device状态机
其他
苹果roleswitch私有协议
文档说明
ATS 抓包数据
内核状态机日志开关
一次完整的roleswitch过程日志
1 | 插入手机前 |
内核各种状态的查询方法
1 | root@atlas7-arm:/sys/kernel/debug/ci_hdrc.0# cat otg |
内核个节点含义
1 | https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-platform-chipidea-usb-otg |