平台设备与平台驱动的注册

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

参考资料

linux中 probe函数何时调用

platform总线的probe函数调用_Linux编程_Linux公社-Linux系统门户网站

Linux设备驱动模型之platform(平台)总线详解

Linux设备驱动模型2——总线式设备驱动组织方式_天糊土的博客-CSDN博客

简单总结

以x210/drivers/leds/leds-s3c24xx.c为例分析,得知:

(1)platform_device在系统初始化时就已经注册到系统之中。

(2)platform_driver是在驱动初始化的时候注册的,是通过platform_driver_register()来注册的,该注册函数最终会调用到platform_driver中的probe函数。

我们可将cdev有关的一系列操作(前提是字符设备的驱动开发)放到platform_driver的probe函数中去实现,这样就把cdev挂到platform bus上去了。

x210/drivers/leds/leds-s3c24xx.c内容如下。

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/gpio.h>
#include <linux/slab.h>
#include <mach/hardware.h>
#include <mach/regs-gpio.h>
#include <mach/leds-gpio.h>/* our context */struct s3c24xx_gpio_led {struct led_classdev		 cdev;struct s3c24xx_led_platdata	*pdata;
};static inline struct s3c24xx_gpio_led *pdev_to_gpio(struct platform_device *dev)
{return platform_get_drvdata(dev);
}static inline struct s3c24xx_gpio_led *to_gpio(struct led_classdev *led_cdev)
{return container_of(led_cdev, struct s3c24xx_gpio_led, cdev);
}static void s3c24xx_led_set(struct led_classdev *led_cdev,enum led_brightness value)
{struct s3c24xx_gpio_led *led = to_gpio(led_cdev);struct s3c24xx_led_platdata *pd = led->pdata;/* there will be a short delay between setting the output and* going from output to input when using tristate. */s3c2410_gpio_setpin(pd->gpio, (value ? 1 : 0) ^(pd->flags & S3C24XX_LEDF_ACTLOW));if (pd->flags & S3C24XX_LEDF_TRISTATE)s3c2410_gpio_cfgpin(pd->gpio,value ? S3C2410_GPIO_OUTPUT : S3C2410_GPIO_INPUT);}static int s3c24xx_led_remove(struct platform_device *dev)
{struct s3c24xx_gpio_led *led = pdev_to_gpio(dev);led_classdev_unregister(&led->cdev);kfree(led);return 0;
}static int s3c24xx_led_probe(struct platform_device *dev)
{struct s3c24xx_led_platdata *pdata = dev->dev.platform_data;struct s3c24xx_gpio_led *led;      //设备的信息,在这里传给驱动int ret;led = kzalloc(sizeof(struct s3c24xx_gpio_led), GFP_KERNEL);if (led == NULL) {dev_err(&dev->dev, "No memory for device\n");return -ENOMEM;}platform_set_drvdata(dev, led);led->cdev.brightness_set = s3c24xx_led_set;led->cdev.default_trigger = pdata->def_trigger;led->cdev.name = pdata->name;led->cdev.flags |= LED_CORE_SUSPENDRESUME;led->pdata = pdata;    //以上是填充结构体/* no point in having a pull-up if we are always driving *///根据传过来的数据,对设备进行一些初始化和设置if (pdata->flags & S3C24XX_LEDF_TRISTATE) {s3c2410_gpio_setpin(pdata->gpio, 0);s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_INPUT);} else {s3c2410_gpio_pullup(pdata->gpio, 0);s3c2410_gpio_setpin(pdata->gpio, 0);s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_OUTPUT);}/* register our new led device */ret = led_classdev_register(&dev->dev, &led->cdev);if (ret < 0) {dev_err(&dev->dev, "led_classdev_register failed\n");kfree(led);return ret;}return 0;
}static struct platform_driver s3c24xx_led_driver = {.probe		= s3c24xx_led_probe,.remove		= s3c24xx_led_remove,.driver		= {.name		= "s3c24xx_led",.owner		= THIS_MODULE,},
};static int __init s3c24xx_led_init(void)
{return platform_driver_register(&s3c24xx_led_driver);
}static void __exit s3c24xx_led_exit(void)
{platform_driver_unregister(&s3c24xx_led_driver);
}module_init(s3c24xx_led_init);
module_exit(s3c24xx_led_exit);MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
MODULE_DESCRIPTION("S3C24XX LED driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:s3c24xx_led");

