Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
Проблемы при работе под Linux с gpio через mmap
Alexey70
Добавлено 07.11.2017 08:31 Редактировалось 15.11.2017 18:09
0
Сообщение: 1
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Здравствуйте!
Столкнулся с непонятной ситуацией. Не могу понять, где ошибаюсь.
Мы используем модули SK-iMX6S-OEM. C GPIO работаем через mmap.
Конфигурация следующая:
ecspi1 {
pinctrl_ecspi1_oem: ecspi1-oem {
fsl,pins = <
/*GPIO 5.14*/
MX6QDL_PAD_DISP0_DAT20__ECSPI1_SCLK 0x100b1
/*GPIO 5.15*/
MX6QDL_PAD_DISP0_DAT21__ECSPI1_MOSI 0x100b1
/*GPIO 5.16*/
MX6QDL_PAD_DISP0_DAT22__ECSPI1_MISO 0x100b1
>;
};
};

/* ECSPI1 CS0 */
MX6QDL_PAD_DISP0_DAT23__GPIO5_IO17 0x80000000

/*MY LEDS*/
MX6QDL_PAD_CSI0_MCLK__GPIO5_IO19 0x80000000
MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20 0x80000000

Если выставить в 1 любой из выходов /*MY LEDS*/ , на выходах выставляется уровень 3.3В. Если после этого произвести операцию записи по SPI1, то это напряжение с выходов /*MY LEDS*/ будет сброшено в 0В.
Происходит это только в том случае, когда на выходах /*MY LEDS*/ присутствует нагрузка(эквивалентна сопротивлению на 2 кОм), если нагрузку убрать(у нас остается подтяжка к GND на 100кОм), то все работает как положено и на выходе сохраняется уровень 3.3В.
Пробовал на плате sk-iMX6/53/50-MB с «чистым» buildroot 2016-11. Ситуация воспроизводится.
Файл dts, тестовую программу, которой через mmap выставляю выходы и ее исходники можно посмотреть по ссылке https://drive.google.com/file/d/1Linzby4LzLkqAeW2IID2tUpkDln1zlVE/view

Точно такая же ситуация у меня происходит и с SPI3(GPIO 4.21, 4.22,4.23,4.24,4.25,4.26,4.27) и GPIO 4.15.

Ну и еще: когда работаешь с GPIO через sysfs, такого эффекта не наблюдается.
Заранее спасибо за помощь!
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 07.11.2017 10:36 Редактировалось 07.11.2017 10:39 Сообщение: 2
sasamy
4.71

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

когда работаешь с GPIO через sysfs, такого эффекта не наблюдается


Очевидно ошибки в вашем тестовом приложении, в частности как вы отображаете и получаете адреса регистров контроллера GPIO. Посмотрите пример

https://yadi.sk/d/KeuQqFXt3PU8Sv

если будете его у себя пробовать - выберите свой тип процессора в самом начале файла ugpio.c, в данном случае процессор Quad или Dual

/* #define CONFIG_MX6DL */
#define CONFIG_MX6Q

для Solo, DualLite

#define CONFIG_MX6DL
/* #define CONFIG_MX6Q */
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 07.11.2017 13:59 Сообщение: 3
Alexey70
0

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

Очевидно ошибки в вашем тестовом приложении, в частности как вы отображаете и получаете адреса регистров контроллера GPIO. Посмотрите пример


Спасибо за быстрый ответ и пример. Модифицировал его таким образом чтобы мой выход (5_19) выставлялся не в цикле, а однократно. Запускаю - выход выставляется в 1, приложение закрывается. Даю команду echo 111 > /dev/spidev0.0. Выход сбрасывается в 0. Пока ничего не изменилось... Увидел, что при работе SPI в DR для 5.19 прописывается 0. Почему - понять не могу.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 07.11.2017 14:22 Редактировалось 07.11.2017 14:27 Сообщение: 4
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
У вас в архиве нет DTS файла - вместо imx6qdl-oem.dtsi какой-то бинарный файл, залейте заново. Насчет ошибки в отображении регистров в вашей тестовой программе - я невнимательно посмотрел, пересмотрел потом вроде все правильно.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 07.11.2017 17:27 Редактировалось 07.11.2017 17:46 Сообщение: 5
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
У меня нет такой платы - проверил на SK-IMX6Q, тут подправленый мой пример для gpio 5 19 он же CSI_HS по схеме MB

http://www.starterkit.ru/html/doc/SK-iMX53_50_6-MB_V1C.pdf

https://yadi.sk/d/QqjWNpAK3PUzVa

для OEM надо исправить процессор на DL

#define CONFIG_MX6DL
/* #define CONFIG_MX6Q */

