驱动程序编译进内核

一、驱动程序存在的形式

1. 将驱动成编译成一个ko,ko是一个独立的module

驱动程序安装:#insmod led_drv.ko
驱动程序卸载:#rmmod led_drv.ko
每次重启后需手动安装。

2. 如何开机自动安装驱动,运行应用程序。

1)将驱动程序下载到 /test目录下:/test/led_drv.ko
2)修改/etc/profile:
#vi /etc/profile
cd /test
insmod led_drv.ko
cd /
每次重启自动安装。

3. 将驱动程序编译到linux内核中,使驱动程序和linux内核成为一个整体。

即编译内核将驱动程序一同编译,并将其(led_drv.ko)打包进内核映像(boot.img)。 在linux内核启动的过程中,会自动的安装(led_drv.ko)驱动。

内核的编译过程:
Image(未压缩的内核映像)—>zImage(压缩)—>mkimage(uboot生成工具)将zImage加个头—>uImage---->ext4文件系统打包,生成boot.img

二、如何将一个驱动程序编译进内核

1. 将驱动程序放入内核源码

/kernel/drivers/char/leds/led_drv.c

2. 创建一个Kconfig文件

/kernel/drivers/char/leds/Kconfig
内容如下:

menu "S5P6818 LED Driver"

config S5P6818_LEDS
	tristate "led drivers for s5p6818"
	depends on ARCH_S5P6818
	default y
	help
	  this is a driver for S5P6818, D8---GPIOC17,D9--GPIOC8,D10--GPIOC7,D11--GPIOC12
	  
endmenu

Kconfig作用:定义一个条件编译选项和配置菜单。当make menuconfig弹出Kconfig定义的菜单,对条件编译选项赋值。

分析Kconfig文件:

1)menu “S5P6818 LED Driver” … endmenu

菜单的开始,菜单的名字,菜单的结束。
----->make menuconfig时会看到

2)config S5P6818_LEDS

定义了一个条件编译选项,条件编译选项在使用时候会加一个前缀:CONFIG_(即CONFIG_S5P6818_LEDS)。
make menuconfig是对条件编译选项进行赋值,在Makefile编译驱动的时候,会使用条件编译选项。

3)tristate “led drivers for s5p6818”

条件编译选项的值是tristate:
Y —> 驱动程序编译进内核。(Y–>yes)
M —> 驱动程序不编译进内核,但是在驱动程序的源码目录下,会生成一个ko。(M–>module)
N —> 驱动程序不编译。(N–>no)

扩展:
tristate —> Y–<>, M–, N–< > ===> <> 三个值
bool —>Y–[
], N–[ ] ===> [] 两个值

4)depends on ARCH_S5P6818

条件编译选项S5P6818_LEDS是依赖于条件编译选项ARCH_S5P6818的,只有ARCH_S5P6818的值为Y的时候,才有机会对S5P6818_LEDS条件编译选项进行赋值。

5)default y

条件编译选项的值默认是Y

6)help
  this is a driver for GEC6818, D8---GPIOC17,D9--GPIOC8,D10--GPIOC7,D11--GPIOC12

帮助说明。

3. 创建一个Makefile文件

/kernel/drivers/char/leds/Makefile
内容:

obj-$(CONFIG_S5P6818_LEDS) += led_drv.o

所有文件:

root@wsl-VirtualBox:~/kernel/S5P6818/kernel/drivers/char/leds# ls
Kconfig  led_drv.c  Makefile

思考:我们创建的Makefile和Kconfig有和linux内核的Makefile与Kconfig联系在一起吗?如何联系在一起?

4. 修改上一级目录下Kconfig

/kernel/drivers/char/Kconfig
添加:

source "drivers/char/leds/Kconfig"

5. 修改上一级目录下的Makefile

/kernel/drivers/char/Makefile
添加:

obj-y	+= leds/

6. 配置内核

wsl@wsl-VirtualBox:~/kernel/S5P6818/kernel$ cp arch/arm/configs/GEC6818_defconfig  .config
wsl@wsl-VirtualBox:~/kernel/S5P6818/kernel$ make menuconfig

