2014年1月1日 星期三

在 Fedora 20 安裝「EDIMAX EW-7811Un」驅動程式

自從 Fedora 18 的核心更新到 3.8 版後,EDIMAX EW-7811Un 無線網路又不能用了。Google 的結果也是無解,只好等 Realtek 修改驅動程式。在 2013-10-29 終於釋出新版的驅動程式 4.0.2_9000。不過,如官網所稱只支援到 kernel 3.9,那一陣子 Fedora 核心的更新特別快,當再更新到 3.10 版後,就不再能用了;只好暫時停止更新 Linux 的核心了。
  據找到的訊息所述,是因為 Linus Benedict Torvalds 在整理核心程式所用的函式時,將幾個 Realtek 官網的驅動程式中所用的函式移除了,造成編譯時錯誤百出,根本不能成功編譯。
  基於對 Linux 的瞭解,猜測被移除的函式,應該有替代的函式,或有相容處理。但是,終究要針對 Realtek 的驅動程式原始碼做些修改。由於前一陣子有些忙,就只試試看 Linux 官網的驅動是否修改到可用的程度。
  跨完年,就是新的一年的開始,有些時間就上網找一下解法。有些 Raspberry Pi 的玩家好像在 kernel 3.10 版成功編譯了,似乎可以參考這個結果,嘗試一下。今天又將舊筆電安裝 Fedora 20,乾脆就再試一次吧!想不到就成功編譯了,就將過程記錄如下:

一、下載「驅動程式」、解壓縮

從 Realtek 的官網下載 RTL8192CU 最新版的驅動程式 (目前是 4.0.2_9000.20130911),因為要修改「核心模組原始碼」的一個 C 程式檔,所以原有驅動程式的安裝不可以讓它自動作業,要分段執行。
    第一步先解壓縮,
[SiB@M2400 ~]$ unzip RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
解開後,產生一個名為 RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911 的目錄,之後的文章中將這個目錄稱為『原始碼目錄』。
  接著把工作目錄切換到『原始碼目錄』中一個『driver』目錄,還要再做解壓縮,
[SiB@M2400 ~]$ cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/driver/
[SiB@M2400 driver]$ tar zxvf rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911.tar.gz
解開後,產生一個名為 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911 的目錄,之後的文章中將這個目錄稱為『驅動原始碼目錄』,主要修改的檔案就在這個目錄之下。

二、修改程式

筆者未修改程式前,出現編譯錯誤的檔案是『 os_intfs.c 』這個檔,就從這個檔案的修改先做。運氣好的話,就只要修改這個檔案就好了。將修改處整理在後,因為檔案前面的修改都會加入文字,影響之後的列數,故由程式後端開始修改。

檔案『驅動原始碼目錄/os_dep/linux/os_intfs.c』的修改

第 750 列,原文
            rtw_proc = NULL;
        }
    }
}
#endif
修改為
            rtw_proc = NULL;
        }
    }
}
#endif  /* create_proc_entry not defined */
#endif 
第 278 列,原文
#define RTW_PROC_NAME DRV_NAME

void rtw_proc_init_one(struct net_device *dev)
修改為
#define RTW_PROC_NAME DRV_NAME
  
#ifndef create_proc_entry
/* dummy routines */
void rtw_proc_remove_one(struct net_device *dev) { }
void rtw_proc_init_one(struct net_device *dev) { }
#else  /* create_proc_entry not defined */

void rtw_proc_init_one(struct net_device *dev)
完成以上修改後,存檔備用。

三、編譯「核心模組」

接下來準備下編譯命令了,先切換成 root 身份,並將工作目錄切換到『驅動原始碼目錄』,再下命令
[root@M2400 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911]# make

四、安裝「核心模組」

最後執行安裝操作,這些命令是從『原始碼目錄』下的 install.sh 這個腳本檔取出。這是 Realtek RTL8192cu 驅動程式原來的安裝步驟(解壓縮、編譯、安裝)的最後一個步驟,
[root@M2400 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911]# rmmod rtl8192cu
[root@M2400 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911]# insmod 8192cu.ko
[root@M2400 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911]# make install
這時候,讀者應該可以開始測試無線網路了。
  幾個相關的發文列在下面,有需要的讀者請自行參考:

五、抑制 Fedora 原裝驅動程式

安裝完成後,當然希望下次開機可以作業系統可以載入正確的核心模組,在重開機前還有個步驟要做,待會重開機才會正確。
  就是抑制 Fedora 原裝驅動程式,筆者發現的幾個做法,把它們都列出來,讓讀者自己選用:
  • 在檔案『 /etc/modprobe.d/blacklist.conf 』末,加上『 blacklist rtl8192cu 』這行敘述。
  • 或是在檔案『 /boot/grub2/grub.conf 』中,linux 開始那列命令最後,加上『 modprobe.blacklist=rtl8192cu 』。
注意:『  』只是為標示文字範圍,不要加進去。

六、更新核心後,立即編譯新版的驅動程式

在舊版核心(網路可正常使用時)執行系統的 kernel 更新後,可以立即編譯、安裝適用新版的驅動程式。這樣重開機時,以新核心啟用 Fedora 時,就不會沒網路用了。
  假設讀者已經參考前面的發文,修改好 EDIMAX EW-7811un 的驅動程式原始碼(請參考前面發文」。以下步驟說明是以 Fedora 20 核心版本 3.12.5-302 ,而電腦是 i686 等級的 CPU 為例,先切換為 root 身分,再執行如下之四個命令:
cd ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/driver/rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911/
make ARCH=i386 -C /lib/modules/3.12.5-302.fc20.i686/build M=`pwd` modules
install -p -m 644 8192cu.ko /lib/modules/3.12.5-302.fc20.i686/kernel/drivers/net/wireless/
/sbin/depmod -a 3.12.5-302.fc20.i686
第一個命令是切換到解壓縮後的驅動程式原始碼目錄,上例是假設以 root 身份解開壓縮檔,放在 /root 目錄之下。第二個命令是編譯『驅動程式的核心模組』,接下來的兩個命令是將編譯好的『核心模組』安裝到新版的 Linux 核心。
  若讀者的電腦是 64-bit 的 CPU, 那麼參考的四個命令為:
cd ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/driver/rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911/
make ARCH=x86_64 -C /lib/modules/3.12.5-302.fc20.x86_64/build M=`pwd` modules
install -p -m 644 8192cu.ko  /lib/modules/3.12.5-302.fc20.x86_64/kernel/drivers/net/wireless/
/sbin/depmod -a 3.12.5-302.fc20.x86_64

注意:上例兩組命令中的『3.12.5-302.fc20.i686』和『3.12.5-302.fc20.x86_64』是對應更新後新版的 Linux 核心模組,可以用『uname -r』這個命令查詢,
[SiB@M2400 ~]$ uname -r
3.12.5-302.fc20.i686
[SiB@M2400 ~]$
在用『 yum 』更新的過程中,也會出現新更新的核心之版本訊息,讀者稍加留意即可得知。

七、相關資訊

找尋這些編譯步驟的奮戰過程,請參考之前的發文:

後記:


已測試版本:

  • Fedora 20: kernel 3.11.10-301
  • Fedora 20: kernel 3.12.5-302, 3.12.6-300

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)