浅谈platform设备模型

来源:互联网 发布:大数据交换平台 编辑:程序博客网 时间:2024/06/05 16:49

1.platform设备模型
    从Linux2.6起引入了一套新的驱动管理和注册机制,platform_device和platform_driver,Linux中大部分的设备驱动都可以使用这套机制。platform是一条虚拟的总线。设备用platform_device表示,驱动用platform_driver进行注册,Linuxplatform driver机制和传统的devicedriver机制(通过driver_register进行注册)相比,一个明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动中使用这些资源时通过platformdevice提供的标准结构进行申请并使用。这样提高了驱动和资源的独立性,并且具有较好的可移植性和安全性(这些标准接口是安全的)。

    pltform机制本身使用并不复杂,由两部分组成:platform_device(设备)和platform_driver(驱动)。通过platform机制开发底层驱动的大致流程为:定义platform_deive-------------->注册platform_device----------->定义platform_driver------------------------>注册platform_driver。

   首先要确认的就是设备的资源信息,例如设备的地址,中断号等。

1.platform_device

    在 2.6 内核中platform 设备用结构体 platform_device 来描述,该结构体定义在kernel/include/linux/platform_device.h 中,

struct  platform_device {

 const char * name; 设备名,必须与驱动中的设备名一直

 u32 id;   id,设备id,一般为-1,如果是-1,表示同样名字的设备只有一个

 struct device dev;

 u32  num_resources;

 struct resource * resource;

dev.release =***.release, 设备从总线注销时再执行

};

 

   该结构一个重要的元素是resource,该元素存入了最为重要的设备资源信息,定义在kernel/include/linux/ioport.h 中,

struct resource {

 const char *name;//资源的名称

 unsigned long start, end;//资源起始的和结束的物理地址

 unsigned long flags;//资源的类型,比如MEM,IO,IRQ类型

 struct resource *parent, *sibling,*child;//资源链表的指针

};

该资源在内核里,当驱动和设备匹配时,内核会将该资源传给驱动~~~~

 

   注册平台设备,使用函数

int  platform_device_register(structplatform_device *pdev)  一般在加载函数里实现

    注销使用

void  platform_device_unregister(structplatform_device *pdev) 一般在卸载函数里实现

 

2)platform_driver


在平台设备驱动中获取平台设备资源使用

structresource *platform_get_resource(struct platform_device *dev,unsigned int type,unsigned int num)

该函数用于获取dev设备的第num个类型为type的资源,如果获取失败,则返回NULL。例如platform_get_resource(pdev,IORESOURCE_IRQ, 0)。

 

平台驱动描述使用

struct  latform_driver my_driver{

.driver ={

              .name ="xxx"//驱动设备的名称。

            },

.proble = ***_proble,//当设备与驱动匹配时执行(申请资源)

.release=xxx_remove,

};

   probe()函数必须验证指定设备的硬件是否真的存在,probe()可以使用设备的资源,包括时钟,platform_data等,Platformdriver可以通过下面的函数完成对驱动的注册:

int platform_driver_register(structplatform_driver*drv);一般来说设备是不能被热插拔的,所以可以将probe()函数放在init段里面来节省driver运行时候的内存开销:

int platform_driver_probe(struct platform_driver *drv, int(*probe)(structplatform_device *));

注销使用void  platform_driver_unregister(structplatform_driver *drv)。

 

 

一些小小的总结:

     当任一方卸载时,比如先执行卸载设备,函数会立即注销驱动,在执行卸载设备。

0 0
原创粉丝点击