LINUX.ORG.RU

Как правильно пронумеровать устройства

 , , ,


0

2

Пишу platform driver, используя struct miscdevice. В device tree написано следующее:

mymodule0: mymodule@XXXX {
   compatible = "string";
   #adress-cells = <1>;
   #size-cells = <1>;
   reg = <0xXXXX 0x20>;
   interrupts-parent = <&intc>;
   interrupts = <0 46 4>;
};

Как правильно задать miscdevice.name, если у меня появится в device tree данные о mymodule1?

Из того, что попробовал, смог получить alias (XXXX.mymodule) и имя ноды, но без номер (mymodule) через <platform_device>->dev.of_node->name. Получается, нужно заводить переменную в модуле, которая будет подсчитывать сколько устройств использует мой модуль? Или эту информацию можно как-то получить?

★★★★★

Последнее исправление: UVV (всего исправлений: 1)

Ответ на: комментарий от Andrey_Utkin

На freenode такого канала нет, но есть #linux-kernel, на котором я тебя вижу ) А на oftc.net всего один человек на канале.

UVV ★★★★★
() автор топика

Как правильно задать miscdevice.name,

А как хочешь так и задавай. Имя используется только для записи в /proc/misc.

если у меня появится в device tree данные о mymodule1?

mymodule0 это метка, она в блоб не пишеться. Можешь сам проверить

dtc -I dtb -O dts -o out.dts devicetree.dtb

Как правильно пронумеровать устройства.

my_dev.minor = MISC_DYNAMIC_MINOR;

Vovanano
()
Ответ на: комментарий от Andrey_Utkin

Ха, точно. Видать не туда меня куда-то занесло =)

UVV ★★★★★
() автор топика

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

Если драйвер должен делать разное в зависимости от номера устройства, то наверное лучше добавить свой параметр в dts и читать его потом:

can0: can@e0008000 {
                         compatible = "xlnx,zynq-can-1.0";
...
                         tx-fifo-depth = <0x40>;
...

                   };

 ret = of_property_read_u32(pdev->dev.of_node, "tx-fifo-depth", &tx_max);
         if (ret < 0)
                 goto err;

Если регистрируешь его в какой-нибудь субсистеме типа spi или net то тогда имя устройства будет назначено этой субсистемой

Ну и для юзерспейса udev можно задействовать

alx777 ★★
()
Ответ на: комментарий от Vovanano

А как хочешь так и задавай. Имя используется только для записи в /proc/misc.

Нет, имя используется ещё для создания устройства в /dev.

mymodule0 это метка, она в блоб не пишеться. Можешь сам проверить

Да, уже понял, спасибо. Я перепутал терминологию. Я сначала думал, что имя - это то, что до двоеточия, а оказалось наооборот.

alx777 Я решил проблему. Добавил в device tree вот это:

/{
   aliases {
      mymodule0 = &mymodule0;
      mymodule1 = &mymodule1;
   };
};
Теперь alias'ы идут в blob. В модуле делаю так:
of_alias_get_id(dev->dev.of_node, "mymodule"),
и получаю 0 и 1 соответственно, т.е. индекс, который мне как раз и нужен.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Нет, имя используется ещё для создания устройства в /dev.

И правда. А ты хочешь назвать их по разному в деве? Интерестно зачем понадобилась такая необходимость.

Vovanano
()
Ответ на: комментарий от Vovanano

Я хочу, чтоб устройство имел более читаемое имя, не /dev/mydevice-XXXX (где XXXX - адрес начала устройства), а /dev/mydevice0 к примеру. В идеале хотелось бы сделать так, чтобы устройство имело такое же имя, что и alias, только вот не могу найти, как это сделать.

UVV ★★★★★
() автор топика
Ответ на: комментарий от Vovanano

А ты хочешь назвать их по разному в деве?

Не совсем понимаю, что ты значит по-разному. Если имя не задать, то пойвляется устройство с именем (null). Так что имя я по-любому должен задать.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

чтобы устройство имело такое же имя, что и alias,

Тогда делай как alx777 написал, варианта лучше чем задать name параметром я не вижу.

Vovanano
()
Ответ на: комментарий от alx777

Ну и для юзерспейса udev можно задействовать

Чё-то не подумал про это сразу. Спасибо.

UVV ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Не используй miscdevice, а имя задавай через device class или udev.

Я принял это волевое решение на 4 минуты раньше %) Но не использовать miscdevice всвязи с этим не вижу причин =)

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Чё-то не подумал про это сразу. Спасибо.

Всегда пожалуйста

С udev чтобы разобраться придется какое-то время потратить, но зато потом такого можно наворотить !

Весьма полезное знание для занимающихся всякой эмбеддщиной, особенно учитывая количество периферии в современных девайсах

alx777 ★★
()
Ответ на: комментарий от tailgunner

Обоснуешь почему не нужно использовать miscdevice? Ведь по сути это небольшая обёртка над module_init() и подобными макросами.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Обоснуешь почему не нужно использовать miscdevice?

В нем нет ничего полезного и при этом оно не дает использовать driver model. Например, невозможно сделать драйвер, где каждому физическому устройству соответствует несколько логических.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Например, невозможно сделать драйвер, где каждому физическому устройству соответствует несколько логических.

Так оно создано как раз для противоположного, насколько я понял. Поэтому оно мне надо и удобно.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Оно было полезно до выхода 2.6, а сейчас даже набыдлить модуль лучше без него. Впрочем, дело твое.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.