8. 添加驱动模块到Linux内核

大部分有修改内核需求的用户基本上都是对于驱动的修改或者是对于设备树的修改, 其中设备树目录在 arch/arm/boot/dts 目录下,设备树插件目录在 arch/arm/boot/dts/overlays 目录下, 驱动目录在ebf_linux_kernel/drivers下, 每个不同的驱动占用一个子目录,如char、block、 net、 mtd、 i2c等。

下面介绍如何往内核中添加一个wii1驱动模块,在ebf_linux_kernel/drivers/net/wireless目录,用于存放无线驱动,我们将在这个目录下添加新的WiFi驱动,以 rtl8723bu 为例。

8.1. 获取驱动源码

一般WiFi的驱动源码都可以从GitHub找到。

1
git clone https://github.com/lwfinger/rtl8723bu.git

将驱动源码移动到内核源码ebf_linux_kernel/drivers/net/wireless目录下

../../_images/wifi_driver0.jpg

在ebf_linux_kernel/drivers/net/wireless/Makefile添加: obj-$(CONFIG_RTL8723BU) += rtl8723bu/

../../_images/wifi_driver1.jpg

在ebf_linux_kernel/drivers/net/wireless/Kconfig添加 source “drivers/net/wireless/rtl8723bu/Kconfig”

../../_images/wifi_driver2.jpg

修改驱动源码ebf_linux_kernel/drivers/net/wireless/rtl8723bu/Makefile 将CONFIG_PLATFORM_I386_PC 改为n,添加CONFIG_PLATFORM_IMX8M = y,默认为I386_PC,我们添加我们imx8mmini平台。

../../_images/wifi_driver3.jpg

继续在ebf_linux_kernel/drivers/net/wireless/rtl8723bu/Makefile添加平台信息:

1
2
3
4
5
6
7
ifeq ($(CONFIG_PLATFORM_IMX8M), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
ARCH := arm
CROSS_COMPILE := aarch64-linux-gnu-
KSRC ?= /home/dev/hyw/imx8/ebf_linux_kernel/build_image/build
endif
../../_images/wifi_driver4.jpg

其中:

  • EXTRA_CFLAGS:小端模式;

  • ARCH: arm 平台;

  • CROSS_COMPILE:交叉编译器;

  • KSRC:编译出来的内核所在目录; (需按实际路径填写)

在ebf_linux_kernel/drivers/net/wireless/rtl8723bu/Makefile中添加src的路径,因为如果使用脚本的方式编译内核deb包,此种方式是隔离的,也就是源码和编译产物分开两个文件夹,如果没有指定src可能找不到头文件等, 如果是直接编译的,因为没有源码和产物隔离,可以不添加。

使用脚本编译内核deb包需添加内容如下:

1
2
src=$(KERNEL_DIR)/drivers/net/wireless/rtl8723bu
EXTRA_CFLAGS += -I$(src)/include
../../_images/wifi_driver8.jpg

打开menuconfig界面,将我们添加的WiFi模块选中,WiFi模块一般编译成模块。

1
make menuconfig KCONFIG_CONFIG=arch/arm64/configs/imx_v8_defconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

按键盘的“/”,然后输入8723进行搜索,找到我们添加的rtl8723bu,如下

../../_images/wifi_driver5.jpg
../../_images/wifi_driver6.jpg

选择右下角的“Save”,然后修改 保存的路径为.config,注意不要默认保存到原路径的配置文件 ,然后退出界面输入以下命令,覆盖原来的配置文件。

1
2
3
4
5
# 保存defconfig文件
make savedefconfig ARCH=arm64

# 覆盖原来的配置文件
cp defconfig arch/arm64/configs/imx_v8_defconfig

执行以下命令编译新的内核deb安装包。

1
2
3
4
5
#清除之前的编译生成文件和配置
make mrproper

#编译内核deb包
./make_deb.sh
../../_images/wifi_driver7.jpg

可见,build_image/build/drivers/net/wireless/rtl8723bu/生成了内核模块8721bu.ko

将linux-image-5.4.47-imx8mm_1.2406stable_arm64.deb内核deb包通过前面介绍过方式将deb安装包重新安装到开发板上。

在开发板子上可看到 /lib/modules/5.4.47-imx8mm/kernel/drivers/net/wireless/rtl8723bu/8723bu.ko 文件。

如果插入rtl8723bu usb WiFi模块,执行lsmod可以看到8723bu.ko被自动加载,并且执行ifconfig可以看到wlan0无线网卡。

8.1.1. 参考资料

作者以前写的文档: https://www.firebbs.cn/forum.php?mod=viewthread&tid=34420

kernel官网: https://www.kernel.org/

NXP内核源码: https://github.com/Freescale/linux-fslc