Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
Qt keyPressEvent и GPIO Buttons
AGevork
Добавлено 09.04.2014 00:15
0
Сообщение: 1
AGevork
4.71

Пункты: 10580
Регистрация: 14.08.2013
Всем здравствуйте! Очередная проблема новичка!
Делаю приложение на QT sk9g45-oem.
Проблема заключается в следующем:
В board файле платы (ядро из поставки) в gpiobuttons кнопке KEY_LEFT изменил пин на PC25. Пытаюсь с помощью QT поймать нажатие данной кнопки.
Кнопка сконфигурирована так :
Код

.code = KEY_LEFT,
.gpio = AT91_PIN_PC25,
.active_low =1,
.desc = "joystik left"


Сама прога в Qt выглядит не сложно вот исходник:
mainwindow.cpp
Код

#include "mainwindow.h"
#include "ui_mainwindow.h"
int i;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
this ->setWindowFlags
(Qt::FramelessWindowHint|Qt::WindowShadeButtonHint);
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_Left:
ui->label1->setText("poluchilos");
break;
}
QMainWindow::keyPressEvent(event);
}



mainwindow.h
Код

#include <QMainWindow>
#include <QFileSystemWatcher>
#include <QTextStream>
#include <QFile>
#include <QKeyEvent>

namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void keyPressEvent(QKeyEvent *event);
private:
Ui::MainWindow *ui;
public slots:
};
#endif // MAINWINDOW_H



Не пойму что не так то ? Qt собрано в составе Buildroot2014.02
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 09.04.2014 01:23 Сообщение: 2
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Не пойму что не так то ? Qt собрано в составе Buildroot2014.02

контрвопрос - а в системе функционал проверили, ядро девайс дает и евенты генерятся?

Код
dmesg | grep input


в этом месте у вас (в билдруте) евенты могут быть в другом месте:
Код
ls /dev/input/event*


ну и потестить утилитой работоспособность:
Код
evtest /dev/input/eventN

где N номер input из лога ядра..

в свободное время компильну вашу софтину для проверки..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
AGevork
Добавлено 09.04.2014 10:34 Редактировалось 09.04.2014 11:40 Сообщение: 3
AGevork
4.71

Пункты: 10580
Регистрация: 14.08.2013
Код

dmesg | grep input


Вот что получаю
Код
input: ADS7843 Touchscreen as /devices/platform/spi_gpio.3/spi3.0/input/input0



Код

ls /dev/input/


получаю
Код

event0 mice mouse0


Evtest
Код

evtest /dev/input/event0
Input driver version is 1.0.0
Input device ID: bus 0x0 vendor 0x0 product 0x0 version 0x0
Input device name: "ADS7843 Touchscreen"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 330 (BTN_TOUCH)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 0
Min 150
Max 3830
Event code 1 (ABS_Y)
Value 0
Min 190
Max 3830
Event code 24 (ABS_PRESSURE)
Value 0
Min 0
Max 15000
Testing ... (interrupt to exit)


Помоему по первой строчке ясно что нету клавиатуры, хотя в ядре
Код

Input device->
* Event interface
Keyboard->
* AT Keyboard
* Gpio Buttons

МБ не только в borad файле надо добавить пин ?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 09.04.2014 11:35 Редактировалось 09.04.2014 11:48 Сообщение: 4
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
чтд.. нет в системе этого канала события..
должно быть примерно такое:
Код
root@неважно:~# dmesg |grep input
[ 1.291625] input: ti-tsc as /devices/platform/omap/ti_tscadc/tsc/input/input0
[ 1.549957] input: gpio-keys as /devices/platform/gpio-keys/input/input1
[ 2.784698] input: adp5589-keys as /devices/platform/omap/omap_i2c.1/i2c-1/1-0034/input/input2
root@неважно:~# evtest /dev/input/event1
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "gpio-keys"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 116 (Power)
Event code 236 (?)
Testing ... (interrupt to exit)
^C


проверьте в конфиге ядра в "gpio support"
пункты о "gpio generic-mapped" и "sys/class/gpio"
если что, выхлоп "cat .config | grep GPIO" сюда..
и в файле борды проверьте вызов регистрации пинов как gpio

