无线网卡移植说明

无线网卡移植说明

 

一、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客户端加密认证,以后有空再弄