linux platform机制的好处_xw面朝大海的博客-程序员秘密

技术标签: linux  

从Linux2.6起,引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform_driver进行注册。platform是一个虚拟的地址总线,相比pci,usb,它主要用于描述SOC上的片上资源,比如s3c2440上集成的控制器(lcd,watchdog,rtc等), platform所描述的资源有一个共同点,就是在cpu的总线上直接取址。平台设备会分到一个名称(用在驱动绑定中)以及一系列诸如地址和中断请求号(IRQ)之类的资源。

 

Linux platform driver机制和传统的device_driver机制相比,一个十分明显的优势在于platform机制将本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性。

 

和传统的驱动一样,platform机制也分为三个步骤:

  

1 总线注册阶段:

内核启动初始化时的main.c文件中的kernel_init()-->do_basic_setup()-->driver_init()-->platform_bus_init()-->bus_register(&platform_bus_type),注册了一条platform总线(虚拟总线)。

 

2 添加设备时:

设备注册的时候Platform_device_register()-->platform_device_add()-->(pdev->dev.bus = &platform_bus_type)->device_add(),就这样把设备给挂到虚拟的总线上。

 

3 驱动注册时:

    Platform_driver_register()-->driver_register()-->bus_add_driver()-->driver_attach()-->bus_for_each_dev(), 对在每个挂在虚拟的platform bus的设备作__driver_attach()--> driver_probe_device(),判断drvàbusàmatch()是否执行成功,此时通过指针执行platform_match--> strncmp(pdev->name , drv->name , BUS_ID_SIZE),如果相符就调用really_probe(实际就是执行相应设备的platform_driver->probe(platform_device)。)开始真正的探测,如果probe成功,则绑定设备到该驱动。

 

    从上面可以看出,platform机制最后还是调用了bus_register() , device_add() , driver_register()这三个关键的函数。

下面看几个结构体:

struct platform_device           (/include/linux/Platform_device.h)

{

       const char   * name;

       int          id;

       struct device     dev;

       u32        num_resources;

       struct resource * resource;

};

    Platform_device结构体描述了一个platform结构的设备,在其中包含了一般设备的结构体struct device      dev;设备的资源结构体struct resource    * resource;还有设备的名字const char     * name。(注意,这个名字一定要和后面platform_driver.driver àname相同,原因会在后面说明。)

 

该结构体中最重要的就是resource结构,这也是之所以引入platform机制的原因。

struct resource                            ( /include/linux/ioport.h)

{

       resource_size_t start;

       resource_size_t end;

       const char *name;

       unsigned long flags;

       struct resource *parent, *sibling, *child;

};

    其中 flags位表示该资源的类型,start和end分别表示该资源的起始地址和结束地址

 

struct platform_driver                  (/include/linux/Platform_device.h)

{

       int (*probe)(struct platform_device *);

       int (*remove)(struct platform_device *);

       void (*shutdown)(struct platform_device *);

       int (*suspend)(struct platform_device *, pm_message_t state);

       int (*suspend_late)(struct platform_device *, pm_message_t state);

       int (*resume_early)(struct platform_device *);

       int (*resume)(struct platform_device *);

       struct device_driver driver;

};

Platform_driver结构体描述了一个platform结构的驱动。其中除了一些函数指针外,还有一个一般驱动的device_driver结构。

 

 

 

名字要一致的原因:

上面说的驱动在注册的时候会调用函数bus_for_each_dev(), 对在每个挂在虚拟的platform bus的设备作__driver_attach() à driver_probe_device(),在此函数中会对dev和drv做初步的匹配,调用的是drv->bus->match所指向的函数。platform_driver_register函数中drv->driver.bus = &platform_bus_type,所以drv->bus->match就为platform_bus_typeàmatch,为platform_match函数,该函数如下:

static int platform_match(struct device * dev, struct device_driver * drv)

{

       struct platform_device *pdev = container_of(dev, struct platform_device, dev);

 

       return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);

}

是比较dev和drv的name,相同则会进入really_probe()函数,从而进入自己写的probe函数做进一步的匹配。所以devàname和driveràdrvàname在初始化时一定要填一样的。

 

不同类型的驱动,其match函数是不一样的,这个platform的驱动,比较的是dev和drv的名字,还记得usb类驱动里的match吗?它比较的是Product ID和Vendor ID。

 

 

个人总结Platform机制的好处:

 

1 提供platform_bus_type类型的总线,把那些不是总线型的soc设备都添加到这条虚拟总线上。使得,总线——设备——驱动 的模式可以得到普及。

 

