Qt keyPressEvent и GPIO Buttons
AGevork
Пункты: 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
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Не пойму что не так то ? Qt собрано в составе Buildroot2014.02
контрвопрос - а в системе функционал проверили, ядро девайс дает и евенты генерятся?
Код dmesg | grep input
в этом месте у вас (в билдруте) евенты могут быть в другом месте:
Код ls /dev/input/event*
ну и потестить утилитой работоспособность:
Код evtest /dev/input/eventN
где N номер input из лога ядра..
в свободное время компильну вашу софтину для проверки..
На любой вопрос есть любой ответ.
AGevork
Пункты: 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
Пункты: 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
Пункты: 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
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Прикладываю board файл и .config взгляните плс если не сложно.
Ядро 2.6.36-rc6
Хм файл не цепляется =(
pastebin.com и линк сюда..
На любой вопрос есть любой ответ.
AGevork
Пункты: 10580
Регистрация: 14.08.2013
http://pastebin.com/uSwqdVrN
Ссылка на board файл.
При загрузке вылетает еще вот такое сообщение
mount: mounting sysfs on /sys failed: Device or resource busy
мб дело в этом ?
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата При загрузке вылетает еще вот такое сообщение
mount: mounting sysfs on /sys failed: Device or resource busy
мб дело в этом ?
вполне может быть..
что говорят команды:
Код mount
ls /sys
touch /sys
На любой вопрос есть любой ответ.
AGevork
Пункты: 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
Пункты: 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"
но у вас похоже, что-то в ядре недовключенно..
На любой вопрос есть любой ответ.