嵌入式linux 驱动编译进内核

简介

一般我们开发一个驱动的时候,首先是把这个驱动编译成一个.ko格式的驱动模块,然后动态地在命令行中加载进内核才能去使用。但是大家可能会想,linux里面本来就自带很多驱动,他们都不是像.ko文件一样加载进内核的,能不能把我自己写的驱动也放进去开机的时候自启动呢?当然是可以的。下面,我以我写的pwm驱动为例,将他编译进内核里。

将驱动编译进linux内核

首先,我先介绍一下linux内核源码里面的drivers目录。
嵌入式linux 驱动编译进内核_第1张图片

顾名思义,就是指驱动。linux内核里面的所有设备驱动都在里面了。比如 drivers/input就是输入相关的驱动, drivers/i2c 就是 I2C 相关驱动目录。平时我们写的驱动一般都是字符设备驱动,我们就把它放进 drivers/char里面。

1.复制.c文件到内核源码

将驱动的.c文件复制过去,如图:
在这里插入图片描述

2.修改 Makefile

打开 drivers/char 目录下的 Makefile 文件,将 .c 文件添加进来
嵌入式linux 驱动编译进内核_第2张图片
在这些 Makefile 文件中我们会看到很多“ obj-$(CONFIG_XXX) += xxxx.o” CONFIG_XXX 变量一般可以取 3 个不同的值: y、 m、 n 。下面以我的pwm驱动为例说明
当我们编译内核源码的时候, 会检查 $(CONFIG_PWM)这个变量的值,当它为=y时,即[ obj- y += pwm.c ] ,则pwm.c文件就会被编译进内核镜像。同理,等于m的时候,pwm.c 源文件会被编译成.ko 驱动模块文件。等于n的时候,pwm.c 源文件既不会编译进内核镜像文件,也不会编译成驱动模块。linux内核驱动里的makefile文件里面就定义了很多这种变量,他会在Kconfig文件里面决定好这些变量的值,以此来大批量管理驱动。

3.修改 Kconfig

打开内核源码 drivers/char 目录下的 Kconfig 文件,添加如下代码
嵌入式linux 驱动编译进内核_第3张图片
“ config PWM”其实就是 CONFIG_PWM 变量的配置项,用于配置 CONFIG_PWM 变量的值是 y、 m 还是 n。 “ default y”表示该配置项的默认值是 y。tristate后面的语句就是menuconfig里面显示的菜单栏。help就是打印出的帮助信息。

4.menuconfig 配置

在linux源码目录下执行以下命令:

make distclean // 清理之前的配置信息
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig // 配置工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig // 打开menuconfig图形化配置

进入到如下目录,就能看到我们刚刚写的菜单栏了,前面有个 * 代表已经默认开启了这个驱动
嵌入式linux 驱动编译进内核_第4张图片
打开help,就能看到我们刚刚写的帮助信息了
嵌入式linux 驱动编译进内核_第5张图片

编译测试

如何验证我的驱动文件在开机的时候就自动加载进内核了呢?那很简单,在驱动文件里面使用printk输出加载成功的打印信息就可以了。
嵌入式linux 驱动编译进内核_第6张图片
之后编译内核,将生成的 zImage 镜像文件拷贝到开发板启动,这时,加载成功后就会在启动日志中显示printk中的语句啦!

你可能感兴趣的:(zynq开发,linux驱动开发,笔记,linux,内核)