mirror of
https://github.com/mon/PocketVoltex.git
synced 2026-09-29 18:28:08 +03:00
54 lines
1.2 KiB
C
54 lines
1.2 KiB
C
#include <Config.h>
|
|
|
|
#define R 0
|
|
#define G 1
|
|
#define B 2
|
|
|
|
static const uint8_t SK9822_map[] = {0, 2, 4, 6, 7, 5, 3, 1};
|
|
|
|
void led_init(void) {
|
|
// SS/SCLK/MOSI PB0/1/2
|
|
// We set SS to output so it's not used for SPI things
|
|
// If SS = input, it can freeze SPI comms - see "SS Pin functionality"
|
|
DDRB |= _BV(0) | _BV(1) | _BV(2);
|
|
|
|
// SPI enabled, master mode, CLK/4 speed
|
|
SPCR = _BV(SPE)|_BV(MSTR);
|
|
|
|
// normal speed mode
|
|
SPSR = 0;
|
|
}
|
|
|
|
// busy wait
|
|
void SPI_write(uint8_t val) {
|
|
cli();
|
|
SPDR = val;
|
|
while(!(SPSR & _BV(SPIF)))
|
|
;
|
|
SPSR = _BV(SPIF); // clear flag
|
|
sei();
|
|
}
|
|
|
|
void led_commit(void) {
|
|
SPI_write(0x00); // Start Frame
|
|
SPI_write(0x00);
|
|
SPI_write(0x00);
|
|
SPI_write(0x00);
|
|
|
|
for (uint8_t i = 0; i < LED_COUNT; i++)
|
|
{
|
|
SPI_write(0xe0 | (sdvxConfig.ledBrightness & 31)); // Maximum global brightness
|
|
uint8_t offset = SK9822_map[i] * 3;
|
|
SPI_write(leds[offset+B]);
|
|
SPI_write(leds[offset+G]);
|
|
SPI_write(leds[offset+R]);
|
|
}
|
|
|
|
// Reset frame - Only needed for SK9822, has no effect on APA102
|
|
SPI_write(0x00);
|
|
SPI_write(0x00);
|
|
SPI_write(0x00);
|
|
SPI_write(0x00);
|
|
// End frame - 1 for every 16 LEDs
|
|
SPI_write(0x00);
|
|
} |