04_Linux下把驅動編譯進核心

爱吃冰激凌的黄某某發表於2024-04-22

Linux下把驅動編譯進核心

需求:

把前面課程學習的helloworld驅動編譯到核心。

例子:

source"drivers/redled/Kconfig"
config LED_4412
	tristate "Led Support for GPIO Led"
	depends on LEDS CLASS
	help
	This option enable support for led

說明:

1.source “drivers/redled/Kconfig”

他會包含drivers/redled/這個路徑下的驅動檔案,方便我們對選單進行管理

2.config LED__4412

配置選項的名稱,CONFIG_LED_4412

3.tristate 表示的驅動的狀態,把驅動編譯成模組,把驅動編譯到核心,不編譯

與之對應的還有bool 分別是編譯到核心,不編譯

“Led Support for GPIO Led” make menuconfig顯示的名字

A depends on B

表示只有在選擇B的時候才可以選擇A

4.比如我想直接去掉LED相關的去掉,我們直接改.config檔案可以嗎?

可以,但是不推薦。如果有依賴的話,直接修改.config是不成功的。

5.select

​ 反向依賴,該選項被選中時,後面的定義也會被選中。

help

This option enable support for led

幫助資訊

例項:

sudo apt-get install lzop
sudo apt-get install u-boot-tools

注意這兩個依賴,沒有會導致編譯報錯,開啟板子不列印helloworld

進入核心原始碼目錄

image-20240418135508010

進入drivers/char/中, "cd drivers/char/"

image-20240418135615431

建立hello資料夾,並進入

image-20240418135701497

複製helloworld.c到hello資料夾,建立Kconfig檔案

image-20240418135734254

編寫Kconfig

config HELLO
    tristate "hello world"
    help
    hello hello

建立Makefile

image-20240418140209623

編寫Makefile

# $(CONFIG_HELLO):根據我們選擇的驅動的狀態去改變,選擇編譯到核心就是y(obj-y),選擇編譯到模組就是m(obj-m)
# CONFIG_HELLO 名稱是由Kconfig中的HELLO,前面+CONFIG_得到
obj-$(CONFIG_HELLO)+=helloworld.o

返回上一級目錄

image-20240418140559798

修改Makefile

image-20240418150930758

修改Kconfig

image-20240418142407285

返回原始碼根目錄

"export ARCH=arm"

輸入"make menuconfig"

image-20240418142602621

image-20240418142704171

image-20240418142731400

按空格變成* --> 編譯進核心

image-20240418142827246

儲存退出

進入.config,檢視hello

image-20240418143043212

檢視create.sh

image-20240418143331816

編譯時使用的是arch/arm/configs/imx_v7_defconfig這個檔案來編譯的,不是使用我們修改make menuconfig生成的.config檔案

使用"make distclean"清除所有的編譯檔案

image-20240418143702303

使用"cp arch/arm/configs/imx_v7_defconfig .config"將imx_v7_defconfig 複製成.config

意思是選單上都是特色菜,但需要加一道菜

image-20240418143839400

使用"make menuconfig"再將hello world編譯進核心

image-20240418144013588

儲存退出

進入arch/arm/configs/ 將imx_v7_defconfig改成imx_v7_defconfig_nohello

"cd arch/arm/configs/"

"mv imx_v7_defconfig imx_v7_defconfig_nohello"

將我們核心根目錄使用make menuconfig生成的.config 複製到arch/arm/configs/下,並改成imx_v7_defconfig

"cp /home/mzx/imx6ull/linux-imx-rel_imx_4.1.15_2.1.0_ga/.config imx_v7_defconfig"

image-20240418144615056

返回核心原始碼根目錄, 執行指令碼 "./create.sh"

image-20240418150744832

檢視drivers/char/hello/下有helloworld.o檔案,說明編譯成功

image-20240418151337975

將arch/arm/boot下的zImage檔案燒錄到開發板上

image-20240418151450748

相關文章