diff options
Diffstat (limited to 'src/kern/main.c')
-rw-r--r-- | src/kern/main.c | 84 |
1 files changed, 72 insertions, 12 deletions
diff --git a/src/kern/main.c b/src/kern/main.c index 5af5fa7..4acdedb 100644 --- a/src/kern/main.c +++ b/src/kern/main.c @@ -85,6 +85,14 @@ static size_t compiled_len; extern uint8_t sintable[256]; +static uint32_t time; + +void on_systick() +{ + // klogf("Systick.\n"); + ++time; +} + static void spi_write(uint8_t byte) { while (!regget(SPI1.s_r, spi_txe)) @@ -97,6 +105,8 @@ static void write_rgb(uint8_t red, uint8_t green, uint8_t blue) { #undef BIT #define BIT(b, n) (!!((b) & (1 << (n)))) + spi_write(0); + spi_write( (1 << 7) | (BIT(green, 7) << 6) | (0 << 5) | (0 << 4) | (1 << 3) | (BIT(green, 6) << 2) | (0 << 1) | (0 << 0)); @@ -135,6 +145,8 @@ static void write_rgb(uint8_t red, uint8_t green, uint8_t blue) spi_write( (1 << 7) | (BIT(blue, 1) << 6) | (0 << 5) | (0 << 4) | (1 << 3) | (BIT(blue, 0) << 2) | (0 << 1) | (0 << 0)); + + spi_write(0); } void latch() @@ -144,42 +156,90 @@ void latch() } } +static uint8_t amp(uint8_t in) +{ + uint8_t out = in; + + for (int i = 0; i < 10; ++ i) { + out = (out * in) / 256; + } + + return out; +} + /* Main function. This gets executed from the interrupt vector defined above. */ int main() { gpio_reserved_pin_t sysled = get_sysled(); + klogf("Start\n"); klogf("sintable: %p\n", sintable); klogf("sintable[5]: %d\n", sintable[5]); + klogf("Flashed with OpenOCD!\n"); + + SCB.strv_r = 1000; + + /* Enable interrupts. */ + regset(SCB.stcs_r, scb_tickint, 1); -#define SIZE 16 + /* Start the systick. */ + regset(SCB.stcs_r, scb_enable, 1); + +#define SIZE 128 rgb_t rgb[SIZE]; for (int i = 0; i < SIZE; ++i) { - rgb[i].g = 0x18; - rgb[i].r = 0x80; - rgb[i].b = 0x18; + rgb[i].g = 0xff; + rgb[i].r = 0xff; + rgb[i].b = 0xff; } - uint8_t red = 0x30; - uint8_t green = 0x30; - uint8_t blue = 0x00; + uint8_t red = 0x40; + uint8_t green = 0x40; + uint8_t blue = 0x40; // compiled = ws2812b_compile_rgb(rgb, SIZE); // compiled_len = SIZE * 9; configure_spi1(); - set_gpio_pin_high(sysled); - for (int i = 0; i < 100; ++ i) { + for (int i = 0; i < 100; ++i) { write_rgb(0, 0, 0); } latch(); - for (int i = 0; i < 256; ++i) { - write_rgb(red, byte_sin((i * 16) & 0xff) / 2, blue); + for (;;) { + set_gpio_pin_high(sysled); + + latch(); + + int i; + for (i = 0; i < SIZE; ++i) { + red = byte_sin((i * 4 * 2 + time / 1000) & 0xff) / 2; + green = byte_sin((i * 4 * 3 + time / 1000) & 0xff) / 2; + blue = amp(byte_sin((i * 2 * 3 + time / 1000) & 0xff)) / 2; + + // uint8_t red = byte_sin((i * 8 + 64 + time / 100) & 0xff); + // uint8_t green = byte_sin((i * 8 + 0 + time / 100) & 0xff); + // uint32_t blue = (((red - 128) * (green - 128)) / 256) + 128; + + write_rgb(red, green, blue); + } + + // write_rgb(0,0,0); + // write_rgb(0,0,0); + // write_rgb(0,0,0); + // write_rgb(0,0,0); + // write_rgb(0,0,0); + // write_rgb(0,0,0); + // write_rgb(0,0,0); + // write_rgb(0,0,0); + // write_rgb(red, green, blue); + + set_gpio_pin_low(sysled); + + latch(); } - set_gpio_pin_low(sysled); for (;;) { spi_write(0); |