以前在解BIOS中USB KBC emulator问题的时候,研究过一段时间USB协议和BIOS中USB code。也只是该大概! 随着时间的推移,已经忘记的差不多了。现在又开始study一下,以便稳固+温故+知新!
这次就沿着以前的一些记忆,采用‘分而治之,各个击破’的原则,将usb协议拉出几个疑点,再点到线、线到面的梳理usb协议。
所以,在研究usb协议框架的时候,列举出下面几个问题,后续就沿着这些问题逐个的解读usb 协议。至于其他细节,需要更多的时间去研读spec和source code。
1、学习usb协议的简述和软件体系结构,可以在网络上查到很多资料。当然usb spec是关键。
2、usb硬件上的概念:比如四线、D+、D-的差分传输和编码方式NRZI。
3、usb的逻辑拓扑结构:HC、BUS、Hub、Device等。
4、四种传输(transfer)的概念和区别。
5、usb transaction(事务)的概念、组成和基本工作流程。
6、usb packet的分类和组成,分别了解各个字段的意义。联想到TCP/IP中的packet概念和组成。
7、USB设备的描述符:device、interface、config、endpoint、string等描述符的数据结构。可以那一份Linux驱动中的usb.h文件看。
8、USB标准和特殊的设备请求方式。比如:清除请求、获得描述符、设置地址、设置状态。
9、USB 插入设备的检测和配置过程。hub_event/event_list等。
10、UHCI/EHCI的register说明。io register或者memory register。包括usb cmd、status、和frame list point、framebaseaddress。
11、具体的submit_control_msg 实现过程。可以找一份简单的code看,uboot中的ehci-hcd.c貌似比较简单。
12、USB传输的数据结构:比如QH、TD的结构和关联性。这个在usb controller的spec中可以看到,框架图便于理解结构。比较uhci和ehci的区别。
另外,UHCI、EHCI中涉及到的Debug 模式,可以尝试单步调试。但是BIOS中有smi来实现usb功能,不好弄。