реклама на сайте
подробности

 
 
> Device Tree Source, подключение 1wire устройства к gpio
xor.kruger
сообщение Feb 20 2013, 10:34
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Доброго времени суток.

Интересует пример подключения (описания) любого устройства для однопроводной шине в файле DTS.
К сожалению в каталоге Documentation/devicetree о подключении 1 ни сказано ни слова sad.gif

В моем случае используется Microblaze, одноразрядная ipcore gpio и подключенный к ней датчик температуры DS18B20. Саму кору ядра находит без проблем, регистрирует драйвера для 1wire, а вот устройство не находит.
Вот как я пытался описать датчик:
Код
        xps_gpio_0: gpio@81460000 {
            compatible = "xlnx,xps-gpio-2.00.a", "xlnx,xps-gpio-1.00.a";
            interrupt-parent = <&xps_intc_0>;
            interrupts = < 10 2 >;
            reg = < 0x81460000 0x10000 >;
            xlnx,all-inputs = <0x0>;
            xlnx,all-inputs-2 = <0x0>;
            xlnx,dout-default = <0x0>;
            xlnx,dout-default-2 = <0x0>;
            xlnx,family = "spartan3adsp";
            xlnx,gpio-width = <0x1>;
            xlnx,gpio2-width = <0x20>;
            xlnx,interrupt-present = <0x1>;
            xlnx,is-dual = <0x0>;
            xlnx,tri-default = <0xffffffff>;
            xlnx,tri-default-2 = <0xffffffff>;
            #gpio-cells = <2>;
            gpio-controller;

            w1_therm@0 {  /*Смущает это мето*/
                compatible = "dallas,ds18b20";
            };
        };


Заранее благодарен за любой совет. rolleyes.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vvk
сообщение Jan 21 2015, 09:49
Сообщение #2





Группа: Новичок
Сообщений: 2
Регистрация: 9-01-15
Из: Киев
Пользователь №: 84 471



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

xor.kruger, надеюсь, что вы все еще на форуме и что у вас осталось если не само работающее устройство, то хотя бы какие-то смутные воспоминания, что именно вы с ним делали.

Итак, судя по ветке делаю несколько предположений, отметьте, где я неправ.

1. Вы использовали стандартный IP xps_gpio версии 2.00.a
2. Вы использовали для GPIO драйвер, который находится в /drivers/gpio/gpio-xilinx.c, насколько можно судить из поля "compatible". В menuconfig это Device Drivers -> GPIO Support ->Xilinx GPIO support
3. В той же ветке menuconfig было включено "/sys/class/gpio/... (sysfs interface)" (впрочем, это не особо важно)
4. Для 1wire был включен драйвер /drivers/w1/masters/w1-gpio.c, то есть Device Drivers -> Dallas's 1-wire support -> 1-wire Bus Masters -> GPIO 1-wire busmaster. В пункте 1-wire Slaves включен драйвер "Thermal family implementation"
Кроме этого, у меня еще включен "Userspace communication over connector", но это уже от отчаяния, этот драйвер явно вторичный и он пока что не при чем.
5. Вы никак не патчили ни gpio.xilinx, ни w1-gpio ни, тем более, core gpio или w1.
6. У вас в /sys/bus/w1/devices появился каталог для slave устройства.

Теперь описываю свою конфигурацию.

Платформа - Trenz TE0320.
Термометр - DS18B20.
Data пин термометра притянут к питанию 3.3 через резистор на 4К7.

В dts у меня следующее:
Код
    xps_gpio_1wire: gpio@814e0000 {
      #gpio-cells = <2>;
      compatible = "xlnx,xps-gpio-2.00.a", "xlnx,xps-gpio-1.00.a";
      gpio-controller;
      interrupt-parent = <&xps_intc_0>;
      interrupts = < 0 2 >;
      reg = < 0x814e0000 0x10000 >;
      xlnx,all-inputs = <0x0>;
      xlnx,all-inputs-2 = <0x0>;
      xlnx,dout-default = <0x0>;
      xlnx,dout-default-2 = <0x0>;
      xlnx,family = "spartan3adsp";
      xlnx,gpio-width = <0x1>;
      xlnx,gpio2-width = <0x20>;
      xlnx,interrupt-present = <0x1>;
      xlnx,is-dual = <0x0>;
      xlnx,tri-default = <0xffffffff>;
      xlnx,tri-default-2 = <0xffffffff>;
    };

      onewire@0 {
        compatible = "w1-gpio";
        gpios = <&xps_gpio_1wire 0 0>;
        linux,open-drain = <1>;
      };
  };


В dmesg получаю:

Код
Driver for 1-wire Dallas network protocol.
bus: 'w1': registered
bus: 'w1': add driver w1_master_driver
bus: 'w1': add driver w1_slave_driver
bus: 'platform': add driver w1-gpio
bus: 'platform': driver_probe_device: matched device onewire.4 with driver w1-gpio
bus: 'platform': really_probe: probing driver w1-gpio with device onewire.4
Setting open-drain to 1
Pdata pin is 191
Second GPIO is -22
device: 'w1_bus_master1': device_add
bus: 'w1': add device w1_bus_master1
driver: 'w1_bus_master1': driver_bound: bound to device 'w1_master_driver'
driver: 'onewire.4': driver_bound: bound to device 'w1-gpio'
bus: 'platform': really_probe: bound device onewire.4 to driver w1-gpio
node: /plb@0/onewire@0


То есть мастер поднялся, слейва при этом нигде нет.

Если включить debug для GPIO, то получаю вот такую последовательность:

Код
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_get: /plb@0/gpio@814e0000 GPIO 0 val=0

xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_get: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_get: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_get: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_get: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_get: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=0
xgpio_set: /plb@0/gpio@814e0000 GPIO 0 val=1

xgpio_get: /plb@0/gpio@814e0000 GPIO 0 val=1

И так - десять раз (строго в соответствии с кодом драйвера)

Перевожу в более удобный вид:

Код
set -> 0 1
get <- 0
set -> 0 1 0 1 0 1 0 1 0 1
get <- 1
set -> 0 1
get <- 1
set -> 0 1
get <- 1
set -> 0 1
get <- 1
set -> 0 1
get <- 1
set -> 0 1
get <- 1


Комбинации "set -> 0 1", судя по комментам в коде, в первой строке означает резет шины, остальные, надо полагать, запрос состояния шины (до вдумчивого чтения документации я еще не доюбрался).
Первое, что смущает - это строчка "set -> 0 1 0 1 0 1 0 1 0 1".
Эта последовательность ни с какой стороны не похожа на 0x33, aka W1_READ_ROM, которая, судя по коду функции w1_search() в w1.c, должна отправляется в качестве запроса.
Похожа она на 0x55, то есть на W1_MATCH_ROM, которая используется в единственном месте - в функции w1_reset_select_slave(), до вызова которой дело никак не должно доходить.
Как такое может происходить - ни малейших идей.

Второе, что смущает еще больше - это ваш конфиг с ".is_open_drain = 0" и мой конфиг с "linux,open-drain = <1>;".
При выключении open-drain мастер драйвер ругается сообщением "set_pullup requires write_byte or touch_bit, disabling". Это понятно, ему нужен как минимум второй GPIO но у вас, как я вижу, заявлен только один GPIO пин.

Теперь вопросы:
1. Вы не могли бы нарисовать, как на самом деле вы подключали термометр (что-то типа схемки)?
2. Какая у вас была версия ядра? У меня древняя 3.6.0, но и в самом новом ядре я не обнаружил никаких существенных отличий в GPIO и W1 драйверах (разве что в W1 поддержка OF появилась).
3. Сохранилась ли окончательная версия DTS файла и, если да, можно ли выложить сюда ту часть, которая относится к w1?
4. Что еще я мог пропустить?

