rockbox/firmware/target/hosted/samsungypr/ypr1/button-ypr1.c
Lorenzo Miori f35d63bc21 ypr0/ypr1: GPIO handling API refactoring
The GPIO APIs for ypr0 and ypr1 targets was messy, requiring a
direct communication via several ioctls calls.
Since it is planned to add support to other devices, more GPIO are
going to be used. For that reason the functions shall be clear and
easy to use.

Change-Id: Ia2304335e1fed1305cc2c4320bd4c097e13079be
2015-01-29 20:28:59 +01:00

130 lines
3.6 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: button-sdl.c 30482 2011-09-08 14:53:28Z kugel $
*
* Copyright (C) 2013 Lorenzo Miori
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include "button.h"
#include "kernel.h"
#include "system.h"
#include "button-target.h"
#include "gpio-ypr.h" /* For headphones sense and buttons */
#include "mcs5000.h" /* Touchscreen controller */
enum {
STATE_UNKNOWN,
STATE_UP,
STATE_DOWN,
};
static int last_x = 0;
static int last_y = 0;
static int last_touch_state = STATE_UNKNOWN;
int button_read_device(int *data)
{
int key = BUTTON_NONE;
int read_size;
struct mcs5000_raw_data touchpad_data;
/* Check for all the keys */
if (!gpio_get(GPIO_VOL_UP_KEY)) {
key |= BUTTON_VOL_UP;
}
if (!gpio_get(GPIO_VOL_DOWN_KEY)) {
key |= BUTTON_VOL_DOWN;
}
if (gpio_get(GPIO_POWER_KEY)) {
key |= BUTTON_POWER;
}
read_size = mcs5000_read(&touchpad_data);
if (read_size == sizeof(struct mcs5000_raw_data)) {
/* Generate UP and DOWN events */
if (touchpad_data.inputInfo & INPUT_TYPE_SINGLE) {
last_touch_state = STATE_DOWN;
}
else {
last_touch_state = STATE_UP;
}
/* Swap coordinates here */
#if CONFIG_ORIENTATION == SCREEN_PORTRAIT
last_x = (touchpad_data.yHigh << 8) | touchpad_data.yLow;
last_y = (touchpad_data.xHigh << 8) | touchpad_data.xLow;
#else
last_x = (touchpad_data.xHigh << 8) | touchpad_data.xLow;
last_y = (touchpad_data.yHigh << 8) | touchpad_data.yLow;
#endif
}
int tkey = touchscreen_to_pixels(last_x, last_y, data);
if (last_touch_state == STATE_DOWN) {
key |= tkey;
}
return key;
}
#ifndef HAS_BUTTON_HOLD
void touchscreen_enable_device(bool en)
{
if (en) {
mcs5000_power();
}
else {
mcs5000_shutdown();
}
}
#endif
bool headphones_inserted(void)
{
/* GPIO low - 0 - means headphones inserted */
return !gpio_get(GPIO_HEADPHONE_SENSE);
}
void button_init_device(void)
{
/* Setup GPIO pin for headphone sense, copied from OF
* Pins for the other buttons are already set up by OF button module
*/
gpio_set_iomux(GPIO_HEADPHONE_SENSE, CONFIG_ALT4);
gpio_set_pad(GPIO_HEADPHONE_SENSE, PAD_CTL_SRE_SLOW);
gpio_direction_input(GPIO_HEADPHONE_SENSE);
/* Turn on touchscreen */
mcs5000_init();
mcs5000_power();
mcs5000_set_hand(RIGHT_HAND);
}
#ifdef BUTTON_DRIVER_CLOSE
/* I'm not sure it's called at shutdown...give a check! */
void button_close_device(void)
{
gpio_free_iomux(GPIO_HEADPHONE_SENSE, CONFIG_ALT4);
/* Turn off touchscreen device */
mcs5000_shutdown();
mcs5000_close();
}
#endif /* BUTTON_DRIVER_CLOSE */