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 | } |