2013-08-29 3 views
6

Я использую Embedded Linux на плате, которая в основном сконфигурирована с помощью механизма дерева устройств (/.dtc), то есть записи в файле дерева устройств указывают, какие устройства регистрируются и, следовательно, какие драйверы нагрузки.Дерево устройств и ручная регистрация

Есть ли способ вручную загрузить динамический модуль таким образом, который бы соответствовал тому, что произойдет, когда этот драйвер будет загружен обработчиком дерева устройств?

Чтобы уточнить: вместо записи для устройства XXX в моем файле .dts я могу «вручную» зарегистрировать это устройство (например, загрузив модуль ядра оболочки динамически) после того, как пользовательское пространство уже вставлено (например, оно возможно с драйверами dts-unaware)?

Используя простой modprobe/insmod не то, что я думаю, что работает, так как это будет просто загрузить драйвер, но не зарегистрировать устройство и его параметры (которые обычно поступают из файла .dts).

ответ

9

Динамическое изменение загруженного дерева устройств - это не то, что мы обычно делаем, хотя это возможно.

Насколько я понимаю, вы не заботитесь о дереве устройств для этого нового устройства.

Я предлагаю вам создать новый модуль для добавления устройства и после его загрузки (после 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 свойств узлов дерева устройств.

+3

Спасибо за этот действительно хороший ответ! – pmf

Смежные вопросы