14FASTLED_NAMESPACE_BEGIN
16#if defined(FASTLED_TEENSY3) && (F_CPU > 48000000)
17#define DATA_RATE_MHZ(X) (((48000000L / 1000000L) / X))
18#define DATA_RATE_KHZ(X) (((48000000L / 1000L) / X))
19#elif defined(FASTLED_TEENSY4) || (defined(ESP32) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)) || (defined(ESP8266) && defined(FASTLED_ALL_PINS_HARDWARE_SPI))
21#define DATA_RATE_MHZ(X) (1000000 * (X))
22#define DATA_RATE_KHZ(X) (1000 * (X))
25#define DATA_RATE_MHZ(X) ((F_CPU / 1000000L) / X)
27#define DATA_RATE_KHZ(X) ((F_CPU / 1000L) / X)
37#if !defined(FASTLED_ALL_PINS_HARDWARE_SPI)
39template<u
int8_t _DATA_PIN, u
int8_t _CLOCK_PIN, u
int32_t _SPI_CLOCK_DIVIDER>
44template<u
int8_t _DATA_PIN, u
int8_t _CLOCK_PIN, u
int32_t _SPI_CLOCK_DIVIDER>
47#ifndef FASTLED_FORCE_SOFTWARE_SPI
49#if defined(NRF51) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
50template<u
int8_t _DATA_PIN, u
int8_t _CLOCK_PIN, u
int32_t _SPI_CLOCK_DIVIDER>
51class SPIOutput :
public NRF51SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
54#if defined(NRF52_SERIES) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
55template<u
int8_t _DATA_PIN, u
int8_t _CLOCK_PIN, u
int32_t _SPI_CLOCK_DIVIDER>
56class SPIOutput :
public NRF52SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
59#if defined(FASTLED_APOLLO3) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
60template<u
int8_t _DATA_PIN, u
int8_t _CLOCK_PIN, u
int32_t _SPI_CLOCK_DIVIDER>
61class SPIOutput :
public APOLLO3HardwareSPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
64#if defined(ESP32) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
65template<u
int8_t _DATA_PIN, u
int8_t _CLOCK_PIN, u
int32_t _SPI_CLOCK_DIVIDER>
66class SPIOutput :
public ESP32SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
69#if defined(ESP8266) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
70template<u
int8_t _DATA_PIN, u
int8_t _CLOCK_PIN, u
int32_t _SPI_CLOCK_DIVIDER>
71class SPIOutput :
public ESP8266SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
74#if defined(SPI_DATA) && defined(SPI_CLOCK)
76#if defined(FASTLED_TEENSY3) && defined(ARM_HARDWARE_SPI)
78template<u
int32_t SPI_SPEED>
79class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> :
public ARMHardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED, 0x4002C000> {};
83template<u
int32_t SPI_SPEED>
84class SPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED> :
public ARMHardwareSPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED, 0x4002C000> {};
86template<u
int32_t SPI_SPEED>
87class SPIOutput<SPI_DATA, SPI2_CLOCK, SPI_SPEED> :
public ARMHardwareSPIOutput<SPI_DATA, SPI2_CLOCK, SPI_SPEED, 0x4002C000> {};
89template<u
int32_t SPI_SPEED>
90class SPIOutput<SPI2_DATA, SPI_CLOCK, SPI_SPEED> :
public ARMHardwareSPIOutput<SPI2_DATA, SPI_CLOCK, SPI_SPEED, 0x4002C000> {};
93#elif defined(FASTLED_TEENSY4) && defined(ARM_HARDWARE_SPI)
95template<u
int32_t SPI_SPEED>
96class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> :
public Teensy4HardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED, SPI, 0> {};
98template<u
int32_t SPI_SPEED>
99class SPIOutput<SPI1_DATA, SPI1_CLOCK, SPI_SPEED> :
public Teensy4HardwareSPIOutput<SPI1_DATA, SPI1_CLOCK, SPI_SPEED, SPI1, 1> {};
101template<u
int32_t SPI_SPEED>
102class SPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED> :
public Teensy4HardwareSPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED, SPI2, 2> {};
104#elif defined(FASTLED_TEENSYLC) && defined(ARM_HARDWARE_SPI)
106#define DECLARE_SPI0(__DATA,__CLOCK) template<uint32_t SPI_SPEED>\
107 class SPIOutput<__DATA, __CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<__DATA, __CLOCK, SPI_SPEED, 0x40076000> {};
108 #define DECLARE_SPI1(__DATA,__CLOCK) template<uint32_t SPI_SPEED>\
109 class SPIOutput<__DATA, __CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<__DATA, __CLOCK, SPI_SPEED, 0x40077000> {};
123#elif defined(__SAM3X8E__)
125template<u
int32_t SPI_SPEED>
126class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> :
public SAMHardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> {};
128#elif defined(AVR_HARDWARE_SPI)
130template<u
int32_t SPI_SPEED>
131class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> :
public AVRHardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> {};
133#if defined(SPI_UART0_DATA)
135template<u
int32_t SPI_SPEED>
136class SPIOutput<SPI_UART0_DATA, SPI_UART0_CLOCK, SPI_SPEED> :
public AVRUSART0SPIOutput<SPI_UART0_DATA, SPI_UART0_CLOCK, SPI_SPEED> {};
140#if defined(SPI_UART1_DATA)
142template<u
int32_t SPI_SPEED>
143class SPIOutput<SPI_UART1_DATA, SPI_UART1_CLOCK, SPI_SPEED> :
public AVRUSART1SPIOutput<SPI_UART1_DATA, SPI_UART1_CLOCK, SPI_SPEED> {};
147#elif defined(ARDUNIO_CORE_SPI)
149template<u
int32_t SPI_SPEED>
150class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> :
public ArdunioCoreSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED, SPI> {};
155# if !defined(FASTLED_INTERNAL) && !defined(FASTLED_ALL_PINS_HARDWARE_SPI)
156# ifdef FASTLED_HAS_PRAGMA_MESSAGE
157# pragma message "No hardware SPI pins defined. All SPI access will default to bitbanged output"
159# warning "No hardware SPI pins defined. All SPI access will default to bitbanged output"
170# if !defined(FASTLED_INTERNAL) && !defined(FASTLED_ALL_PINS_HARDWARE_SPI)
171# ifdef FASTLED_HAS_PRAGMA_MESSAGE
172# pragma message "Forcing software SPI - no hardware SPI for you!"
174# warning "Forcing software SPI - no hardware SPI for you!"
central include file for FastLED, defines the CFastLED class/object
Software SPI (aka bit-banging) support Includes aggressive optimizations for when the clock and data ...
base definitions used by led controllers for writing out led data
Software SPI (aka bit-banging) support.
Fast, efficient 8-bit math functions specifically designed for high-performance LED programming.