diff --git a/MCUFRIEND_kbv.cpp b/MCUFRIEND_kbv.cpp index d402418..f096d45 100644 --- a/MCUFRIEND_kbv.cpp +++ b/MCUFRIEND_kbv.cpp @@ -207,8 +207,11 @@ uint16_t MCUFRIEND_kbv::readID(void) ret = readReg40(0xEF); //ILI9327: [xx 02 04 93 27 FF] if (ret == 0x9327) return 0x9327; - ret = readReg32(0x04); - if (ret == 0x8000) //HX8357-D [xx 00 80 00] + uint32_t ret32 = readReg32(0x04); + msb = ret32 >> 16; + ret = ret32; +// if (msb = 0x38 && ret == 0x8000) //unknown [xx 38 80 00] with D3 = 0x1602 + if (msb = 0x00 && ret == 0x8000) //HX8357-D [xx 00 80 00] return 0x8357; if (ret == 0x8552) //ST7789V: [xx 85 85 52] return 0x7789; @@ -216,7 +219,7 @@ uint16_t MCUFRIEND_kbv::readID(void) return 0xAC11; ret = readReg32(0xD3); //for ILI9488, 9486, 9340, 9341 msb = ret >> 8; - if (msb == 0x93 || msb == 0x94 || msb == 0x77) + if (msb == 0x93 || msb == 0x94 || msb == 0x77 || msb == 0x16) return ret; //0x9488, 9486, 9340, 9341, 7796 if (ret == 0x00D3 || ret == 0xD3D3) return ret; //16-bit write-only bus @@ -1932,6 +1935,9 @@ case 0x4532: // thanks Leodino p16 = (int16_t *) & WIDTH; *p16 = 240; break; + case 0x1602: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | INVERT_GS | READ_24BITS; //thanks Dumper + goto common_9329; case 0xAC11: _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN; //thanks viliam goto common_9329; diff --git a/mcufriend_shield.h b/mcufriend_shield.h index a1ab4ca..3b591f0 100644 --- a/mcufriend_shield.h +++ b/mcufriend_shield.h @@ -122,7 +122,7 @@ PORT->Group[0].WRCONFIG.reg = (DMASK & 0xFFFF) | (1<<17) | (1<<28) | (1<<30); \ PORT->Group[0].WRCONFIG.reg = (DMASK>>16) | (1<<17) | (1<<28) | (1<<30) | (1<<31); \ } -#define write8(x) { write_8(x); WR_STROBE; } +#define write8(x) { write_8(x); 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_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } @@ -283,6 +283,69 @@ void write_8(uint8_t x) #define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) #define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) +#elif defined(__STM32F1__) && defined(ARDUINO_STM_NUCLEO_F103RB) // Uno Shield on NUCLEO-F103 +#warning Uno Shield on NUCLEO-F103 REGS +#define RD_PORT GPIOA +#define RD_PIN 0 +#define WR_PORT GPIOA +#define WR_PIN 1 +#define CD_PORT GPIOA +#define CD_PIN 4 +#define CS_PORT GPIOB +#define CS_PIN 0 +#define RESET_PORT GPIOC +#define RESET_PIN 1 + +// configure macros for the data pins + #define write_8(d) { \ + GPIOA->regs->BSRR = 0x0700 << 16; \ + GPIOB->regs->BSRR = 0x0438 << 16; \ + GPIOC->regs->BSRR = 0x0080 << 16; \ + GPIOA->regs->BSRR = (((d) & (1<<0)) << 9) \ + | (((d) & (1<<2)) << 8) \ + | (((d) & (1<<7)) << 1); \ + GPIOB->regs->BSRR = (((d) & (1<<3)) << 0) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<5)) >> 1) \ + | (((d) & (1<<6)) << 4); \ + GPIOC->regs->BSRR = (((d) & (1<<1)) << 6); \ + } + + #define read_8() ( (((GPIOA->regs->IDR & (1<<9)) >> 9) \ + | ((GPIOC->regs->IDR & (1<<7)) >> 6) \ + | ((GPIOA->regs->IDR & (1<<10)) >> 8) \ + | ((GPIOB->regs->IDR & (1<<3)) >> 0) \ + | ((GPIOB->regs->IDR & (1<<5)) >> 1) \ + | ((GPIOB->regs->IDR & (1<<4)) << 1) \ + | ((GPIOB->regs->IDR & (1<<10)) >> 4) \ + | ((GPIOA->regs->IDR & (1<<8)) >> 1))) + +// be wise to clear both MODER bits properly. +#define clearModebits() { \ + GPIOA->regs->CRH &= ~0xFFF; GPIOB->regs->CRH &= ~0xF00; GPIOB->regs->CRL &= ~0xFFF000; GPIOC->regs->CRL &= ~0xF0000000; \ + } +#define setWriteDir() { \ + clearModebits(); \ + GPIOA->regs->CRH |= 0x333; GPIOB->regs->CRH |= 0x300; GPIOB->regs->CRL |= 0x333000; GPIOC->regs->CRL |= 0x30000000; \ + } +#define setReadDir() { \ + clearModebits(); \ + GPIOA->regs->CRH |= 0x444; GPIOB->regs->CRH |= 0x400; GPIOB->regs->CRL |= 0x444000; GPIOC->regs->CRL |= 0x40000000; \ + } + +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#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 PIN_MODE4(reg, pin, mode) reg=(reg&~(0xF<<((pin)<<2)))|(mode<<((pin)<<2)) + +#define PIN_HIGH(port, pin) (port)->regs->BSRR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->regs->BSRR = (1<<((pin)+16)) +#define PIN_LOW(port, pin) (port)->regs->ODR &= ~(1<<(pin)) +#define PIN_OUTPUT(port, pin) PIN_MODE4((port)->regs->CRL, pin, 0x3) //50MHz push-pull only 0-7 +#define PIN_INPUT(port, pin) PIN_MODE4((port)->regs->CRL, pin, 0x4) //digital input + #else #error MCU unsupported #endif // regular UNO shields on Arduino boards