编程接口

  1. int device_register(struct device * dev);

总线需要初始化以下四个参数

  • parent
  • name
  • bus_id
  • bus

当一个设备的引用数(reference )为0时,将会被内核移除。我们可以使用下面的API调整(reference )。

  1. struct device * get_device(struct device * dev);
  2. void put_device(struct device * dev);

访问内核的锁API

  1. void lock_device(struct device * dev);
  2. void unlock_device(struct device * dev);

Attributes

  1. struct device_attribute {
  2. struct attribute attr;
  3. ssize_t (*show)(struct device *dev, struct device_attribute *attr,
  4. char *buf);
  5. ssize_t (*store)(struct device *dev, struct device_attribute *attr,
  6. const char *buf, size_t count);
  7. };

设备的属性可以通过sysfs文件系统展示(export)出来。关于sysfs的更多信息可以查看Documentation/filesystems/sysfs.txt 文档。
如Documentation/kobject.txt中所述,必须在生成KOBJ_ADD uevent之前创建设备属性。实现这一点的唯一方法是定义一个属性组。可以使用DEVICE_ATTR宏定义来声明这样的一个属性组。

  1. #define DEVICE_ATTR(name,mode,show,store)
  2. /*----------例程------------*/
  3. static DEVICE_ATTR(type, 0444, show_type, NULL);
  4. static DEVICE_ATTR(power, 0644, show_power, store_power);

这声明了两个struct device_属性类型的结构,其各自的名称为“dev_attr_type”和“dev_attr_power”。这两个属性可以按如下方式组织为一个组:

  1. /*-------属性数组-------*/
  2. static struct attribute *dev_attrs[] = {
  3. &dev_attr_type.attr,
  4. &dev_attr_power.attr,
  5. NULL,
  6. };
  7. /*-------将对应的属性数组赋值给 attribute_group.attrs---*/
  8. static struct attribute_group dev_attr_group = {
  9. .attrs = dev_attrs,
  10. };
  11. /*-----将属性组组成对应的属性组数组---*/
  12. static const struct attribute_group *dev_attr_groups[] = {
  13. &dev_attr_group,
  14. NULL,
  15. };
  16. /*----将属性绑定到设备上----*/
  17. struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL);
  18. dev->groups = netiucv_attr_groups;
  19. /*----最后注册--------*/
  20. ret = device_register(dev);

关于device_register

上面我们讲到会使用device_register 函数来注册设备,将设备属性绑定起来。

  1. drivers/base/core.c:1125:int device_register(struct device *dev)
  2. device_initialize(dev);
  3. return device_add(dev);
  4. void device_initialize(struct device *dev)
  5. ...
  6. int device_add(struct device *dev)
  7. # 在这里创建对应的 sysfs下的设备属性文件
  8. error = device_create_file(dev, &dev_attr_uevent);
  9. int device_create_file(struct device *dev,
  10. const struct device_attribute *attr)
  11. sysfs_create_file(&dev->kobj, &attr->attr);