读Linux那些事儿之我是HUB笔记(二)

12events:(通过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

 

读Linux那些事儿之我是HUB笔记(二)_第1张图片 

 

   

 

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:有不同的设置,具体请看协议书

 

14TT电路:

    它就负责高速和低速/全速的数据转换,于是,如果一个高速设备里有这么一个 TT,那么就可以连接低速/全速设备,如不然,那低速/全速设备没法用,只能连接到 OHCI/UHCI 那边出来的 hub 口里.

    tt 分类:一种是 single tt,一种是 multi tt.前者表示整个 hub 就是一个 TT, multi tt 表示每个端口都配了一个 TT. 大多数 hub single TT;

    对于high speedhub, 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.

 15TT think time

         TT 在处理两个低速/全速的交易之间需要一点点时间来缓冲.这个最大的间隔就叫做 TT think time

         单位是 FS bit time,我们知道 FS 就是 Full Speed,其速度是12Mbps,其实也就是 1200 0000bps8 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 被设置为500mApower_budget中较小的那一个

         power_budget 是一个 host controller 自己提供的,它可以是0,如果是 0,表示没有限制.所以我们这里判断是不是等于 0,或者是不是大于等于 500mA,如果是的,那么就设置hub->mA_per_port 500mA,mA_per_port 就是提供给每一个 port 的电流.那么如果说bus_mA0500之间的某个数,那么说明这个hub没法提供达到500mA的电流,就是host controller那边提供不了这么大的电流,那么hub->mA_per_port就设置为hdev->bus_mA

         hub->limited_power这么一个标志位设置为1,表明电流做了限制;

     外部hub

         外接的 hub 有两种供电方式:自己供电和请求总线供电;

         usb端口上,最小的电流负载就是 100mA,这个叫做单元负载(unit load)

 17hub传输方式:control/interrupt,而最有特色的正是它的中断传输

     hub里面的中断端点一定是 IN的而不是 OUT 的;(device to host

 18、微帧/:

早年,提到usb协议,人们会提到frame,即帧,改革开放之后,出现了一个新的名词,叫做微帧,microframe.一个帧是1毫秒,而一个微帧是八分之一毫秒,也就是125微秒.

 

你可能感兴趣的:(linux,职场,休闲,hub,drvier)