Platform 相关文件
相关文件 | 作用 | 举例提供的函数,结构 |
---|---|---|
include/linux/platform_device.h | 定义 struct platform_device; struct platform_device_info; struct platform_driver; 声明注册,卸载等函数。 | int platform_device_register ( struct platform_device * ); void platform_device_unregister ( struct platform_device * ); |
drivers/base/platform.c | 定义platform_device的操作函数,注册,卸载,匹配等函数原型。 | static int platform_drv_probe(struct device *_dev); static int platform_match(struct device *dev, struct device_driver *drv); |
Platform 相关结构体
struct platform_device {
const char *name;
int id;
bool id_auto;
struct device dev;
u32 num_resources; //num!!! 统计资源数量
struct resource *resource;
const struct platform_device_id *id_entry;
char *driver_override; /* Driver name to force a match */
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
//函数指针,抽象相关功能,参数均为平台设备, 驱动操作设备
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;
bool prevent_deferred_probe;
};
struct platform_device_info {
struct device *parent;
struct fwnode_handle *fwnode;
const char *name;
int id;
const struct resource *res;
unsigned int num_res;
const void *data;
size_t size_data;
u64 dma_mask;
struct property_entry *properties;
};
重要函数
作用 | 函数 |
---|---|
注册/卸载驱动 | void platform_driver_register/unregister(struct platform_driver *); |
注册/卸载设备 | int platform_device_register/unregister(struct platform_device *); |
批量注册设备 | int platform_add_devices(struct platform_device **, int); |
获取平台资源 | struct resource *platform_get_resource(struct platform_device *,unsigned int, unsigned int); |
获取中断 | int platform_get_irq(struct platform_device *, unsigned int); |
set drv data | static inline void platform_set_drvdata(struct platform_device *pdev, void *data) |
驱动与设备匹配 | static int platform_match(struct device *dev, struct device_driver *drv) |
driver
static struct platform_driver led_driver = {
.driver.name = "omap_dbg_led",
.driver.pm = &fpga_dev_pm_ops,
.probe = fpga_probe,
};
static int __init fpga_init(void)
{
if (machine_is_omap_h4()
|| machine_is_omap_h3()
|| machine_is_omap_h2()
|| machine_is_omap_perseus2()
)
return platform_driver_register(&led_driver);
return 0;
}
device
static struct platform_device smsc_lan9217_device = {
.name = "smsc911x",
.id = -1,
.dev = {
.platform_data = &smsc911x_config,
},
.num_resources = ARRAY_SIZE(smsc911x_resources),
.resource = smsc911x_resources,
};
int __init mxc_expio_init(u32 base, u32 intr_gpio)
{
u32 p_irq = gpio_to_irq(intr_gpio);
……
brd_io = ioremap(BOARD_IO_ADDR(base), SZ_4K);
……
gpio_request(intr_gpio, "expio_pirq");
gpio_direction_input(intr_gpio);
……
platform_device_register(&smsc_lan9217_device);
}
match 在platform总线创建时就应用
struct bus_type platform_bus_type = {
.name = "platform",
.dev_groups = platform_dev_groups,
.match = platform_match,
.uevent = platform_uevent,
.pm = &platform_dev_pm_ops,
};