溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么以module的方式編譯驅(qū)動(dòng)

發(fā)布時(shí)間:2022-01-12 15:35:22 來(lái)源:億速云 閱讀:171 作者:iii 欄目:互聯(lián)網(wǎng)科技

今天小編給大家分享一下怎么以module的方式編譯驅(qū)動(dòng)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

以 module 的方式編譯驅(qū)動(dòng),需要以下幾個(gè)部分:

1 內(nèi)核成功編譯過(guò);

2 找到內(nèi)核的 arm 編譯器;

3 編譯簡(jiǎn)單驅(qū)動(dòng);

4 編譯簡(jiǎn)單的 Makefile 文件,Makefile 文件中需要指向內(nèi)核源碼目錄(成功編譯過(guò)的內(nèi)

核源碼目錄);

和文檔在一起的有“Makefile”、c 文件和 ko 文件,大家可以用來(lái)測(cè)試。

要?jiǎng)討B(tài)的編譯內(nèi)核,首先需要將內(nèi)核源碼編譯通過(guò),內(nèi)核的編譯請(qǐng)參考使用手冊(cè)第五章。

1 內(nèi)核和編譯器路徑

本節(jié)介紹內(nèi)核路徑、編譯器路徑。無(wú)論是 Qt 和 Ubuntu 的內(nèi)核源碼,都是在 android 源

碼包中,所以必須先解壓 android 源碼到 Ubuntu14.04 中。

如下圖所示,作者的 android 源碼在“/home/iMX6Q/iTOP-iMX6_android6.0.1”目錄

下,內(nèi)核源碼在其中的“kernel_imx”目錄下。

怎么以module的方式編譯驅(qū)動(dòng)

進(jìn)入“kernel_imx”目錄,查看“build_android_kernel.sh”中的腳本文件,如下圖所

示。

怎么以module的方式編譯驅(qū)動(dòng)

如上圖所示,我們可以得到一些信息,在后面編譯內(nèi)核模塊的時(shí)候,需要設(shè)置編譯目標(biāo)平

臺(tái)為 arm,“export ARCH=arm”;

編譯器的路徑為“$(pwd)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-

4.9/bin/arm-linux-androideabi-”。理論上,應(yīng)該使用這個(gè)編譯器,但是實(shí)際上以

modules 的方式編譯內(nèi)核驅(qū)動(dòng)的時(shí)候,使用這個(gè)編譯器,是無(wú)法編譯的!!

應(yīng)該使用“../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-”這個(gè)編譯器

才行,如下圖所示。

怎么以module的方式編譯驅(qū)動(dòng)

編譯器路徑為內(nèi)核源碼目錄對(duì)應(yīng)的../prebuilts/gcc/linux-x86/arm/arm-eabi-

4.8/bin/arm-eabi-”,這是作者測(cè)試出來(lái)的,作者沒(méi)有太多時(shí)間深入研究編譯腳本,但是這

個(gè)編譯器是可以的。前面紅色部分介紹的編譯器,會(huì)提示報(bào)錯(cuò),對(duì)于這個(gè)報(bào)錯(cuò),飛思卡爾官方

給出的是簡(jiǎn)單的回復(fù)“你使用了 android 的編譯器”,沒(méi)有提供更多的解釋,也沒(méi)有提示方

法,不過(guò)作者測(cè)試了幾個(gè)內(nèi)核驅(qū)動(dòng),都是可以正常 insmod 和 rmmod 的。

2 Makefile 和測(cè)試驅(qū)動(dòng)源碼以及編譯

作者在“/home/imx6”目錄下新建一個(gè)“imx_driver_modules”目錄,將要編譯的驅(qū)

動(dòng)和 Makefile 文件放到這個(gè)目錄下。

2.1 Makefile

Makefile 腳本文件:

怎么以module的方式編譯驅(qū)動(dòng)

腳本中:

第一行:obj-m += iTOP_IMX6_treedriver_hello.o 表示編譯的源文件為

iTOP_IMX6_treedriver_hello.c,如果源文件名有變化,則需要修改成對(duì)應(yīng)的。

第二行:KDIR 參數(shù)指向?qū)?yīng)的內(nèi)核源碼目錄。作者的內(nèi)核源碼是在

/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imxx 目錄下,用戶要根據(jù)自己的具體情況

來(lái)修改。

第三行:PWD ?= $(shell pwd)表示將當(dāng)前目錄的路徑賦值給 PWD 變量,也就是

/home/imx6_tree_driver/iTOP_IMX6_treedriver_hello。作者將會(huì)把 Makefile 文件和驅(qū)動(dòng)

