以下内容源于朱有鹏课程,如有侵权,请告知删除。
参考博客
hisi3518ev200移植MT7601_fsczp的博客-CSDN博客
wpa_supplicant移植与使用_andylauren的博客-CSDN博客
Linux wpa_cli 调试方法_weixin_34168700的博客-CSDN博客
12 海思Hi3518E移植WIFI驱动(STA模式)_QtHalcon的博客-CSDN博客
内容总结
(1)HI2518E+WIFI做STA,PC做STA,外部路由器做AP,实现局域网内ortp视频传输。
(2)HI2518E+WIFI做STA,PC做STA,外部路由器做AP,实现局域网全程无线调试。
一、STA模式USB-WIFI网卡移植
1、修改Makefile文件
文件路径是MT7601_driver/sta/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/Makefile。
(1)注释掉之前的PLATFORM,然后在67行添加“PLATFORM = HISI_3518E”。
//省略部分代码,注释掉这些 #PLATFORM = BLPMP #PLATFORM = MT85XX #PLATFORM = MT53XX #PLATFORM = NXP_TV550 #PLATFORM = MVL5 #PLATFORM = RALINK_3352 #PLATFORM = UBICOM_IPX8 #PLATFORM = INTELP6 #PLATFORM = MSTARTV//添加下面代码 PLATFORM = HISI_3518E
(2)仿照相应的格式,在105行附近添加下面内容。
ifeq ($(PLATFORM),HISI_3518E) LINUX_SRC = /home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/opensource/kernel/linux-3.4.y CROSS_COMPILE = arm-hisiv300-linux- export ARCH = arm endif
(3)修改xxx.ko文件输出路径。即在Makefile文件440行附近修改如下,将来在/home/xjh/iot/hisi_development/hisi_rootfs/目录中得到mt7601Usta.ko文件。
ifneq ($(findstring 7601,$(CHIPSET)),)cp -f $(RT28xx_DIR)/os/linux/mt$(MODULE)sta.ko /home/xjh/iot/hisi_development/hisi_rootfs/ 2>/dev/null || :elsecp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)sta.ko /tftpboot 2>/dev/null || :endif
2、修改config.mk文件
文件路径是MT7601_driver/sta/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/config.mk。
(1)搜索HAS_WPA_SUPPLICANT,确认是否如下。
24 # Support Wpa_Supplicant25 # i.e. wpa_supplicant -Dralink26 HAS_WPA_SUPPLICANT=y27 28 29 # Support Native WpaSupplicant for Network Maganger30 # i.e. wpa_supplicant -Dwext31 HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
(2)仿照相应的格式,在987行附近添加下面内容。
987 ifeq ($(PLATFORM),HISI_3518E)988 EXTRA_CFLAGS += $(WFLAGS)989 export EXTRA_CFLAGS990 endif
3、修改网卡名称为wlan
在MT7601_driver/sta/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/include/rtmp_def.h文件中修改内容如下。
1600 //#ifdef ANDROID_SUPPORT 1601 #define INF_MAIN_DEV_NAME "wlan" 1602 #define INF_MBSSID_DEV_NAME "wlan" 1603 //#else 1604 //#define INF_MAIN_DEV_NAME "ra" 1605 //#define INF_MBSSID_DEV_NAME "ra" 1606 //#endif /* ANDROID_SUPPORT */
4、安装驱动
(1)在MT7601_driver/sta/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/下执行“make”。
(2)安装mt7601Usta.ko文件,即在板载系统的/mnt目录下执行“insmod mt7601Usta.ko”。
注意先卸载mt7601Uap.ko模块(如果有的话),否则会报错。
/mnt # ls RT2870AP.dat mt7601Usta.ko stream_chn0.h264 mt7601Uap.ko sample_venc /mnt # insmod mt7601Usta.ko rtusb init rt2870 ---> ===>rt2870_probe()! --> RTMPAllocAdapterBlock=== pAd = c2ed6000, size = 841592 ===--> RTMPAllocTxRxRingMemory <-- RTMPAllocTxRxRingMemory, Status=0 <-- RTMPAllocAdapterBlock, Status=0 NumEndpoints=8 BULK IN MaxPacketSize = 512 EP address = 0x84 BULK IN MaxPacketSize = 512 EP address = 0x85 BULK OUT MaxPacketSize = 512 EP address = 0x 8 BULK OUT MaxPacketSize = 512 EP address = 0x 4 BULK OUT MaxPacketSize = 512 EP address = 0x 5 BULK OUT MaxPacketSize = 512 EP address = 0x 6 BULK OUT MaxPacketSize = 512 EP address = 0x 7 BULK OUT MaxPacketSize = 512 EP address = 0x 9 RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x8 RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x4 RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x5 RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x6 RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x7 RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x9 STA Driver version-3.0.0.3 -->MT7601_Init(): Chip specific bbpRegTbSize=0! Chip VCO calibration mode = 0! NVM is EFUSE Efuse Size=0x1d [Range:1e0-1fc] Endpoint(8) is for In-band Command Endpoint(4) is for WMM0 AC0 Endpoint(5) is for WMM0 AC1 Endpoint(6) is for WMM0 AC2 Endpoint(7) is for WMM0 AC3 Endpoint(9) is for WMM1 AC0 Endpoint(84) is for Data-In Endpoint(85) is for Command Rsp Allocate a net device with private data size=0! Allocate net device ops success! The name of the new wlan interface is wlan0... RtmpOSNetDevAttach()---> <---RtmpOSNetDevAttach(), ret=0 <===rt2870_probe()! usbcore: registered new interface driver rt2870 /mnt #
(2)将MT7601_driver/sta/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/RT2870STA.dat文件复制到开发板的/etc/Wireless/RT2870STA目录。此时不用修改里面的参数,后续可以配合wpa_supplicant来修改。注意这个目录和RT2870AP目录不一样,别放在RT2870AP目录,否则启动网卡时会报错:
#忽略部分输出 !!! rt28xx init fail !!! rt28xx_open return fail! ifconfig: SIOCSIFFLAGS: Operation not permitted
二、移植wpa_supplicant
1、源码下载与解压
(1)可以从网盘资源1111下载以下资源。
(2)或者从http://hostap.epitest.fi/wpa_supplicant/下载wpa_supplicant-2.5.tar.gz。
(3)或者从ftp://ftp.openssl.org/source/old/0.9.x/下载openssl-0.9.8za.tar.gz。之所以下载openssl,是因为wpa_supplicant依赖于openssl。
(5)使用tar -zxvf 命令解压wpa_supplicant-2.5.tar.gz、openssl-0.9.8za.tar.gz。
2、移植openssl
(1)给openssl打补丁。把MT7601_driver/sta/wpa_supplicant-2.5/patches/openssl-0.9.8za-tls-extensions.patch文件拷贝到MT7601_driver/sta/openssl-0.9.8za目录下,然后在MT7601_driver/sta/openssl-0.9.8za目录下执行:(后续怎么操作呢?)
patch -p1 < openssl-0.9.8za-tls-extensions.patch
(2)修改MT7601_driver/sta/openssl-0.9.8za/Makefile文件中相关参数的值。
CC=arm-hisiv300-linux-gcc AR=arm-hisiv300-linux-ar $(ARFLAGS) r AD=arm-hisiv300-linux-ar $(ARFLAGS) d RANLIB=arm-hisiv300-linux-ranlib INSTALLTOP=/tmp/openssl OPENSSLDIR=/tmp/openssl
(3)在MT7601_driver/sta/openssl-0.9.8za/目录下执行make,然后make install。
执行make install时报错如下:
smime.pod around line 272: Expected text after =item, not a number smime.pod around line 276: Expected text after =item, not a number smime.pod around line 280: Expected text after =item, not a number smime.pod around line 285: Expected text after =item, not a number smime.pod around line 289: Expected text after =item, not a number POD document had syntax errors at /usr/bin/pod2man line 71. make: *** [install_docs] 错误 1
这是因为OpenSSL与perl版本不兼容,解决方法是执行“rm -f /usr/bin/pod2man”,然后重新make与make install。
(4)安装好后,在/tmp/openssl目录有诸多文件,我们需要其中的lib和include目录。
root@ubuntu:/tmp/openssl# ls bin certs include lib man misc openssl.cnf private root@ubuntu:/tmp/openssl#
3、移植wpa_supplicant
(1)首先在MT7601_driver/sta/wpa_supplicant-2.5/wpa_supplicant目录下执行“cp defconfig ./.config”。
(2)然后修改.config,增加以下内容:
CC=arm-hisiv300-linux-gcc -L/tmp/openssl/lib CFLAGS+=-I /tmp/openssl/include LIBS+=-L/tmp/openssl/lib
(4)在MT7601_driver/sta/wpa_supplicant-2.5/wpa_supplicant目录下执行make。
此时报错如下:
../src/drivers/driver_nl80211.c:17:31: fatal error: netlink/genl/genl.h:没有那个文件或目录#include <netlink/genl/genl.h>^ compilation terminated. make: *** [../src/drivers/driver_nl80211.o] 错误 1
解决方法在上述的.config文件中,将CONFIG_DRIVER_NL80211=y 注释掉。
(5)重新执行make,如果生成wpa_supplicant、wpa_cli,则移植成功完成。
其中wpa_supplicant是服务器端,wpa_cli是客户端。这是linux底下运用命令行管理无线网络的方式。
三、STA模式USB-WIFI网卡测试
1、部署wpa_supplicant
(1)将上面生成的wpa_supplicant、wpa_cli拷贝到开发板的/usr/bin目录。
(2)在板载系统上,创建/etc/wpa_supplicant.conf文件,并配置内容如下(注意去掉注释):
ctrl_interface=/var/run/wpa_supplicantnetwork={ ssid="XJH-ChinaNet-2.4G"//当前我房间的无线路由器的网络名字 scan_ssid=1 key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE//加密方式 pairwise=TKIP CCMP group=CCMP TKIP WEP104 WEP40 psk="xie732787"//路由器的密码 }
2、STA模式USB-WIFI的设置
(1)在开发板/mnt目录下执行“insmod mt7601Usta.ko”,安装驱动mt7601Usta.ko。(如果之前已经安装,这步忽略。)
(2)设置开发板USB-WIFI网卡的静态IP地址。这里之所以设置静态IP,是因为还没有移植DHCP。这个USB-WIFI网卡最后要接入路由器,所以其网段要与实际路由器的网段一致。
SSID: XJH-ChinaNet-2.4G 协议: Wi-Fi 4 (802.11n) 安全类型: WPA2-个人 网络频带: 2.4 GHz 网络通道: 10 链接速度(接收/传输): 72/72 (Mbps) IPv6 地址: 240e:3b6:30f5:81e0:f2ef:8c53:d1e6:68ab 本地链接 IPv6 地址: fe80::bac4:e6ab:a08d:e14c%6 IPv6 DNS 服务器: fe80::1%6 fe80::1%6 IPv4 地址: 192.168.1.7 #笔记本的ip地址 IPv4 DNS 服务器: 192.168.1.1 #路由器的ip地址 制造商: Realtek Semiconductor Corp. 描述: Realtek RTL8821CE 802.11ac PCIe Adapter 驱动程序版本: 2024.0.10.209 物理地址(MAC): 0C-96-E6-67-5D-33
本人的无线路由器的地址信息如上,因此可以把开发板的USB-WIFI网卡的静态IP地址设置为192.168.1.211。
/mnt # ifconfig wlan0 up #省略部分输出 RTUSBBulkReceive! <==== rt28xx_init, Status=0 ==> RTMPEnableRxTx ==> DMAIdle, GloCfg=0x40000050 <== RTMPEnableRxTx 0x1300 = 00064300 RTMPDrvOpen(1):Check if PDMA is idle! ==> DMAIdle, GloCfg=0x40000050 Driver auto reconnect to last OID_802_11_SSID setting - 11n-AP, len - 6 RTMPDrvOpen(2):Check if PDMA is idle! CntlOidSsidProc():CNTL - 0 BSS of 0 BSS match the desire (6)SSID - 11n-AP CNTL - All roaming failed, restore to channel 1, Total BSS[00] ==> DMAIdle, GloCfg=0x40000050 /mnt # ifconfig wlan0 192.168.1.211 /mnt # ifconfig eth0 Link encap:Ethernet HWaddr 52:A6:95:FB:AF:7A inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:3942 errors:0 dropped:0 overruns:0 frame:0TX packets:1911 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:4780527 (4.5 MiB) TX bytes:149290 (145.7 KiB)Interrupt:12 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:16436 Metric:1RX packets:12 errors:0 dropped:0 overruns:0 frame:0TX packets:12 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:780 (780.0 B) TX bytes:780 (780.0 B)wlan0 Link encap:Ethernet HWaddr 1C:BF:CE:2C:B2:5E inet addr:192.168.1.211 Bcast:192.168.1.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:5290 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1646173 (1.5 MiB) TX bytes:0 (0.0 B)/mnt #
(3)开发板作为STA接入到路由器。在开发板/mnt目录下执行以下命令,其中-dd表示打开调试信息,&表示让其工作在后台。这行命令表示让wpa_supplicant 工作起来。
/mnt # wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -dd & #省略部分输出 EAPOL: External notification - portValid=1 EAPOL: External notification - EAP success=1 EAPOL: SUPP_PAE entering state AUTHENTICATING EAPOL: SUPP_BE entering state SUCCESS EAP: EAP entering state DISABLED EAPOL: SUPP_PAE entering state AUTHENTICATED EAPOL: Supplicant port status: Authorized EAPOL: SUPP_BE entering state IDLE EAPOL authentication completed - result=SUCCESS RTM_NEWLINK: operstate=1 ifi_flags=0x11043 ([UP][RUNNING][LOWER_UP]) RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan0' added WEXT: if_removed already cleared - ignore event SYNC - AP changed N OperaionMode to 0 EAPOL: startWhen --> 0 EAPOL: disable timer tick MT7601AsicTemperatureCompensation::Change to TEMPERATURE_MODE_HIGH SYNC - AP changed B/G protection to 1 SYNC - AP changed N OperaionMode to 3 SYNC - AP changed B/G protection to 0 SYNC - AP changed N OperaionMode to 1 SYNC - AP changed N OperaionMode to 0 SYNC - AP changed B/G protection to 1 SYNC - AP changed N OperaionMode to 3 SYNC - AP changed B/G protection to 0 SYNC - AP changed N OperaionMode to 0 SYNC - AP changed N OperaionMode to 1 SYNC - AP changed B/G protection to 1 #这是动态的输出,需要按下回车继续下一步
(4)使用命令“wpa_cli -i wlan0 status”查看连接状态。
/mnt # wpa_cli -i wlan0 status EAPOL: EAP Session-Id not available CTRL-DEBUG: ctrl_sock-sendto: sock=7 sndbuf=163840 outq=0 send_len=200 bssid=28:93:7d:25:a5:bd freq=0 ssid=XJH-ChinaNet-2.4G id=0 mode=station pairwise_cipher=CCMP group_cipher=TKIP key_mgmt=WPA2-PSK wpa_state=COMPLETED ip_address=192.168.1.211 address=1c:bf:ce:2c:b2:5e /mnt #
(5)测试连接效果
因为开发板有两个网卡,无线网卡和有线网卡,因此ping的时候要通过“-I”来指定使用哪个网卡;或者使用命令“ifconfig eth0 down”把有线网卡关闭,从而自动使用无线网卡(推荐)。
1)ping通路由器或者说网关,使用“ping -I wlan0 192.168.1.1”。
2)想要ping通外网时,先要使用命令“route add default gw 192.168.1.1 dev wlan0”添加网关信息(即路由器的ip),然后可以测试“ping -I wlan0 8.8.8.8”(google的dnw server)。因为没有添加DNS,所以不能直接类似ping www.baidu.com.cn这种形式。
3、ORTP视频传输测试
(1)基于第三季1:ORTP库的移植与局域网视频传输的工作,在mpp/sample/common/sample_common_ven.c中,修改LOCAL_HOST_IP 为192.168.1.7,这个IP地址是笔记本无线接入时自动分配的。
(2)在mpp/sample/venc目录下编译得到sample_venc文件。
(3)将sample_venc文件拷贝到虚拟机/home/xjh/iot/hisi_development/hisi_rootfs/目录中,系统启动后这个目录会挂载到板载系统的/mnt目录,将板载系统的/mnt/sample_venc文件拷贝到板载系统的/tmp目录中。为了验证是无线传输,需要使用“ifconfig eth0 down”关闭有线网卡,然后在/tmp目录下执行“./sample_venc 0”,输入c。
(4)在PC端,将有线网卡的IP设置成无线IP不同网段(我这里恰巧是同一网段了,有线网卡的静态IP是192.168.1.10,这导致没有实时画面,后来将有线网卡的IP改为192.168.2.10之后就有画面了)。
(5)VLC播放器中选择媒体,打开文件,选择sdp文件(提取码ms4a)(注意修改sdp中c=IN IP4 192.168.1.7)。如果能看到有延迟的实时画面,则说明测试成功。
四、全程无线调试
1、操作原理
(1)虚拟机桥接到无线网卡,虚拟机、PC、开发板三者都做STA,连接同一个AP。
(2)开发板事先移植部署好USB WIFI驱动、wpa_supplicant等。
(3)开发板/etc/profile中设计好配置WIFI启动、连接AP、静态IP等。
(4)在开发板/etc/profile中设置,让虚拟机无线挂载到开发板。
2、操作步骤
(1)先确认开发板已经部署USB-WIFI驱动、wpa_supplicant工具(即上面的二三步骤)。注意有线挂载时就要把mt7601Usta.ko这个驱动拷贝到开发板/home目录下,因为无线挂载的前提是安装这个驱动,如果不从开发板/mnt目录拷贝到/home目录,就找不到这个文件了。
(2)将虚拟机桥接到无线网卡,然后在etc/network/interfaces文件中修改IP如下(为了区别之前的有线网卡IP,这里特意修改为192.168.1.123。另外这里之所以用static而不是dhcp,是为了与开发板/etc/profile中的固定设置对应起来),然后“ifdown eth0”再“ifup eth0”,此时虚拟机的“无线网卡”IP地址就为192.168.1.123,可以ping通外网与上网。
# interfaces(6) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopbackauto eth0 iface eth0 inet static #iface eth0 inet dhcp address 192.168.1.123 netmask 255.255.255.0 gateway 192.168.1.1
root@ubuntu:/# ifdown eth0 root@ubuntu:/# ifup eth0 root@ubuntu:/# ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=139 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=16.4 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=17.8 ms ^C --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2004ms rtt min/avg/max/mdev = 16.433/58.100/139.977/57.899 ms root@ubuntu:/# ifconfig eth0 Link encap:以太网 硬件地址 00:0c:29:a0:0e:00 inet 地址:192.168.1.123 广播:192.168.1.255 掩码:255.255.255.0inet6 地址: fe80::20c:29ff:fea0:e00/64 Scope:Linkinet6 地址: 240e:3b6:30f5:81e0:20c:29ff:fea0:e00/64 Scope:GlobalUP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1接收数据包:246216 错误:7 丢弃:0 过载:0 帧数:0发送数据包:262957 错误:0 丢弃:0 过载:0 载波:0碰撞:0 发送队列长度:1000 接收字节:35100104 (35.1 MB) 发送字节:272290315 (272.2 MB)中断:19 基本地址:0x2000 lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0inet6 地址: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 跃点数:1接收数据包:20826 错误:0 丢弃:0 过载:0 帧数:0发送数据包:20826 错误:0 丢弃:0 过载:0 载波:0碰撞:0 发送队列长度:0 接收字节:2247838 (2.2 MB) 发送字节:2247838 (2.2 MB)root@ubuntu:/#
(3)在开发板/etc/profile文件中修改(添加)
cd /ko ./load3518e -i -sensor ar0130 -osmem 32 -total 64insmod /home/mt7601Usta.ko ifconfig wlan0 up ifconfig wlan0 192.168.1.211 wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf & route add default gw 192.168.1.1 dev wlan0mount -t nfs -o nolock 192.168.1.123:/home/xjh/iot/hisi_development/hisi_rootfs /mntcd /mnt
(4)使用reboot命令重启开发板,看效果。
如果顺利完成,则可以在开发板的/mnt目录下看到虚拟机/home/xjh/iot/hisi_development/hisi_rootfs目录下的内容。