Linux   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux 内核 设备结构嵌入大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

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

设备结构包含设备模型核心需要的来模型化系统的信息. 大部分子系统,但是,跟踪关于 它们驻留的设备的额外信息. 结果,对设备很少由空设备结构所代表; 相反,这个结构,如同 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 内核 设备结构嵌入全部内容,希望文章能够帮你解决Linux 内核 设备结构嵌入所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。