平台匯流排程式設計
一、平台匯流排概述
平台匯流排(platform bus)是linux2.6核心加入的一種虛擬匯流排,其優勢在於採用了匯流排的模型對裝置與驅動進行了管理,這匯流排的模型對裝置與驅動進行了管理,這樣提高了程式的可移植性。
通過平台匯流排機制開發裝置驅動的流程如圖:
平台匯流排的結構:platform_bus_type:
1該結構中,最重要的是我們的匹配函式platform_match:struct bus_type platform_bus_type =;
1在匹配函式裡,有我們熟悉的**:匯流排裝置驅動程式學習中使用過的static
int platform_match(struct device *dev, struct device_driver *drv)
2
二、平台裝置
平台裝置使用struct platform_device來描述:
1在這個結構中,重要的成員name,裝置要和驅動的名字一樣。另乙個是resource。裝置的資源,例如中斷號,暫存器.....都是資源。這些就放到resource這個結構裡:struct
platform_device;
其中struct resource *resource描述:
11.1註冊和登出平台裝置struct
resource;
註冊平台裝置,使用函式:
int platform_device_register(struct platform_device *pdev)
登出平台裝置,使用函式:
int platform_device_unregister(struct platform_device *pdev)
使用例項:
1 #include 2 #include 3 #include 4 #include 5 #include 6執行結果如下:7 module_license("
gpl");8
9#define gpncon 0x7f008830
1011
//定義資源
12struct resource key_resource =,
18 [1] = ,
23};
2425
//定義平台裝置結構
26struct platform_device key_device =;
3233
int keydev_init(void)34
4041
void keydev_exit(void)42
4546
module_init(keydev_init);
47 module_exit(keydev_exit);
三、平台驅動
平台驅動使用struct platform_driver 描述:
1其中probe函式是當驅動找到對應的裝置後要執行的函式,remove函式是當裝置移除是要呼叫的函式。struct
platform_driver ;
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11執行結果如下:12 module_license("
gpl"
);13
14struct work_struct *work1;
15struct
timer_list key_timer;
1617 unsigned int *key_base;
18struct resource *res_irq;
19struct resource *res_mem;
2021 unsigned int key_num = 0;22
wait_queue_head_t key_q;
2324
void work1_func(struct work_struct *work)
2529
30void key_timer_func(unsigned long data) //
定時器超時函式
3145
46 irqreturn_t key_int(int irp,void *dev_id)
4756
57void key_hw_init(void) //
硬體初始化
5866
67int key_open(struct inode *node,struct file *filp)
6871
72 ssize_t key_read (struct file *filp, char __user *buf, size_t size, loff_t *pos)
7380
81struct file_operations key_fops = 82;
8687
struct miscdevice key_miscdev = 88;
9394
static
int key_probe(struct platform_device *pdev)
95130
131static
int key_remove(struct platform_device *pdev)
132135
136struct platform_driver key_driver =,
142};
143144
//驅動程式初始化
145static
int button_init(void
)146
149150
static
void button_exit(void
)151
154155
module_init(button_init);
156 module_exit(button_exit);
這裡面遇到最糾結的問題就是:剛開始的時候將硬體初始化放在了平台匯流排的前面結果只要想執行裝置驅動成和裝置程式就會出現段錯誤,之所以這樣是因為沒有考慮硬體初始化的時候會用到獲取資源資訊裡面的內容。一下是正確的初始化過程
1//獲取資源資訊
2 res_irq = platform_get_resource(pdev,ioresource_irq,0);3
4 request_irq(res_irq->start,key_int,irqf_trigger_falling,"
6410key
",0); //
註冊中斷處理程式
5 request_irq(res_irq->end,key_int,irqf_trigger_falling,"
6410key
",0); //
註冊中斷處理程式
67 res_mem = platform_get_resource(pdev,ioresource_mem,0
);8 size = res_mem->end - res_mem->start+1
;9 key_base = ioremap(res_mem->start,size);
1011
//按鍵硬體初始化
12 key_hw_init(); /*
這個函式裡面會用到上面獲取到的資源資訊所以必須放在獲取資源之後執行
*/13
平台匯流排概述
platform匯流排是linux2.6核心加入的一種虛擬匯流排。platform機制的本身使用並不複雜,由兩部分組成 platform device 和 platform driver platform驅動與傳統的裝置驅動模型相比,優勢在於platform機制將裝置本身的資源註冊進核心,由核心統一...
平台匯流排(三)
平台匯流排 用於平台公升級的 三星 s3c2410 s3c6410 s5pv210 gpio控制器 gpio控制器 gpio控制器 uart i2cspi 控制邏輯方法相同 1,配置gpio暫存器 2.讀寫資料 位址會不同 三元素 匯流排 開機的時候就已經建立了,不需要我們建立 struct bus...
平台匯流排模型
平台匯流排模型主要分為3個部分,1.driver 2.device 3.bus device主要放硬體相關的東西 driver裡面主要存放的比較穩定的 我們依然可以檢視gpio keys.c這個 來學習 平台匯流排是一種虛擬的匯流排 driver這個結構體會通過呼叫platform driver r...