2014年2月24日 星期一

在 Fedora 20 (3.13.3~3.14.8) 安裝「EDIMAX EW-7811Un」驅動程式

Fedora 20 的系統核心升級到 3.13.2-201 後,依前文『在 Fedora 20 安裝「EDIMAX EW-7811Un」驅動』步驟編譯新的驅動程式,會出現
.....
  CC [M]  /home/SiB/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/driver/rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911/os_dep/linux/os_intfs.o
/home/SiB/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/driver/rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911/os_dep/linux/os_intfs.c:1006:2: 警告:永遠不相容的指標類型初始化 [enabled by default]
  .ndo_select_queue = rtw_select_queue,
  ^
/home/SiB/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/driver/rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911/os_dep/linux/os_intfs.c:1006:2: 警告:(在 「rtw_netdev_ops.ndo_select_queue」的初始化附近) [enabled by default]
.....
的錯誤訊息。
  看樣子,又得修改『驅動程式原始碼』了,順便將需要 root 權限的部分減少些。修改後的新步驟如下:

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

從 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』的修改

第 948 列(註:本次增加的修改),原文
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb)
{
修改為
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, void *accel_priv)
{
第 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 權限,並將工作目錄切換到『驅動原始碼目錄』,再下命令
[SiB@M2400 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911]$ make

四、安裝「核心模組」

最後執行安裝操作,這時再切換成 root 身份,這些命令是從『原始碼目錄』下的 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 為例,執行之五個命令如下:
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.13.2-201.fc20.i686/build M=`pwd` modules
su
install -p -m 644 8192cu.ko /lib/modules/3.13.2-201.fc20.i686/kernel/drivers/net/wireless/
/sbin/depmod -a 3.13.2-201.fc20.i686
第一個命令是切換到解壓縮後的驅動程式原始碼目錄,第二個命令是編譯『驅動程式的核心模組』。第三個命令是將權限切換到 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.13.2-201.fc20.x86_64/build M=`pwd` modules
su
install -p -m 644 8192cu.ko  /lib/modules/3.13.2-201.fc20.x86_64/kernel/drivers/net/wireless/
/sbin/depmod -a 3.13.2-201.fc20.x86_64

注意一:如果這階段使用前文的方法,一開始就切換到 root 身份,就不用『su』這個命令了。
注意二:上例兩組命令中的『3.13.2-201.fc20.i686』和『3.13.2-201.fc20.x86_64』是對應更新後新版的 Linux 核心模組,可以用『uname -r』這個命令查詢,
[SiB@M2400 ~]$ uname -r
3.13.2-201.fc20.i686
[SiB@M2400 ~]$
在用『 yum 』更新的過程中,也會出現新更新的核心之版本訊息,讀者稍加留意即可得知。

七、相關資訊

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

已測試版本:

  • Fedora 20: 3.14.4-200,3.14.8-200
    3.11.10-301, 3.13.3-201, 3.13.5-200, 3.13.5-202, 3.13.6-200, 3.13.7-200, 3.13.8-200, 3.13.9-200, 3.13.10-200

參考資料:

沒有留言:

張貼留言

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