這裡使用「kconfig樹」這個詞是因為我不知道準確的說法應該是怎樣的,我想表達的意思是:make menuconfig的選單中能夠顯示我們自己寫的驅動資訊,我們可以通過make menuconfig來決定是否使用該驅動,這樣也讓核心知道我們驅動的存在,而不是讓我們寫的驅動成為乙個野生的程式以致汙染核心。其實"kconfig樹"這個詞也還算準確,一級一級的kconfig檔案確實是以樹的形式組織的。
接下來講怎麼向linux kconfig樹中新增驅動配置資訊。主要涉及的檔案就三個,第乙個是你寫的驅動原始檔(***.c),第二個是kconfig檔案,第三個是makefile檔案。
驅動原始檔應該放在核心原始碼樹的某一目錄下,如果不知道該放哪或者想偷懶的話,可以統一放在drivers/misc下或者在drivers/misc/***下,***是你自己新建的乙個資料夾,相比前乙個目錄更方便管理。
make menuconfig**現的配置選項就是由kconfig檔案決定的。這裡我們以在drivers/misc/下新建test資料夾的情況為例說明。
此時我們的drivers/misc/test目錄下應有三個檔案:驅動原始檔(我這裡是motor.c)、kconfig檔案、makefile檔案。
在編寫kconfig檔案之前,需要先在drivers/misc/kconfig檔案中新增我們自己的kconfig檔案的資訊:source "drivers/misc/test/kconfig"
,這樣我們的kconfig檔案才會被加入到kconfig樹中。
我們自己的kconfig檔案的內容如下:
menu "houtong test devices"
config water_motor
tristate "water_motor"
depends on pwm
default n
help
houtong test module. say y when you want to support this tool.
endmenu
**中成對出現的menu "houtong test devices"
和endmenu
並不是必需的,他們的作用是在make menuconfig選單的上一級目錄中新建乙個名為:「houtong test devices」的目錄,這樣也算是便於**和管理。make menuconfig選單效果如下兩圖。
drivers/misc對應選單目錄的device drivers->misc devices。我們在kconfig檔案中新增了menu "houtong test devices"
和endmenu
**後,選單中misc devices目錄下就會出現「houtong test devices」目錄,在選單中按回車進入此目錄後就能看到我們自己寫的驅動的配置資訊:water_motor
。而這個water_motor
驅動配置資訊是由如下**決定的:
config water_motor
tristate "water_motor"
depends on pwm
default n
help
houtong test module. say y when you want to support this tool.
config water_motor
中的water_motor應該全部大寫,因為這部分**將會在原始碼根目錄下的.config檔案中生成巨集定義config_water_motor,巨集定義應該全部大寫。原始碼根目錄的makefile將根據.config檔案中是否有相應巨集定義來決定是否執行相應驅動的makefile檔案。
tristate表明此驅動編譯的方式有三種:y(編譯進核心),m(不編譯進核心,而是生成模組,模組需要單獨在開發板安裝),n(不編譯)。
在驅動原始檔、kconfig檔案、makefile檔案都準備好的前提下,如果選擇y,那麼驅動會被直接編譯進核心映象(zimage、uimage),驅動會在核心啟動階段自動載入,並在控制台輸出probe函式和module_init巨集中的列印資訊,如下圖。
如果選擇m,驅動不會被編譯進核心映象,而是以模組的形式單獨編譯,所以zimage、uimage的大小會小一些。此時使用make zimage或make uimage loadaddr=0x40007000來編譯核心時不會編譯驅動模組,核心啟動時也不會自動載入驅動。要想編譯驅動模組,需要用命令make modules來單獨編譯驅動模組。在編譯完後,在每個驅動源檔案目錄下會生成對應的模組檔案(.ko),此時如果到各個目錄下去找這些模組檔案是很麻煩的。所以下一步用命令make modules_install install_mod_path="***"將所有的.ko檔案拷貝到***目錄下。此時我們可以將這些.ko檔案拷貝到開發板上,然後用modprobe或insmod來安裝這些模組,這時候驅動才算載入成功了。
如果選擇n,驅動不會被編譯。
接著說**:
config water_motor
tristate "water_motor"
depends on pwm
default n
help
houtong test module. say y when you want to support this tool.
depends on pwm
表示此驅動需要依賴pwm驅動,即要想把此驅動設定為y或m必須先把pwm設定為y。
defualt n
表示此驅動預設設定為n。
help用於描述此驅動,可在make menuconfig選單中的help中檢視驅動的資訊,如下圖:
之前介紹的kconfig檔案只是在make menuconfig選單中加入配置資訊,但並沒有進行驅動的編譯工作。makefile的工作就是根據kconfig的配置資訊來編譯驅動。
在編寫我們自己的makefile之前,需要先修改drivers/misc/makefile:在檔案最後一行新增obj-y += test/
,這樣原始碼根目錄的makefile就會一級一級找到我們自己的makefile,我們寫的驅動檔案才會被編譯。
我們自己的驅動檔案的makefile檔案內容如下:
obj-$
+= motor.o
沒錯,只有短短的一行。一般情況下,makefile的此編譯命令的數量是等於驅動檔案的數量的,即乙個驅動對應一行編譯指令。
至於語法,config_water_motor之前已經提到過了,是在kconfig中決定的,其最終的值可以在原始碼根目錄的.config檔案中檢視。$即為其值,替換後命令即為obj-y += motor.o
或obj-m += motor.o
,他們分別表示將驅動編譯進核心和將驅動編譯成模組。
至於為何這句**能實現這樣的功能,我估計要去看原始碼根目錄下的makefile檔案。反正核心都幫我們做好了,我們照著寫就好了。
最小有向生成樹
先看一下lrj的大白書上的講解 emm。我是看完之後直接看的模板題 居然看懂。行吧。就是先判斷 能不能聯通 如能聯通 就求出每個點的最小前驅邊 求完之後 看有沒有環 如有環 縮點更新 然後一直重複 直至無環且聯通。鄰接矩陣模板 include include include include incl...
FHQ Treap樹(無旋Treap樹)模板向
這種樹是一種無需旋轉操作的treap樹,由fhq 範浩強 大佬發明,堪稱是神級的資料結構!他短小精悍,易於學習,而其思想之優雅令無數oier acmer以及程式設計師們為之著迷!在了解這個資料結構之前最好先了解一下treap樹以及笛卡爾樹,這兩種樹本身具有一定的相似性,而為fhq treap提供了思...
dp 有向樹k中值問題
問題描述 給定一棵有向樹t,樹 t中每個頂點u都有乙個權 w u 樹的每條邊 u,v 也都有乙個非負邊長 d u,v 有向樹t的每個頂點 u 可以看作客戶,其服務需求量為w u 每條邊 u,v 的邊長 d u,v 可以看作運輸費用。如果在頂點u 處未設定服務機構,則將頂點u 處的服務需求沿有 向樹的...