Ник:
Пароль:

Контакты

Cтатус Skype: starterkit.ru
тел.: (+7 3412) 478-448
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
E-mail: info@starterkit.ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:3
Форум » starterkit.ru » Embedded Linux
Влияние SPI на работу GPIO
sasamy
Добавлено 10.11.2017 12:47 Редактировалось 10.11.2017 12:48 Сообщение: 21
sasamy
4.77

Пункты: 63603
Регистрация: 14.08.2009
Попробуйте готовый имидж

https://yadi.sk/d/d1mH62fy3PaAiN

скопируйте его на плату - я загружал с emmc на sodimm, копировал в /boot.

Остановите загрузку в u-boot и загрузите

ext2load mmc 0:1 0x12000000 /boot/zImage.imx6dl-oem
bootz 0x12000000

это ядро с initramfs и "приклееным" dtb

после загрузки

./ugpio

тут архив с собранным ugpio и там же исправленый DTS для oem с которым собран имидж ядра

https://yadi.sk/d/QqjWNpAK3PUzVa

у меня это всё работает на sodimm
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 10.11.2017 14:39 Сообщение: 22
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Попробовал. У меня чуть по другому надо было.

Net: FEC
Normal Boot
Hit any key to stop autoboot: 0
u-boot > ext2load mmc 0:1 0x12000000 /boot/zImage.imx6dl-oem
MMC: no card present
** Bad device mmc 0 **
u-boot > ext2load mmc 1:1 0x12000000 /boot/zImage.imx6dl-oem
13189985 bytes read in 748 ms (16.8 MiB/s)
u-boot > bootz 0x12000000
Kernel image @ 0x12000000 [ 0x000000 - 0xc8b2b0 ]

Результат тот же:
echo 111 > /dev/spidev0.0 сбрасывает выход 5.19 в низкий уровень, когда к нему подключен резистор на 2 кОм, после того, как он был выставлен новым ./ugpio.
Правда есть два момента. 1. spidev ругается при загрузке
spidev spi0.0: buggy DT: spidev listed directly in DT
------------[ cut here ]------------
WARNING: CPU: 0 PID: 1 at drivers/spi/spidev.c:731 spidev_probe+0x1a4/0x1c0()
Modules linked in:
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.1.15 #5
Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
[<8001667c>] (unwind_backtrace) from [<8001266c>] (show_stack+0x10/0x14)
[<8001266c>] (show_stack) from [<807079e4>] (dump_stack+0x74/0xb4)
и т.д.

Могу сказать, в моих сборках для этого ядра тоже самое. У себя используем другое ядро, там все нормально, потому заметил только сегодня. Само устройство при этом создается и работает.

2. ugpio на initramfs и в архиве имеют разные размеры, свежий на initrams.

В принципе, теоретически, имеется возможность предоставить удаленный доступ к плате(скажем, через ssh), если у Вас есть время и желание посмотреть все самолично. Ценного на плате нет ничего, менять можно будет что угодно. Разве что вместо мультиметра мониторить состояние выходов по регистрам придется, ну или через skype состояние у меня запрашивать. Но это будет возможно только в понедельник.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 10.11.2017 14:57 Редактировалось 10.11.2017 15:16 Сообщение: 23
sasamy
4.77

Пункты: 63603
Регистрация: 14.08.2009
Цитата

1. spidev ругается при загрузке
spidev spi0.0: buggy DT: spidev listed directly in DT


этот варнинг ниочем - можно не обращать внимания

Цитата

ugpio на initramfs и в архиве имеют разные размеры, свежий на initrams.


в инитрамфс стрипнутый бинарник из архива

https://en.wikipedia.org/wiki/Strip_(Unix)

Цитата

В принципе, теоретически, имеется возможность предоставить удаленный доступ к плате


не вижу смысла - этот же самый образ у меня работает штатно - никакие регистры сами собой в 0 не сбрасываются
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 14.11.2017 15:03 Редактировалось 14.11.2017 15:30 Сообщение: 24
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Здравствуйте!
Мы додумались таки протестировать Вашу конфигурацию. Подтверждаю, что если выход подключать через резистор 2 кОм и светодиод, то все работает.
Прошу протестировать нашу конфигурацию, где никакого светодиода нет. Выход через резистор 2 кОм на землю. Контролировать вольтметром. Впрочем и с резистором на 5,8 кОм у меня не работает также.
У нас выходы работают на ключ ULN2003D, вернее не работают.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.11.2017 17:53 Редактировалось 14.11.2017 18:22 Сообщение: 25
sasamy
4.77

Пункты: 63603
Регистрация: 14.08.2009
Цитата

Прошу протестировать нашу конфигурацию, где никакого светодиода нет. Выход через резистор 2 кОм на землю.


Проверил с одним резистором 2 кОм - всё как описывали - сбрасывается выход в 0
(или на вход встает - не могу сказать). Через sysfs работает как положено. Вывод тут один - что-то некорректно в коде работы через mmap. Если честно - для меня это тоже сюрприз, в своем примере я взял реализацию работы с gpio из убута.

Цитата

