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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> прерывания в embedded linux, прерывание button -> led
winniethepooh
сообщение Oct 16 2017, 13:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995



Здравствуйте.
Есть статья http://derekmolloy.ie/kernel-gpio-programm...ttons-and-leds/
пытаюсь повторить (первый пример с кнопкой и ледом) на arm с результатом:

# insmod ./gpio.ko
GPIO_TEST: Initializing the GPIO_TEST LKM
GPIO_TEST: The button state is currently: 1
GPIO_TEST: The button is mapped to IRQ: -6
GPIO_TEST: The interrupt request result is: -22
insmod: can't insert './gpio.ko': Invalid argument

система явно не настроена ловить gpio прерывания, но может вкл и выкл led.
представляю как можно настроить ножку на прерывание в "голой системе",
но как это сделать под linux или что почитать?(google сильно не помог)

спасибо.
Go to the top of the page
 
+Quote Post
x893
сообщение Oct 16 2017, 14:05
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



обработчик появляется в /proc/interrupts ?
хотя там расписано всё в деталях где смотреть и что происходит.

Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 16 2017, 14:13
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995



Цитата(x893 @ Oct 16 2017, 14:05) *
обработчик появляется в /proc/interrupts ?
хотя там расписано всё в деталях где смотреть и что происходит.

нет не появляется. уверен что из -за функции request_irq которая возвращает отрицательное значение все накрывается..
номер прерывание тоже какой то не такой.
без регистрации прерывания пример вполне работоспособен.

Сообщение отредактировал winniethepooh - Oct 16 2017, 14:14
Go to the top of the page
 
+Quote Post
x893
сообщение Oct 16 2017, 14:36
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Так надо в этом направлении копать.
Более того всё коды открыты - можно посмотреть.
Go to the top of the page
 
+Quote Post
Jury093
сообщение Oct 17 2017, 07:33
Сообщение #5


Знающий
****

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



Цитата(winniethepooh @ Oct 16 2017, 16:57) *
система явно не настроена ловить gpio прерывания, но может вкл и выкл led.
представляю как можно настроить ножку на прерывание в "голой системе",
но как это сделать под linux или что почитать?(google сильно не помог)

попробуйте для начала вместо загрузки этого модуля взять на ручное управление пин, который вы хотите задействовать под кнопку..
по вами приведенной ссылке есть пример через echo NN > export
если этой ветки в ядре нет, то ваше ядро не поддерживает функции работы с gpio
если ветка есть, но команда возвращает ошибку, то пин занят ядром и вам будет не доступен
если команда отработала без ошибок то должен появится gpioNN
внутри смотрите содержимое direction д.б. in
тогда при ненажатой кнопке смотрите value, д.б. одно значение, при нажатой будет другое
если это не происходит, то вы ошиблись между NN и физическим контактом, или неисправна цепь вашей кнопки
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2017, 08:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(winniethepooh @ Oct 16 2017, 17:13) *
номер прерывание тоже какой то не такой.

Не такой: gpio_to_irq возвращает -ENXIO (No such device or address). Для этого вывода вообще прерывание предусмотрено?
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 17 2017, 08:22
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995



Цитата(Jury093 @ Oct 17 2017, 08:33) *
попробуйте для начала вместо загрузки этого модуля взять на ручное управление пин, который вы хотите задействовать под кнопку..
по вами приведенной ссылке есть пример через echo NN > export
если этой ветки в ядре нет, то ваше ядро не поддерживает функции работы с gpio
если ветка есть, но команда возвращает ошибку, то пин занят ядром и вам будет не доступен
если команда отработала без ошибок то должен появится gpioNN
внутри смотрите содержимое direction д.б. in
тогда при ненажатой кнопке смотрите value, д.б. одно значение, при нажатой будет другое
если это не происходит, то вы ошиблись между NN и физическим контактом, или неисправна цепь вашей кнопки


уже попробовал (управление ледом).
и в ручном управлении и в драйвере функции
pio_direction_output gpio_set_value gpio_export работают (есть управление ледом)
не работает функция request_irq (возвращает отрицательное значение)
и функция мапинга прерывания на gpio gpio_to_irq так же не работает.

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


Цитата(aaarrr @ Oct 17 2017, 09:11) *
Не такой: gpio_to_irq возвращает -ENXIO (No such device or address). Для этого вывода вообще прерывание предусмотрено?


да предусмотрено (int28_0/P5C) - на этот порт мне нужно ловить внешнее прерывание.

Сообщение отредактировал winniethepooh - Oct 17 2017, 08:27
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2017, 08:37
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(winniethepooh @ Oct 17 2017, 11:22) *
да предусмотрено (int28_0/P5C) - на этот порт мне нужно ловить внешнее прерывание.

Похоже, что в драйверах gpio для вашего процессора просто не реализована поддержка прерываний.
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 17 2017, 08:45
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995



Цитата(aaarrr @ Oct 17 2017, 09:37) *
Похоже, что в драйверах gpio для вашего процессора просто не реализована поддержка прерываний.


как это проверить?
если так то выход?

