LINUX内核版本:4.14.79(不限内核版本,编译的时候如果有报错,根据报的错误简单修改源码即可)
平台:AM437x
源码下载地址在此
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文件。
在源码目录下有一个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服务器。
源码下载: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 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