AM437x驱动移植篇4------小米随身wifi驱动移植(MT7601、AP模式)
0.说明: LINUX内核版本:4.14.79(不限内核版本,编译的时候如果有报错,根据报的错误简单修改源码即可)
平台:AM437x
1.下载源码: 源码下载地址在此
2.编译
sudo make LINUX_SRC=https://www.it610.com/linux-4.14.79+gitAUTOINC+bde58ab01e-gbde58ab01e ARCH=arm CROSS_COMPILE=/opt/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin/arm-linux-gnueabihf-
由于我使用的内核版本为4.14.76,在Linux4.14中将原来的vfs_read函数 替换成了 kernel_read函数。在编译过程中如果提示找不到vfs_read函数,则可将vfs_read函数替换成kernel_read。修改的目标文件是MT7601源码根目录下的./src/os/linux/rt_linux.c文件。
3.拷贝到arm板上并insmod 在源码目录下有一个etc/Wireless文件夹,将Wireless文件夹整个的拷贝到arm板上的/etc目录下。
/etc/Wireless/RT2870AP/RT2870AP.dat文件作为配置文件以文本的形式配置了wifi名、密码等参数。源码编译成功后会生成三个.ko文件,分别是:
rtutil7601Uap.ko
mt7601Uap.ko
rtnet7601Uap.ko
按照先后顺序insmod:
insmod rtutil7601Uap.ko
insmod mt7601Uap.ko
insmod rtnet7601Uap.ko
注意,必须要按照列出的先后顺序进行insmod,因为它们有先后依赖关系。
【AM437x驱动移植篇4------小米随身wifi驱动移植(MT7601、AP模式)】在本人调试过程中,在insmod最后一个ko文件时遇到了dma申请内存空间失败的问题:
[61.812592] rtutil7601Uap: loading out-of-tree module taints kernel.
[61.870811] mt7601Uap: module license 'unspecified' taints kernel.
[61.877216] Disabling lock debugging due to kernel taint
[61.908476] rtusb init rtusbAP --->
[61.913672]
[61.913672]
[61.913672] === pAd = f0c45000, size = 856120 ===
[61.913672]
[61.923631] <-- ERROR in Alloc Bulk buffer for HTTxContext!
[61.929238] ---> RTMPFreeTxRxRingMemory
[61.933426] <--- RTMPFreeTxRxRingMemory
[61.937386] ERROR!!!
[61.937391] Failed to allocate memory - TxRxRing
[61.944953] <-- RTMPAllocAdapterBlock, Status=3
[61.949549] rtusbAP: probe of 3-1:1.0 failed with error -1
[61.956462] usbcore: registered new interface driver rtusbAP
ifconfig: SIOCSIFADDR: No such device
猜想可能是由于dma空间大小不够导致,解决方法:
在启动参数中加入:
coherent_pool=2Mbootargs设置如下:bootargs=console=ttyO0,115200n8 coherent_pool=2M root=/dev/mmcblk0p3 rw rootfstype=ext4 rootwait
此时再insmod完成后可通过ifconfig -a命令看到ra0
设置IP和子网掩码:
ifconfig ra0 192.168.2.1 netmask 255.255.255.0
ra0Link encap:EthernetHWaddr FC:3D:93:B4:E9:9D
inet addr:192.168.2.1Bcast:192.168.2.255Mask:255.255.255.0
inet6 addr: fe80::fe3d:93ff:feb4:e99d/64 Scope:Link
UP BROADCAST RUNNING MULTICASTMTU:1500Metric: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)
此时已经可以搜索并连接上wifi了。
由于没有dhcp服务器,故连接的设备不能动态获取IP,此时便需要编译和配置dhcpd服务器。
4.交叉编译dhcpd服务器 源码下载:https://www.isc.org/downloads/
推荐下载4.1版本的
文章图片
编译:
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabi --with-randomdev=no ac_cv_file__dev_random=yes
make "CC=arm-linux-gnueabihf-gcc -static"
编译成功后会在dhcp-4.1-ESV-R15-P1/server目录下生成一个dhcpd文件,并将此文件拷贝到arm板上。
在/etc下创建dhcpd.conf文件,并写入以下内容:
ddns-update-style interim;
#配置使用过渡性 DHCP-DNS互动?新模式。
ignore client-updates;
#忽略客户端?新subnet 192.168.2.0 netmask 255.255.255.0 {option routers192.168.2.1;
#路由器地址
option subnet-mask255.255.255.0;
#子网掩码选项option nis-domain"xfbaydhcp.com";
option domain-name"xfbaydhcp.com";
#域名
option domain-name-servers202.102.152.3;
#DNS地址option time-offset-18000;
# Eastern Standard Timerange dynamic-bootp 192.168.2.100 192.168.2.200;
#租用IP地址的范?
default-lease-time 21600;
#缺省租约时间
max-lease-time 43200;
#最大租约时间# we want the nameserver to appear at a fixed address
host ns {
next-server marvin.redhat.com;
hardware ethernet 12:34:56:78:AB:CD;
fixed-address 207.175.42.254;
}
}
运行:
./dhcpd
随后便可以接入WiFi并获取到IP了。
参考链接:https://blog.csdn.net/fish43237/article/details/78961481
推荐阅读
- 两感一练
- Spring注解驱动第十讲--@Autowired使用
- 数据驱动
- 2019大有可为,企业增效要数据、技术和创新三轮驱动
- 小狗钱钱快版来啦
- 三宝成功抢救大宝中国干细胞组,另一例脐血造血干细胞移植
- LUA|单片机脚本语言移植lua到stm32MDK
- 驱动调试小结
- 业务驱动的全景监控体系在阿里的应用|业务驱动的全景监控体系在阿里的应用 | 阿里巴巴DevOps实践指南
- 数智融合加速驱动企业商业创新