2 提供platform_device和platform_driver类型的数据结构,将传统的device和driver数据结构嵌入其中,并且加入resource成员,以便于和Open Firmware这种动态传递设备资源的新型bootloader和kernel 接轨。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013952558/article/details/50436525

智能推荐

Python爬虫自学系列(二)_看,未来的博客-程序员秘密

今天我们来从获取到的网页数据中抓取我们想要的数据。(注:这一篇里面很多东西都已经是讲过的了,所以本篇基本上是链接了,也不会很长的)

python实现100以内数求和_千与千寻.i的博客-程序员秘密

s1=0for i in range(1,101): s1+=iprint(s1)输出截图如下:

【OpenGL编程】虚化模糊场景(类似摄像机的人像效果)_尹豆(douysu)的博客-程序员秘密

说在开头最近研究了一个基于高斯函数的模糊效果的Demo,主要是为了完成场景的虚化效果,也就是距离摄像机较近的地方比较清楚,距离较远的地方比较模糊。整个案例的代码都可以在我的github上找到https://github.com/ModestBean/MyBlur如果感到对您有帮助还请点一个star。当然我这里使用的开发环境时Java和SDK(因为这是我一个早期开发的案例,当时还没有接触C++)...

软件工程|如何写设计文档_yxhuangCH的博客-程序员秘密_软件工程设计文档

文章目录1. 文档的大体内容1.1 现状1.2 需求1.3 需求满足方式1.3.1 交付物规格1.3.2 实现原理1.3.3 使用界面(接口)1.4 多个设计方案对比2.参考这是极客时间《许式伟的结构课》中的 <70|怎样写设计文档> 的笔记产品经理和架构师是一体两面,对人的能力要求比较像,但是分工不同,关注的维度不一样产品经理关注的维度,关键词是:用户需求、技术赋能、商业成功架构师的关注维度是,关键词是:用户需求、技术实现、业务迭代设计是软件工程中的头等大事,我们应该在这里“多浪费点

【python】将字符串转换为double_JustNow_Man的博客-程序员秘密_python str转double

通过十进制转换函数from decimal import Decimalx = 123.456y = Decimal(x)print(y)通过float()函数转换x = 123.456y = float(x)print(y)_1671465600

新手程序员,买一台个人服务器究竟都能做哪些事呢?_西魏陶渊明的博客-程序员秘密_个人服务器能干什么

做为一名程序猿多多少少每天都在跟服务器打交道,尤其是后端的小伙伴,那么你是否也有这样的想法呢 ?1. 个人服务器究竟能做什么?2. 购买一套服务器,你需要什么知识储备?3. 如何花最少的钱,买最好的服务呢?...

随便推点

iOS中的ARC---ARC规则_Mcy小纯纯的博客-程序员秘密_arc和非arc时变量的写法 ios

本文参考:《objective-c高级编程》一、什么是ARC简单来归纳: ①ARC的本质也是引用计数在管理内存,ARC只是自动帮助处理引用计数。 ②引用计数的机制就是如果没有强引用指向对象,对象就会被释放。 ③ARC中所有权的修饰符包括:__strong、__weak、__unsafe_unretained、__autoreleasing二、使用ARC①使用clang(

深入解析构建 Kotlin 项目实践_「已注销」的博客-程序员秘密

编者按:今年的 Google I/O 大会上,Google 宣布 Kotlin 成为 Android 开发的官方语言,一时之间,究竟使用 Java 还是 Kotlin 开发,也成为众多开发者热议的话题。近日,Android 大神 Jake Wharton 发推文称已入职 Google,正式加入 Google 的 Android 框架团队,从事 Kotlin 方面的工作。这无疑为 Google...

【Js】: 数组对象:在Javascript中如何查找对象数组中的值?_Jack_Kuo的博客-程序员秘密

问题:我有一个未命名的对象数组,其中包含一个命名对象的数组,我需要获取“名称”是“字符串1”的对象。这是一个示例数组。var array = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" }];方法1.let arr =...

如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?_qk61508的博客-程序员秘密

转自《知乎》如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文? 问题: 作为一个博士生,一直为写论文头疼,读过很多高质量论文,觉得写的真好,但是轮到自己写总是力不从心。 最讨厌的是活生生的把一个A级别的idea写成C质量的论文…..在这里的高质量限于IEEE/ACM Tr...

MIT6.828学习之Lab4: Preemptive Multitasking_请叫宝宝荡哥的博客-程序员秘密_6.828 lab4

在这个lab中,你会在多个同时active的用户模式环境中实现preemptive multitasking(抢占多任务处理)在Part A,你会向JOS加入multiprocessor support(多处理器支持),实现round-robin scheduling(轮转调度),并且添加基础的environment management system calls(这个调用能创建和destroy...

推荐文章

热门文章

相关标签