~ruther/qmk_firmware

c6b7a0d386c347f20117943831a0215659d37c47 — Nick Brassel 5 years ago 8a4a0c2
Add support for DMAMUX-capable MCU configuration with WS2812 PWM driver. (#9471)

2 files changed, 10 insertions(+), 1 deletions(-)

M docs/ws2812_driver.md
M drivers/chibios/ws2812_pwm.c
M docs/ws2812_driver.md => docs/ws2812_driver.md +2 -1
@@ 92,6 92,7 @@ Configure the hardware via your config.h:
#define WS2812_PWM_PAL_MODE 2  // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2  // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#define WS2812_DMA_CHANNEL 2  // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
```

You must also turn on the PWM feature in your halconf.h and mcuconf.h


@@ 117,5 118,5 @@ Note: This only applies to STM32 boards.

 To configure the `RGB_DI_PIN` to open drain configuration add this to your config.h file: 
```c
 #define WS2812_EXTERNAL_PULLUP 
#define WS2812_EXTERNAL_PULLUP
```

M drivers/chibios/ws2812_pwm.c => drivers/chibios/ws2812_pwm.c +8 -0
@@ 23,6 23,9 @@
#ifndef WS2812_DMA_CHANNEL
#    define WS2812_DMA_CHANNEL 2  // DMA Channel for TIMx_UP
#endif
#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) && !defined(WS2812_DMAMUX_ID)
#    error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
#endif

// Push Pull or Open Drain Configuration
// Default Push Pull


@@ 184,6 187,11 @@ void ws2812_init(void) {
    dmaStreamSetMode(WS2812_DMA_STREAM, STM32_DMA_CR_CHSEL(WS2812_DMA_CHANNEL) | STM32_DMA_CR_DIR_M2P | STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_MINC | STM32_DMA_CR_CIRC | STM32_DMA_CR_PL(3));
    // M2P: Memory 2 Periph; PL: Priority Level

#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE)
    // If the MCU has a DMAMUX we need to assign the correct resource
    dmaSetRequestSource(WS2812_DMA_STREAM, WS2812_DMAMUX_ID);
#endif

    // Start DMA
    dmaStreamEnable(WS2812_DMA_STREAM);