Merge pull request #109 from devos50/vol_buttons

Implemented support for volume up/down buttons
This commit is contained in:
Martijn de Vos authored and GitHub committed 2024-01-01 21:01:44 +01:00
commit 32e2ae008a
4 files changed
+62 -11

No files matched your search

+34 -6
View File
@@ -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);
+1 -1
View File
@@ -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) {
+19
View File
@@ -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
+8 -4
View File
@@ -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