华清远见与您共享:Linux驱动中的platform

news/2025/2/22 16:55:22

 作者:李智敏,华清远见嵌入式学院上海中心讲师。

从Linux2.6内核起,引入一套新的驱动管理和注册机制:platform_device 和 platform_driver 。Linux 中大部分的设备驱动,都可以使用这套机制,设备用 platform_device 表示;驱动用 platform_driver 进行注册。

Linux platform driver 机制和传统的device driver机制(即:通过 driver_register 函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中用使用这些资源时,通过platform device提供的标准接口进行申请并使用。

platform 是一个虚拟的地址总线,相比 PCI、USB,它主要用于描述SOC上的片上资源。platform 所描述的资源有一个共同点:在CPU 的总线上直接取址。平台设备会分到一个名称(用在驱动绑定中)以及一系列诸如地址和中断请求号(IRQ)之类的资源。

platform 总线下驱动的开发步骤是:

1、 设备

需要实现的结构体是:platform_device 。

1)初始化 resource 结构变量
         2)初始化 platform_device 结构变量
         3)向系统注册设备:platform_device_register。

以上三步,必须在设备驱动加载前完成,即执行platform_driver_register()之前,原因是驱动注册时需要匹配内核中所有已注册的设备名。platform_driver_register()中添加device到内核最终还是调用的device_add函数。Platform_device_add和device_add最主要的区别是多了一步insert_resource(p, r),即将platform资源(resource)添加进内核,由内核统一管理。

2、驱动

驱动注册中,需要实现的结构体是:platform_driver 。

在驱动程序的初始化函数中,调用了platform_driver_register()注册 platform_driver 。需要注意的是:platform_driver 和 platform_device 中的 name 变量的值必须是相同的 。这样在 platform_driver_register() 注册时,会将当前注册的 platform_driver 中的 name 变量的值和已注册的所有 platform_device 中的 name 变量的值进行比较,只有找到具有相同名称的 platform_device 才能注册成功。当注册成功时,会调用 platform_driver 结构元素 probe 函数指针。

platform_driver_register()的注册过程:

1.platform_driver_register(&s3c2410fb_driver)
         2.driver_register(&drv->driver)
         3.bus_add_driver(drv)
         4.driver_attach(drv)
         5.bus_for_each_dev(drv->bus, NULL, drv, __driver_attach)
         6.__driver_attach(struct device * dev, void * data)
         7.driver_probe_device(drv, dev)
         8.really_probe(dev, drv)

在really_probe()中:为设备指派管理该设备的驱动:dev->driver = drv, 调用probe()函数初始化设备:drv->probe(dev)。

来源:http://tieba.baidu.com/p/1008102666


http://www.niftyadmin.cn/n/1736481.html

相关文章

MTK的lcm背光流程和客制化

在梳理代码时,感觉 MTK 的代码中公共部分和客制化部分分的还是很清楚的。 首先说明一下文档的结构,我们先介绍我们客制化的地方,因为这个才是我们实际调试及解决 bug 时真正要关心的,而平台端不需要客制化的代码只需要梳理清楚就…

IS_ERR()的使用与说明

感谢fudan_abc的分享,本篇文章选自他的《Linux那些事儿之我是Hub(3)一样的精灵不一样的API》 转贴地址:http://blog.csdn.net/fudan_abc/archive/2007/08/09/1734839.aspx 人的无聊,有时候很难用语言表达.以下关于IS_ERR的文字仅献给无聊的你.如果你对内…

开机logo

开机动画严格意义上可以分为三个步骤: 1.开机第一屏 2.开机第二屏 3.开机动画 Boot logo: 1. 开机显示的顺序如下: boot logo(开机第一屏) (logo.bin 中) Kernel logo(开机…

自旋锁(spinlock) 解释得经典,透彻

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。 由于自旋锁使用者一般保持锁时间非常…

MTK Android 关机状态下充电器接入检测

关机时充电器检测代码在lk部分,当接入充电器时,PMIC会通过ADC采样,检测Vchrg(charger/usb电源)电压,判断Vchrg的值如果在这个区间:4.4v~6.5v,系统就会开始进入充电过程,这…

s3c2440的dma操作的一般步骤

一般的,在s3c2440中,要想进行dma传输,需要一下七个步骤: 一: int s3c2410_dma_request(unsigned int channel, struct s3c2410_dma_client *client, void *dev); s3c2410_dma_client的定义为: struct …

init函数详解

1.主要功能,红色部分是android特有的一些功能,如fastboot,recovery模式等:* Variety of nand devices for bootup* USB driver to enable upgrading images over usb during development* Keypad driver to enable developers enter ‘fastbo…

嵌入式软件工程师面试题

嵌入式软件工程师面试题 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: …