openwrt只编译出.ko驱动

在开发板上运行 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 都会帮你传递ARCHCROSS_COMPILEKSRC 这几个变量,如 rtl8188eu 的驱动(https://github.com/lwfinger/rtl8188eu.git )。有的时候其他驱动可能需要阅读 Makefile 并做些修改。

最后把生成的内核模块scp 到装有对应固件的路由器上的/lib/modules// 下即可。使用 insmod 手动装入或者在 /etc/modules.d/ 下创建一个配置文件来完成开机自动加载。

若在加载过程中出现以下错误insmod: ERROR: could not insert module xxxxx.ko: Unknown symbol in module,则有可能是该模块的相关依赖没有加载,先执行命令:

modinof xxxx.ko

查看 depends:所依赖的模块

先加载依赖模块,然后加载xxxx.ko模块。

你可能感兴趣的:(openwrt只编译出.ko驱动)