[ARM-LInux開發]linux裝置驅動makefile入門解析
對於一個普通的linux裝置驅動模組,以下是一個經典的makefile程式碼,使用下面這個makefile可以
完成大部分驅動的編譯,使用時只需要修改一下要編譯生成的驅動名稱即可。只需修改obj-m的值。
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
#generate the path
CURRENT_PATH:=$(shell pwd)
#the absolute path
LINUX_KERNEL_PATH:=/lib/modules/$(shell uname -r)/build
#complie object
default:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
endif
說明:
當我們在模組的原始碼目錄下執行make時,make是怎麼執行的呢?
假設模組的原始碼目錄是/home/study/prog/mod/hello/下。
先說明以下makefile中一些變數意義:
(1)KERNELRELEASE在linux核心原始碼中的頂層makefile中有定義
(2)shell pwd會取得當前工作路徑
(3)shell uname -r會取得當前核心的版本號
(4)LINUX_KERNEL_PATH變數便是當前核心的原始碼目錄。
關於linux原始碼的目錄有兩個,分別為"/lib/modules/$(shell uname -r)/build"和"/usr/src/linux-header-$(shell uname -r)/",
但如果編譯過核心就會知道,usr目錄下那個原始碼一般是我們自己下載後解壓的,而lib目錄下的則是在編譯時自動copy過去的,
兩者的檔案結構完全一樣,因此有時也將核心原始碼目錄設定成/usr/src/linux-header-$(shell uname -r)/。關於核心原始碼目錄
可以根據自己的存放位置進行修改。
(5)make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
這就是編譯模組了:首先改變目錄到-C選項指定的位置(即核心原始碼目錄),其中儲存有核心的頂層makefile;
M=選項讓該makefile在構造modules目標之前返回到模組原始碼目錄;然後,modueles目標指向obj-m變數中設定的模組;
在上面的例子中,我們將該變數設定成了hello.o。
按照順序分析以下make的執行步驟:
在模組的原始碼目錄下執行make,此時,巨集“KERNELRELEASE”沒有定義,因此進入else。
由於make 後面沒有目標,所以make會在Makefile中的第一個不是以.開頭的目標作為預設的目標執行。
於是default成為make的目標。
make會執行 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules ,假設當前核心版本是2.6.13-study,
所以$(shell uname -r)的結果是 2.6.13-study ,這裡實際執行的是
make -C /lib/modules/2.6.13-study/build M=/home/study/prog/mod/hello/ modules
-C 表示到存放核心的目錄執行其makefile,在執行過程中會定義KERNELRELEASE,
然後M=$(CURDIR)表示返回到當前目錄,再次執行,modules表示編譯成模組的意思。
而此時KERNELRELEASE已定義,則會執行obj-m += hello.o,表示會將hello_world.o目標編譯成.ko模組。
若有多個原始檔,則採用如下方法:
obj-m := hello.o
hello-objs := file1.o file2.o file3.o
關於make modules的更詳細的過程可以在核心原始碼目錄下的scripts/Makefile.modpost檔案的註釋 中找到。
如果把hello模組移動到核心原始碼中。例如放到/usr/src/linux/driver/中, KERNELRELEASE就有定義了。
在/usr/src/linux/Makefile中有KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)。
這時候,hello模組也不再是單獨用make編譯,而是在核心中用make modules進行編譯,此時驅動模組便和核心編譯在一起。
相關推薦
[ARM-LInux開發]linux裝置驅動makefile入門解析
以下內容僅作參考,能力有限,如有錯誤還請糾正。對於一個普通的linux裝置驅動模組,以下是一個經典的makefile程式碼,使用下面這個makefile可以完成大部分驅動的編譯,使用時只需要修改一下要編譯生成的驅動名稱即可。只需修改obj-m的值。ifneq ($(KERN
linux裝置驅動makefile入門解析
以下內容僅作參考,能力有限,如有錯誤還請糾正。 對於一個普通的linux裝置驅動模組,以下是一個經典的makefile程式碼,使用下面這個makefile可以 完成大部分驅動的編譯,使用時只需要修改一下要編譯生成的驅動名稱即可。只需修改obj-m的值。 ifneq ($(K
Linux 裝置驅動開發 —— platform裝置驅動應用例項解析
前面我們已經學習了platform裝置的理論知識Linux 裝置驅動開發 —— platform 裝置驅動 ,下面將通過一個例項來深入我們的學習。 一、platform 驅動的工作過程 platform模型驅動程式設計,需要實現platfor
Linux下PCI裝置驅動程式開發基本框架
PCI是一種廣泛採用的匯流排標準,它提供了許多優於其它匯流排標準(如EISA)的新特性,目前已經成為計算機系統中應用最為廣泛,並且最為通用的匯流排標準。Linux的核心能較好地支援PCI匯流排,本文以Intel 386體系結構為主,探討了在Linux下開發PCI裝置驅動程式的基本框架。 一、PCI匯流排
Linux驅動開發----塊裝置驅動(記憶體模擬)Tiny6410
寫了好久的字元裝置驅動,是時候看下塊裝置驅動程式設計方法了,塊裝置驅動和字元裝置不同,字元裝置是直接和虛擬檔案系統進行互動,而塊裝置驅動則是通過塊緩衝/排程層間接和虛擬檔案系統互動;塊裝置驅動資料訪問都是以塊為單位;多個塊I/O需要組成一個請求佇列,這個功能是塊緩衝/排程層
Linux系統I2C裝置驅動編寫方法
硬體平臺:飛思卡爾IMX6 核心版本:kernel3.0.35 Linux的I2C子系統分為三層,I2C核心層,I2C匯流排驅動層和I2C裝置驅動層。I2C核心層由核心開發者提供,I2C匯流排驅動層有晶片廠商提供,而I2C裝置驅動層由於裝置的差異性,就只能是具體的開發需求
linux driver ------ 字元裝置驅動之“ 建立裝置節點流程 ”
在字元裝置驅動開發的入門教程中,最常見的就是用device_create()函式來建立裝置節點了,但是在之後閱讀核心原始碼的過程中卻很少見device_create()的蹤影了,取而代之的是device_register()與device_add(),將device_create()函式展開不難發現:其實de
Linux中塊裝置驅動程式分析
struct sbull_dev { int size; /* Device size in sectors */ u8 *data; /* The data array */
linux gpio字元裝置驅動
在linux下編寫led驅動,控制相應的gpio管腳。 在這裡有兩種方式 1) 直接操作相應的暫存器 2) 通過核心提供的gpio操作庫函式 第一種方式就省略了,只講第二種方式。 這裡板卡上有兩個led燈,在使用者空間採用兩種方式控制led 1. /dev/led0 /de
Linux應用程式訪問字元裝置驅動詳細過程解析
下面先通過一個編寫好的核心驅動模組來體驗以下字元裝置驅動 可以暫時先忽略下面的程式碼實現! memdev.c #include <linux/module.h> #include <linux/fs.h> #include <linux/in
Linux Platform平臺裝置驅動模型
從Linux2.6起引入了一套新的驅動管理和註冊模型,即平臺裝置platform_device和平臺驅動platform_driver. Linux中大部分的裝置驅動,都可以使用這套機制,裝置用platform_device表示,驅動用platform_driver表示。平臺裝置模型與傳統的device和d
嵌入式linux之塊裝置驅動程式概念,框架
不能像字元裝置驅動那樣,直接提供簡單的讀寫函式,效率過於低下 要將讀寫函式放入佇列,優化後,再去執行 框架: “` 框架: app: open,read,write “1.txt” ——————————————— 檔案的讀寫 檔
Linux核心混雜裝置驅動
1.linux核心混雜裝置驅動 1.1混雜裝置驅動特點: 本質上還是一類字元裝置,在驅動軟體上,混雜裝置的主裝置號已經由核心指定主裝置號為10; 各個混雜裝置個體通過次裝置號來區分;1.2linux核心描述混雜裝置的資料結構 struct miscdevice { int
[ARM-Linux開發]linux dmesg命令引數及用法詳解(linux顯示開機資訊命令)
功能說明:顯示開機資訊。語 法:dmesg [-cn][-s <緩衝區大小>]補充說明:kernel會將開機資訊儲存在ring buffer中。您若是開機時來不及檢視資訊,可利用dmesg來檢視。開機資訊亦儲存在/var/log目錄中,名稱為dmesg的檔案
linux misc混雜裝置驅動 .
一. misc結構體 struct miscdevice { int minor; //次裝置號 const char *name; //裝置名 const struct file_operations *fops; //操作函式集 struct list_head list; //連結串列
Linux實現字元裝置驅動的基礎步驟
Linux應用層想要操作kernel層的API,比如想操作相關GPIO或暫存器,可以通過寫一個字元裝置驅動來實現。 1、先在rootfs中的 /dev/ 下生成一個字元裝置。注意主裝置號 和 從裝置號。可用如下shell指令碼生成: if [ ! -e audioIN
WDF開發USB裝置驅動教程(1)
PDF下載地址(1.2版):連結地址 CY001開發板討論帖:連結地址 注:本文件新版本已出,請在部落格中查詢,或下載PDF全文文件。 連結地址WDF開發USB裝置驅動教程 by 張佩 文件說明 &
tiny4412-arm嵌入式開發裸板驅動 (一):開發環境及工具搭建和介紹
寫在前面:在學習arm嵌入式時,發現網上exynos4412的資料很少(針對友善tiny4412開發板)走了很多彎路。把自己的學習經歷寫下來供參考。本人大學考研狗時間倉促,文章多有疏漏歡迎指正 一、開發環境 推薦在linux下進行開發,本文及後續以ubuntu 14
【阿里雲IoT+YF3300】9.快速開發modbus裝置驅動
Modbus是一種序列通訊協議,是莫迪康公司為PLC(程式設計邏輯控制器)通訊而設計的協議。Modbus目前已經成為工業領域通訊協議的業界標準,大部分的儀器儀表都支援該通訊協議。很早以前就開發過基於Modbus協議的各種驅動,在2007年的時候還曾寫了一篇
Linux 驅動開發之核心模組開發 (二)—— 核心模組編譯 Makefile 入門
一、模組的編譯 我們在前面核心編譯中驅動移植那塊,講到驅動編譯分為靜態編譯和動態編譯;靜態編譯即為將驅動直接編譯進核心,動態編譯即為將驅動編譯成模組。 而動態編譯又分為兩種: a -- 內部編譯 在核心原始碼目錄內編譯 b -- 外部編譯 在核