Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ Linux _ прерывания в embedded linux

Автор: winniethepooh Oct 16 2017, 13:57

Здравствуйте.
Есть статья http://electronix.ru/redirect.php?http://derekmolloy.ie/kernel-gpio-programming-buttons-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 сильно не помог)

спасибо.

Автор: x893 Oct 16 2017, 14:05

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


Автор: winniethepooh Oct 16 2017, 14:13

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

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

Автор: x893 Oct 16 2017, 14:36

Так надо в этом направлении копать.
Более того всё коды открыты - можно посмотреть.

Автор: Jury093 Oct 17 2017, 07:33

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

попробуйте для начала вместо загрузки этого модуля взять на ручное управление пин, который вы хотите задействовать под кнопку..
по вами приведенной ссылке есть пример через echo NN > export
если этой ветки в ядре нет, то ваше ядро не поддерживает функции работы с gpio
если ветка есть, но команда возвращает ошибку, то пин занят ядром и вам будет не доступен
если команда отработала без ошибок то должен появится gpioNN
внутри смотрите содержимое direction д.б. in
тогда при ненажатой кнопке смотрите value, д.б. одно значение, при нажатой будет другое
если это не происходит, то вы ошиблись между NN и физическим контактом, или неисправна цепь вашей кнопки

Автор: aaarrr Oct 17 2017, 08:11

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

Не такой: gpio_to_irq возвращает -ENXIO (No such device or address). Для этого вывода вообще прерывание предусмотрено?

Автор: winniethepooh Oct 17 2017, 08:22

Цитата(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) - на этот порт мне нужно ловить внешнее прерывание.

Автор: aaarrr Oct 17 2017, 08:37

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

Похоже, что в драйверах gpio для вашего процессора просто не реализована поддержка прерываний.

Автор: winniethepooh Oct 17 2017, 08:45

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


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

Автор: aaarrr Oct 17 2017, 08:54

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

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

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

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

Автор: winniethepooh Oct 17 2017, 09:02

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

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


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



спасибо.


Автор: Jury093 Oct 17 2017, 10:38

