aboutsummaryrefslogtreecommitdiff
path: root/src/ioport.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ioport.c')
-rw-r--r--src/ioport.c105
1 files changed, 53 insertions, 52 deletions
diff --git a/src/ioport.c b/src/ioport.c
index a77e564..3cc9406 100644
--- a/src/ioport.c
+++ b/src/ioport.c
@@ -3,9 +3,9 @@
#ifdef CONFIG_PCINT
struct PCIW {
- uint8_t flags;
- uint8_t mask;
- void (*change) (uint8_t group, uint8_t mask);
+ uint8_t flags;
+ uint8_t mask;
+ void (*change) (uint8_t group, uint8_t mask);
};
// Exploiting implementation of libc malloc
@@ -14,8 +14,8 @@ struct PCIW {
#if (defined MCUSUPPORT_PCINT0 && defined MCUSUPPORT_PCINT1 && defined MCUSUPPORT_PCINT2)
#define PCI_COUNT 3
#elif (defined MCUSUPPORT_PCINT0 && defined MCUSUPPORT_PCINT1 || \
- defined MCUSUPPORT_PCINT1 && defined MCUSUPPORT_PCINT2 || \
- defined MCUSUPPORT_PCINT2 && defined MCUSUPPORT_PCINT0)
+ defined MCUSUPPORT_PCINT1 && defined MCUSUPPORT_PCINT2 || \
+ defined MCUSUPPORT_PCINT2 && defined MCUSUPPORT_PCINT0)
#define PCI_COUNT 2
#elif (defined MCUSUPPORT_PCINT0 || defined MCUSUPPORT_PCINT1 || defined MCUSUPPORT_PCINT2)
#define PCI_COUNT 1
@@ -28,84 +28,85 @@ struct PCIW {
static struct PCIW *pciw[PCI_COUNT];
static uint8_t pci_state[PCI_COUNT];
static void pci(int8_t group, int8_t pinmax) {
- int8_t i, y;
- int8_t index = GROUP2INDEX(group);
- int8_t len = (int8_t) PCIW_LEN(pciw[index]);
- // WARN Is possible that PCINT0 is not corresponding with B group and so on?
- uint8_t state = IOE_IO_PIN(group);
- for (i = len; i >= 0; i--) {
- uint8_t stA = state & pciw[index][i].mask;
- uint8_t stB = pci_state[index] & pciw[index][i].mask;
- if (((~stA & stB) && pciw[index][i].flags & IOE_IO_RISING) ||
- ((stA & ~stB) && pciw[index][i].flags & IOE_IO_FALLING)) {
- pciw[index][i].change(IOE_IO_B, mask);
- }
- }
- pci_state[index] = state;
+ int8_t i, y;
+ int8_t index = GROUP2INDEX(group);
+ int8_t len = (int8_t) PCIW_LEN(pciw[index]);
+ // WARN Is possible that PCINT0 is not corresponding with B group and so on?
+ uint8_t state = IOE_IO_PIN(group);
+ for (i = len; i >= 0; i--) {
+ uint8_t stA = state & pciw[index][i].mask;
+ uint8_t stB = pci_state[index] & pciw[index][i].mask;
+ if (((~stA & stB) && pciw[index][i].flags & IOE_IO_RISING) ||
+ ((stA & ~stB) && pciw[index][i].flags & IOE_IO_FALLING)) {
+ pciw[index][i].change(IOE_IO_B, mask);
+ }
+ }
+ pci_state[index] = state;
}
void io_change_sethook(uint8_t group, uint8_t mask, uint8_t edge,
- void (*change) (uint8_t group, uint8_t mask)) {
- int8_t index = (int8_t) GROUP2INDEX(group);
- int8_t len = (int8_t) PCIW_LEN(pciw[index]);
- pciw[index] = realloc(pciw[index], len + 1);
- pciw[index][len].flags = edge;
- pciw[index][len].mask = mask;
- pciw[index][len].change = change;
- switch (group) {
+ void (*change) (uint8_t group, uint8_t mask)) {
+ int8_t index = (int8_t) GROUP2INDEX(group);
+ int8_t len = (int8_t) PCIW_LEN(pciw[index]);
+ pciw[index] = realloc(pciw[index], len + 1);
+ pciw[index][len].flags = edge;
+ pciw[index][len].mask = mask;
+ pciw[index][len].change = change;
+ switch (group) {
#ifdef MCUSUPPORT_PCINT0 // TODO this wont work with attiny4313 and meaby others
- case IO_B:
- PCICR |= (1<<0);
- PCMSK0 |= mask;
- break;
+ case IO_B:
+ PCICR |= (1<<0);
+ PCMSK0 |= mask;
+ break;
#endif
#ifdef MCUSUPPORT_PCINT1
- case IO_C:
- PCICR |= (1<<1);
- PCMSK1 |= mask;
- break;
+ case IO_C:
+ PCICR |= (1<<1);
+ PCMSK1 |= mask;
+ break;
#endif
#ifdef MCUSUPPORT_PCINT2
- case IO_D:
- PCICR |= (1<<2);
- PCMSK2 |= mask;
- break
+ case IO_D:
+ PCICR |= (1<<2);
+ PCMSK2 |= mask;
+ break
#endif
- }
+ }
}
void io_change_remhook(void (*change) (uint8_t group, uint8_t mask)) {
- int8_t i, y;
- int8_t len;
- for (i = PCI_COUNT - 1; i >= 0; i--) {
- len = (int8_t)PCIW_LEN(pciw[index]);
- for (y = len - 1; y >= 0; y--) {
- if (pciw[i][y].change == change) {
+ int8_t i, y;
+ int8_t len;
+ for (i = PCI_COUNT - 1; i >= 0; i--) {
+ len = (int8_t)PCIW_LEN(pciw[index]);
+ for (y = len - 1; y >= 0; y--) {
+ if (pciw[i][y].change == change) {
- }
- }
- }
+ }
+ }
+ }
}
void io_change_clearhooks(void) {
+ // TODO
}
// WARN This will work only if C is only defined on MCU with also B defined.
#ifdef MCUSUPPORT_PCINT0
ISR(PCINT0_vect, ISR_BLOCK) {
- pci(IO_B, MCUSUPPORT_PCINT0);
+ pci(IO_B, MCUSUPPORT_PCINT0);
}
#endif /* MCUSUPPORT_PCINT0 */
#ifdef MCUSUPPORT_PCINT1
ISR(PCINT1_vect, ISR_BLOCK) {
- pci(IO_C, MCUSUPPORT_PCINT1);
+ pci(IO_C, MCUSUPPORT_PCINT1);
}
#endif /* MCUSUPPORT_PCINT1 */
#ifdef MCUSUPPORT_PCINT2
ISR(PCINT2_vect, ISR_BLOCK) {
- pci(IO_D, MCUSUPPORT_PCINT2);
+ pci(IO_D, MCUSUPPORT_PCINT2);
}
#endif /* MCUSUPPORT_PCINT2 */