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

 
 
 
Reply to this topicStart new topic
> драйвер GPIO, linux, реализация
am1808
сообщение Nov 28 2011, 04:26
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



доброе утро всем!

интересует реализация gpio драйвера, например, к ножке GPIO_N подключен диод. как поморгать им, не используя /sys/class/gpio/gpio_n.
интересна именно сама реализация.
или например прерывание на кнопке с GPIO_N, помогите пожалуйста реализовать
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Nov 28 2011, 05:58
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Тоже вот пытался напрямую.
Само по себе моргание - просто. Запись числа по определенному адресу. И все.

Но вот как по-простому заставить Линукс не обращать внимание на запись в такую запрещенную область - не знаю.
Если у вашего процессора есть MMU, то скорее всего надо как-то получать привилегии и адресное пространство ядра...

Я вот планирую перейти на линукс (надоело писать все с нуля для каждого проекта). Но в ядро буду вставлять свой черный ход.
Чтоб и прерываниями управлять, и доступ к памяти иметь.

Вот щас думаю, что хуже. Перейти на линукс или просто оформить по человечески все библиотеки со всякими драйверами и графикой и не мучаться.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
am1808
сообщение Nov 28 2011, 07:08
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



DpInRock, понимаю Вас прекрасно biggrin.gif

но если все же к реализации,
то, наверное, следует создать файл устройства, например, /dev/led

этот файл символьного устройства будет интерфейсным между пользователем и ядром, т.е. запись "1" в этот файл устройства даст на соответствующей ноге GPIO высокий сигнал, где прикручен светодиод, ну и, соответственно, наоборот, записывая "0" в /dev/led на ноге GPIO будет низкий сигнал. (смотря еще как подключен сам светодиод, но не в этом суть, главное - менять с высокого на низкий согнал и наоборот)

все как бы понятно, но вот реализовать не получается, может кто поможет на примере!?
хотя может быть можно и как то по другому реализовать интерфейс драйвера

и еще, вроде бы та же задачка, но вместо диода - кнопка. как мне прерывание поймать и обработать?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 28 2011, 09:59
Сообщение #4


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Код
static struct gpio_led xxx_leds[] = {
    {
        .name            = "red",
        .gpio            = ,
    },
    {
        .name            = "yellow",
        .gpio            = ,
    },
    {
        .name            = "green",
        .gpio            = ,
        .default_trigger= "heartbeat",
    },
    {
        .name            = "onboard",
        .gpio            = ,
        .default_trigger= "default-off",
    },
};

static struct gpio_led_platform_data xxx_led_data = {
    .num_leds = ARRAY_SIZE(xxx_leds),
    .leds = xxx_leds,
};

static struct platform_device xxx_leds_device = {
    .name            = "leds-gpio",
    .id            = -1,
    .dev.platform_data    = &xxx_led_data,
};
...
platform_add_devices(&xxx_leds_device,1);


Только вот появится он там же: /sys/class/leds/ . Не вижу проблем дергать ножками через /sys .

Кнопки


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Nov 28 2011, 10:04
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(am1808 @ Nov 28 2011, 11:08) *
все как бы понятно, но вот реализовать не получается, может кто поможет на примере!?


Пример можете здесь посмотреть
http://docs.blackfin.uclinux.org/doku.php?...ers:simple-gpio

В ядре есть готовый интерфейс для лампочек sm.gif на gpio
http://lxr.free-electrons.com/source/drive...ds/Kconfig#L174

готовый интерфейс для всевозможных кастомных кнопок и клавиатур на gpio
http://lxr.free-electrons.com/source/drive...rd/Kconfig#L175
http://lxr.free-electrons.com/source/drive...rd/Kconfig#L190
http://lxr.free-electrons.com/source/drive...rd/Kconfig#L224

ну и в крайнем случае mmap регистров контроллера pio процессора
http://www.linuxquestions.org/questions/li...rs-pace-656817/

Go to the top of the page
 
+Quote Post
am1808
сообщение Nov 28 2011, 12:19
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



огромное спасибо, ребята, начал разбираться.

пока собрал ядро с поддержкой leds-gpio.c модуля.
не совсем понятно, как им пользоваться из user-space и как указать номер GPIO?
подскажите пожалуйста


Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 28 2011, 17:59
Сообщение #7


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Надо в бордовый файл для Вашей платы (arch/arm/mach-XXX/mach-***.c) добавить соответствующий platform_device . Из инициализационной функции в том же файле его надо добавить (platform_add_devices). Номера GPIO смотрите по схеме. Для различных архитектур существуют различные дефайны, упрощающие жизнь, например для самсунга: S3C64XX_GPK() и подобные. смотрите, как в других платах сделано.
Из юзерспейса пишете в /sys/class/leds/<название леда>/brightnes (дляобычных 0 или 255). Можно еще триггер поменять. Поставить, например, heartbeat будет "пульс" показывать.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Nov 29 2011, 21:12
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



В теме последнее сообщение.
Там пример программки моргания светодиодом через юзер-спейс и обработка внешнего прерывания через драйвер.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 30 2011, 07:35
Сообщение #9


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



ИМХО, mmap для обращения к периферии из юзерспейса - плохой тон.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Nov 30 2011, 09:56
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Цитата(Dron_Gus @ Nov 30 2011, 11:35) *
ИМХО, mmap для обращения к периферии из юзерспейса - плохой тон.


Сразу возникает два вопроса sm.gif
Почему плохой тон и что бы Вы посоветовали ?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 30 2011, 11:40
Сообщение #11


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



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


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:53
Рейтинг@Mail.ru


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