Linux驱动的platform机制

转载 2012年03月26日 10:42:37

——汗死我了。我看的资料是老的,看到现在S5PV210的驱动都是platform机制的,但是书记却是什么open,啥的,搞得S5PV210 的触摸屏驱动,wifi驱动,搞得我模模糊糊,怎么搞的呢,晕死了。原来是linux内核 增加了这种东西。!看到下面的文章偶在觉悟。


最近研究了一下Linux驱动的platform机制。

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

 

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 接轨。

linux架构下platform总线详解

学习驱动一定要掌握驱动的模型,platform总线在内核中用的非常频繁,还有一个是Input输入子系统,platform总线的好处是,inux从2.6起就加入了一套新的驱动管理和注册的机制platfo...
  • qq_21792169
  • qq_21792169
  • 2015年09月26日 12:16
  • 4968

Linux 设备驱动开发 —— platform设备驱动应用实例解析

前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 —— platform 设备驱动 ,下面将通过一个实例来深入我们的学习。         一、platform 驱动的工作过程...
  • zqixiao_09
  • zqixiao_09
  • 2016年03月14日 19:27
  • 12432

USB主机控制器驱动——OHCI分析

首先,整个驱动框架的开始,是基于 platform 平台总线的。 struct platform_device s3c_device_usb = { .name = "s3c2410-ohci...
  • lizuobin2
  • lizuobin2
  • 2016年07月18日 22:34
  • 4362

Linux驱动的platform机制

一、Platform概述     从Linux2.6起,内核引入了一套新的驱动管理和注册机制:Platform_device和 Platform_driver。现在Linux中大部分的设备驱动都可...
  • long_zhimeng
  • long_zhimeng
  • 2015年05月31日 11:36
  • 453

基于S3C2440的嵌入式Linux驱动——DS18B20温度传感器(添加使用platform总线机制)

此代码为本人原创。该代码仍有不完善之处,有可能还要再次修改!仅供参考! 若有错误、疑问和意见请留言,非常感谢! 该驱动程序基于TQ2440开发板,内核2.6.30。 驱动程序比较简单...
  • qq617463359
  • qq617463359
  • 2013年04月03日 14:11
  • 397

Linux驱动的platform机制

Linux驱动的platform机制     最近在看SPI、I2C这样简单点的总线驱动程序,从Linux2.6起,内核引入了一套新的驱动管理和注册机制:Platform...
  • sanmaoljh
  • sanmaoljh
  • 2014年08月02日 21:56
  • 421

Android下led控制(下)--Linux驱动部分--platform机制

这个主要是分析了驱动的platform机制,应用程序接口,驱动注册等
  • dingfengen
  • dingfengen
  • 2016年07月04日 17:26
  • 2592

Linux驱动的platform机制

最近在看SPI、I2C这样简单点的总线驱动程序,从Linux2.6起,内核引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。现在Linux中大部分的设备...
  • JuanA1
  • JuanA1
  • 2011年11月10日 22:56
  • 5000

linux驱动模型开发——linux platform总线机制讲解与实例开发

通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C、IIS、RTC、看门狗等)都被当作平台设备来处理。 从Linux2.6起,引入了一套新的驱动管理和注册机制:Platform_d...
  • zjy900507
  • zjy900507
  • 2017年04月06日 14:02
  • 84

linux驱动模型开发——linux platform总线机制讲解与实例开发

http://blog.csdn.net/xiaochongtou123/article/details/7752328 1、概述: 通常在Linux中,把SoC系统中集成的独立外设单元(...
  • ruanjianruanjianruan
  • ruanjianruanjianruan
  • 2015年08月14日 06:25
  • 225
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动的platform机制
举报原因:
原因补充:

(最多只允许输入30个字)