|
|
|
прерывания в embedded linux, прерывание button -> led |
|
|
|
Oct 17 2017, 16:09
|
Участник
Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995
|
Цитата(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 номера прерываний поменяются? и что с приоритетами и где это происходит?
Сообщение отредактировал winniethepooh - Oct 17 2017, 16:11
|
|
|
|
|
Oct 18 2017, 06:49
|
Участник
Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995
|
Цитата(aaarrr @ Oct 17 2017, 21:28) Если речь идет об этом продукте, то прерываниями тут и не пахнет, увы. да все так, но у kintis есть пример реализации gpio прерываний, посмотрим что получится..
|
|
|
|
|
Oct 19 2017, 01:59
|
Профессионал
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439
|
Цитата(winniethepooh @ Oct 16 2017, 17:57) Здравствуйте. Есть статья 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 сильно не помог) спасибо. У вас две ошибки - числа со знаком минус: 6 и 22. Здесь проверяем что они означают и ищем как решить проблему: http://www-numi.fnal.gov/offline_software/...tem_errors.html
|
|
|
|
|
Oct 19 2017, 09:28
|
Участник
Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995
|
Цитата(Tarbal @ Oct 19 2017, 01:59) У вас две ошибки - числа со знаком минус: 6 и 22. Здесь проверяем что они означают и ищем как решить проблему: http://www-numi.fnal.gov/offline_software/...tem_errors.htmlда я это уже понял (это заглушки возвращают). Спасибо.
|
|
|
|
|
Oct 20 2017, 07:06
|
Участник
Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995
|
Цитата(Tarbal @ Oct 20 2017, 00:31) Вполне может быть, что вы пытаетесь подключить обработчик к тому источнику, который не поддержан железом. У вас есть код ядра для этой машины? код ядра https://github.com/fm3fan/uClinuxисточником может служить любой вывод обозначенный как INTxx_x/Pxx ()
|
|
|
|
|
Oct 21 2017, 03:36
|
Профессионал
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439
|
Цитата(winniethepooh @ Oct 20 2017, 11:06) код ядра https://github.com/fm3fan/uClinuxисточником может служить любой вывод обозначенный как INTxx_x/Pxx () Где обозначенный? В справочном материале по процессору? У вас есть справочные материалы по процессору? Есть разные процессоры в каждом это все очень индивидуально. Какой номер прерывания вы используете? Его видно в псевдо файл /proc/interrupts ? А этот документ читали (если ядро < 3, то не надо)? http://elixir.free-electrons.com/linux/v4..../interrupts.txtВаше устройство здесь описано (если ядро < 3, то не надо)? Это самый будет точный документ по теме. http://elixir.free-electrons.com/linux/v4....rupt-controllerПоищите в вашем ядре документы на тему: https://github.com/fm3fan/uClinux/tree/master/DocumentationВ дереве устройств ваше прерывание отражено? На самом деле я не знаю этих деталей (знал бы -- сказал бы), а разбираться некогда. Приспичит тогда и разберусь, но пока не приспичило. Если у вас сесть желание найти самому, то я помогу вам выбрать направление. Посмотрел внимательно на ваше ядро. Оно 2.6? Там совсем другой подход. Возможно надо структуру устройства создать в файле устройства и зарегистрировать. Посмотрел исходники с которых вы начали и вернулся дописать. Поскольку в них нет функции probe, то структуры устройства создавать не нужно. 1. Какой у вас процессор? 2. Постройте ядро. Что дает команда в строке ниже, исполненная в корне исходников ядра (там где вы запускали команду строить ядро). find arch -name \* | grep *o$
|
|
|
|
|
Oct 23 2017, 08:41
|
Участник
Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995
|
Цитата(Tarbal @ Oct 21 2017, 03:36) Где обозначенный? В справочном материале по процессору? У вас есть справочные материалы по процессору? Есть разные процессоры в каждом это все очень индивидуально.
Какой номер прерывания вы используете?
Его видно в псевдо файл /proc/interrupts ? да справочный материал по проц. я читал (вот ссылочка на datasheet 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://elixir.free-electrons.com/linux/v4....rupt-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 спасибо.
Сообщение отредактировал winniethepooh - Oct 23 2017, 08:45
|
|
|
|
|
Oct 24 2017, 00:18
|
Профессионал
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439
|
Вы ядро строите на той же системе? Обычно то где строят ядро не использует бизибокс. Очень важный вопрос: Вы ядро строить можете? Для ядра 2.6 мои ссылки не годятся там нет дерева устройств. Я же написал для ядра больше 3. К тому же никаких определений в файле устройства (что было до дерева устройств) делать не надо. Надо от первой ошибки начать. irqNumber = gpio_to_irq(gpioButton); Возврашает ошибку 6 по ссылке, что я вам дал это (ENXIO) это http://elixir.free-electrons.com/linux/v3..../asm/gpio.h#L43static 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).
|
|
|
|
|
Oct 24 2017, 07:59
|
Участник
Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995
|
Цитата(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://elixir.free-electrons.com/linux/v3..../asm/gpio.h#L43static 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 зарегистрировать данное прерывание в линукс и добавить обработчик; я что то упустил?
Сообщение отредактировал winniethepooh - Oct 24 2017, 08:05
|
|
|
|
|
Oct 25 2017, 01:03
|
Профессионал
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439
|
Цитата(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://elixir.free-electrons.com/linux/v3..../gpiolib.c#L119строка 119. Найдите это место в вашем ядре.
|
|
|
|
|
Oct 25 2017, 14:22
|
Участник
Группа: Участник
Сообщений: 68
Регистрация: 3-06-15
Пользователь №: 86 995
|
Цитата(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 в каталоге для моего устройства. простите за тупость вы мне пытаетесь общие методы решения проблемы показать или вы уже знаете что и где необходимо сделать для решения этой задачи? спасибо.
Сообщение отредактировал winniethepooh - Oct 25 2017, 14:28
|
|
|
|
|
Oct 25 2017, 23:35
|
Профессионал
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439
|
Цитата(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 . Команду запускать в корне дерева исходников. если вы знаете директорию поиска, то напишите ее вместо точки.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|