Scsi - Index of

Scsi - Index of Scsi - Index of

07.06.2013 Views

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

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

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

Saved successfully!

Ooh no, something went wrong!