summaryrefslogtreecommitdiff
path: root/src/attiny/ao_async.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-04-06 22:27:37 -0700
committerKeith Packard <keithp@keithp.com>2014-04-06 22:27:37 -0700
commit4211c59e585545817b3cac02b41bb73106d6403e (patch)
treefa0acd3457ba0631c7b712476a30ea23010473e1 /src/attiny/ao_async.c
parent350d941a825d0271933de0bfdea82d3af5744c21 (diff)
altos: Fix nanopeak compile
Nanopeak uses port B bit 3 for the LED instead of bit 4. Fix the async code to support arbitrary bits for the serial LED. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/attiny/ao_async.c')
-rw-r--r--src/attiny/ao_async.c45
1 files changed, 34 insertions, 11 deletions
diff --git a/src/attiny/ao_async.c b/src/attiny/ao_async.c
index 9f7fd6d7..f64f7bde 100644
--- a/src/attiny/ao_async.c
+++ b/src/attiny/ao_async.c
@@ -52,10 +52,6 @@ ao_async_byte(uint8_t byte)
ao_arch_block_interrupts();
-#if AO_LED_SERIAL != 4
-#error "expect AO_LED_SERIAL to be 4"
-#endif
-
/* Ok, this is a bit painful.
* We need this loop to be precisely timed, which
* means knowing exactly how many instructions will
@@ -72,18 +68,45 @@ ao_async_byte(uint8_t byte)
" andi %[v], %[led_mask]\n" // mask to clear LED bit
" mov %[bit], %[w_lo]\n" // get current data byte
" andi %[bit], 0x01\n" // get current data bit
- " swap %[bit]\n" // rotate by 4 (AO_LED_SERIAL is 4)
- " andi %[bit], 0xf0\n" // mask off other 4 bits
- " or %[v], %[bit]\n" // add to register
- " out %[port], %[v]\n" // write current value
- " lsr %[w_hi]\n" // shift data
- " ror %[w_lo]\n" // ...
+#if AO_LED_SERIAL >= 1
+ " add %[bit],%[bit]\n" // shift by one
+#else
+ " nop\n"
+#endif
+#if AO_LED_SERIAL >= 2
+ " add %[bit],%[bit]\n" // shift by one
+#else
+ " nop\n"
+#endif
+#if AO_LED_SERIAL >= 3
+ " add %[bit],%[bit]\n" // shift by one
+#else
" nop\n"
+#endif
+#if AO_LED_SERIAL >= 4
+ " add %[bit],%[bit]\n" // shift by one
+#else
" nop\n"
+#endif
+#if AO_LED_SERIAL >= 5
+ " add %[bit],%[bit]\n" // shift by one
+#else
" nop\n"
+#endif
+#if AO_LED_SERIAL >= 6
+ " add %[bit],%[bit]\n" // shift by one
+#else
" nop\n"
+#endif
+#if AO_LED_SERIAL >= 7
+ " add %[bit],%[bit]\n" // shift by one
+#else
" nop\n"
-
+#endif
+ " or %[v], %[bit]\n" // add to register
+ " out %[port], %[v]\n" // write current value
+ " lsr %[w_hi]\n" // shift data
+ " ror %[w_lo]\n" // ...
" nop\n"
" nop\n"
" nop\n"