Linux内核中的platform机制

Linux内核中的platform机制

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

Linuxplatformdriver机制和传统的devicedriver机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platformdevice提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。platform机制的本身使用并不复杂,由两部分组成:platform_device和platfrom_driver。通过platform机制开发底层设备驱动的大致流程如图所示。


图p
latform机制开发驱动流程

platform_device结构体用来描述设备的名称、资源信息等。该结构被定义在include/linux/platform_device.h中,定义原型如下:

structplatform_device{

constchar *name;//定义平台设备的名称

int id;

structdevice dev;

u32 num_resources;

structresource *resource;//定义平台设备的资源。

};

下面来看一下platform_device结构体中最重要的一个成员structresource *resourcestructresource被定义在include/linux/ioport.h中,定义原型如下:

structresource{

resource_size_tstart;//定义资源的起始地址

resource_size_tend;//定义资源的结束地址

constchar*name;//定义资源的名称

unsignedlongflags;//定义资源的类型,比如MEM,IO,IRQ,DMA类型

structresource*parent,*sibling,*child;//资源链表指针

};

通过调用函数platform_add_devices()向系统中添加该设备了,该函数内部调用platform_device_register()进行设备注册。要注意的是,这里的platform_device设备的注册过程必须在相应设备驱动加载之前被调用,即执行platform_driver_register()之前原因是驱动注册时需要匹配内核中所有已注册的设备名。

接下来来看platform_driver结构体的原型定义,在include/linux/platform_device.h中,代码如下:

structplatform_driver{

int(*probe)(structplatform_device*);

int(*remove)(structplatform_device*);

void(*shutdown)(structplatform_device*);

int(*suspend)(structplatform_device*,pm_message_tstate);

int(*suspend_late)(structplatform_device*,pm_message_tstate);

int(*resume_early)(structplatform_device*);

int(*resume)(structplatform_device*);

structdevice_driverdriver;

};

内核提供的platform_driver结构体的注册函数为platform_driver_register(),其原型定义在driver/base/platform.c文件中,具体实现代码如下:

intplatform_driver_register(structplatform_driver*drv)

{

drv->driver.bus=&platform_bus_type;

if(drv->probe)

drv->driver.probe=platform_drv_probe;

if(drv->remove)

drv->driver.remove=platform_drv_remove;

if(drv->shutdown)

drv->driver.shutdown=platform_drv_shutdown;

if(drv->suspend)

drv->driver.suspend=platform_drv_suspend;

if(drv->resume)

drv->driver.resume=platform_drv_resume;

returndriver_register(&drv->driver);

}

总结,通常情况下只要和内核本身运行依赖性不大的外围设备,相对独立的,拥有各自独自的资源(地址总线和IRQs),都可以用platform_driver实现。如:LCD,网卡、USB、UART等,都可以用platfrom_driver写,而timer,irq等小系统之内的设备则最好不用platfrom_driver机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值