好记性不如铅笔头

linux, 操作系统

ubuntu-Linux3.16安装8192CU无线网卡驱动

最近电脑换了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
。。。。。。

下载官方驱动:

访问网址【 http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PFid=48&Level=5&Conn=4&ProdID=228&DownTypeID=3&GetDown=false&Downloads=true#2742 】,如下图:

可以发现,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

重启,就可以了。

发表评论

4 + 14 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据