genode/os/src/drivers/input/imx53/driver.h

107 lines
2.5 KiB
C++

/*
* \brief Input-driver
* \author Stefan Kalkowski
* \date 2013-03-15
*/
/*
* Copyright (C) 2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _DRIVER_H_
#define _DRIVER_H_
/* Genode includes */
#include <base/env.h>
#include <base/thread.h>
#include <base/signal.h>
#include <gpio_session/connection.h>
/* local includes */
#include <egalax_ts.h>
#include <mpr121.h>
namespace Input {
class Tablet_driver;
}
class Input::Tablet_driver : Genode::Thread<8192>
{
private:
enum Gpio_irqs {
GPIO_TOUCH = 84,
GPIO_BUTTON = 132,
};
Event_queue &_ev_queue;
Gpio::Connection _gpio_ts;
Gpio::Connection _gpio_bt;
Genode::Signal_receiver _receiver;
Genode::Signal_context _ts_rx;
Genode::Signal_context _bt_rx;
Genode::Signal_context_capability _ts_sig_cap;
Genode::Signal_context_capability _bt_sig_cap;
Touchscreen _touchscreen;
Buttons _buttons;
Genode::Signal_context_capability _init_ts_gpio()
{
Genode::Signal_context_capability ret = _receiver.manage(&_ts_rx);
_gpio_ts.direction(Gpio::Session::OUT);
_gpio_ts.write(true);
_gpio_ts.direction(Gpio::Session::IN);
_gpio_ts.irq_sigh(_ts_sig_cap);
_gpio_ts.irq_type(Gpio::Session::LOW_LEVEL);
_gpio_ts.irq_enable(true);
return ret;
}
Genode::Signal_context_capability _init_bt_gpio()
{
Genode::Signal_context_capability ret = _receiver.manage(&_bt_rx);
_gpio_bt.direction(Gpio::Session::OUT);
_gpio_bt.write(true);
_gpio_bt.direction(Gpio::Session::IN);
_gpio_bt.irq_sigh(_bt_sig_cap);
_gpio_bt.irq_type(Gpio::Session::FALLING_EDGE);
_gpio_bt.irq_enable(true);
return ret;
}
Tablet_driver(Event_queue &ev_queue)
: _ev_queue(ev_queue),
_gpio_ts(GPIO_TOUCH),
_gpio_bt(GPIO_BUTTON),
_ts_sig_cap(_init_ts_gpio()),
_bt_sig_cap(_init_bt_gpio()) { start(); }
public:
static Tablet_driver* factory(Event_queue &ev_queue);
void entry()
{
while (true) {
Genode::Signal sig = _receiver.wait_for_signal();
if (sig.context() == &_ts_rx)
_touchscreen.event(_ev_queue);
else if (sig.context() == &_bt_rx)
_buttons.event(_ev_queue);
}
}
};
Input::Tablet_driver* Input::Tablet_driver::factory(Event_queue &ev_queue)
{
static Input::Tablet_driver driver(ev_queue);
return &driver;
}
#endif /* _DRIVER_H_ */