..... 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/解開後,產生一個名為 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911 的目錄,之後的文章中將這個目錄稱為『驅動原始碼目錄』,主要修改的檔案就在這個目錄之下。
[SiB@M2400 driver]$ tar zxvf rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911.tar.gz
二、修改程式
筆者未修改程式前,出現編譯錯誤的檔案是『 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在用『 yum 』更新的過程中,也會出現新更新的核心之版本訊息,讀者稍加留意即可得知。
3.13.2-201.fc20.i686
[SiB@M2400 ~]$
七、相關資訊
找尋這些編譯步驟的奮戰過程,請參考之前的發文:- 改進「安裝『EDIMAX EW-7811Un』驅動」的步驟
- 編譯 Kernel 3.8 的「EDIMAX EW-7811Un」驅動
- 成功在 Fedora 18 安裝「EDIMAX EW-7811Un」驅動
- 在 Fedora 18 用「EDIMAX EW-7811Un」的變通辦法
- 在 Fedora 安裝「EDIMAX EW-7811Un」的驅動程式
已測試版本:
- 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.)