Linux驅動之裝置模型 5

2021-06-05 00:54:08 字數 2916 閱讀 6326

6.裝置

6.1  裝置

l  linux裝置模型中每乙個裝置用device結構來表示

struct device ;

6.2 裝置屬性

l  裝置屬性由device_attribute來表示

structdevice_attribute ;

device_attr(_name,_mode, _show, _store)

l  屬性操作

n  新增屬性

int device_create_file(struct device *device,

conststruct device_attribute *entry);

n  刪除屬性

void device_remove_file(struct device *dev,

const struct device_attribute*attr);

6.3  裝置註冊和登出

l  裝置註冊和登出

intdevice_register(struct device *dev);

voiddevice_unregister(struct device *dev);

l  裝置註冊分析

註冊函式由初始化裝置(device_initialize)和新增裝置到系統(device_add)中兩步構成,主要分析一下第二步

n  device_add,新增裝置

int device_add(structdevice *dev)

/* 增加父裝置的引用計數 */

parent = get_device(dev->parent);

setup_parent(dev, parent);

/* 把內嵌的kobject註冊到裝置模型中 */

error = kobject_add(&dev->kobj,dev->kobj.parent, null);

/*建立屬性檔案uevent */

error = device_create_file(dev,&uevent_attr);

/* 如果定義了devt,則產生dev屬性 */

if (major(dev->devt))

/* 建立屬性檔案 */

error = device_add_class_symlinks(dev);

error = device_add_attrs(dev);

/* 把裝置新增到匯流排上,這個是重點,稍後分析*/

error = bus_add_device(dev);

/*產生kobj_add uevent */

kobject_uevent(&dev->kobj,kobj_add);

/* 給裝置探測相應的驅動 */

bus_probe_device(dev);

/* 如果裝置有父裝置,將它加入parent的子裝置鏈中 */

if (parent)

klist_add_tail(&dev->p->knode_parent,

&parent->p->klist_children);

/* 如果裝置附屬於某個類,則需完成相應工作*/

if (dev->class)

}n  bus_add_device

intbus_add_device(struct device *dev)

}n  bus_probe_device,為裝置探測相應的驅動

bus_probe_device()->device_attach()

intdevice_attach(struct device *dev)

else

out_unlock:

device_unlock(dev);

return ret;

}__device_attach()->driver_probe_device()->really_probe()->bus->probe()->drv->probe()  匯流排中定義的probe函式會優先執行,如果匯流排中沒有定義probe才會執行驅動中定義的probe

6.4  例項解析

建立乙個裝置和它的屬性version,並將此裝置掛接到之前建立的匯流排上

/** for learn device

*/#include

#include

#include

#include

extern struct bus_type scbus_type;

extern struct device scbus;

static char *version = "revision1.0";

/* 析構函式,引用計數減為0時呼叫 */

void screlease(struct device *dev)

struct device scdevice = ;

/** export device attribute

*/static ssize_t show_device_version(structdevice *dev,

structdevice_attribute *attr, char *buf)

device_attr(version, 0666,show_device_version, null);

static int __init scdevice_init(void)

static void __exit scdevice_exit(void)

module_init(scdevice_init);

module_exit(scdevice_exit);

module_license("dual bsd/gpl");

module_author("cjok");

試驗結果:

Linux驅動之裝置模型 3

4 小結 4.1 kobject,kset和ktype kobject,kset和ktype就三個結構體,但是卻很容易讓人混淆,是由於它們內部相互交織。l kobject,是裝置模型中的基本物件,包含了引用計數,父子關係,目錄項等,通常會嵌入到其它的資料結構中,使其也具有kobject的特性 l k...

Linux驅動之裝置模型 8

9 小結 9.1 匯流排,裝置,驅動和類之間的關係 l 匯流排相當於乙個容器,是device和device driver的管理機構,它包含了乙個device集合 devices kset 和乙個驅動集合 drivers kset 分別表示掛依附於此匯流排的所有裝置和所有驅動。l 驅動依附在匯流排上,...

Linux驅動之裝置模型 8

9 小結 9.1 匯流排,裝置,驅動和類之間的關係 l 匯流排相當於乙個容器,是device和device driver的管理機構,它包含了乙個device集合 devices kset 和乙個驅動集合 drivers kset 分別表示掛依附於此匯流排的所有裝置和所有驅動。l 驅動依附在匯流排上,...