12、events:(通过ps –el查看)
events被叫做工作者线程,或者说 worker threads,更确切的说,这些应该是缺省的工作者线程.而与工作者线程相关的一个概念就是工作队列,或者叫 work queue.
工作队列的作用:是把工作推后,交由一个内核线程去执行,更直接的说就是如果您写了一个函数,而您现在不想马上执行它,您想在将来某个时刻去执行它,那您用工作队列准没错.您大概会想到中断也是这样,提供一个中断服务函数,在发生中断的时候去执行,没错,和中断相比,工作队列最大的好处就是可以调度可以睡眠,灵活性更好.
其实:工作队列就相当于一个定时器,你给你的程序设置一个时间,当到达这个时间的时候你就去执行你的函数即可;
Linux 内核中工作队列机制提供的接口,两对函数
INIT_DELAYED_WORK() 对 schedule_delayed_work(),(有延时操作,相当于把定时器时间设置成delaytime 不为0)
INIT_WORK() 对 schedule_work(). (无延时,定时器时间设置成0即可)
关于工作队列机制,咱们还会用到另外两个函数,它们是 cancel_delayed_work(struct delayed_work *work)和 flush_scheduled_work().
cancel_delayed_work:对一个延迟执行的工作来说,这个函数的作用是在这个工作还未执行的时候就把它给取消掉
flush_scheduled_work:以消除所谓的竞争条件,防止混乱;
一般调用了cancel_delayed_work以后都会调用flush_scheduled_work来防止工作队列发生混乱;
13、获取hub descriptor
hub spec 规定 GET_DESCRIPTOR 这个请求的 wValue 就该是Descriptor Type 和 Descriptor Index,wValue 作为一个 word,有 16 位,所以高 8 位放Descriptor Type,而低 8位放Descriptor Index,(由上图二可知index应该为0,)所以对于hub descriptor来说,wValue就是高8位表示Descriptor Type,而低8位设成0就可以了.这就是为什么”<< 8 ” 了;
解释如下:
bDescLength:描述符长度,应该是小于等于9个字节;
bDescriptorType:上面已经讲过了;
bNbrPorts:它代表 Number of downstream facing ports that this hub supports,就是说这个hub 所支持的下行端口;
bHubContrCurrent 是 Hub 控制器的最大电流需求;
DeviceRemoveable 是用来判断这个端口连接的设备是否是可以移除的,每一个bit 代表一个端口,如果该 bit 为 0,则说明可以被移除,为 1,就说明不可以移除;
wHubCharacteristics:有不同的设置,具体请看协议书
14、TT电路:
它就负责高速和低速/全速的数据转换,于是,如果一个高速设备里有这么一个 TT,那么就可以连接低速/全速设备,如不然,那低速/全速设备没法用,只能连接到 OHCI/UHCI 那边出来的 hub 口里.
tt 分类:一种是 single tt,一种是 multi tt.前者表示整个 hub 就是一个 TT,而 multi tt 表示每个端口都配了一个 TT. 大多数 hub 是 single TT;
对于high speed的hub,其 bDeviceProtocol 为 1 表示是 single tt 的.为 2 表示是 multiple tt ;
对于 full/low speed 的 hub,其 device descriptor中的bDeviceProtocol 为0,而 interface descriptor中的bInterfaceProtocol 也为0.
而对于 high speed 的 hub,其中,single TT 的 hub 其 device descriptor 中的 bDeviceProtocol 是 1,而interface descriptor 的 bInterfaceProtocol 则是 0.
然而,multiple TT hub 另外还有一个 interface descriptor以及相应的一个endpoint descriptor,它的device descriptor的 bDeviceProtocol 必须设置成 2.其第一个 interface descriptor 的 bInterfaceProtocol 为 1.而第二个 interface descriptor 的
bInterfaceProtocol则是2.hubs只有一个interface,但是可以有两种setting.usb_set_interface就是把这个interface(interface 0)设置成setting 1.因为默认都是setting 0.
15、TT think time
TT 在处理两个低速/全速的交易之间需要一点点时间来缓冲.这个最大的间隔就叫做 TT think time;
单位是 FS bit time,我们知道 FS 就是 Full Speed,其速度是12Mbps,其实也就是 1200 0000bps,8 FS bit time 就是 8bits / 1200 0000 bits per second,即约等于 666ns.
16、电流power_budget:
对于root hub:
通常来讲,计算机的 usb 端口可以提供 500mA 的电流,不过 host controller 那边有一个成员power_budget,在 host controller 的驱动程序中,root hub 的 hdev->bus_mA 被设置为500mA与power_budget中较小的那一个;
power_budget 是一个 host controller 自己提供的,它可以是0,如果是 0,表示没有限制.所以我们这里判断是不是等于 0,或者是不是大于等于 500mA,如果是的,那么就设置hub->mA_per_port 为 500mA,mA_per_port 就是提供给每一个 port 的电流.那么如果说bus_mA是0到500之间的某个数,那么说明这个hub没法提供达到500mA的电流,就是host controller那边提供不了这么大的电流,那么hub->mA_per_port就设置为hdev->bus_mA;
hub->limited_power这么一个标志位设置为1,表明电流做了限制;
外部hub:
外接的 hub 有两种供电方式:自己供电和请求总线供电;
在usb端口上,最小的电流负载就是 100mA,这个叫做单元负载(unit load);
17、hub传输方式:control/interrupt,而最有特色的正是它的中断传输
hub里面的中断端点一定是 IN的而不是 OUT 的;(device to host)
18、微帧/帧:
早年,提到usb协议,人们会提到frame,即帧,改革开放之后,出现了一个新的名词,叫做微帧,即microframe.一个帧是1毫秒,而一个微帧是八分之一毫秒,也就是125微秒.