设备树和手动注册

我在主要通过设备树机制( .dts / .dtc文件)configuration的主板上使用embedded式Linux,即设备树文件中的条目指示注册哪些设备,从而指定要装入哪些驱动程序。

有没有一种方法来手动加载dynamic模块的方式,类似于设备树处理程序加载此驱动程序时会发生什么?

要澄清:而不是在我的.dts文件中的设备XXX的条目,我可以“手动”注册此设备(例如通过dynamic加载包装内核模块)后用户空间已经达到(如可能与DTS -unaware驱动程序)?

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

Solutions Collecting From Web of "设备树和手动注册"

虽然这是可能的,但是动态地修改加载的设备树并不是我们通常所做的事情。

我知道你并不关心这个新设备的设备树。

我建议你创建一个新的模块来添加你的设备,一旦它被加载(在insmod ing之后), 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的数组。 一个struct 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); 

和voilà。 如果添加了具有相同名称的平台设备,则应该检查您的驱动程序。

使用设备树的驱动程序将另一个成员添加到.driver ,即.of_match_table 。 在那里给出一个匹配表(字符串数组)。 然后匹配使用设备树节点的compatible属性。