找到配置的位置:输入**"/"**,进入搜索窗口,搜索条件编译选项:CONFIG_S5P6818_LEDS
│ Symbol: S5P6818_LEDS [=y] │
│ Type : tristate │
│ Prompt: led drivers for s5p6818 │
│ Defined at drivers/char/leds/Kconfig:3 │
│ Depends on: ARCH_S5P6818 [=y] │
│ Location: │
│ -> Device Drivers │
│ -> Character devices │
│ -> S5P6818 LED Driver

修改配置选项 :
Device Drivers —>
Character devices —>
S5P6818 LED Driver —>
<*> led drivers for s5p6818 (NEW)

保存、退出

7. 保存配置

wsl@wsl-VirtualBox:~/kernel/S5P6818/kernel$ cp .config arch/arm/configs/GEC6818_defconfig

8. 编译

wsl@wsl-VirtualBox:~/kernel/S5P6818/kernel$ ./mk -k

编译输出:

CC      drivers/char/leds/led_drv.o

  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready

  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  
  UIMAGE  arch/arm/boot/uImage
  Image arch/arm/boot/uImage is ready
  
  /home/bobey/6818GEC/out/release/boot.img

9. 将boot.img烧写到emmc

1)fastboot
2)恢复卡

10. 内核在启动的过程中,会自动安装驱动

三、比喻:

驱动源文件:/kernel/drivers/char/leds/led_drv.c ---->饭店的原材料
条件编译选项:config S5P6818_LEDS ---->一道菜的ID
tristate “led drivers for s5p6818” ---->tristate —菜有三种选择:Y—在饭店吃,M—菜打包,N–菜没有点
---->“led drivers for s5p6818” —>菜单上看到的菜名
default y ---->这道菜默认是点中,并在饭店吃的。

depends on ARCH_S5P6818 ---->包厢

Kconfig ---->饭店的菜谱
make menuconfig —> 点菜的过程

.config —>点菜后,下给饭店的单
S5P6818_defconfig —> .config备份

Makefile —>饭店的厨师

boot.img ---->上桌的菜
led_drv.ko —>打包的菜

关键:条件编译选项

条件编译选项在Kconfig中定义,make menuconfig对条件编译选项进行赋值,条件编译选项赋值后保存到.config中, Makefile根据条件编译选项的值来编译驱动源文件。

四、条件编译选项

1. 问题1

在linux内核源码,使用了条件编译选项:

//arch/arm/mach-s5p6818/devices.c

static struct platform_device *i2c_devices[] = {
	#if	defined(CONFIG_I2C_NXP_PORT0)
	&i2c_device_ch0,
	#endif
	#if	defined(CONFIG_I2C_NXP_PORT1)
	&i2c_device_ch1,
	#endif
	#if	defined(CONFIG_I2C_NXP_PORT2)
	&i2c_device_ch2,
	#endif
};

使用了3个条件编译选项:CONFIG_I2C_NXP_PORT0、CONFIG_I2C_NXP_PORT1、CONFIG_I2C_NXP_PORT2

如何知道这三个条件编译选项编译的时候定义了。

方法:
条件编译选项在Kconfig中定义,make menuconfig对条件编译选项进行赋值,条件编译选项赋值后保存到.config中, Makefile根据条件编译选项的值来编译驱动源文件。

所以:通过查找.config文件,可以知道条件编译选项是否定义。

在内核源码的编译过程中,.config文件会生成一个头文件。
.config ----> kernel/include/generated/autoconf.h

可在 autoconf.h中看到是否有定义。

问题2

1)如何清除内核的编译:

wsl@wsl-VirtualBox:~/kernel/S5P6818/kernel$ make clean

wsl@wsl-VirtualBox:~/kernel/S5P6818/kernel$ make distclean

2)make clean 和meke distclean区别

make clean—>清除编译过程中生成目标文件、库文件、映像文件
make distclean —>make clean + 清除配置文件(.config)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值