@@ -139,7 +139,8 @@ typedef struct
139
139
Stm32 * stm32 ;
140
140
141
141
bool triggered ;
142
- qemu_irq triggerIRQ ;
142
+ qemu_irq gpioIRQ ;
143
+ qemu_irq odIRQ ;
143
144
144
145
bool ledDrive1 ;
145
146
bool ledDrive2 ;
@@ -219,23 +220,31 @@ static void gpiob_irq_handler(void *opaque, int n, int level)
219
220
int64_t frac = (now % 1000000000 ) / 10000 ;
220
221
221
222
int gpio = (int ) opaque ;
223
+ const char * name ;
222
224
switch (gpio )
223
225
{
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 ;
228
237
}
229
238
230
239
/* Assume that the IRQ is only triggered if the LED has changed state.
231
240
* If this is not correct, we may get multiple LED Offs or Ons in a row.
232
241
*/
233
242
switch (level ) {
234
243
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 );
236
245
break ;
237
246
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 );
239
248
break ;
240
249
}
241
250
}
@@ -257,27 +266,46 @@ static void stm32_flashboard_key_event(void *opaque, int keycode)
257
266
/* Responds when a "B" key press is received.
258
267
* Inside the monitor, you can type "sendkey b"
259
268
*/
260
- if (core_keycode == 0x30 ) {
269
+ if (core_keycode == 0x30 )
270
+ {
261
271
if (make ) {
262
272
if (!s -> triggered ) {
263
273
int64_t now = qemu_get_clock_ns (vm_clock );
264
274
int64_t secs = now / 1000000000 ;
265
275
int64_t frac = (now % 1000000000 ) / 10000 ;
266
276
printf ("(%" PRId64 ".%05" PRId64 ") Trigger GPIO 0\n" , secs , frac );
267
- qemu_irq_raise (s -> triggerIRQ );
277
+ qemu_irq_raise (s -> gpioIRQ );
268
278
s -> triggered = true;
269
279
}
270
280
} else {
271
281
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 );
273
301
s -> triggered = false;
274
302
}
275
303
}
276
304
}
277
305
return ;
278
306
}
279
307
280
- #define OUTPUTGPIOS 7
308
+ #define OUTPUTGPIOS 10
281
309
282
310
static void stm32_flashboard_init (QEMUMachineInitArgs * args )
283
311
{
@@ -315,16 +343,33 @@ static void stm32_flashboard_init(QEMUMachineInitArgs *args)
315
343
qdev_connect_gpio_out (gpio_a , 6 , ledDriver2IRQ [0 ]);
316
344
317
345
/* 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 );
319
347
qemu_add_kbd_event_handler (stm32_flashboard_key_event , s );
320
348
321
349
/* Connect GPIO B pin 9-15 - GPIO1-8 */
322
- for (i = 0 ; i < OUTPUTGPIOS ; i ++ )
350
+ for (i = 0 ; i < 7 ; i ++ )
323
351
{
324
352
gpiob [i ] = qemu_allocate_irqs (gpiob_irq_handler , (void * )i + 1 , 1 );
325
353
qdev_connect_gpio_out (gpio_b , 9 + i , gpiob [i ][0 ]);
326
354
}
327
355
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
+
328
373
/* Connect RS232 to UART */
329
374
stm32_uart_connect (
330
375
(Stm32Uart * )uart1 ,
0 commit comments