Platform总线
Platform总线实在Linux2.6内核加入的一种虚拟总线,platform机智的本身使用并不复杂,有两部分组成:
platform_device和platform_driver。
Platform驱动与传统的设备驱动模型相比,优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序使用这些资源时使用了统一的接口,这样提高了程序的可移植性。
platform 开发流程如下图所示
平台设备描述
structplatform_device {
const char *name; /*设备名*/
int id; /*设备编号,配合设备名使用*/
struct device dev;
u32 num_resources;
struct resource *resource; /*设备资源*/
}
struct Platform_device的分配使用
struct platform_device
*platform_device_alloc(const char *name, int id)、
平台设备注册
intplatform_device_add(struct platform_device *pdev)
设备资源
struct resource {
resource_size_t start; //资源的起始物理地址
resource_size_t end; //资源的结束物理地址
const char *name; //资源的名称
unsigned long flags; //资源的类型,比如MEM,IO,IRQ类型
struct resource *parent, *sibling, *child; //资源链表指针
}
获取资源
structresource *platform_get_resource(struct platform_device*dev, unsigned int type,unsigned int num)
代码示例
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <mach/regs-gpio.h>
#include <linux/interrupt.h>
#include <linux/device.h>
#include <linux/io.h>
/*平台资源的定义*/
static struct resources3c_buttons_resource[] = {
[0]={
.start= S3C24XX_PA_GPIO,
.end = S3C24XX_PA_GPIO + S3C24XX_SZ_GPIO - 1,
.flags= IORESOURCE_MEM,
},
[1]={
.start= IRQ_EINT8,
.end = IRQ_EINT8,
.flags= IORESOURCE_IRQ,
},
[2]={
.start= IRQ_EINT11,
.end = IRQ_EINT11,
.flags= IORESOURCE_IRQ,
},
[3]={
.start= IRQ_EINT13,
.end = IRQ_EINT13,
.flags= IORESOURCE_IRQ,
},
[4]={
.start= IRQ_EINT14,
.end = IRQ_EINT14,
.flags= IORESOURCE_IRQ,
},
[5]={
.start= IRQ_EINT15,
.end = IRQ_EINT15,
.flags= IORESOURCE_IRQ,
},
[6]={
.start= IRQ_EINT19,
.end = IRQ_EINT19,
.flags= IORESOURCE_IRQ,
}
};
static struct platform_device *s3c_buttons;
static int __init platform_init(void)
{
s3c_buttons = platform_device_alloc("mini2440-buttons",-1);
platform_device_add_resources(s3c_buttons,&s3c_buttons_resource,7);
/*平台设备的注册*/
platform_device_add(s3c_buttons);
}
static void __exit platform_exit(void)
{
platform_device_unregister(s3c_buttons);
}
module_init(platform_init);
module_exit(platform_exit);
MODULE_AUTHOR("David Xie");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:mini2440buttons");
平台驱动描述
structplatform_driver {
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;
}
平台驱动注册
intplatform_driver_register(struct platform_driver *)