Ну и напоследок. На RaspberryPi термометр завелся без всяких дополнительных приседаний, так что о правильности подключения вопрос не стоит.
Осциллографа у меня нет, поэтому не могу сказать, что реально происходит на пине DATA, но в том, что какой-то обмен данными там идет, я абсолютно уверен, на все той же Raspberry сделал детектор, который подмигивает светодиодом, если уровень на входном GPIO меняется, и он раз в десять секунд, когда идет поиск устройств, проявляет бурную активность.
Нда, чует мое сердце, что придется-таки и осциллограф рисовать, хотя очень не хотелось бы еще и этим заниматься, тем более, что нет особой надежды, что это чем-то поможет.
Go to the top of the page
 
+Quote Post
Jury093
сообщение Jan 21 2015, 11:38
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(vvk @ Jan 21 2015, 12:49) *
Ну и напоследок. На RaspberryPi термометр завелся без всяких дополнительных приседаний, так что о правильности подключения вопрос не стоит.
Осциллографа у меня нет, поэтому не могу сказать, что реально происходит на пине DATA, но в том, что какой-то обмен данными там идет, я абсолютно уверен, на все той же Raspberry сделал детектор, который подмигивает светодиодом, если уровень на входном GPIO меняется, и он раз в десять секунд, когда идет поиск устройств, проявляет бурную активность.
Нда, чует мое сердце, что придется-таки и осциллограф рисовать, хотя очень не хотелось бы еще и этим заниматься, тем более, что нет особой надежды, что это чем-то поможет.

по поведению на паре архитектур могу сказать, что w1-gpio не самый удачный вариант реализации этого протокола чувствительного к времянкам..
http://www.starterkit.ru/html/index.php?na...id=15335.#15421

как варианты "напопробовать"
- убрать внешний пуллап или покрутить его номинал в разумных пределах
- попробовать режим с паразитным питанием (двупроводный)

в теории, вы можете из Малины сделать анализатор и построить диаграмму обмена по w1-gpio, но надо писать свою аппликуху с дискретизацией по таймеру и запрещением остальных прерываний, на что линукс может неодобрительно рухнуть..
Go to the top of the page
 
+Quote Post
vvk
сообщение Jan 22 2015, 13:13
Сообщение #4





Группа: Новичок
Сообщений: 2
Регистрация: 9-01-15
Из: Киев
Пользователь №: 84 471



Цитата(Jury093 @ Jan 21 2015, 13:38) *
по поведению на паре архитектур могу сказать, что w1-gpio не самый удачный вариант реализации этого протокола чувствительного к времянкам..
http://www.starterkit.ru/html/index.php?na...id=15335.#15421

Да, тайминги. Уже об этом мысль возникала, у меня всего 50 МГц тактовая, может и в самом деле в этом дело.
Попробую еще поиграться с irq_save/irq_restore, как по вашей ссылке написано, хотя у меня есть подозрение, что именно это я уже делал (проблемой занимаюсь по паре часов за раз с большими перерывами, сейчас вот опять запретили даже прикасаться к "конструктору" sm.gif )

Цитата
как варианты "напопробовать"
- убрать внешний пуллап или покрутить его номинал в разумных пределах
- попробовать режим с паразитным питанием (двупроводный)

Без пуллапа пробовал. Естественно, безуспешно. С пуллапом тыкался тестером в тот пин и отправлял на него единичку или нолик - все четко, получал 0 и 3 вольта соответственно.
Двухпроводный не пробовал (попробую, когда окошко появится) но, повторюсь, на RPi с текущим подключением и с тем же w1-gpio драйвером слейв моментально нашелся.

Цитата
в теории, вы можете из Малины сделать анализатор и построить диаграмму обмена по w1-gpio, но надо писать свою аппликуху с дискретизацией по таймеру и запрещением остальных прерываний, на что линукс может неодобрительно рухнуть..

Ваша правда. Проще и дешевле взять под мышку коробочку с девайсом и съездить в гости к нашему железячнику. Заодно пива попить. biggrin.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 23:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01308 секунд с 7
ELECTRONIX ©2004-2016