У нас выходы работают на ключ ULN2003D, вернее не работают.


используйте sysfs - в чём проблема ?
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 14.11.2017 19:07 Редактировалось 14.11.2017 19:37 Сообщение: 26
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Цитата

используйте sysfs - в чём проблема ?


Решение о переработке ПО уже есть. Оно работает на разных контроллерах и изначально была работа через mmap. Проблем до сих пор не было. Плохо то, что теперь на разных платформах будет разные решения. Но это не смертельно. Есть еще два момента:
1. Непонятно, что происходит и почему нагрузка так влияет, система так поступает только с выходами с такой нагрузкой. Непонятно, чего и где ждать. У нас очень плотная работа с периферией: входы, выходы, микросхемы uart на spi, АЦП, LVDS, датчики и внешние платы на I2C. Поэтому внезависимости ни от чего "в фоне" будем пробовать разобраться.
2. Через sysfs все работает, хотелось бы разобраться - почему. При этом система пин явно использует как выход, она про него "знает". Но, когда в dts выход определяется как выход, он также появляется в системе, но не работает. Для sysfs он становится недоступным. Более того, у меня получилось определить в dts этот выход с активным высоким уровнем. Так вот, когда с помощью mmap я его сбросил в 0, затем выполнил обращение к SPI - выход выставился в 1(ну или вернулся в исходное состояние, не знаю).

Цитата

или на вход встает - не могу сказать

на вход не встает, gdir не меняется, dr переписывается
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.11.2017 20:05 Редактировалось 14.11.2017 20:26 Сообщение: 27
sasamy
4.77

Пункты: 63603
Регистрация: 14.08.2009
Цитата

Оно работает на разных контроллерах и изначально была работа через mmap. Проблем до сих пор не было.


В языке Си тоже можно использовать конструкции с UB и оно будет даже работать - но надо ли так делать ?

Цитата

Через sysfs все работает, хотелось бы разобраться - почему.


потому что это на данный момент штатный API для userspace. Кстати - ему давно уже готовят замену

https://www.kernel.org/doc/Documentation/ABI/testing/gpio-cdev

Проблема с mmap в том что ядро не знает про то что вы используете какие-то регистры.

Цитата

Но, когда в dts выход определяется как выход, он также появляется в системе, но не работает. Для sysfs он становится недоступным.


я так понимаю вы про gpio-hog

https://www.spinics.net/lists/linux-gpio/msg15040.html

Цитата

> I am aware of gpio-hog, but as far as I can tell, once hogged,
> the GPIO is not exposed and cannot be changed (at least by userspace).

That is not the usecase for hogs. Hogs are "set once, never touch".
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 15.11.2017 01:07 Редактировалось 15.11.2017 01:21 Сообщение: 28
sasamy
4.77

Пункты: 63603
Регистрация: 14.08.2009
Цитата

Оно работает на разных контроллерах и изначально была работа через mmap. Проблем до сих пор не было.


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

int mask=PIO5_Reg->GDIR;
mask |= 1<<19 | 1<<20;

PIO5_Reg->GDIR = mask;

типичное чтение-модификация-запись. Теперь представьте - ядро в промежутке между чтением и записью в вашем коде записало какое-то новое значение в этот регистр - например изменило бит 5 (планировщик например прервал вашу задачу в юзерспейс или прерывание сработало или система многоядерная и код параллельно выполняется), ваша запись вернет этот бит в прежнее состояние.
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 15.11.2017 07:17 Редактировалось 15.11.2017 08:36 Сообщение: 29
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Цитата

Теперь представьте - ядро в промежутке между чтением и записью в вашем коде записало какое-то новое значение в этот регистр - например изменило бит 5 (планировщик например прервал вашу задачу в юзерспейс или прерывание сработало или система многоядерная и код параллельно выполняется), ваша запись вернет этот бит в прежнее состояние.


Соглашусь с Вами, что-то не задумывался об этом ранее. Но, тем не менее, до сих пор работало. Переделки кода ПО связаны с отработкой этого кода, у нас не всегда есть все железо, чтобы его отработать. Вернее, такого никогда не бывает, чтобы все было. Будем поправлять постепенно... Спасибо!


Цитата

я так понимаю вы про gpio-hog

Да, понял. Спасибо!
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 15.11.2017 09:15 Редактировалось 15.11.2017 12:47 Сообщение: 30
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Тогда давайте подведем итог.
Если не смотреть на то, что система по разному реагирует на нагрузку, то происходит следующее.
Система использует выход 5.17 CS ECSPI0 как gpio.
При обращении к spi система переписывает регистр DR целиком без учета наших действий по mmap, чем сбрасывает состояние нашего выхода. Она не пытается считать регистр и, выставив свой бит, записать обратно, а записывает какое-то свое состояние по своему разумению.

Работа с gpio через mmap, помимо прочего, может приводить к коллизиям, что подтверждается и вышесказанным, потому очень не рекомендуется.

Думаю, тему можно закрыть как решенную. Еще бы переименовать ее на что-то типа "Проблемы при работе под Linux с gpio через mmap", что более точно отражает содержание.
Спасибо!
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux