嵌入式Linux将驱动源代码编译成模块与编译进内核的操作

您所在的位置:网站首页 linux驱动程序如何加载进内核 嵌入式Linux将驱动源代码编译成模块与编译进内核的操作

嵌入式Linux将驱动源代码编译成模块与编译进内核的操作

2024-07-17 08:28| 来源: 网络整理| 查看: 265

一、在内核目录外将驱动程序编译成模块 1.配置交叉编译工具链:

1.1 ARCH, 比如: export ARCH=arm 1.2 CROSS_COMPILE, 比如: export CROSS_COMPILE=arm-buildroot-linux-gnueabihf- 1.3 PATH, 比如: PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin 注意:不同的开发板不同的编译器上述3个环境变量不一定相同,交叉编译工具链板商会提供。

2.修改模板Makefile内容 KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88 all: make -C $(KERN_DIR) M=`pwd` modules $(CROSS_COMPILE)gcc -o ledtest ledtest.c clean: make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.order rm -f ledtest # 参考内核源码drivers/char/ipmi/Makefile # 要想把a.c, b.c编译成ab.ko, 可以这样指定: # ab-y := a.o b.o # obj-m += ab.o # leddrv.c board_100ask_imx6ull.c 编译成 100ask_led.ko #指定自己的内核源码目录 100ask_led-y := leddrv.o board_100ask_imx6ull.o obj-m += 100ask_led.o 3.直接make 二、在内核目录内将驱动程序编译进内核 1.将要编译的驱动源文件拷贝到内核驱动文件目录下

以把led_drv.c驱动程序编译进内核为例 在这里插入图片描述

2.在内核源码目录的驱动目录下某类设备目录下使用gedit编辑Kconfig文件

Kconfig文件的作用是配置图形化界面menuconfig中的选项 在这里插入图片描述 按照Kconfig文件的格式添加MYLED配置选项,如下图所示,保存并退出 在这里插入图片描述

3.在内核目录下使用make menuconfig打开menuconfig图形化界面,看是否能找到上一步配置的选项,并进行设置

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 由上图可知我们添加的MYLED配置选项成功了,此时我们可以选择把驱动源码编译进内核、编译成模块、不编译(分别对应y、m、n,当Type为bool时只能设置y/n,当Type为tristate时可设置为y/n/m),默认情况下是编译进内核,即y。我们可以通过修改Kconfig添加项中的default选项修改默认的编译类型。 实际上在图形化界面menuconfig中选择把驱动源码编译进内核、编译成模块、不编译保存后会修改.config文件的内容,如下图所示。我们也可以在内核目录下编辑.config查看是否有变化内容 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 我们也可以不使用menuconfig图形化界面设置,直接在.config文件中按照原有格式添加内容即可。

4.修改drivers/char/Makefile文件

vi Makefile按照原有内容格式添加内容如下图所示。 在这里插入图片描述 在这里插入图片描述

5.make编译

如果是编译为模块(-m):make modules 如果是编译进内核(-y):make zImage //编译为镜像文件 若编译进内核需要将在Ubunt上编译出来的zImage放到板子上运行才能查到相关的设备节点(前提是驱动里面创建了设备节点才能查到)。

三、在内核目录内将驱动程序编译进内核,但是将驱动程序放在了内核目录的驱动目录下某类设备目录的子目录下

(eg:/home/book/100ask_imx6ull-sdk/Linux-4.9.88/drivers/char/my_drivers下的my_drv.c)

1.在子目录下创建Kconfig和Makefile文件,并在其中编辑相应内容

在这里插入图片描述

2.编辑子目录下(/home/book/100ask_imx6ull-sdk/Linux-4.9.88/drivers/char/my_drivers/)的Kconfig和Makefile,对应内容如下图。

Kconfig参考原来的Kconfig(上层目录的Kconfig)只写MY_DRV这一项配置 在这里插入图片描述 Makefile参考原来的Makefile(上层目录的Makefile)只加入CONFIG_MY_DRV这一项 在这里插入图片描述

3.编辑上层目录下(/home/book/100ask_imx6ull-sdk/Linux-4.9.88/drivers/char/)的Kconfig和Makefile,对应内容如下图。

使用gedit编辑Kconfig,加入内容:source"driver/char/my_drivers/Kconfig",表示上层目录的Kconfig引用了子目录的Kconfig。 在这里插入图片描述 使用vim编辑Makefile,加入内容:obj-y += my_drivers/,表示上层Makefile会调用子目录my_drivers/下的Makefile 在这里插入图片描述 注意:此时.config文件默认配置为-y选项,即编译进内核。也可以写:obj-$(CONFIG_MY_DRV) += my_drivers/,即Makefile根据.config的配置进行选择是编译为模块还是编译进内核。

4.在内核目录下使用make menuconfig打开menuconfig图形化界面,看是否能找到我们配置的选项

在这里插入图片描述 在这里插入图片描述

可以看到我们配置成功了,我们可以进入内核目录查看.config的内容,看看是否有该选项的配置

在这里插入图片描述 在这里插入图片描述 可以看到.config确实加入了该配置项,说明我们配置成功了

5.make编译

如果是编译为模块(-m):make modules 如果是编译进内核(-y):make zImage //编译为镜像文件 若编译进内核需要将在Ubunt上编译出来的zImage放到板子上运行才能查到相关的设备节点(前提是驱动里面创建了设备节点才能查到)。 若编译进内核需要将在Ubunt上编译出来的zImage放到板子上运行才能查到相关的设备节点(前提是驱动里面创建了设备节点才能查到)。

总结

1.Kconfig用于设置menuconfig图形化界面中的选项(注意:make menuconfig只能在内核源码目录下执行)。 2.menuconfig图形化界面进行相应设置保存后实际上是修改了内核源码目录下的.config文件内容,内核目录下的.config文件是隐藏文件,使用ls -a就能看到。我们也可以不通过menuconfig图形化界面进行设置,直接通过修改内核源码目录下的.config文件进行设置。 3.Kconfig、.config、Makefile的修改都要参考修改前的文件格式来,模仿以前的内容格式来修改即可。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3