A UART can provide the perfect timing for the WS2812.
One bit of the WS2812 stream is built from 3 bits of the UART. A zero is transmitted with 1 of 3 bits set. A one is transmitted with 2 of 3 bits set.
With 2.4MBaud the timing is 417us / 833us. This matches perfectly the specification.
Each WS2812 bit is formed with 3 UART Bits. The first is always 1, the last always 0. The Bit in the middle defines the State.
Three of these WS2812 bits (WB) require 9 UART bits. This is 1 Start- 7 Data- and 1 Stopbit.
STA /WB0 0 1 /WB1 0 1 /WB2 STO
The output signal must be inverted for proper polarity of STA and STO. Since a HCT driver is needed anyway, the only difference is to use an inverting buffer (NAND / NOR)
Only 8 Bytes are required to drive 1 LED. TxFIFO if available reduces ISR rate furthermore.
I'd be glad to help improving the support for WS2812. I use this kind of driver with CortexM3 devices LPC1343, LPC1517. It works fine !
Can anyone confirm that the Pi UART supports a Baudrate between 2.25MBaud and 2.4MBaud ?