內(nèi)核驅(qū)動不僅可以將驅(qū)動編譯到內(nèi)核中,還可以動態(tài)的編譯內(nèi)核驅(qū)動。本文檔介紹如何以
模塊的方式編譯內(nèi)核驅(qū)動。
以 module 的方式編譯驅(qū)動,需要以下幾個部分:
1 內(nèi)核成功編譯過;
2 找到內(nèi)核的 arm 編譯器;
3 編譯簡單驅(qū)動;
4 編譯簡單的 Makefile 文件,Makefile 文件中需要指向內(nèi)核源碼目錄(成功編譯過的內(nèi)核源碼目錄);
和文檔在一起的有“Makefile”、c 文件和 ko 文件,大家可以用來測試。
要動態(tài)的編譯內(nèi)核,首先需要將內(nèi)核源碼編譯通過,內(nèi)核的編譯請參考使用手冊第五章。
1. 內(nèi)核和編譯器路徑
本節(jié)介紹內(nèi)核路徑、編譯器路徑。無論是 Qt 和 Ubuntu 的內(nèi)核源碼,都是在 android 源碼包中,所以必須先解壓 android 源碼到 Ubuntu14.04 中。
如下圖所示,作者的 android 源碼在“/home/iMX6Q/iTOP-iMX6_android6.0.1”目錄下,內(nèi)核源碼在其中的“kernel_imx”目錄下。
進(jìn)入“kernel_imx”目錄,查看“build_android_kernel.sh”中的腳本文件,如下圖所示。
如上圖所示,我們可以得到一些信息,在后面編譯內(nèi)核模塊的時候,需要設(shè)置編譯目標(biāo)平臺為 arm,“export ARCH=arm”;
編譯器的路徑為“$(pwd)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-”。理論上,應(yīng)該使用這個編譯器,但是實(shí)際上以
modules 的方式編譯內(nèi)核驅(qū)動的時候,使用這個編譯器,是無法編譯的!!
應(yīng)該使用“../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-”這個編譯器才行,如下圖所示。
編譯器路徑為內(nèi)核源碼目錄對應(yīng)的../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-”,這是作者測試出來的,作者沒有太多時間深入研究編譯腳本,但是這個編譯器是可以的。前面紅色部分介紹的編譯器,會提示報(bào)錯,對于這個報(bào)錯,飛思卡爾官方給出的是簡單的回復(fù)“你使用了 android 的編譯器”,沒有提供更多的解釋,也沒有提示方法,不過作者測試了幾個內(nèi)核驅(qū)動,都是可以正常 insmod 和 rmmod 的。
2. Makefile 和測試驅(qū)動源碼以及編譯
作者在“/home/imx6”目錄下新建一個“imx_driver_modules”目錄,將要編譯的驅(qū)動和 Makefile 文件放到這個目錄下。
2.1 Makefile
Makefile 腳本文件:
obj-m += iTOP_IMX6_treedriver_hello.o
KDIR =/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imx
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules modules ARCH=arm
CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
clean:
rm -rf modules.order *.o workqueue.o Module.symvers *.mod.c *.ko
腳本中:
第一行bj-m += iTOP_IMX6_treedriver_hello.o 表示編譯的源文件為iTOP_IMX6_treedriver_hello.c,如果源文件名有變化,則需要修改成對應(yīng)的。
第二行:KDIR 參數(shù)指向?qū)?yīng)的內(nèi)核源碼目錄。作者的內(nèi)核源碼是在/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imxx 目錄下,用戶要根據(jù)自己的具體情況來修改。
第三行:PWD ?= $(shell pwd)表示將當(dāng)前目錄的路徑賦值給 PWD 變量,也就是/home/imx6_tree_driver/iTOP_IMX6_treedriver_hello。作者將會把 Makefile 文件和驅(qū)動源碼放到這個目錄下編譯。
第五行:其中 make -C $(KDIR) M=$(PWD) modules,表示將當(dāng)前目錄下的文件編譯為模塊,并且制定了內(nèi)核源碼的路徑;
其中 ARCH=arm 表示設(shè)置目標(biāo) CPU 類別為 arm,也就是編譯的依賴內(nèi)核和驅(qū)動模塊目標(biāo) CPU 為 ARM;
其中 CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi- ,這里的路徑,指向內(nèi)核編譯器的路徑。
2.2 簡單驅(qū)動源碼
驅(qū)動文件名稱為:iTOP_IMX6_treedriver_hello.c,源碼如下:
#include
#include
MODULE_LICENSE('Dual BSD/GPL');
MODULE_AUTHOR('iTOPEET_dz');
static int hello_init(void)
{
printk(KERN_EMERG 'Hello World enter!n');
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG 'Hello world exit!n');
}
module_init(hello_init);
module_exit(hello_exit);
驅(qū)動源碼只有基本的入口和出口函數(shù)。加載和卸載的時候分別打印“Hello Worldenter!”和“Hello world exit!”。
2.3 編譯
將源碼和 Makefile 文件拷貝到 Ubuntu14 系統(tǒng)下。
使用命令“make”,如下圖所示,可以看到有“iTOP_IMX6_treedriver_hello.ko”文件生成。
使用命令“make clean”,可以刪除中間文件。
3.模塊編譯常見問題
在以模塊的方式編譯驅(qū)動的過程中,新手可能會以下問題。
1.內(nèi)核源碼沒有編譯或者內(nèi)核源碼路徑設(shè)置不正確。
如果內(nèi)核源碼沒有編譯,那么模塊將會提示缺少庫之類的錯誤;如果路徑設(shè)置不正確,會提示找不到內(nèi)核。
2.源碼和 Makefile 文件在 Windows 下編寫,然后拷貝到 Ubuntu 上,由于編輯器不同導(dǎo)致轉(zhuǎn)碼錯誤。
這種錯誤比較容易解決,Make 編譯之后,系統(tǒng)會提示 Makefile 或者驅(qū)動文件具體某一行出現(xiàn)問題。使用 vim 編輯器打開查看一下,就能找出一些亂碼,使用 vim 編輯器修正一下再編譯即可。
4. 模塊加載和卸載
作者這里使用最小 linux 系統(tǒng)來測試模塊的加載和卸載,最小系統(tǒng)在使用手冊第十三章有介紹。在編譯模塊前,內(nèi)核源碼必須要編譯通過,作者這里是在最小系統(tǒng)是加載模塊,那么內(nèi)核源碼也必須編譯為 qt 的內(nèi)核(最小系統(tǒng)使用的是 qt 的內(nèi)核),否則是無法加載的。
如下圖所示,將驅(qū)動模塊拷貝到開發(fā)板(作者采用的是 nfs 共享目錄的方式,關(guān)于 nfs 大家可以參考群共享中 nfs 相關(guān)的文檔,設(shè)備樹和非設(shè)備的 Ubuntu 都通用。也可以用 tf 卡或者 U 盤)。
然后使用命令“insmod iTOP_IMX6_treedriver_hello.ko”加載驅(qū)動模塊,如下圖示,打印出“Hello World enter!”,表明模塊驅(qū)動加載成功。
接著使用命令“rmmod iTOP_IMX6_treedriver_hello”卸載模塊,如下圖所示,發(fā)現(xiàn)提示沒有目錄 4.1.15,這里我們新建“/lib/modules/4.1.15”。
如下圖所示,使用命令“mkdir /lib/modules/4.1.15”新建目錄,再次使用命令“rmmod iTOP_IMX6_treedriver_helloello”卸載驅(qū)動模塊。
發(fā)現(xiàn)打印信息“Hello world exit!”,模塊卸載成功。
只要重新燒寫系統(tǒng),這些新建目錄只需要建立一次即可。
上一篇:迅為6818開發(fā)板-Qt4.7-4G_EC20的移植
下一篇:迅為4412開發(fā)板QtE系統(tǒng)源碼-支持HDMI顯示
推薦閱讀最新更新時間:2025-04-23 16:09

