动态修改加载的设备树并不是我们通常会做的事情,尽管这是可能的。
我了解您并不真正关心此新设备的设备树。
我建议你创建一个新模块来添加你的设备,一旦它被加载(在insmod
它之后),insmod
你的驱动程序模块。事实上,顺序并不重要。添加设备时,将检查所有驱动程序并探测匹配的驱动程序,添加驱动程序时,将检查所有设备。
要创建设备,首先要分配它:
struct platform_device *pdev;
int inst_id = 1; /* instance unique ID: base address would be a good choice */
pdev = platform_device_alloc("unique_name_here", inst_id);
然后,您将要创建资源,至少为内存映射范围创建一个。为此,创建并填充struct resource
. Astruct resource
很简单。下面是一个关于如何填充内存资源的示例:
struct resource res = {
.start = 0x50000000,
.end = 0x50001fff,
.name = "some_name",
.flags = IORESOURCE_MEM,
};
完成后,将其添加到您正在构建的平台设备中:
platform_device_add_resources(pdev, &res, 1);
但是,请确保res
不在堆栈上(使其成为全局,或者kzalloc
在kfree
卸载模块时)。
您现在已准备好添加平台设备:
platform_device_add(pdev);
撇开设备树不谈,平台设备通过名称的“平台总线”(不是真正的物理总线)与平台驱动程序匹配。因此,您的平台驱动程序将需要提供等效名称(unique_name_here
上文)。您的平台驱动程序将具有以下内容:
static struct platform_driver my_platform_driver = {
.probe = my_probe,
.remove = my_remove,
.driver = {
.name = "unique_name_here",
.owner = THIS_MODULE,
},
};
module_platform_driver(my_platform_driver);
瞧。如果添加了同名的平台设备,则应探测您的驱动程序。
使用设备树的驱动程序将另一个成员添加到.driver
. .of_match_table
那里给出了一个匹配表(字符串数组)。然后匹配使用compatible
设备树节点的属性。