diff options
Diffstat (limited to 'scripts/icestorm/firmware.c')
-rw-r--r-- | scripts/icestorm/firmware.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/scripts/icestorm/firmware.c b/scripts/icestorm/firmware.c new file mode 100644 index 0000000..b400ba0 --- /dev/null +++ b/scripts/icestorm/firmware.c @@ -0,0 +1,28 @@ +#include <stdint.h> + +#define SHIFT_COUNTER_BITS 16 + +void output(uint8_t c) +{ + *(volatile char*)0x10000000 = c; +} + +void output_gray(uint8_t c) +{ + unsigned int in_buf = c, out_buf = 0; + for (int i = 0; i < 8; i++) { + unsigned int bit = (in_buf & 1) ^ ((in_buf >> 1) & 1); + in_buf = in_buf >> 1; + out_buf = (out_buf << 1) | bit; + } + output(out_buf); +} + +void main() +{ + for (uint32_t counter = (2+4+32+64) << SHIFT_COUNTER_BITS;; counter++) { + asm volatile ("" : : "r"(counter)); + if ((counter & ~(~0 << SHIFT_COUNTER_BITS)) == 0) + output_gray(counter >> SHIFT_COUNTER_BITS); + } +} |