Цитата(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, если это так, то там проблем быть не должно..

Автор: winniethepooh Oct 17 2017, 11:28

Цитата(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.

Автор: winniethepooh Oct 17 2017, 12:32

Спасибо за GPIOLIB Jury093.
Покопаю в этом направлении...

Автор: Jury093 Oct 17 2017, 15:05

Цитата(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 прописаны у вас видно только вам, равно как название АРМа, платы, версия ядра и тыпы

Автор: winniethepooh Oct 17 2017, 16:09

Цитата(Jury093 @ Oct 17 2017, 15:05) *
проще сразу в исходниках ядра прописать нужные пины, сигналы и режимы, тогда не придется по каждому чиху плодить такие костыли..
впрочем, на том же 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 прописаны у вас видно только вам, равно как название АРМа, платы, версия ядра и тыпы


пины у меня прописаны верно (функция gpio_request и др. выбирают и настраивают нормально), а
вот писать костыли нормально пока опыта не хватает..

у вас прерывание смапилось (-была готова структура gpio_chip в вашем файле gpio.c у меня там заглушки возвращающие EINVAL)
нормальных примеров под мой арм ( cortex-fm3) я не смог найти, в тех что нашел пока не разобрался.
меня интересует в данный момент как привязать к моей структуре gpio_chip прерывания и как настроить NVIC.
Для моего арма номера прерываний выглядят так
EXINT0_7_IRQn = 4, /* External Interrupt Request ch.0 to ch.7 */
EXINT8_31_IRQn = 5, /* External Interrupt Request ch.8 to ch.31 */
для моей ос uClinux 2.6 номера прерываний поменяются? и что с приоритетами и где это происходит?

Автор: Jury093 Oct 17 2017, 18:20

Цитата(winniethepooh @ Oct 17 2017, 19:09) *
для моей ос uClinux 2.6 номера прерываний поменяются? и что с приоритетами и где это происходит?

ох ёлки! вы бы в начальном сообщение написали, что у вас uClinux - всё что я вам написал забудьте, я про uclinux ничего не знаю

Автор: aaarrr Oct 17 2017, 20:28

Если речь идет об http://electronix.ru/redirect.php?https://github.com/fm3fan/uClinux/blob/master/arch/arm/mach-fm3/gpio.c, то прерываниями тут и не пахнет, увы.

Автор: winniethepooh Oct 18 2017, 06:49

Цитата(aaarrr @ Oct 17 2017, 21:28) *
Если речь идет об http://electronix.ru/redirect.php?https://github.com/fm3fan/uClinux/blob/master/arch/arm/mach-fm3/gpio.c, то прерываниями тут и не пахнет, увы.


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

Автор: Tarbal Oct 19 2017, 01:59

Цитата(winniethepooh @ Oct 16 2017, 17:57) *
Здравствуйте.
Есть статья http://electronix.ru/redirect.php?http://derekmolloy.ie/kernel-gpio-programming-buttons-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 сильно не помог)

спасибо.


У вас две ошибки - числа со знаком минус: 6 и 22.
Здесь проверяем что они означают и ищем как решить проблему:
http://electronix.ru/redirect.php?http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html

Автор: winniethepooh Oct 19 2017, 09:28

Цитата(Tarbal @ Oct 19 2017, 01:59) *
У вас две ошибки - числа со знаком минус: 6 и 22.
Здесь проверяем что они означают и ищем как решить проблему:
http://electronix.ru/redirect.php?http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html


да я это уже понял (это заглушки возвращают).
Спасибо.

Автор: Tarbal Oct 20 2017, 00:31

Цитата(winniethepooh @ Oct 19 2017, 13:28) *
да я это уже понял (это заглушки возвращают).
Спасибо.


Вполне может быть, что вы пытаетесь подключить обработчик к тому источнику, который не поддержан железом.
У вас есть код ядра для этой машины?


Автор: winniethepooh Oct 20 2017, 07:06

Цитата(Tarbal @ Oct 20 2017, 00:31) *
Вполне может быть, что вы пытаетесь подключить обработчик к тому источнику, который не поддержан железом.
У вас есть код ядра для этой машины?


код ядра http://electronix.ru/redirect.php?https://github.com/fm3fan/uClinux

источником может служить любой вывод обозначенный как INTxx_x/Pxx ()

Автор: Tarbal Oct 21 2017, 03:36

Цитата(winniethepooh @ Oct 20 2017, 11:06) *
код ядра http://electronix.ru/redirect.php?https://github.com/fm3fan/uClinux

источником может служить любой вывод обозначенный как INTxx_x/Pxx ()



Где обозначенный? В справочном материале по процессору?
У вас есть справочные материалы по процессору? Есть разные процессоры в каждом это все очень индивидуально.

Какой номер прерывания вы используете?

Его видно в псевдо файл /proc/interrupts ?

А этот документ читали (если ядро < 3, то не надо)?
http://electronix.ru/redirect.php?http://elixir.free-electrons.com/linux/v4.9/source/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt

Ваше устройство здесь описано (если ядро < 3, то не надо)?
Это самый будет точный документ по теме.
http://electronix.ru/redirect.php?http://elixir.free-electrons.com/linux/v4.9/source/Documentation/devicetree/bindings/interrupt-controller

Поищите в вашем ядре документы на тему:
http://electronix.ru/redirect.php?https://github.com/fm3fan/uClinux/tree/master/Documentation

В дереве устройств ваше прерывание отражено? На самом деле я не знаю этих деталей (знал бы -- сказал бы), а разбираться некогда. Приспичит тогда и разберусь, но пока не приспичило. Если у вас сесть желание найти самому, то я помогу вам выбрать направление.

Посмотрел внимательно на ваше ядро. Оно 2.6?
Там совсем другой подход.
Возможно надо структуру устройства создать в файле устройства и зарегистрировать. Посмотрел исходники с которых вы начали и вернулся дописать. Поскольку в них нет функции probe, то структуры устройства создавать не нужно.

1. Какой у вас процессор?
2. Постройте ядро. Что дает команда в строке ниже, исполненная в корне исходников ядра (там где вы запускали команду строить ядро).
find arch -name \* | grep *o$

Автор: winniethepooh Oct 23 2017, 08:41

Цитата(Tarbal @ Oct 21 2017, 03:36) *
Где обозначенный? В справочном материале по процессору?
У вас есть справочные материалы по процессору? Есть разные процессоры в каждом это все очень индивидуально.

Какой номер прерывания вы используете?

Его видно в псевдо файл /proc/interrupts ?


да справочный материал по проц. я читал (вот ссылочка на datasheet http://electronix.ru/redirect.php?http://www.cypress.com/file/252811/download).
в h файле для моего девайса номер прерывания для ножки (INT28_0/P5C) EXINT8_31_IRQn = 5, /* External Interrupt Request ch.8 to ch.31 */
нет в псевдо файле /proc/interrupts его нет.

Цитата(Tarbal @ Oct 21 2017, 03:36) *
Ваше устройство здесь описано (если ядро < 3, то не надо)?
Это самый будет точный документ по теме.
http://electronix.ru/redirect.php?http://elixir.free-electrons.com/linux/v4.9/source/Documentation/devicetree/bindings/interrupt-controller


спасибо за ссылки..

Цитата(Tarbal @ Oct 21 2017, 03:36) *
В дереве устройств ваше прерывание отражено? На самом деле я не знаю этих деталей (знал бы -- сказал бы), а разбираться некогда. Приспичит тогда и разберусь, но пока не приспичило. Если у вас сесть желание найти самому, то я помогу вам выбрать направление.


насколько я понимаю дерево можно увидеть в файле *.dts
вот только для моей системы такого файла нет..
каким образом linux переопределяет "железные прерывания" в свои собственные (как изменяются номера)?

Цитата(Tarbal @ Oct 21 2017, 03:36) *
1. Какой у вас процессор?
2. Постройте ядро. Что дает команда в строке ниже, исполненная в корне исходников ядра (там где вы запускали команду строить ядро).
find arch -name \* | grep *o$


команды find мой бизибокс не знает, но из загрузчика

U-Boot 2010.03 (29 2017 - 10:20:30)

CPU : Fujitsu FM3 series (Cortex-M3)
Board: MyBorad NO SERIAL
Please set serial number
I2C: ready
DRAM: 16 MB
Flash: 4 MB
*** Warning - bad CRC, using default environment

In: serial
Out: serial
Err: serial
Net: fm3_eth
Hit any key to stop autoboot: 0
## Booting kernel from Legacy Image at 61000000 ...
Image Name: Linux-2.6.33-arm1
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1719520 Bytes = 1.6 MB
Load Address: 60008000
Entry Point: 60008001
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK

Starting kernel ...

Linux version 2.6.33-arm1 (user@user-VirtualBox) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-189) ) #1 Mon Oct 16 13:22:25 MSK 2017
CPU: ARMv7-M Processor [412fc231] revision 1 (ARMv7M)
CPU: NO data cache, NO instruction cache
Machine: Fujitsu FM3

спасибо.

Автор: Tarbal Oct 24 2017, 00:18

Вы ядро строите на той же системе?
Обычно то где строят ядро не использует бизибокс.

Очень важный вопрос: Вы ядро строить можете?

Для ядра 2.6 мои ссылки не годятся там нет дерева устройств. Я же написал для ядра больше 3.
К тому же никаких определений в файле устройства (что было до дерева устройств) делать не надо.

Надо от первой ошибки начать.

irqNumber = gpio_to_irq(gpioButton);
Возврашает ошибку 6 по ссылке, что я вам дал это (ENXIO)

это
http://electronix.ru/redirect.php?http://elixir.free-electrons.com/linux/v3.4/source/arch/alpha/include/asm/gpio.h#L43

static inline int gpio_to_irq(unsigned int gpio)
{
return __gpio_to_irq(gpio);
}
вызывает
int __gpio_to_irq(unsigned gpio)
{
struct gpio_chip *chip;

chip = gpio_to_chip(gpio);
return chip->to_irq ? chip->to_irq(chip, gpio - chip->base) : -ENXIO;
}

использует
/* caller holds gpio_lock *OR* gpio is marked as requested */
struct gpio_chip *gpio_to_chip(unsigned gpio)
{
return gpio_desc[gpio].chip;
}


В вашем ядре gpio_desc[gpio].chip->to_irq для используемого вами gpio установлено на NULL.

Дальше дергаться бессмысленно.
Надо починить сначала это.

Найдите в вашем ядре код должен быть похожим на то, что я нашел на бесплатных электронах (free-electrons).

Автор: winniethepooh Oct 24 2017, 07:59

Цитата(Tarbal @ Oct 24 2017, 00:18) *
Вы ядро строите на той же системе?
Обычно то где строят ядро не использует бизибокс.

Очень важный вопрос: Вы ядро строить можете?


да, ядро строится на ubuntu (запущена на virtualbox)

Цитата(Tarbal @ Oct 24 2017, 00:18) *
Для ядра 2.6 мои ссылки не годятся там нет дерева устройств. Я же написал для ядра больше 3.
К тому же никаких определений в файле устройства (что было до дерева устройств) делать не надо.


в моей системе нет файла arch/arm/boot/dts я вас правильно понял?


Цитата(Tarbal @ Oct 24 2017, 00:18) *
Надо от первой ошибки начать.

irqNumber = gpio_to_irq(gpioButton);
Возврашает ошибку 6 по ссылке, что я вам дал это (ENXIO)

это
http://electronix.ru/redirect.php?http://elixir.free-electrons.com/linux/v3.4/source/arch/alpha/include/asm/gpio.h#L43

static inline int gpio_to_irq(unsigned int gpio)
{
return __gpio_to_irq(gpio);
}
вызывает
int __gpio_to_irq(unsigned gpio)
{
struct gpio_chip *chip;

chip = gpio_to_chip(gpio);
return chip->to_irq ? chip->to_irq(chip, gpio - chip->base) : -ENXIO;
}

использует
/* caller holds gpio_lock *OR* gpio is marked as requested */
struct gpio_chip *gpio_to_chip(unsigned gpio)
{
return gpio_desc[gpio].chip;
}


В вашем ядре gpio_desc[gpio].chip->to_irq для используемого вами gpio установлено на NULL.

Дальше дергаться бессмысленно.
Надо починить сначала это.

Найдите в вашем ядре код должен быть похожим на то, что я нашел на бесплатных электронах (free-electrons).


да согласен с вами, пожалуй добавлю что можно просто сказать - контроллер прерываний (железный) должен быть настроен
на внешние прерывания и умел сказать программному контроллеру (в линукс) какой обработчик для данного gpio вызвать.
задача раскладывается на
1 настроить gpio (это уже может делать для меня интерфейс sysfs, частично);
2 настроить железный контроллер прерываний;
3 зарегистрировать данное прерывание в линукс и добавить обработчик;
я что то упустил?

Автор: Tarbal Oct 25 2017, 01:03

Цитата(winniethepooh @ Oct 24 2017, 11:59) *
в моей системе нет файла arch/arm/boot/dts я вас правильно понял?
Да



да согласен с вами, пожалуй добавлю что можно просто сказать - контроллер прерываний (железный) должен быть настроен
на внешние прерывания и умел сказать программному контроллеру (в линукс) какой обработчик для данного gpio вызвать.
задача раскладывается на
1 настроить gpio (это уже может делать для меня интерфейс sysfs, частично);
2 настроить железный контроллер прерываний;
3 зарегистрировать данное прерывание в линукс и добавить обработчик;
я что то упустил?



Вы можете напечатать на системном терминале при помощи строки
printk(KERN_ERR "", ...)

/* caller holds gpio_lock *OR* gpio is marked as requested */
struct gpio_chip *gpio_to_chip(unsigned gpio)
{
return gpio_desc[gpio].chip;
}
станет

/* caller holds gpio_lock *OR* gpio is marked as requested */
struct gpio_chip *gpio_to_chip(unsigned gpio)
{
printk(KERN_ERR "WINNIE %d %p \n", gpio, gpio_desc[gpio].chip);
return gpio_desc[gpio].chip;
}

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

Если нет терминала, пользуйтесь командой
dmesg

после установки вашего модуля

Команда find, которой вы не нашли в вашей сыстемы не для нее, а для Убунту машины и запускать надо ее в корне директории исходников ядра.Там где запускают команду компиляции и т.д.. Не исключено, что в вашем файле устройства или около находится конфигурация пинов.


код взят отсюда:
http://electronix.ru/redirect.php?http://elixir.free-electrons.com/linux/v3.4/source/drivers/gpio/gpiolib.c#L119
строка 119.

Найдите это место в вашем ядре.

Автор: winniethepooh Oct 25 2017, 14:22

Цитата(Tarbal @ Oct 25 2017, 02:03) *
Вы можете напечатать на системном терминале при помощи строки
printk(KERN_ERR "", ...)

/* caller holds gpio_lock *OR* gpio is marked as requested */
struct gpio_chip *gpio_to_chip(unsigned gpio)
{
return gpio_desc[gpio].chip;
}
станет

/* caller holds gpio_lock *OR* gpio is marked as requested */
struct gpio_chip *gpio_to_chip(unsigned gpio)
{
printk(KERN_ERR "WINNIE %d %p \n", gpio, gpio_desc[gpio].chip);
return gpio_desc[gpio].chip;
}

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


вот результат для измененной функции gpio_to_chip после установки нашего модуля:

GPIO_TEST: Initializing the GPIO_TEST LKM
WINNIE 58 601a2cc0
WINNIE 58 601a2cc0
WINNIE 58 601a2cc0
WINNIE 92 601a2cc0
WINNIE 92 601a2cc0
WINNIE 92 601a2cc0
(тут два ножки с номерами 58 и 92 и видимо их адреса, непонятно почему одинаковые?)

Цитата(Tarbal @ Oct 25 2017, 02:03) *
Команда find, которой вы не нашли в вашей системы не для нее, а для Убунту машины и запускать надо ее в корне директории исходников ядра.Там где запускают команду компиляции и т.д.. Не исключено, что в вашем файле устройства или около находится конфигурация пинов.


команда find arch -name \* | grep *o$ ничего не возвращает (я не понимаю что она вообще должна была вернуть?!)
конфигурация пинов находится в файле gpio.c в каталоге для моего устройства.

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

Автор: Tarbal Oct 25 2017, 23:35

Цитата(winniethepooh @ Oct 25 2017, 18:22) *
команда find arch -name \* | grep *o$ ничего не возвращает (я не понимаю что она вообще должна была вернуть?!)

find arch -name \* | grep *o$ ищет объектные файлы, оставшиеся после компиляции. Они помогут нам найти какие файлы использованы в вашем устройстве, что облегчит поиск нужных исходников Если вы не компилировали ядро перед поиском, то объектных файлов не будет.
Самоуверенность меня сгубила. Я не проверил ибо был уверен, что сработает
Вот так будет работать:
find arch -name \* | grep '\.o$'

Цитата(winniethepooh @ Oct 25 2017, 18:22) *
простите за тупость вы мне пытаетесь общие методы решения проблемы показать или вы уже знаете что и где необходимо сделать для решения этой задачи?
спасибо.


Ответа не знаю. Я удаленно отлаживаю как делал бы сам если бы имел такую проблему. Поскольку нет никого кто знает ответ это самый лучший вариант.

Адрес один и тот же означает, что структура chip, к которой принадлежат пины одна и та же. Это нормально. Меня интересовало оно равно или не равно нулю.
Теперь мне неясно отчего возвращается ошибка 6. Если вы добавите принтов и установите причину, то у вас появится путь решения вашей задачи. Я раньше приводил коды других функций, которые вызывают ту где вы добавили принт. Надо в них добавить принты, чтобы установить причину.
Искать где что находится удобно на том сайте, что я вам давал.

Допустим надо найти в исходниках gpio_chip
Это можно искать командой

grep -rn gpio_chip .

Команду запускать в корне дерева исходников. если вы знаете директорию поиска, то напишите ее вместо точки.

Автор: aaarrr Oct 26 2017, 00:13

Цитата(winniethepooh @ Oct 25 2017, 17:22) *
что и где необходимо сделать для решения этой задачи?

winniethepooh, в http://electronix.ru/redirect.php?https://electronix.ru/forum/index.php?s=&showtopic=144099&view=findpost&p=1524609 приведена ссылка на текущую реализацию драйвера GPIO вашего процессора.
Как можно видеть, никакой поддержки прерываний она не содержит.

Если побродить по исходникам для других архитектур, можно найти http://electronix.ru/redirect.php?https://github.com/fm3fan/uClinux/blob/master/arch/arm/mach-kinetis/gpio.c.

Довести первое до состояние второго можно, но это явно не та задача, с которой стоит начинать знакомство с kernel development.

Автор: winniethepooh Oct 26 2017, 09:01

Цитата(aaarrr @ Oct 26 2017, 01:13) *
winniethepooh, в http://electronix.ru/redirect.php?https://electronix.ru/forum/index.php?s=&showtopic=144099&view=findpost&p=1524609 приведена ссылка на текущую реализацию драйвера GPIO вашего процессора.
Как можно видеть, никакой поддержки прерываний она не содержит.

Если побродить по исходникам для других архитектур, можно найти http://electronix.ru/redirect.php?https://github.com/fm3fan/uClinux/blob/master/arch/arm/mach-kinetis/gpio.c.

Довести первое до состояние второго можно, но это явно не та задача, с которой стоит начинать знакомство с kernel development.

спасибо aaarrr за ссылку.
если бы это была та задача, я бы не стал беспокоить участников этого форума..
но раз ужа так сложилось, спасибо всем еще раз.

Автор: winniethepooh Oct 26 2017, 11:09

Цитата(Tarbal @ Oct 26 2017, 00:35) *
Теперь мне неясно отчего возвращается ошибка 6. Если вы добавите принтов и установите причину, то у вас появится путь решения вашей задачи. Я раньше приводил коды других функций, которые вызывают ту где вы добавили принт. Надо в них добавить принты, чтобы установить причину.


добавил принт в функцию (в том же файле gpiolib.c)
int __gpio_to_irq(unsigned gpio)
{
struct gpio_chip *chip;

chip = gpio_to_chip(gpio);
return chip->to_irq ? chip->to_irq(chip, gpio - chip->base) : -ENXIO;
}
где
-ENXIO=-6




Автор: Tarbal Oct 26 2017, 12:55

Цитата(winniethepooh @ Oct 26 2017, 15:09) *
добавил принт в функцию (в том же файле gpiolib.c)
int __gpio_to_irq(unsigned gpio)
{
struct gpio_chip *chip;

chip = gpio_to_chip(gpio);
return chip->to_irq ? chip->to_irq(chip, gpio - chip->base) : -ENXIO;
}
где
-ENXIO=-6



Я не проверив, предложил проверить значение chip, а не chip->to_irq, которое равно нулю и приводит к ошибке. Это то, что мне было неясно. Если chip->to_irq равен нулю, то ваша задача будет невыполнима. Похоже прерывание не поддерживается. Ищите как изменить ситуацию.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)