evtest поищите в менюконфиге билдрута - совет не нужен, evtest присутствует..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
AGevork
Добавлено 09.04.2014 11:56 Редактировалось 09.04.2014 12:11 Сообщение: 5
AGevork
4.71

Пункты: 10580
Регистрация: 14.08.2013
В разделе GPIO Support стоит * напротив sys/class/gpio/ (sysf interface)
в board файле врое бы все ок.
Пункт "gpio generic-mapped так и не нашел, есть только Generic Thermal sysfs driver но это не то.
Прикладываю board файлвзгляните плс если не сложно.
Ядро 2.6.36-rc6
.config

Код

root@debian:/home/user/src/linux-2.6.36-rc6# cat .config|grep GPIO
CONFIG_GENERIC_GPIO=y
# CONFIG_MTD_NAND_GPIO is not set
CONFIG_KEYBOARD_GPIO=y
CONFIG_I2C_GPIO=y
CONFIG_SPI_GPIO=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y
# CONFIG_DEBUG_GPIO is not set
CONFIG_GPIO_SYSFS=y
# Memory mapped GPIO expanders:
# CONFIG_GPIO_IT8761E is not set
# I2C GPIO expanders:
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX732X is not set
# CONFIG_GPIO_PCA953X is not set
# CONFIG_GPIO_PCF857X is not set
# CONFIG_GPIO_SX150X is not set
# CONFIG_GPIO_ADP5588 is not set
# PCI GPIO expanders:
# SPI GPIO expanders:
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MCP23S08 is not set
# CONFIG_GPIO_MC33880 is not set
# AC97 GPIO expanders:
# MODULbus GPIO expanders:
# CONFIG_HTC_EGPIO is not set
# CONFIG_USB_GPIO_VBUS is not set
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 09.04.2014 12:05 Сообщение: 6
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Прикладываю board файл и .config взгляните плс если не сложно.
Ядро 2.6.36-rc6
Хм файл не цепляется =(

pastebin.com и линк сюда..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
AGevork
Добавлено 09.04.2014 12:10 Редактировалось 09.04.2014 12:16 Сообщение: 7
AGevork
4.71

Пункты: 10580
Регистрация: 14.08.2013
http://pastebin.com/uSwqdVrN
Ссылка на board файл.

При загрузке вылетает еще вот такое сообщение
mount: mounting sysfs on /sys failed: Device or resource busy
мб дело в этом ?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 09.04.2014 12:26 Сообщение: 8
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
При загрузке вылетает еще вот такое сообщение
mount: mounting sysfs on /sys failed: Device or resource busy
мб дело в этом ?

вполне может быть..

что говорят команды:
Код
mount
ls /sys
touch /sys

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
AGevork
Добавлено 09.04.2014 12:30 Редактировалось 09.04.2014 12:40 Сообщение: 9
AGevork
4.71

Пункты: 10580
Регистрация: 14.08.2013
что говорят команды:
Код
mount
ls /sys
touch /sys
[/quote]

ls /sys
Код

block class devices fs module
bus dev firmware kernel


Но дрыгать ножкой через sys/class/gpio получается
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 09.04.2014 12:47 Редактировалось 09.04.2014 12:48 Сообщение: 10
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Но дрыгать ножкой через sys/class/gpio получается

все правильно - считайте, что это ручной режим..
теперь надо управление пином возложить на ядро и работать через подсистему ввода
в файле у вас все прописано правильно.. для проверки я практикую отладочный вывод - в вашем случае примерно
Код
static void __init ek_add_device_buttons(void)
{
int i;
printk("** ek_add_device_buttons start\n");

for (i = 0; i < ARRAY_SIZE(ek_buttons); i++) {

at91_set_GPIO_periph(ek_buttons[i].gpio, 1);

at91_set_deglitch(ek_buttons[i].gpio, 1);

}

platform_device_register(&ek_button_device);
printk("** ek_add_device_buttons finish\n");

}

потом в логе смотрю, что произошло между "start" и "finish"

но у вас похоже, что-то в ядре недовключенно..

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