使用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核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...