以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
内容总结
(1)HI3518E+WIFI做AP,PC做STA,实现局域网内ortp视频传输。
(2)HI2518E+WIFI做STA,PC做STA,外部路由器做AP,实现局域网内ortp视频传。
(3)HI2518E+WIFI做STA,PC做STA,外部路由器做AP,实现全程无线调试(不用有线网卡)。
一、基本概念
1、WIFI接口
WIFI模块与SoC的接口有多种,如SDIO、USB、串口(低带宽)等,这里用的是USB接口。
2、AP、STA
AP(Access Point,接入点),一般指有线的或者无线的路由器。
STA(Station,站点),指接入路由器的终端设备,比如手机、笔记本等。
3、USB-WIFI的模式选项
USB-WIFI的模式选项,就是让你选择你的(拥有USB-WIFI模块的)设备是作为站点还是作为接入点。如果作为站点,它联网的时候就会搜索一个接入点来接入网络;如果作为接入点,局域网中其他设备在联网的时候会接入它。
二、AP模式USB-WIFI网卡移植
1、准备好软件资源。
(1)参考课程《USB-WIFI网卡在x210板子上的移植》,见博客USB-WiFi在x210板子上的移植。
注意此课程中USB-WIFI网卡仅作station模式,它通过接入房间里的无线路由器来上网。
(2)USB WIFI网卡官方提供的驱动。驱动源码见网盘资源【提取码: p3e7】,注意将Makefile替换掉压缩包里的Makefile。
(3)基于海思SDK中已经编译过的内核源码树来编译驱动。板载系统的内核和用来编译驱动的内核源码树必须对应一致,这样编译出来的驱动才能在板载系统上安装与工作。
2、设置好各种IP地址。
无线 有线 windows 192.168.0.30 192.168.1.20 开发板 192.168.0.100 192.168.1.10 ubuntu 192.168.0.50 192.168.1.141 3、解压USB WIFI驱动至合适位置。
root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver# ls ap sta root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver# cd ap/ root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver/ap# ls Makefile MT7601U_LinuxAP_3.0.0.1_20130802 root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver/ap# cd MT7601U_LinuxAP_3.0.0.1_20130802 root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802# ls ap ate chips common include load mac Makefile mcu mgmt os phy rate_ctrl RT2870APCard.dat RT2870AP.dat tools unload root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802#
4、修改网络名为“wlan”。
在ap/MT7601U_LinuxAP_3.0.0.1_20130802/include/rtmp_def.h文件中的第1627行左右,修改网络名为“wlan”,但其实不改也行,只是将来网络名字不叫wlan而是叫ra。
//#ifdef ANDROID_SUPPORT #define INF_MAIN_DEV_NAME "wlan" #define INF_MBSSID_DEV_NAME "wlan" //#else //#define INF_MAIN_DEV_NAME "ra" //#define INF_MBSSID_DEV_NAME "ra" //#endif /* ANDROID_SUPPORT */
5、修改Makefile文件
(1)用MT7601_driver/ap/Makefile文件,替换掉MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802目录下的Makefile文件。
(2)在Makefile文件中第106行附近修改内核源码树的路径。
ifeq ($(PLATFORM),HISI_3518E) #LINUX_SRC = /home/aston/sambashare/Hi3518E_SDK_V1.0.3.0/osdrv/opensource/kernel/linux-3.4.y 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) 此时执行“make”时会报错,报错原因是找不到某些头文件,但实际上在MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_2013080/include目录中有这些头文件,为何还是找不到呢?猜想是因为没有包含这些文件进来。
在Makefile文件中有下面一句,即包含配置文件config.mk。
include $(RT28xx_DIR)/os/linux/config.mk
进入到MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802/os/linux/config.mk文件中查看,发现是flag的问题,因此需要在该文件中1044行前后添加下面代码:
ifeq ($(PLATFORM),SMDK)EXTRA_CFLAGS := $(WFLAGS) endif//添加下面的这三行代码 ifeq ($(PLATFORM),HISI_3518E)EXTRA_CFLAGS := $(WFLAGS) endif
(4)此时执行make时依然出错,原因是缺少autoconf.h文件。分析发现,海思SDK直接解压后得到的kernel中并没有包含此文件,可能是在执行make distclean时删除了此文件。解决方法是重新单独编译kernel,可以获得此文件。更多解释见博文。
(5)Makefile原来规定将生成的xxx.ko文件存放在/tftpboot目录中,但我们想利用NFS将驱动拷贝到板载系统,因此修改Makefile,将生成的ko文件放到/home/xjh/iot/hisi_development/hisi_rootfs目录中。在Makefile的第416行附近修改如下:
ifeq ($(RT28xx_MODE),AP) ifneq ($(findstring 7601,$(CHIPSET)),) # cp -f $(RT28xx_DIR)/os/linux/mt$(MODULE)ap.ko /tftpbootcp -f $(RT28xx_DIR)/os/linux/mt$(MODULE)ap.ko /home/xjh/iot/hisi_development/hisi_rootfs/ elsecp -f $(RT28xx_DIR)/os/linux/rt$(MODULE)ap.ko /tftpboot endif
6、执行make进行编译
编译得到MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802/os/linux/下的mt7601Uap.ko这个驱动文件。由于上面的设置,在/home/xjh/iot/hisi_development/hisi_rootfs中也有这个文件。
root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802/os/linux# ls *.ko* mt7601Uap.ko root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802/os/linux# ls *.o ap_ioctl.o mt7601Uap.mod.o mt7601Uap.o rt_linux.o rt_main_dev.o rt_profile.o rt_usb.o rt_usb_util.o usb_main_dev.o root@ubuntu:/home/xjh/iot/hisi_development/usb-wifi/MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802/os/linux#
7、部署USB-WIFI驱动使之工作为AP
(1)确认模块被识别:先lsusb,然后插入USB WIFI模块,再lsusb,确认模块被识别。
/mnt # lsusb Bus 001 Device 001: ID 1d6b:0002 Bus 002 Device 001: ID 1d6b:0001 /mnt # usb 1-1: new high-speed USB device number 8 using hiusb-ehci usbdev11 -> /dev/usbdev1.8/mnt # lsusb Bus 001 Device 008: ID 148f:7601 Bus 001 Device 001: ID 1d6b:0002 Bus 002 Device 001: ID 1d6b:0001 /mnt #
(2)将虚拟机的MT7601_driver/ap/MT7601U_LinuxAP_3.0.0.1_20130802/RT2870AP.dat文件复制到/home/xjh/iot/hisi_development/hisi_rootfs目录中。然后将开发板中/mnt/RT2870AP.dat这个文件复制到开发板的/etc/Wireless/RT2870AP/目录中(需要自己创建目录),然后修改这个文件(该文件的项目不变,只是修改项目的值):
//复制时去掉注释 SSID=WIFI_XJH //在pc机上看到的wifi名 AuthMode=WPA2PSK //加密方式 EncrypType=TKIP;AES WPAPSK=123456789 //密码
(3)安装USB WIFI驱动模块,在板载系统/mnt目录下执行“insmod mt7601Uap.ko”。
/mnt # insmod mt7601Uap.ko rtusb init rt2870 --->=== pAd = c2f14000, size = 866712 ===<-- RTMPAllocTxRxRingMemory, Status=0 <-- RTMPAllocAdapterBlock, Status=0 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 NVM is EFUSE 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 usbcore: registered new interface driver rt2870 /mnt #
(4)使用“ifconfig -a”(不带参数-a则只能看到打开状态下的网卡)看是否有wlan0。
/mnt # ifconfig -a eth0 Link encap:Ethernet HWaddr B6:F2:52:D3:A1:DA inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:953 errors:0 dropped:0 overruns:0 frame:0TX packets:512 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1241589 (1.1 MiB) TX bytes:40320 (39.3 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:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)wlan0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 BROADCAST MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/mnt #
(5)启动wlan0,并设置其IP为192.168.0.100。具体操作见代码。
/mnt # ifconfig wlan0 up /mnt # ifconfig wlan0 192.168.0.100 /mnt # ifconfig eth0 Link encap:Ethernet HWaddr B6:F2:52:D3:A1:DA inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:972 errors:0 dropped:0 overruns:0 frame:0TX packets:515 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1247164 (1.1 MiB) TX bytes:40494 (39.5 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:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)wlan0 Link encap:Ethernet HWaddr 1C:BF:CE:2C:B2:5E inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/mnt #
(6)用PC或手机的WIFI搜索是否有一个名为WIFI_XJH的网络了,有的话则说明移植成功。
三、AP模式USB-WIFI网卡测试
1、准备测试用例
(1)基于第三季1:ORTP库的移植与局域网视频传输的工作,在mpp/sample/common/sample_common_venc.c文件中,修改LOCAL_HOST_IP为192.168.0.30。
55 uint32_t g_userts=0;56 RtpSession *pRtpSession = NULL;57 58 //#define LOCAL_HOST_IP "192.168.1.20"59 #define LOCAL_HOST_IP "192.168.0.30" //修改这里,注意书PC主机的无线ip
(2)在mpp/sample/venc目录下执行make得到sample_venc,将它复制到/home/xjh/iot/hisi_development/hisi_rootfs目录中。
2、测试实验
(1)为了证明是无线传输,我们拔掉主机与开发板之间的网线,因为拔掉网线后不能再通过/mnt访问虚拟机/home/xjh/iot/hisi_development/hisi_rootfs目录的内容,所以要将用到的文件拷贝到板载系统中,比如拷贝到板载系统的/tmp目录下。
(2)PC端连接无线网络WIFI-XJH,输入密码123456789。
(3)PC端设置无线网络的静态IP地址为192.168.0.30
(4)关闭PC端的防火墙,测试PC端(192.168.0.30)与板载系统(192.168.0.100)是否能够互相ping通。
C:\Users\34316>ping 192.168.0.100正在 Ping 192.168.0.100 具有 32 字节的数据: 来自 192.168.0.100 的回复: 字节=32 时间=13ms TTL=64 来自 192.168.0.100 的回复: 字节=32 时间=2ms TTL=64 来自 192.168.0.100 的回复: 字节=32 时间=5ms TTL=64 来自 192.168.0.100 的回复: 字节=32 时间=6ms TTL=64192.168.0.100 的 Ping 统计信息:数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位):最短 = 2ms,最长 = 13ms,平均 = 6msC:\Users\34316>
/mnt # ping 192.168.0.30 PING 192.168.0.30 (192.168.0.30): 56 data bytes 64 bytes from 192.168.0.30: seq=0 ttl=64 time=2.884 ms 64 bytes from 192.168.0.30: seq=1 ttl=64 time=7.627 ms 64 bytes from 192.168.0.30: seq=2 ttl=64 time=15.521 ms 64 bytes from 192.168.0.30: seq=3 ttl=64 time=6.592 ms 64 bytes from 192.168.0.30: seq=4 ttl=64 time=10.064 ms--- 192.168.0.30 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 2.884/8.537/15.521 ms /mnt #
(5)在开发板端的/tmp目录下执行“./sample_venc 0”,然后输入c。
(6)在VLC播放器中,选择媒体,打开文件,选择sdp文件(提取码ms4a)(此文件的c=IN IP4 192.168.1.20没有修改为192.168.0.30,但照样可以运行?)。此时如果能看到实时图像(有延迟)就证明整个测试完成了。