1 #ifndef __INC_FASTPIN_H
2 #define __INC_FASTPIN_H
6 #include "led_sysdefs.h"
8 #pragma GCC diagnostic push
9 #pragma GCC diagnostic ignored "-Wignored-qualifiers"
14 FASTLED_NAMESPACE_BEGIN
26 virtual void select() = 0;
27 virtual void release() = 0;
28 virtual bool isSelected() = 0;
31 #if !defined(FASTLED_NO_PINMAP)
34 volatile RwReg *mPort;
35 volatile RoReg *mInPort;
40 mPinMask = digitalPinToBitMask(mPin);
41 mPort = (
volatile RwReg*)portOutputRegister(digitalPinToPort(mPin));
42 mInPort = (
volatile RoReg*)portInputRegister(digitalPinToPort(mPin));
45 Pin(
int pin) : mPin(pin) { _init(); }
47 typedef volatile RwReg * port_ptr_t;
50 inline void setOutput() { pinMode(mPin, OUTPUT); }
51 inline void setInput() { pinMode(mPin, INPUT); }
53 inline void hi()
__attribute__ ((always_inline)) { *mPort |= mPinMask; }
54 inline void lo()
__attribute__ ((always_inline)) { *mPort &= ~mPinMask; }
56 inline void strobe()
__attribute__ ((always_inline)) { toggle(); toggle(); }
57 inline void toggle()
__attribute__ ((always_inline)) { *mInPort = mPinMask; }
59 inline void hi(
register port_ptr_t port)
__attribute__ ((always_inline)) { *port |= mPinMask; }
60 inline void lo(
register port_ptr_t port)
__attribute__ ((always_inline)) { *port &= ~mPinMask; }
61 inline void set(
register port_t val)
__attribute__ ((always_inline)) { *mPort = val; }
63 inline void fastset(
register port_ptr_t port,
register port_t val)
__attribute__ ((always_inline)) { *port = val; }
65 port_t hival()
__attribute__ ((always_inline)) {
return *mPort | mPinMask; }
66 port_t loval()
__attribute__ ((always_inline)) {
return *mPort & ~mPinMask; }
67 port_ptr_t port()
__attribute__ ((always_inline)) {
return mPort; }
68 port_t mask()
__attribute__ ((always_inline)) {
return mPinMask; }
70 virtual void select() { hi(); }
71 virtual void release() { lo(); }
72 virtual bool isSelected() {
return (*mPort & mPinMask) == mPinMask; }
89 volatile RwReg *mPort;
90 volatile RoReg *mInPort;
101 Pin(
int pin) : mPin(pin) { _init(); }
103 void setPin(
int pin) { mPin = pin; _init(); }
105 typedef volatile RwReg * port_ptr_t;
106 typedef RwReg port_t;
108 inline void setOutput() { }
109 inline void setInput() { }
111 inline void hi()
__attribute__ ((always_inline)) { *mPort |= mPinMask; }
112 inline void lo()
__attribute__ ((always_inline)) { *mPort &= ~mPinMask; }
114 inline void strobe()
__attribute__ ((always_inline)) { toggle(); toggle(); }
115 inline void toggle()
__attribute__ ((always_inline)) { *mInPort = mPinMask; }
117 inline void hi(
register port_ptr_t port)
__attribute__ ((always_inline)) { *port |= mPinMask; }
118 inline void lo(
register port_ptr_t port)
__attribute__ ((always_inline)) { *port &= ~mPinMask; }
119 inline void set(
register port_t val)
__attribute__ ((always_inline)) { *mPort = val; }
121 inline void fastset(
register port_ptr_t port,
register port_t val)
__attribute__ ((always_inline)) { *port = val; }
123 port_t hival()
__attribute__ ((always_inline)) {
return *mPort | mPinMask; }
124 port_t loval()
__attribute__ ((always_inline)) {
return *mPort & ~mPinMask; }
125 port_ptr_t port()
__attribute__ ((always_inline)) {
return mPort; }
126 port_t mask()
__attribute__ ((always_inline)) {
return mPinMask; }
128 virtual void select() { hi(); }
129 virtual void release() { lo(); }
130 virtual bool isSelected() {
return (*mPort & mPinMask) == mPinMask; }
159 #ifdef FASTLED_FORCE_SOFTWARE_PINS
161 static RwReg sPinMask;
162 static volatile RwReg *sPort;
163 static volatile RoReg *sInPort;
164 static void _init() {
165 #if !defined(FASTLED_NO_PINMAP)
166 sPinMask = digitalPinToBitMask(PIN);
167 sPort = portOutputRegister(digitalPinToPort(PIN));
168 sInPort = portInputRegister(digitalPinToPort(PIN));
172 typedef volatile RwReg * port_ptr_t;
173 typedef RwReg port_t;
175 inline static void setOutput() { _init(); pinMode(PIN, OUTPUT); }
176 inline static void setInput() { _init(); pinMode(PIN, INPUT); }
178 inline static void hi()
__attribute__ ((always_inline)) { *sPort |= sPinMask; }
179 inline static void lo()
__attribute__ ((always_inline)) { *sPort &= ~sPinMask; }
181 inline static void strobe()
__attribute__ ((always_inline)) { toggle(); toggle(); }
183 inline static void toggle()
__attribute__ ((always_inline)) { *sInPort = sPinMask; }
185 inline static void hi(
register port_ptr_t port)
__attribute__ ((always_inline)) { *port |= sPinMask; }
186 inline static void lo(
register port_ptr_t port)
__attribute__ ((always_inline)) { *port &= ~sPinMask; }
187 inline static void set(
register port_t val)
__attribute__ ((always_inline)) { *sPort = val; }
189 inline static void fastset(
register port_ptr_t port,
register port_t val)
__attribute__ ((always_inline)) { *port = val; }
191 static port_t hival()
__attribute__ ((always_inline)) {
return *sPort | sPinMask; }
192 static port_t loval()
__attribute__ ((always_inline)) {
return *sPort & ~sPinMask; }
193 static port_ptr_t port()
__attribute__ ((always_inline)) {
return sPort; }
194 static port_t mask()
__attribute__ ((always_inline)) {
return sPinMask; }
203 template<u
int8_t PIN>
class FastPin {
204 constexpr
static bool validpin() {
return false; }
206 static_assert(validpin(),
"Invalid pin specified");
208 static void _init() {
211 typedef volatile RwReg * port_ptr_t;
212 typedef RwReg port_t;
214 inline static void setOutput() { }
215 inline static void setInput() { }
220 inline static void strobe()
__attribute__ ((always_inline)) { }
222 inline static void toggle()
__attribute__ ((always_inline)) { }
224 inline static void hi(
register port_ptr_t port)
__attribute__ ((always_inline)) { }
225 inline static void lo(
register port_ptr_t port)
__attribute__ ((always_inline)) { }
226 inline static void set(
register port_t val)
__attribute__ ((always_inline)) { }
228 inline static void fastset(
register port_ptr_t port,
register port_t val)
__attribute__ ((always_inline)) { }
230 static port_t hival()
__attribute__ ((always_inline)) {
return 0; }
231 static port_t loval()
__attribute__ ((always_inline)) {
return 0;}
232 static port_ptr_t port()
__attribute__ ((always_inline)) {
return NULL; }
233 static port_t mask()
__attribute__ ((always_inline)) {
return 0; }
240 typedef volatile uint32_t & reg32_t;
241 typedef volatile uint32_t * ptr_reg32_t;
243 FASTLED_NAMESPACE_END
245 #pragma GCC diagnostic pop
247 #endif // __INC_FASTPIN_H
central include file for FastLED, defines the CFastLED class/object
The simplest level of Pin class.
__attribute__((always_inline)) inline void swapbits8(bitswap_type in
Do an 8byte by 8bit rotation.