微软交流社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 95|回复: 0

linx设备驱动模型之基本设备结构

[复制链接]

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-4-7 12:15:05 | 显示全部楼层 |阅读模式
见struct device的内核文档  

编程接口

发现设备的总线驱动程序使用它向核心注册设备:
int device_register(struct device * dev);总线应初始化以下字段:

  • parent
  • name
  • bus_id
  • bus
当设备的引用计数变为 0 时,设备将从核心中移除。可以使用以下方法调整引用计数:
struct device * get_device(struct device * dev);
void put_device(struct device * dev);get_device()如果引用还不是 0(如果它已经在被删除的过程中),将返回一个指向传递给它的指针。
驱动程序可以使用以下方式访问设备结构中的锁:
void lock_device(struct device * dev);
void unlock_device(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);
};设备的属性可以由设备驱动程序通过 sysfs 导出。
请参阅sysfs - _The_ filesystem for exporting kernel objects,了解有关 sysfs 如何工作的更多信息。
正如Everything you never wanted to know about kobjects, ksets, and ktypes中所解释的,必须在生成 KOBJ_ADD uevent 之前创建设备属性。实现这一点的唯一方法是定义一个属性组。
使用名为 DEVICE_ATTR 的宏声明属性:
#define DEVICE_ATTR(name,mode,show,store)例子::
static DEVICE_ATTR(type, 0444, type_show, NULL);
static DEVICE_ATTR(power, 0644, power_show, power_store);辅助宏可用于 mode 的公共值,因此上面的示例可以简化为:
static DEVICE_ATTR_RO(type);
static DEVICE_ATTR_RW(power);这声明了两个类型为 struct device_attribute 的结构,其名称分别为“dev_attr_type”和“dev_attr_power”。这两个属性可以按如下方式组织成一个组:
static struct attribute *dev_attrs[] = {
      &dev_attr_type.attr,
      &dev_attr_power.attr,
      NULL,
};

static struct attribute_group dev_group = {
      .attrs = dev_attrs,
};

static const struct attribute_group *dev_groups[] = {
      &dev_group,
      NULL,
};辅助宏可用于单个组的常见情况,因此可以使用 :: 声明上述两个结构:
ATTRIBUTE_GROUPS(dev);然后可以通过在调用 device_register() 之前在 struct device 中设置组指针,将这个组数组与设备相关联
dev->groups = dev_groups;
device_register(dev);该device_register()函数将使用“groups”指针创建设备属性,该device_unregister()函数将使用该指针删除设备属性。
警告:虽然内核允许随时在设备上调用 device_create_file()和 device_remove_file() ,但用户空间对何时创建属性有严格的期望。当一个新设备在内核中注册时,会生成一个 uevent 来通知用户空间(如 udev)有一个新设备可用。如果在设备注册后添加属性,则用户空间不会收到通知,用户空间也不会知道新属性。
这对于需要在驱动程序探测时为设备发布附加属性的设备驱动程序很重要。如果设备驱动程序简单地调用device_create_file()传递给它的设备结构,那么用户空间将永远不会收到新属性的通知。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|微软交流社区

GMT+8, 2025-1-7 04:36 , Processed in 0.066562 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表