AM437x驱动移植篇4------小米随身wifi驱动移植(MT7601、AP模式)

0.说明:

LINUX内核版本:4.14.79(不限内核版本,编译的时候如果有报错,根据报的错误简单修改源码即可)

平台:AM437x

1.下载源码:

源码下载地址在此

2.编译

sudo make LINUX_SRC=../../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,因为它们有先后依赖关系。

在本人调试过程中,在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=2M

bootargs设置如下:

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

ra0       Link encap:Ethernet  HWaddr FC:3D:93:B4:E9:9D  
          inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::fe3d:93ff:feb4:e99d/64 Scope:Link
          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)

此时已经可以搜索并连接上wifi了。

由于没有dhcp服务器,故连接的设备不能动态获取IP,此时便需要编译和配置dhcpd服务器。

4.交叉编译dhcpd服务器

源码下载:https://www.isc.org/downloads/

推荐下载4.1版本的

AM437x驱动移植篇4------小米随身wifi驱动移植(MT7601、AP模式)_第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 routers                  192.168.2.1;        #路由器地址
        option subnet-mask              255.255.255.0;      #子网掩码选项

        option nis-domain               "xfbaydhcp.com";
        option domain-name              "xfbaydhcp.com";     #域名
        option domain-name-servers      202.102.152.3;       #DNS地址

        option time-offset              -18000; # Eastern Standard Time

        range 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

你可能感兴趣的:(AM437x驱动移植篇4------小米随身wifi驱动移植(MT7601、AP模式))