/** * @brief Low level GDISP driver initialization. * * @notapi */ bool_t GDISP_LLD(init)(void) { #ifdef LCD_USE_FSMC /* FSMC setup. TODO: this only works for STM32F1 */ rccEnableAHB(RCC_AHBENR_FSMCEN, 0); int FSMC_Bank = 0; /* timing structure */ /* from datasheet: address setup: 0ns address hold: 0ns Data setup: 5ns Data hold: 5ns Data access: 250ns output hold: 100ns */ FSMC_Bank1->BTCR[FSMC_Bank+1] = FSMC_BTR1_ADDSET_1 | FSMC_BTR1_DATAST_1; /* Bank1 NOR/SRAM control register configuration */ FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN; #endif lld_lcdWriteReg(0x0000,0x0001); lld_lcdDelay(5); lld_lcdWriteReg(0x0003,0xA8A4); lld_lcdDelay(5); lld_lcdWriteReg(0x000C,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x000D,0x080C); lld_lcdDelay(5); lld_lcdWriteReg(0x000E,0x2B00); lld_lcdDelay(5); lld_lcdWriteReg(0x001E,0x00B0); lld_lcdDelay(5); lld_lcdWriteReg(0x0001,0x2B3F); lld_lcdDelay(5); lld_lcdWriteReg(0x0002,0x0600); lld_lcdDelay(5); lld_lcdWriteReg(0x0010,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0011,0x6070); lld_lcdDelay(5); lld_lcdWriteReg(0x0005,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0006,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0016,0xEF1C); lld_lcdDelay(5); lld_lcdWriteReg(0x0017,0x0003); lld_lcdDelay(5); lld_lcdWriteReg(0x0007,0x0133); lld_lcdDelay(5); lld_lcdWriteReg(0x000B,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x000F,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0041,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0042,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0048,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0049,0x013F); lld_lcdDelay(5); lld_lcdWriteReg(0x004A,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x004B,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0044,0xEF00); lld_lcdDelay(5); lld_lcdWriteReg(0x0045,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0046,0x013F); lld_lcdDelay(5); lld_lcdWriteReg(0x0030,0x0707); lld_lcdDelay(5); lld_lcdWriteReg(0x0031,0x0204); lld_lcdDelay(5); lld_lcdWriteReg(0x0032,0x0204); lld_lcdDelay(5); lld_lcdWriteReg(0x0033,0x0502); lld_lcdDelay(5); lld_lcdWriteReg(0x0034,0x0507); lld_lcdDelay(5); lld_lcdWriteReg(0x0035,0x0204); lld_lcdDelay(5); lld_lcdWriteReg(0x0036,0x0204); lld_lcdDelay(5); lld_lcdWriteReg(0x0037,0x0502); lld_lcdDelay(5); lld_lcdWriteReg(0x003A,0x0302); lld_lcdDelay(5); lld_lcdWriteReg(0x003B,0x0302); lld_lcdDelay(5); lld_lcdWriteReg(0x0023,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0024,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x0025,0x8000); lld_lcdDelay(5); lld_lcdWriteReg(0x004f,0x0000); lld_lcdDelay(5); lld_lcdWriteReg(0x004e,0x0000); lld_lcdDelay(5); /* Initialise the GDISP structure */ GDISP.Width = SCREEN_WIDTH; GDISP.Height = SCREEN_HEIGHT; GDISP.Orientation = portrait; GDISP.Powermode = powerOn; GDISP.Backlight = 100; GDISP.Contrast = 50; #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP GDISP.clipx0 = 0; GDISP.clipy0 = 0; GDISP.clipx1 = GDISP.Width; GDISP.clipy1 = GDISP.Height; #endif return TRUE; }
bool_t gdisp_lld_init(void) { /* Initialise your display */ gdisp_lld_init_board(); /* Hardware reset */ gdisp_lld_reset_pin(TRUE); lld_lcdDelay(1000); gdisp_lld_reset_pin(FALSE); lld_lcdDelay(1000); // chinese code starts here lld_lcdWriteReg(0x0000,0x0001); lld_lcdDelay(10); lld_lcdWriteReg(0x0015,0x0030); lld_lcdWriteReg(0x0011,0x0040); lld_lcdWriteReg(0x0010,0x1628); lld_lcdWriteReg(0x0012,0x0000); lld_lcdWriteReg(0x0013,0x104d); lld_lcdDelay(10); lld_lcdWriteReg(0x0012,0x0010); lld_lcdDelay(10); lld_lcdWriteReg(0x0010,0x2620); lld_lcdWriteReg(0x0013,0x344d); //304d lld_lcdDelay(10); lld_lcdWriteReg(0x0001,0x0100); lld_lcdWriteReg(0x0002,0x0300); lld_lcdWriteReg(0x0003,0x1038);//0x1030 lld_lcdWriteReg(0x0008,0x0604); lld_lcdWriteReg(0x0009,0x0000); lld_lcdWriteReg(0x000A,0x0008); lld_lcdWriteReg(0x0041,0x0002); lld_lcdWriteReg(0x0060,0x2700); lld_lcdWriteReg(0x0061,0x0001); lld_lcdWriteReg(0x0090,0x0182); lld_lcdWriteReg(0x0093,0x0001); lld_lcdWriteReg(0x00a3,0x0010); lld_lcdDelay(10); //################# void Gamma_Set(void) ####################// lld_lcdWriteReg(0x30,0x0000); lld_lcdWriteReg(0x31,0x0502); lld_lcdWriteReg(0x32,0x0307); lld_lcdWriteReg(0x33,0x0305); lld_lcdWriteReg(0x34,0x0004); lld_lcdWriteReg(0x35,0x0402); lld_lcdWriteReg(0x36,0x0707); lld_lcdWriteReg(0x37,0x0503); lld_lcdWriteReg(0x38,0x1505); lld_lcdWriteReg(0x39,0x1505); lld_lcdDelay(10); //################## void Display_ON(void) ####################// lld_lcdWriteReg(0x0007,0x0001); lld_lcdDelay(10); lld_lcdWriteReg(0x0007,0x0021); lld_lcdWriteReg(0x0007,0x0023); lld_lcdDelay(10); lld_lcdWriteReg(0x0007,0x0033); lld_lcdDelay(10); lld_lcdWriteReg(0x0007,0x0133); // chinese code ends here // Turn on the backlight gdisp_lld_backlight(GDISP_INITIAL_BACKLIGHT); /* Initialise the GDISP structure */ GDISP.Width = GDISP_SCREEN_WIDTH; GDISP.Height = GDISP_SCREEN_HEIGHT; GDISP.Orientation = GDISP_ROTATE_0; GDISP.Powermode = powerOn; GDISP.Backlight = GDISP_INITIAL_BACKLIGHT; GDISP.Contrast = GDISP_INITIAL_CONTRAST; #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP GDISP.clipx0 = 0; GDISP.clipy0 = 0; GDISP.clipx1 = GDISP.Width; GDISP.clipy1 = GDISP.Height; #endif return TRUE; }
void gdisp_lld_control(unsigned what, void *value) { switch(what) { case GDISP_CONTROL_POWER: if(GDISP.Powermode == (gdisp_powermode_t)value) return; switch((gdisp_powermode_t)value) { case powerOff: lld_lcdWriteReg(0x0007, 0x0000); lld_lcdWriteReg(0x0010, 0x0000); lld_lcdWriteReg(0x0011, 0x0000); lld_lcdWriteReg(0x0012, 0x0000); lld_lcdWriteReg(0x0013, 0x0000); gdisp_lld_backlight(0); break; case powerOn: //*************Power On sequence ******************// lld_lcdWriteReg(0x0010, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ lld_lcdWriteReg(0x0011, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ lld_lcdWriteReg(0x0012, 0x0000); /* VREG1OUT voltage */ lld_lcdWriteReg(0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ lld_lcdDelay(2000); /* Dis-charge capacitor power voltage */ lld_lcdWriteReg(0x0010, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ lld_lcdWriteReg(0x0011, 0x0147); /* DC1[2:0], DC0[2:0], VC[2:0] */ lld_lcdDelay(500); lld_lcdWriteReg(0x0012, 0x013C); /* VREG1OUT voltage */ lld_lcdDelay(500); lld_lcdWriteReg(0x0013, 0x0E00); /* VDV[4:0] for VCOM amplitude */ lld_lcdWriteReg(0x0029, 0x0009); /* VCM[4:0] for VCOMH */ lld_lcdDelay(500); lld_lcdWriteReg(0x0007, 0x0173); /* 262K color and display ON */ gdisp_lld_backlight(GDISP.Backlight); if(GDISP.Powermode != powerSleep || GDISP.Powermode != powerDeepSleep) gdisp_lld_init(); break; case powerSleep: lld_lcdWriteReg(0x0007, 0x0000); /* display OFF */ lld_lcdWriteReg(0x0010, 0x0000); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ lld_lcdWriteReg(0x0011, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ lld_lcdWriteReg(0x0012, 0x0000); /* VREG1OUT voltage */ lld_lcdWriteReg(0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ lld_lcdDelay(2000); /* Dis-charge capacitor power voltage */ lld_lcdWriteReg(0x0010, 0x0002); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ gdisp_lld_backlight(0); break; case powerDeepSleep: lld_lcdWriteReg(0x0007, 0x0000); /* display OFF */ lld_lcdWriteReg(0x0010, 0x0000); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ lld_lcdWriteReg(0x0011, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ lld_lcdWriteReg(0x0012, 0x0000); /* VREG1OUT voltage */ lld_lcdWriteReg(0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ lld_lcdDelay(2000); /* Dis-charge capacitor power voltage */ lld_lcdWriteReg(0x0010, 0x0004); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ gdisp_lld_backlight(0); break; default: return; } GDISP.Powermode = (gdisp_powermode_t)value; return; case GDISP_CONTROL_ORIENTATION: if(GDISP.Orientation == (gdisp_orientation_t)value) return; switch((gdisp_orientation_t)value) { case GDISP_ROTATE_0: lld_lcdWriteReg(0x0001, 0x0100); lld_lcdWriteReg(0x0003, 0x1038); lld_lcdWriteReg(0x0060, 0x2700); GDISP.Height = GDISP_SCREEN_HEIGHT; GDISP.Width = GDISP_SCREEN_WIDTH; break; case GDISP_ROTATE_90: lld_lcdWriteReg(0x0001, 0x0000); lld_lcdWriteReg(0x0003, 0x1030); lld_lcdWriteReg(0x0060, 0x2700); GDISP.Height = GDISP_SCREEN_WIDTH; GDISP.Width = GDISP_SCREEN_HEIGHT; break; case GDISP_ROTATE_180: lld_lcdWriteReg(0x0001, 0x0000); lld_lcdWriteReg(0x0003, 0x1038); lld_lcdWriteReg(0x0060, 0xa700); GDISP.Height = GDISP_SCREEN_HEIGHT; GDISP.Width = GDISP_SCREEN_WIDTH; break; case GDISP_ROTATE_270: lld_lcdWriteReg(0x0001, 0x0100); lld_lcdWriteReg(0x0003, 0x1030); lld_lcdWriteReg(0x0060, 0xA700); GDISP.Height = GDISP_SCREEN_WIDTH; GDISP.Width = GDISP_SCREEN_HEIGHT; break; default: return; } #if GDISP_NEED_CLIP || GDISP_NEED_VALIDATION GDISP.clipx0 = 0; GDISP.clipy0 = 0; GDISP.clipx1 = GDISP.Width; GDISP.clipy1 = GDISP.Height; #endif GDISP.Orientation = (gdisp_orientation_t)value; return; case GDISP_CONTROL_BACKLIGHT: if((unsigned)value > 100) value = (void *)100; gdisp_lld_backlight((unsigned)value); GDISP.Backlight = (unsigned)value; break; default: return; } }
bool_t gdisp_lld_init(void) { /* Initialise your display */ gdisp_lld_init_board(); /* Hardware reset */ gdisp_lld_reset_pin(TRUE); lld_lcdDelay(1000); gdisp_lld_reset_pin(FALSE); lld_lcdDelay(1000); DISPLAY_CODE = lld_lcdReadReg(0); lld_lcdWriteReg(0x0000, 0x0001); //start Int. osc lld_lcdDelay(500); lld_lcdWriteReg(0x0001, 0x0100); //Set SS bit (shift direction of outputs is from S720 to S1) lld_lcdWriteReg(0x0002, 0x0700); //select the line inversion lld_lcdWriteReg(0x0003, 0x1038); //Entry mode(Horizontal : increment,Vertical : increment, AM=1) lld_lcdWriteReg(0x0004, 0x0000); //Resize control(No resizing) lld_lcdWriteReg(0x0008, 0x0202); //front and back porch 2 lines lld_lcdWriteReg(0x0009, 0x0000); //select normal scan lld_lcdWriteReg(0x000A, 0x0000); //display control 4 lld_lcdWriteReg(0x000C, 0x0000); //system interface(2 transfer /pixel), internal sys clock, lld_lcdWriteReg(0x000D, 0x0000); //Frame marker position lld_lcdWriteReg(0x000F, 0x0000); //selects clk, enable and sync signal polarity, lld_lcdWriteReg(0x0010, 0x0000); // lld_lcdWriteReg(0x0011, 0x0000); //power control 2 reference voltages = 1:1, lld_lcdWriteReg(0x0012, 0x0000); //power control 3 VRH lld_lcdWriteReg(0x0013, 0x0000); //power control 4 VCOM amplitude lld_lcdDelay(500); lld_lcdWriteReg(0x0010, 0x17B0); //power control 1 BT,AP lld_lcdWriteReg(0x0011, 0x0137); //power control 2 DC,VC lld_lcdDelay(500); lld_lcdWriteReg(0x0012, 0x0139); //power control 3 VRH lld_lcdDelay(500); lld_lcdWriteReg(0x0013, 0x1d00); //power control 4 vcom amplitude lld_lcdWriteReg(0x0029, 0x0011); //power control 7 VCOMH lld_lcdDelay(500); lld_lcdWriteReg(0x0030, 0x0007); lld_lcdWriteReg(0x0031, 0x0403); lld_lcdWriteReg(0x0032, 0x0404); lld_lcdWriteReg(0x0035, 0x0002); lld_lcdWriteReg(0x0036, 0x0707); lld_lcdWriteReg(0x0037, 0x0606); lld_lcdWriteReg(0x0038, 0x0106); lld_lcdWriteReg(0x0039, 0x0007); lld_lcdWriteReg(0x003c, 0x0700); lld_lcdWriteReg(0x003d, 0x0707); lld_lcdWriteReg(0x0020, 0x0000); //starting Horizontal GRAM Address lld_lcdWriteReg(0x0021, 0x0000); //starting Vertical GRAM Address lld_lcdWriteReg(0x0050, 0x0000); //Horizontal GRAM Start Position lld_lcdWriteReg(0x0051, 0x00EF); //Horizontal GRAM end Position lld_lcdWriteReg(0x0052, 0x0000); //Vertical GRAM Start Position lld_lcdWriteReg(0x0053, 0x013F); //Vertical GRAM end Position switch (DISPLAY_CODE) { case 0x9320: lld_lcdWriteReg(0x0060, 0x2700); //starts scanning from G1, and 320 drive lines break; case 0x9325: lld_lcdWriteReg(0x0060, 0xA700); //starts scanning from G1, and 320 drive lines break; } lld_lcdWriteReg(0x0061, 0x0001); //fixed base display lld_lcdWriteReg(0x006a, 0x0000); //no scroll lld_lcdWriteReg(0x0090, 0x0010); //set Clocks/Line =16, Internal Operation Clock Frequency=fosc/1, lld_lcdWriteReg(0x0092, 0x0000); //set gate output non-overlap period=0 lld_lcdWriteReg(0x0093, 0x0003); //set Source Output Position=3 lld_lcdWriteReg(0x0095, 0x0110); //RGB interface(Clocks per line period=16 clocks) lld_lcdWriteReg(0x0097, 0x0110); //set Gate Non-overlap Period 0 locksc lld_lcdWriteReg(0x0098, 0x0110); // lld_lcdWriteReg(0x0007, 0x0173); //display On // Turn on the backlight gdisp_lld_backlight(GDISP_INITIAL_BACKLIGHT); /* Initialise the GDISP structure */ GDISP.Width = GDISP_SCREEN_WIDTH; GDISP.Height = GDISP_SCREEN_HEIGHT; GDISP.Orientation = GDISP_ROTATE_0; GDISP.Powermode = powerOn; GDISP.Backlight = GDISP_INITIAL_BACKLIGHT; GDISP.Contrast = GDISP_INITIAL_CONTRAST; #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP GDISP.clipx0 = 0; GDISP.clipy0 = 0; GDISP.clipx1 = GDISP.Width; GDISP.clipy1 = GDISP.Height; #endif return TRUE; }