LINUX.ORG.RU

Драйвера устройств linux (Beaglebone)

 ,


0

2

Добрый день! Помогите пожалуйста с таким вопросом. Как, собственно говоря, работать с перифирийными устройствами на линукс, какой общий алгоритм? Работаю с процессорныи модулем beaglebone, процессор arm, linux debian, ядро 3,8. Первый раз меня интересовал датчик температуры i2c. С ним не возникло ровно никаких проблем - загрузил модуль драйвера, в каталоге /sys/class/ появилась нужная папка в которой все было интуитивно понятно. Далее потребовалось подключить железки посложнее, а именно wiznet w5300 (ethernet контроллер) и max14830 (spi-uart converter). Предпринял следующие шаги: 1) поставил драйвера (пробовал и встроенные в ядро и модули - разницы никакой) 2) добавил информацию об устройствам в device tree (возможно допустил ошибку, так как конкретных примеров не нашел на эти устройства под имеющуюся версию device tree, поэтому делал по аналогии) 3) в случае с ethernet контроллером добавил информацию о нем в файл /etc/network/interfaces. Что делать далее не понятно, команда ifconfig про новое устройство ничего не знает, в устройствах ничего не появилось, в каталоге созданном драйвером есть только ообщая информация об устройстве и bind, unbind и uevent, с которыми так и не нашел в интернете что делать и надо ли что либо делать. 4) в случае с max14830 - он появился в /proc/device-tree/osp.3/481a0000spi/.., могу посмотреть по нему общую информацию в каталоге, созданном драйвером, однако, опять же, никаких новых устройств, никаких папок\файлов для ввода вывода информации в каталоге драйвера - ничего нет.

Подскажите пожаоуйста что делаю не так, в чем ошибка.

dmesg в студию для начала. На pastebin.

Дальше надо проверить что у тебя драйвера подгружены, lsmod и смотреть что там есть.

Дальше прикольнее проверь что у тебя устройства подключены на тот spi, потому что их два и один не активен по-умолчанию.

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

Благодарю за ответ! lsmod проверял - модули подгружены успешно. что верный spi проверил уже несколько раз, pinmux настроил. Если все успешно, то я так понимаю, должны появиться новые устройства в каталоге /dev, или файлы для ввода вывода информации в каталоге с драйвером\модулем, правильно?

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

Похоже на то. Смотрел два образца, DTS для самого max14830 - мой device tree ругается на каждую вторую строчку. https://www.kernel.org/doc/Documentation/devicetree/bindings/serial/maxim,max... Потом посмотрел образцы для устройств на spi http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/spi/sp... и http://www.thing-printer.com/converting-device-tree-overlays-kernel-3-12/ В итоге получился такой фрагмент дерева устройств (стилистику как в образцах устройство не переваривает, её скопировал со стилbстики объявления i2с устройства, добавлю её)

http://pastebin.com/DF4EwpBM

Есть идеи, что не так? По идее вроде как не хватает строк clocks = <&clk20m>; clock-names = «osc»; interrupt-parent = <&gpio3>; interrupts = <7 IRQ_TYPE_EDGE_FALLING>; но если их добавить, но device tree не компилируется(

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

DTS описывает устройства а не просто набор букв и цифр - бесполезно тут писать то что в примере. У тебя должны быть соединения (физические) двух устройств - их надо описывать

https://www.kernel.org/doc/Documentation/devicetree/bindings/serial/maxim,max...

clocks = <&clk20m>;

тут должен быть клок твоего процессора если тактируется с процессора и соответственно

clock-names = «osc»;

если у макса свой кварцевый резонатор запаян - пропиши его

xtal_max: xtal20@20M { #clock-cells = <0>; compatible = «fixed-clock»; clock-frequency = <20000000>; };

в данном случае описан источник тактирования 20 МГц и в максе он так будет выглядеть

clocks = <&xtal_max>; clock-names = «xtal»;

источник прерываний в примере - с GPIO, тут тоже надо от своего процессора писать, проще смотреть пример из DTS где аналогично прерывания от GPIO тспользуются

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

Cпасибо за ответ, ситуация стала яснее. Добавил часы, переделал источник прерываний и chip select. Теперь устройство добавляется в каталог /sys/class/spi_master/spi1/spi1.0 независимо от того подключено оно или нет.

Команда dmesg больше не выдает ошибок, связанных с spi. http://pastebin.com/qKKzDnza

Device tree выглядит следующим образом (часть кода, не имеющего отношения к делу вырезал). http://pastebin.com/HgeWhbww

В качестве примера прерываний с gpio брал http://contactless.ru/wiki/index.php/Работа_с_GPIO

Отсюда http://dev.iachieved.it/iachievedit/gpio-chip-selects-with-the-beaglebone/ брал образец, как определять gpio для chip select.

Внешний кварц 3,68 Мгц указал.

В device tree у меня нумерация gpio 1-4, в документации - 0-3, это учел.

Подскажите, что я забыл? Или что делать дальше, в каталоге с драйвером все также глухо, bind, unbind и uevent которые нельзя даже прочесть, permission denied даже под su

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

Подскажите, пожалуйста!

Обновил драйвер max, теперь в логах пишет следующее: ERROR: could not get clock /ocp/spi@481a0000/14830@0:xtal(0) max310x: spi1.0: Cannot get clock max310x: probe of spi1.0 failed with error -22

В device tree кварц задал следующим образом(пробовал вставлять это в список устройств ocp и в список базовых устройств, таких как memory,cpu): xtal_max: xtal20@20M { #clock-cells = <0>; compatible = «fixed-clock»; clock-frequency = <3686400>; }; Сам max14830 задал так: &spi1 { pinctrl-names = «default»; pinctrl-0 = <&spi1_pins_s0>; status = «okay»; 14830@0 { compatible = «maxim,max14830»; spi-max-frequency = <16000000>; clocks = <&xtal_max>; clock-names = «xtal»; reg = <0>; interrupt-parent = <&gpio3>; interrupts = <25 0>; }; };

Объясните пожалуйста почему не видит clock

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