USB 3.0 驱动 (2)

时间:2024-03-01 13:28:17

在PC机上,USB 3.0的控制器标准就是xHCI (extensible-host-controler-interface),该标准开放,网上下载就可以查看 (尽管版本挺多)。

在实际的实现中,第一步自然是发现xhci,xhci作为一个PCI总线上的设备,自然与上一代控制器标准ehci的过程是一样的。总线枚举即可,因此,没什么可说的。

发现xhci控制器后,接下来就是对控制器进行初始化,初始化的步骤在xhci手册中描述的很清楚。

 

 初始化完毕之后,就要与xhci进行交互,交互的意思也就是来往,优先级高的当时是要先能够收到xhci的讯息。这里我打算首先能够收到设备热插拔的中断作为开始。

将代码写完,编译生成镜像,安装到u盘中,上电PC。嗯,不出所料,没有中断,美滋滋。

 

增加打印信息,好像没什么头绪,但是偶尔(概率性)会收到一下中断,有时候又收不到,中断在捉迷藏。。。

 问题来了,重新阅读手册。就是觉得有点奇怪,以前的ehci控制器初始化的时候会要求操作系统与pre-os协商控制器的使用权。xhci的手册里却不是必选项?

在没有协商控制权的情况下,唯一的硬件到底由谁来控制呢?难道不协商,xhci也是可以工作的?再好好翻翻手册,i love usermanual。。。

没找到【

此时我剩下的选择不多了,还可以尝试的是那个不怎么用的台式机,台式机与我经常使用的笔记本电脑的区别在于,台式机是一个主板中只有xhci作为usb控制器,而笔记本的年代较老,主板中同时包含xhci和ehci。

操作一

在使用笔记本电脑运行时,实测xhci的extended capabilities中是没有用于协商控制权的USBLEGSUP字段的,毕竟是可选项,就是这么任性,没有!

然而台式机的xhci却包含了用于协商控制权的寄存器字段。。。。

操作二

到底需不需要协商控制权?干脆做个实验,枚举发现xhci控制器,看看默认的xhci控制器是什么状态。。。

笔记本和台式机都是运行态!

操作三

干脆做个实验,枚举发现xhci控制器,先将其停止工作看看会发生什么。

笔记本无事发生。。。。

操作四

台式机的xhci在停止之后,我的usb键盘就无法响应了,原本是可以响应键盘输入的(我采用的是ps2的方式驱动键盘)。这说明系统启动了,bios默认仍然在工作,且支持xhci并将usb键盘模拟为ps2的。不经过协商就直接使用,必然造成资源的使用冲突。

增加协商功能,中断如期而至!

 

 遗留问题:

笔记本电脑的主板同时存在ehci和xhci,默认情况下,xhci并不控制物理端口,所有的端口都是有ehci控制器掌管的。intel的一些主板型号支持通过操作xhci寄存器来完成端口的切换,但切换到xhci控制器下之后,不能协商控制权,目前仍然不知道怎么回事(升级bios?)。

希望有大神解答