platform总线是一种虚拟总线。
有platform_device和platform_driver组成。
platform驱动与传统的设备驱动模型相比,
优势在于platform机制将设备本身的资源注册进内核,
由内核统一管理,在驱动程序使用这些资源时使用统一的接口,
这样提高了程序的可移植性。
通过platform机制开发底层设备驱动的流程:
1.定义platform_device
2.注册platform_device
3.定义platform_driver
4.注册platform_driver
平台设备结构体:
#include <linux/platform_device.h>
struct platform_device {
const char * name; //设备名字
int id; //设备编号,配合设备名使用
struct device dev;
u32 num_resources;
struct resource * resource; //设备资源
......
};
设备资源结构体:
struct resource {
resource_size_t start; //资源的起始物理地址
resource_size_t end; //资源的结束物理地址
const char *name; //资源名字
unsigned long flags; //资源类型,如MEM,IO见<linux/ioport.h>
struct resource *parent, *sibling, *child;
};
分配:
struct platform_device *platform_device_alloc(const char *name, int id);
注册:
int platform_device_add(struct platform_device *pdev);
int platform_device_register(struct platform_device *);
注销:
void platform_device_unregister(struct platform_device *);
平台驱动结构体:
struct platform_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 (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
};
有platform_device和platform_driver组成。
platform驱动与传统的设备驱动模型相比,
优势在于platform机制将设备本身的资源注册进内核,
由内核统一管理,在驱动程序使用这些资源时使用统一的接口,
这样提高了程序的可移植性。
通过platform机制开发底层设备驱动的流程:
1.定义platform_device
2.注册platform_device
3.定义platform_driver
4.注册platform_driver
平台设备结构体:
#include <linux/platform_device.h>
struct platform_device {
const char * name; //设备名字
int id; //设备编号,配合设备名使用
struct device dev;
u32 num_resources;
struct resource * resource; //设备资源
......
};
设备资源结构体:
struct resource {
resource_size_t start; //资源的起始物理地址
resource_size_t end; //资源的结束物理地址
const char *name; //资源名字
unsigned long flags; //资源类型,如MEM,IO见<linux/ioport.h>
struct resource *parent, *sibling, *child;
};
分配:
struct platform_device *platform_device_alloc(const char *name, int id);
注册:
int platform_device_add(struct platform_device *pdev);
int platform_device_register(struct platform_device *);
注销:
void platform_device_unregister(struct platform_device *);
平台驱动结构体:
struct platform_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 (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
};