You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
公司推出的,广泛用于Sony 的各种数码产品中.比如数码相机,数码摄影机.<br />
有人问了,啥是LUN 啊?logical unit number.通常在谈到scsi 设备的时候不可避免的要说起LUN.关于<br />
LUN,曾几何时,一位来自Novell(SUSE)的参与开发Linux 内核中usb 子系统的工程师这样对我说,一个<br />
lun 就是一个device 中的一个drive.换言之,usb 中引入lun 的目的在于,举例来说,有些读卡器可以有多<br />
个插槽,比如就是两个,其中一个支持CF 卡,另一个支持SD 卡,那么这种情况要区分这两个插槽里的冬冬,<br />
就得引入lun 这么一个词.这叫逻辑单元.很显然,像U盘这样简单的设备其LUN必然是一个.有时候,人们常<br />
把U 盘中一个分区当作一个LUN,这样说可能对小学三年级以下的朋友是可以接受的,但是作为一个成年<br />
人,<br />
不应该这么理解.<br />
知道了LUN 以后,自然就可以知道US_FL_SINGLE_LUN 是干嘛了,这个flag 的意义很明显,直截了当的<br />
告诉你,我这个设备只有一个LUN,它不支持多个LUN.而max_lun 又是什么意思?us 中的成员max_lun<br />
等于一个设备所支持的最大的lun 号.即如果一个设备支持四个LUNs,那么这四个LUN 的编号就是<br />
0,1,2,3,而max_lun 就是3.如果一个设备不用支持多个LUN,那么它的max_lun 就是0.所以这里<br />
max_lun 就是设为了0.<br />
另外一个需要注意的地方是,比较一下各个case 语句,发现, US_PR_BULK 和别的case 不一样,别的<br />
case<br />
下面都设置了us->max_lun,而对应于Bulk-Only 协议的这个case,它没有设置us->max_lun,这是为<br />
何?别急,后来我们会专门有一个函数去读取这个值的,之所以不设,是因为这个值由设备说了算,必须向设备<br />
52<br />
查询,这是Bulk-Only 协议规定的.所以我们之后会遇见usb_stor_Bulk_max_lun()函数,它将负责获取<br />
这个max lun.而我依然要声明一次,这个函数对我们U 盘是没啥意义的,咱们这个值肯定是0.<br />
至此,get_transport()也结束了,和get_device_info 一样.我们目前所看到的这些函数都不得不面对现<br />
实,<br />
对它们来说,凋谢是最终的结果,盛开只是一个过程...而对我们来说,要到达终点,那么和这些函数狭路相逢,<br />
终不能幸免.然而,不管这部分代码有多么重要,也不过是我们整个长途旅程中,来去匆匆的转机站,无论停留<br />
多久,始终要离去坐另一班机.<br />
冬天来了,春天还会远吗?(五)<br />
道不尽红尘舍恋诉不完人间恩恩怨怨.<br />
看完了get_transport()继续看get_protocol()和get_pipes().仍然是来自<br />
drivers/usb/storage/usb.c 中:<br />
647 /* Get the protocol settings */<br />
648 static int get_protocol(struct us_data *us)<br />
649 {<br />
650 switch (us->subclass) {<br />
651 case US_SC_RBC:<br />
652 us->protocol_name = "Reduced Block Commands (RBC)";<br />
653 us->proto_handler = usb_stor_transparent_scsi_command;<br />
654 break;<br />
655<br />
656 case US_SC_8020:<br />
657 us->protocol_name = "8020i";<br />
658 us->proto_handler = usb_stor_ATAPI_command;