# Copyright (c) 2017 Linaro Limited
# 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/

menuconfig WS2812_STRIP
	bool "Enable WS2812 (and compatible) LED strip driver"
	depends on SPI
	help
	  Enable LED strip driver for daisy chains of WS2812-ish
	  (or WS2812B, WS2813, SK6812, or compatible) devices.
	  These devices have a one-wire communications interface
	  which encodes bits using pulses. Short pulses indicate
	  zero bits, and long pulses indicate ones; refer to the
	  chip datasheets for precise specifications. To implement
	  this in a multitasking operating system, this driver
	  generates the pulses using a SPI peripheral.

if WS2812_STRIP

config WS2812_STRIP_MAX_PIXELS
	int "Maximum number of pixels in a strip"
	default 12
	help
	  Set this to the maximum number of pixels you need
	  to control at once. There is an 8x memory penalty associated
	  with each increment of this value, so it's worth optimizing.

config WS2812_STRIP_ONE_FRAME
	hex "SPI frame to shift out to signal a one bit"
	default 0x7c if SOC_SERIES_STM32F4X
	default 0x70 if SOC_FAMILY_NRF
	help
	  When shifted out at the configured clock frequency,
	  this must generate a pulse whose width fits within the chipset
	  specifications for T1H, and whose interpulse timing meets low
	  times. It is recommended that the first and last bits in the
	  frame be zero; this "encourages" SPI IPs to leave MOSI low
	  between frames.

config WS2812_STRIP_ZERO_FRAME
	hex "SPI frame to shift out to signal a zero bit"
	default 0x60 if SOC_SERIES_STM32F4X
	default 0x40 if SOC_FAMILY_NRF
	help
	  When shifted out at the configured clock frequency,
	  this must generate a pulse whose width fits within the chipset
	  specifications for T0H, and whose interpulse timing meets low
	  times. It is recommended that the first and last bits in the
	  frame be zero; this "encourages" SPI IPs to leave MOSI low
	  between frames.

# By default, we use GRBW [sic] (and ignore W).
comment "The following options determine channel data order on the wire."

config WS2812_RED_ORDER
	int "Order in which a red pixel should be shifted out"
	default 1
	range 0 3
	help
	  If the red channel is shifted out first, specify 0.
	  If second, specify 1, and so on.

config WS2812_GRN_ORDER
	int "Order in which a green pixel should be shifted out"
	default 0
	range 0 3
	help
	  If the green channel is shifted out first, specify 0.
	  If second, specify 1, and so on.

config WS2812_BLU_ORDER
	int "Order in which a blue pixel should be shifted out"
	default 2
	range 0 3
	help
	  If the blue channel is shifted out first, specify 0.
	  If second, specify 1, and so on.

config WS2812_HAS_WHITE_CHANNEL
	bool "Does the chip have a white channel on wire?"
	default y
	help
	  If the chipset has a white channel, say y. White channels
	  are not used by the driver, but must be declared if expected
	  by the chip.

config WS2812_WHT_ORDER
	int "Order in which a white pixel should be shifted out"
	default 3
	range 0 3
	depends on WS2812_HAS_WHITE_CHANNEL
	help
	  If the blue channel is shifted out first, specify 0.
	  If second, specify 1, and so on.

endif # WS2812_STRIP
