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 驅動依附在匯流排上,...