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

设备模型三要素:总线,驱动,设备。
一、总线
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)// 删除属性

 

 

 

posted @ 2013-09-09 19:36  pangbangb  阅读(198)  评论(0编辑  收藏  举报