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 搭建编译环境
1. Ubuntu-16.04-amd64 上环境搭建
     首先备份自己的源:cp /etc/apt/sources.list /etc/apt/sources.list.old
     打开sources.list 文件,修改:vi /etc/apt/sources.list
     删除全部内容后,添加网易的源:
   deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
   deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
   deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
   deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
   deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
   deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
   deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
   deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
   deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
   deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
   
     保存退出之后,跟新一下,使网易的源生效:apt-get update
   2. 安装Uboot镜像制作工具
     在官方源上找不到这个软件包,网易上有:apt-get install uboot-mkimage
     
   3. 安装编译环境所需要的库
     apt-get install 
     git gnupg flex bison gperf build-essential 
     zip curl libc6-dev libncurses5-dev x11proto-core-dev 
     libx11-dev:i386 libreadline6-dev:i386 
     libgl1-mesa-glx-lts-quantal:i386 libgl1-mesa-dev-lts-quantal 
     g+±multilib mingw32 tofrodos lib32ncurses5-dev 
     python-markdown libswitch-perl libxml2-utils xsltproc zlib1g-dev:i386
     注:lib32ncurses5-dev 这是32位运行库,有可能找不到软件包,自行百度解决。
     创建库的链接:
       ln -s /usr/lib/i386-linux-gnu/mesa/.1 /usr/lib/i386-linux-gnu/
       
   4. 编译器的安装与配置(非必需)
   注:安装完Ubuntu-16.04-amd64之后,先查看一下GCC 的版本,gcc -v我的是 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官方SDK1. 解压官方SDK包,复制到a33_linux文件夹下
     tar -vxf A33_vstar_linux.tar.bz2
     
   2. 使用默认配置
     cd a33_linux/dragonboard/linux-3.4/
     cp a33_vstar_defconfig .config
     
   3. 编译参数
     cd …
     ./ config4. 编译系统
     ./出现以上内容,代表编译成功
   
   5. 编译uboot,SDK默认不编译
     cd a33_linux/dragonboard/brandy/u-boot-2011.09
     make distclean
     make sun8iw5p1_config
     make -j4
     出错可以不带 -j4 ,主要是为了多线程编译,提高编译效率出现以上内容,即代表uboot编译完成。
   
   6. 镜像打包
     ./ 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
   之后再对内核进行编译 ./
   
 • 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 (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文件夹,(注意:直接复制  无效),
 需要将 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_cnotallow=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。
   
   
 命令:1. 开机加载bcmdhd.ko 即加载WiFi模块
2. ifconfig wlan0 up 开启WiFi,
3. iwlist wlan0 scanning | grep ESSID 扫描附近热点,参数用于只显示热点名
4. wpa_supplicant -B -c/etc/wpa_supplicant.conf -iwlan0 使用wpa_supplicant 读取 *.conf中事先设置好的热点信息,并连接。
5. udhcpc -b -i wlan0 给STA模式的WiFi模块自动分配IP,否则不能ping百度。
6. 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