28、bus_mA:记录的是能够从总线上获得的电流,毫无疑问就是咱们前面算出来的 hub 上的那个 mA_per_port.
level,级别,表征 usb 设备树的级连关系.Root Hub 当然其 level 就是 0,其下面一层就是level 1,再下面一层就是 level 2,依此类推.
29、device_qualifier描述符
在高速和全速下有不同设备配置信息的高速设备必须具有一个 device_qualifier描述符 ,它描述了一个高速设备在进行速度切换时所需改变的信息.比如,一个设备当前工作于全速状态,那么 device qualifier 中就保存着信息记录这个设备工作在高速状态的信息,反之如果一个设备当前工作于高速状态,那么device qualifier中就包含着这个设备工作于全速状态的信息.
30、设备号:
dev_t记录下了设备的主设备号和次设备号.即,dev_t 包含两部分,主设备号部分和次设备号部分.高 12 位表征主设备号,低 20位表示次设备号.
31、hub驱动的使命:
device_add(),Linux 2.6设备模型中最基础的函数之一,这个函数非常了不起.要深入追踪这个函数,足以写一篇专题文章了.这个函数来自 drivers/base/core.c 中,是设备模型那边提供的函数,从作用上来说,这个函数这么一执行,系统里就真正有了咱们这个设备,/sysfs 下面也能看到了,而且将会去遍历注册到 usb 总线上的所有的驱动程序,如果找到合适的,就去调用该驱动的probe函数;
对于U盘来说,最终将调用storage_probe()函数,对于hub来说,最终将调用hub_probe()函数,而传递给它们的参数,正是我们此前获得的struct usb_interface指针和一个 struct usb_device_id 指针.后者我们在 usb-storage 里面已经非常熟悉了,它正是我们在usb总线上寻找驱动程序的依据,换句话说,每个驱动程序都会usb-storage那样,把自己支持的设备定义在一张表里,表中的每一项就是一个 struct usb_device_id,然后当我们获得了一个具体设备,我们就把该设备的实际的信息与这张表去比较,如果找到匹配的了,就认为该驱动支持该设备,从而最终会调用该驱动的probe()函数.而从此,这个设备就被传递到了设备驱动.而hub驱动也完成了它最重要的一项工作.
32、电源管理
主流的技术有两种,APM 和 ACPI
APM:Advanced Power Management,高级电源管理,
ACPI:Advanced Configuration and Power Interface,高级配置和电源接口
电源管理的含义是什么:省电
众所周知,电源管理最重要的两个概念就是 suspend 和 resume,即挂起和恢复. 总的来说,suspend这个过程就是,上级下命令通知driver,driver保存状态,然后执行命令.即 notify before save state;save state before power down.而 resume 这个过程则是,power on and restore state.
STR 和 STD,这是两种Suspend 的状态.STR即Suspend to RAM,挂起到内存,STD 就是Suspend to Disk,挂起到磁盘.STR 就是把系统进入 STR 前的工作状态数据都存放在内存中去.在 STR 状态下,电源仍然继续为内存和主板芯片组供电,以确保数据不丢失,而其它设备均处于关闭状态,系统的耗电量极低.一旦我们按下 Power 按钮,系统就被唤醒,马上从内存中读取数据并恢复到 STR 之前的工作状态,STR 的优点是休眠快唤醒也快,因为数据本来就在内存中.而 STD 则是把数据保存在磁盘中,很显然,保存在磁盘中要比保存在内存中慢.
ACPI 的状态一共有五种,分别是 S1,S2,S3,S4,S5,实际上 S4 就是 STD,而 STR 就是 S3,只不过 S1,S2,S3 差别不大,不过,在 Linux 中,S1 被叫做 Standby,而 S3 被叫做 STR.而 S5就是 Shutdown.在 Linux 中说挂起,主要说的就是 S1,S3 和 S4.
到这里,hub驱动基本上看完了,其实hub做的事情很简单就是为设备做一系列的初始化工作,最后调用设备通过的proble函数。