Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
imx233 + matrix keypad
ivandevel
Добавлено 03.06.2012 20:56 Редактировалось 03.06.2012 21:15 Сообщение: 11
ivandevel
3.66

Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
Код

struct pin_group lcd_pins = {
.pins = lcd_lms430_desc,
.nr_pins = ARRAY_SIZE(lcd_lms430_desc),
};


эти строки точно закомментированы, при этом на этапе компиляции ошибок не выдает... что делать? могу отправить свой конфиг (сюда не прикрепляется почему-то)

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

/* initialized strobe lines as outputs, activated */
for (i = 0; i < pdata->num_col_gpios; i++) {
err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col");
if (err) {
dev_err(&pdev->dev,
"failed to request GPIO%d for COL%d\n",
pdata->col_gpios[i], i);
goto err_free_cols;
}

gpio_direction_output(pdata->col_gpios[i], !pdata->active_low);
Спуститься к концу Подняться к началу
Персональная информация
ivandevel
Добавлено 03.06.2012 21:37 Редактировалось 03.06.2012 23:52 Сообщение: 12
ivandevel
3.66

Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
Убрал инициализацию всех ног клавы, оставил в ините борды только структуры и это:

Код

platform_device_register(&imx233_kbd_device);


теперь на gpio_request не ругается, но ругается на это:
Код

setting trigger mode 3 for irq 165 failed (stmp3xxx_set_irqtype+0x0/0xe0)
matrix-keypad matrix-keypad: Unable to acquire interrupt for GPIO line 37


не знаю, относится ли первая строчка к клаве? клава по прежнему не работает...
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.06.2012 02:02 Сообщение: 13
sasamy
4.70

Пункты: 76926
Регистрация: 14.08.2009
Похоже облом с matrix-keypad на imx233 - там требуется генерировать прерывания по обоим фронтам
Цитата

err = request_irq(gpio_to_irq(pdata->row_gpios[i]),
matrix_keypad_interrupt,
IRQF_DISABLED |
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
"matrix-keypad", keypad);


у imx233 контроллер PIO может только по одному фронту генерировать прерывание.
Спуститься к концу Подняться к началу
Персональная информация
ivandevel
Добавлено 04.06.2012 09:24 Редактировалось 04.06.2012 09:52 Сообщение: 14
ivandevel
3.66

Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
1) А на одном прерывании никак не получится?
2) Можно-ли ROWS настраивать не как GPIO (External interrupt например) ?
3) Есть ли еще способ организации пары десятков клавиш, поддерживаемый ядром линуха? может IO expander? (Это конечно крайний вариант)
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.06.2012 12:08 Редактировалось 04.06.2012 13:45 Сообщение: 15
sasamy
4.70

Пункты: 76926
Регистрация: 14.08.2009
1 см 2
2 не совсем понял вопрос, matrix-keypad работает с GPIO. Конечно можно изменить немного драйвер - достаточно одного прерывания, номер прерывания не используется - вся матрица сканируется после прерывания от любого row, но тогда схему матрицы нужно дополнять.
3 USB клавиатура :)

Можно изменить немного драйвер - зарегистрировать обработчики по одному фронту в зависимости от активного уровеня (уровень который соответствует нажатой клавише), он определен в бордфайле, у вас он
.active_low = 1,
Изначально предполагаем что все клавиши отпущены и мы ожидаем первого нажатия
Цитата

for (i = 0; i < pdata->num_row_gpios; i++) {
err = request_irq(gpio_to_irq(pdata->row_gpios[i]),
matrix_keypad_interrupt,
IRQF_DISABLED |
(pdata->active_low ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING),
"matrix-keypad", keypad);


в самом обработчике irq никакой работы не делается - там только отключаются прерывания и ставится в очередь отложенный обработчик прерывания (matrix_keypad_scan), это нужно чтобы исключить влияние "дребезга" контактов. В отложенном обработчике сканируется вся матрица и определяются клавиши изменившие свое состояние - тут нам нужно переключать триггер для прерывания у row которые изменили состояние в зависимости от нового их состояния
Цитата

static void matrix_keypad_scan(struct work_struct *work)
....
for (row = 0; row < pdata->num_row_gpios; row++) {
if ((bits_changed & (1 << row)) == 0)
continue;

code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
input_event(input_dev, EV_MSC, MSC_SCAN, code);
input_report_key(input_dev,
keypad->keycodes[code],
new_state[col] & (1 << row));

if (!(new_state[col] & (1 << row))) // если клавиша отпущена
set_irq_type(gpio_to_irq(pdata->row_gpios[row]), pdata->active_low ? IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING);
else
set_irq_type(gpio_to_irq(pdata->row_gpios[row]), pdata->active_low ? IRQ_TYPE_EDGE_RISING : IRQ_TYPE_EDGE_FALLING);
}

....
}


работать это должно но кривовато - например сразу непонятно - как поведет себя клава при одновременном нажатии клавиш с одинаковым row.
Спуститься к концу Подняться к началу
Персональная информация
ivandevel
Добавлено 07.05.2013 16:30 Сообщение: 16
ivandevel
3.66

Пункты: 1782
Регистрация: 29.08.2011
Пол: Мужчина
Из: г. Екатеринбург
Пока отказался от матричной клавиатуры и завел кнопки просто на оставшиеся ноги МК. Как теперь организовать простую GPIO клавиатуру?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 08.05.2013 13:31 Сообщение: 17
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Пока отказался от матричной клавиатуры и завел кнопки просто на оставшиеся ноги МК. Как теперь организовать простую GPIO клавиатуру?

http://www.starterkit.ru/html/index.php?name=forum&op=view&id=12359&num=2#12476

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux