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

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


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Jury093
сообщение Oct 17 2017, 18:20
Сообщение #17


Знающий
****

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



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

ох ёлки! вы бы в начальном сообщение написали, что у вас uClinux - всё что я вам написал забудьте, я про uclinux ничего не знаю
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2017, 20:28
Сообщение #18


Гуру
******

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



Если речь идет об этом продукте, то прерываниями тут и не пахнет, увы.
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 18 2017, 06:49
Сообщение #19


Участник
*

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



Цитата(aaarrr @ Oct 17 2017, 21:28) *
Если речь идет об этом продукте, то прерываниями тут и не пахнет, увы.


да все так, но у kintis есть пример реализации gpio прерываний, посмотрим что получится..
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 19 2017, 01:59
Сообщение #20


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 19 2017, 09:28
Сообщение #21


Участник
*

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



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


да я это уже понял (это заглушки возвращают).
Спасибо.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 20 2017, 00:31
Сообщение #22


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



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


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

Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 20 2017, 07:06
Сообщение #23


Участник
*

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



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


код ядра https://github.com/fm3fan/uClinux

источником может служить любой вывод обозначенный как INTxx_x/Pxx ()
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 21 2017, 03:36
Сообщение #24


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

Группа: Свой
Сообщений: 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$
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 23 2017, 08:41
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 24 2017, 00:18
Сообщение #26


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

Группа: Свой
Сообщений: 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#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).
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 24 2017, 07:59
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 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#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 зарегистрировать данное прерывание в линукс и добавить обработчик;
я что то упустил?

Сообщение отредактировал winniethepooh - Oct 24 2017, 08:05
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 25 2017, 01:03
Сообщение #28


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

Группа: Свой
Сообщений: 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.

Найдите это место в вашем ядре.
Go to the top of the page
 
+Quote Post
winniethepooh
сообщение Oct 25 2017, 14:22
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 25 2017, 23:35
Сообщение #30


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

Группа: Свой
Сообщений: 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 .

Команду запускать в корне дерева исходников. если вы знаете директорию поиска, то напишите ее вместо точки.
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 - 23:53
Рейтинг@Mail.ru


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