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 | 78 | |
79 | 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 | 81 | omap_uwire_attach( |
84 | 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 | 85 | 0); |
87 | 86 | } |
88 | 87 | |
... | ... | @@ -115,6 +114,62 @@ static void palmte_button_event(void *opaque, int keycode) |
115 | 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 | 173 | static void palmte_init(int ram_size, int vga_ram_size, |
119 | 174 | const char *boot_device, DisplayState *ds, |
120 | 175 | const char **fd_filename, int snapshot, |
... | ... | @@ -158,10 +213,7 @@ static void palmte_init(int ram_size, int vga_ram_size, |
158 | 213 | |
159 | 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 | 218 | /* Setup initial (reset) machine state */ |
167 | 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 | 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 | 171 | s->filter_data[0x12] = 0x7d83; |
172 | 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 | 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 | 572 | |
573 | 573 | if (pin_state != s->irq) { |
574 | 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 | 578 | switch (s->nextfunction) { |
... | ... | @@ -810,7 +810,7 @@ static int tsc210x_load(QEMUFile *f, void *opaque, int version_id) |
810 | 810 | qemu_get_be16s(f, &s->filter_data[i]); |
811 | 811 | |
812 | 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 | 815 | return 0; |
816 | 816 | } | ... | ... |