Сообщение отредактировал winniethepooh - Oct 17 2017, 08:46
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2017, 08:54
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(winniethepooh @ Oct 17 2017, 11:45) *
как это проверить?

Посмотреть исходники драйверов - /drivers/gpio/gpio-секретного-процессора.c

Цитата(winniethepooh @ Oct 17 2017, 11:45) *
если так то выход?

Нагуглить что-то более свежее или дописать самостоятельно.
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 17 2017, 09:02
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995



Цитата(aaarrr @ Oct 17 2017, 09:54) *
Посмотреть исходники драйверов - /drivers/gpio/gpio-секретного-процессора.c

процессор arm (fm3)


Нагуглить что-то более свежее или дописать самостоятельно.



спасибо.

Go to the top of the page
 
+Quote Post
Jury093
сообщение Oct 17 2017, 10:38
Сообщение #12


Знающий
****

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



Цитата(winniethepooh @ Oct 17 2017, 11:45) *
как это проверить?
если так то выход?

я правильно понял - вы сначала на пин прицепили светодиод (с резистором надеюсь), им поуправляли, а потом вместо светика подключили кнопку и пытаетесь с ней работать?
из юзерспейса я с прерываниями не работал, но по идее у вас в конфиге ядра д.б. разрешен пункт GPIOLIB:
Код
root@arm9m10:~# zcat /proc/config.gz |grep GPIO
CONFIG_GENERIC_GPIO=y
# CONFIG_GPIO_PCA953X is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not set
CONFIG_ARCH_NR_GPIO=0
# CONFIG_MTD_NAND_GPIO is not set
# CONFIG_MDIO_BUS_MUX_GPIO is not set
CONFIG_KEYBOARD_GPIO=y
# CONFIG_MOUSE_GPIO is not set
CONFIG_I2C_GPIO=y
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y


Цитата(aaarrr @ Oct 17 2017, 11:54) *
Посмотреть исходники драйверов - /drivers/gpio/gpio-секретного-процессора.c

с большой долей вероятности у скромного ТС какой-нить BBB на am3359, если это так, то там проблем быть не должно..
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 17 2017, 11:28
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995



Цитата(Jury093 @ Oct 17 2017, 10:38) *
я правильно понял - вы сначала на пин прицепили светодиод (с резистором надеюсь), им поуправляли, а потом вместо светика подключили кнопку и пытаетесь с ней работать?
из юзерспейса я с прерываниями не работал, но по идее у вас в конфиге ядра д.б. разрешен пункт GPIOLIB:
Код
root@arm9m10:~# zcat /proc/config.gz |grep GPIO
CONFIG_GENERIC_GPIO=y
# CONFIG_GPIO_PCA953X is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not set
CONFIG_ARCH_NR_GPIO=0
# CONFIG_MTD_NAND_GPIO is not set
# CONFIG_MDIO_BUS_MUX_GPIO is not set
CONFIG_KEYBOARD_GPIO=y
# CONFIG_MOUSE_GPIO is not set
CONFIG_I2C_GPIO=y
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y



с большой долей вероятности у скромного ТС какой-нить BBB на am3359, если это так, то там проблем быть не должно..


мой конфиг

CONFIG_PPS is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y

PPS support
#
# CONFIG_PPS is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y

я правильно понял - вы сначала на пин прицепили светодиод (с резистором надеюсь), им поуправляли, а потом вместо светика подключили кнопку и пытаетесь с ней работать?

нет для моргания я использовал другой порт, но светодиод последовательно с резистором.
необходимо быстро реагировать на внешние сигналы, поэтому пришлось отказаться от userspace.
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 17 2017, 12:32
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995



Спасибо за GPIOLIB Jury093.
Покопаю в этом направлении...
Go to the top of the page
 
+Quote Post
Jury093
сообщение Oct 17 2017, 15:05
Сообщение #15


Знающий
****

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



Цитата(winniethepooh @ Oct 17 2017, 14:28) *
нет для моргания я использовал другой порт, но светодиод последовательно с резистором.
необходимо быстро реагировать на внешние сигналы, поэтому пришлось отказаться от userspace.

проще сразу в исходниках ядра прописать нужные пины, сигналы и режимы, тогда не придется по каждому чиху плодить такие костыли..
впрочем, на том же BB/BBB можно даже pwm запустить на штатном ядре посредством echo..

по делу - взял сорц г-на по ссылке выше, прописал два "левых" gpio, собрал, гружу, в логе:
Код
GPIO_TEST: Initializing the GPIO_TEST LKM
PM: Adding info for No Bus:gpio81
PM: Adding info for No Bus:gpio80
GPIO_TEST: The button state is currently: 0
GPIO_TEST: The button is mapped to IRQ: 240
GPIO_TEST: The interrupt request result is: 0
root@dm8148:~/src/gpio-test#

причем модуль успешно отобрал у ядра пин под светодиод (LED2) и накрутил свои настройки (а он мне ночью коридор подсвечивает по расписанию)

какие gpio прописаны у вас видно только вам, равно как название АРМа, платы, версия ядра и тыпы
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 08:46
Рейтинг@Mail.ru


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