|
|
  |
AM1707 + Linux. Нужно написать простую программу |
|
|
|
Mar 28 2012, 19:16
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
обработчик прерывания от кнопки, подключенной к GPIO МК, который будет при возникновении прерывания зажигать или гасить светодиод. Что у меня уже есть: - Отладочная плата на AM1707 и SDK для нее: http://www.ti.com/tool/tmdxevm1707- Достаточный опыт создания самых разных программ для разных ARM без привлечения ОС, т.е., "standalone applications". И для AM1707 приходилось писать тоже. - Базовые навыки работы в Linux и навыки написания простейших программ, на уровне "Hello World" или чуть более высоком. Опыта создания драйверов, демонов и проч. нет. - Поставил виртуальную машину, развернул в ней Ubuntu и установил средства разработки (CodeSourcery). Попробовал писать и собирать простейшие программки, выкладывать их на TFTP, скачивать оттуда на плату и там запускать. Все получается. Теперь вопрос - в каком направлении мне двигаться для решения моей задачи ? Что изучить в первую очередь ?
|
|
|
|
|
Mar 28 2012, 20:16
|
Частый гость
 
Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768

|
Цитата(kovigor @ Mar 28 2012, 23:16)  обработчик прерывания от кнопки, подключенной к GPIO МК, который будет при возникновении прерывания зажигать или гасить светодиод. Что у меня уже есть:
Теперь вопрос - в каком направлении мне двигаться для решения моей задачи ? Что изучить в первую очередь ? Самый простой вариант экспортировать GPIO и дергать их bash скриптом.
|
|
|
|
|
Mar 29 2012, 06:18
|
Частый гость
 
Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768

|
Цитата(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. Прошить в плату. Как-то так.
|
|
|
|
|
Mar 29 2012, 09:47
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(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 - сервер поднят, свои простейшие программки я скачивал на плату и запускал, тут все хорошо. За совет большое спасибо. Сейчас посмотрю указанный вами пример ...
|
|
|
|
|
Apr 3 2012, 20:04
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(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 я не нашел ...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|