1、platform_device的注册过程

(1)系统初始化时调用platform_add_devices函数,把所有放置在板级platform_device数组中的platform_device注册到系统中去。

  • 此函数循环调用platform_device_register函数,来注册每个platform_device。
  • 而platform_device_register中会调用platform_device_add函数。

(2)platform_device全部注册到系统之后,驱动模块insmod到系统时,驱动代码便可以通过platform的操作接口(见下),来获取platform_device中的resource资源(见下)。

  • 比如plarform_driver_register这个函数会引用platform_driver中的probe函数。probe函数通过get_resource来获取寄存器物理基地址,然后ioremap到kernel的虚拟空间来,这样驱动就可以正式操纵和修改设备的寄存器,从而进行cdev的初始化及cdev_add的操作。
  • platform的操作接口,包括platform_get_irq、platform_get_irq_byname、platform_get_resource、platform_get_resource_byname等。
  • platform_device中的resource资源,包括寄存器地址、中断号等,以进行request_memregion、ioremap(将resource分配的物理地址映射到kernel的虚拟空间来)和request_irq操作。

2、platform_driver的注册过程

平台驱动注册的调用关系如下。

|----------platform_driver_register()

|---------------driver_register()

|-------------------bus_add_driver()

|----------------------driver_attach()

|--------------------------bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);

其中bus_for_each_dev()函数对每个挂在虚拟的platform bus的设备作__driver_attach()。

|----------__driver_attach()

|-------------driver_match_device

|-------------driver_probe_device()

|---------------drv->bus

|-----------------match()==platform_match()-& gt

比较strncmp(pdev->name, drv->name, BUS_ID_SIZE),如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK源码 - BitSet的实现

java.util.BitSet是个很有趣的类&#xff0c;了解其内部实现对正确的使用非常重要。 对象构造&#xff1a; Java代码 private final static int ADDRESS_BITS_PER_WORD 6; private final static int BITS_PER_WORD 1 << ADDRESS_BITS_PER_WORD; private long[] wor…

细粒度权限控制 linux,利用docker插件实现细粒度权限控制

前言我们在实际的docker运行环境下&#xff0c;大都会遇到多用户的情况&#xff0c;为了安全起见&#xff0c;有些用户我们不想给予其全面的docker控制权限&#xff0c;比如不想某些用户执行docker stop 以及docker rm 等危险指令&#xff0c;当然我们可以从系统账号权限来控制…

linux查找命令、find、grep总结

find 命令 语法&#xff1a;find 搜索路径 匹配表达式 功能&#xff1a;该命令用于在指定路径中查找符合条件的文件&#xff0c;搜索路径可以是多个目录&#xff0c;不同目录之间以空格分隔 &#xff08;1&#xff09;匹配表达式1 -name filename&#xff1a;要查找的文件…

Sharepoint学习笔记—ECM系列--根据位置设置的默认元数据值(Location-Based Metadata Defaults)...

如果有这样一个需求&#xff1a;客户在一个SharePoint 2010的站点的document library中创建了不同的文件夹FolderA和FolderB&#xff0c;对于上传到此文件夹的文件记录中有某一个列ColumnM,现在他实现当上传文件到不同的文件夹FolderA或FolderB时&#xff0c;列ColumnM使用不同…

linux上安装fio教程,fio工具安装及使用

fio是一种I / O工具&#xff0c;用于基准测试和压力/硬件验证。它支持19种不同类型的I / O引擎(sync&#xff0c;mmap&#xff0c;libaio&#xff0c;posixaio&#xff0c;SG v3&#xff0c;splice&#xff0c;null&#xff0c;network&#xff0c;syslet&#xff0c;guasi&…

Maven的学习资料收集--(九) 构建SSH项目以及专栏maven

在这里整合一下&#xff0c;使用Maven构建一个SSH项目 1.新建一个Web项目 可以参照前面的博客 2.添加依赖&#xff0c;修改pom.xml [html] view plaincopy <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

博客园的CSRF

CSRF全称 Cross Site Request Forgery&#xff0c;跨站请求伪造。通俗理解&#xff1a;攻击者盗用当前用户身份&#xff0c;发请当前用户的恶意请求&#xff1a;如邮件&#xff0c;银行转账等。 CSRF原理 CSRF过程 登录网站A&#xff0c;生成本地Cookie信息&#xff1b;登录危…

