Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AM1707 + Linux. Нужно написать простую программу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
kovigor
обработчик прерывания от кнопки, подключенной к GPIO МК, который будет при возникновении прерывания зажигать или гасить светодиод. Что у меня уже есть:
- Отладочная плата на AM1707 и SDK для нее: http://www.ti.com/tool/tmdxevm1707
- Достаточный опыт создания самых разных программ для разных ARM без привлечения ОС, т.е., "standalone applications". И для AM1707 приходилось писать тоже.
- Базовые навыки работы в Linux и навыки написания простейших программ, на уровне "Hello World" или чуть более высоком. Опыта создания драйверов, демонов и проч. нет.
- Поставил виртуальную машину, развернул в ней Ubuntu и установил средства разработки (CodeSourcery). Попробовал писать и собирать простейшие программки, выкладывать их на TFTP, скачивать оттуда на плату и там запускать. Все получается.

Теперь вопрос - в каком направлении мне двигаться для решения моей задачи ? Что изучить в первую очередь ?
KRS
вы посмотрите ARM-DS5, там eclipse с плагинами которые позволяют через gdbserver отлаживать приложения. ну и писать конечно, при начале отладки код компилируется и заливается сразу на плату через ssh. На beagleboard все на ура работало.

Можно конечно и так eclipse с remote system explorer и другими плагинами поставить
Arischenko Ivan
Цитата(kovigor @ Mar 28 2012, 23:16) *
обработчик прерывания от кнопки, подключенной к GPIO МК, который будет при возникновении прерывания зажигать или гасить светодиод. Что у меня уже есть:

Теперь вопрос - в каком направлении мне двигаться для решения моей задачи ? Что изучить в первую очередь ?


Самый простой вариант экспортировать GPIO и дергать их bash скриптом.
kovigor
Цитата(Arischenko Ivan @ Mar 28 2012, 23:16) *
Самый простой вариант экспортировать GPIO и дергать их bash скриптом.


Надо именно обрабатывать прерывание.
И еще. Сейчас очень не хочется отвлекаться на всякие второстепенные вещи вроде Eclipse. Проблема ведь не в этом. Есль Ubuntu на вирт. машине, есть средство разработки - CodeSourcery. Все это реально запущено и работает, и меня целиком устраивает. AM1707 менять на что-то другое тоже нельзя ...
Arischenko Ivan
Цитата(kovigor @ Mar 29 2012, 00:53) *
Надо именно обрабатывать прерывание.
И еще. Сейчас очень не хочется отвлекаться на всякие второстепенные вещи вроде Eclipse. Проблема ведь не в этом. Есль Ubuntu на вирт. машине, есть средство разработки - CodeSourcery. Все это реально запущено и работает, и меня целиком устраивает. AM1707 менять на что-то другое тоже нельзя ...


1. Поднять на ubutu tftp сервер.
2. Проинициализировать прерывание-обработчик где - нибудь в arch/arm/mach-davinci/board-da830-evm.c функции "static __init void da830_evm_init(void)" прерывание и обработчик как в примере
3. Пересобрать ядро, запустить на плате (для начала загрузив через tftp), убедиться что все работает
4. Прошить в плату.

Как-то так.
kovigor
Цитата(Arischenko Ivan @ Mar 29 2012, 09:18) *
1. Поднять на ubutu tftp сервер.
2. Проинициализировать прерывание-обработчик где - нибудь в arch/arm/mach-davinci/board-da830-evm.c функции "static __init void da830_evm_init(void)" прерывание и обработчик как в примере
3. Пересобрать ядро, запустить на плате (для начала загрузив через tftp), убедиться что все работает
4. Прошить в плату.

Как-то так.


Ядро собирал, вроде получается. TFTP - сервер поднят, свои простейшие программки я скачивал на плату и запускал, тут все хорошо. За совет большое спасибо. Сейчас посмотрю указанный вами пример ...
kovigor
Цитата(kovigor @ Mar 29 2012, 12:47) *
03.04.2012.

Все получилось.
С отладочной платой поставляются примеры модулей, и среди них - модуль, регистрирующий прерывание от линии GPIO:

Код
#include <linux/module.h>
#include <linux/version.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/completion.h>
#include <mach/cputype.h>
#include <mach/hardware.h>
#include <mach/mux.h>
#include <asm/gpio.h>

static int gpio_num;
static int gpio_pin;

DECLARE_COMPLETION(work);

static irqreturn_t handler (int irq, void * dev)
{
    complete_all(&work);
    return IRQ_HANDLED;
}

int init_module()
{
    int status;
    init_completion(&work);

    gpio_num = 87;    /* gpio_num = (bank_num * 16) + pin_num */
    gpio_pin = DA830_GPIO5_7;

    printk("\nTesting gpio %d (connected to boot pin S2-7)\n", gpio_num);

    /* init/set pinmux */
    status = davinci_cfg_reg(gpio_pin);
    if (status < 0) {printk("pin could not be muxed for GPIO functionality %d\n", gpio_num);
        return status;
    }
    
    status = gpio_request(gpio_num, "gpio_test\n");
    if (status < 0) {printk("ERROR can not open GPIO %d\n", gpio_num);
        return status;
    }

    gpio_direction_input(gpio_num);

    printk("The current state of S2-7 pin is ");

    if(gpio_get_value(gpio_num) == 0)  printk("OFF. \n\tWaiting for the pin to be on..\n");
    else printk("ON. \n\tWaiting for the pin to be off..\n");

    status = request_irq(gpio_to_irq(gpio_num), handler, 0, "gpio_test", NULL);
    if(status < 0) {printk(KERN_ERR "error %d requesting GPIO IRQ %d\n", status, gpio_num);
        return status;
    }

    set_irq_type(gpio_to_irq(gpio_num), IRQ_TYPE_EDGE_RISING);

    wait_for_completion_interruptible(&work);

    printk(".. done\n");

    return 0;
}

void cleanup_module(void)
{
    
    gpio_free(gpio_num);
    free_irq(gpio_to_irq(gpio_num), NULL);
}

MODULE_LICENSE("GPL");


Я его немного доработал, в частности, закомментировал функции "wait_for_completion_interruptible(&work);" и "complete_all(&work);" и вставил вызов изменения состояния светодиода в обработчик прерывания "handler". В результате теперь по каждому прерыванию от одной из линий GPIO светодиод на другой линии меняет свое состояние. Собрал, залил на плату, загрузил - все работает. Вопрос вот в чем. Как я понял, функции "wait_for_completion_interruptible()" и "complete_all()" - 'это специфические функции, реализованные чуть ли не только в Linux для ARM'ов от TI. Или я не прав ? Хоть они мне, похоже, не требуются, очень хотелось бы увидеть более-менее систематическое их описание. Кто подскажет, где его искать ? А также где искать описания на остальные функции, вроде той же "gpio_free" ? Сейчас приходится по частичкам вытаскивать его из заголовочных файлов и исходников. Описания в текстовом виде или в PDF я не нашел ...
Dron_Gus
Например. Вообще лучшая документация - это сам код.

З.Ы. по ссылке ванильное ядро, так что ничего специфичного для TI.
kovigor
Цитата(Dron_Gus @ Apr 4 2012, 09:41) *
Например. Вообще лучшая документация - это сам код.
З.Ы. по ссылке ванильное ядро, так что ничего специфичного для TI.


Понял, большое спасибо, продолжаю разбираться ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.