I have a working implementation which I'd like to share. Unfortunately the code is not yet ready to be included in the official distribution, because it is a pain to get consistent timing when the code is compiled with -O2.
However, here it is:
#define WSGPIO 0
static void send_ws_0()
{
uint8_t i;
i = 4; while(i--) WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1);
i = 9; while(i--) WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0);
}
static void send_ws_1()
{
uint8_t i;
i = 8; while(i--) WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1);
i = 5; while(i--) WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0);
}
// Lua: ws2812("string")
// Byte triples are interpreted as G R B values.
// gpio.ws2812(string.char(0, 255, 0)) sets the first LED red.
// gpio.ws2812(string.char(0, 0, 255):rep(10)) sets ten LEDs blue.
// gpio.ws2812(string.char(255, 0, 0, 255, 255, 255)) first LED green, second LED white.
static int lgpio_ws2812( lua_State* L )
{
size_t length;
const char *buffer = luaL_checklstring(L, 1, &length);
GPIO_OUTPUT_SET(GPIO_ID_PIN(WSGPIO), 0);
os_intr_lock();
const char *end = buffer + length;
while( buffer != end ) {
uint8_t mask = 0x80;
while (mask) {
(*buffer & mask) ? send_ws_1() : send_ws_0();
mask >>= 1;
}
++buffer;
}
os_intr_unlock();
return 0;
}
I added it to the gpio.c file and to make it available from Lua the gpio_map[] array needs this additional entry:
{ LSTRKEY( "ws2812" ), LFUNCVAL( lgpio_ws2812 ) },
The output pin is hardcoded to GPIO0.
I also changed the default baud rate to 115200.
So connect your WS2812 LEDs to GPIO0 and controll them like this:
// Lua: ws2812("string")
// Byte triples are interpreted as G R B values.
// gpio.ws2812(string.char(0, 255, 0)) sets the first LED red.
// gpio.ws2812(string.char(0, 0, 255):rep(10)) sets ten LEDs blue.
// gpio.ws2812(string.char(255, 0, 0, 255, 255, 255)) first LED green, second LED white.
A precompiled firmware binary, which can be flashed in the usual way is attached, together with a slightly more complicated example which does a simple color animation.
Enjoy,
Markus