什么是platform device?

1 为了实现设备跟驱动的分离,linux开始引入platform模型。使用该模型的设备,通常是不可被“发现”的设备(它不像USB,PCI那样能够枚举),例如I2C,SPI设备。对于platform devices,我们必然清晰的了解他们的地址。

      摘自:kernel-xxxDocumentationdriver-modelplatform.txt

Platform devices are devices that typically appear as autonomous
entities in the system. This includes legacy port-based devices and
host bridges to peripheral buses, and most controllers integrated
into system-on-chip platforms.  What they usually have in common
is direct addressing from a CPU bus.  Rarely, a platform_device will
be connected through a segment of some other kind of bus; but its
registers will still be directly addressable.

2 platform devices 通常是系统中重要的设备,他们在系统启动的时候,尽早的注册和加载,例如电源管理芯片。

3 platform devices 通常都会有IO配置,电源管理等需求。随着运行linux内核的移动设备的增加,电源管理变得越来越重要。

4 platform device 与 drivers 通过name来binding,当然,我们遵循先注册设备,再注册驱动的顺序。

struct platform_device {
    const char    *name;
    u32        id;
    struct device    dev;
    u32        num_resources;
    struct resource    *resource;
};
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;
};
//没有name?接着往下看
struct device_driver {
    const char        *name;
    struct bus_type        *bus;

    struct module        *owner;
    const char        *mod_name;    /* used for built-in modules */

    bool suppress_bind_attrs;    /* disables bind/unbind via sysfs */

    const struct of_device_id    *of_match_table;
    const struct acpi_device_id    *acpi_match_table;

    int (*probe) (struct device *dev);
    int (*remove) (struct device *dev);
    void (*shutdown) (struct device *dev);
    int (*suspend) (struct device *dev, pm_message_t state);
    int (*resume) (struct device *dev);
    const struct attribute_group **groups;

    const struct dev_pm_ops *pm;

    struct driver_private *p;
};
原文地址:https://www.cnblogs.com/duanyongzhen/p/5232370.html