Динамическое изменение загруженного дерева устройств - это не то, что мы обычно делаем, хотя это возможно.
Насколько я понимаю, вы не заботитесь о дереве устройств для этого нового устройства.
Я предлагаю вам создать новый модуль для добавления устройства и после его загрузки (после 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
. A struct 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);
и voilà. Ваш драйвер должен быть проверен, если было добавлено одноименное платформенное устройство.
Драйверы, использующие дерево устройств, добавляют еще один член к .driver
, который составляет .of_match_table
. Здесь дается таблица соответствия (массив строк).После этого совпадение использует свойство compatible
свойств узлов дерева устройств.
Спасибо за этот действительно хороший ответ! – pmf