Commit 254a2710da152ed1ef9a9579e63a5c9258b9eb1c
1 parent
dc1560f5
Fixed set_gpio
Showing
2 changed files
with
31 additions
and
8 deletions
hw/at91_pio.c
@@ -88,6 +88,7 @@ typedef struct PIOState { | @@ -88,6 +88,7 @@ typedef struct PIOState { | ||
88 | 88 | ||
89 | void at91_pio_set_pin(void *opaque, int pin, int level) | 89 | void at91_pio_set_pin(void *opaque, int pin, int level) |
90 | { | 90 | { |
91 | + printf("In at91_pio_set_pin, opaque=%p, pin=%d, level=%d\n", opaque, pin, level); | ||
91 | PIOState *s = opaque; | 92 | PIOState *s = opaque; |
92 | int mask = 1 << (pin % PIO_PINS); | 93 | int mask = 1 << (pin % PIO_PINS); |
93 | int input_set = pin / PIO_PINS; | 94 | int input_set = pin / PIO_PINS; |
@@ -97,6 +98,8 @@ void at91_pio_set_pin(void *opaque, int pin, int level) | @@ -97,6 +98,8 @@ void at91_pio_set_pin(void *opaque, int pin, int level) | ||
97 | if (input_set == 0) { | 98 | if (input_set == 0) { |
98 | /* PIO pin -> Peripheral / IO */ | 99 | /* PIO pin -> Peripheral / IO */ |
99 | 100 | ||
101 | + printf("In at91_pio_set_pin, s->osr=%08x, s->psr=%08x, mask=%08x\n",s->osr, s->psr, mask); | ||
102 | + | ||
100 | /* Skip input if output mode is enabled for the pin */ | 103 | /* Skip input if output mode is enabled for the pin */ |
101 | if (s->osr & mask) | 104 | if (s->osr & mask) |
102 | return; | 105 | return; |
@@ -104,9 +107,11 @@ void at91_pio_set_pin(void *opaque, int pin, int level) | @@ -104,9 +107,11 @@ void at91_pio_set_pin(void *opaque, int pin, int level) | ||
104 | if (s->psr & mask) { | 107 | if (s->psr & mask) { |
105 | saved_pdsr = s->pdsr; | 108 | saved_pdsr = s->pdsr; |
106 | s->pdsr &= ~mask; | 109 | s->pdsr &= ~mask; |
110 | + s->unknown_state &= ~mask; | ||
107 | if (level == -1) { | 111 | if (level == -1) { |
108 | s->unknown_state |= mask; | 112 | s->unknown_state |= mask; |
109 | } else if (level) { | 113 | } else if (level) { |
114 | + printf("In at91_pio_set_pin, setting level\n"); | ||
110 | s->unknown_state &= ~mask; | 115 | s->unknown_state &= ~mask; |
111 | s->pdsr |= mask; | 116 | s->pdsr |= mask; |
112 | } | 117 | } |
@@ -117,6 +122,8 @@ void at91_pio_set_pin(void *opaque, int pin, int level) | @@ -117,6 +122,8 @@ void at91_pio_set_pin(void *opaque, int pin, int level) | ||
117 | } else { | 122 | } else { |
118 | qemu_set_irq(s->out[PIO_PINS + (output_set * PIO_PINS)], level); | 123 | qemu_set_irq(s->out[PIO_PINS + (output_set * PIO_PINS)], level); |
119 | } | 124 | } |
125 | + printf("In at91_pio_set_pin, s->pdsr=%08x\n",s->pdsr); | ||
126 | + | ||
120 | } else { | 127 | } else { |
121 | /* Peripheral -> PIO pin */ | 128 | /* Peripheral -> PIO pin */ |
122 | if ((~s->psr & mask) && input_set == output_set) { | 129 | if ((~s->psr & mask) && input_set == output_set) { |
@@ -141,6 +148,10 @@ static uint32_t at91_pio_mem_read(void *opaque, target_phys_addr_t offset) | @@ -141,6 +148,10 @@ static uint32_t at91_pio_mem_read(void *opaque, target_phys_addr_t offset) | ||
141 | case PIO_ODSR: | 148 | case PIO_ODSR: |
142 | return s->odsr; | 149 | return s->odsr; |
143 | case PIO_PDSR: | 150 | case PIO_PDSR: |
151 | + printf("In at91_pio_mem_read, reading PDSR, s->pdsr=%08x, s->unknown_state=%08x, retval=%08x\n", | ||
152 | + s->pdsr, s->unknown_state, | ||
153 | + (s->pdsr & ~s->unknown_state) | | ||
154 | + (s->ppusr & s->unknown_state)); | ||
144 | return | 155 | return |
145 | (s->pdsr & ~s->unknown_state) | | 156 | (s->pdsr & ~s->unknown_state) | |
146 | (s->ppusr & s->unknown_state); | 157 | (s->ppusr & s->unknown_state); |
@@ -322,12 +333,14 @@ static void at91_pio_reset(void *opaque) | @@ -322,12 +333,14 @@ static void at91_pio_reset(void *opaque) | ||
322 | s->unknown_state = 0xffffffff; | 333 | s->unknown_state = 0xffffffff; |
323 | } | 334 | } |
324 | 335 | ||
325 | -void* at91_io_state = NULL; | 336 | +void* at91_io_state[5]; |
337 | +int at91_io_cnt = 0; | ||
326 | 338 | ||
327 | static void at91_pio_init(SysBusDevice *dev) | 339 | static void at91_pio_init(SysBusDevice *dev) |
328 | { | 340 | { |
341 | + printf("at91_pio_init called\n"); | ||
329 | PIOState *s = FROM_SYSBUS(typeof (*s), dev); | 342 | PIOState *s = FROM_SYSBUS(typeof (*s), dev); |
330 | - at91_io_state = s; | 343 | + at91_io_state[at91_io_cnt++] = s; |
331 | int pio_regs; | 344 | int pio_regs; |
332 | 345 | ||
333 | sysbus_init_irq(dev, &s->parent_irq); | 346 | sysbus_init_irq(dev, &s->parent_irq); |
monitor.c
@@ -521,16 +521,26 @@ static void do_screen_dump(Monitor *mon, const char *filename) | @@ -521,16 +521,26 @@ static void do_screen_dump(Monitor *mon, const char *filename) | ||
521 | 521 | ||
522 | static void do_set_gpio(Monitor* mon, const char* port, const char* value) | 522 | static void do_set_gpio(Monitor* mon, const char* port, const char* value) |
523 | { | 523 | { |
524 | - extern void* at91_io_state; | 524 | + extern void* at91_io_state[5]; |
525 | extern void at91_pio_set_pin(void *opaque, int pin, int level); | 525 | extern void at91_pio_set_pin(void *opaque, int pin, int level); |
526 | - if (at91_io_state) | 526 | + if (strlen(port)<1) |
527 | { | 527 | { |
528 | - printf("Setting gpio: %s %s\n", port, value); | ||
529 | - at91_pio_set_pin(at91_io_state, atoi(port), atoi(value)); | 528 | + printf("Invalid port\n"); |
529 | + return; | ||
530 | + } | ||
531 | + int channel = port[0]-'A'; | ||
532 | + if ((channel >= 0) && (channel < 5)) | ||
533 | + { | ||
534 | + if (at91_io_state[channel]) | ||
535 | + { | ||
536 | + printf("Setting gpio: %s %s\n", port, value); | ||
537 | + at91_pio_set_pin(at91_io_state[channel], atoi(port+1), atoi(value)); | ||
538 | + } | ||
539 | + else | ||
540 | + printf("Cannot set pin: device pointer is NULL\n"); | ||
530 | } | 541 | } |
531 | else | 542 | else |
532 | - printf("Cannot set pin: device pointer is NULL\n"); | ||
533 | - | 543 | + printf("Invalid channel\n"); |
534 | } | 544 | } |
535 | 545 | ||
536 | static void do_logfile(Monitor *mon, const char *filename) | 546 | static void do_logfile(Monitor *mon, const char *filename) |