17 平台匯流排程式設計

2022-07-23 21:06:15 字數 4165 閱讀 7375

平台匯流排程式設計

一、平台匯流排概述

平台匯流排(platform bus)是linux2.6核心加入的一種虛擬匯流排,其優勢在於採用了匯流排的模型對裝置與驅動進行了管理,這匯流排的模型對裝置與驅動進行了管理,這樣提高了程式的可移植性。

通過平台匯流排機制開發裝置驅動的流程如圖:

平台匯流排的結構:platform_bus_type:

1

struct bus_type platform_bus_type =;

該結構中,最重要的是我們的匹配函式platform_match:

1

static

int platform_match(struct device *dev, struct device_driver *drv)

2

在匹配函式裡,有我們熟悉的**:匯流排裝置驅動程式學習中使用過的

二、平台裝置

平台裝置使用struct platform_device來描述:

1

struct

platform_device;

在這個結構中,重要的成員name,裝置要和驅動的名字一樣。另乙個是resource。裝置的資源,例如中斷號,暫存器.....都是資源。這些就放到resource這個結構裡: 

其中struct resource *resource描述:

1

struct

resource;

1.1註冊和登出平台裝置

註冊平台裝置,使用函式:

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

struct

platform_driver ;

其中probe函式是當驅動找到對應的裝置後要執行的函式,remove函式是當裝置移除是要呼叫的函式。

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...