WIP fixes for Teensy 3.2

This commit is contained in:
Phillip Burgess 2019-03-01 15:31:16 -08:00
parent d81e3351f3
commit 3aafb3d2cf
2 changed files with 59 additions and 21 deletions

View File

@ -87,6 +87,9 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h,
#if defined(USE_FAST_PINIO)
#if defined(HAS_PORT_SET_CLR)
#if defined(CORE_TEENSY)
#if !defined(KINETISK)
dcPinMask = digitalPinToBitMask(dc);
#endif
dcPortSet = portSetRegister(dc);
dcPortClr = portClearRegister(dc);
swspi.sckPortSet = portSetRegister(sck);
@ -94,9 +97,15 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h,
swspi.mosiPortSet = portSetRegister(mosi);
swspi.mosiPortClr = portClearRegister(mosi);
if(cs >= 0) {
#if !defined(KINETISK)
csPinMask = digitalPinToBitMask(cs);
#endif
csPortSet = portSetRegister(cs);
csPortClr = portClearRegister(cs);
} else {
#if !defined(KINETISK)
csPinMask = 0;
#endif
csPortSet = dcPortSet;
csPortClr = dcPortClr;
}
@ -211,16 +220,23 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass,
#if defined(USE_FAST_PINIO)
#if defined(HAS_PORT_SET_CLR)
#if defined(CORE_TEENSY)
#if !defined(KINETISK)
dcPinMask = digitalPinToBitMask(dc);
#endif
dcPortSet = portSetRegister(dc);
dcPortClr = portClearRegister(dc);
if(cs >= 0) {
#if !defined(KINETISK)
csPinMask = digitalPinToBitMask(cs);
#endif
csPortSet = portSetRegister(cs);
csPortClr = portClearRegister(dc);
csPortClr = portClearRegister(cs);
} else { // see comments below
#if !defined(KINETISK)
csPinMask = 0;
#endif
csPortSet = dcPortSet;
csPortClr = dcPortClr;
csPinMask = 0;
}
#else // !CORE_TEENSY
dcPinMask = digitalPinToBitMask(dc);
@ -302,18 +318,25 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth,
#if defined(USE_FAST_PINIO)
#if defined(HAS_PORT_SET_CLR)
#if defined(CORE_TEENSY)
tft8.wrPortSet =portSetRegister(wr);
tft8.wrPortClr =portClearRegister(wr);
dcPortSet =portSetRegister(dc);
dcPortClr =portClearRegister(dc);
tft8.wrPortSet = portSetRegister(wr);
tft8.wrPortClr = portClearRegister(wr);
#if !defined(KINETISK)
dcPinMask = digitalPinToBitMask(dc);
#endif
dcPortSet = portSetRegister(dc);
dcPortClr = portClearRegister(dc);
if(cs >= 0) {
csPinMask=digitalPinToBitMask(cs);
csPortSet=portSetRegister(cs);
csPortClr=portClearRegister(cs);
#if !defined(KINETISK)
csPinMask = digitalPinToBitMask(cs);
#endif
csPortSet = portSetRegister(cs);
csPortClr = portClearRegister(cs);
} else { // see comments below
#if !defined(KINETISK)
csPinMask = 0;
#endif
csPortSet = dcPortSet;
csPortClr = dcPortClr;
csPinMask = 0;
}
if(rd >= 0) { // if read-strobe pin specified...
#if defined(KINETISK)
@ -335,16 +358,16 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth,
tft8.dirSet = portModeRegister(d0);
tft8.dirClr = portModeRegister(d0);
#else // !CORE_TEENSY
tft8.wrPinMask =digitalPinToBitMask(wr);
tft8.wrPortSet =&(PORT->Group[g_APinDescription[wr].ulPort].OUTSET.reg);
tft8.wrPortClr =&(PORT->Group[g_APinDescription[wr].ulPort].OUTCLR.reg);
dcPinMask =digitalPinToBitMask(dc);
dcPortSet =&(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg);
dcPortClr =&(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg);
tft8.wrPinMask = digitalPinToBitMask(wr);
tft8.wrPortSet = &(PORT->Group[g_APinDescription[wr].ulPort].OUTSET.reg);
tft8.wrPortClr = &(PORT->Group[g_APinDescription[wr].ulPort].OUTCLR.reg);
dcPinMask = digitalPinToBitMask(dc);
dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg);
dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg);
if(cs >= 0) {
csPinMask=digitalPinToBitMask(cs);
csPortSet=&(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg);
csPortClr=&(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg);
csPinMask = digitalPinToBitMask(cs);
csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg);
csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg);
} else {
// No chip-select line defined; might be permanently tied to GND.
// Assign a valid GPIO register (though not used for CS), and an
@ -926,8 +949,8 @@ void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) {
if(x & 0x8000) SPI_MOSI_HIGH();
else SPI_MOSI_LOW();
SPI_SCK_HIGH();
SPI_SCK_LOW();
x <<= 1;
SPI_SCK_LOW();
}
#endif // end !__AVR__
}

View File

@ -34,6 +34,9 @@
#if defined(__AVR__)
typedef uint8_t PORT_t; ///< PORT values are 8-bit
#define USE_FAST_PINIO ///< Use direct PORT register access
#elif defined(ARDUINO_STM32_FEATHER) // WICED
typedef class HardwareSPI SPIClass; ///< SPI is a bit odd on WICED
typedef uint32_t PORT_t; ///< PORT values are 32-bit
#elif defined(__arm__)
#if defined(ARDUINO_ARCH_SAMD)
// Adafruit M0, M4
@ -261,7 +264,11 @@ class Adafruit_SPITFT : public Adafruit_GFX {
void SPI_CS_HIGH(void) {
#if defined(USE_FAST_PINIO)
#if defined(HAS_PORT_SET_CLR)
#if defined(KINETISK)
*csPortSet = 1;
#else // !KINETISK
*csPortSet = csPinMask;
#endif // end !KINETISK
#else // !HAS_PORT_SET_CLR
*csPort |= csPinMaskSet;
#endif // end !HAS_PORT_SET_CLR
@ -279,7 +286,11 @@ class Adafruit_SPITFT : public Adafruit_GFX {
void SPI_CS_LOW(void) {
#if defined(USE_FAST_PINIO)
#if defined(HAS_PORT_SET_CLR)
#if defined(KINETISK)
*csPortClr = 1;
#else // !KINETISK
*csPortClr = csPinMask;
#endif // end !KINETISK
#else // !HAS_PORT_SET_CLR
*csPort &= csPinMaskClr;
#endif // end !HAS_PORT_SET_CLR
@ -363,7 +374,9 @@ class Adafruit_SPITFT : public Adafruit_GFX {
PORTreg_t dcPort; ///< PORT register for data/command
#endif // end HAS_PORT_SET_CLR
#endif // end USE_FAST_PINIO
#if !defined(ARDUINO_STM32_FEATHER)
union {
#endif
struct { // Values specific to HARDWARE SPI:
SPIClass *_spi; ///< SPI class pointer
uint32_t _freq;
@ -431,7 +444,9 @@ class Adafruit_SPITFT : public Adafruit_GFX {
int8_t _rd; ///< Read strobe pin # (or -1)
bool wide = 0; ///< If true, is 16-bit interface
} tft8;
#if !defined(ARDUINO_STM32_FEATHER)
};
#endif
#if defined(USE_SPI_DMA) // Used by hardware SPI and tft8
Adafruit_ZeroDMA dma; ///< DMA instance
DmacDescriptor *dptr = NULL; ///< 1st descriptor
@ -444,8 +459,8 @@ class Adafruit_SPITFT : public Adafruit_GFX {
#endif
#if defined(USE_FAST_PINIO)
#if defined(HAS_PORT_SET_CLR)
PORT_t csPinMask; ///< Bitmask for chip select
#if !defined(KINETISK)
PORT_t csPinMask; ///< Bitmask for chip select
PORT_t dcPinMask; ///< Bitmask for data/command
#endif // end !KINETISK
#else // !HAS_PORT_SET_CLR