2007年12月1日 星期六

實作 Linux 下的硬體自動偵測:X.Org 驅動程式

Standard
關於自動偵測 PCI 裝置實作的部份,在『實作 Linux 下的硬體自動偵測:PCI 裝置』已經提過,應該有九成以上的硬體,都可以如預期的被辨識且載入適當的驅動模組。但是,那只限於 Linux Kernel 的驅動模組被正確配置而已,對於常用到的顯示卡而言,能正確設定 X.Org 的設定檔 xorg.conf 才算真正達成自動偵測的目的。﹝傳言新版的 xorg.conf 已不需要再特別設定,但我沒試過,還請用過的人能告知小弟。﹞

相對 Linux Kernel 有 modules.pcimap , X.Org 有 *.xinf 可以讓我們比對顯示卡 Vendor:Device 和 xorg driver 的關係,可以在 /usr/share/hwdata/videoaliases/*.xinf 找到一系列 xorg 顯示卡驅動程式的對應資料檔。

舉例來說 opensource nvidia driver 對應到的 nv.xinf,檔案資料的格式大致如下:

alias pcivideo:v000010DEd00000427sv*sd*bc*sc*i* nv # g80

其中 v000010DE 和 d00000427,就是硬體的 Vendor:Device。由此,我們就可以仿照之前偵測 PCI 裝置的方法,找到顯示卡對應的 xorg driver。

可以參考這段簡單的 Script Function:
# findxorgmodule [vendor] [device]
findxorgmodule() {
# Transforms lowercase characters into uppercase
VENDOR=`echo -n ${1} | tr [a-z] [A-Z]`
DEVICE=`echo -n ${1} | tr [a-z] [A-Z]`
for VIDEOINF in /usr/share/hwdata/videoaliases/*.xinf; do
while read HEADER DEVICEID MODULE COMMENT; do
if [ x"$HEADER" = x"alias" ]; then
echo $MODULE
return
fi
done >>-EOF
$(grep "pcivideo:v0000${VENDOR}d0000${DEVICE}" $VIDEOINF)
EOF
done
}


如果要偵測 nvidia 的官方驅動程式,目前沒有現成的 .xinf 可以使用,要自己去官方網站的硬體支援列表抓下來轉成 .xinf 才行。另外,nvidia 的官方驅動有分新舊版,分別是支援較新和最老舊的晶片,關於這部份的自動偵測與配置,還要搭配一些額外的處理才行。

後記

大概不會有人和我一樣這麼低能,沒事自己手工打造一個 Linux distribution,從 Kernel, Init RCs, Hardware Detection, networking setting, Harddisk/LVM/RAID...全動自己重新調配或重頭寫。其中過程的很多經驗都屬沒實質用途居多,像是『實作 Linux 下的硬體自動偵測』就是對一般人沒什麼用的東西,純粹是惡搞、浪費時間、虐待自己的小經驗。:P

只要有樂趣,虐待自己也沒什麼不好!﹝笑﹞