07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

态,到时候你就会知道为什么了.我们边走边看.<br />

另外一个需要说一下的是,与down ()相似的有一个叫做down_interruptible ()的函数,它们的区别在<br />

于后者可被信号打断,而前者不可被信号打断,而一旦问是无情,那么他们将进入等待,或者专业一点说,进入<br />

睡眠,直到某一天...<br />

我们将看到的获取us->sema 的函数正是down_interruptible.而释放锁的函数仍然可以用up.<br />

第一次亲密接触(一)<br />

直到现在我们才将第一次真正的开始接触usb的四种数据传输之一,控制传输.应该说从这一刻开始,代码<br />

开始变得复杂了.不过不要怕,有我在.在这个美妙的夏夜,让我们剪一段月光,来解代码的霜.<br />

769 至777 行,做了一件事情,确定这个设备的max lun.不要说你不知道什么是max lun.不知道的回去<br />

跪主板吧,我很负责任的向你推荐我们Intel 最新的3 系列整合芯片组主板.<br />

在get_transport()函数中,我们针对各种情况给us->max_lun 赋了值,但是我们当时就注意到了,唯独<br />

对于Bulk-Only 的设备,当时并没有赋值,所以这里我们看到,对于us->protocol 等于US_PR_BULK 的<br />

情况,有一个专门的函数来获得这个设备的max lun.网友女为悦己者_整_容好奇的问,为什么写代码的同<br />

志在这里对Bulk-Only 的设备表现出一种”偏偏喜欢你”的态度呢?没什么特别的,党中央规定的.所有的<br />

usb 设备遵守一个规范,这个规范叫做usb spec,而usb 设备分为很多种类,usb mass storage 是其中一<br />

类,而mass storage 设备又分为很多子类,每个子类又有它自己的规范,比如U 盘它所遵守的就是usb<br />

72<br />

mass storage class bulk-only transport spec.而这个规范说得很清楚,对于这种设备,它的lun 不是凭<br />

感觉就能判断的,你得发送一个命令给它,向它去查询,然后它会做出响应,这样你才能知道它究竟是几个<br />

lun.<br />

这条命令就是”GET MAX LUN”,详见spec 3.2.<br />

所以我们即使不认真看这个函数也可以知道究竟发生了什么.而且我们之前还说过,普通的U 盘的max<br />

lun 肯定是0.对于那种读卡器才可能有多个lun.不过我们还是不妨来深入的看一下这个函数,毕竟这个函<br />

数是在drivers/usb/storage/transport.c 中,属于我们的辖区.当然更重要的是,此前我们一直没有真正<br />

见识过究竟一次usb 传输是怎么回事,作为usb 设备驱动程序究竟如何发起usb 传输,而这个函数正好给<br />

了<br />

我们一次不错的机会.同时我们也将会知道,了解了一次控制传输之后,别的传输也会很容易理解.<br />

首先我们知道这次传输的目的是为了获得一个数字,max lun,而获得这个数据的方式是发送命令,所以整<br />

个过程就是,你发送一个命令给设备,设备返回一个值给你,这么简单的传输叫什么?控制传输.很显然,地球<br />

人都知道,控制传输是usb 四种传输方式中最简单的那种.来看具体代码:<br />

908 /* Determine what the maximum LUN supported is */<br />

909 int usb_stor_Bulk_max_lun(struct us_data *us)<br />

910 {<br />

911 int result;<br />

912<br />

913 /* issue the command */<br />

914 result = usb_stor_control_msg(us, us->recv_ctrl_pipe,<br />

915 US_BULK_GET_MAX_LUN,<br />

916 USB_DIR_IN | USB_TYPE_CLASS |<br />

917 USB_RECIP_INTERFACE,<br />

918 0, us->ifnum, us->iobuf, 1, HZ);<br />

919

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!