迅爲-iMX6開發板-設備樹驅動-以module的方式編譯驅動

內核驅動不只能夠將驅動編譯到內核中,還能夠動態的編譯內核驅動。本文檔介紹如何以linux

模塊的方式編譯內核驅動。android

以 module 的方式編譯驅動,須要如下幾個部分:shell

1 內核成功編譯過;vim

2 找到內核的 arm 編譯器;編輯器

3 編譯簡單驅動;ide

4 編譯簡單的 Makefile 文件,Makefile 文件中須要指向內核源碼目錄(成功編譯過的內函數

核源碼目錄);測試

和文檔在一塊兒的有「Makefile」、c 文件和 ko 文件,你們能夠用來測試。ui

要動態的編譯內核,首先須要將內核源碼編譯經過,內核的編譯請參考使用手冊第五章。idea

1 內核和編譯器路徑

本節介紹內核路徑、編譯器路徑。不管是 Qt 和 Ubuntu 的內核源碼,都是在 android 源

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

以下圖所示,做者的 android 源碼在「/home/iMX6Q/iTOP-iMX6_android6.0.1」目錄

下,內核源碼在其中的「kernel_imx」目錄下。

進入「kernel_imx」目錄,查看「build_android_kernel.sh」中的腳本文件,以下圖所

示。

如上圖所示,咱們能夠獲得一些信息,在後面編譯內核模塊的時候,須要設置編譯目標平

臺爲 arm,「export ARCH=arm」;

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

4.9/bin/arm-linux-androideabi-」。理論上,應該使用這個編譯器,可是實際上以

modules 的方式編譯內核驅動的時候,使用這個編譯器,是沒法編譯的!!

應該使用「../prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-」這個編譯器

才行,以下圖所示。

編譯器路徑爲內核源碼目錄對應的../prebuilts/gcc/linux-x86/arm/arm-eabi-

4.8/bin/arm-eabi-」,這是做者測試出來的,做者沒有太多時間深刻研究編譯腳本,可是這

個編譯器是能夠的。前面紅色部分介紹的編譯器,會提示報錯,對於這個報錯,飛思卡爾官方

給出的是簡單的回覆「你使用了 android 的編譯器」,沒有提供更多的解釋,也沒有提示方

法,不過做者測試了幾個內核驅動,都是能夠正常 insmod 和 rmmod 的。

2 Makefile 和測試驅動源碼以及編譯

做者在「/home/imx6」目錄下新建一個「imx_driver_modules」目錄,將要編譯的驅

動和 Makefile 文件放到這個目錄下。

2.1 Makefile

Makefile 腳本文件:

腳本中:

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

iTOP_IMX6_treedriver_hello.c,若是源文件名有變化,則須要修改爲對應的。

第二行:KDIR 參數指向對應的內核源碼目錄。做者的內核源碼是在

/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imxx 目錄下,用戶要根據本身的具體狀況

來修改。

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

/home/imx6_tree_driver/iTOP_IMX6_treedriver_hello。做者將會把 Makefile 文件和驅動

源碼放到這個目錄下編譯。

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

爲模塊,而且制定了內核源碼的路徑;

其中 ARCH=arm 表示設置目標 CPU 類別爲 arm,也就是編譯的依賴內核和驅動模塊目

標 CPU 爲 ARM;

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

4.8/bin/arm-eabi- ,這裏的路徑,指向內核編譯器的路徑。

2.2 簡單驅動源碼

驅動文件名稱爲:iTOP_IMX6_treedriver_hello.c,源碼以下:

驅動源碼只有基本的入口和出口函數。加載和卸載的時候分別打印「Hello World

enter!」和「Hello world exit!」。

2.3 編譯

將源碼和 Makefile 文件拷貝到 Ubuntu14 系統下。

使用命令「make」,以下圖所示,能夠看到有「iTOP_IMX6_treedriver_hello.ko」文件

生成。

使用命令「make clean」,能夠刪除中間文件。

3 模塊編譯常見問題

在以模塊的方式編譯驅動的過程當中,新手可能會如下問題。

1.內核源碼沒有編譯或者內核源碼路徑設置不正確。

若是內核源碼沒有編譯,那麼模塊將會提示缺乏庫之類的錯誤;若是路徑設置不正確,會

提示找不到內核。

2.源碼和 Makefile 文件在 Windows 下編寫,而後拷貝到 Ubuntu 上,因爲編輯器不一樣

致使轉碼錯誤。

這種錯誤比較容易解決,Make 編譯以後,系統會提示 Makefile 或者驅動文件具體某一

行出現問題。使用 vim 編輯器打開查看一下,就能找出一些亂碼,使用 vim 編輯器修正一下

再編譯便可。

4 模塊加載和卸載

做者這裏使用最小 linux 系統來測試模塊的加載和卸載,最小系統在使用手冊第十三章有

介紹。在編譯模塊前,內核源碼必需要編譯經過,做者這裏是在最小系統是加載模塊,那麼內

核源碼也必須編譯爲 qt 的內核(最小系統使用的是 qt 的內核),不然是沒法加載的。

以下圖所示,將驅動模塊拷貝到開發板(做者採用的是 nfs 共享目錄的方式,關於 nfs 大

家能夠參考羣共享中 nfs 相關的文檔,設備樹和非設備的 Ubuntu 都通用。也能夠用 tf 卡或

者 U 盤)。

而後使用命令「insmod iTOP_IMX6_treedriver_hello.ko」加載驅動模塊,以下圖示,

打印出「Hello World enter!」,代表模塊驅動加載成功。

接着使用命令「rmmod iTOP_IMX6_treedriver_hello」卸載模塊,以下圖所示,發現提

示沒有目錄 4.1.15,這裏咱們新建「/lib/modules/4.1.15」。

以下圖所示,使用命令「mkdir /lib/modules/4.1.15」新建目錄,再次使用命令

「rmmod iTOP_IMX6_treedriver_helloello」卸載驅動模塊。

發現打印信息「Hello world exit!」,模塊卸載成功。

只要從新燒寫系統,這些新建目錄只須要創建一次便可。

相關文章
相關標籤/搜索