Commit 7fc42b4bbddc47a6bebc281ee96e9ddcd537d46e
1 parent
9fceefa7
The PINT/DAV pin is active low in the chip spec, not inverted on the board.
Make changes on known GPIO lines be verbose, initialise GPIO levels. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3511 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
63 additions
and
11 deletions
hw/palm.c
| @@ -78,11 +78,10 @@ static CPUWriteMemoryFunc *static_writefn[] = { | @@ -78,11 +78,10 @@ static CPUWriteMemoryFunc *static_writefn[] = { | ||
| 78 | 78 | ||
| 79 | static void palmte_microwire_setup(struct omap_mpu_state_s *cpu) | 79 | static void palmte_microwire_setup(struct omap_mpu_state_s *cpu) |
| 80 | { | 80 | { |
| 81 | - qemu_irq p_int = omap_gpio_in_get(cpu->gpio)[PALMTE_PINTDAV_GPIO]; | ||
| 82 | - | ||
| 83 | omap_uwire_attach( | 81 | omap_uwire_attach( |
| 84 | cpu->microwire, | 82 | cpu->microwire, |
| 85 | - tsc2102_init(qemu_irq_invert(p_int)), | 83 | + tsc2102_init( |
| 84 | + omap_gpio_in_get(cpu->gpio)[PALMTE_PINTDAV_GPIO]), | ||
| 86 | 0); | 85 | 0); |
| 87 | } | 86 | } |
| 88 | 87 | ||
| @@ -115,6 +114,62 @@ static void palmte_button_event(void *opaque, int keycode) | @@ -115,6 +114,62 @@ static void palmte_button_event(void *opaque, int keycode) | ||
| 115 | !(keycode & 0x80)); | 114 | !(keycode & 0x80)); |
| 116 | } | 115 | } |
| 117 | 116 | ||
| 117 | +static void palmte_onoff_gpios(void *opaque, int line, int level) | ||
| 118 | +{ | ||
| 119 | + switch (line) { | ||
| 120 | + case 0: | ||
| 121 | + printf("%s: current to MMC/SD card %sabled.\n", | ||
| 122 | + __FUNCTION__, level ? "dis" : "en"); | ||
| 123 | + break; | ||
| 124 | + case 1: | ||
| 125 | + printf("%s: internal speaker amplifier %s.\n", | ||
| 126 | + __FUNCTION__, level ? "down" : "on"); | ||
| 127 | + break; | ||
| 128 | + | ||
| 129 | + /* These LCD & Audio output signals have not been identified yet. */ | ||
| 130 | + case 2: | ||
| 131 | + case 3: | ||
| 132 | + case 4: | ||
| 133 | + printf("%s: LCD GPIO%i %s.\n", | ||
| 134 | + __FUNCTION__, line - 1, level ? "high" : "low"); | ||
| 135 | + break; | ||
| 136 | + case 5: | ||
| 137 | + case 6: | ||
| 138 | + printf("%s: Audio GPIO%i %s.\n", | ||
| 139 | + __FUNCTION__, line - 4, level ? "high" : "low"); | ||
| 140 | + break; | ||
| 141 | + } | ||
| 142 | +} | ||
| 143 | + | ||
| 144 | +static void palmte_gpio_setup(struct omap_mpu_state_s *cpu) | ||
| 145 | +{ | ||
| 146 | + qemu_irq *misc_gpio; | ||
| 147 | + | ||
| 148 | + omap_mmc_handlers(cpu->mmc, | ||
| 149 | + omap_gpio_in_get(cpu->gpio)[PALMTE_MMC_WP_GPIO], | ||
| 150 | + qemu_irq_invert(omap_mpuio_in_get(cpu->mpuio) | ||
| 151 | + [PALMTE_MMC_SWITCH_GPIO])); | ||
| 152 | + | ||
| 153 | + misc_gpio = qemu_allocate_irqs(palmte_onoff_gpios, cpu, 7); | ||
| 154 | + omap_gpio_out_set(cpu->gpio, PALMTE_MMC_POWER_GPIO, misc_gpio[0]); | ||
| 155 | + omap_gpio_out_set(cpu->gpio, PALMTE_SPEAKER_GPIO, misc_gpio[1]); | ||
| 156 | + omap_gpio_out_set(cpu->gpio, 11, misc_gpio[2]); | ||
| 157 | + omap_gpio_out_set(cpu->gpio, 12, misc_gpio[3]); | ||
| 158 | + omap_gpio_out_set(cpu->gpio, 13, misc_gpio[4]); | ||
| 159 | + omap_mpuio_out_set(cpu->mpuio, 1, misc_gpio[5]); | ||
| 160 | + omap_mpuio_out_set(cpu->mpuio, 3, misc_gpio[6]); | ||
| 161 | + | ||
| 162 | + /* Reset some inputs to initial state. */ | ||
| 163 | + qemu_irq_lower(omap_gpio_in_get(cpu->gpio)[PALMTE_USBDETECT_GPIO]); | ||
| 164 | + qemu_irq_lower(omap_gpio_in_get(cpu->gpio)[PALMTE_USB_OR_DC_GPIO]); | ||
| 165 | + qemu_irq_lower(omap_gpio_in_get(cpu->gpio)[4]); | ||
| 166 | + qemu_irq_lower(omap_gpio_in_get(cpu->gpio)[PALMTE_HEADPHONES_GPIO]); | ||
| 167 | + qemu_irq_lower(omap_mpuio_in_get(cpu->mpuio)[PALMTE_DC_GPIO]); | ||
| 168 | + qemu_irq_raise(omap_mpuio_in_get(cpu->mpuio)[6]); | ||
| 169 | + qemu_irq_raise(omap_mpuio_in_get(cpu->mpuio)[7]); | ||
| 170 | + qemu_irq_raise(omap_mpuio_in_get(cpu->mpuio)[11]); | ||
| 171 | +} | ||
| 172 | + | ||
| 118 | static void palmte_init(int ram_size, int vga_ram_size, | 173 | static void palmte_init(int ram_size, int vga_ram_size, |
| 119 | const char *boot_device, DisplayState *ds, | 174 | const char *boot_device, DisplayState *ds, |
| 120 | const char **fd_filename, int snapshot, | 175 | const char **fd_filename, int snapshot, |
| @@ -158,10 +213,7 @@ static void palmte_init(int ram_size, int vga_ram_size, | @@ -158,10 +213,7 @@ static void palmte_init(int ram_size, int vga_ram_size, | ||
| 158 | 213 | ||
| 159 | qemu_add_kbd_event_handler(palmte_button_event, cpu); | 214 | qemu_add_kbd_event_handler(palmte_button_event, cpu); |
| 160 | 215 | ||
| 161 | - omap_mmc_handlers(cpu->mmc, | ||
| 162 | - omap_gpio_in_get(cpu->gpio)[PALMTE_MMC_WP_GPIO], | ||
| 163 | - qemu_irq_invert(omap_mpuio_in_get(cpu->mpuio) | ||
| 164 | - [PALMTE_MMC_SWITCH_GPIO])); | 216 | + palmte_gpio_setup(cpu); |
| 165 | 217 | ||
| 166 | /* Setup initial (reset) machine state */ | 218 | /* Setup initial (reset) machine state */ |
| 167 | if (nb_option_roms) { | 219 | if (nb_option_roms) { |
hw/tsc210x.c
| 1 | /* | 1 | /* |
| 2 | - * TI TSC2102 (touchscreen/sensors/audio controller) controller. | 2 | + * TI TSC2102 (touchscreen/sensors/audio controller) emulator. |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org> | 4 | * Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org> |
| 5 | * | 5 | * |
| @@ -171,7 +171,7 @@ static void tsc210x_reset(struct tsc210x_state_s *s) | @@ -171,7 +171,7 @@ static void tsc210x_reset(struct tsc210x_state_s *s) | ||
| 171 | s->filter_data[0x12] = 0x7d83; | 171 | s->filter_data[0x12] = 0x7d83; |
| 172 | s->filter_data[0x13] = 0x84ee; | 172 | s->filter_data[0x13] = 0x84ee; |
| 173 | 173 | ||
| 174 | - qemu_set_irq(s->pint, s->irq); | 174 | + qemu_set_irq(s->pint, !s->irq); |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | static uint16_t tsc2102_data_register_read(struct tsc210x_state_s *s, int reg) | 177 | static uint16_t tsc2102_data_register_read(struct tsc210x_state_s *s, int reg) |
| @@ -572,7 +572,7 @@ static void tsc210x_pin_update(struct tsc210x_state_s *s) | @@ -572,7 +572,7 @@ static void tsc210x_pin_update(struct tsc210x_state_s *s) | ||
| 572 | 572 | ||
| 573 | if (pin_state != s->irq) { | 573 | if (pin_state != s->irq) { |
| 574 | s->irq = pin_state; | 574 | s->irq = pin_state; |
| 575 | - qemu_set_irq(s->pint, s->irq); | 575 | + qemu_set_irq(s->pint, !s->irq); |
| 576 | } | 576 | } |
| 577 | 577 | ||
| 578 | switch (s->nextfunction) { | 578 | switch (s->nextfunction) { |
| @@ -810,7 +810,7 @@ static int tsc210x_load(QEMUFile *f, void *opaque, int version_id) | @@ -810,7 +810,7 @@ static int tsc210x_load(QEMUFile *f, void *opaque, int version_id) | ||
| 810 | qemu_get_be16s(f, &s->filter_data[i]); | 810 | qemu_get_be16s(f, &s->filter_data[i]); |
| 811 | 811 | ||
| 812 | s->busy = qemu_timer_pending(s->timer); | 812 | s->busy = qemu_timer_pending(s->timer); |
| 813 | - qemu_set_irq(s->pint, s->irq); | 813 | + qemu_set_irq(s->pint, !s->irq); |
| 814 | 814 | ||
| 815 | return 0; | 815 | return 0; |
| 816 | } | 816 | } |