设备结构包含设备模型核心需要的来模型化系统的信息. 大部分子系统, 但是, 跟踪关于 它们驻留的设备的额外信息. 结果, 对设备很少由空设备结构所代表; 相反, 这个结构, 如同 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 成员来存储指向我们自己的内部的设备结构的指针

Linux 内核 设备结构嵌入的更多相关文章

  1. Linux 内核驱动结构嵌入

    如同大部分驱动核心结构的情形, device_driver 结构常常被发现嵌到一个更高级的, 总 线特定的结构. lddbus 子系统不会和这样的趋势相反, 因此它已定义了它自己的 ldd_drive ...

  2. Linux内核device结构体分析

    1.前言 Linux内核中的设备驱动模型,是建立在sysfs设备文件系统和kobject上的,由总线(bus).设备(device).驱动(driver)和类(class)所组成的关系结构,在底层,L ...

  3. Linux内核--链表结构(一)

    一.前言 Linux内核链表结构是一种双向循环链表结构,与传统的链表结构不同,Linux内核链表结构仅包含前驱和后继指针,不包含数据域.使用链表结构,仅需在结构体成员中包含list_head*成员就行 ...

  4. Linux内核kobject结构体分析

    1.前言 Linux内核中有大量的驱动,而这些驱动往往具有类似的结构,根据面向对象的思想,可以将共同的部分提取为父类,而这个父类就是kobject,kobject结构体中包含了大量设备的必须信息,而三 ...

  5. Linux内核--链表结构(二)

    Linux内核链表定义了一系列用于链表遍历的宏,本章详细描述. 一.container_of和offsetof 首先介绍两个很好用的宏container_of和offsetof.offsetof宏用于 ...

  6. Linux内核 设备树操作常用API【转】

    转自:https://www.linuxidc.com/Linux/2017-02/140818.htm 一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在&qu ...

  7. Linux内核 设备树操作常用API

    Linux设备树语法详解一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在"include/of.h"中声明. device_node 内核中 ...

  8. Linux内核目录结构

    arch 包括所有和体系结构相关的核心代码. include 包括编译内核所需要的大部分头文件 init 包含内核的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件 mm ...

  9. Linux 内核设备驱动

    设备模型跟踪所有对系统已知的驱动. 这个跟踪的主要原因是使驱动核心能匹配驱动和新 设备. 一旦驱动在系统中是已知的对象, 但是, 许多其他的事情变得有可能. 设备驱动可 输出和任何特定设备无关的信息和 ...

随机推荐

  1. jdbc知识点(连接mysql)

    jdbc连接mysql 1.JDBC简介 JDBC: 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库.从根本上来说,JDBC ...

  2. hdu1532&&poj1273 最大流

    Dinic算法: 层次图:根据源点到该点的距离建图,这里设相邻的都差1. (下面部分转) 在这幅图中我们首先要增广1->2->4->6,这时可以获得一个容量为2的流,但是如果不建立4 ...

  3. xib搭建scrollView无法滑动的问题

    最近给xib中的scrollView添加contentView的时候,view的约束总是参照莫名其妙的东西,不是frameLayout就是safeArea 因为之前都是默认以superView为参照系 ...

  4. python 逗号分隔值文件的操作

  5. UVa 495【大数加法】

    UVa 495 求第n位斐波那契数列,n<=5000. 还是大数问题,这次是大数加法.仿照UVa 623的解法来做.623位数可以一位一位的增,但是这个需要预先给够位数,要是按六位存一个数组元素 ...

  6. Myeclipse jdk的安装

  7. @codeforces - 1056G@ Take Metro

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 环上有 n 个点,按顺时针顺序以 1 到 n 编号.其中 1~m ...

  8. Liunx vi/vim 2

    移动光标的方法 H 光标移动到这个屏幕的最上方那一行的第一个字符 M  光标移动到这个屏幕的中央那一行的第一个字符 L 光标移动到这个屏幕的最下方那一行的第一个字符 G 移动到这个档案的最后一行(常用 ...

  9. oracle优化EXPORT和IMPORT

    使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度. ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.这个值至少要和表 ...

  10. 基于jquery读取input上传的文件内容

    <script src="/static/js/jquery.js"></script> // 前端页面实现头像预览 // 当用户选中文件之后,也就是头像的 ...