設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動授時的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時處理器M7000
- AD8659ARZ反相運(yùn)算放大器配置的典型應(yīng)用電路
- 四軸空心杯飛控板
- LT1086IT-12 受保護(hù)大電流燈驅(qū)動器的典型應(yīng)用
- AM1G-4805DZ ±5V 1 瓦 DC/DC 轉(zhuǎn)換器的典型應(yīng)用
- AM1G-0512SH30Z 12V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- RT8072 5A、2MHz、高效同步降壓轉(zhuǎn)換器的典型應(yīng)用
- 用于便攜式的 2.8V DC 至 DC 單路輸出電源
- SY89112U,用于 GB 以太網(wǎng)交換機(jī)的時鐘緩沖器的評估板
- 交錯式PFC電源基礎(chǔ)仿真電路
- 1800 - 2500 MHz 接收器應(yīng)用中的 BGA622 硅鍺通用低噪聲放大器 MMIC 配置 B
- 吉利電池安全標(biāo)準(zhǔn)升級,“神盾金磚電池”有什么技術(shù)亮點(diǎn)?
- 中國汽車工程學(xué)會出臺全固態(tài)電池新標(biāo)準(zhǔn)
- Allegro如何用技術(shù)定義汽車電子新范式
- 恩智浦半導(dǎo)體推出汽車級開發(fā)平臺OrangeBox 2.0 旨在促進(jìn)安全的汽車通信
- 三大上市公司加碼/跨界固態(tài)電池關(guān)鍵材料!
- 一大波全固態(tài)電池新產(chǎn)品來了!
- 欣旺達(dá)/瑞浦/恩捷/力華/杜爾······12大企業(yè)電池行業(yè)新品來襲
- 新唐科技發(fā)布第四代『GerdaTM』系列,車用HMI顯示IC產(chǎn)品開始量產(chǎn)
- 寧德時代的電+Momenta的腦,“智電雙極”重構(gòu)全球汽車格局
- 一文讀懂:固態(tài)電池產(chǎn)業(yè)鏈通覽
- 打卡最后一周,解鎖TI汽車解決方案。解鎖的數(shù)量決定獎品的質(zhì)量!
- 下載有禮|是德科技:測試設(shè)備如何影響產(chǎn)品質(zhì)量調(diào)研報(bào)告
- 溫故而知新——開關(guān)電源經(jīng)典課程學(xué)習(xí)
- 下載《TI MCU與無線連接技術(shù)研討會講座實(shí)錄》抽獎贏好禮!
- 芯(E)幣兌換Nucleo擴(kuò)展板:讓你的Nucleo變身成pyboard
- 美信基礎(chǔ)模擬IC APP下載 助力您創(chuàng)新模擬設(shè)計(jì)!評論、搶樓全有禮!
- 英飛凌BMS解決方案,為電動汽車和儲能系統(tǒng)保駕護(hù)航!
- 我給Xilinx資源中心做貢獻(xiàn)
- 戴爾頂配版XPS 15 9500曝光:i9-10980HK+64GB內(nèi)存
- 搭載第二代AMD EPYC處理器的新型IBM云裸機(jī)服務(wù)器性能有多強(qiáng)?
- 國產(chǎn)14nm進(jìn)入量產(chǎn)!中芯國際邁出了“中國芯”的一大步!
- 擁有全能學(xué)習(xí)機(jī)是何種體驗(yàn)?訊飛智能學(xué)習(xí)機(jī)的使用日常
- 搭載十代酷睿i7移動版的雷神游戲本全球首發(fā)
- 真無線耳機(jī)這把火已經(jīng)被點(diǎn)燃起來
- 2019-2020年汽車操作系統(tǒng)發(fā)展現(xiàn)狀和趨勢
- 叉車也能做到無人駕駛?Seegrid助力自動駕駛復(fù)雜方案
- 華為2025年或成國內(nèi)自動駕駛領(lǐng)導(dǎo)者?
- 英飛凌收購賽普拉斯,是否能躍居汽車芯片榜首?