DTS вашего не дождался - сделал так как тут

http://www.starterkit.ru/html/index.php?name=forum&op=view&id=28717&last#28717

+ отключил в DTS LCD и CSI чтобы не было конфликта пинов

Итог - gpio переключается светодиод загорается (я его подключил через резистор 2 кОм), после многократных

echo 111 > /dev/spidev0.0

не гаснет - всё работает штатно, ядро 4.1.15
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 07.11.2017 18:45 Редактировалось 08.11.2017 07:28 Сообщение: 6
Alexey70
0

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

DTS вашего не дождался - сделал так как тут


Уже ушел с работы, действительно в файле непойми что. В нем особо и не было ничего, в spi добавлено spidev, удалено все, что пересекалось по входам. Завтра буду пробовать, по результатам отпишусь. Спасибо!
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 08.11.2017 09:43 Сообщение: 7
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Чуда не произошло. Приложение фактически полный аналог того, что я уже пробовал. SK-IMX6Q у меня нет. Привожу свой dts:
https://drive.google.com/file/d/18TanutSyLF1oKBjBd8tr-_-k21_HImx-/view
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 08.11.2017 10:17 Редактировалось 08.11.2017 10:29 Сообщение: 8
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Модифицировал свою программу таким образом, чтобы в цикле читать регистры. В IOMUX дополнительно подключил регистр PSR. PIO5_IOMUX[36] соответствует регистру IOMUXC_SW_MUX_CTL_PAD_CSI0_HSYNC
Вариант 1. На PIO 5.19 резистор 2 кОм , PIO 5.20 - в воздухе.
PIO5_Reg->PSR=CFFC3FE0 PIO5_Reg->DR=CFFC3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFFC3FE0 PIO5_Reg->DR=CFFC3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFF43FE0 PIO5_Reg->DR=CFF63FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFF43FE0 PIO5_Reg->DR=CFF63FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15

Смена данных в регистрах DR и PSR соответствует моменту работы SPI

Вариант 2. Не перезагружая системы перебросил резистор с 5.19 на 5.20(разъем платы X3 CSI_DE). Повторил опыт. Результаты один в один как в варианте 1 после работы SPI.
PIO5_Reg->PSR=CFF43FE0 PIO5_Reg->DR=CFF63FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFF43FE0 PIO5_Reg->DR=CFF63FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15

Вариант 3. Перезагрузил систему. Резистор на 5.20. Вывод программы:
PIO5_Reg->PSR=CFFC3FE0 PIO5_Reg->DR=CFFC3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFFC3FE0 PIO5_Reg->DR=CFFC3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFEC3FE0 PIO5_Reg->DR=CFEE3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFEC3FE0 PIO5_Reg->DR=CFEE3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15

Вариант 4. Не перегружая системы возвращаю резистор на 5.19.
PIO5_Reg->PSR=CFFC3FE0 PIO5_Reg->DR=CFFC3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFEC3FE0 PIO5_Reg->DR=CFEE3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15
PIO5_Reg->PSR=CFEC3FE0 PIO5_Reg->DR=CFEE3FE0 PIO5_Reg->GDIR=1A0000 PIO5_IOMUX[36]=15

При записи в SPI на выходе 5.19 сохраняется высокий уровень.
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 08.11.2017 10:30 Сообщение: 9
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Виноват. Не то вставил во 2 и 4 вариант(пришлось подредактировать). Они полностью идентичны соответственно 1 и 3му. После того, как я переставил резистор, система работала так же, как будто резистор оставался на старом месте.
Спуститься к концу Подняться к началу
Персональная информация
Alexey70
Добавлено 08.11.2017 11:46 Сообщение: 10
Alexey70
0

Пункты: 474
Регистрация: 07.11.2017
Ну и последний пятый опыт. Резистор на 5.20. После сброса системы запускаю программу, которая выставляет выходы в 1. Они выставляются.
Даю команду записи в SPI, выход 5.20 переходит в низкий уровень.
Переставляю резистор на 5.19, запускаю программу, которая выставляет выходы в 1. Выход 5.20 выставляется в 1, 5.19 уже был выставлен и не меняется.
Даю команду записи в SPI, выход 5.20 переходит в низкий уровень, не смотря на то что резистора нет. Выход 5.19 с резистором в высоком уровне, на него SPI перестал действовать.
Через sysfs сбрасываю выход 5.19 в 0. Резистор по прежнему на 5.19. Запускаю программу, которая выставляет выходы в 1. Они выставляются. Даю команду записи в SPI. Оба выхода в нуле.
Такое ощущение, что в момент перевода состояния выхода с 0 в 1 контроллер ощущает нагрузку, система запоминает это состояние и в дальнейшем его использует.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux