當前位置:首頁 » 編程軟體 » linuxarm驅動編譯

linuxarm驅動編譯

發布時間: 2023-06-01 03:54:02

linux怎麼編譯進驅動進內核

一、 驅動程序編譯進內核的步驟
在 linux 內核中增加程序需要完成以下三項工作:
1. 將編寫的源代碼復制到 Linux 內核源代碼的相應目錄;
2. 在目錄的 Kconfig 文件中增加新源代碼對應項目的編譯配置選項;
3. 在目錄的 Makefile 文件中增加對新源代碼的編譯條目。

bq27501驅動編譯到內核中具體步驟如下:
1. 先將驅動代碼bq27501文件夾復制到 ti-davinci/drivers/ 目錄下。
確定bq27501驅動模塊應在內核源代碼樹中處於何處。
設備驅動程序存放在內核源碼樹根目錄 drivers/ 的子目錄下,在其內部,設備驅動文件進一步按照類別,類型等有序地組織起來。
a. 字元設備存在於 drivers/char/ 目錄下
b. 塊設備存放在 drivers/block/ 目錄下
c. USB 設備則存放在 drivers/usb/ 目錄下。
注意:
(1) 此處的文件組織規則並非絕對不變,例如: USB 設備也屬於字元設備,也可以存放在 drivers/usb/ 目錄下。
(2) 在 drivers/char/ 目錄下,在該目錄下同時存在大量的 C 源代碼文件和許多其他目錄。所有對於僅僅只有一兩個源文件的設備驅動程序,可以直接存放在該目錄下,但如果驅動程序包含許多源文件和其他輔助文件,那麼可以創建一個新子目錄。
(3) bq27501的驅動是屬於字元設備驅動類別,雖然驅動相關的文件只有兩個,但是為了方面查看,將相關文件放在了bq27501的文件夾中。在drivers/char/目錄下增加新的設備過程比較簡單,但是在drivers/下直接添加新的設備稍微復雜點。所以下面首先給出在drivers/下添加bq27501驅動的過程,然後再簡單說明在drivers/char/目錄下添加的過程。

2. 在/bq27501下面新建一個Makefile文件。向裡面添加代碼:
obj-$(CONFIG_BQ27501)+=bq27501.o
此時,構建系統運行就將會進入 bq27501/ 目錄下,並且將bq27501.c 編譯為 bq27501.o
3. 在/bq27501下面新建Kconfig文件。添加代碼:
menu "bq27501 driver"

config BQ27501
tristate"BQ27501"
default y
---help---
Say 'Y' here, it will be compiled into thekernel; If you choose 'M', it will be compiled into a mole named asbq27501.ko.
endmenu
注意:help中的文字不能加回車符,否則make menuconfig編譯的時候會報錯。
4. 修改/drivers目錄下的Kconfig文件,在endmenu之前添加一條語句『source drivers/bq27501/Kconfig』 對於驅動程序,Kconfig 通常和源代碼處於同一目錄。 若建立了一個新的目錄,而且也希望 Kconfig 文件存在於該目錄中的話,那麼就必須在一個已存在的 Kconfig 文件中將它引入,需要用上面的語句將其掛接在 drivers 目錄中的Kconfig 中。

5. 修改/drivers目下Makefile文件,添加『obj-$(CONFIG_BQ27501) +=bq27501/』。這行編譯指令告訴模塊構建系統在編譯模塊時需要進入 bq27501/ 子目錄中。此時的驅動程序的編譯取決於一個特殊配置 CONFIG_BQ27501 配置選項。

6. 修改arch/arm目錄下的Kconfig文件,在menu "Device Drivers……endmenu"直接添加語句
source "drivers/bq27501/Kconfig"

② linux2.6下驅動模塊編譯問題(實在沒辦法才來問的,請指點一下啊)

需要先配置內核並且編譯一次。

③ 如何用arm-linux-gcc編譯驅動程序,Makefile文件怎麼寫

回復
http://bbs.chinaunix.net/viewthread.php?tid=1921952
上面說的方法我還是不是很明白啊,我現在簡直沒辦法了,昨天晚我看到一個資料上面寫的helloworld驅動的例子有兩份Makefile,一份是x86機子上的,一份是arm平台上的,arm上的這樣寫:ifneq
($(KERNELRELEASE),)obj-m:=hello.oelseKDIR/usr/src/kernels/opt/EmbedSky/linux-2.6.30.4/all:
make
-C
$(KDIR)
M=$(PWD)
moles
ARCH=arm
CROSS_COMPLIE=arm-linux-clean:
rm
-f
*.ko
*.o
*.mod.o
*.mod.c
*.symversendif看到後我想應該是要用用於移植的內核來編譯吧,於是我乾脆把資料提供的內核拷貝到PC的Linux系統中然後解壓、編譯直至安裝,然後就再模仿例子寫了Makefile如上所示,然後make後終於通過編譯成功了,然後我再下載到arm板上安裝,卻又出現下面的錯誤:insmod:
can't
insert
'hello.ko':
unknown
symbol
in
mole,
or
unknown
parameter。我就又徹底暈了。到底是怎麼回事,應該怎麼辦的呢?

④ 在linux下編譯驅動程序,用arm-linux-gcc編譯時出現了很多錯誤

不改橡漏makefile文件,當然不能編譯羨賣了,linux的驅動就是這么搞的啊,沒辦法的,反正是批處理的,也就多花點時間嘛,你可以把一些不需要的驅動,選擇不編譯,這樣就能加快速度了。給你個辦法,在windows虛擬機中安裝交叉編譯環境,你可以在windows下編輯你的程序,linux只起到編譯的作用,這樣,兩個工作可以兄如逗同時進行,有空你還可以上上網,這樣你就不覺得時間長了。

⑤ 如何編譯linux驅動模塊

第一步:准備源代碼

首先我們還是要來編寫一個符合linux格式的模塊文件,這樣我們才能開始我們的模塊編譯。假設我們有一個源文件mymod.c。它的源碼如下:

mymoles.c
1. #include <linux/mole.h> /* 引入與模塊相關的宏 */
2. #include <linux/init.h> /* 引入mole_init() mole_exit()函數 */
3. #include <linux/moleparam.h> /* 引入mole_param() */
4
5. MODULE_AUTHOR("Yu Qiang");
6. MODULE_LICENSE("GPL");
7
8. static int nbr = 10;
9. mole_param(nbr, int, S_IRUGO);
10.
11. static int __init yuer_init(void)
12.{
13. int i;
14. for(i=0; i<nbr; i++)
15. {
16. printk(KERN_ALERT "Hello, How are you. %d/n", i);
17. }
18. return 0;
19.}
20.
21.static void __exit yuer_exit(void)
22.{
23. printk(KERN_ALERT"I come from yuer's mole, I have been unlad./n");
24.}
25.
26. mole_init(yuer_init);
27. mole_exit(yuer_exit);

我們的源文件就准備的差不多了,這就是一個linux下的模塊的基本結構。第9行是導出我們的符號變數nbr。這樣在你載入這個模塊的時候可以動態修改這個變數的值。稍後將演示。yuer_init()函數將在模塊載入的時候運行,通過輸出的結果可以看到我們的模塊是否載入成功。

第二步:編寫Makefile文件

首先還是來看看我們Makefile的源文件,然後我們再來解釋;

Makefile
obj-m := moles.o #要生成的模塊名
moles-objs:= mymod.o #生成這個模塊名所需要的目標文件

KDIR := /lib/moles/`uname -r`/build
PWD := $(shell pwd)

default:
make -C $(KDIR) M=$(PWD) moles

clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions

ARM平台
Makefile

obj-m += mymod.o
KDIR := /home/workspace2/kernel/linux-2.6.25 #如果是用於arm平台,則內核路徑為arm內核的路徑
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -rf *.o

在arm板上插入是
insmod mymod
如果出現以下錯誤
insmod: chdir(/lib/moles): No such file or directory
則運行
mkdir /lib/moles/2.6.25 (與arm內核版本相同)
並將mymod.ko文件復制到該目錄下
cp mymod.ko /lib/moles/2.6.25
然後再執行 (insmod 只在/lib/moles/2.6.25目錄下查找相關驅動模塊)
insmod mymod

現在我來說明一下這個Makefile。請記住是大寫的Makefile而不是小寫的makefile;
obj-m :這個變數是指定你要聲稱哪些模塊模塊的格式為 obj-m := <模塊名>.o
moles-objs :這個變數是說明聲稱模塊moles需要的目標文件 格式要求 <模塊名>-objs := <目標文件>
切記:模塊的名字不能取與目標文件相同的名字。如在這里模塊名不能取成 mymod;
KDIR :這是我們正在運行的操作系統內核編譯目錄。也就是編譯模塊需要的環境
M= :指定我們源文件的位置
PWD :這是當前工作路徑$(shell )是make的一個內置函數。用來執行shell命令。

第三步:編譯模塊

現在我們已經准備好了我們所需要的源文件和相應的Makefile。我們現在就可以編譯了。在終端進入源文件目錄輸入make
運行結果:
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'
CC [M] /home/yuqiang/桌面/mymole/mymoles.o
LD [M] /home/yuqiang/桌面/mymole/moles.o
Building moles, stage 2.
MODPOST 1 moles
CC /home/yuqiang/桌面/mymole/moles.mod.o
LD [M] /home/yuqiang/桌面/mymole/moles.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'

第四步:載入/卸載我們的模塊

從上面的編譯中我可以看到。已經有一個moles.ko生成了。這就是我們的模塊了。現在我們就可以來載入了。
首先在終端輸入:sudo insmod moles.ko
現在我們來看看我們的模塊載入成功沒有呢?
在終端輸入:dmesg | tail -12 這是查看內核輸出信息的意思。tail -12 顯示最後12條;
顯示結果如下:
[17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0
[18046.790019] usb 5-8: USB disconnect, address 9
[19934.224812] Hello, How are you. 0
[19934.224817] Hello, How are you. 1
[19934.224818] Hello, How are you. 2
[19934.224820] Hello, How are you. 3
[19934.224821] Hello, How are you. 4
[19934.224822] Hello, How are you. 5
[19934.224824] Hello, How are you. 6
[19934.224825] Hello, How are you. 7
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9

看到了吧。我們的模塊的初始化函數yuer_init();已經成功運行了。說明我們的模塊已經載入成功;
現在我們再來卸載模塊試試看。
在終端輸入:sudo rmmod moles
在終端輸入:dmesg | tail -3
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
[20412.046932] I come from yuer's mole, I have been unlad.

可以從列印的信息中看到,我們的模塊的退出函數已經被執行了。說明我們的模塊已經被成功的卸載了。到目前位置我們就已經算是對模塊的編譯到編譯運行算是有了一個整體上的認識了。對於以後深入的學習還是應該有點幫助的。下面我們將在看看於模塊相關的一些簡單的操作。

第五步:載入模塊時傳遞參數
在終端輸入:sudo insmod mole_name.ko nbr=4
在終端輸入:dmesg | tail -6
顯示結果如下:
[20800.655694] Hello, How are you. 9
[21318.675593] I come from onefile mole, I have been unlad.
[21334.425373] Hello, How are you. 0
[21334.425378] Hello, How are you. 1
[21334.425380] Hello, How are you. 2
[21334.425381] Hello, How are you. 3

這樣我們就可以看到在模塊載入的時候動態設置了我們的一個變數。初始化函數中的循環只執行了4次。
可能你會問我怎麼知道一個模塊可以設置那些變數呢。當然,你可以先不設變數載入一次。然後可以在終端輸入ls /sys/mole/<moles_name>/parameters/來查看。在這里我們是這樣輸入的
在終端輸入:ls /sys/moedle/moles/parameters/
顯示結果:
nbr

如果我們的模塊載入成功了。最後我們還可以通過modinfo來查看我們的模塊信息。如下
在終端輸入:sudo modinfo moles.ko
顯示結果:
filename: moles.ko
license: GPL
author: Yu Qiang
srcversion: 20E9C3C4E02D130E6E92533
depends:
vermagic: 2.6.24-24-generic SMP mod_unload 586
parm: nbr:int

⑥ 如何用arm-linux-gcc編譯驅動的,煩勞告訴我完整命令 ,如果可以的話 把整個流程告訴我下,多謝了

簡單的告訴你
yum install gcc* -y

⑦ linux系統下編譯的驅動模塊如何在arm上運行

arm驅動和x86驅動並不通用,Linux的驅動不能用在arm上

⑧ linux內核怎麼單獨編譯驅動模塊

你可能需要手動創建設備節點,首先cat /proc/device 看看能否找到video的設備號,再用mknod命令創建/dev/下的設備節點,如果沒有再考慮去內核make menuconfig查看相關驅動選項有沒有勾上。

⑨ ARM linux設備驅動,寫的驅動必須在編譯內核的時候添加到內核才能用嗎比如led驅動,我生成

linux2.6以後的內核在載入驅動的時候是可以動態添加的,不用每次添加之後都make zImage,
你只用先編譯一邊,然後就可以一直用這個做驅動的開發嘍,
只要生成了led.ko,然後insmod led.ko,就可以了,至於是不是用應用層,我覺得你還是先學一下應用層的東西吧,比如nuix系統高級編程之內的書,

⑩ 為ARM開發的linux驅動程序,應該怎麼編譯得到.o文件

編譯驅動是要和內核相關的,你的這個Mafefile是沒問題,你查查你的/weke/kernel/s3c2410_kernel2.4.18_rel那個內核有沒有交叉編譯過
內核裡面有Makefile,所以你編譯驅動的時候指定內核路徑後,會用編譯內核的交叉編譯工具編譯,然後你試一下make default

熱點內容
秦九韶演算法教案 發布:2024-04-26 13:30:22 瀏覽:411
解壓到當前文件夾右鍵 發布:2024-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:521
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:868
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12