匯流排裝置驅動模型

2021-06-20 14:59:17 字數 4507 閱讀 5023

匯流排裝置驅動模型

匯流排是主機和裝置之間的通道,由bus_type

結構描述。

int bus_register(struct bus_type *bus) 匯流排的註冊,若成功,新的匯流排將被新增進系統,並可在

sysfs

的/sys/bus

下看到。

void bus_unregister(struct bus_type *bus) 匯流排的刪除。

int (*match) (struct device *dev,  struct device_driver *drv)  比較裝置

dev和驅動

drv是否匹配,驅動能否處理這個裝置。

int (*event) (struct device  *dev,  char **envp,  int  num_envp,  char *buffer,  int buffer_size)在為使用者空間產生熱插拔事件之前,這個方法允許匯流排新增環境變數。

匯流排屬性由結構bus_attribute

描述struct bus_attribute ; 類似於前面的

kobject。

int bus_create_file(struct bus_type *bus, struct bus_attribute *attr) 建立匯流排屬性

void bus_remove_file(struct bus_type *bus, struct bus_attribute *attr)   刪除匯流排屬性

例子:在系統中建立一條匯流排

#include #include #include #include #include static char *version = "$revision: 1.0 $";

static int my_match(struct device *dev, struct device_driver *driver)

struct bus_type my_bus_type = ;

static ssize_t show_bus_version(struct bus_type *bus, char *buf)

static bus_attr(version, s_irugo, show_bus_version, null);

static int __init my_bus_init(void)

static void my_bus_exit(void)

module_init(my_bus_init);

module_exit(my_bus_exit);

執行結果在 /sys/bus 

裡有乙個目錄為

my_bus

,my_bus

目錄裡是匯流排屬性。

下面是裝置,每個裝置由乙個struct device 

描述,

int device_register(struct device *dev)  註冊裝置

int device_unregister(struct device *dev)  登出裝置

另外,匯流排也是裝置,也需要按裝置註冊。

裝置屬性由device_attribute描述.

int device_create_file(struct device *dev,  const struct device_attribute *attr)                  建立裝置屬性檔案。

void device_remove_file(struct device *dev,  const struct device_attribute *attr)

刪除裝置屬性檔案。

bus.c

#include #include #include #include #include static char *version = "$revision: 1.9 $";

static int my_match(struct device *dev, struct device_driver *driver)

static void my_bus_release(struct device *dev)

struct device my_bus = ;

struct bus_type my_bus_type = ;

export_symbol(my_bus); //匯出符號

export_symbol(my_bus_type);

/* * export a ****** attribute.

*/static ssize_t show_bus_version(struct bus_type *bus, char *buf)

static bus_attr(version, s_irugo, show_bus_version, null);

static int __init my_bus_init(void)

static void my_bus_exit(void)

module_init(my_bus_init);

module_exit(my_bus_exit);

匯流排註冊後,就該註冊裝置了,裝置是掛在匯流排上的裝置

device.c

#include #include #include #include #include extern struct device my_bus; 

extern struct bus_type my_bus_type;

/* why need this ?*/

static void my_dev_release(struct device *dev)

struct device my_dev = ;

/* * export a ****** attribute.

*/static ssize_t mydev_show(struct device *dev, char *buf)

static device_attr(dev, s_irugo, mydev_show, null);

static int __init my_device_init(void)

static void my_device_exit(void)

module_init(my_device_init);

module_exit(my_device_exit);

註冊後產生乙個裝置,裝置屬於my_bus

,bus

下所有裝置都是鏈結,真正的裝置在

device

目錄下。

最後乙個是驅動描述

驅動程式是由struct device_driver

描述的,裡面有個重要指標

int  (*probe) (struct device *dev);  當驅動找到與他匹配的裝置的時候,就會呼叫

probe()。

int driver_register(struct device_driver *drv) 註冊驅動

void driver_unregister(struct device_driver *drv) 登出驅動

驅動的屬性檔案struct driver_register。

int driver_create_file(struct device_driver *drv, const struct driver_attribute *attr)

建立屬性檔案

void driver_remove_file(struct device_driver *drv, const struct driver_attribute *attr)

刪除屬性檔案

driver.c

#include #include #include #include #include extern struct bus_type my_bus_type;

static int my_probe(struct device *dev)

static int my_remove(struct device *dev)

struct device_driver my_driver = ;

/** export a ****** attribute.

*/static ssize_t mydriver_show(struct device_driver *driver, char *buf)

static driver_attr(drv, s_irugo, mydriver_show, null);

static int __init my_driver_init(void)

static void my_driver_exit(void)

module_init(my_driver_init);

module_exit(my_driver_exit);

先加驅動,後加裝置,在加裝置時匯流排會遍歷驅動,看有無驅動能處理裝置,如果有呼叫驅動probe()

。先加裝置後加驅動,加驅動匯流排也會查詢所有裝置,看有無裝置被驅動處理,如果有呼叫驅動

probe()。

匯流排 裝置 驅動模型

裝置元素 匯流排,驅動,裝置 匯流排 處理器和裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連,甚至是內部的虛擬 platform 匯流排 定時器,看門狗並沒有直接相連 在linux裝置模型中,匯流排由bus type結構表示,定義在 匯流排的註冊使用 bus register struct...

匯流排裝置驅動模型

匯流排 乙個匯流排是處理器和乙個或多個裝置之間的通道。為裝置模型的目的,所有的裝置都通過乙個匯流排連線,甚至當它是乙個內部的虛擬的 平台 匯流排。裝置 裝置就是連線在匯流排上的物理實體。裝置是有功能之分的。具有相同功能的裝置被歸到乙個類 class 中。在linux 系統中,每個裝置由乙個 stru...

匯流排裝置驅動模型

1.匯流排裝置模型概述 2.匯流排 3.驅動 4.裝置 1.匯流排裝置模型概述 隨著技術的不斷進步,系統的拓撲結構也越來越複雜,對熱插拔,跨平台移植性的要求也越來越高,2.4核心已經難以滿足這些需求。為適應這種形勢的需要,從linux2.6核心開始提供了全新的裝置模型。匯流排裝置驅動對熱插拔要求越來...