プラットフォームバス

5140 ワード

platformバスはLinux仮想のバスで、バスタイプは以下のように定義されています.
struct bus_type platform_bus_type = {
        .name           = "platform",
        .dev_attrs      = platform_dev_attrs,
        .match          = platform_match,
        .uevent         = platform_uevent,
        .pm             = &platform_dev_pm_ops,
};
EXPORT_SYMBOL_GPL(platform_bus_type);

ここではmatchメソッドに注目するだけで、matchメソッドは以下のように定義されています.
/**
 * platform_match - bind platform device to platform driver.
 * @dev: device.
 * @drv: driver.
 *
 * Platform device IDs are assumed to be encoded like this:
 * "<name><instance>", where <name> is a short description of the type of
 * device, like "pci" or "floppy", and <instance> is the enumerated
 * instance of the device, like '0' or '42'.  Driver IDs are simply
 * "<name>".  So, extract the <name> from the platform_device structure,
 * and compare it against the name of the driver. Return whether they match
 * or not.
 */
static int platform_match(struct device *dev, struct device_driver *drv)
{
        struct platform_device *pdev = to_platform_device(dev);
        struct platform_driver *pdrv = to_platform_driver(drv);

        /* Attempt an OF style match first */
        if (of_driver_match_device(dev, drv))
                return 1;

        /* Then try ACPI style match */
        if (acpi_driver_match_device(dev, drv))
                return 1;

        /* Then try to match against the id table */
        if (pdrv->id_table)
                return platform_match_id(pdrv->id_table, pdev) != NULL;

        /* fall-back to driver name match */
        return (strcmp(pdev->name, drv->name) == 0);
}

プラットフォームバスは、デバイスと駆動をマッチングする際に、まず駆動中にidがあるかどうかを確認します.tableメンバー、ある場合platform_を呼び出すmatch_idはマッチングされず、存在しない場合は、プラットフォームデバイスとプラットフォーム駆動のnameフィールドが同じかどうかを簡単に比較するだけです.
一、platform設備プラットフォーム設備struct platform_を使用するdeviceで説明します.この構造体はlinux/platform_で定義されています.device.hではプラットフォームデバイスを登録しplatform_を使用するdevice_register関数、プロトタイプは次の通りです:int platform_device_register(struct platform_device *pdev); プラットフォームデバイスのplatformの使用をログアウトするdevice_unregister関数、プロトタイプは以下の通りです:void platform_device_unregister(struct platform_device *pdev); プラットフォーム・デバイスの操作例は次のとおりです.
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

MODULE_LICENSE("GPL");

static void my_platform_device_release(struct device *dev)
{
        printk("My platform device released.
"); } struct platform_device my_platform_device = { .name = "my_platform_device", .dev = { .release = my_platform_device_release, }, }; static int __init my_platform_device_init(void) { int ret = 0; ret = platform_device_register(&my_platform_device); if (ret) { printk("Can't register my platform device!
"); } return ret; } static void __exit my_platform_device_exit(void) { platform_device_unregister(&my_platform_device); } module_init(my_platform_device_init); module_exit(my_platform_device_exit);

デバイスのバスタイプは指定されていませんplatform_device_register関数はバスタイプをplatformに設定します.bus_type. 二、platform駆動プラットフォーム駆動struct platformを使用するdriverはプラットフォームドライバを登録しplatform_を使用することを説明します.driver_register関数、プロトタイプは次の通りです:int platform_driver_register(struct platform_driver*drv)プラットフォームドライバを登録解除platform_を使用driver_unregister関数、プロトタイプは以下の通りです:void platform_driver_unregister(struct platform_driver *drv);
プラットフォームドライバの例は次のとおりです.
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

MODULE_LICENSE("GPL");

static int my_platform_driver_probe(struct platform_device *dev)
{
        printk("Platform driver found device which my platform driver can handle.
"); return 0; } static int my_platform_driver_remove(struct platform_device *dev) { printk("Platform driver found device unpluged.
"); return 0; } static struct platform_driver my_platform_driver = { .probe = my_platform_driver_probe, .remove = my_platform_driver_remove, .driver = { .owner = THIS_MODULE, .name = "my_platform_device", } }; static int __init my_platform_driver_init(void) { return platform_driver_register(&my_platform_driver); } static void __exit my_platform_driver_exit(void) { platform_driver_unregister(&my_platform_driver); } module_init(my_platform_driver_init); module_exit(my_platform_driver_exit);

同様にバスタイプを指定する必要はありませんplatform_driver_register関数は私たちに設定します.ここではidを使用していません.tableは、プラットフォームデバイスとドライバのnameフィールドを同じに設定するだけで、プラットフォームバスが一致し、最終的にドライバのprobe関数が呼び出されます.i 2 c,usb,pciなど多くのバスが後で見られますが、それぞれ独自のデバイスと駆動登録方法がありますが、最終的にはdevice_を呼び出します.registerとdriver_register関数はデバイスと駆動の登録を完了し、マッチングに成功した後、駆動中のprobe関数を呼び出しますが、matchメソッドが異なる可能性があります.原理は似ています.