Merge pull request #109 from devos50/vol_buttons
Implemented support for volume up/down buttons
This commit is contained in:
4 files changed
+62
-11
No files matched your search
+34
-6
@@ -187,34 +187,62 @@ static void ipod_touch_key_event(void *opaque, int keycode)
|
||||
int gpio_group = 0, gpio_selector = 0;
|
||||
|
||||
IPodTouchMultitouchState *s = (IPodTouchMultitouchState *)opaque;
|
||||
if(keycode == 25 || keycode == 153) {
|
||||
if(keycode == KEY_P_DOWN || keycode == KEY_P_UP) {
|
||||
// power button
|
||||
gpio_group = GPIO_BUTTON_POWER_IRQ / NUM_GPIO_PINS;
|
||||
gpio_selector = GPIO_BUTTON_POWER_IRQ % NUM_GPIO_PINS;
|
||||
|
||||
if(keycode == 25 && (s->gpio_state->gpio_state & (1 << (GPIO_BUTTON_POWER & 0xf))) == 0) {
|
||||
if(keycode == KEY_P_DOWN && (s->gpio_state->gpio_state & (1 << (GPIO_BUTTON_POWER & 0xf))) == 0) {
|
||||
s->gpio_state->gpio_state |= (1 << (GPIO_BUTTON_POWER & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
else if(keycode == 153) {
|
||||
else if(keycode == KEY_P_UP) {
|
||||
s->gpio_state->gpio_state &= ~(1 << (GPIO_BUTTON_POWER & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
}
|
||||
else if(keycode == 35 || keycode == 163) {
|
||||
else if(keycode == KEY_H_DOWN || keycode == KEY_H_UP) {
|
||||
// home button
|
||||
gpio_group = GPIO_BUTTON_HOME_IRQ / NUM_GPIO_PINS;
|
||||
gpio_selector = GPIO_BUTTON_HOME_IRQ % NUM_GPIO_PINS;
|
||||
|
||||
if(keycode == 35 && (s->gpio_state->gpio_state & (1 << (GPIO_BUTTON_HOME & 0xf))) == 0) {
|
||||
if(keycode == KEY_H_DOWN && (s->gpio_state->gpio_state & (1 << (GPIO_BUTTON_HOME & 0xf))) == 0) {
|
||||
s->gpio_state->gpio_state |= (1 << (GPIO_BUTTON_HOME & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
else if(keycode == 163) {
|
||||
else if(keycode == KEY_H_UP) {
|
||||
s->gpio_state->gpio_state &= ~(1 << (GPIO_BUTTON_HOME & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
}
|
||||
else if(keycode == KEY_MIN_DOWN || keycode == KEY_MIN_UP) {
|
||||
// volume down button
|
||||
gpio_group = GPIO_BUTTON_VOLDOWN_IRQ / NUM_GPIO_PINS;
|
||||
gpio_selector = GPIO_BUTTON_VOLDOWN_IRQ % NUM_GPIO_PINS;
|
||||
|
||||
if(keycode == KEY_MIN_DOWN && (s->gpio_state->gpio_state & (1 << (GPIO_BUTTON_VOLDOWN & 0xf))) == 0) {
|
||||
s->gpio_state->gpio_state |= (1 << (GPIO_BUTTON_VOLDOWN & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
else if(keycode == KEY_MIN_UP) {
|
||||
s->gpio_state->gpio_state &= ~(1 << (GPIO_BUTTON_VOLDOWN & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
}
|
||||
else if(keycode == KEY_PLUS_DOWN || keycode == KEY_PLUS_UP) {
|
||||
// volume down button
|
||||
gpio_group = GPIO_BUTTON_VOLUP_IRQ / NUM_GPIO_PINS;
|
||||
gpio_selector = GPIO_BUTTON_VOLUP_IRQ % NUM_GPIO_PINS;
|
||||
|
||||
if(keycode == KEY_PLUS_DOWN && (s->gpio_state->gpio_state & (1 << (GPIO_BUTTON_VOLUP & 0xf))) == 0) {
|
||||
s->gpio_state->gpio_state |= (1 << (GPIO_BUTTON_VOLUP & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
else if(keycode == KEY_PLUS_UP) {
|
||||
s->gpio_state->gpio_state &= ~(1 << (GPIO_BUTTON_VOLUP & 0xf));
|
||||
do_irq = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(do_irq) {
|
||||
s->sysic->gpio_int_status[gpio_group] |= (1 << gpio_selector);
|
||||
|
||||
@@ -13,7 +13,7 @@ static void s5l8900_gpio_write(void *opaque, hwaddr addr, uint64_t value, unsign
|
||||
|
||||
static uint64_t s5l8900_gpio_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
fprintf(stderr, "%s: read from location 0x%08x\n", __func__, addr);
|
||||
printf("%s: read from location 0x%08x\n", __func__, addr);
|
||||
IPodTouchGPIOState *s = (struct IPodTouchGPIOState *) opaque;
|
||||
|
||||
switch(addr) {
|
||||
|
||||
@@ -57,6 +57,25 @@
|
||||
#define S5L8900_GPIO_G3_IRQ 0x03
|
||||
#define S5L8900_GPIO_G4_IRQ 0x02
|
||||
|
||||
// key codes
|
||||
#define KEY_UP (1 << 7)
|
||||
|
||||
#define KEY_P 25
|
||||
#define KEY_P_DOWN KEY_P
|
||||
#define KEY_P_UP (KEY_P_DOWN | KEY_UP)
|
||||
|
||||
#define KEY_H 35
|
||||
#define KEY_H_DOWN KEY_H
|
||||
#define KEY_H_UP (KEY_H_DOWN | KEY_UP)
|
||||
|
||||
#define KEY_MIN 12
|
||||
#define KEY_MIN_DOWN KEY_MIN
|
||||
#define KEY_MIN_UP (KEY_MIN_DOWN | KEY_UP)
|
||||
|
||||
#define KEY_PLUS 13
|
||||
#define KEY_PLUS_DOWN KEY_PLUS
|
||||
#define KEY_PLUS_UP (KEY_PLUS_DOWN | KEY_UP)
|
||||
|
||||
const int S5L8900_GPIO_IRQS[5] = { S5L8900_GPIO_G0_IRQ, S5L8900_GPIO_G1_IRQ, S5L8900_GPIO_G2_IRQ, S5L8900_GPIO_G3_IRQ, S5L8900_GPIO_G4_IRQ };
|
||||
|
||||
#define IT2G_CPREG_VAR_NAME(name) cpreg_##name
|
||||
|
||||
@@ -10,11 +10,15 @@
|
||||
#define TYPE_IPOD_TOUCH_GPIO "ipodtouch.gpio"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(IPodTouchGPIOState, IPOD_TOUCH_GPIO)
|
||||
|
||||
#define GPIO_BUTTON_POWER 0xC02
|
||||
#define GPIO_BUTTON_HOME 0xC01
|
||||
#define GPIO_BUTTON_POWER 0xC02
|
||||
#define GPIO_BUTTON_HOME 0xC01
|
||||
#define GPIO_BUTTON_VOLUP 0x902
|
||||
#define GPIO_BUTTON_VOLDOWN 0xC00
|
||||
|
||||
#define GPIO_BUTTON_POWER_IRQ 0x7A
|
||||
#define GPIO_BUTTON_HOME_IRQ 0x79
|
||||
#define GPIO_BUTTON_POWER_IRQ 0x7A
|
||||
#define GPIO_BUTTON_HOME_IRQ 0x79
|
||||
#define GPIO_BUTTON_VOLUP_IRQ 0x78
|
||||
#define GPIO_BUTTON_VOLDOWN_IRQ 0x62
|
||||
|
||||
#define NUM_GPIO_PINS 0x20
|
||||
|
||||
|
||||
Reference in new issue
Block a user