07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

睡眠,那就得用GPF_ATOMIC,这里没那么多要求.第二个参数申请的buffer 的大小,对于cr,传递的是<br />

size<strong>of</strong>(*us->cr),而对于iobuf,传递的是US_IOBUF_SIZE,这是一个宏,大小是64,是我们自己定义的,<br />

来自drivers/usb/storage/usb.h:<br />

91 /*<br />

92 * We provide a DMA-mapped I/O buffer for use with small USB transfers.<br />

93 * It turns out that CB[I] needs a 12-byte buffer and Bulk-only needs a<br />

94 * 31-byte buffer. But Freecom needs a 64-byte buffer, so that's the<br />

95 * size we'll allocate.<br />

96 */<br />

97<br />

98 #define US_IOBUF_SIZE 64 /* Size <strong>of</strong> the DMA-mapped I/O buffer<br />

*/<br />

而usb_buffer_alloc()的第四个参数有些意思了,第一次我们传递的是&us->cr_dma,第二次传递的是<br />

&us->iobuf_dma,这涉及到dma 传输.这两个咚咚此前我们都没有赋过值,相反它们是在这个函数调用<br />

之<br />

后被赋上值的.cr_dma 和iobuf_dma 都是dma_addr_t 类型的变量,这个数据类型是Linux 内核中专<br />

门<br />

为dma 传输而准备的.为了支持dma 传输,usb_buffer_alloc 不仅仅是申请了地址,并且建立了dma 映<br />

射,cr_dma 和iobuf_dma 就是记录着cr 和iobuf 的dma 地址.关于什么是cr,关于这些dma 地址究竟<br />

有什么用,我们稍候就会遇到,那时候再讲也不迟.现在需要知道的就是usb_buffer_alloc 申请的空间分别<br />

返回给了cr 和iobuf.顺便提一下,用usb_buffer_alloc 申请的内存空间需要用它的搭档<br />

usb_buffer_free()来释放.<br />

452 行和459 行,每一次申请完内存就要检查成功与否,这是惯例.驱动程序能否驱动设备,关键就是看能<br />

否<br />

申请到内存空间,任何一处内存空间申请失败,整个驱动程序就没法正常工作.这就像如今找对象,谈婚姻,总<br />

是要看有没有房子.没有房子的话,那么基本上爱情也就没戏.然而现实中要拥有房子比计算机里分配内存却<br />

要难上许多,许多.可怜的我们这一代人,当我们不能挣钱的时候,房子是分配的,当我们能挣钱的时候,却发<br />

现房子已经买不起了.哭…<br />

冬天来了,春天还会远吗?(一)<br />

整个usb-storage 模块的代码中,其最灵魂的部分在一个叫做usb_stor_control_thread()的函数中,而<br />

那也自然是我们整个故事的高潮.这个函数的调用有些特殊,我们是从usb_stor_acquire_resources()函<br />

数进入的,而后者我们即将遇到,它在整部戏中只出现过一次,即storage_probe 中,行号为998 的地方.然<br />

而在此之前,有四个函数挡在我们面前,它们就是<br />

37<br />

get_device_info,get_transport,get_protocol,get_pipes.如我前面所说,两个人要走到一起,首先要<br />

了解彼此,这四个函数就是让driver 去认识device 的.这一点我们从名字上也能看出来.driver 需要知道<br />

device 姓甚名谁,所以有了get_device_info,driver 需要知道device 喜欢用什么方式沟通,是用QQ 还<br />

是用msn 还是只用手机短信,如果是某一种,那么账号是多少,或者手机号是多少,写代码的人把这些工作分<br />

配给了get_transport,get_protocol,get_pipes.<br />

实际上,这四个函数,加上之前刚说过的那个associate_dev(),是整个故事中最平淡最枯燥的部分,第一次<br />

读这部分代码总让人困惑,怎么没看见一点usb 数据通信啊?完全没有看到usb host 和usb device 是如<br />

何在交流的,这是usb 吗?这一刻,这颗浮躁的心,在这个城市,迷失了.但是,我们知道,爱情,并非都与风花雪

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

Saved successfully!

Ooh no, something went wrong!