Browse Source

Teensy LC - work in progress...

main_ledos
PaulStoffregen 7 years ago
parent
commit
467f93ca4e
2 changed files with 42 additions and 9 deletions
  1. +41
    -8
      WS2812Serial.cpp
  2. +1
    -1
      keywords.txt

+ 41
- 8
WS2812Serial.cpp View File

bool WS2812Serial::begin() bool WS2812Serial::begin()
{ {
uint32_t divisor, portconfig, hwtrigger; uint32_t divisor, portconfig, hwtrigger;
#if defined(KINETISK)
KINETISK_UART_t *uart; KINETISK_UART_t *uart;
#elif defined(KINETISL)
KINETISL_UART_t *uart;
#endif


switch (pin) { switch (pin) {
#if defined(KINETISK)
#if defined(KINETISK) // Teensy 3.x
case 1: // Serial1 case 1: // Serial1
case 5: case 5:
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
SIM_SCGC1 |= SIM_SCGC1_UART5; SIM_SCGC1 |= SIM_SCGC1_UART5;
break; break;
#endif #endif
#elif defined(KINETISL)
// TODO: Teesny LC support....

#elif defined(KINETISL) // Teensy LC
case 1: // Serial1
case 5:
uart = &KINETISK_UART0;
divisor = 2;
portconfig = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3);
hwtrigger = DMAMUX_SOURCE_UART0_TX;
SIM_SCGC4 |= SIM_SCGC4_UART0;
break;
case 4:
uart = &KINETISK_UART0;
divisor = 2;
portconfig = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(2);
hwtrigger = DMAMUX_SOURCE_UART0_TX;
SIM_SCGC4 |= SIM_SCGC4_UART0;
break;
case 24:
uart = &KINETISK_UART0;
divisor = 2;
portconfig = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(4);
hwtrigger = DMAMUX_SOURCE_UART0_TX;
SIM_SCGC4 |= SIM_SCGC4_UART0;
break;
#endif #endif
default: default:
return false; // pin not supported return false; // pin not supported
dma = new DMAChannel; dma = new DMAChannel;
if (!dma) return false; // unable to allocate DMA channel if (!dma) return false; // unable to allocate DMA channel
} }
#if defined(KINETISK)
uart->BDH = (divisor >> 13) & 0x1F; uart->BDH = (divisor >> 13) & 0x1F;
uart->BDL = (divisor >> 5) & 0xFF; uart->BDL = (divisor >> 5) & 0xFF;
uart->C4 = divisor & 0x1F; uart->C4 = divisor & 0x1F;
#elif defined(KINETISL)
uart->BDH = (divisor >> 8) & 0x1F;
uart->BDL = divisor & 0xFF;
uart->C4 = 9;
#endif
uart->C1 = 0; uart->C1 = 0;
uart->PFIFO = 0;
uart->C2 = UART_C2_TE | UART_C2_TIE; uart->C2 = UART_C2_TE | UART_C2_TIE;
uart->C3 = UART_C3_TXINV; uart->C3 = UART_C3_TXINV;
uart->C5 = UART_C5_TDMAS; uart->C5 = UART_C5_TDMAS;
#if defined(KINETISK)
uart->PFIFO = 0; // TODO: is this ok for Serial3-6?
#endif
*(portConfigRegister(pin)) = portconfig; *(portConfigRegister(pin)) = portconfig;
dma->destination(uart->D); dma->destination(uart->D);
dma->triggerAtHardwareEvent(hwtrigger); dma->triggerAtHardwareEvent(hwtrigger);
void WS2812Serial::show() void WS2812Serial::show()
{ {
// wait if prior DMA still in progress // wait if prior DMA still in progress
#if defined(KINETISK)
while ((DMA_ERQ & (1 << dma->channel))) { while ((DMA_ERQ & (1 << dma->channel))) {
yield(); yield();
} }
#elif defined(KINETISL)
while ((dma->CFG->DCR & DMA_DCR_ERQ)) {
yield();
}
#elif defined(KINETISL)
#endif
// wait 300us WS2812 reset time // wait 300us WS2812 reset time
uint32_t min_elapsed = ((numled * 34134) >> 10) + 300; uint32_t min_elapsed = ((numled * 34134) >> 10) + 300;
if (min_elapsed < 2500) min_elapsed = 2500; if (min_elapsed < 2500) min_elapsed = 2500;

+ 1
- 1
keywords.txt View File

OctoWS2811 KEYWORD1
WS2812Serial KEYWORD1
setPixel KEYWORD2 setPixel KEYWORD2
getPixel KEYWORD2 getPixel KEYWORD2
show KEYWORD2 show KEYWORD2

Loading…
Cancel
Save