1、  LUN(logical unit number逻辑单品)

有些读卡器可以有多个插槽,比如就是两个,其中一个支持CF,另一个支持SD,那么这种情况要区分这两个插槽里的冬冬,就得引入lun这么一个词. U盘这样简单的设备其LUN必然是一个

US_FL_SINGLE_LUN:这个flag的意义很明显,直截了当的告诉你,我这个设备只有一个LUN,它不支持多个LUN. max_lun又是什么意思? us中的成员max_lun等于一个设备所支持的最大的lun.即如果一个设备支持四个LUNs,那么这四个LUN的编号就是0,1,2,3,max_lun就是3.如果一个设备不用支持多个LUN,那么它的max_lun就是0.所以这里max_lun就是设为了0.

比较一下各个case语句,发现, US_PR_BULK和别的case不一样,别的case下面都设置了us->max_lun,而对应于Bulk-Only协议的这个case,它没有设置us->max_lun,这是为何?别急,后来我们会专门有一个函数去读取这个值的,之所以不设,是因为这个值由设备说了算,必须向设备查询,这是Bulk-Only协议规定的

2、  usb四种传输方式(usb 2.0 270pages说明,可以对get_device_infoget_transport

get_protocolget_pipes进行说明(协议相关))

控制管道,中断管道,批量管道,等时管道

主机与端点之间的数据链接就称为管道

例子:

1、复旦主校区是主机,每幢宿舍楼算一个设备,你住的那间宿舍就算端点

2、在usb里面,就是设备号和端点号,知道了这两个号,货物就能确定它的目的地,usB主机就能知道和她通信的是哪个端点

3urbusb request block)工作原理

   usb设备需要通信,要传递数据,就需要使用urb

   应该是usb设备驱动程序使用urb.实际上,作为usb设备驱动,它本身并不能直接操纵数据的传输,usb这个大观园里,外接设备永远都是配角,真正的核心只是usb core,真正负责调度的是usb host controller,这个您通常看不见的usb主机控制器芯片,他俨然是usb大观园中的大管家.设备驱动要发送信息,所需要做的是建立一个urb数据结构,并把这个数据结构交给核心层,而核心层会为所有设备统一完成调度,而设备在提交了urb之后需要做的,只是等待,等待。。。。

更详细的解释:看下面的话:

那么设备和主机控制器的分工又是如何呢?硬件实现上我们就不说了,说点具体的,Linux,设备驱动程序只要为每一次请求准备一个urb结构体变量,把它填充好,(就是说赋上该赋的值)然后它调用usb core提供的函数,把这个urb传递给host controller,host controller就会把各个设备驱动程序所提交的urb统一规划,去执行每一个操作.而这期间,usb 设备驱动程序通常会进入睡眠,而一旦host controllerurb要做的事情给做完了,它会调用一个函数去唤醒usb设备驱动程序,然后usb设备驱动程序就可以继续往下走了.

4、  互斥锁:一个女孩如果心有所属,那么对你来说, 仿佛已有人在你之前给她上了一把锁,而钥匙,不在你这里.(很形象哦)

   互斥锁指的就是一个资源只能同时被一个进程操作,互斥的字面意思也正是如此.互相排斥,就像爱情是自私的一样

   downup这两个函数的作用分别就是去获得锁和释放锁.对于down来说,它每次判断一下信号量的值是否大于0,若是,就进入下面的代码,同时将信号量的值减一,若否,就等待,或者说专业一点,进入睡眠.