6

我在主要通过设备树机制(.dts/.dtc文件)配置的板上使用嵌入式 Linux,即设备树文件中的条目指示要注册哪些设备以及要加载哪些驱动程序。

有没有办法以类似于设备树处理程序加载此驱动程序时发生的情况手动加载动态模块?

.dts澄清一下:我是否可以在用户空间已经启动后“手动”注册该设备(例如通过动态加载包装内核模块)而不是在我的文件中包含设备 XXX 的条目(就像 dts-unaware 一样司机)?

使用简单的modprobe/insmod不是我认为有效的方法,因为这只会加载驱动程序,而不是注册设备及其参数(通常来自.dts文件)。

4

1 回答 1

12

动态修改加载的设备树并不是我们通常会做的事情,尽管这是可能的。

我了解您并不真正关心此新设备的设备树。

我建议你创建一个新模块来添加你的设备,一旦它被加载(在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不在堆栈上(使其成为全局,或者kzallockfree卸载模块时)。

您现在已准备好添加平台设备:

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设备树节点的属性。

于 2013-08-29T15:40:04.130 回答