A33芯片+Linux3.4内核+ap6210wifi模块

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/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
          
      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官方SDK

  1. 解压官方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 …
        ./build.sh config

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  4RANLIB=/usr/bin/ranlibRANLIB=/home/fan/toolchain/externaltoolchain/bin/armlinuxgnueabiranlib  5NM=nmNM=/home/fan/toolchain/externaltoolchain/bin/armlinuxgnueabinm  6make  7makemakeinstalllibnl  1libnlWiFiAP/cdlibnl1.1.4  2libnl:./configureprefix=(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。
  
  
命令:

  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
  
  断开热点的连接:
  iw wlan0 disconnect

你可能感兴趣的:(学习体会)