2012-07-16 15:13:35 +02:00
|
|
|
/*
|
|
|
|
* \brief Test of GPIO driver
|
|
|
|
* \author Ivan Loskutov <ivan.loskutov@ksyslabs.org>
|
|
|
|
* \date 2012-06-23
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (C) 2012 Ksys Labs LLC
|
2015-04-14 13:56:26 +02:00
|
|
|
* Copyright (C) 2012-2015 Genode Labs GmbH
|
2012-07-16 15:13:35 +02:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
|
|
* under the terms of the GNU General Public License version 2.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _GPIO_TEST_H_
|
|
|
|
#define _GPIO_TEST_H_
|
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
/* Genode includes */
|
|
|
|
#include <base/printf.h>
|
2012-07-16 15:13:35 +02:00
|
|
|
#include <base/signal.h>
|
2015-04-14 13:56:26 +02:00
|
|
|
#include <gpio_session/connection.h>
|
|
|
|
#include <irq_session/client.h>
|
2012-07-16 15:13:35 +02:00
|
|
|
#include <util/mmio.h>
|
|
|
|
|
|
|
|
using namespace Genode;
|
|
|
|
|
|
|
|
class Gpio_test
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
enum {
|
2013-05-06 14:33:30 +02:00
|
|
|
LED1_GPIO = 7,
|
|
|
|
LED2_GPIO = 8,
|
|
|
|
BUTTON_GPIO = 121,
|
|
|
|
GPIO4_IRQ = 32 + 32,
|
2012-07-16 15:13:35 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
2013-05-06 14:33:30 +02:00
|
|
|
Gpio::Connection _gpio_led1;
|
|
|
|
Gpio::Connection _gpio_led2;
|
|
|
|
Gpio::Connection _gpio_button;
|
|
|
|
Gpio::Connection _gpio_irq4;
|
2012-07-16 15:13:35 +02:00
|
|
|
|
|
|
|
Signal_receiver sig_rec;
|
|
|
|
Signal_context sig_ctx;
|
|
|
|
|
|
|
|
public:
|
2013-05-06 14:33:30 +02:00
|
|
|
|
2012-07-16 15:13:35 +02:00
|
|
|
Gpio_test();
|
|
|
|
|
2013-05-06 14:33:30 +02:00
|
|
|
void wait_for_signal() {
|
|
|
|
sig_rec.wait_for_signal(); }
|
2012-07-16 15:13:35 +02:00
|
|
|
|
|
|
|
bool polling_test();
|
|
|
|
bool irq_test();
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Gpio_test::Gpio_test()
|
2013-05-06 14:33:30 +02:00
|
|
|
: _gpio_led1(LED1_GPIO),
|
|
|
|
_gpio_led2(LED2_GPIO),
|
|
|
|
_gpio_button(BUTTON_GPIO),
|
|
|
|
_gpio_irq4(GPIO4_IRQ)
|
2012-07-16 15:13:35 +02:00
|
|
|
{
|
|
|
|
/* initialize GPIO_121 */
|
2013-05-06 14:33:30 +02:00
|
|
|
_gpio_button.debouncing(31*100);
|
2012-07-16 15:13:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool Gpio_test::polling_test()
|
|
|
|
{
|
|
|
|
printf("---------- Polling test ----------\n");
|
|
|
|
|
|
|
|
printf("\nPush and hold button...\n");
|
|
|
|
|
2013-05-06 14:33:30 +02:00
|
|
|
_gpio_led1.write(true);
|
|
|
|
_gpio_led2.write(false);
|
|
|
|
|
|
|
|
volatile bool gpio_state;
|
2012-07-16 15:13:35 +02:00
|
|
|
|
|
|
|
do {
|
2013-05-06 14:33:30 +02:00
|
|
|
gpio_state = _gpio_button.read();
|
2012-07-16 15:13:35 +02:00
|
|
|
} while (gpio_state);
|
|
|
|
|
|
|
|
printf("OK\n");
|
|
|
|
|
2013-05-06 14:33:30 +02:00
|
|
|
_gpio_led1.write(false);
|
|
|
|
_gpio_led2.write(true);
|
2012-07-16 15:13:35 +02:00
|
|
|
|
|
|
|
printf("\nRelease button...\n");
|
2013-05-06 14:33:30 +02:00
|
|
|
|
2012-07-16 15:13:35 +02:00
|
|
|
do {
|
2013-05-06 14:33:30 +02:00
|
|
|
gpio_state = _gpio_button.read();
|
2012-07-16 15:13:35 +02:00
|
|
|
} while (!gpio_state);
|
|
|
|
|
|
|
|
printf("OK\n");
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Gpio_test::irq_test()
|
|
|
|
{
|
|
|
|
printf("---------- IRQ test ----------\n");
|
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
{
|
|
|
|
Genode::Irq_session_client
|
|
|
|
irq(_gpio_button.irq_session(Gpio::Session::FALLING_EDGE));
|
|
|
|
irq.sigh(sig_rec.manage(&sig_ctx));
|
|
|
|
/*
|
|
|
|
* Before any IRQs will be delivered to us, we have to signalize
|
|
|
|
* that we are ready to handle them by calling 'ack_irq()'.
|
|
|
|
*/
|
|
|
|
irq.ack_irq();
|
2012-07-16 15:13:35 +02:00
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
_gpio_led1.write(true);
|
|
|
|
_gpio_led2.write(false);
|
2012-07-16 15:13:35 +02:00
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
printf("\nPush and hold button...\n");
|
2012-07-16 15:13:35 +02:00
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
wait_for_signal();
|
|
|
|
irq.ack_irq();
|
|
|
|
}
|
2013-05-06 14:33:30 +02:00
|
|
|
|
2012-07-16 15:13:35 +02:00
|
|
|
printf("OK\n");
|
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
{
|
|
|
|
Genode::Irq_session_client
|
|
|
|
irq(_gpio_button.irq_session(Gpio::Session::RISING_EDGE));
|
|
|
|
irq.sigh(sig_rec.manage(&sig_ctx));
|
2012-07-16 15:13:35 +02:00
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
_gpio_led1.write(false);
|
|
|
|
_gpio_led2.write(true);
|
2012-07-16 15:13:35 +02:00
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
printf("\nRelease button...\n");
|
2012-07-16 15:13:35 +02:00
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
wait_for_signal();
|
|
|
|
irq.ack_irq();
|
|
|
|
}
|
2013-05-06 14:33:30 +02:00
|
|
|
|
2012-07-16 15:13:35 +02:00
|
|
|
printf("OK\n");
|
|
|
|
|
2015-04-14 13:56:26 +02:00
|
|
|
{
|
|
|
|
Genode::Irq_session_client
|
|
|
|
irq(_gpio_button.irq_session(Gpio::Session::HIGH_LEVEL));
|
|
|
|
irq.sigh(sig_rec.manage(&sig_ctx));
|
|
|
|
}
|
|
|
|
|
2012-07-16 15:13:35 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _GPIO_TEST_H_ */
|