目錄
Linux 驅(qū)動(dòng)兩種運(yùn)行方式
字符設(shè)備驅(qū)動(dòng)框架
1、創(chuàng)建目錄和編寫文件
2、添加頭文件路徑
3、Makefile編寫和解釋
4、編譯測(cè)試
Linux 驅(qū)動(dòng)兩種運(yùn)行方式
第一種就是將驅(qū)動(dòng)編譯進(jìn) Linux 內(nèi)核中,這樣當(dāng) Linux 內(nèi)核啟動(dòng)的時(shí)候就會(huì)自動(dòng)運(yùn)行驅(qū)動(dòng)程序;
第二種就是將驅(qū)動(dòng)編譯成模塊(Linux 下模塊擴(kuò)展名為.ko),在Linux 內(nèi)核啟動(dòng)以后使用“insmod”命令加載驅(qū)動(dòng)模塊。
在調(diào)試驅(qū)動(dòng)的時(shí)候一般都選擇將其編譯為模塊,這樣修改驅(qū)動(dòng)以后只需要編譯一下驅(qū)動(dòng)代碼即可,不需要編譯整個(gè) Linux 代碼,而且在調(diào)試的時(shí)候只需要加載或者卸載驅(qū)動(dòng)模塊即可,不需要重啟整個(gè)系統(tǒng)。
將驅(qū)動(dòng)編譯為模塊最大的好處就是方便開發(fā),當(dāng)驅(qū)動(dòng)開發(fā)完成,確定沒(méi)有問(wèn)題以后就可以將驅(qū)動(dòng)編譯進(jìn)Linux 內(nèi)核中,當(dāng)然也可以不編譯進(jìn) Linux 內(nèi)核中,具體看自己的需求。
模塊有加載和卸載兩種操作,在編寫驅(qū)動(dòng)的時(shí)候需要注冊(cè)這兩種操作函數(shù),模塊的加載和卸載注冊(cè)函數(shù),如下
module_init(xxx_init); module_exit(xxx_exit); |
//注冊(cè)模塊加載函數(shù) //注冊(cè)模塊卸載函數(shù) |
module_init 函數(shù)用來(lái)向 Linux 內(nèi)核注冊(cè)一個(gè)模塊加載函數(shù),參數(shù) xxx_init 就是需要注冊(cè)的具體函數(shù),當(dāng)使用“insmod”命令加載驅(qū)動(dòng)的時(shí)候, xxx_init 這個(gè)函數(shù)就會(huì)被調(diào)用。 module_exit()函數(shù)用來(lái)向 Linux 內(nèi)核注冊(cè)一個(gè)模塊卸載函數(shù),參數(shù) xxx_exit 就是需要注冊(cè)的具體函數(shù),當(dāng)使用“rmmod”命令卸載具體驅(qū)動(dòng)的時(shí)候 xxx_exit 函數(shù)就會(huì)被調(diào)用。
下面開始創(chuàng)建字符設(shè)備驅(qū)動(dòng)框架
字符設(shè)備驅(qū)動(dòng)框架
1、創(chuàng)建目錄和編寫文件
在IMX6ULL/Linux_Drivers創(chuàng)建目錄1_chrdevbase
在vscode打開目錄并并創(chuàng)建chrdevbase.c文件,在chrdevbase.c文件輸入下面的代碼
#include <linux/module.h>
static int __int chrdevbase_init(void)
{
? ? return 0;
}static void __exit chrdevbase_exit(void)
{
? ??
}module_init(chrdevbase_init);
module_exit(chrdevbase_exit);
第 4 行,定義了個(gè)名為chrdevbase_init 的驅(qū)動(dòng)入口函數(shù),并且使用了“__init”來(lái)修飾
第 11?行,定義了個(gè)名為chrdevbase_exit 的驅(qū)動(dòng)出口函數(shù),并且使用了“__exit”來(lái)修飾
第 17?行,調(diào)用函數(shù) module_init 來(lái)聲明chrdevbase_init 為驅(qū)動(dòng)入口函數(shù)
????????????????當(dāng)加載驅(qū)動(dòng)的時(shí)候 chrdevbase_init函數(shù)就會(huì)被調(diào)用
第18行,調(diào)用函數(shù)module_exit來(lái)聲明chrdevbase_exit為驅(qū)動(dòng)出口函數(shù)
????????????????當(dāng)卸載驅(qū)動(dòng)的時(shí)候chrdevbase_exit函數(shù)就會(huì)被調(diào)用
2、添加頭文件路徑
這里需要給vscode頭文件添加路徑,因?yàn)槭蔷帉?Linux 驅(qū)動(dòng),因此會(huì)用到 移植在開發(fā)板上面的Linux 源碼中的函數(shù)。需要在 VSCode 中添加 Linux源碼中的頭文件路徑。打開 VSCode,按下“Crtl+Shift+P”打開 VSCode 的控制臺(tái),然后輸入“C/C++: Edit configurations(JSON) ”,打開 C/C++編輯配置文件,如下圖?所示
?打開如下圖
需要將 Linux 源碼里面的頭文件路徑添加進(jìn)來(lái),也就是移植的 Linux 源碼中的頭文件路徑,分別是開發(fā)板所使用的 Linux 源碼下的 include、arch/arm/include 和 arch/arm/include/generated 這三個(gè)目錄的路徑,注意這里使用絕對(duì)路徑
添加頭文件路徑(7-8-9行)以后的 c_cpp_properties.json的文件內(nèi)容如下所示:
?"${workspaceFolder}/**",
? ? ? ? ? ? ? ? "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/include",
? ? ? ? ? ? ? ? "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/arch/arm/include",
? ? ? ? ? ? ? ? "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/arch/arm/include/generated/"
3、Makefile編寫和解釋
設(shè)置好路徑之后需要編譯測(cè)試,也就是將chrdevbase.c 這個(gè)文件編譯為.ko 模塊
創(chuàng)建Makefile,代碼如下:
KERNELDIR := /home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my
CURRENT_PATH := $(shell pwd)
obj-m := chrdevbase.o
build : kernel_modules
kernel_modules:
?? ?$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modulesclean:
?? ?$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
?第 1 行, KERNELDIR 表示開發(fā)板所用的 Linux 內(nèi)核源碼目錄,使用絕對(duì)路徑
????????????????根據(jù)自己的實(shí)際情況填寫
第 3?行, CURRENT_PATH 表示當(dāng)前路徑,直接通過(guò)運(yùn)行“pwd”命令來(lái)獲取當(dāng)前所處路徑
第 5?行, obj-m 表示chrdevbase.c 這個(gè)文件編譯為 chrdevbase.ko 外部可加載模塊
????????????????chrdevbase.c會(huì)先編譯成chrdevbase.o文件,再編譯成chrdevbase.ko文件
第 7 行,表示要編譯構(gòu)建的是模塊
第 9?行,編譯構(gòu)建模塊目標(biāo)
第 10?行,編譯構(gòu)建模塊目標(biāo)的具體編譯命令
????????????????$(MAKE),表示"make"命令,輸入make就執(zhí)行
????????????????-C 表示將當(dāng)前的工作目錄切換到指定目錄中,就是 KERNERLDIR 目錄,即第1行目錄
????????????????M 表示模塊源碼目錄,這是CURRENT_PATH,即編譯到第3行目錄
????????????????以后程序會(huì)自動(dòng)到指定的CURRENT_PATH目錄中讀取模塊的源碼并將其編譯為.ko 文件
????????????????“ modules ”與前面的“make”搭配,使用"make"命令即表示編譯成模塊
第 12 行,清理目標(biāo)
第 13 行,清理目標(biāo)的具體命令,清理工作目錄和指定的目錄,命令為"make clean"
這里的makfile不用指定編譯器,因已進(jìn)入到linux內(nèi)核中,?移植linux的時(shí)候中已指定好編譯器
4、編譯測(cè)試
輸入 “ make ”命令開始編譯?
?編譯完成之后,查看可以看到有“.ko”文件,并測(cè)試清理命令“ make clean”并重新查看一下
?可以看到編譯出來(lái)的也被刪除了,測(cè)試一下用16核編譯,命令“ make -j16”
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-692622.html
?測(cè)試到此,說(shuō)明框架是可以成功編譯的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692622.html
到了這里,關(guān)于Linux驅(qū)動(dòng)1:入口與出口、頭文件路徑、makefile編譯的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!