Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: драйвер GPIO
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
am1808
доброе утро всем!

интересует реализация gpio драйвера, например, к ножке GPIO_N подключен диод. как поморгать им, не используя /sys/class/gpio/gpio_n.
интересна именно сама реализация.
или например прерывание на кнопке с GPIO_N, помогите пожалуйста реализовать
DpInRock
Тоже вот пытался напрямую.
Само по себе моргание - просто. Запись числа по определенному адресу. И все.

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

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

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

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

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

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

и еще, вроде бы та же задачка, но вместо диода - кнопка. как мне прерывание поймать и обработать?
Dron_Gus
Код
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 .

Кнопки
sasamy
Цитата(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/

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

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


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


Сразу возникает два вопроса sm.gif
Почему плохой тон и что бы Вы посоветовали ?
Dron_Gus
Для большинства устройств в линуксе есть абстракции, через которые и надо работать.
Что будет если к одним и тем же регистрам попробуют обращаться сразу несколько юзерспейс приложений?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.