Linux总线设备驱动模型

Linux总线设备驱动模型

总线设计

总线描述

总线是处理器和设备之间的通道,在设备模型中,所有的设备读通过总线相连,甚至是内部的虚拟“platform”总线。在Linux设备模型中,总线由bus_type结构表示,定义在<linux/device.h>

struct bus_type {

const char *name; /* 总线名称*/

struct bus_attribute *bus_attrs; /* 总线属性*/

struct device_attribute *dev_attrs; /* 设备属性*/

struct driver_attribute *drv_attrs; /* 驱动属性*/

int (*match)(struct device *dev, struct device_driver *drv);//驱动与设备的匹配函数,当一个新设备或者新驱动被添加到这个总线时,该函数被调用。用于判断指定的驱动程序是否能处理指定的设备,若可以,则返回非零。

int (*uevent)(struct device *dev, struct kobj_uevent_env *env);

int (*probe)(struct device *dev);

int (*remove)(struct device *dev);

void (*shutdown)(struct device *dev);

int (*suspend)(struct device *dev, pm_message_t state);

int (*suspend_late)(struct device *dev, pm_message_t state);

int (*resume_early)(struct device *dev);

int (*resume)(struct device *dev);

struct dev_pm_ops *pm;

struct bus_type_private *p;

}

总线注册

bus_register(structbus_type * bus)

若成功,新的总线将被添加进系统,并可在sysfs的/sys/bus下看到。

总线删除

voidbus_unregister(struct bus_type *bus)

总线属性

struct bus_attribute {

struct attribute attr;

ssize_t (*show)(struct bus_type *, char * buf);

ssize_t (*store)(struct bus_type *, const char *

buf, size_t count);

}

创建属性

intbus_create_file(struct bus_type *bus,struct bus_attribute *attr)

删除属性

void bus_remove_file(structbus_type*bus, struct bus_attribute *attr)

 

设备设计

设备描述

         Linux系统中的每一个设备由一个structdevice描述:

struct device {

…… …… …… ………… ……

struct kobject kobj;

char bus_id[BUS_ID_SIZE]; /*在总线上唯一标识该设备的字符串 */

struct bus_type *bus; /* 设备所在总线 */

struct device_driver *driver; /*管理该设备的驱动*/

void *driver_data; /*该设备驱动使用的私有数据成员 *

struct klist_node knode_class;

struct class *class;

struct attribute_group **groups;

void (*release)(struct device *dev);

}

设备注册

intdevice_register(struct device *dev)

         在驱动注册函数中内核会在相应的my_bus总线上遍历所有的设备,做匹配操作,匹配函数为my_match(bus.c)匹配方式为设备名和驱动注册的名字是否一致,如果匹配成功,驱动函数为my_probe被调用。

设备注销

         voiddevice_unregister(struct device *dev)

设备属性

struct device_attribute

{

struct attribute attr;

ssize_t (*show)(struct device *dev, struct device_attribute

*attr,char *buf);

ssize_t (*store)(struct device *dev, struct device_attribute *attr,

const char *buf, size_t count);

}

创建属性

intdevice_create_file(struct device*device, struct device_attribute * entry)

删除属性

voiddevice_remove_file(struct device *dev, struct device_attribute * attr)

驱动设计

驱动描述

         驱动程序由structdevice_driver描述:

struct device_driver {

const char *name; /*驱动驱动 程序 的 名字 字( 体 体 现在 在 sysfs 中 中 )*/

struct bus_type *bus; /*驱动 驱动 程序所在的总线 所在的总线*/

struct module *owner;

const char  *mod_name;

int (*probe) (struct device *dev);

int (*remove) (struct device *dev);

void (*shutdown) (struct device *dev);

int (*suspend) (struct device *dev, pm_message_t state);

int (*resume) (struct device *dev);

struct attribute_group **groups;

struct dev_pm_ops *pm;

struct driver_private *p;

}

驱动注册

         intdriver_register(struct device_driver *drv)

驱动注销

         voiddriver_unregister(struct device_driver *drv)

驱动属性

struct driver_attribute {

struct attribute attr;

ssize_t (*show)(struct device_driver *drv,

char *buf);

ssize_t (*store)(struct device_driver *drv,

const char *buf, size_t count);

}

创建属性

int driver_create_file(struct device_driver * drv,

struct driver_attribute * attr)

删除属性

void driver_remove_file(struct device_driver * drv,

struct driver_attribute * attr)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux总线设备模型是一种用于管理和操作硬件设备的框架。它提供了一种统一的方式来访问和控制连接到计算机系统上的各种设备,包括串口、USB、PCI、I2C等。 在Linux系统中,每个设备都被视为一个文件,并通过文件路径来访问。总线设备模型定义了设备之间的层次关系和通信机制,使得设备可以被识别、配置和操作。 Linux总线设备模型由以下几个重要组件组成: 1. 设备树(Device Tree):在启动过程中,设备树用于描述连接到系统的各种硬件设备和其相互关系。它是一个以文本方式描述的树状结构,包含了设备的类型、地址、中断等信息。 2. 设备驱动程序(Device Driver):驱动程序是用来控制和管理特定硬件设备的软件模块。每个设备都有相应的驱动程序,它们与设备进行通信,并提供对设备的访问接口。 3. 总线(Bus):总线是连接多个设备的物理或逻辑通道。例如,PCI总线、USB总线等。总线提供了设备之间通信的基础。 4. 设备类(Device Class):设备类是一组具有相似功能的设备的集合。例如,USB设备类包括存储设备、键盘、鼠标等。设备类可以帮助系统区分和管理不同类型的设备。 通过使用总线设备模型Linux系统可以自动检测和配置连接到系统的设备,使其能够正常工作。同时,开发者也可以编写自定义的驱动程序来支持新的硬件设备总线设备模型的设计使得设备的添加、删除和管理变得更加灵活和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值