平台匯流排模型

2021-07-27 22:03:04 字數 3265 閱讀 5555

平台匯流排模型主要分為3個部分,1.driver 2.device 3.bus

device主要放硬體相關的東西

driver裡面主要存放的比較穩定的**

我們依然可以檢視gpio_keys.c這個**來學習

平台匯流排是一種虛擬的匯流排

driver這個結構體會通過呼叫platform_driver_register這個函式

platform_driver_register這個函式又會呼叫driver_register這個函式把這個driver放到bus中driver的乙個鍊錶裡面去

device這個結構體會通過呼叫platform_device_register這個函式

platform_device_register這個函式會呼叫platform_device_add這個函式,platform_device_add這個函式又會呼叫device_add這個函式把device放到bus中的device的這個鍊錶裡面去,這個註冊除了把這個結構體放到這個平台裡面去,還diver裡面取出來跟他比較,用什麼函式來跟它比較呢,匯流排裡面有個函式.match函式。用這個函式來比較這個driver能不能支援這個device  能夠支援的話就呼叫driver裡面的probe.

device_add做了什麼事情

1.把device放入bus中的device鍊錶裡面

2.device_add函式會從bus的driver鍊錶取出每個driver,用匯流排的match函式判斷這個driver能否支援device

3.如果能夠支援的話呼叫這個probe函式

driver_add做了什麼事情呢

1.把driver放入bus匯流排的driver鍊錶

2從device鍊錶中拿出每乙個device,用匯流排的match函式來一一比較

3.如果能夠支援,呼叫probe函式

注意:這只不過是這麼一種機制,device和driver建立聯絡的機制,在probe函式裡面做什麼事情,由你決定,你列印一句話,註冊乙個字元裝置什麼的,都是由你決定的

driver裡放比較穩定的東西,我們改的話,主要是改device這邊的**

我們來看這個gpio_keys.c這個**

static int __init gpio_keys_init(void)};

int platform_driver_register(struct platform_driver *drv)

struct bus_type platform_bus_type = ;

平台匯流排上有乙個函式platform_match這個函式,我們來看一下這個匹配函式

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

由此可以看出,匹配的方法,我們這裡用的是下面這種,用名字匹配的方法

static void __exit gpio_keys_exit(void)

範例**如下

device驅動如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

static struct resource led_resource=,

};static void led_release(struct device * dev)

/*分配/設定/註冊乙個platform_device*/

static struct platform_device led_dev=,

};static int led_dev_init(void)

static void led_dev_exit(void)

module_init(led_dev_init);

module_exit(led_dev_exit);

module_license("gpl");

module_author("eight");

driver程式如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

struct class *my_class;

struct cdev cdev;

dev_t devno;

static volatile unsigned long *con;

static volatile unsigned long *data;

#define led_magic 'm'

#define led_on _io(led_magic,0)

#define led_off _io(led_magic,1)

static int led_open(struct inode *inode,struct file *file)

long led_ioctl (struct file *file, unsigned int cmd, unsigned long arg)

return 0;

}static struct file_operations myled_fops =

;static int led_probe(struct platform_device *pdev)

device_create(my_class, null, devno,null,"led_driver");

return 0;

}static int led_remove(struct platform_device *dev)

struct platform_driver key_driver=,

};/*分配/設定/註冊乙個platform_driver結構體*/

static int led_drv_init(void)

static void led_drv_exit(void)

module_init(led_drv_init);

module_exit(led_drv_exit);

module_license("gpl");

module_author("eight");

測試程式跟前面led的測試程式一樣

平台匯流排驅動模型

arch arm plat s3c24xx devs.c 這個函式實現的平台匯流排模型中的 platform device 1.註冊各種資源 struct resource s3c2410 uart0 resource等各種資源 static struct resource s3c lcd reso...

平台匯流排裝置模型

平台匯流排是核心實現的一條虛擬匯流排,linux 裝置模型包含三個重要的元素,匯流排 裝置和驅動,那看看平台匯流排又是怎樣去實現的。首先看平台匯流排的定義 我們知道匯流排匹配裝置和驅動是通過它的 match 函式,那具體看看這個函式是怎樣實現的。我們看,如果平台驅動有乙個 id table 那就通過...

Linux平台匯流排驅動裝置模型

platform匯流排是一種虛擬的匯流排,相應的裝置則為platform device,而驅動則為platform driver。linux 2.6的裝置驅動模型中,把i2c rtc lcd等都歸納為platform device。匯流排將裝置和驅動繫結,在系統每註冊乙個裝置的時候,會尋找與之匹配的...