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_info,get_transport,
get_protocol,get_pipes进行说明(协议相关))
控制管道,中断管道,批量管道,等时管道
主机与端点之间的数据链接就称为管道
例子:
1、复旦主校区是主机,每幢宿舍楼算一个设备,你住的那间宿舍就算端点
2、在usb里面,就是设备号和端点号,知道了这两个号,货物就能确定它的目的地,而usB主机就能知道和她通信的是哪个端点
3、urb(usb 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 controller把urb要做的事情给做完了,它会调用一个函数去唤醒usb设备驱动程序,然后usb设备驱动程序就可以继续往下走了.
4、 互斥锁:一个女孩如果心有所属,那么对你来说,就 仿佛已有人在你之前给她上了一把锁,而钥匙,不在你这里.(很形象哦)
互斥锁指的就是一个资源只能同时被一个进程操作,互斥的字面意思也正是如此.互相排斥,就像爱情是自私的一样
down和up这两个函数的作用分别就是去获得锁和释放锁.对于down来说,它每次判断一下信号量的值是否大于0,若是,就进入下面的代码,同时将信号量的值减一,若否,就等待,或者说专业一点,进入睡眠.