A33芯片+Linux3.4内核+ap6210wifi模块
开发板:全志a33-Vstar-dragonboard
linux:3.4内核
Ubuntu:16.04_amd64 & 16.04_i386 (wpa_supplicant在64位上编译没通过,可能是环境问题,最终在32位机上编译成功)
功能:开发板通过WiFi模块与Ubuntu连接同一路由,构成局域网,分别运行服务器和客户端程序,实现数据交换
一、为全志官方A33_vstar_linux.tar.gz2 搭建编译环境
我的是 5.4.0 比要求的 4.4.7 高,所以没有安装,可正常编译。
低于4.4.7版本请自行验证
安装GCC:
apt-get install gcc-4.4 g+±4.4 g+±4.4-multilib
配置GCC:
mv -f /usr/bin/gcc /usr/bin/bak_gcc
mv -f /usr/bin/g++ /usr/bin/bak_g++
ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
ln -s /usr/bin/g+±4.4 /usr/bin/g++
二、编译全志A33官方SDK
4. 编译系统
./build.sh
出现以上内容,代表编译成功
5. 编译uboot,SDK默认不编译
cd a33_linux/dragonboard/brandy/u-boot-2011.09
make distclean
make sun8iw5p1_config
make -j4
出错可以不带 -j4 ,主要是为了多线程编译,提高编译效率
出现以上内容,即代表uboot编译完成。
6. 镜像打包
./build.sh pack
按照提示的路径找到 .img 镜像文件,烧录到开发板。
-----------------------至此,全志官方SDK已全部编译完成,接下来开始WiFi模块移植------------------------------------
ap6210 WiFi模块移植
根据A33官方文档,开发板上搭载的ap6210模组使用SDIO接口,802.11b/g/n 协议,支持Station、Softap、wifi direct 功能。
官方SDK在编译时会默认编译所有的 realtek wifi 驱动,会造成生成的镜像体积很大。
所以:在进入 a33_linux/dragonboard/linux-3.4 之后
make ARCH=arm menuconfig
【】Networking support —>
< > Bluetooth subsystem support —> 取消选中
< > RF switch subsystem support —> 取消选中
Wireless —>
<> cfg80211 - wireless configuration API
[ * ] nl80211 testmode command //这个选项要选上,协议支持的原因
Device Drivers —>
Network device support —>
Wireless LAN —>
Broadcom 4329/30 wireless cards support
此项会生成 /system/vendor/modules/fw_bcmxxx.bin和 /system/vendor/modules/nvram_apxxxx.txt
Interrupt type (Out-of-Band Interrupt)—>
< > Low level trigger for OOB interrupt 此项是否打开取决于 原理图 中,模组的 WL-WAKE-HOST 脚
与主控中间是否接反相器,若有则选中,实际中并没有看到这个选项。
若要实现WiFi工作于AP模式,即作热点,需要把 IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)选上。
执行:make
之后再对内核进行编译 ./build.sh
• WiFi模块移植
1. 新建文件夹 WiFi_AP
2. 下载OpenSSL下载地址 https://www.openssl.org/source/old/,在这里我所下载的版本是openssl-1.0.2l.tar.gz 下载地址https://www.openssl.org/source/old/1.0.2/openssl-1.0.2l.tar.gz ,将下载到的文件拷贝到WiFi_AP,并解压。
3. 下载libnl,下载地址http://www.infradead.org/~tgr/libnl/,在这里我所下载的版本是libnl-1.1.4.tar.gz 下载地址http://www.infradead.org/~tgr/libnl/files/libnl-1.1.4.tar.gz 将下载到的文件拷贝到WiFi_AP,并解压。
4. 最好手动下载hostap,在线克隆的版本可能会比较高,有时会出现一些问题,所以手动下载hostap1.0,编译通过。
5. 下载dnsmasq,http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.75.tar.gz ,将下载到的文件拷贝到WiFi_AP,并解压。
6. 下载wpa_supplicant-0.7.3,http://w1.fi/releases/wpa_supplicant-0.7.3.tar.gz
注:使用WiFi模块搭建热点AP模式,需要 libnl 和 openssl 库支持,即libnl+openssl+hostap
------------------------在32位环境下----------------------------
编译OpenSSL
1、进入openssl 目录:cd WiFi_AP/openssl-1.0.2l
2、配置openssl:./config no-asm shared --prefix=$(pwd)/__install
no-asm: 是在交叉编译过程中不使用汇编代码代码加速编译过程,原因是它的汇编代码是对arm格式不支持的。
shared :生成动态连接库。
--prefix :指定make install后生成目录的路径,不修改此项则默认为OPENSSLDIR目录(/usr/local/ssl)。
3、修改Makefile:
(1)修改编译工具CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc交叉编译工具链路径
(2)删除 CFLAG= 中的-m64
(3)将AR= ar $(ARFLAGS) r改为AR= /home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-ar ( A R F L A G S ) r ( 4 ) 将 R A N L I B = / u s r / b i n / r a n l i b 改 为 R A N L I B = / h o m e / f a n / t o o l c h a i n / e x t e r n a l − t o o l c h a i n / b i n / a r m − l i n u x − g n u e a b i − r a n l i b ( 5 ) 将 N M = n m 改 为 N M = / h o m e / f a n / t o o l c h a i n / e x t e r n a l − t o o l c h a i n / b i n / a r m − l i n u x − g n u e a b i − n m ( 6 ) 执 行 m a k e 命 令 ( 7 ) m a k e 命 令 执 行 完 毕 后 执 行 m a k e i n s t a l l 命 令 编 译 l i b n l 1 、 进 入 l i b n l 目 录 : W i F i A P / c d l i b n l − 1.1.4 2 、 配 置 l i b n l : . / c o n f i g u r e − − p r e f i x = (ARFLAGS) r (4)将RANLIB= /usr/bin/ranlib改为RANLIB= /home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-ranlib (5)将NM= nm改为NM= /home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-nm (6)执行make命令 (7)make命令执行完毕后执行make install命令 编译libnl 1、进入libnl目录:WiFi_AP/cd libnl-1.1.4 2、配置libnl:./configure --prefix= (ARFLAGS)r (4)将RANLIB=/usr/bin/ranlib改为RANLIB=/home/fan/toolchain/external−toolchain/bin/arm−linux−gnueabi−ranlib (5)将NM=nm改为NM=/home/fan/toolchain/external−toolchain/bin/arm−linux−gnueabi−nm (6)执行make命令 (7)make命令执行完毕后执行makeinstall命令编译libnl 1、进入libnl目录:WiFiAP/cdlibnl−1.1.4 2、配置libnl:./configure−−prefix=(pwd)/__install --enable-shared --enable-static
./configure CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc --prefix=$(pwd)/__install --enable-shared --enable-static --host=CC=//home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi
3、执行命令:make CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc 进行交叉编译
4、执行命令:make CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc install 进行安装
交叉编译hostapd 无线网卡作为路由器,工作于AP模式
1、进入hostapd目录:cd WiFi_AP/hostap/hostapd
2、采用默认配置,执行命令:cp defconfig .config
3、启用CONFIG_DRIVER_NL80211=y
4、修改Makefile,
(1)将
ifndef CC CC=gcc endif
改为
ifndef CC CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc endif
(2)
在Makefile开始添加
CFLAGS += -I…/…/libnl-1.1.4/__install/include/ CFLAGS += -I…/…/openssl-1.0.2l/__install/include/ LIBS += -L…/…/libnl-1.1.4/__install/lib/ LIBS += -L…/…/openssl-1.0.2l/__install/lib/
5、执行make命令:make CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc
可采用同样的方法修改编译wpa_supplicant 0.7.3 无线网卡连接其他设备,工作于STA模式
如果只想WiFi模块工作与AP模式,即热点模式,则不用编译。
交叉编译dnsmasq
1、进入dnsmasq 目录:cd WiFi_AP/dnsmasq-2.75
2、修改Makefile:
(1)在Makefile首行添加CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc
(2)设置安装目录PREFIX = /home/fan/a33_linux/wifi_ap/dnsmasq-2.75/__install
3、执行make
4、编译完成后,执行make install 安装
至此,编译工作完成,需把生成的可执行文件以及配置文件拷贝到开发板根文件系统。
具体如下:
mkdir -p /system/vendor/modules
cp bcmdhd.ko /system/vendor/modules
cp dnsmasq.conf hostapd.conf hostapd.accept hostapd.deny /etc
cp hostapd hostapd_cli dnsmasq /sbin
cp /dragonboard/bin/fw_bcm40181a2.bin /system/vendor/modules/
cp /dragonboard/bin/nvram_ap6210.txt /system/vendor/modules/
cp /dragonboard/bin/config.txt /system/vendor/modules/
mkdir /var/lib/misc
cp dnsmasq.leases(创建一个空文件即可) /var/lib/misc
编译wpa_supplicant 需要openssl库支持
1、进入hostapd目录:cd WiFi_AP/hostap/hostapd
2、采用默认配置,执行命令:cp defconfig .config
3、启用CONFIG_DRIVER_NL80211=y
4、修改Makefile,
(1)将
ifndef CC CC=gcc endif
改为
ifndef CC CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc endif
(2)
在Makefile开始添加
CFLAGS += -I…/…/libnl-1.1.4/__install/include/ CFLAGS += -I…/…/openssl-1.0.2l/__install/include/ LIBS += -L…/…/libnl-1.1.4/__install/lib/ LIBS += -L…/…/openssl-1.0.2l/__install/lib/
5、执行make命令:make CC=/home/fan/tool_chain/external-toolchain/bin/arm-linux-gnueabi-gcc
-------------------------------------在此介绍64位Ubuntu下遇到的wpa_supplicant编译问题以及解决办法----------------------------------------------------
首先,遇到的问题:
找不到 lcrypto 库
/…/…/…/arm-linux-gnueabi/bin/ld: cannot find -lcrypto
collect2: ld returned 1 exit status
Makefile:1288: recipe for target ‘wpa_passphrase’ failed
make: *** [wpa_passphrase] Error 1
根据出错描述,ld 是在编译器路径查找动态库,所以我们需要把 libcrypto.so.1.0.0 复制到交叉编译工具目录下的lib文件夹,(注意:直接复制 libxxx.so 无效),
需要将 libcrypto.so.1.0.0 复制到编译链的lib下,再执行 ln -sf libcrypto.so.1.0.0 libcrypto.so 生成链接文件;
最终问题解决。
当wpa_supplicant编译完成之后, 会产生wpa_supplicant 、wpa_cli 、wpa_passphrase、wpa_supplicant.conf 四个文件,其中wpa_supplicant 与 wpa_cli 是服务器与客户端关系,后台运行wpa_supplicant,使用 wpa_cli来搜索、设置、和连接网络。
wpa_passphrase 的作用:wpa_passphrase - Generate a WPA PSK from an ASCII passphrase for a SSID //wpa-passphrase-从ssid的ascii密码短语生成wpa-psk
把wpa_supplicant 、wpa_cli 复制到根文件系统下 /bin/
把wpa_supplicant.conf 复制到跟文件系统下的 /etc/下
wpa_supplicant.conf中内容:
fast_reauth=1
ctrl_interface=/data/wlan0
update_config=1
ap_scan=1
ctrl_interface_group=0
network={
ssid=“AA”
psk=“123456789”
priority=5
}
Wpa_supplicant作用:
1、读取配置文件
2、初始化配置参数,驱动函数
3、让驱动scan当前所有的bssid
4、检查扫描的参数是否和用户设置的想否
5、如果相符,通知驱动进行权限 认证操作
6、连上AP
wpa_cli 主要用于配置WiFi。
命令:
开机加载bcmdhd.ko 即加载WiFi模块
ifconfig wlan0 up 开启WiFi,
iwlist wlan0 scanning | grep ESSID 扫描附近热点,参数用于只显示热点名
wpa_supplicant -B -c/etc/wpa_supplicant.conf -iwlan0 使用wpa_supplicant 读取 *.conf中事先设置好的热点信息,并连接。
udhcpc -b -i wlan0 给STA模式的WiFi模块自动分配IP,否则不能ping百度。
ping www.baidu.com
目前仅使用wpa_supplicant 自己写配置文件 .conf 其中预先写死的WiFi名和密码,太局限性,wpa_cli 工具还没使用,另外还有其他 WirelessTools 更强大,等后续学习使用。
WirelessTools包括以下工具:
iwconfig:设置基本无线参数
iwlist:扫描、列出频率,比特率,密钥等
iwspy:获取每个节点链接的质量
iwpriv:操作WirelessExtensions 特定驱动
ifrename: 基于各种静态标准命名接口
命令介绍:
iw工具:是iwconfig的替代者
(1)可用于 open, WEP两种"认证/加密"的模式的使用
// 列出WIFI网卡的性能
iw list
//启动wifi模块
ifconfig wlan0 up
// 扫描WIFI AP
iw dev wlan0 scan
// 连接到WIFI AP:xxx (open模式) (没有密码的,开放式wifi的连接)
iw wlan0 connect xxx
// 连接到WIFI AP:xxx (WEP模式) 后面的xxxxx表示密码
iw wlan0 connect xxx keys d:0:xxxxxx
d: default, 0: 第0个密码
手动配置wifi热点的ip
ifconfig wlan0 192.168.1.22
ping 一下百度,看是否可以连通网络(前提,已经设置了支持外网)
ping www.baidu.com
断开热点的连接:
iw wlan0 disconnect