From df48d083f74ae3375ab57e4280f8c19dbd0bf0d0 Mon Sep 17 00:00:00 2001 From: prenticedavid Date: Fri, 26 Aug 2016 18:09:25 +0100 Subject: [PATCH 1/5] support macros for Uno shield on Teensy 3.x --- mcufriend_shield.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/mcufriend_shield.h b/mcufriend_shield.h index 5817f36..53357fb 100644 --- a/mcufriend_shield.h +++ b/mcufriend_shield.h @@ -232,6 +232,57 @@ void write_8(uint8_t x) #define PIN_HIGH(p, b) (p) |= (1<<(b)) #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) +#elif defined(__MK20DX128__) || defined(__MK20DX256__) // regular UNO shield on a Teensy 3.x +#warning regular UNO shield on a Teensy 3.x +#define RD_PORT GPIOD +#define RD_PIN 1 +#define WR_PORT GPIOC +#define WR_PIN 0 +#define CD_PORT GPIOB +#define CD_PIN 0 +#define CS_PORT GPIOB +#define CS_PIN 1 +#define RESET_PORT GPIOB +#define RESET_PIN 3 + +// configure macros for the data pins +#define AMASK ((1<<12)|(1<<13)) +#define CMASK ((1<<3)) +#define DMASK ((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<7)) + + #define write_8(d) { \ + GPIOA_PCOR = AMASK; GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ + GPIOA_PSOR = (((d) & (1<<3)) << 9) \ + | (((d) & (1<<4)) << 9); \ + GPIOC_PSOR = (((d) & (1<<1)) << 2); \ + GPIOD_PSOR = (((d) & (1<<0)) << 3) \ + | (((d) & (1<<2)) >> 2) \ + | (((d) & (1<<5)) << 2) \ + | (((d) & (1<<6)) >> 2) \ + | (((d) & (1<<7)) >> 5); \ + } + #define read_8() ( (((GPIOD_PDIR & (1<<3)) >> 3) \ + | ((GPIOC_PDIR & (1<<3)) >> 2) \ + | ((GPIOD_PDIR & (1<<0)) << 2) \ + | ((GPIOA_PDIR & (1<<12)) >> 9) \ + | ((GPIOA_PDIR & (1<<13)) >> 9) \ + | ((GPIOD_PDIR & (1<<7)) >> 2) \ + | ((GPIOD_PDIR & (1<<4)) << 2) \ + | ((GPIOD_PDIR & (1<<2)) << 5))) + #define setWriteDir() {GPIOA_PDDR |= AMASK;GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } + #define setReadDir() {GPIOA_PDDR &= ~AMASK;GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } + +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + #else #error MCU unsupported #endif // regular UNO shields on Arduino boards From d3d2513a05097dc2946e31f87739cc00f7afb7a6 Mon Sep 17 00:00:00 2001 From: prenticedavid Date: Fri, 26 Aug 2016 18:10:59 +0100 Subject: [PATCH 2/5] support macros for Bobcachealot Teensy --- mcufriend_special.h | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/mcufriend_special.h b/mcufriend_special.h index 3f209d2..b3ee316 100644 --- a/mcufriend_special.h +++ b/mcufriend_special.h @@ -10,6 +10,8 @@ //#define USE_BLD_BST_MEGA2560 //#define USE_DUE_8BIT_PROTOSHIELD //#define USE_DUE_16BIT_SHIELD //RD on PA15 (D24) +//#define USE_BOBCACHELOT_TEENSY +//#define USE_FRDM_K20 #if 0 #elif defined(__AVR_ATmega328P__) && defined(USE_SSD1289_SHIELD_UNO) //on UNO @@ -759,6 +761,91 @@ static inline void write_8(uint8_t val) #define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) #define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) +#elif defined(__MK20DX256__) && defined(USE_BOBCACHELOT_TEENSY) // special for BOBCACHEALOT_TEENSY +#warning special for BOBCACHEALOT_TEENSY +#define RD_PORT GPIOD +#define RD_PIN 1 +#define WR_PORT GPIOC +#define WR_PIN 0 +#define CD_PORT GPIOB +#define CD_PIN 0 +#define CS_PORT GPIOB +#define CS_PIN 1 +#define RESET_PORT GPIOB +#define RESET_PIN 3 + +// configure macros for the data pins +#define CMASK ((1<<3)) +#define DMASK ((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)) + + #define write_8(d) { \ + GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ + GPIOC_PSOR = (((d) & (1<<1)) << 2); \ + GPIOD_PSOR = (d) & DMASK; \ + } + #define read_8() ( (GPIOD_PDIR & DMASK) | (GPIOC_PDIR & (1<<3)) >> 2 ) + #define setWriteDir() {GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } + #define setReadDir() {GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } + +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + +#elif defined(__MK20DX128__) && defined(USE_FRDM_K20) // Uno Shield on FRDM-K20 +#warning Uno Shield on FRDM-K20 +#define RD_PORT GPIOC +#define RD_PIN 0 +#define WR_PORT GPIOC +#define WR_PIN 1 +#define CD_PORT GPIOD +#define CD_PIN 6 +#define CS_PORT GPIOD +#define CS_PIN 5 +#define RESET_PORT GPIOB +#define RESET_PIN 1 + +// configure macros for the data pins +#define AMASK ((1<<12)|(1<<5)|(1<<2)|(1<<1)) +#define CMASK ((1<<8)|(1<<4)|(1<<3)) +#define DMASK ((1<<4)) + #define write_8(d) { \ + GPIOA_PCOR = AMASK; GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ + GPIOA_PSOR = (((d) & (1<<0)) << 12) \ + | (((d) & (1<<1)) << 1) \ + | (((d) & (1<<2)) << 3) \ + | (((d) & (1<<5)) >> 4); \ + GPIOC_PSOR = (((d) & (1<<4)) << 4) \ + | (((d) & (3<<6)) >> 3); \ + GPIOD_PSOR = (((d) & (1<<3)) << 1); \ + } + #define read_8() ( (((GPIOA_PDIR & (1<<5)) >> 3) \ + | ((GPIOA_PDIR & (1<<1)) << 4) \ + | ((GPIOA_PDIR & (1<<12)) >> 12) \ + | ((GPIOA_PDIR & (1<<2)) >> 1) \ + | ((GPIOC_PDIR & (1<<8)) >> 4) \ + | ((GPIOC_PDIR & (3<<3)) << 3) \ + | ((GPIOD_PDIR & (1<<4)) >> 1))) + #define setWriteDir() {GPIOA_PDDR |= AMASK;GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } + #define setReadDir() {GPIOA_PDDR &= ~AMASK;GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } + +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + #else #define USE_SPECIAL_FAIL #endif From 51c37c6fb92f3d1ea28cd52c4bdfe850c37f0ceb Mon Sep 17 00:00:00 2001 From: prenticedavid Date: Tue, 27 Sep 2016 12:06:03 +0100 Subject: [PATCH 3/5] add delays for Teensy, kludge pinMode for Teensy --- mcufriend_shield.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mcufriend_shield.h b/mcufriend_shield.h index 53357fb..da3b3f6 100644 --- a/mcufriend_shield.h +++ b/mcufriend_shield.h @@ -272,9 +272,9 @@ void write_8(uint8_t x) #define setWriteDir() {GPIOA_PDDR |= AMASK;GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } #define setReadDir() {GPIOA_PDDR &= ~AMASK;GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } -#define write8(x) { write_8(x); WR_STROBE; } +#define write8(x) { write_8(x); WR_ACTIVE; WR_ACTIVE; WR_STROBE; } #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } -#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; dst = read_8(); RD_IDLE; } #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } #define PASTE(x, y) x ## y @@ -309,6 +309,11 @@ void write_8(uint8_t x) #define WR_STROBE { WR_ACTIVE; WR_IDLE; } //PWLW=TWRL=50ns #define RD_STROBE RD_IDLE, RD_ACTIVE, RD_ACTIVE, RD_ACTIVE //PWLR=TRDL=150ns, tDDR=100ns +#if defined(TEENSYDUINO) +#define CTL_INIT() { for (int i = 2; i <= A4; i++) pinMode(i, OUTPUT); \ + RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; } +#else #define CTL_INIT() { RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; } +#endif #define WriteCmd(x) { CD_COMMAND; write16(x); } #define WriteData(x) { CD_DATA; write16(x); } From 9b85b4d4f1c541fbac5c9e82cdab05d563cad4d3 Mon Sep 17 00:00:00 2001 From: prenticedavid Date: Tue, 27 Sep 2016 12:06:28 +0100 Subject: [PATCH 4/5] add delays for Teensy --- mcufriend_special.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcufriend_special.h b/mcufriend_special.h index b3ee316..11b28af 100644 --- a/mcufriend_special.h +++ b/mcufriend_special.h @@ -835,9 +835,9 @@ static inline void write_8(uint8_t val) #define setWriteDir() {GPIOA_PDDR |= AMASK;GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } #define setReadDir() {GPIOA_PDDR &= ~AMASK;GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } -#define write8(x) { write_8(x); WR_STROBE; } +#define write8(x) { write_8(x); WR_ACTIVE; WR_ACTIVE; WR_STROBE; } #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } -#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; dst = read_8(); RD_IDLE; } #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } #define PASTE(x, y) x ## y From 13c476e5b3d23bf59f5b12360bfe452041767d22 Mon Sep 17 00:00:00 2001 From: prenticedavid Date: Thu, 29 Sep 2016 16:28:05 +0100 Subject: [PATCH 5/5] restrict pinMode() to the TFT pins --- mcufriend_shield.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mcufriend_shield.h b/mcufriend_shield.h index da3b3f6..935d7a6 100644 --- a/mcufriend_shield.h +++ b/mcufriend_shield.h @@ -310,7 +310,9 @@ void write_8(uint8_t x) #define RD_STROBE RD_IDLE, RD_ACTIVE, RD_ACTIVE, RD_ACTIVE //PWLR=TRDL=150ns, tDDR=100ns #if defined(TEENSYDUINO) -#define CTL_INIT() { for (int i = 2; i <= A4; i++) pinMode(i, OUTPUT); \ +#define CTL_INIT() { \ + for (int i = 2; i <= 9; i++) pinMode(i, OUTPUT); \ + for (int i = A0; i <= A4; i++) pinMode(i, OUTPUT); \ RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; } #else #define CTL_INIT() { RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; }