在开发板上运行 OpenWRT时,发现在官网下的系统镜像中没有开发板所需的WiFi驱动,如并未包含的 RTL8188EU 驱动模块该怎么办呢?一般情况需要重新编译,编译选项中查看是否有自己需要的模块,如果有则编译进内核,如果没有就应该自己写个 package 再进行编译。在这里给出一种快捷但是比较 dirty 的办法:需要对源码编译过至少一次,因为编译过的代码目录中含有交叉编译工具链和目标文件等。
下面假定 OpenWRT 的源码目录在 /some/path/openwrt
,内核目录为其下的build_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/linux-sunxi_cortexa7/linux-x.x.x
,以及 Staging DIR 为其下的 staging_dir
,交叉编译工具链Toolchain 会存放在 Staging DIR 下的 toolchain-arm_cortex-a7+neon-vfpv4_gcc-7.4.0_musl_eabi
目录里,前缀为 arm-openwrt-linux-
。目标机器指令集为 arm_a7 。因为我这里使用的开发板为arm_cortex-a7架构。
那么,我们可以在驱动的目录下写一个脚本来帮助编译:
#!/bin/sh
PREFIX="~/openwrt"
ARCH=arm
KSRC="$PREFIX/build_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/linux-sunxi_cortexa7/linux-4.19.57"
STAGING_DIR="$PREFIX/staging_dir"
TOOLCHAIN_DIR="$STAGING_DIR/toolchain-arm_cortex-a7+neon-vfpv4_gcc-7.4.0_musl_eabi/bin"
CROSS_COMPILE="$TOOLCHAIN_DIR/arm-openwrt-linux-"
export STAGING_DIR=$STAGING_DIR
export PATH=$TOOLCHAIN_DIR:$PATH
make clean
make ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE KSRC=$KSRC
一般情况下厂商的 Makefile 都会帮你传递ARCH
、CROSS_COMPILE
和 KSRC
这几个变量,如 rtl8188eu 的驱动(https://github.com/lwfinger/rtl8188eu.git )。有的时候其他驱动可能需要阅读 Makefile
并做些修改。
最后把生成的内核模块scp
到装有对应固件的路由器上的/lib/modules/<kernel_version>/
下即可。使用 insmod
手动装入或者在 /etc/modules.d/
下创建一个配置文件来完成开机自动加载。
若在加载过程中出现以下错误insmod: ERROR: could not insert module xxxxx.ko: Unknown symbol in module,则有可能是该模块的相关依赖没有加载,先执行命令:
modinof xxxx.ko
查看 depends:所依赖的模块
先加载依赖模块,然后加载xxxx.ko模块。