举个例子,如果想在路由器上跑 OpenWRT 并未包含的 RTL8188EU 驱动模块该怎么办呢?在这里给出一种快捷但是比较 dirty 的办法(否则应该自己写个 package )。
首先得有编译固件时留下的 kernel 的源码,包括编译过程中生成的一些文件。
下面假定 OpenWRT 的源码目录在 /some/path/openwrt ,内核目录以及 Staging DIR 分别为其下的 build_dir/target-mips_r2_uClibc-x.x.x.x/linux-target_generic/linux-x.x.x和 staging_dir ,Toolchain 编译好后会存放在 Staging DIR 下的 toolchain-mips_r2_gcc-x.x-linaro_uClibc-x.x.x.x 目录里,前缀为 mips-openwrt-linux- 。目标机器指令集为 MIPS32 R2 。
那么,我们可以在内核驱动的目录下写一个脚本来帮助编译:
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/sh
PREFIX=
"/media/study/wrt/openwrt_trunk"
ARCH=mips
KSRC=
"$PREFIX/build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.9"
STAGING_DIR=
"$PREFIX/staging_dir"
TOOLCHAIN_DIR=
"$STAGING_DIR/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/bin"
CROSS_COMPILE=
"mips-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/ 下创建一个配置文件来完成开机自动加载。