设备结构包含设备模型核心需要的来模型化系统的信息. 大部分子系统, 但是, 跟踪关于 它们驻留的设备的额外信息. 结果, 对设备很少由空设备结构所代表; 相反, 这个结构, 如同 kobject 结构, 常常是嵌入一个更高级的设备表示中. 如果你查看 struct pci_dev

的定义或者 struct usb_device 的定义, 你会发现一个 struct device 埋在其中.
常常 地, 低层驱动甚至不知道 struct device, 但是有例外.

lddbus 驱动创建它自己的设备类型( struct ldd_device ) 并且期望单独的设备驱动来
注册它们的设备使用这个类型. 它是一个简单结构:

struct ldd_device { char *name;

struct
ldd_driver *driver; struct device dev;

};

#define
to_ldd_device(dev) container_of(dev, struct ldd_device, dev);

这个结构允许驱动提供一个实际的名子给设备( 这可以清楚地不同于它的总线 ID, 存储 于设备结构) 以及一个这些驱动信息的指针. 给真实设备的结构常常还包含关于供应者信 息, 设备型号, 设备配置, 使用的资源, 等等. 可以在 struct pci_dev (<linux/pci.h>) 或者 struct usb_device (<linux/usb.h>) 中找到好的例子. 一个方便的宏

( to_ldd_device ) 也为 struct ldd_device 定义, 使得容易转换指向被嵌入的结构的
指针为 ldd_device 指针.

lddbus 输出的注册接口看来如此:

int
register_ldd_device(struct ldd_device *ldddev)

{

ldddev->dev.bus
= &ldd_bus_type; ldddev->dev.parent = &ldd_bus;

ldddev->dev.release
= ldd_dev_release;

strncpy(ldddev->dev.bus_id,
ldddev->name, BUS_ID_SIZE); return device_register(&ldddev->dev);

}

EXPORT_SYMBOL(register_ldd_device);

这里, 我们简单地填充一些嵌入的设备结构成员( 单个驱动不应当需要知道这个 ), 并且 注册这个设备到驱动核心. 如果我们想添加总线特定的属性到设备, 我们可在这里做.

为显示这个接口如何使用, 我们介绍另一个例子驱动, 我们称为 sculld. 它是在第
8 章 介绍的 scullp 驱动上的另一个变体. 它实现通用的内存区设备, 但是 sculld 也使用
Linux 设备模型, 通过 lddbus 接口.

sculld 驱动添加一个它自己的属性到它的设备入口; 这个属性, 称为 dev, 仅仅包含关 联的设备号. 这个属性可被一个模块用来加载脚本或者热插拔子系统, 来自动创建设备节 点, 当设备被添加到系统时. 这个属性的设置遵循常用模式:

static ssize_t
sculld_show_dev(struct device *ddev, char *buf)

{

struct
sculld_dev *dev = ddev->driver_data; return print_dev_t(buf,
dev->cdev.dev);

}

static
DEVICE_ATTR(dev, S_IRUGO, sculld_show_dev, NULL);

接着, 在初始化时间, 设备被注册, 并且 dev 属性被创建通过下面的函数:

static
void sculld_register_dev(struct sculld_dev *dev, int index)

{

sprintf(dev->devname,
"sculld%d", index); dev->ldev.name = dev->devname;

dev->ldev.driver
= &sculld_driver; dev->ldev.dev.driver_data = dev; register_ldd_device(&dev->ldev);

device_create_file(&dev->ldev.dev,
&dev_attr_dev);

}

注意, 我们使用 driver_data 成员来存储指向我们自己的内部的设备结构的指针

最新文章

  1. Web接口测试工具--Jmeter
  2. 6月辞职-&gt;帝都生活
  3. Linux下串口与工业协议的开发
  4. switch中的default的位置
  5. 检测一个DOM对象是否为空
  6. Unity3D如何获取对象和子对象
  7. 洛谷 P1336 最佳课题选择
  8. filter, sort
  9. 2px边框,4分之1内边框实现选中功能实现
  10. appache 在windows 中无法启动的测试
  11. flask 需要下载的包
  12. Mysql加锁过程详解(1)-基本知识
  13. 【转载】PhpStudy修改网站根目录
  14. Build 2017 Revisited: .NET, XAML, Visual Studio
  15. Boost::bind使用详解
  16. 常用Web框架
  17. keras、 tensor flow 教程
  18. 通用数据库连接池-C3PO
  19. BZOJ 4520 [Cqoi2016]K远点对(KD树)
  20. php写杨辉三角算法

热门文章

  1. thinkphp5.0 验证提示信息的类型
  2. oracle审计实施
  3. WPF HTTP请求(GET,POST)
  4. 【NS2】WiMAX_NS2说明文档(转载)
  5. python字符串、元组常用操作
  6. 03寻找最小的k个数
  7. 宝塔linux
  8. 谷歌BERT预训练源码解析(一):训练数据生成
  9. 2018-8-10-WPF-如何在绑定失败异常
  10. swiper仿tab栏切换