装备LINUX装备驱动之装备模型叁deviceampdriverampbus装备
装备 总线 类型 字段 内核 文件系统 函数 目次 定义 过程 结构 继续 代码 别的 如许 系统 赋值 数据结构 次序 初始化 指针 分歧 异样 适宜 先前 版本号 局部 源码 属性 内存空间 出处 区域 两个 版本 基本 链接 文件 博客
LINUXZhuang∴Bei∴Qu∴Dong∴Zhi∴Zhuang∴Bei∴Mo∴Xing∴San∴deviceampdriverampbusAuthor: Eric Fang
Date: 2010-01-12
-------------------------------------------------- ---------------
本站剖析linux内核源码!版本号为2.6.32.3
转载请说明出处http://ericfang.cu博客.cn/
-------------------------------------------------- ---------------
正在分了然kobject以后!就可以够继续剖析device!driver!bus了!这叁者是装备驱动次序递次的基本数据结构
我们能够如许了解!内核用device来表现各类装备!然后用driver来表现它的驱动!而装备有很多种!也属于相同类型或者分歧类型!而其对应的驱动能够同时也是别的壹个装备的驱动!为了治理这些装备和驱动!就引进了总线bus_type!总线上有两个汇合!辨别用来寄存该总线类型的装备和驱动!当增加壹个装备时就将装备增加到总线的装备汇合!同时能够会到驱动汇合往婚配适宜它的驱动!若何找到了就会将它们联系起来异样注册壹个驱动!就会把它挂到响应总线类型的驱动汇合里!同时往装备汇合中找出它锁驱动的装备!假设找到就把装备链接到它支撑的装备链表上
下面我们进进到代码中往
struct bus_type结构定义以下
struct bus_type
const char name。
struct bus_attributebus_attrs。
struct device_attribute dev_attrs。
struct driver_attribute drv_attrs。
int 。
int 。
int 。
int 。
void 。
int 。
int 。
const struct dev_pm_ops pm。
struct bus_type_private p。
。
较之先前壹些内核版本!bus_type把局部私有字段封装到bus_type_private类型结构里
struct bus_type_private
struct kset subsys。
struct kset drivers_kset。
struct kset devices_kset。
struct klist klist_devices。
struct klist klist_drivers。
struct blocking_notifier_head bus_notifier。
unsigned int drivers_autoprobe:1。
struct bus_type bus。
。
字段klist_devices和klist_drivers辨别表现挂正在bus_type上的驱动和装备链表!bus_type的其他字段和函数指针将正在剖析过程当中说明
起首我们要为装备和驱动注册壹个总线类型
int bus_register
int retval。
struct bus_type_private priv。
priv = kzalloc! GFP_KERNEL)。
if
return -ENOMEM。
priv-gt。bus = bus。
bus-gt。p = priv。
分派私有区域的内存空间!并将其关联
BLOCKING_INIT_NOTIFIER_HEAD。
初始化回调函数
retval = kobject_set_name。
if
goto out。
priv-gt。subsys.kobj.kset = bus_kset。
priv-gt。subsys.kobj.ktype = bus_ktype。
priv-gt。drivers_autoprobe = 1。
retval = kset_register。
if
goto out。
这里我们看到了subsys用来表现它的文件系统!能够回忆上壹节kset的注册
这个bus_kset是系统发动是创立的!系统init过程kernel_init中调用do_basic_setup!此中调用driver_init!此中调用的buses_init!以下
int __init buses_init
bus_kset = kset_create_and_add。
if
return -ENOMEM。
return 0。
从而知道创立的文件系统目次正在/sys/bus下
static struct kset_uevent_ops bus_uevent_ops =
.filter = bus_uevent_filter!
。
static int bus_uevent_filter
struct kobj_type ktype = get_ktype。
if
return 1。
return 0。
继续bus_register中的代码
retval = bus_create_file。
if
goto bus_uevent_fail。
bus_create_file以下:
int bus_create_file
int error。
if )
error = sysfs_create_file。
bus_put。
else
error = -EINVAL。
return error。
用bus_attr_uevent创立了bus-gt。p-gt。subsys.kobj的属性文件!由下面的赋值知道其读写操纵正在bus_ktype的sysfs_ops!其定义以下
static struct kobj_type bus_ktype =
.sysfs_ops = bus_sysfs_ops!Author: Eric FangDate:2010-01-12 -------------------------------------------------- ---------------
飞扬黑客网 http://www.gdwkb.cn
LINUXZhuang∴Bei∴Qu∴Dong∴Zhi∴Zhuang∴Bei∴Mo∴Xing∴San∴deviceampdriverampbusAuthor: Eric Fang
Date: 2010-01-12
-------------------------------------------------- ---------------
本站剖析linux内核源码!版本号为2.6.32.3
转载请说明出处http://ericfang.cu博客.cn/
-------------------------------------------------- ---------------
正在分了然kobject以后!就可以够继续剖析device!driver!bus了!这叁者是装备驱动次序递次的基本数据结构
我们能够如许了解!内核用device来表现各类装备!然后用driver来表现它的驱动!而装备有很多种!也属于相同类型或者分歧类型!而其对应的驱动能够同时也是别的壹个装备的驱动!为了治理这些装备和驱动!就引进了总线bus_type!总线上有两个汇合!辨别用来寄存该总线类型的装备和驱动!当增加壹个装备时就将装备增加到总线的装备汇合!同时能够会到驱动汇合往婚配适宜它的驱动!若何找到了就会将它们联系起来异样注册壹个驱动!就会把它挂到响应总线类型的驱动汇合里!同时往装备汇合中找出它锁驱动的装备!假设找到就把装备链接到它支撑的装备链表上
下面我们进进到代码中往
struct bus_type结构定义以下
struct bus_type
const char name。
struct bus_attributebus_attrs。
struct device_attribute dev_attrs。
struct driver_attribute drv_attrs。
int 。
int 。
int 。
int 。
void 。
int 。
int 。
const struct dev_pm_ops pm。
struct bus_type_private p。
。
较之先前壹些内核版本!bus_type把局部私有字段封装到bus_type_private类型结构里
struct bus_type_private
struct kset subsys。
struct kset drivers_kset。
struct kset devices_kset。
struct klist klist_devices。
struct klist klist_drivers。
struct blocking_notifier_head bus_notifier。
unsigned int drivers_autoprobe:1。
struct bus_type bus。
。
字段klist_devices和klist_drivers辨别表现挂正在bus_type上的驱动和装备链表!bus_type的其他字段和函数指针将正在剖析过程当中说明
起首我们要为装备和驱动注册壹个总线类型
int bus_register
int retval。
struct bus_type_private priv。
priv = kzalloc! GFP_KERNEL)。
if
return -ENOMEM。
priv-gt。bus = bus。
bus-gt。p = priv。
分派私有区域的内存空间!并将其关联
BLOCKING_INIT_NOTIFIER_HEAD。
初始化回调函数
retval = kobject_set_name。
if
goto out。
priv-gt。subsys.kobj.kset = bus_kset。
priv-gt。subsys.kobj.ktype = bus_ktype。
priv-gt。drivers_autoprobe = 1。
retval = kset_register。
if
goto out。
这里我们看到了subsys用来表现它的文件系统!能够回忆上壹节kset的注册
这个bus_kset是系统发动是创立的!系统init过程kernel_init中调用do_basic_setup!此中调用driver_init!此中调用的buses_init!以下
int __init buses_init
bus_kset = kset_create_and_add。
if
return -ENOMEM。
return 0。
从而知道创立的文件系统目次正在/sys/bus下
static struct kset_uevent_ops bus_uevent_ops =
.filter = bus_uevent_filter!
。
static int bus_uevent_filter
struct kobj_type ktype = get_ktype。
if
return 1。
return 0。
继续bus_register中的代码
retval = bus_create_file。
if
goto bus_uevent_fail。
bus_create_file以下:
int bus_create_file
int error。
if )
error = sysfs_create_file。
bus_put。
else
error = -EINVAL。
return error。
用bus_attr_uevent创立了bus-gt。p-gt。subsys.kobj的属性文件!由下面的赋值知道其读写操纵正在bus_ktype的sysfs_ops!其定义以下
static struct kobj_type bus_ktype =
.sysfs_ops = bus_sysfs_ops!Author: Eric FangDate:2010-01-12 -------------------------------------------------- ---------------
飞扬黑客网 http://www.gdwkb.cn


