• [置顶] 设备模型:总线、驱动、设备


    设备模型三要素:总线,驱动,设备。
    一、总线
    1、总线:总线是处理器和设备之间的通道,在设备模型中, 所有的设备都通过总线相连,
    甚至是内部的虚拟“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;
    }
    2、总线注册和删除:
    总线的注册使用:
    bus_register(struct bus_type * bus)//若成功,新的总线将被添加进系统,并可在sysfs 的 /sys/bus 下看到。
    总线的删除使用:
    void bus_unregister(struct bus_type *bus)

    3、总线方法:
    int (*match)(struct device * dev, struct device_driver * drv)//当一个新设备或者驱动被添加到这个总线
    时,该方法被调用。用于判断指定的驱动程序是否能处理指定的设备。若可以,则返回非零值。即设备和驱动是否对应
    int (*uevent)(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size) //在为用户空间产生热插拔事件之前,这个
    方法允许总线添加环境变量。

    4、总线属性由结构bus_attribute 描述,定义如下:
    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);
    }

    bus_create_file(struct bus_type *bus, struct bus_attribute *attr)//创建属性
    bus_remove_file(struct bus_type *bus, struct bus_attribute *attr)//删除属性

    二、设备
    1、Linux 系统中的每个设备由一个 struct device 描述:
    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);
    }

    2、设备注册和注销
    device_register(struct device *dev) //注册设备
    device_unregister(struct device *dev)//注销设备
    说明:**一条总线也是个设备,也必须按设备注册**

    3、设备属性
    设备属性由struct device_attribute 描述:
    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);
    }

    device_create_file(struct device *device,   struct device_attribute * entry)// 创建属性
    device_remove_file(struct device * dev, struct device_attribute * attr)//删除属性


    三、驱动
    1、驱动程序由struct device_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;
    }
    2、驱动注册和注销
    int driver_register(struct device_driver *drv)// 注册驱动
    void driver_unregister(struct device_driver *drv)// 注销驱动

    3、驱动属性
    驱动的属性使用struct driver_attribute 来描述:
    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)// 删除属性

  • 相关阅读:
    12.如何设置ulimit
    11.vim常用操作
    01Java jdk环境配置
    css
    Html
    day07 Class_field_method_反射
    JDBC
    Oracle day05 索引_数据去重
    Oracle day05 建表_约束
    Oracle day04 DML_事务_序列_视图_数据类型_DDL
  • 原文地址:https://www.cnblogs.com/pangblog/p/3310560.html
Copyright © 2020-2023  润新知