Skip to content

Commit 7771bd7

Browse files
committed
Update gpio handling
1 parent 8420774 commit 7771bd7

File tree

1 file changed

+58
-13
lines changed

1 file changed

+58
-13
lines changed

hw/arm/stm32_flashboard.c

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ typedef struct
139139
Stm32 *stm32;
140140

141141
bool triggered;
142-
qemu_irq triggerIRQ;
142+
qemu_irq gpioIRQ;
143+
qemu_irq odIRQ;
143144

144145
bool ledDrive1;
145146
bool ledDrive2;
@@ -219,23 +220,31 @@ static void gpiob_irq_handler(void *opaque, int n, int level)
219220
int64_t frac = (now % 1000000000) / 10000;
220221

221222
int gpio = (int) opaque;
223+
const char *name;
222224
switch (gpio)
223225
{
224-
case 4: gpio = 7; break;
225-
case 5: gpio = 6; break;
226-
case 6: gpio = 5; break;
227-
case 7: gpio = 4; break;
226+
case 1: name = "GPIO 1"; break;
227+
case 2: name = "GPIO 2"; break;
228+
case 3: name = "GPIO 3"; break;
229+
case 4: name = "GPIO 7"; break;
230+
case 5: name = "GPIO 6"; break;
231+
case 6: name = "GPIO 5"; break;
232+
case 7: name = "GPIO 4"; break;
233+
case 8: name = "GPIO EN"; break;
234+
case 9: name = "OD IN"; break;
235+
case 10: name = "OD 1"; break;
236+
case 11: name = "OD 2"; break;
228237
}
229238

230239
/* Assume that the IRQ is only triggered if the LED has changed state.
231240
* If this is not correct, we may get multiple LED Offs or Ons in a row.
232241
*/
233242
switch (level) {
234243
case 0:
235-
printf("(%"PRId64".%05"PRId64") GPIO %d Off\n", secs, frac, gpio);
244+
printf("(%"PRId64".%05"PRId64") %s Off\n", secs, frac, name);
236245
break;
237246
case 1:
238-
printf("(%"PRId64".%05"PRId64") GPIO %d On\n", secs, frac, gpio);
247+
printf("(%"PRId64".%05"PRId64") %s On\n", secs, frac, name);
239248
break;
240249
}
241250
}
@@ -257,27 +266,46 @@ static void stm32_flashboard_key_event(void *opaque, int keycode)
257266
/* Responds when a "B" key press is received.
258267
* Inside the monitor, you can type "sendkey b"
259268
*/
260-
if(core_keycode == 0x30) {
269+
if(core_keycode == 0x30)
270+
{
261271
if(make) {
262272
if(!s->triggered) {
263273
int64_t now = qemu_get_clock_ns(vm_clock);
264274
int64_t secs = now / 1000000000;
265275
int64_t frac = (now % 1000000000) / 10000;
266276
printf("(%"PRId64".%05"PRId64") Trigger GPIO 0\n", secs, frac);
267-
qemu_irq_raise(s->triggerIRQ);
277+
qemu_irq_raise(s->gpioIRQ);
268278
s->triggered = true;
269279
}
270280
} else {
271281
if(s->triggered) {
272-
qemu_irq_lower(s->triggerIRQ);
282+
qemu_irq_lower(s->gpioIRQ);
283+
s->triggered = false;
284+
}
285+
}
286+
}
287+
else if (core_keycode == 0x31)
288+
{
289+
if(make) {
290+
if(!s->triggered) {
291+
int64_t now = qemu_get_clock_ns(vm_clock);
292+
int64_t secs = now / 1000000000;
293+
int64_t frac = (now % 1000000000) / 10000;
294+
printf("(%"PRId64".%05"PRId64") Trigger OD_IN\n", secs, frac);
295+
qemu_irq_raise(s->odIRQ);
296+
s->triggered = true;
297+
}
298+
} else {
299+
if(s->triggered) {
300+
qemu_irq_lower(s->odIRQ);
273301
s->triggered = false;
274302
}
275303
}
276304
}
277305
return;
278306
}
279307

280-
#define OUTPUTGPIOS 7
308+
#define OUTPUTGPIOS 10
281309

282310
static void stm32_flashboard_init(QEMUMachineInitArgs *args)
283311
{
@@ -315,16 +343,33 @@ static void stm32_flashboard_init(QEMUMachineInitArgs *args)
315343
qdev_connect_gpio_out(gpio_a, 6, ledDriver2IRQ[0]);
316344

317345
/* Connect trigger to GPIO B pin 8 - GPIO0 */
318-
s->triggerIRQ = qdev_get_gpio_in(gpio_b, 8);
346+
s->gpioIRQ = qdev_get_gpio_in(gpio_b, 8);
319347
qemu_add_kbd_event_handler(stm32_flashboard_key_event, s);
320348

321349
/* Connect GPIO B pin 9-15 - GPIO1-8 */
322-
for (i = 0; i < OUTPUTGPIOS; i++)
350+
for (i = 0; i < 7; i++)
323351
{
324352
gpiob[i] = qemu_allocate_irqs(gpiob_irq_handler, (void*)i+1, 1);
325353
qdev_connect_gpio_out(gpio_b, 9+i, gpiob[i][0]);
326354
}
327355

356+
/* Connect the OD outputs */
357+
gpiob[i] = qemu_allocate_irqs(gpiob_irq_handler, (void*)10, 1);
358+
qdev_connect_gpio_out(gpio_b, 1, gpiob[i][0]);
359+
i++;
360+
gpiob[i] = qemu_allocate_irqs(gpiob_irq_handler, (void*)11, 1);
361+
qdev_connect_gpio_out(gpio_b, 2, gpiob[i][0]);
362+
i++;
363+
364+
/* Connect the GPIO EN outputs */
365+
gpiob[i] = qemu_allocate_irqs(gpiob_irq_handler, (void*)8, 1);
366+
qdev_connect_gpio_out(gpio_b, 5, gpiob[i][0]);
367+
i++;
368+
369+
/* Connect trigger to GPIO B pin 0 - OD_IN */
370+
s->odIRQ = qdev_get_gpio_in(gpio_b, 0);
371+
qemu_add_kbd_event_handler(stm32_flashboard_key_event, s);
372+
328373
/* Connect RS232 to UART */
329374
stm32_uart_connect(
330375
(Stm32Uart *)uart1,

0 commit comments

Comments
 (0)