源碼放到這個(gè)目錄下編譯。

第五行:其中 make -C $(KDIR) M=$(PWD) modules,表示將當(dāng)前目錄下的文件編譯

為模塊,并且制定了內(nèi)核源碼的路徑;

其中 ARCH=arm 表示設(shè)置目標(biāo) CPU 類別為 arm,也就是編譯的依賴內(nèi)核和驅(qū)動(dòng)模塊目

標(biāo) CPU 為 ARM;

其中 CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-

4.8/bin/arm-eabi- ,這里的路徑,指向內(nèi)核編譯器的路徑。

2.2 簡(jiǎn)單驅(qū)動(dòng)源碼

驅(qū)動(dòng)文件名稱為:iTOP_IMX6_treedriver_hello.c,源碼如下:

怎么以module的方式編譯驅(qū)動(dòng)

驅(qū)動(dòng)源碼只有基本的入口和出口函數(shù)。加載和卸載的時(shí)候分別打印“Hello World

enter!”和“Hello world exit!”。

2.3 編譯

將源碼和 Makefile 文件拷貝到 Ubuntu14 系統(tǒng)下。

使用命令“make”,如下圖所示,可以看到有“iTOP_IMX6_treedriver_hello.ko”文件

生成。

怎么以module的方式編譯驅(qū)動(dòng)

使用命令“make clean”,可以刪除中間文件。

3 模塊編譯常見(jiàn)問(wèn)題

在以模塊的方式編譯驅(qū)動(dòng)的過(guò)程中,新手可能會(huì)以下問(wèn)題。

1.內(nèi)核源碼沒(méi)有編譯或者內(nèi)核源碼路徑設(shè)置不正確。

如果內(nèi)核源碼沒(méi)有編譯,那么模塊將會(huì)提示缺少庫(kù)之類的錯(cuò)誤;如果路徑設(shè)置不正確,會(huì)

提示找不到內(nèi)核。

2.源碼和 Makefile 文件在 Windows 下編寫(xiě),然后拷貝到 Ubuntu 上,由于編輯器不同

導(dǎo)致轉(zhuǎn)碼錯(cuò)誤。

這種錯(cuò)誤比較容易解決,Make 編譯之后,系統(tǒng)會(huì)提示 Makefile 或者驅(qū)動(dòng)文件具體某一

行出現(xiàn)問(wèn)題。使用 vim 編輯器打開(kāi)查看一下,就能找出一些亂碼,使用 vim 編輯器修正一下

再編譯即可。

4 模塊加載和卸載

作者這里使用最小 linux 系統(tǒng)來(lái)測(cè)試模塊的加載和卸載,最小系統(tǒng)在使用手冊(cè)第十三章有

介紹。在編譯模塊前,內(nèi)核源碼必須要編譯通過(guò),作者這里是在最小系統(tǒng)是加載模塊,那么內(nèi)

核源碼也必須編譯為 qt 的內(nèi)核(最小系統(tǒng)使用的是 qt 的內(nèi)核),否則是無(wú)法加載的。

如下圖所示,將驅(qū)動(dòng)模塊拷貝到開(kāi)發(fā)板(作者采用的是 nfs 共享目錄的方式,關(guān)于 nfs 大

家可以參考群共享中 nfs 相關(guān)的文檔,設(shè)備樹(shù)和非設(shè)備的 Ubuntu 都通用。也可以用 tf 卡或

者 U 盤(pán))。

怎么以module的方式編譯驅(qū)動(dòng)

然后使用命令“insmod iTOP_IMX6_treedriver_hello.ko”加載驅(qū)動(dòng)模塊,如下圖示,

打印出“Hello World enter!”,表明模塊驅(qū)動(dòng)加載成功。

怎么以module的方式編譯驅(qū)動(dòng)

接著使用命令“rmmod iTOP_IMX6_treedriver_hello”卸載模塊,如下圖所示,發(fā)現(xiàn)提

示沒(méi)有目錄 4.1.15,這里我們新建“/lib/modules/4.1.15”。

怎么以module的方式編譯驅(qū)動(dòng)

如下圖所示,使用命令“mkdir /lib/modules/4.1.15”新建目錄,再次使用命令

“rmmod iTOP_IMX6_treedriver_helloello”卸載驅(qū)動(dòng)模塊。

怎么以module的方式編譯驅(qū)動(dòng)

發(fā)現(xiàn)打印信息“Hello world exit!”,模塊卸載成功。

只要重新燒寫(xiě)系統(tǒng),這些新建目錄只需要建立一次即可。

以上就是“怎么以module的方式編譯驅(qū)動(dòng)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI