Scsi - Index of
Scsi - Index of Scsi - Index of
588 break; 589 #endif 590 591 #ifdef CONFIG_USB_STORAGE_SDDR55 592 case US_PR_SDDR55: 593 us->transport_name = "SDDR55"; 594 us->transport = sddr55_transport; 595 us->transport_reset = sddr55_reset; 596 us->max_lun = 0; 597 break; 598 #endif 599 600 #ifdef CONFIG_USB_STORAGE_DPCM 601 case US_PR_DPCM_USB: 602 us->transport_name = "Control/Bulk-EUSB/SDDR09"; 603 us->transport = dpcm_transport; 604 us->transport_reset = usb_stor_CB_reset; 605 us->max_lun = 1; 606 break; 50 607 #endif 608 609 #ifdef CONFIG_USB_STORAGE_FREECOM 610 case US_PR_FREECOM: 611 us->transport_name = "Freecom"; 612 us->transport = freecom_transport; 613 us->transport_reset = usb_stor_freecom_reset; 614 us->max_lun = 0; 615 break; 616 #endif 617 618 #ifdef CONFIG_USB_STORAGE_DATAFAB 619 case US_PR_DATAFAB: 620 us->transport_name = "Datafab Bulk-Only"; 621 us->transport = datafab_transport; 622 us->transport_reset = usb_stor_Bulk_reset; 623 us->max_lun = 1; 624 break; 625 #endif 626 627 #ifdef CONFIG_USB_STORAGE_JUMPSHOT 628 case US_PR_JUMPSHOT: 629 us->transport_name = "Lexar Jumpshot Control/Bulk"; 630 us->transport = jumpshot_transport;
631 us->transport_reset = usb_stor_Bulk_reset; 632 us->max_lun = 1; 633 break; 634 #endif 635 636 default: 637 return -EIO; 638 } 639 US_DEBUGP("Transport: %s\n", us->transport_name); 640 641 /* fix for single-lun devices */ 642 if (us->flags & US_FL_SINGLE_LUN) 643 us->max_lun = 0; 644 return 0; 645 } 咋一看,这么长一段,用长沙话讲,这叫非洲老头子跳高—吓(黑)老子一跳.(长沙话”黑”和”吓”一个音)不 过明眼人一看,就知道了,主要就是一个switch,选择语句,语法上来说很简单,谭浩强大哥的书里边介绍的很 清楚.所以我们看懂这段代码不难,只是,我想说的是,虽然这里做出一个选择不难,但是不同选择就意味着后 来整个故事会有千差万别的结局,当鸟儿选择在两翼上系上黄金,就意味着它放弃展翅高飞;选择云天搏击, 51 就意味着放弃身外的负累.所以,此处,我们需要仔细的看清楚我们究竟选择了怎样一条路.很显然,前面我们 已经说过,对于U 盘,spec 规定了,它就属于Bulk-only 的传输方式,即它的us->protocol 就是 US_PR_BULK.这是我们刚刚在get_device_info 中确定下来的.于是,在整个switch 段落中,我们所执 行 的只是US_PR_BULK 这一段,即, us 的transport_name 被赋值为”Bulk”,transport 被赋值为 usb_stor_Bulk_transport,transport_reset 被赋值为usb_stor_Bulk_reset.其中我们最需要记住的 是,us 的成员transport 和transport_reset 是两个函数指针.程序员们把这个称作钩子.这两个赋值我 们 需要牢记,日后我们定会用到它们的,因为这正是我们真正的数据传输的时候调用的冬冬.关于 usb_stor_Bulk_*的这两个函数,咱们到时候调用了再来看.现在只需知道,日后我们一定会回过来看这个 赋值的. 573 行到634 行,不用多说了,这里就全是与各种特定产品相关的一些编译开关,它们有些自己定义一 些传输函数,有些则共用那些通用的函数. 641 行__________,判断us->flags,还记得我们在讲unusual_devs.h 文件的时候说的那个flags 吧,这 里第一次 用上了.有些设备设置了US_FL_SINGLE_LUN这么一个flag,就表明它是只有一个LUN 的.像这样的设备 挺多的,随便从unusual_devs.h 中抓一个出来: 338 UNUSUAL_DEV( 0x054c, 0x002d, 0x0100, 0x0100, 339 "Sony", 340 "Memorystick MSAC-US1", 341 US_SC_DEVICE, US_PR_DEVICE, NULL, 342 US_FL_SINGLE_LUN ), 比如这个Sony 的Memorystick.中文名叫记忆棒,大小就跟箭牌口香糖似的,也是一种存储芯片,是Sony
- Page 1 and 2: 摘要 ............................
- Page 3 and 4: 迷雾重重的Bulk 传输(二)....
- Page 5 and 6: 引子 也许是在复旦养成了
- Page 7 and 8: usb.h datafab.h dpcm.h initializers
- Page 9 and 10: 的Linux 内核划分为许许多
- Page 11 and 12: 目录下执行make 了.Ok,make 之
- Page 13 and 14: 只 是一个usb 接口.这些口
- Page 15 and 16: 中也定义了这么一些数据
- Page 17 and 18: 511 * @driver: the driver model cor
- Page 19 and 20: 233 .owner = THIS_MODULE, 234 .name
- Page 21 and 22: 91 * construct these entries. Each
- Page 23 and 24: 324 struct usb_host_config *actconf
- Page 25 and 26: 22 88 * @class_dev: driver model's
- Page 27 and 28: 必须给各个地方取名,完了
- Page 29 and 30: 26 136 trans_cmnd transport; /* tra
- Page 31 and 32: 944 init_MUTEX_LOCKED(&(us->sema));
- Page 33 and 34: 147 #if !defined(CONFIG_BLK_DEV_UB)
- Page 35 and 36: 124 #define USB_DEVICE_ID_MATCH_DEV
- Page 37 and 38: intf 来代替. us 之所以重要,
- Page 39 and 40: 睡眠,那就得用GPF_ATOMIC,这
- Page 41 and 42: 504 if (msg >= 0 && !(unusual_dev->
- Page 43 and 44: 179 } 180 181 static struct us_unus
- Page 45 and 46: 711 /* Submitted by Hartmut Wahl */
- Page 47 and 48: 3. useProtocol 为US_SC_DEVICE, use
- Page 49 and 50: Bus 004 Device 001: ID 0000:0000 Bu
- Page 51: 993 result = get_pipes(us); 994 if
- Page 55 and 56: 659 us->max_lun = 0; 660 break; 661
- Page 57 and 58: 740 /* Calculate and store the pipe
- Page 59 and 60: storage 会有两个bulk 端点,用
- Page 61 and 62: 比如说,复旦大学,有一个主
- Page 63 and 64: 1079 #define PIPE_ISOCHRONOUS 0 108
- Page 65 and 66: 782 us->unusual_dev->initFunction(u
- Page 67 and 68: 630 * each frame is in the fields o
- Page 69 and 70: 716 * Bulk URBs may 717 * use the U
- Page 71 and 72: 802 int number_of_packets; /* (in)
- Page 73 and 74: 先说互斥锁.它诞生于这样
- Page 75 and 76: 920 US_DEBUGP("GetMaxLUN command re
- Page 77 and 78: 148 /* set up data structures for t
- Page 79 and 80: 90 * @wValue: matches the USB wValu
- Page 81 and 82: 830 void *transfer_buffer, 831 int
- Page 83 and 84: 25 { 26 x->done = 0; 27 init_waitqu
- Page 85 and 86: 都会过期,我开始怀疑,在这
- Page 87 and 88: 是实际长度,要么就是不成
- Page 89 and 90: 87 258 行,usb_pipeendpoint,定义
- Page 91 and 92: 对爱你的人掘了一条无法
- Page 93 and 94: Type: Direct-Access ANSI SCSI revis
- Page 95 and 96: 416 /* 417 * this defines our host
- Page 97 and 98: 69 * Ioctl interface 70 * 71 * Stat
- Page 99 and 100: 155 * "is this a new device" checks
- Page 101 and 102: 241 char *proc_name; 242 243 /* 244
631 us->transport_reset = usb_stor_Bulk_reset;<br />
632 us->max_lun = 1;<br />
633 break;<br />
634 #endif<br />
635<br />
636 default:<br />
637 return -EIO;<br />
638 }<br />
639 US_DEBUGP("Transport: %s\n", us->transport_name);<br />
640<br />
641 /* fix for single-lun devices */<br />
642 if (us->flags & US_FL_SINGLE_LUN)<br />
643 us->max_lun = 0;<br />
644 return 0;<br />
645 }<br />
咋一看,这么长一段,用长沙话讲,这叫非洲老头子跳高—吓(黑)老子一跳.(长沙话”黑”和”吓”一个音)不<br />
过明眼人一看,就知道了,主要就是一个switch,选择语句,语法上来说很简单,谭浩强大哥的书里边介绍的很<br />
清楚.所以我们看懂这段代码不难,只是,我想说的是,虽然这里做出一个选择不难,但是不同选择就意味着后<br />
来整个故事会有千差万别的结局,当鸟儿选择在两翼上系上黄金,就意味着它放弃展翅高飞;选择云天搏击,<br />
51<br />
就意味着放弃身外的负累.所以,此处,我们需要仔细的看清楚我们究竟选择了怎样一条路.很显然,前面我们<br />
已经说过,对于U 盘,spec 规定了,它就属于Bulk-only 的传输方式,即它的us->protocol 就是<br />
US_PR_BULK.这是我们刚刚在get_device_info 中确定下来的.于是,在整个switch 段落中,我们所执<br />
行<br />
的只是US_PR_BULK 这一段,即,<br />
us 的transport_name 被赋值为”Bulk”,transport 被赋值为<br />
usb_stor_Bulk_transport,transport_reset 被赋值为usb_stor_Bulk_reset.其中我们最需要记住的<br />
是,us 的成员transport 和transport_reset 是两个函数指针.程序员们把这个称作钩子.这两个赋值我<br />
们<br />
需要牢记,日后我们定会用到它们的,因为这正是我们真正的数据传输的时候调用的冬冬.关于<br />
usb_stor_Bulk_*的这两个函数,咱们到时候调用了再来看.现在只需知道,日后我们一定会回过来看这个<br />
赋值的.<br />
573 行到634 行,不用多说了,这里就全是与各种特定产品相关的一些编译开关,它们有些自己定义一<br />
些传输函数,有些则共用那些通用的函数.<br />
641 行__________,判断us->flags,还记得我们在讲unusual_devs.h 文件的时候说的那个flags 吧,这<br />
里第一次<br />
用上了.有些设备设置了US_FL_SINGLE_LUN这么一个flag,就表明它是只有一个LUN 的.像这样的设备<br />
挺多的,随便从unusual_devs.h 中抓一个出来:<br />
338 UNUSUAL_DEV( 0x054c, 0x002d, 0x0100, 0x0100,<br />
339 "Sony",<br />
340 "Memorystick MSAC-US1",<br />
341 US_SC_DEVICE, US_PR_DEVICE, NULL,<br />
342 US_FL_SINGLE_LUN ),<br />
比如这个Sony 的Memorystick.中文名叫记忆棒,大小就跟箭牌口香糖似的,也是一种存储芯片,是Sony