1.匯流排
driver/base/platform.c
bus_register(&platform_bus_type);
2.裝置
struct platform_device
int platform_device_register(struct platform_device *); //註冊
void platform_device_unregister(struct platform_device *); //登出
3.裝置驅動
struct platform_driver
int platform_driver_register(struct platform_driver *); //註冊
void platform_driver_unregister(struct platform_driver *); //登出
示例**:
vi btn_dev.c
#include
#include
#include
module_license
("gpl");
void
btn_release
(struct device *dev)
struct platform_device btn_dev =,}
;int __init btn_dev_init
(void
)void __exit btn_dev_exit
(void
)module_init
(btn_dev_init)
;module_exit
(btn_dev_exit)
;
vi btn_drv.c
#include
#include
#include
module_license
("gpl");
intbtn_probe
(struct platform_device *pdev)
intbtn_remove
(struct platform_device *pdev)
struct platform_driver btn_drv =
,.probe = btn_probe,
.remove = btn_remove,};
int __init btn_drv_init
(void
)void __exit btn_drv_exit
(void
)module_init
(btn_drv_init)
;module_exit
(btn_drv_exit)
;
注意:
1)name欄位不同會有什麼效果?
答:安裝後無效果
2)觀察probe remove release 何時被呼叫?
答:probe,在安裝裝置時被呼叫,remove,在解除安裝裝置時被呼叫,release,。。。
3)btn_drv.ko btn_dev.ko 安裝順序不同實驗結果有影響嗎?
答:。。。
platform_device
用於描述硬體:儲存那些以硬體的可變資訊
例如按鍵使用的中斷號 gpio 按鍵的編碼
struct resource
struct resource *platform_get_resource(struct platform_device *dev,
unsigned int type, unsigned int num)
dev,去哪個device中取資源
type,去哪種型別的資源
num, 找指定資源中的第幾個
platform_driver
用於描述硬體的驅動邏輯:
申請input_dev
設定註冊
中斷註冊
延時去抖
報告事件
…在完成驅動邏輯過程中使用到的可變資訊都是去platform_device中取
按照platform架構存在的意義:
1)能夠使得那些沒有具體掛在匯流排的裝置也可以按照匯流排驅動模型實現驅動程式
從而統一了驅動程式設計框架
2)實現了軟硬體非分離 ,使得驅動程式更便於移植
platform_device, 用於描述硬體裝置 (儲存了裝置的可變資訊)
platform_driver, 用於描述裝置的驅動邏輯(軟體)
描述驅動邏輯過程中使用到的硬體資訊統一去platform_device中取
#include
#include
#include
#include
#include
#include
#include
"btn_desc.h"
module_license
("gpl");
struct input_dev *btn_input =
null
;struct timer_list btn_timer;
irqreturn_t btn_isr
(int irq,
void
*dev)
void
btn_timer_func
(unsigned
long data)
intbtn_probe
(struct platform_device *pdev)
/*3 註冊input_dev 變數*/
ret =
input_register_device
(btn_input)
;/*4 硬體操作*/
for(i=
0; i
)init_timer
(&btn_timer)
; btn_timer.function = btn_timer_func;
return0;
}int
btn_remove
(struct platform_device *pdev)
/*6 登出input_dev變數*/
input_unregister_device
(btn_input)
;/*7 釋放input_dev變數空間*/
input_free_device
(btn_input)
;return0;
}struct platform_driver btn_drv =
,.probe = btn_probe,
.remove = btn_remove,};
int __init btn_drv_init
(void
)void __exit btn_drv_exit
(void
)module_init
(btn_drv_init)
;module_exit
(btn_drv_exit)
;
#include
#include
#include
#include
#include
#include
"btn_desc.h"
module_license
("gpl");
void
btn_release
(struct device *dev)
struct resource btn_res=
,,,,
};btn_desc_t buttons=
,,,,
};/*描述硬體*/
struct platform_device btn_dev =
,/*描述硬體可變資訊一*/
.resource = btn_res,
.num_resources =
array_size
(btn_res),}
;int __init btn_dev_init
(void
)void __exit btn_dev_exit
(void
)module_init
(btn_dev_init)
;module_exit
(btn_dev_exit)
;
#ifndef __btn_desc_h__
#define __btn_desc_h__
typedef
struct btn_desc
btn_desc_t;
#endif
Platform匯流排註冊驅動
linux核心中常見的的匯流排有i2c匯流排,pci匯流排,串列埠匯流排,spi匯流排,pci匯流排,can匯流排,單匯流排等,所以有些裝置和驅動就可以掛在這些匯流排上,然後通過匯流排上的match進行裝置和驅動的匹配。但是有的裝置並不屬於這些常見匯流排,所以我們引入了一種虛擬匯流排,也就是plat...
linux驅動之platform匯流排
第一部分 裝置驅動模型 1 匯流排 bus type結構體,關鍵函式是match函式和uevent函式 匯流排將裝置和驅動繫結,在系統每註冊乙個裝置的時候,會尋找與之匹配的驅動,相反,在系統每註冊乙個驅動的時候,會尋找與之匹配的裝置,而匹配由匯流排完成。2 裝置 struct device結構體,硬...
3 0 35 platform 匯流排 裝置與驅動
在該核心的裝置驅動模型中,關心匯流排 裝置和驅動這三個實體。在系統每註冊乙個裝置的時候,由匯流排尋找與之匹配的驅動 在系統每註冊乙個驅動的時候,會由匯流排尋找與之匹配的裝置。乙個現實的linux裝置和驅動通常都需要掛載在一種匯流排上,對於本身依附於pci,usb,i2c,spi等的裝置而言,這不是問...