# Copyright (c) 2017 Linaro Limited
# Copyright (c) 2019 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0

# The following blog post is an excellent resource about pulse timing:
#
# https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/

config WS2812_STRIP_SPI
	bool "WS2812 LED strip SPI driver"
	default y
	depends on DT_HAS_WORLDSEMI_WS2812_SPI_ENABLED
	select SPI if $(dt_compat_on_bus,$(DT_COMPAT_WORLDSEMI_WS2812_SPI),spi)
	help
	  Enable driver for WS2812 (and compatibles) LED strip using SPI.
	  The SPI driver is portable, but requires significantly more
	  memory (1 byte of overhead per bit of pixel data).

config WS2812_STRIP_I2S
	bool "WS2812 LED strip I2S driver"
	default y
	depends on DT_HAS_WORLDSEMI_WS2812_I2S_ENABLED
	select I2S if $(dt_compat_on_bus,$(DT_COMPAT_WORLDSEMI_WS2812_I2S),i2s)
	help
	  Enable driver for WS2812 (and compatibles) LED strip using I2S.
	  Uses the I2S peripheral, memory usage is 4 bytes per color,
	  times the number of pixels. A few more for the start and end
	  delay. The reset delay has a coarse resolution of ~20us.

config WS2812_STRIP_GPIO
	bool "WS2812 LED strip GPIO driver"
	# Only an Cortex-M inline assembly implementation for the nRF91, nRF51,
	# nRF52 and nRF53 is supported currently.
	default y
	depends on DT_HAS_WORLDSEMI_WS2812_GPIO_ENABLED
	depends on (SOC_SERIES_NRF91X || SOC_SERIES_NRF51X || SOC_SERIES_NRF52X || SOC_SERIES_NRF53X)
	select LED_STRIP_RGB_SCRATCH
	help
	  Enable driver for WS2812 (and compatibles) LED strip directly
	  controlling with GPIO. The GPIO driver does bit-banging with inline
	  assembly, and is not available on all SoCs.

	  Note that this driver is not compatible with the Everlight B1414
	  controller.

if WS2812_STRIP_GPIO

DT_CHOSEN_LED_STRIP := zephyr,led-strip
DT_CHOSEN_LED_STRIP_PATH := $(dt_chosen_path,$(DT_CHOSEN_LED_STRIP))

config DELAY_T1H
	int "Delay 1 bit high pulse"
	default $(dt_node_int_prop_int,$(DT_CHOSEN_LED_STRIP_PATH),delay-t1h) \
		  if $(dt_node_has_prop,$(DT_CHOSEN_LED_STRIP_PATH),delay-t1h)
	default $(div,$(mul,700,$(dt_node_int_prop_int,/cpus/cpu@0,clock-frequency)),1000000000) \
		  if $(dt_node_has_prop,/cpus/cpu@0,clock-frequency)
	default 7
	help
	  Number of NOP assembly operations to create a delay for a 1 bit, high voltage period (default 700 nsec)

config DELAY_T1L
	int "Delay 1 bit low pulse"
	default $(dt_node_int_prop_int,$(DT_CHOSEN_LED_STRIP_PATH),delay-t1l) \
		  if $(dt_node_has_prop,$(DT_CHOSEN_LED_STRIP_PATH),delay-t1l)
	default $(div,$(mul,600,$(dt_node_int_prop_int,/cpus/cpu@0,clock-frequency)),1000000000) \
		  if $(dt_node_has_prop,/cpus/cpu@0,clock-frequency)
	default 6
	help
	  Number of NOP assembly operations to create a delay for a 1 bit, low voltage period (default 600 nsec)

config DELAY_T0H
	int "Delay 0 bit high pulse"
	default $(dt_node_int_prop_int,$(DT_CHOSEN_LED_STRIP_PATH),delay-t0h) \
		  if $(dt_node_has_prop,$(DT_CHOSEN_LED_STRIP_PATH),delay-t0h)
	default $(div,$(mul,350,$(dt_node_int_prop_int,/cpus/cpu@0,clock-frequency)),1000000000) \
		  if $(dt_node_has_prop,/cpus/cpu@0,clock-frequency)
	default 3
	help
	  Number of NOP assembly operations to create a delay for a 0 bit, high voltage period (default 350 nsec)

config DELAY_T0L
	int "Delay 0 bit low pulse"
	default $(dt_node_int_prop_int,$(DT_CHOSEN_LED_STRIP_PATH),delay-t0l) \
		  if $(dt_node_has_prop,$(DT_CHOSEN_LED_STRIP_PATH),delay-t0l)
	default $(div,$(mul,800,$(dt_node_int_prop_int,/cpus/cpu@0,clock-frequency)),1000000000) \
		  if $(dt_node_has_prop,/cpus/cpu@0,clock-frequency)
	default 8
	help
	  Number of NOP assembly operations to create a delay for a 0 bit, low voltage period  (default 800 nsec)

endif


config WS2812_STRIP_RPI_PICO_PIO
	bool "WS2812 LED strip Raspberry Pi Pico PIO driver"
	default y
	depends on DT_HAS_WORLDSEMI_WS2812_RPI_PICO_PIO_ENABLED
	select PICOSDK_USE_PIO
	help
	  Enable driver for WS2812 (and compatibles) LED strip using
	  the Raspberry Pi Pico's PIO.
