aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/icestorm/firmware.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/icestorm/firmware.c')
-rw-r--r--scripts/icestorm/firmware.c28
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);
+ }
+}