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

概述

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

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

 

struct ldd_driver { char *version;

struct module *module; struct device_driver driver;

struct driver_attribute version_attr;

};

#define to_ldd_driver(drv) container_of(drv,struct ldd_driver,driver);

 

这里,我们要求每个驱动提供特定当前软件版本,并且 lddbus 输出这个版本字串为它知 道的每个驱动. 总线特定的驱动注册函数是:

 

int register_ldd_driver(struct ldd_driver *driver)

{

 

int ret;

driver->driver.bus = &ldd_bus_type;

ret = driver_register(&driver->driver); if (ret)

return ret;

driver->version_attr.attr.name = "version"; driver->version_attr.attr.owner = driver->module; driver->version_attr.attr.mode = S_IRUGO;

driver->version_attr.show = show_version; driver->version_attr.store = NULL;

return driver_create_file(&driver->driver,&driver->version_attr);

}

 

这个函数的第一部分只注册低级的 device_driver 结构到核心; 剩下的建立版本属性. 因为这个属性在运行时被创建,我们不能使用 DRIVER_ATTR 宏; 反之,

 

driver_attribute 结构必须手工填充. 注意我们设定属性的拥有者为驱动模块,不是 lddbus 模块; 这样做的理由是可以在为这个属性的 show 函数的实现中见到:

 

static ssize_t show_version(struct device_driver *driver,char *buf)

{

struct ldd_driver *ldriver = to_ldd_driver(driver); sprintf(buf,"%s\n",ldriver->version);

return strlen(buf);

}

 

有人可能认为属性拥有者应当是 lddbus 模块,因为实现这个属性函数在那里定义. 这 个函数,但是,是使用驱动自身所创建的 ldd_driver 结构. 如果那个结构在一个用户空 间进程试图读取版本号时要消失,事情会变得麻烦. 指定驱动模块作为属性的拥有者阻止 了模块被卸载,在用户空间保持属性文件打开时. 因为每个驱动模块创建一个对 lddbus 模块的引用,我们能确信 lddbus 不会在一个不合适的时间被卸载.

 

为完整起见,sculld 创建它的 ldd_driver 结构如下:

 

static struct ldd_driver sculld_driver = { .version = "$Revision: 1.1

$",.module = THIS_MODULE,.driver = { .name = "sculld",},};

 

一个简单的对 register_ldd_driver 的调用添加它到系统中. 一旦完成初始化,驱动信 息可在 sysfs 中见到:

 

$ tree /sys/bus/ldd/drivers

/sys/bus/ldd/drivers

`-- sculld

|-- sculld0 -> ../../../../devices/ldd0/sculld0

|-- sculld1 -> ../../../../devices/ldd0/sculld1

|-- sculld2 -> ../../../../devices/ldd0/sculld2

|-- sculld3 -> ../../../../devices/ldd0/sculld3

 

[46] 这个总线的逻辑名子,当然,应当是"sbus",但是这个名子已经被一个真实的,物理总 线采用.

大佬总结

以上是大佬教程为你收集整理的Linux 内核驱动结构嵌入全部内容,希望文章能够帮你解决Linux 内核驱动结构嵌入所遇到的程序开发问题。

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

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