phandle全方位介绍

发布时间:2023-05-20

一、phandle翻译

phandle翻译成中文为“指针句柄”,其实就是一个用于唯一标识设备或节点的句柄,它在设备树中被广泛应用。在设备树中,每个节点都有一个phandle字段,通过phandle可以找到节点的详细信息。

二、handy与handle的不同

在英语中,handy和handle都表示“手柄”之意,那么在Linux中,它们和phandle有什么不同呢? handy是一种用于处理指向内核对象的句柄,如file结构体,以及内核中的其他通用句柄类型。而handle通常指特定类型的句柄,如fd句柄、struct file *句柄、struct inode *句柄等。 与handy和handle不同,phandle是使用在设备树中的一种特殊的句柄,其用于标识一个节点。虽然它们有相似的含义,但在Linux内核中具体使用的情况是有所不同的。

三、phandle的使用场景

phandle主要被应用于Linux内核中的设备树机制,通过phandle可以在设备树中数据结构中唯一标识一个节点,主要有以下应用场景: 1、设备树节点的父子关系和兄弟关系的获取; 2、对设备节点进行操作,通过phandle查找设备节点。

四、在设备树节点中使用phandle

在设备树节点中的使用方法如下:

struct acpi_device_id usb_hid_device_ids[] = {
    {"USBC0001", 0},
    {""},
};
MODULE_DEVICE_TABLE(acpi, usb_hid_device_ids);
static struct acpi_driver usb_hid_driver = {
    .name = "usb_hid_acpi",
    .class = "hid",
    .ids = usb_hid_device_ids,
    .ops = &usb_hid_acpi_ops,
    .owner = THIS_MODULE,
};
static int __init usb_hid_acpi_init(void)
{
    return acpi_bus_register_driver(&usb_hid_driver);
}
module_init(usb_hid_acpi_init);
static void __exit usb_hid_acpi_exit(void)
{
    acpi_bus_unregister_driver(&usb_hid_driver);
}
module_exit(usb_hid_acpi_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ingo Molnar <mingo@kernel.org>");
MODULE_DESCRIPTION("ACPI driver for USB HID devices");

五、phandle与DTS

Device Tree Source (DTS)是一种以文本文件形式表示硬件信息的数据结构,而phandle在DTB中用于标识某个节点。因此,我们可以在DTS中使用phandle来确定节点关系。例如:

/ {
    clock-frequency = <0x0>;
    compatible = "simple-bus";
    #address-cells = <1>;
    #size-cells = <1>;
    child-node@0 {
        phandle = <0x1>;
        clock-frequency = <0x186a00>;
        compatible = "my,device";
        reg = <0x0>;
    };
};

六、总结

本文介绍了phandle的定义、handy和handle的不同之处,以及在Linux内核中使用phandle的场景和在DTS中使用phandle的方法。随着设备树机制的不断完善,phandle将会在更多的领域得到应用。