Linux裝置驅動學習一 裝置和驅動的註冊

2021-10-07 09:50:59 字數 3237 閱讀 7000

使用itop-4412開發板,用的是scp 1g的板子。

首先是對外部裝置的操作的三部曲:

1.通過原理圖找到裝置連線的pin腳 (處理器的資料手冊)

3.編寫程式實現裝置的操作

1. 裝置和驅動的註冊流程

一般都是先註冊裝置,再註冊驅動。現在引入的熱插拔裝置是先註冊的驅動。

1)註冊裝置使用結構體platform_device,結構體中有name和id(vim include/linux/platform_device.h)

struct platform_device ;
2)註冊驅動使用結構體platform_driver,結構體中包括probe,suspend,remove,driver等(vim include/linux/platform_device.h)

struct platform_driver ;
3)驅動的註冊需要platform_match來判斷裝置和驅動name是否相同,不同則註冊失敗。否則probe然後初始化註冊裝置節點等。(只有name匹配才會到probe這一步)

2. 檢視裝置或驅動的幾個主要命令

1)insmod,rmmod

2)lsmod=cat /proc/modules

3)檢視裝置節點的命令cat /proc/devices  (0~254)

4)檢視註冊的裝置:ls /sys/devices/

5)檢視匯流排:ls /sys/bus  (platform虛擬匯流排,上面掛很多驅動和裝置,通過兩個結構體)

6)檢視雜項裝置號的命令:cat /proc/misc

3. 案例學習的流程

其中itop4412的裝置程式在arch/arm/mach-exynos/mach-itop4412.c(mach-itop4412.c為板級的檔案),使用的結構體為linux/platform_device.h中的兩個。

通過hello_ctl的案例梳理裝置和驅動註冊 

1)首先配置koncifg,讓menuconfig能夠識別:

選用的是/driver/char/kconfig,tristate:可編譯成模組

config hello_ctl

tristate "enable hello config"

default y

help

enable hello config

2)增加註冊裝置的結構體呼叫。

/* 選用的是/arch/arm/mach-exynos/mach-itop4412.c  */

#ifdef config_hello_ctl

struct platform_device s3c_device_hello_ctl = ;

#endif

//上面幾行註冊裝置使用的是函式:platform_add_devices(主要使用platform_device_register)

#ifdef config_hello_ctl

&s3c_device_hello_ctl,

#endif

3)重新編譯核心

make menuconfig   # 查詢/driver/char下的hello_ctl  用/可以直接搜尋

make zimage #生成的zimage在/arch/arm/boot目錄下

4)燒寫核心 (我用的燒寫方法是通過sd卡掛載到開發板)

將zimage拷貝到sd卡的update目錄下

在板子的uboot中執行

​​​​​​​# sdfuse flash kernel zimage

# reset

5)登入板子檢視註冊完成的裝置 

# ls /sys/devices/platform

hello_ctl

至此,裝置註冊完成。 

驅動註冊

6)寫乙個新的驅動檔案probe_linux_module.c,其中包含platform_driver結構體中的probe等 ,標頭檔案要包含linux/platform_device.h

#include #include #include #define device_name "hello_ctl"

static int hello_probe(struct platform_device *pdv)

static int hello_remove(struct platform_device *pdv)

static int hello_suspend(struct platform_device *pdv)

static int hello_resume(struct platform_device *pdv)

static void hello_shutdown(struct platform_device *pdv)

struct platform_driver hello_driver =

};static int hello_init(void)

static void hello_exit(void)

module_init(hello_init);

module_exit(hello_exit);

module_license("gpl");

module_author("nanzh");

# makefile

obj-m += probe_linux_module.o

kdir := /home/topeet/android/itop4412/itop4412_kernel_3.0

pwd ?= $(shell pwd)

all:

make -c $(kdir) m=$(pwd) modules

clean:

rm -rf *.o

注:makefile中-c呼叫的庫需要是編譯之後的,否則會找不到某些檔案。

7)編譯,將ko檔案拷貝到板子中執行 

依次列印hello_init中的printk,然後probe,然後hello_init中register之後的內容。

如果裝置沒有註冊,則probe內容不會被列印。

結果在dmesg中檢視。(ismod,rmmod)

linux裝置驅動學習

華清遠見嵌入式培訓中心 講師。通常,核心的公升級對從事linux應用程式開發的人員來說影響較小,因為系統呼叫基本保持相容,影響比較大的是驅動開發人員。每次核心的更新都可能導致許多核心函式原型上的變化,其中既有核心本身提供的函式,也有硬體平台 提供的函式,後者變化的更加頻繁。這一點從許多經典書籍就可驗...

linux裝置樹(裝置驅動)

一 裝置樹的簡單概念 裝置樹 由一系列的節點,屬性組成,節點本身包含子節點 屬性 成對出現的名稱和值 裝置樹可描述的資訊 原先大多數被編碼在核心中 它是電路板上cpu,匯流排,裝置組成的樹,bootloader會將這棵樹傳遞給核心,並根據它展開linux核心中的platform device等裝置。...

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...