第五季1:AP模式USB-WIFI网卡移植与测试

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

内容总结

(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地址。

无线有线
windows192.168.0.30192.168.1.20
开发板192.168.0.100 192.168.1.10
ubuntu192.168.0.50192.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 /tftpboot
        cp -f $(RT28xx_DIR)/os/linux/mt$(MODULE)ap.ko /home/xjh/iot/hisi_development/hisi_rootfs/
else
        cp -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.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:953 errors:0 dropped:0 overruns:0 frame:0
          TX packets:512 errors:0 dropped:0 overruns:0 carrier:0
          collisions: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.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions: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:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions: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.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:972 errors:0 dropped:0 overruns:0 frame:0
          TX packets:515 errors:0 dropped:0 overruns:0 carrier:0
          collisions: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.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions: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.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions: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=64

192.168.0.100 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 2ms,最长 = 13ms,平均 = 6ms

C:\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,但照样可以运行?)。此时如果能看到实时图像(有延迟)就证明整个测试完成了。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值