Commit 2a64138243a89df06b0f6ab4c9ce47f130af53d9
authorMichel Pollet <buserror@gmail.com>
Tue, 31 Aug 2010 10:55:29 +0000 (11:55 +0100)
committerMichel Pollet <buserror@gmail.com>
Tue, 31 Aug 2010 10:55:29 +0000 (11:55 +0100)
New IRQ for client code (ie "board code") will be called
when the AVR firmware changes the DDR register.

Signed-off-by: Michel Pollet <buserror@gmail.com>
2 files changed:
simavr/sim/avr_ioport.c
simavr/sim/avr_ioport.h

index be306528ad5811ae8897fd7701661eabb7e54dae..010e62e7c9f0d2f860e390968a2ac9680374aa93 100644 (file)
@@ -64,6 +64,18 @@ static void avr_ioport_pin_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t
        avr_ioport_write(avr, p->r_port, avr->data[p->r_port] ^ v, param);
 }
 
+/*
+ * This is a the callback for the DDR register. There is nothing much to do here, apart
+ * from triggering an IRQ in case any 'client' code is interested in the information.
+ */
+static void avr_ioport_ddr_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
+{
+       avr_ioport_t * p = (avr_ioport_t *)param;
+
+       avr_raise_irq(p->io.irq + IOPORT_IRQ_DIRECTION_ALL, v);
+       avr_core_watch_write(avr, addr, v);
+}
+
 /*
  * this is our "main" pin change callback, it can be triggered by either the
  * AVR code, or any external piece of code that see fit to do it.
@@ -172,5 +184,6 @@ void avr_ioport_init(avr_t * avr, avr_ioport_t * p)
        avr_register_io_write(avr, p->r_port, avr_ioport_write, p);
        avr_register_io_read(avr, p->r_pin, avr_ioport_read, p);
        avr_register_io_write(avr, p->r_pin, avr_ioport_pin_write, p);
+       avr_register_io_write(avr, p->r_ddr, avr_ioport_ddr_write, p);
 }
 
index 1fc2ba4a73e88ecf451c5d25f2327481a4d0b238..06497e220593821c32ca6bf79f4d4b87e538b19d 100644 (file)
@@ -29,6 +29,7 @@ enum {
        IOPORT_IRQ_PIN1,IOPORT_IRQ_PIN2,IOPORT_IRQ_PIN3,IOPORT_IRQ_PIN4,
        IOPORT_IRQ_PIN5,IOPORT_IRQ_PIN6,IOPORT_IRQ_PIN7,
        IOPORT_IRQ_PIN_ALL,
+       IOPORT_IRQ_DIRECTION_ALL,
        IOPORT_IRQ_COUNT
 };