linux 设备驱动总结,linux设备驱动归纳总结.doc

linux设备驱动归纳总结linux设备驱动归纳总结内核&#xff1a;用于管理软硬件资源&#xff0c;并提供运行环境。如分配4G虚拟空间等。 linux设备驱动&#xff1a;是连接硬件和内核之间的桥梁。linux系统按个人理解可按下划分&#xff1a;应用层&#xff1a;包括POSIX接口&#…

开发板——在X210开发板上进行裸机开发的细节

以下内容是学习裸机开发过程中的一些细节内容的记录。 1、汇编语言函数细节 用汇编写的函数&#xff0c;末尾应该添加mov pc,lr语句。 2、裸机代码相关文件 3、关于链接地址 4、关于重定位的理解 &#xff08;1&#xff09;在sram内部重定位 这是在sram内部重定位&#xff0c;因…

linux报网络设备繁忙,【分享】linux常用命令

压缩与备份:bzip2/bunzip2 .bz2文件的压缩/解压缩程序cpio 备份文件dump 备份文件系统gzip/gunzip .gz文件的压缩/解压缩程序gzexe 压缩可执行文件restore 还原由倾倒(Dump)操作所备份下来的文件或整个文件系统(一个分区)tar 将若干文件存档或读取存档文件unarj 解压缩.…

HDU-4454 Stealing a Cake 三分枚举

题意&#xff1a;给定一个点&#xff0c;一个圆&#xff0c;以及一个矩形&#xff0c;现在问从一个点到一个圆再到一个矩形的最短距离为多少&#xff1f;到达一个目标可以只挨着或者穿过它。 解法&#xff1a;目前只知道从一个点到圆上按照[0,PI]&#xff0c;[PI,2*PI]的两个半…

VIP - virtual IP address

virtual IP address (虚拟 IP 地址)1、是集群的ip地址&#xff0c;一个vip对应多个机器2、与群集关联的唯一 IP 地址see wiki&#xff1a; A virtual IP address (VIP or VIPA) is an IP address assigned to multiple applications residing on a single server, multiple dom…

linux上perl怎么传输参数,如何在perl子函数中传递参数?

慕村225694Perl 可以通过函数元型在编译期进行有限的参数类型检验。如果你声明sub mypush ()那么 mypush() 对参数的处理就同内置的 push() 完全一样了。函数声明必须要在编译相应函数调用之前告知编译器(编译器在编译函数调用时会对相应函数用 prototype来查询它的元型来进行参…

Android中级之网络数据解析一之Json解析

本文来自http://blog.csdn.net/liuxian13183/ &#xff0c;引用必须注明出处&#xff01; 在网络传输的时候&#xff0c;经常用到的解析方式有xml和json两种&#xff0c;今天我们主要来说下json、解析&#xff0c;以及其要点。 首先json格式&#xff1a; “[”标识json解析开始…

Struts2中ValueStack结构和总结

【ValueStack和ActionContext的关系】首先&#xff0c;从结构上来看ValueStack是ActionContext的一个组成部分&#xff0c;是对ActionContext功能的扩展。ActionContext是一个容器结构&#xff0c;是Struts2中用于数据存储的的场所&#xff0c;而ValueStack则是一个具备表达式引…

将USB-WiFi网卡移植到X210开发板

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、移植前的准备工作 1、搭建开发环境 &#xff08;1&#xff09;虚拟机运行着ubuntu14.04系统。 &#xff08;2&#xff09;X210开发板运行着linux内核镜像、QT4.8文件系统镜像。相关的镜像文件在…

文件读取ini文件另一种读取办法

时间紧张&#xff0c;先记一笔&#xff0c;后续优化与完善。 Windows下的ini文件的读取可以应用系统提供的api来实现 GetPrivateProfileString GetPrivateProfileInt ... 现实应用中, 如果不应用一种同一的方法来包装一下会让源代码看起来很乱。 所以,须要计划一个便利&#xf…

浅谈mysql数据库引擎

2019独角兽企业重金招聘Python工程师标准>>> 数据库是数据的集合&#xff0c;计算机中的数据库是存储器上一些文件的集合或者是内存数据的集合。Mysql,SQL server数据库都是可以存储数据&#xff0c;并提供数据查询&#xff0c;更新功能的数据库管理系统。Mysql数据…