在開發(fā)板上運行 OpenWRT時卿叽,發(fā)現(xiàn)在官網(wǎng)下的系統(tǒng)鏡像中沒有開發(fā)板所需的WiFi驅(qū)動巷屿,如并未包含的 RTL8188EU 驅(qū)動模塊該怎么辦呢?一般情況需要重新編譯滋觉,編譯選項中查看是否有自己需要的模塊到千,如果有則編譯進內(nèi)核昌渤,如果沒有就應(yīng)該自己寫個 package 再進行編譯。在這里給出一種快捷但是比較 dirty 的辦法:需要對源碼編譯過至少一次憔四,因為編譯過的代碼目錄中含有交叉編譯工具鏈和目標(biāo)文件等膀息。
下面假定 OpenWRT 的源碼目錄在 /some/path/openwrt
,內(nèi)核目錄為其下的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-
柿汛。目標(biāo)機器指令集為 arm_a7 冗酿。因為我這里使用的開發(fā)板為arm_cortex-a7架構(gòu)。
那么络断,我們可以在驅(qū)動的目錄下寫一個腳本來幫助編譯:
#!/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 的驅(qū)動(https://github.com/lwfinger/rtl8188eu.git )貌笨。有的時候其他驅(qū)動可能需要閱讀 Makefile
并做些修改胯究。
最后把生成的內(nèi)核模塊scp
到裝有對應(yīng)固件的路由器上的/lib/modules/<kernel_version>/
下即可。使用 insmod
手動裝入或者在 /etc/modules.d/
下創(chuàng)建一個配置文件來完成開機自動加載躁绸。
若在加載過程中出現(xiàn)以下錯誤insmod: ERROR: could not insert module xxxxx.ko: Unknown symbol in module,則有可能是該模塊的相關(guān)依賴沒有加載,先執(zhí)行命令:
modinof xxxx.ko
查看 depends:所依賴的模塊
先加載依賴模塊净刮,然后加載xxxx.ko模塊剥哑。