最近电脑换了ubuntu,发现之前买的无线网卡【 TL-WN823N 】老是掉线,在网上搜索了一大圈,发现好多类似的情况,作者找了几个解决方案,但是都不能很好的使用在作者自己的电脑环境上。而官网的驱动又不能支持作者当前的ubuntu版本,于是只能自己修改编译驱动了,这里笔记下编译过程。
CONTENTS
备注:
1 作者并不是驱动开发出身,修改驱动源码是走投无路,以身试法,不过作者当前修改后编译的驱动目前还没有导致宕机,如果有哪位同学也这样干了,系统down了,不要怪我。。
2 作者对驱动的修改并没有涉及到其业务部分,根据编译报错提示,发现只有proc创建的有关代码出现了编译错误,和内核不匹配。作者使用该无线网卡其实只是最基本的连接无线网络,无任何高级操作或者参数微调,因此proc部分作者根本用不着,作者这里采取的修改方式也是修改掉proc的编译报错。作者认为起始也可以把所有的有关proc的代码都干掉,但是作者自己么有这么做。。
查看自己的无线网卡:
连接上无线网卡后:
cstriker1407@cstriker1407-x64:~$ lsusb Bus 002 Device 002: ID 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 。。。。。。
下载官方驱动:
可以发现,Linux驱动支持的最高版本时3.9,而作者的版本是3.16,因此会出现编译错误:
cstriker1407@cstriker1407-x64:~$ uname -a Linux cstriker1407-x64 3.16.0-31-generic #43-Ubuntu SMP Tue Mar 10 17:37:36 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
修改代码:
首先将官方的驱动下载下来,解压缩,进入文件夹,查看readme.txt,发现里面有如下内容:
=============================================================================== Software Package - Component =============================================================================== 。。。。。。 3. driver/ 3.1 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911.tar.gz Naming rule: rtlCHIPS_linux_vM.N.P_ssss.yyyymmdd[_beta].tar.gz where: CHIPS: supported chips M: Major version N: miNor version P: Patch number s: SVN number y: package year m: package month d: package day _beta: beta driver 。。。。。。 12. install.sh Script to compile and install WiFi driver easily in PC-Linux
从这里可以知道,在命令行输入【sudo sh install.sh】既可以快速编译,安装驱动。这里我们输入【 sudo sh install.sh 】,如果没有报错,那么恭喜,驱动已经成功的编译和安装好了,后面直接禁用掉默认驱动即可(参见最后一步)。如果编译报错,那么就需要修改驱动代码了,修改方式如下:
修改install.sh:
查看install.sh文件,可以发现如下内容:
cd driver Drvfoulder=`ls |grep .tar.gz` echo "Decompress the driver source tar ball:" echo " "$Drvfoulder tar zxvf $Drvfoulder Drvfoulder=`ls |grep -iv '.tar.gz'` echo "$Drvfoulder" cd $Drvfoulder
这几行的意思是,进入driver文件夹,解压缩一个tar.gz文件,然后进入这个文件。这里非常重要,如果我们要修改驱动代码,并且还是希望使用【 sudo sh install.sh 】来编译,就要注释掉【 tar zxvf $Drvfoulder 】,防止修改后的代码被覆盖掉。如果希望使用驱动自带的makefile来编译,可以不用管这个install.sh文件。这里作者比较懒,直接修改了install.sh文件,注释掉了【 tar zxvf $Drvfoulder 】。
解压缩tar文件:
根据install.sh的内容,我们手动解压缩位于driver目录下的【 rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911.tar.gz 】文件,如果之前已经运行了一次【 sudo sh install.sh 】,那么driver里面应该有一个已经解压好的文件。
修改os_intfs.c文件:
根据报错指引,我们修改【 driver/rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911/os_dep/linux/os_intfs.c 】:
先增加如下代码:
static int rtw_proc_cnt = 0; #define RTW_PROC_NAME DRV_NAME /*以下为添加内容*/ #define create_proc_read_entry create_proc_read_entry_custom #define create_proc_entry create_proc_entry_custom struct proc_dir_entry *create_proc_read_entry_custom (const char *name, mode_t mode, struct proc_dir_entry *base, void *read_proc, void *data) { struct proc_dir_entry *entry = proc_create(name,mode,base, NULL); return entry; } struct proc_dir_entry *create_proc_entry_custom (const char *name, mode_t mode, struct proc_dir_entry *base) { struct proc_dir_entry *entry = proc_create(name,mode,base, NULL); return entry; } /*以上为添加内容*/ void rtw_proc_init_one(struct net_device *dev) { 。。。。。
然后全文搜索,将【 entry->write_proc 】修改为【// entry->write_proc】,即将该句话注释到。
修改usb_intf.c:
根据报错指引,我们修改【 driver/rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911/os_dep/linux/usb_intf.c 】:
注释掉【 DBG_871X(“build time: %s %s\n”, __DATE__, __TIME__); 】
修改好这两个文件之后,我们重新执行【 sudo sh install.sh 】,就应该没有编译错误了。
禁掉默认驱动:
在命令行中输入【 sudo gedit /etc/modprobe.d/blacklist.conf 】,在文件的最后添加上:
blacklist rtl8192cu blacklist rtl8192c_common blacklist rtlwifi
重启,就可以了。
发表评论