无线网卡移植说明
无线网卡移植说明
一、8192eu驱动移植
无线网卡先查找要移植的无线网卡所使用的wifi芯片,下面以腾达U6,U3为例。
所用芯片为realtek 8292eu,github上有许多源码,或者realtek官网,如https://github.com/Mange/rtl8192eu-linux-driver.git
下载源码:
git clone https://github.com/Mange/rtl8192eu-linux-driver.git
cd rtl8192eu-linux-driver
vi Makefile
里面的配置默认是给PC编译的,
PC配置置n
CONFIG_PLATFORM_I386_PC = n
在Platform Related里添加自己的配置
CONFIG_PLATFORM_ARM_VIMICRO = y
下面对应添加,使用的编译器和内核代码,内核代码要编译,否则会报错
ifeq ($(CONFIG_PLATFORM_ARM_VIMICRO), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
ARCH := arm
CROSS_COMPILE := /usr/bin/arm-linux-gnueabihf-
KSRC :=/opt/share0/release/vc0718p/trunk/source/opensource/kernel/linux-3.19.8
Endif
执行make
当前目录下,编译成功8192eu.ko,这是8192eu的,有的wifi芯片还需要sta模式和ap模式分开编译,如RT5370,这个按需要在Makefile里面自己配置模式,还有更老的,需要变异多个.ko,并按顺序加载, 如mt7601u,这些相对来说都比较麻烦,8192的编译少了很多麻烦,但是有一点不好,可能芯片的外围电路比较多,做不出来mini体积的无线网卡
二、内核配置
这样生成的8192eu.ko 装载进arm板子上,起码可以做sta使用,当然内核需要开启wireless相关功能
Networking support --->
-*- Wireless --->
部分网卡据说还有开启RF switch subsystem support才能被板子识别,但是8192不需要
Device Drivers --->
[*] Network device support --->
[*] Wireless LAN --->
这里面有一些linux内核自带的wifi驱动支持,如果你的无线网卡属于这里面的,那你只要勾上就行了,不需要再自行编译驱动,我使用的是realtek的网卡,我把相关的都勾上的,其实不选也行,
但是 <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)
这个选项要选,这是支持hostap功能的,选上了这个,内核才能支持无线网卡工作在ap模式,你要是需要dhcp功能,还需要勾选
Device Drivers --->
[*] Network device support --->
Networking options --->
这个一般都勾了,要是没选照着选
配置完内核,自己编译。我用的是,linux 3.19.8 ,4.x支持的WiFi驱动等相关东西更多一些。编完了内核自己烧进板子里,这样内核就支持无线模块了,加上你编译的无线驱动,你的无线网卡起码可以跑起sta模式
三、必要的工具和应用移植
要让无线网卡工作在ap模式,还需要移植一些其他工具和应用
1.wireless_tool
Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless Extension的无线设备。里面有一些常用命令:
iwconfig:设置基本无线参数
iwlist:扫描、列出频率,比特率,**等
iwspy:获取每个节点链接的质量(只能查阅与之相连的节点)
iwpriv:操作Wireless Extensions 特定驱动
ifrename: 基于各种静态标准命名接口
最常用的就是iwconfig,iwpriv,iwlist,这个弄过无线的一般都知道,具体怎么使用,命令 + -h,或者上网自己查
下载wireless_tools.29.tar.gz,https://hewlettpackard.github.io/wireless-tools/wireless_tools.29.tar.gz,解压
cd wireless_tools.29
修改Makefile,vi Makefile
将编译器相关的修改成自己使用的交叉编译器路径:
## Compiler to use (modify this for cross compile).
CC = arm-linux-gnueabihf-gcc
## Other tools you need to modify for cross compile (static lib only).
AR = arm-linux-gnueabihf-ar
RANLIB = arm-linux-gnueabihf-ranlib
编译,make
生成库libiw.so.29,和可执行命令:iwpriv,iwconfig,ifrename,iwspy,iwevent,iwlist,iwgetid
根据需要放进自己开发板里,不知道放哪的,库统统放进/usr/lib或者/lib,二进制可执行文件统统放进/usr/sbin或者/sbin
这样你的板子就能使用wireless_tool工具进行无线调试了
2.iw
iw工具我自己用的也不多,但有的时候你不知道自己买的无线网卡支不支持模式,官网上又说的不全,听说大部分厂商不提供linux平台技术支持,更别提arm平台了,我是不会问他们的,iwconfig虽然可以设置wlan mode,但万一是你驱动或者内核没配好呢,这就需要移植iw工具了,使用iw可以查看网卡支持的工作模式
装iw工具之前,需要先装libnl库
我用的是libnl-1.1.4,没有使用libnl-3.x,因为我一会还会移植hostap,hostap的版本比较低,具体版本的匹配自己去查,要不就编一次,发现少函数少库,或者iw等工具里的Makefile指定了版本,看看自己也就会了
libnl是为了方便应用程序使用netlink接口而开发的一个库。这个库为原始netlink消息传递以及不同的netlink family专用接口提供了一个统一的接口。libnl2.0的API与libnl1.0的API并不兼容。如果你的应用程序不做相应调整,将可能导致不可用。
移植libnl1.1是hostapd的移植的一部分。hostapd使用的libnl库为1.x版本,2.0版本的API与1.0的并不兼容,故这里移植1.1版本,但2.0移植方式相同,官网http://www.infradead.org/~tgr/libnl/可以下载libnl-1.1.4.tar.gz,解压
tar zxvf libnl-1.1.4.tar.gz
进入刚解压的目录cd libnl-1.1.4,
执行下面指令,做相应的配置:
./configure --prefix=$(pwd)/__install --enable-shared --enable-static
这样一会你编译的库就会放进$(pwd)/__install
执行下面命令,编译库:
make CC=arm-linux-gnueabihf-gcc
执行下面命令,将编译好的库文件拷贝到指定目录:
make install
如下图所示在当前目录下的__install目录下生成了头文件和库文件
include下文件在编译程序的时候会用到,而lib下在程序运行时会用到。故在移植hostapd的时候需要指定include的路径,需要将lib下文件拷贝到开发板中
下载iw-4.0.tar.gz,https://www.kernel.org/pub/software/network/iw/解压
cd iw-4.0
编辑Makefile
vi Makefile
添加libnl库路径
#add by guowuwei
LIBS += -L/opt/share0/guowuwei/libnl-1.1.4/__install
CFLAGS += -I/opt/share0/guowuwei/libnl-1.1.4/__install/include
CC = arm-linux-gnueabihf-gcc
如果改完了CC编译的时候默认使用gcc
那么执行
make CC=arm-linux-gnueabihf-gcc V=1
编译成功生成iw二进制文件,考进板子里,就能查询wifi支持的模式,以及一些其他信息
iw list
可知无线网卡支持AP模式
3.hostapd和wpasupplicant
在移植hostapd和wpa_supplicant时需要先移植openssl和libnl,上面移植iwconfig的时候,已经移植了libnl,没有移植的照着上面做,
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的**和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
https://www.openssl.org/source/下载最新源码 openssl-1.0.2r.tar.gz
解压tar zxvf openssl-1.0.2r.tar.gz
进入刚解压的目录cd openssl-1.0.2r/,执行下面指令,做相应的配置:
./config no-asm shared --prefix=$(pwd)/__install
no-asm: 是在交叉编译过程中不使用汇编代码代码加速编译过程,原因是它的汇编代码是对arm格式不支持的。
shared :生成动态连接库。
--prefix :指定make install后生成目录的路径,不修改此项则默认为OPENSSLDIR目录(/usr/local/ssl)。
4.修改Makefile:
CC= arm-linux-gnueabihf-gcc
删除 CFLAG= 中的-m64
AR= arm-linux-gnueabihf-ar $(ARFLAGS) r
RANLIB= arm-linux-gnueabihf-ranlib
NM= arm-linux-gnueabihf-nm
SHARED_LDFLAGS=
执行下面命令,编译OpenSSL库:
make
执行下面命令,将编译好的库文件拷贝到指定目录:
make install
如下图所示在当前目录下的__install目录下生成了头文件和库文件:
include下文件在编译程序的时候需要指定include的路径。而lib下在程序运行时会用到,需要将lib下文件拷贝到开发板中
下载最新版本的hostapd和wpa_supplicant源码:
网上都说用git clone git://w1.fi/srv/git/hostap.git
但是这个库我一直没找到,也下不下来,后来在github上下了个RTL8188-hostapd,也能用,版本是0.8.x
git clone https://github.com/jenssegers/RTL8188-hostapd.git
移植hostapd
1.进入hostapd目录:
cd hostap/hostapd/
2.复制一份默认的配置文件
cp defconfig .config
3.编辑.config文件
网上有很多说要注释CONFIG_DRIVER_NL80211=y一行:
#CONFIG_DRIVER_NL80211=y
开启CONFIG_DRIVER_HOSTAP=y
相应的hostapd.conf里的driver选项也要改成hostap或者nl80211
但是我改完CONFIG_DRIVER_HOSTAP=y,运行hostapd的时候报iocrtl错误,可能内核或者驱动或者库支持的是nl80211,这个比较新,也能理解,最终开启的是 CONFIG_DRIVER_NL80211=y,hostapd.conf里dirver=nl80211。
若果运行hostapd时报了相关错误,可以换另一个选项试试
4.修改Makefile
将
ifndef CC
CC=gcc
endif
改为:
#ifndef CC
CC=arm-linux-gnueabihf-gcc
#endif
注:此处为自己开发环境中的交叉工具链路径
增加下面4项(需要添加在Makefile的前面):
CFLAGS += -I../../libnl-1.1.4/__install/include/
CFLAGS += -I../../openssl-1.0.2r/__install/include/
LIBS += -L../../libnl-1.1.4/__install/lib/
LIBS += -L../../openssl-1.0.2r/__install/lib/
注:这些路径是我的头文件和库的路径,需要根据自己实际情况来填写
5.编译
make
将编译好的hostapd工具拷贝到开发板即可。
移植wpa_supplicant
1.进入wpa_supplicant目录:
cd hostap/wpa_supplicant/
2.复制一份默认的配置文件
cp defconfig .config
3.修改Makefile
将
ifndef CC
CC=gcc
endif
改为:
#ifndef CC
CC=arm-linux-gnueabihf-gcc
#endif
注:此处为自己环境中的交叉工具链路劲
增加下面4项(需要添加在Makefile的前面):
CFLAGS += -I../../libnl-1.1.4/__install/include/
CFLAGS += -I../../openssl-1.0.2r/__install/include/
LIBS += -L../../libnl-1.1.4/__install/lib/
LIBS += -L../../openssl-1.0.2r/__install/lib/
注:这些路径是我的头文件和库的路劲,需要根据自己实际情况来填写
4.编译
make
将编译好的wpa_supplicant工具拷贝到开发板即可。
五、具体装载
做完了上述的移植过程,你应该有如下几个目录的东西:
wireless_tool
iw
hostap
Libnl.so.1为libnl.so.1.1.4的软连接,自己建一个
如果你有修改编译系统的权限或者使用自己的开发板,你可以将上述的app移植进busybox,否则,就移植进rootfs或者网络挂载,那么我们选择装进rootfs,
那么编译后,烧进开发板,就会存在相应的app,上面已经说过app根据需要放进自己开发板里,不知道放哪的,库统统放进/usr/lib或者/lib,二进制可执行文件统统放进/usr/sbin或者/sbin,当然我们也可以自己export使用的库和可执行程序路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ipc/hostap/lib:/ipc/wireless_tool/lib
export PATH=$PATH:/ipc/hostap:/ipc/wireless_tool:/ipc/iw_tool
之后就可以自由使用移植的程序了
insmod 8192eu.ko
板子识别所插入的usb网卡,并启动为sta模式
hostapd /ipc/hostap/hostapd.conf &
启动hostapd程序,加载配置,自动使网卡变为ap模式,hostapd.conf简要配置如下:
ssid=VimicroAI
hw_mode=g
channel=10
interface=wlan0
driver=nl80211
ignore_broadcast_ssid=0
macaddr_acl=0
这样网卡会自动释放一个名叫VimicroAI的open wifi信号,我也试过加密配置,起来之后wlan信号是加密的,但是手机怎么也认证不成功,不明白为什么,
给wlan0配置ip
ifconfig wlan0 192.168.0.1
启动dhcp服务,这里面interface选项改为wlan0
udhcpd /etc/udhcpd.conf
这样手机就可以连接wlan0,并自动分配ip了
关于桥接有线网卡,和wpasupplicant客户端加密认证,以后有空再弄