2010年3月5日

改變USB HUB掃描各個PORT的順序


By 柯允行 2010-03-05


1前言
   這是一篇介紹如何在 改變USB HUB掃描各個PORT的順序
2案由
   假設硬體工程式設計的USB架構如下:


   其中PORT4 為開機碟

     PORT1 為給使用者任意插入的USB STORAGE

 在此架構中,原本linux kernel usb driver 掃描方式為

   port1-->port2-->port3-->port4.......... 

   我們不難發現會有二種情形

         Case 1: 有插external disk開機  ----> internal disk 註冊為 sdb b 8 16

         Case 2: 沒有插external disk開機 ----> internal disk 註冊為 sda a 8 0

   這對我們在linux kernel command line上造成困擾,無法鎖定開機碟在/dev/sda? 

如: root=/dev/sda? ro quiet

3解決方法

(1)新的 Linux Distributions 開始在 fstab 和 grub 之中使用 LABEL 和 UUID 取代裝置名稱

(2)Hacking kernel 找出kernel scan port的地方,調整一下順序即可,這個想法對於其它區塊裝置的設備也是適用的(如mmc driver).

 

diff -Naur linux-2.6.22.6.bak/drivers/usb/core/hub.c linux-2.6.22.6/drivers/usb/core/hub.c

--- linux-2.6.22.6.bak/drivers/usb/core/hub.c 2009-11-20 01:44:37.000000000 -0500

+++ linux-2.6.22.6/drivers/usb/core/hub.c 2009-11-20 01:50:15.000000000 -0500

@@ -2685,7 +2685,8 @@

}



/* deal with port status changes */

- for (i = 1; i <= hub->descriptor->bNbrPorts; i++) {

+ for (i = hub->descriptor->bNbrPorts; i > 0 ; i--) {

if (test_bit(i, hub->busy_bits))

continue;

connect_change = test_bit(i, hub->change_bits);

沒有留言: