David Prentice
/
Nucleo_dir_L152
Please run it on your NUCLEO-L152
Embed:
(wiki syntax)
Show/hide line numbers
mcufriend_special.h
00001 // only define one "USE_XXX" macro at any time 00002 00003 //#define USE_MEGA_8BIT_PROTOSHIELD 00004 //#define USE_MEGA_8BIT_SHIELD // 4.7sec Mega2560 Shield 00005 //#define USE_MEGA_16BIT_SHIELD // 2.14sec Mega2560 Shield 00006 //#define USE_BLD_BST_MEGA32U4 00007 //#define USE_BLD_BST_MEGA2560 // 12.23sec Uno Shield (17.38s C) 00008 //#define USE_BLD_BST_MEGA4809 // 5.43sec XPRO-Adapter (7.09s C) 00009 //#define USE_DUE_8BIT_PROTOSHIELD 00010 //#define USE_DUE_16BIT_SHIELD //RD on PA15 (D24) 00011 //#define USE_BOBCACHELOT_TEENSY 00012 //#define USE_OPENSMART_SHIELD_PINOUT_UNO 00013 //#define USE_OPENSMART_SHIELD_PINOUT_MEGA 00014 //#define USE_OPENSMART_SHIELD_PINOUT_DUE //thanks Michel53 00015 //#define USE_ELECHOUSE_DUE_16BIT_SHIELD //Untested yet 00016 //#define USE_MY_BLUEPILL 00017 //#define USE_ADIGITALEU_TEENSY 00018 //#define USE_MIKROELEKTRONIKA 00019 //#define USE_XPRO_MEGA4809 00020 00021 /* 00022 HX8347A tWC =100ns tWRH = 35ns tRCFM = 450ns tRC = ? ns 00023 HX8347D tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns 00024 HX8347I tWC =100ns tWRH = 15ns tRCFM = 600ns tRC = 160ns 00025 HX8357C tWC = 50ns tWRH = 15ns tRCFM = 450ns tRC = 160ns 00026 ILI9320 tWC =100ns tWRH = 50ns tRCFM = 300ns tRC = 300ns 00027 ILI9341 tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns 00028 ILI9481 tWC =100ns tWRH = 30ns tRCFM = 450ns tRC = 450ns 00029 ILI9486 tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns (tWCFM= 286ns on mystery 9486_16) 00030 ILI9486L tWC = 50ns tWRH = 15ns tRCFM = 450ns tRC = 160ns 00031 ILI9488 tWC = 30ns tWRH = 15ns tRCFM = 450ns tRC = 160ns 00032 NT35310 tWC = 40ns tWRH = 19ns tRCFM = 400ns tRC = 160ns 00033 RM68140 tWC = 50ns tWRH = 15ns tRCFM = 450ns tRC = 160ns (tWCFM= 119ns) 00034 SPFD5408 tWC =125ns tWRH = 70ns tRCFM = 450ns tRC = 450ns 00035 SSD1289 tWC =100ns tWRH = 50ns tRCFM =1000ns tRC =1000ns (tWCFM= 238ns) 00036 SSD1963 tWC = 26ns tWRH = 13ns tRCFM = 110ns tRC = 72ns 00037 ST7789V tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns 00038 */ 00039 00040 #if 0 00041 00042 #elif defined(__AVR_ATxmega128A1__) // Xplained or MIKROE 00043 #if defined(USE_MIKROELEKTRONIKA) // HX8347-D 16.2ns@62MHz 20.9ns@48MHz 00044 #if F_CPU > 46000000 00045 #error MIKROELEKTRONIKA must be less than 48MHz 00046 #else 00047 #warning MIKROELEKTRONIKA DEV BOARD (48MHz max) 00048 #endif 00049 #define WRITE_DELAY { } 00050 #define READ_DELAY { RD_ACTIVE4; } 00051 #define VPMAP10 0x58 // VPORT0=J, 1=F, 2=K, 3=D 00052 #define VPMAP32 0x39 // VPORT0=J, 1=F, 2=K, 3=D 00053 #define RD_PORT VPORT0 //PJ2. 00054 #define RD_PIN 2 00055 #define WR_PORT VPORT0 00056 #define WR_PIN 3 00057 #define CD_PORT VPORT0 00058 #define CD_PIN 4 00059 #define CS_PORT VPORT0 00060 #define CS_PIN 5 00061 #define RESET_PORT VPORT0 //PJ1 00062 #define RESET_PIN 1 00063 #else 00064 #warning Home made shield with Xplained 00065 #define WRITE_DELAY { } 00066 #define READ_DELAY { RD_ACTIVE4; } 00067 #define VPMAP10 0x15 // VPORT0=F, 1=B, 2=C, 3=D 00068 #define VPMAP32 0x32 // VPORT0=F, 1=B, 2=C, 3=D 00069 #define RD_PORT VPORT0 //PF0. 00070 #define RD_PIN 0 00071 #define WR_PORT VPORT0 00072 #define WR_PIN 1 00073 #define CD_PORT VPORT0 00074 #define CD_PIN 2 00075 #define CS_PORT VPORT0 00076 #define CS_PIN 3 00077 #define RESET_PORT VPORT0 //PK4 00078 #define RESET_PIN 4 00079 #endif 00080 00081 // VPORTs are very fast. CBI, SBI are only one cycle. Hence all those RD_ACTIVEs 00082 // ILI9320 data sheet says tDDR=100ns. We need 218ns to read REGs correctly. 00083 #define write_8(x) { VPORT2.OUT = x; } 00084 #define read_8() ( VPORT2.IN ) 00085 #define setWriteDir() { PORTCFG.VPCTRLA=VPMAP10; PORTCFG.VPCTRLB=VPMAP32; VPORT2.DIR = 0xFF; } 00086 #define setReadDir() { VPORT2.DIR = 0x00; } 00087 #define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } 00088 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00089 //#define READ_8(dst) { RD_STROBE; RD_ACTIVE2; RD_ACTIVE; dst = read_8(); RD_IDLE; } 00090 #define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } 00091 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00092 00093 #define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) 00094 #define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) 00095 #define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) 00096 #elif defined(__AVR_ATxmega32A4U__) || defined(__AVR_ATxmega128A4U__) // Home made shield with Batsocks module 00097 #warning Home made shield with Batsocks module 00098 #define RD_PORT VPORT1 //PB0. VPORT0=A, 1=B, 2=C, 3=D 00099 #define RD_PIN 0 00100 #define WR_PORT VPORT1 00101 #define WR_PIN 1 00102 #define CD_PORT VPORT1 00103 #define CD_PIN 2 00104 #define CS_PORT VPORT1 00105 #define CS_PIN 3 00106 #define RESET_PORT PORTE 00107 #define RESET_PIN 0 00108 00109 // VPORTs are very fast. CBI, SBI are only one cycle. Hence all those RD_ACTIVEs 00110 // ILI9320 data sheet says tDDR=100ns. We need 218ns to read REGs correctly. 00111 // S6D0154 data sheet says tDDR=250ns. We need ~500ns to read REGs correctly. 00112 // ST7789 data sheet says tRC=450ns. We need ~167ns to read REGs correctly. (10 cycles @ 60MHz ) 00113 // ST7789 says tRC=160ns for ID and tRC=450ns for Frame Memory 00114 // ILI9341 says tRC=160ns for ID and tRC=450ns for Frame Memory. They are FASTER 00115 #define WRITE_DELAY { } 00116 #define READ_DELAY { RD_ACTIVE4; } 00117 #define write_8(x) { VPORT2.OUT = x; } 00118 #define read_8() ( VPORT2.IN ) 00119 #define setWriteDir() { PORTCFG.VPCTRLA=0x10; PORTCFG.VPCTRLB=0x32; VPORT2.DIR = 0xFF; } 00120 #define setReadDir() { VPORT2.DIR = 0x00; } 00121 #define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } 00122 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00123 #define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } 00124 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00125 00126 #define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) 00127 #define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) 00128 #define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) 00129 00130 //################################# XPRO-4809 with XPRO-Shield_Adapter ############################ 00131 #elif defined(__AVR_ATmega4809__) && !defined(USE_BLD_BST_MEGA4809) && defined(USE_XPRO_MEGA4809) // XPRO-4809 with XPRO-Shield_Adapter 00132 #warning XPRO-4809 with XPRO-Shield_Adapter using PORT.OUTSET 00133 #define RD_PORT PORTD // 00134 #define RD_PIN 2 00135 #define WR_PORT PORTD 00136 #define WR_PIN 3 00137 #define CD_PORT PORTD 00138 #define CD_PIN 4 00139 #define CS_PORT PORTD 00140 #define CS_PIN 5 00141 #define RESET_PORT PORTC 00142 #define RESET_PIN 2 00143 00144 // PORT.OUTSET is fast but still 2 cycles. Hence all those RD_ACTIVEs 00145 #define AMASK (3<<2) 00146 #define BMASK (3<<2) 00147 #define CMASK (3<<6) 00148 #define EMASK (1<<1) 00149 #define FMASK (1<<6) 00150 #define write_8(x) { \ 00151 PORTA.OUTCLR = AMASK; PORTA.OUTSET = (((x) & (3<<0)) << 2); \ 00152 PORTB.OUTCLR = BMASK; PORTB.OUTSET = (((x) & (1<<2))) | (((x) & (1<<6)) >> 3); \ 00153 PORTC.OUTCLR = CMASK; PORTC.OUTSET = (((x) & (3<<3)) << 3); \ 00154 PORTE.OUTCLR = EMASK; PORTE.OUTSET = (((x) & (1<<7)) >> 6); \ 00155 PORTF.OUTCLR = FMASK; PORTF.OUTSET = (((x) & (1<<5)) << 1); \ 00156 } 00157 #define read_8() ( ((PORTA.IN & AMASK) >> 2)\ 00158 | ((PORTB.IN & (1<<2)) >> 0)\ 00159 | ((PORTB.IN & (1<<3)) << 3)\ 00160 | ((PORTC.IN & CMASK) >> 3)\ 00161 | ((PORTE.IN & EMASK) << 6)\ 00162 | ((PORTF.IN & FMASK) >> 1)\ 00163 ) 00164 #define setWriteDir() { PORTA.DIRSET = AMASK; PORTB.DIRSET = BMASK; PORTC.DIRSET = CMASK; PORTE.DIRSET = EMASK; PORTF.DIRSET = FMASK; } 00165 #define setReadDir() { PORTA.DIRCLR = AMASK; PORTB.DIRCLR = BMASK; PORTC.DIRCLR = CMASK; PORTE.DIRCLR = EMASK; PORTF.DIRCLR = FMASK; } 00166 00167 #define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //-Os=7.09s @20MHz (-O1=8.13s, -O3=6.03s) 00168 #define READ_DELAY { RD_ACTIVE2; } //ID=0x7789 00169 #define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } 00170 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00171 #define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } 00172 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00173 00174 #define PIN_LOW(p, b) (p).OUTCLR = (1<<(b)) 00175 #define PIN_HIGH(p, b) (p).OUTSET = (1<<(b)) 00176 #define PIN_OUTPUT(p, b) (p).DIRSET = (1<<(b)) 00177 00178 #elif defined(__AVR_ATmega4809__) && defined(USE_BLD_BST_MEGA4809) && defined(USE_XPRO_MEGA4809) // XPRO-4809 with XPRO-Shield_Adapter 00179 #warning XPRO-4809 with XPRO-Shield_Adapter using VPORT.OUT and BLD/BST 00180 #define RD_PORT VPORTD // 00181 #define RD_PIN 2 00182 #define WR_PORT VPORTD 00183 #define WR_PIN 3 00184 #define CD_PORT VPORTD 00185 #define CD_PIN 4 00186 #define CS_PORT VPORTD 00187 #define CS_PIN 5 00188 #define RESET_PORT VPORTC 00189 #define RESET_PIN 2 00190 00191 #define AMASK (3<<2) 00192 #define BMASK (3<<2) 00193 #define CMASK (3<<6) 00194 #define EMASK (1<<1) 00195 #define FMASK (1<<6) 00196 static __attribute((always_inline)) 00197 void write_8(uint8_t val) 00198 { 00199 asm volatile("in __tmp_reg__,0x01" "\n\t" //VPORTA.OUT 00200 "BST %0,0" "\n\t" "BLD __tmp_reg__,2" "\n\t" 00201 "BST %0,1" "\n\t" "BLD __tmp_reg__,3" "\n\t" 00202 "out 0x01,__tmp_reg__" : : "a" (val)); 00203 asm volatile("in __tmp_reg__,0x05" "\n\t" //VPORTB.OUT 00204 "BST %0,2" "\n\t" "BLD __tmp_reg__,2" "\n\t" 00205 "BST %0,6" "\n\t" "BLD __tmp_reg__,3" "\n\t" 00206 "out 0x05,__tmp_reg__" : : "a" (val)); 00207 asm volatile("in __tmp_reg__,0x09" "\n\t" //VPORTC.OUT 00208 "BST %0,3" "\n\t" "BLD __tmp_reg__,6" "\n\t" 00209 "BST %0,4" "\n\t" "BLD __tmp_reg__,7" "\n\t" 00210 "out 0x09,__tmp_reg__" : : "a" (val)); 00211 asm volatile("in __tmp_reg__,0x11" "\n\t" //VPORTE.OUT 00212 "BST %0,7" "\n\t" "BLD __tmp_reg__,1" "\n\t" 00213 "out 0x11,__tmp_reg__" : : "a" (val)); 00214 asm volatile("in __tmp_reg__,0x15" "\n\t" //VPORTF.OUT 00215 "BST %0,5" "\n\t" "BLD __tmp_reg__,6" "\n\t" 00216 "out 0x15,__tmp_reg__" : : "a" (val)); 00217 } 00218 00219 #define read_8() ( ((VPORTA_IN & AMASK) >> 2)\ 00220 | ((VPORTB_IN & (1<<2)) >> 0)\ 00221 | ((VPORTB_IN & (1<<3)) << 3)\ 00222 | ((VPORTC_IN & CMASK) >> 3)\ 00223 | ((VPORTE_IN & EMASK) << 6)\ 00224 | ((VPORTF_IN & FMASK) >> 1)\ 00225 ) 00226 #define setWriteDir() { VPORTA_DIR |= AMASK; VPORTB_DIR |= BMASK; VPORTC_DIR |= CMASK; VPORTE_DIR |= EMASK; VPORTF_DIR |= FMASK; } 00227 #define setReadDir() { VPORTA_DIR &= ~AMASK; VPORTB_DIR &= ~BMASK; VPORTC_DIR &= ~CMASK; VPORTE_DIR &= ~EMASK; VPORTF_DIR &= ~FMASK; } 00228 00229 //#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; } //6.47s no_inline 00230 #define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //-Os=5.43s @20MHz always_inline. (-O1=5.41s, -O3=5.25s) 00231 #define READ_DELAY { RD_ACTIVE4; } //ID=0x7789 00232 #define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } 00233 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00234 #define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } 00235 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00236 00237 #define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) 00238 #define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) 00239 #define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) 00240 00241 #elif defined(__AVR_ATmega328P__) && defined(USE_OPENSMART_SHIELD_PINOUT_UNO) 00242 #define RD_PORT PORTC 00243 #define RD_PIN 0 00244 #define WR_PORT PORTC 00245 #define WR_PIN 1 00246 #define CD_PORT PORTC 00247 #define CD_PIN 2 00248 #define CS_PORT PORTC 00249 #define CS_PIN 3 00250 #define RESET_PORT PORTC 00251 #define RESET_PIN 1 // n/a. so mimic WR_PIN 00252 00253 #define BMASK B00101111 00254 #define DMASK B11010000 00255 00256 #define write_8(x) { \ 00257 PORTD = (PORTD & ~DMASK) | ((x) & DMASK); \ 00258 PORTB = (PORTB & ~BMASK) | ((x) & BMASK);} // STROBEs are defined later 00259 00260 #define read_8() ((PIND & DMASK) | (PINB & BMASK)) 00261 00262 #define setWriteDir() { DDRD |= DMASK; DDRB |= BMASK; } 00263 #define setReadDir() { DDRD &= ~DMASK; DDRB &= ~BMASK; } 00264 00265 00266 #define write8(x) { write_8(x); WR_STROBE; } 00267 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00268 #define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } 00269 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00270 00271 #define PIN_LOW(p, b) (p) &= ~(1<<(b)) 00272 #define PIN_HIGH(p, b) (p) |= (1<<(b)) 00273 #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) 00274 00275 #elif defined(__AVR_ATmega2560__) && defined(USE_OPENSMART_SHIELD_PINOUT_MEGA) 00276 #define RD_PORT PORTF 00277 #define RD_PIN 0 00278 #define WR_PORT PORTF 00279 #define WR_PIN 1 00280 #define CD_PORT PORTF 00281 #define CD_PIN 2 00282 #define CS_PORT PORTF 00283 #define CS_PIN 3 00284 #define RESET_PORT PORTF 00285 #define RESET_PIN 1 // n/a. so mimic WR_PIN 00286 00287 #define BMASK B10110000 //D13, D11, D10 00288 #define GMASK 0x20 //D4 00289 #define HMASK 0x78 //D6, D7, D8, D9 00290 00291 #if defined(USE_BLD_BST_MEGA2560) 00292 static __attribute((always_inline)) void write_8(uint8_t val) 00293 { 00294 asm volatile("lds __tmp_reg__,0x0102" "\n\t" //PORTH 00295 "BST %0,0" "\n\t" "BLD __tmp_reg__,5" "\n\t" 00296 "BST %0,1" "\n\t" "BLD __tmp_reg__,6" "\n\t" 00297 "BST %0,6" "\n\t" "BLD __tmp_reg__,3" "\n\t" 00298 "BST %0,7" "\n\t" "BLD __tmp_reg__,4" "\n\t" 00299 "sts 0x0102,__tmp_reg__" : : "a" (val)); 00300 asm volatile("in __tmp_reg__,0x05" "\n\t" //PORTB 00301 "BST %0,2" "\n\t" "BLD __tmp_reg__,4" "\n\t" 00302 "BST %0,3" "\n\t" "BLD __tmp_reg__,5" "\n\t" 00303 "BST %0,5" "\n\t" "BLD __tmp_reg__,7" "\n\t" 00304 "out 0x05,__tmp_reg__" : : "a" (val)); 00305 asm volatile("in __tmp_reg__,0x14" "\n\t" //PORTG 00306 "BST %0,4" "\n\t" "BLD __tmp_reg__,5" "\n\t" 00307 "out 0x14,__tmp_reg__" : : "a" (val)); 00308 } 00309 #else 00310 #define write_8(x) { \ 00311 PORTH = (PORTH&~HMASK)|(((x)&B11000000)>>3)|(((x)&B00000011)<<5); \ 00312 PORTB = (PORTB&~BMASK)|(((x)&B00101100)<<2); \ 00313 PORTG = (PORTG&~GMASK)|(((x)&B00010000)<<1); \ 00314 } 00315 #endif 00316 00317 #define read_8()(\ 00318 ((PINH & B00011000) << 3) | ((PINB & BMASK) >> 2) | \ 00319 ((PING & GMASK) >> 1) | ((PINH & B01100000) >> 5) ) 00320 #define setWriteDir() { DDRH |= HMASK; DDRB |= BMASK; DDRG |= GMASK; } 00321 #define setReadDir() { DDRH &= ~HMASK; DDRB &= ~BMASK; DDRG &= ~GMASK; } 00322 00323 #define write8(x) { write_8(x); WR_STROBE; } 00324 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00325 #define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } 00326 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00327 00328 #define PIN_LOW(p, b) (p) &= ~(1<<(b)) 00329 #define PIN_HIGH(p, b) (p) |= (1<<(b)) 00330 #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) 00331 00332 #elif defined(__SAM3X8E__) && defined(USE_OPENSMART_SHIELD_PINOUT_DUE) //OPENSMART shield on DUE 00333 #warning USE_OPENSMART_SHIELD_PINOUT on DUE 00334 // configure macros for the control pins 00335 #define RD_PORT PIOA 00336 #define RD_PIN 16 00337 #define WR_PORT PIOA 00338 #define WR_PIN 24 00339 #define CD_PORT PIOA 00340 #define CD_PIN 23 00341 #define CS_PORT PIOA 00342 #define CS_PIN 22 00343 #define RESET_PORT PIOA 00344 #define RESET_PIN 24 // n/a. so mimic WR_PIN 00345 // configure macros for data bus 00346 #define BMASK (1<<27) 00347 #define CMASK (0x12F << 21) 00348 #define DMASK (1<<7) 00349 #define write_8(x) { PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; PIOD->PIO_CODR = DMASK; \ 00350 PIOC->PIO_SODR = (((x) & (1<<0)) << 22); \ 00351 PIOC->PIO_SODR = (((x) & (1<<1)) << 20); \ 00352 PIOC->PIO_SODR = (((x) & (1<<2)) << 27); \ 00353 PIOD->PIO_SODR = (((x) & (1<<3)) << 4); \ 00354 PIOC->PIO_SODR = (((x) & (1<<4)) << 22); \ 00355 PIOB->PIO_SODR = (((x) & (1<<5)) << 22); \ 00356 PIOC->PIO_SODR = (((x) & (1<<6)) << 18); \ 00357 PIOC->PIO_SODR = (((x) & (1<<7)) << 16); \ 00358 } 00359 00360 #define read_8() ( ((PIOC->PIO_PDSR & (1<<22)) >> 22)\ 00361 | ((PIOC->PIO_PDSR & (1<<21)) >> 20)\ 00362 | ((PIOC->PIO_PDSR & (1<<29)) >> 27)\ 00363 | ((PIOD->PIO_PDSR & (1<<7)) >> 4)\ 00364 | ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ 00365 | ((PIOB->PIO_PDSR & (1<<27)) >> 22)\ 00366 | ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ 00367 | ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ 00368 ) 00369 #define setWriteDir() { PIOB->PIO_OER = BMASK; PIOC->PIO_OER = CMASK; PIOD->PIO_OER = DMASK; } 00370 #define setReadDir() { \ 00371 PMC->PMC_PCER0 = (1 << ID_PIOB)|(1 << ID_PIOC)|(1 << ID_PIOD);\ 00372 PIOB->PIO_ODR = BMASK; PIOC->PIO_ODR = CMASK; PIOD->PIO_ODR = DMASK;\ 00373 } 00374 #define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } 00375 //#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; WR_IDLE; } 00376 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00377 #define READ_8(dst) { RD_STROBE; RD_ACTIVE; dst = read_8(); RD_IDLE; RD_IDLE; } 00378 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00379 // Shield Control macros. 00380 #define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) 00381 #define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) 00382 #define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) 00383 00384 #elif defined(__AVR_ATmega2560__) && defined(USE_BLD_BST_MEGA2560) //regular UNO shield on MEGA2560 using BLD/BST 00385 #warning regular UNO shield on MEGA2560 using BLD/BST 00386 #define RD_PORT PORTF 00387 #define RD_PIN 0 00388 #define WR_PORT PORTF 00389 #define WR_PIN 1 00390 #define CD_PORT PORTF 00391 #define CD_PIN 2 00392 #define CS_PORT PORTF 00393 #define CS_PIN 3 00394 #define RESET_PORT PORTF 00395 #define RESET_PIN 4 00396 00397 #define EMASK 0x38 00398 #define GMASK 0x20 00399 #define HMASK 0x78 00400 static __attribute((always_inline)) void write_8(uint8_t val) 00401 { 00402 asm volatile("lds __tmp_reg__,0x0102" "\n\t" 00403 "BST %0,0" "\n\t" "BLD __tmp_reg__,5" "\n\t" 00404 "BST %0,1" "\n\t" "BLD __tmp_reg__,6" "\n\t" 00405 "BST %0,6" "\n\t" "BLD __tmp_reg__,3" "\n\t" 00406 "BST %0,7" "\n\t" "BLD __tmp_reg__,4" "\n\t" 00407 "sts 0x0102,__tmp_reg__" : : "a" (val)); 00408 asm volatile("in __tmp_reg__,0x0E" "\n\t" 00409 "BST %0,2" "\n\t" "BLD __tmp_reg__,4" "\n\t" 00410 "BST %0,3" "\n\t" "BLD __tmp_reg__,5" "\n\t" 00411 "BST %0,5" "\n\t" "BLD __tmp_reg__,3" "\n\t" 00412 "out 0x0E,__tmp_reg__" : : "a" (val)); 00413 asm volatile("in __tmp_reg__,0x14" "\n\t" 00414 "BST %0,4" "\n\t" "BLD __tmp_reg__,5" "\n\t" 00415 "out 0x14,__tmp_reg__" : : "a" (val)); 00416 } 00417 00418 #define read_8() ( ((PINH & (3<<5)) >> 5)\ 00419 | ((PINE & (3<<4)) >> 2)\ 00420 | ((PING & (1<<5)) >> 1)\ 00421 | ((PINE & (1<<3)) << 2)\ 00422 | ((PINH & (3<<3)) << 3)\ 00423 ) 00424 #define setWriteDir() { DDRH |= HMASK; DDRG |= GMASK; DDRE |= EMASK; } 00425 #define setReadDir() { DDRH &= ~HMASK; DDRG &= ~GMASK; DDRE &= ~EMASK; } 00426 #define write8(x) { write_8(x); WR_STROBE; } 00427 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00428 #define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } 00429 #define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } 00430 00431 #define PIN_LOW(p, b) (p) &= ~(1<<(b)) 00432 #define PIN_HIGH(p, b) (p) |= (1<<(b)) 00433 #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) 00434 00435 #elif defined(__AVR_ATmega2560__) && defined(USE_MEGA_16BIT_SHIELD) 00436 #warning USE_MEGA_16BIT_SHIELD 00437 #define USES_16BIT_BUS 00438 #define RD_PORT PORTL 00439 #define RD_PIN 6 //PL6 (D43). Graham has PA15 (D24) on Due Shield 00440 #define WR_PORT PORTG 00441 #define WR_PIN 2 //D39 CTE 00442 #define CD_PORT PORTD 00443 #define CD_PIN 7 //D38 CTE 00444 #define CS_PORT PORTG 00445 #define CS_PIN 1 //D40 CTE 00446 #define RESET_PORT PORTG 00447 #define RESET_PIN 0 //D41 CTE 00448 00449 #define write_8(x) { PORTC = x; } 00450 #define write_16(x) { PORTA = (x) >> 8; PORTC = x; } 00451 00452 #define read_16() ( (PINA<<8) | (PINC) ) 00453 #define setWriteDir() { DDRC = 0xFF; DDRA = 0xff; } 00454 #define setReadDir() { DDRC = 0x00; DDRA = 0x00; } 00455 //#define write8(x) { write_8(x); WR_STROBE; } 00456 #define write8(x) { write16((x) & 0xFF); } 00457 #define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; } 00458 #define READ_16(dst) { RD_STROBE; dst = read_16(); RD_IDLE; } 00459 #define READ_8(dst) { READ_16(dst); dst &= 0x00FF; } 00460 00461 #define PIN_LOW(p, b) (p) &= ~(1<<(b)) 00462 #define PIN_HIGH(p, b) (p) |= (1<<(b)) 00463 #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) 00464 00465 #elif defined(__AVR_ATmega2560__) && defined(USE_MEGA_8BIT_SHIELD) 00466 #warning USE_MEGA_8BIT_SHIELD for vagos21 00467 #define RD_PORT PORTL 00468 #define RD_PIN 6 //PL6 (D43). Graham has PA15 (D24) on Due Shield 00469 #define WR_PORT PORTG 00470 #define WR_PIN 2 //D39 CTE 00471 #define CD_PORT PORTD 00472 #define CD_PIN 7 //D38 CTE 00473 #define CS_PORT PORTG 00474 #define CS_PIN 1 //D40 CTE 00475 #define RESET_PORT PORTG 00476 #define RESET_PIN 0 //D41 CTE 00477 00478 #define write_8(x) { PORTA = x;} 00479 00480 #define read_8() ( PINA ) 00481 #define setWriteDir() { DDRA = 0xFF; } 00482 #define setReadDir() { DDRA = 0x00; } 00483 #define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } // HX8357-D is slower 00484 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00485 #define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } 00486 #define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } 00487 00488 #define PIN_LOW(p, b) (p) &= ~(1<<(b)) 00489 #define PIN_HIGH(p, b) (p) |= (1<<(b)) 00490 #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) 00491 00492 #elif defined(__AVR_ATmega2560__) && defined(USE_MEGA_8BIT_PROTOSHIELD) 00493 #warning USE_MEGA_8BIT_PROTOSHIELD 00494 #define RD_PORT PORTF 00495 #define RD_PIN 0 00496 #define WR_PORT PORTF 00497 #define WR_PIN 1 00498 #define CD_PORT PORTF 00499 #define CD_PIN 2 00500 #define CS_PORT PORTF 00501 #define CS_PIN 3 00502 #define RESET_PORT PORTF 00503 #define RESET_PIN 4 00504 00505 #define write_8(x) { PORTA = x;} 00506 00507 #define read_8() ( PINA ) 00508 #define setWriteDir() { DDRA = 0xFF; } 00509 #define setReadDir() { DDRA = 0x00; } 00510 #define write8(x) { write_8(x); WR_STROBE; } 00511 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00512 #define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } 00513 #define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } 00514 00515 #define PIN_LOW(p, b) (p) &= ~(1<<(b)) 00516 #define PIN_HIGH(p, b) (p) |= (1<<(b)) 00517 #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) 00518 00519 #elif defined(__AVR_ATmega32U4__) && defined(USE_BLD_BST_MEGA32U4) //regular UNO shield on Leonardo using BST/BLD 00520 #warning regular UNO shield on Leonardo using BST/BLD 00521 #define RD_PORT PORTF 00522 #define RD_PIN 7 00523 #define WR_PORT PORTF 00524 #define WR_PIN 6 00525 #define CD_PORT PORTF 00526 #define CD_PIN 5 00527 #define CS_PORT PORTF 00528 #define CS_PIN 4 00529 #define RESET_PORT PORTF 00530 #define RESET_PIN 1 00531 00532 #define BMASK (3<<4) 00533 #define CMASK (1<<6) 00534 #define DMASK ((1<<7)|(1<<4)|(3<<0)) 00535 #define EMASK (1<<6) 00536 static __attribute((always_inline)) void write_8(uint8_t val) 00537 { 00538 asm volatile("in __tmp_reg__,0x05" "\n\t" 00539 "BST %0,0" "\n\t" "BLD __tmp_reg__,4" "\n\t" 00540 "BST %0,1" "\n\t" "BLD __tmp_reg__,5" "\n\t" 00541 "out 0x05,__tmp_reg__" : : "a" (val)); 00542 asm volatile("in __tmp_reg__,0x0B" "\n\t" 00543 "BST %0,2" "\n\t" "BLD __tmp_reg__,1" "\n\t" 00544 "BST %0,3" "\n\t" "BLD __tmp_reg__,0" "\n\t" 00545 "BST %0,4" "\n\t" "BLD __tmp_reg__,4" "\n\t" 00546 "BST %0,6" "\n\t" "BLD __tmp_reg__,7" "\n\t" 00547 "out 0x0B,__tmp_reg__" : : "a" (val)); 00548 asm volatile("in __tmp_reg__,0x08" "\n\t" 00549 "BST %0,5" "\n\t" "BLD __tmp_reg__,6" "\n\t" 00550 "out 0x08,__tmp_reg__" : : "a" (val)); 00551 asm volatile("in __tmp_reg__,0x0E" "\n\t" 00552 "BST %0,7" "\n\t" "BLD __tmp_reg__,6" "\n\t" 00553 "out 0x0E,__tmp_reg__" : : "a" (val)); 00554 } 00555 #define read_8() ( ((PINB & (3<<4)) >> 4)\ 00556 | ((PIND & (1<<1)) << 1)\ 00557 | ((PIND & (1<<0)) << 3)\ 00558 | ((PIND & (1<<4)) >> 0)\ 00559 | ((PINC & (1<<6)) >> 1)\ 00560 | ((PIND & (1<<7)) >> 1)\ 00561 | ((PINE & (1<<6)) << 1)\ 00562 ) 00563 #define setWriteDir() { DDRB |= BMASK; DDRC |= CMASK; DDRD |= DMASK; DDRE |= EMASK; } 00564 #define setReadDir() { DDRB &= ~BMASK; DDRC &= ~CMASK; DDRD &= ~DMASK; DDRE &= ~EMASK; } 00565 #define write8(x) { write_8(x); WR_STROBE; } 00566 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00567 #define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } 00568 #define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } 00569 00570 #define PIN_LOW(p, b) (p) &= ~(1<<(b)) 00571 #define PIN_HIGH(p, b) (p) |= (1<<(b)) 00572 #define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) 00573 00574 #elif defined(__SAM3X8E__) && defined(USE_DUE_8BIT_PROTOSHIELD) //regular UNO shield on DUE 00575 #warning USE_DUE_8BIT_PROTOSHIELD 00576 // configure macros for the control pins 00577 #define RD_PORT PIOA 00578 #define RD_PIN 16 //A0 00579 #define WR_PORT PIOA 00580 #define WR_PIN 24 //A1 00581 #define CD_PORT PIOA 00582 #define CD_PIN 23 //A2 00583 #define CS_PORT PIOA 00584 #define CS_PIN 22 //A3 00585 #define RESET_PORT PIOA 00586 #define RESET_PIN 6 //A4 00587 // configure macros for data bus 00588 #define DMASK (0xFF<<0) 00589 #define write_8(x) { PIOD->PIO_CODR = DMASK; PIOD->PIO_SODR = x; } 00590 00591 #define read_8() ( PIOD->PIO_PDSR & DMASK) 00592 #define setWriteDir() { PIOD->PIO_OER = DMASK; PIOD->PIO_PER = DMASK; } 00593 #define setReadDir() { PMC->PMC_PCER0 = (1 << ID_PIOD); PIOD->PIO_ODR = DMASK;} 00594 #define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } 00595 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00596 #define READ_8(dst) { RD_STROBE; RD_ACTIVE4; dst = read_8(); RD_IDLE; RD_IDLE; RD_IDLE; } 00597 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00598 // Shield Control macros. 00599 #define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) 00600 #define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) 00601 #define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) 00602 00603 #elif defined(__SAM3X8E__) && defined(USE_DUE_16BIT_SHIELD) //regular CTE shield on DUE 00604 #warning USE_DUE_16BIT_SHIELD 00605 #define USES_16BIT_BUS 00606 // configure macros for the control pins 00607 #define RD_PORT PIOA 00608 #define RD_PIN 15 //D24 Graham 00609 #define WR_PORT PIOD 00610 #define WR_PIN 1 //D26 00611 #define CD_PORT PIOD 00612 #define CD_PIN 0 //D25 00613 #define CS_PORT PIOD 00614 #define CS_PIN 2 //D27 00615 #define RESET_PORT PIOD 00616 #define RESET_PIN 3 //D28 00617 // configure macros for data bus 00618 // DB0..DB7 on PIOC1..PIOC8, DB8..DB15 on PIOC12..PIOC19 00619 // 00620 #define CMASKH (0xFF00<<4) 00621 #define CMASKL (0x00FF<<1) 00622 #define CMASK (CMASKH | CMASKL) 00623 #define write_8(x) { PIOC->PIO_CODR = CMASKL; PIOC->PIO_SODR = (((x)&0x00FF)<<1); } 00624 #define write_16(x) { PIOC->PIO_CODR = CMASK; \ 00625 PIOC->PIO_SODR = (((x)&0x00FF)<<1)|(((x)&0xFF00)<<4); } 00626 #define read_16() (((PIOC->PIO_PDSR & CMASKH)>>4)|((PIOC->PIO_PDSR & CMASKL)>>1) ) 00627 #define read_8() (read_16() & 0xFF) 00628 #define setWriteDir() { PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; } 00629 #define setReadDir() { PMC->PMC_PCER0 = (1 << ID_PIOC); PIOC->PIO_ODR = CMASK; } 00630 #define write8(x) { write16(x & 0xFF); } 00631 #define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } 00632 #define READ_16(dst) { RD_STROBE; RD_ACTIVE4; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } 00633 #define READ_8(dst) { READ_16(dst); dst &= 0xFF; } 00634 00635 // Shield Control macros. 00636 #define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) 00637 #define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) 00638 #define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) 00639 00640 #elif defined(__SAM3X8E__) && defined(USE_ELECHOUSE_DUE_16BIT_SHIELD) //ELECHOUSE_DUE shield on DUE 00641 #warning USE_ELECHOUSE_DUE_16BIT_SHIELD 00642 #define USES_16BIT_BUS 00643 // configure macros for the control pins 00644 #define RD_PORT PIOA 00645 #define RD_PIN 15 //D24 Graham 00646 #define WR_PORT PIOA 00647 #define WR_PIN 14 //D23 00648 #define CD_PORT PIOB 00649 #define CD_PIN 26 //D22 00650 #define CS_PORT PIOA 00651 #define CS_PIN 7 //D31 00652 #define RESET_PORT PIOC 00653 #define RESET_PIN 1 //D33 00654 // configure macros for data bus 00655 // DB0..DB7 on PIOC2..PIOC9, DB8..DB15 on PIOC12..PIOC19 00656 // 00657 #define CMASKH (0xFF00<<4) 00658 #define CMASKL (0x00FF<<2) 00659 #define CMASK (CMASKH | CMASKL) 00660 #define write_8(x) { PIOC->PIO_CODR = CMASKL; PIOC->PIO_SODR = (((x)&0x00FF)<<2); } 00661 #define write_16(x) { PIOC->PIO_CODR = CMASK; \ 00662 PIOC->PIO_SODR = (((x)&0x00FF)<<2)|(((x)&0xFF00)<<4); } 00663 #define read_16() (((PIOC->PIO_PDSR & CMASKH)>>4)|((PIOC->PIO_PDSR & CMASKL)>>2) ) 00664 #define read_8() (read_16() & 0xFF) 00665 #define setWriteDir() { PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; } 00666 #define setReadDir() { PMC->PMC_PCER0 = (1 << ID_PIOC); PIOC->PIO_ODR = CMASK; } 00667 #define write8(x) { write16(x & 0xFF); } 00668 #define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } 00669 #define READ_16(dst) { RD_STROBE; RD_ACTIVE4; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } 00670 #define READ_8(dst) { READ_16(dst); dst &= 0xFF; } 00671 00672 // Shield Control macros. 00673 #define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) 00674 #define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) 00675 #define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) 00676 00677 #elif defined(__SAM3X8E__) && defined(USE_MEGA_16BIT_SHIELD) //regular MEGA shield on DUE 00678 #warning USE_MEGA_16BIT_SHIELD 00679 #define USES_16BIT_BUS 00680 // configure macros for the control pins 00681 #define RD_PORT PIOA 00682 #define RD_PIN 20 //D43 00683 #define WR_PORT PIOC 00684 #define WR_PIN 7 //D39 00685 #define CD_PORT PIOC 00686 #define CD_PIN 6 //D38 00687 #define CS_PORT PIOC 00688 #define CS_PIN 8 //D40 00689 #define RESET_PORT PIOC 00690 #define RESET_PIN 9 //D41 00691 // configure macros for data bus 00692 // 00693 #define AMASK ((1<<7)|(3<<14)) //PA7, PA14-PA15 00694 #define BMASK (1<<26) //PB26 00695 #define CMASK (31<<1) //PC1-PC5 00696 #define DMASK ((15<<0)|(1<<6)|(3<<9)) //PD0-PD3, PD6, PD9-PD10 00697 00698 #define write_16(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; PIOD->PIO_CODR = DMASK; \ 00699 PIOA->PIO_SODR = (((x)&(1<<6))<<1)|(((x)&(3<<9))<<5); \ 00700 PIOB->PIO_SODR = (((x)&(1<<8))<<18); \ 00701 PIOC->PIO_SODR = (((x)&(1<<0))<<5); \ 00702 PIOC->PIO_SODR = (((x)&(1<<1))<<3); \ 00703 PIOC->PIO_SODR = (((x)&(1<<2))<<1); \ 00704 PIOC->PIO_SODR = (((x)&(1<<3))>>1); \ 00705 PIOC->PIO_SODR = (((x)&(1<<4))>>3); \ 00706 PIOD->PIO_SODR = (((x)&(1<<7))<<2)|(((x)&(1<<5))<<5)|(((x)&(15<<11))>>11)|(((x)&(1<<15))>>9); \ 00707 } 00708 00709 /* 00710 #define write_16(VL) { PIOA->PIO_CODR = AMASK; PIOC->PIO_CODR = CMASK; PIOD->PIO_CODR = DMASK; \ 00711 REG_PIOA_SODR=((((VL)>>8) & 0x06)<<13) | ((VL & 0x40)<<1);\ 00712 if ((VL)&(1<<8)) REG_PIOB_SODR=(1<<26); else REG_PIOB_CODR=(1<<26);\ 00713 REG_PIOC_SODR=((VL & 0x01)<<5) | ((VL & 0x02)<<3) | ((VL & 0x04)<<1) | ((VL & 0x08)>>1) | ((VL & 0x10)>>3);\ 00714 REG_PIOD_SODR=((((VL)>>8) & 0x78)>>3) | ((((VL)>>8) & 0x80)>>1) | ((VL & 0x20)<<5) | ((VL & 0x80)<<2);\ 00715 } 00716 */ 00717 #define read_16() ( 0\ 00718 |((PIOC->PIO_PDSR & (1<<5))>>5)\ 00719 |((PIOC->PIO_PDSR & (1<<4))>>3)\ 00720 |((PIOC->PIO_PDSR & (1<<3))>>1)\ 00721 |((PIOC->PIO_PDSR & (1<<2))<<1)\ 00722 |((PIOC->PIO_PDSR & (1<<1))<<3)\ 00723 |((PIOD->PIO_PDSR & (1<<10))>>5)\ 00724 |((PIOA->PIO_PDSR & (1<<7))>>1)\ 00725 |((PIOD->PIO_PDSR & (1<<9))>>2)\ 00726 |((PIOB->PIO_PDSR & (1<<26))>>18)\ 00727 |((PIOA->PIO_PDSR & (3<<14))>>5)\ 00728 |((PIOD->PIO_PDSR & (15<<0))<<11)\ 00729 |((PIOD->PIO_PDSR & (1<<6))<<9)\ 00730 ) 00731 #define read_8() (read_16() & 0xFF) 00732 #define setWriteDir() {\ 00733 PIOA->PIO_OER = AMASK; PIOA->PIO_PER = AMASK; \ 00734 PIOB->PIO_OER = BMASK; PIOB->PIO_PER = BMASK; \ 00735 PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; \ 00736 PIOD->PIO_OER = DMASK; PIOD->PIO_PER = DMASK; \ 00737 } 00738 #define setReadDir() { \ 00739 PMC->PMC_PCER0 = (1 << ID_PIOA)|(1 << ID_PIOB)|(1 << ID_PIOC)|(1 << ID_PIOD); \ 00740 PIOA->PIO_ODR = AMASK; \ 00741 PIOB->PIO_ODR = BMASK; \ 00742 PIOC->PIO_ODR = CMASK; \ 00743 PIOD->PIO_ODR = DMASK; \ 00744 } 00745 #define write8(x) { write16(x & 0xFF); } 00746 // ILI9486 is slower than ILI9481 00747 #define write16(x) { write_16(x); WR_ACTIVE8; WR_STROBE; WR_IDLE4;} 00748 #define READ_16(dst) { RD_STROBE; RD_ACTIVE4; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } 00749 #define READ_8(dst) { READ_16(dst); dst &= 0xFF; } 00750 00751 // Shield Control macros. 00752 #define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) 00753 #define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) 00754 #define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) 00755 00756 #elif defined(__SAM3X8E__) && defined(USE_MEGA_8BIT_SHIELD) //regular CTE shield on DUE 00757 #warning USE_MEGA_8BIT_SHIELD for peloxp 00758 // configure macros for the control pins 00759 #define RD_PORT PIOA 00760 #define RD_PIN 20 //D43 00761 #define WR_PORT PIOC 00762 #define WR_PIN 7 //D39 00763 #define CD_PORT PIOC 00764 #define CD_PIN 6 //D38 00765 #define CS_PORT PIOC 00766 #define CS_PIN 8 //D40 00767 #define RESET_PORT PIOC 00768 #define RESET_PIN 9 //D41 00769 // configure macros for data bus 00770 // 00771 #define AMASK ((3<<14)) //PA14-PA15 D23-D24 00772 #define BMASK (1<<26) //PB26 D22 00773 #define DMASK ((15<<0)|(1<<6)) //PD0-PD3, PD6 D25-D28,D29 00774 00775 #define write_8(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOD->PIO_CODR = DMASK; \ 00776 PIOB->PIO_SODR = (((x)&(1<<0))<<26); \ 00777 PIOA->PIO_SODR = (((x)&(3<<1))<<13); \ 00778 PIOD->PIO_SODR = (((x)&(15<<3))>>3); \ 00779 PIOD->PIO_SODR = (((x)&(1<<7))>>1); \ 00780 } 00781 00782 #define read_8() ( 0\ 00783 |((PIOB->PIO_PDSR & (1<<26))>>26)\ 00784 |((PIOA->PIO_PDSR & (3<<14))>>13)\ 00785 |((PIOD->PIO_PDSR & (15<<0))<<3)\ 00786 |((PIOD->PIO_PDSR & (1<<6))<<1)\ 00787 ) 00788 00789 #define setWriteDir() {\ 00790 PIOA->PIO_OER = AMASK; PIOA->PIO_PER = AMASK; \ 00791 PIOB->PIO_OER = BMASK; PIOB->PIO_PER = BMASK; \ 00792 PIOD->PIO_OER = DMASK; PIOD->PIO_PER = DMASK; \ 00793 } 00794 #define setReadDir() { \ 00795 PMC->PMC_PCER0 = (1 << ID_PIOA)|(1 << ID_PIOB)|(1 << ID_PIOC)|(1 << ID_PIOD); \ 00796 PIOA->PIO_ODR = AMASK; \ 00797 PIOB->PIO_ODR = BMASK; \ 00798 PIOD->PIO_ODR = DMASK; \ 00799 } 00800 00801 // ILI9486 is slower than ILI9481. HX8357-D is slower 00802 #define write8(x) { write_8(x); WR_ACTIVE4; WR_STROBE; WR_IDLE; WR_IDLE; } 00803 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00804 #define READ_8(dst) { RD_STROBE; RD_ACTIVE4; dst = read_8(); RD_IDLE; RD_IDLE; RD_IDLE; } 00805 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00806 00807 // Shield Control macros. 00808 #define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) 00809 #define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) 00810 #define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) 00811 00812 #elif defined(__MK20DX256__) && defined(USE_BOBCACHELOT_TEENSY) // special for BOBCACHEALOT_TEENSY 00813 #warning special for BOBCACHEALOT_TEENSY 00814 #define RD_PORT GPIOD 00815 #define RD_PIN 1 00816 #define WR_PORT GPIOC 00817 #define WR_PIN 0 00818 #define CD_PORT GPIOB 00819 #define CD_PIN 0 00820 #define CS_PORT GPIOB 00821 #define CS_PIN 1 00822 #define RESET_PORT GPIOB 00823 #define RESET_PIN 3 00824 00825 // configure macros for the data pins 00826 #define CMASK ((1<<3)) 00827 #define DMASK ((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)) 00828 00829 #define write_8(d) { \ 00830 GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ 00831 GPIOC_PSOR = (((d) & (1<<1)) << 2); \ 00832 GPIOD_PSOR = (d) & DMASK; \ 00833 } 00834 #define read_8() ( (GPIOD_PDIR & DMASK) | (GPIOC_PDIR & (1<<3)) >> 2 ) 00835 #define setWriteDir() {GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } 00836 #define setReadDir() {GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } 00837 00838 #define write8(x) { write_8(x); WR_STROBE; } 00839 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00840 #define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } 00841 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00842 00843 #define PASTE(x, y) x ## y 00844 00845 #define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) 00846 #define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) 00847 #define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) 00848 00849 #elif defined(USE_MY_BLUEPILL) && (defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_BLUEPILL_F103C8)) 00850 #warning Uno Shield on MY BLUEPILL 00851 00852 //LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| |SD_SS|SD_DI|SD_DO|SD_SCK| |SDA|SCL| 00853 //STM32 pin |PA3 |PA2 |PA1|PA0|PB7|PB6|PA10|PA9| |PB1|PB0|PA7|PA6|PA5| |PB12 |PB15 |PB14 |PB13 | |PB9|PB8| 00854 00855 #if defined(ARDUINO_BLUEPILL_F103C8) //regular CMSIS libraries 00856 #define REGS(x) x 00857 #define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ 00858 AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} 00859 #else //weird Maple libraries 00860 #define REGS(x) regs->x 00861 #endif 00862 00863 #define WRITE_DELAY { } 00864 #define READ_DELAY { RD_ACTIVE; } 00865 #define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } 00866 #define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) 00867 #define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) 00868 #define PIN_OUTPUT(port, pin) {\ 00869 if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ 00870 else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ 00871 } 00872 #define PIN_INPUT(port, pin) { \ 00873 if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ 00874 else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ 00875 } 00876 #define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) 00877 #define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) 00878 00879 #define RD_PORT GPIOB 00880 #define RD_PIN 1 00881 #define WR_PORT GPIOB 00882 #define WR_PIN 0 00883 #define CD_PORT GPIOA 00884 #define CD_PIN 7 00885 #define CS_PORT GPIOA 00886 #define CS_PIN 6 00887 #define RESET_PORT GPIOA 00888 #define RESET_PIN 5 00889 00890 // configure macros for the data pins 00891 #define AMASK 0x060F 00892 #define BMASK 0x00C0 00893 #define write_8(d) { GPIOA->REGS(BSRR) = AMASK << 16; GPIOB->REGS(BSRR) = BMASK << 16; \ 00894 GPIOA->REGS(BSRR) = (((d) & 3) << 9) | (((d) & 0xF0) >> 4); \ 00895 GPIOB->REGS(BSRR) = (((d) & 0x0C) << 4); \ 00896 } 00897 #define read_8() (((GPIOA->REGS(IDR) & (3<<9)) >> 9) | ((GPIOA->REGS(IDR) & (0x0F)) << 4) | ((GPIOB->REGS(IDR) & (3<<6)) >> 4)) 00898 // PA10,PA9 PA3-PA0 PB7,PB6 00899 #define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFF0); GP_OUT(GPIOA, CRL, 0xFFFF); GP_OUT(GPIOB, CRL, 0xFF000000); } 00900 #define setReadDir() {GP_INP(GPIOA, CRH, 0xFF0); GP_INP(GPIOA, CRL, 0xFFFF); GP_INP(GPIOB, CRL, 0xFF000000); } 00901 00902 #define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } 00903 #define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } 00904 #define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } 00905 #define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } 00906 00907 //####################################### ADIGITALEU_TEENSY ############################ 00908 //UNTESTED 00909 #elif defined(__MK66FX1M0__) && defined(USE_ADIGITALEU_TEENSY) // 16bit on a Teensy 3.6 00910 #warning "Teensy 3.6 16bit port C & D only (for now)" 00911 // Note: Port usage explained in UTFT Teensy edition ...\libraries\UTFT\hardware\arm\HW_Teensy3.h" 00912 00913 #define USES_16BIT_BUS 00914 00915 #define WRITE_DELAY { WR_ACTIVE8; } 00916 #define READ_DELAY { RD_ACTIVE16; } 00917 00918 #define RD_PORT GPIOA 00919 #define RD_PIN 16 //28 RD 00920 #define WR_PORT GPIOA 00921 #define WR_PIN 5 //25 WR 00922 #define CD_PORT GPIOE 00923 #define CD_PIN 26 //24 RS 00924 #define CS_PORT GPIOA 00925 #define CS_PIN 14 //26 CS 00926 #define RESET_PORT GPIOA 00927 #define RESET_PIN 15 //27 Reset 00928 00929 #define write_8(d) { GPIOC_PDOR = d; } 00930 #define write_16(d) { GPIOC_PDOR = d; GPIOD_PDOR = (d >> 8);} 00931 00932 #define read_8() (GPIOC_PDIR) 00933 #define read_16() (GPIOC_PDIR | GPIOD_PDIR << 8) 00934 00935 #define setWriteDir() {GPIOC_PDDR |= 0xFF; GPIOD_PDDR |= 0xFF; } 00936 #define setReadDir() {GPIOC_PDDR &= ~0xFF; GPIOD_PDDR &= ~0xFF; } 00937 00938 #define write8(x) {write_8(x); WRITE_DELAY; WR_STROBE } 00939 #define write16(x) {write_16(x); WRITE_DELAY; WR_STROBE } 00940 00941 #define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } 00942 #define READ_16(dst) { RD_STROBE; READ_DELAY; dst = read_16(); RD_IDLE;} 00943 00944 //Data: Teensy pins -> D0-D15 : 00945 // Teensy probably initialises some pins for Analog, Timer, Alternate, ... 00946 // so it is probably wise to use pinMode(n, OUTPUT) for all the control and data lines 00947 #define GPIO_INIT() {pinMode(2, OUTPUT); for (int i = 5; i <= 15; i++) pinMode(i, OUTPUT); for (int i = 20; i <= 28; i++) pinMode(i, OUTPUT);} 00948 00949 #define PASTE(x, y) x ## y 00950 00951 #define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) 00952 #define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) 00953 #define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) 00954 00955 #else 00956 #define USE_SPECIAL_FAIL 00957 #endif
Generated on Sat Jul 23 2022 01:16:42 by 1.7.2