These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
Diff: LCD/NOKIA6610_LCD/drv_glcd.c
- Revision:
- 0:bf7b9fba3924
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD/NOKIA6610_LCD/drv_glcd.c Sun Mar 20 05:38:56 2011 +0000 @@ -0,0 +1,928 @@ +/************************************************************************* + * + * + * (c) Copyright IAR Systems 2006 + * + * File name : drv_glcd.c + * Description : Graphic LCD driver + * + * History : + * 1. Date : December 2, 2006 + * Author : Stanimir Bonev + * Description : Create + * + * $Revision: 28532 $ + **************************************************************************/ +#include "drv_glcd.h" +#include "lpc_types.h" +#include "stdarg.h" +#include <assert.h> +#include "glcd_ll.h" + +/* delay definition */ +#define GLCD_DLY_10US 80 // 10us +#define GLCD_RESET_DLY 50 // 5ms +#define GLCD_BOOSTER_ON_DLY 1200 // 120 ms + +static const GLCD_CmdCtrl_t GLCD_Cmd_Iss0[GLCD_CMD_NUMB] = +{ +// (ISS=0) +// NOP - No Operation + {0x00, GLCD_WRITE, 0, 0}, +// SLPIN - Sleep in & booster off + {0x10, GLCD_WRITE, 0, 0}, +// SLPOUT - Sleep out & booster on + {0x11, GLCD_WRITE, 0, 0}, +// PTLOUT (NORON) - Partial off (Normal) + {0x13, GLCD_WRITE, 0, 0}, +// INVOFF - Display inversion off (normal) + {0x20, GLCD_WRITE, 0, 0}, +// INVON - Display inversion on + {0x21, GLCD_WRITE, 0, 0}, +// DISPOFF - Display off + {0x28, GLCD_WRITE, 0, 0}, +// DISPON - Display on + {0x29, GLCD_WRITE, 0, 0}, +// CASET - Column address set +// X_ADR start: 0h <= XS <= 83h +// X_ADR end: 0h <= XS <= 83h + {0x2A, GLCD_WRITE, 0, 2}, +// RASET - Row address set +// Y_ADR start: 0h <= YS <= 83h +// Y_ADR end: 0h <= YS <= 83h + {0x2B, GLCD_WRITE, 0, 2}, +// RAMWR - Memory write + {0x2C, GLCD_WRITE, 0, (uint32_t)-1}, +// RGBSET - Color set for 256 color display + {0x2D, GLCD_WRITE, 0, 20}, +// VSCSAD - Scroll start address of RAM +// SSA = 0, 1, 2, , 131 + {0x37, GLCD_WRITE, 0, 1}, +// IDMOFF - Idle mode off + {0x38, GLCD_WRITE, 0, 0}, +// IDMON - Idle mode on + {0x39, GLCD_WRITE, 0, 0}, +// RDID1 - Interface pixel format + {0xDA, GLCD_READ, 0, 1}, +// RDID2 - Interface pixel format + {0xDB, GLCD_READ, 0, 1}, +// RDID3 - Interface pixel format + {0xDC, GLCD_READ, 0, 1}, +// FRMSEL - External oscillator select +// Frame frequency in Temp range A +// Frame frequency in Temp range B +// Frame frequency in Temp range C +// Frame frequency in Temp range D + {0xB4, GLCD_WRITE, 0, 4}, +// FRM8SEL - External oscillator select +// Frame frequency in Temp range A +// Frame frequency in Temp range B +// Frame frequency in Temp range C +// Frame frequency in Temp range D + {0xB5, GLCD_WRITE, 0, 4}, +// TMPRNG - External oscillator select +// Temp range A +// Temp range B +// Temp range C +// Temp range D + {0xB6, GLCD_WRITE, 0, 4}, +// TMPHIS - Temp range set + {0xB8, GLCD_WRITE, 0, 1}, +// TMPREAD - Temperature read back + {0xB7, GLCD_READ, 0, 1}, +// EPWRIN - EEPROM write start + {0xD1, GLCD_WRITE, 0, 0}, +// EPWROUT - EEPROM write end + {0xD0, GLCD_WRITE, 0, 0}, +// RDEV - Read internal contrast (EV_IN) + {0xD4, GLCD_WRITE, 0, 1}, +// RDRR - Read internal resistor ratio (RR_IN) + {0xD5, GLCD_READ, 0, 1}, +// Adapted commands +// PTIN - adapted command (PTLAR + PTIN) + {0x00, GLCD_WRITE, 0, 0}, +// SCRLAR - Scroll area set (2-line unit) +// TFA = 0,1,2, , 132 +// VSA = 0,1,2, , 132 +// BFA = 0,1,2, , 132 + {0x33, GLCD_WRITE, 0, 3}, +// DATCTR - adapted command (MADCTR + COLMOD) + {0x00, GLCD_WRITE, 0, 0}, +// SETCON - Write contrast 0 - 127 + {0x25, GLCD_WRITE, 0, 1}, +// Commands applicable only when ISS=1 +// OSCON + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// OSCOFF + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// RMWIN + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// RMWOUT + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// VOLUP + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// VOLDOWN + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// ASCSET + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// DISCTR + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// PWRCTR + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// VOLCTR + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// Commands applicable only when ISS=0 +// CLKINT - Internal oscillator select + {0xB0, GLCD_WRITE, 0, 0}, +// CLKEXT - External oscillator select + {0xB1, GLCD_WRITE, 0, 0}, +// RDDST - Read Display Status + {0x09, GLCD_READ, 1, 4}, +// SWRESET - Software reset + {0x01, GLCD_WRITE, 0, 0}, +// RDDID - Read Display ID + {0x04, GLCD_READ, 1, 3}, +// PTLAR - Partial start/end address set +// Start address (0,1,2, , 131) +// End address (0,1,2, , 131) + {0x30, GLCD_WRITE, 0, 2}, +// PTLON - Partial mode on + {0x12, GLCD_WRITE, 0, 0}, +// MADCTR - Tearing effect mode set & on + {0x36, GLCD_WRITE, 0, 1}, +// COLMOD - Interface pixel format +// Interface format + {0x3A, GLCD_WRITE, 0, 1}, +// APOFF - All pixel off (only for test purpose) + {0x22, GLCD_WRITE, 0, 0}, +// APON - All pixel on (only for test purpose) + {0x23, GLCD_WRITE, 0, 0}, +// BSTROFF - Booster off (only for test purpose) + {0x02, GLCD_WRITE, 0, 0}, +// BSTRON - Booster on (only for test purpose) + {0x03, GLCD_WRITE, 0, 0}, +}; + +static const GLCD_CmdCtrl_t GLCD_Cmd_Iss1[GLCD_CMD_NUMB] = +{ +// (ISS=1) +// NOP - No Operation + {0x25, GLCD_WRITE, 0, 0}, +// SLPIN - Sleep in & booster off + {0x95, GLCD_WRITE, 0, 0}, +// SLPOUT - Sleep out & booster on + {0x94, GLCD_WRITE, 0, 0}, +// PTLOUT (NORON) - Partial off (Normal) + {0xA9, GLCD_WRITE, 0, 0}, +// INVOFF - Display inversion off (normal) + {0xA6, GLCD_WRITE, 0, 0}, +// INVON - Display inversion on + {0xA7, GLCD_WRITE, 0, 0}, +// DISPOFF - Display off + {0xAE, GLCD_WRITE, 0, 0}, +// DISPON - Display on + {0xAF, GLCD_WRITE, 0, 0}, +// CASET - Column address set +// X_ADR start: 0h <= XS <= 83h +// X_ADR end: 0h <= XS <= 83h + {0x15, GLCD_WRITE, 0, 2}, +// RASET - Row address set +// Y_ADR start: 0h <= YS <= 83h +// Y_ADR end: 0h <= YS <= 83h + {0x75, GLCD_WRITE, 0, 2}, +// RAMWR - Memory write + {0x5C, GLCD_WRITE, 0, (uint32_t)-1}, +// RGBSET - Color set for 256 color display + {0xCE, GLCD_WRITE, 0, 20}, +// VSCSAD - Scroll start address of RAM +// SSA = 0, 1, 2, , 131 + {0xAB, GLCD_WRITE, 0, 1}, +// IDMOFF - Idle mode off + {0x38, GLCD_WRITE, 0, 0}, +// IDMON - Idle mode on + {0x39, GLCD_WRITE, 0, 0}, +// RDID1 - Interface pixel format + {0xDA, GLCD_READ, 0, 1}, +// RDID2 - Interface pixel format + {0xDB, GLCD_READ, 0, 1}, +// RDID3 - Interface pixel format + {0xDC, GLCD_READ, 0, 1}, +// FRMSEL - External oscillator select +// Frame frequency in Temp range A +// Frame frequency in Temp range B +// Frame frequency in Temp range C +// Frame frequency in Temp range D + {0xB4, GLCD_WRITE, 0, 4}, +// FRM8SEL - External oscillator select +// Frame frequency in Temp range A +// Frame frequency in Temp range B +// Frame frequency in Temp range C +// Frame frequency in Temp range D + {0xB5, GLCD_WRITE, 0, 4}, +// TMPRNG - External oscillator select +// Temp range A +// Temp range B +// Temp range C +// Temp range D + {0xB6, GLCD_WRITE, 0, 4}, +// TMPHIS - Temp hysteresis range set + {0xB8, GLCD_WRITE, 0, 1}, +// TMPREAD - Temperature read back + {0xB7, GLCD_READ, 0, 1}, +// EPWRIN - EEPROM write start + {0xCD, GLCD_WRITE, 0, 0}, +// EPWROUT - EEPROM write end + {0xCC, GLCD_WRITE, 0, 0}, +// RDEV - Read internal contrast (EV_IN) + {0x7C, GLCD_WRITE, 0, 1}, +// RDRR - Read internal resistor ratio (RR_IN) + {0x7D, GLCD_READ, 0, 1}, +// Adapted commands +// PTIN - Partial area set & on +// Partial start line address +// PSL7-0 Partial start line address +// PEL7-0 Partial end line address + {0xA8, GLCD_WRITE, 0, 2}, +// SCRLAR(ASCSET) - Scroll area set (2-line unit) Mode-0 +// SSL7-0 - Scroll start line +// SEL7-0 - Scroll end line +// SFL7-0 - Scroll specified line +// SMD2-0 - Area scroll mode + {0xAA, GLCD_WRITE, 0, 4}, +// DATCTR - adapted command (MADCTR + COLMOD) +// MV MX MY - Row/column address control +// MRGB - RGB +// GS2 GS1 GS0 - Gray-scale setup + {0xBC, GLCD_WRITE, 0, 3}, +// SETCON - Write contrast 0 - 127 + {0x00, GLCD_WRITE, 0, 1}, +// Commands applicable only when ISS=1 +// OSCON - Oscillator on + {0xD1, GLCD_WRITE, 0, 0}, +// OSCOFF - Oscillator off + {0xD2, GLCD_WRITE, 0, 0}, +// RMWIN - Read & modify write on + {0xE0, GLCD_WRITE, 0, 0}, +// RMWOUT - Read & modify write off + {0xEE, GLCD_WRITE, 0, 0}, +// VOLUP - EV increment + {0xD6, GLCD_WRITE, 0, 0}, +// VOLDOWN - EV decrement + {0xD7, GLCD_WRITE, 0, 0}, +// ASCSET - Scroll area set +// SSL7-0 - Scroll start line +// SEL7-0 - Scroll end line +// SFL7-0 - Scroll specified line +// SMD1-0 - Area scroll mode + {0xAA, GLCD_WRITE, 0, 4}, +// DISCTR - Display control +// P1 +// P2 +// P3 + {0xCA, GLCD_WRITE, 0, 3}, +// PWRCTR - Power control set +// P13-P10 + {0x20, GLCD_WRITE, 0, 1}, +// VOLCTR + {0x81, GLCD_WRITE, 0, 2}, +// Commands applicable only when ISS=0 +// CLKINT - Internal oscillator select + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// CLKEXT - External oscillator select + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// RDDST - Read Display Status + {GLCD_INV_CMD, GLCD_READ, 0, 0}, +// SWRESET - Software reset + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// RDDID - Read Display ID + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// PTLAR - Partial start/end address set +// Start address (0,1,2, , 131) +// End address (0,1,2, , 131) + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// PTLON - Partial mode on + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// MADCTR - Tearing effect mode set & on + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// COLMOD - Interface pixel format +// Interface format + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// APOFF - All pixel off (only for test purpose) + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// APON - All pixel on (only for test purpose) + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// BSTROFF - Booster off (only for test purpose) + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +// BSTRON - Booster on (only for test purpose) + {GLCD_INV_CMD, GLCD_WRITE, 0, 0}, +}; + +static GLCD_ISS_t Glcd_Iss; +static Bool OddPixel = FALSE; +static uint32_t PixelHold = 0; + + +static pFontType_t pCurrFont = NULL; +static LdcPixel_t TextColour; +static LdcPixel_t TextBackgndColour; + +static uint32_t TextX_Pos = 0; +static uint32_t TextY_Pos = 0; + +static uint32_t XL_Win = DEF_X_LEFT; +static uint32_t YU_Win = DEF_Y_UP; +static uint32_t XR_Win = DEF_X_RIGHT; +static uint32_t YD_Win = DEF_Y_DOWN; + +static uint32_t TabSize = TEXT_DEF_TAB_SIZE; + +/************************************************************************* + * Function Name: GLCD_SendCmd + * Parameters: GLCD_SendCmd Cmd, unsigned char *pData, uint32_t Size + * Return: GLCD_Status_t + * + * Description: Send command to the Graphic LCD + * + *************************************************************************/ +GLCD_Status_t GLCD_SendCmd (GLCD_Cmd_t Cmd, unsigned char *pData, uint32_t Size) +{ + static Bool Write2_DRAM = FALSE; // write to DRAM mode + static uint32_t ResRatio; // Hold resistor ratio init by VOLCTR + // and used by SETCON adapted command + pDATCTR_Data_t pDATCTR_Data; + uint8_t ColourSch; + pASCSET_Data_t pASCSET_Data; + MADCTR_Data_t DataMode = {0}; + // Pointer to current set of commands + pGLCD_CmdCtrl_t pGLCD_CmdCtrl = (pGLCD_CmdCtrl_t)(((Glcd_Iss==GLCD_ISS_0)? + GLCD_Cmd_Iss0:GLCD_Cmd_Iss1) + Cmd); + + uint32_t Contrast; + + if(Write2_DRAM) + { + // Select LCD + GLCD_SPI_ChipSelect(1); + if(Cmd != RAMWR) + { + Write2_DRAM = FALSE; + if(PixelHold & WAITED_PIXEL) + { + // Flush pixel + GLCD_SPI_TranserByte(PixelHold); + } + // Release CS + GLCD_SPI_ChipSelect(0); + } + else + { + // pixels collection + uint32_t Pixel; + while(Size > 1) + { + Pixel = *pData++; + Pixel |= (*pData++)<<8; + PixelHold |= WAITED_PIXEL; + if(!OddPixel) + { + // Get even pixel + PixelHold |= PIXEL_CONV(Pixel,0); + } + else + { + // Apply odd pixel + PixelHold |= PIXEL_CONV(Pixel,1); + // and send together both pixels + GLCD_SPI_SendBlock((unsigned char *)&PixelHold,3); + PixelHold = 0; + } + // update the even/odd flag + OddPixel ^= 1; + // update the counter of the remaining bytes + Size -= 2; + } + // Release CS + GLCD_SPI_ChipSelect(0); + return(GLCD_OK); + } + } + + // sanitary check of command + if(pGLCD_CmdCtrl->Cmd == GLCD_INV_CMD) + { + return(GLCD_UNSUPPORTED); + } + + // Implement adapted commands + if(Glcd_Iss==GLCD_ISS_0) + { + switch(Cmd) + { + case PTIN: + // PTLAR + PTIN + GLCD_SendCmd(PTLAR,pData,0); + GLCD_SendCmd(PTLON,NULL,0); + return(GLCD_OK); + case DATCTR: + pDATCTR_Data = (pDATCTR_Data_t)pData; + // MADCTR + COLMOD + // Data reconstruction + DataMode.MY = pDATCTR_Data->MY; + DataMode.MX = pDATCTR_Data->MX; + DataMode.MV = pDATCTR_Data->MV; + DataMode.ML = pDATCTR_Data->ML; + DataMode.RGB = !pDATCTR_Data->RGB; + GLCD_SendCmd(MADCTR,(unsigned char*)&DataMode,0); + // 4K colors Type A + ColourSch = 3; + return(GLCD_SendCmd(COLMOD,&ColourSch,0)); + } + } + else + { + switch(Cmd) + { + case SCRLAR: + pASCSET_Data = (pASCSET_Data_t)pData; + pASCSET_Data->Smd = 0; // Center screen scroll mode + GLCD_SendCmd(ASCSET,pData,0); + return(GLCD_OK); + case DATCTR: + pDATCTR_Data = (pDATCTR_Data_t)pData; + pDATCTR_Data->ML = 0; + pDATCTR_Data->MX = !pDATCTR_Data->MX; + // 4K colors Type A + pDATCTR_Data->GS = 2; + break; + case SETCON: + Contrast = *pData | (ResRatio << 8); + return(GLCD_SendCmd(VOLCTR,(unsigned char *)&Contrast,0)); + case VOLCTR: + ResRatio = *(pData+1); + break; + } + } + + if(pGLCD_CmdCtrl->Param != (uint32_t)-1) + { + // Command with fixed size of parameters + Size = pGLCD_CmdCtrl->Param; + } + + // Select LCD + GLCD_SPI_ChipSelect(1); + + GLCD_SPI_TranserByte(pGLCD_CmdCtrl->Cmd); + if(Cmd == RAMWR) + { + // enter in write to DRAM mode + OddPixel = FALSE; + PixelHold = 0; + Write2_DRAM = TRUE; + return(GLCD_SendCmd(RAMWR,pData,Size)); + } + + // Send/Receive parameters + if(pGLCD_CmdCtrl->Dir == GLCD_READ) + { + if(pGLCD_CmdCtrl->Pulse) + { + if(Size) + { + *pData++ = GLCD_SPI_TranserByte(0xFFFF); + --Size; + } + } + GLCD_SPI_SetWordWidth(8); + } + + if(pGLCD_CmdCtrl->Dir == GLCD_READ) + { + GLCD_SPI_ReceiveBlock(pData,Size); + } + else + { + GLCD_SPI_SendBlock(pData,Size); + } + + // Release CS + GLCD_SPI_ChipSelect(0); + if(pGLCD_CmdCtrl->Dir == GLCD_READ) + { + GLCD_SPI_SetWordWidth(9); + } + return(GLCD_OK); +} + +/************************************************************************* + * Function Name: GLCD_PowerUpInit + * Parameters: unsigned char *pInitData + * Return: GLCD_Status_t + * GLCD_OK - init pass + * GLCD_ID_ERROR - unsupported driver type + * Description: Power-up initialization of Graphic LCD + * + *************************************************************************/ +//GLCD_Status_t GLCD_PowerUpInit (unsigned char *pInitData) +GLCD_Status_t GLCD_PowerUpInit (unsigned char *pInitData) +{ + uint32_t Data; + volatile uint32_t i; + pDATCTR_Data_t pDATCTR_Data; + // Init SPI and IO + // Init low level + GLCD_SPI_Init(GLCD_DEF_CLOCK,GLCD_DEF_WIDTH); + GLCD_LLInit(); + + // H/W Reset + // Rest L > 10us H + GLCD_SetReset(0); + for(i = GLCD_DLY_10US; i ; --i); + GLCD_SetReset(1); + + // Wait 5 ms + Dly100us((void *)GLCD_RESET_DLY); + // Identify LCD and command interpreter + Glcd_Iss = GLCD_ISS_0; + GLCD_SendCmd(RDDID,(unsigned char *)&Data,0); + if(((Data & 0xFF) != GLCD_MANF_ID) ||(((Data >> 16)& 0xFF) != GLCD_MOD_ID)) + { + // Iss = 1 don't support RDDID command + Glcd_Iss = GLCD_ISS_1; + } + // Power Supply Set + if(Glcd_Iss == GLCD_ISS_1) + { + // Support only 4K colors + assert(GLCD_DEF_DPL_ML == 0); + // DISCTR (Display Control) + // - F1/F2 switching period set + // - Line inversion set + Data = 0 | (0x20UL << 8) | (0x11UL << 16); + GLCD_SendCmd(DISCTR,(unsigned char *)&Data,0); + // OSCON (Oscillator ON) + GLCD_SendCmd(OSCON,NULL,0); + // Set contrast + Data = 0x20 | (0x0UL << 8); + GLCD_SendCmd(VOLCTR,(unsigned char *)&Data,0); + } + else + { + // Set contrast + Data = 0x30; + GLCD_SendCmd(SETCON,(unsigned char *)&Data,0); + } + // SLPOUT (Sleep mode OFF & OSC/Booster On) + GLCD_SendCmd(SLPOUT,NULL,0); // Sleep out + if(Glcd_Iss == GLCD_ISS_0) + { + GLCD_SendCmd(BSTRON,NULL,0); // Booster voltage on + } + // Display Environment Set + // Display inversion setting + GLCD_SendCmd(GLCD_DEF_DPL_INV?INVON:INVOFF,NULL,0); + // Display color scheme setting + GLCD_SendCmd(GLCD_DEF_DPL_8_COLOR?IDMON:IDMOFF,NULL,0); + // Display partial setting + if(GLCD_DEF_DPL_PARTIAL_MODE) + { + GLCD_SendCmd(PTLOUT,NULL,0); + } + else + { +#if GLCD_DEF_DPL_PARTIAL_MODE > 0 +#error "PARTIAL_MODE not supported yet" +#endif // GLCD_DEF_DPL_PARTIAL_MODE > 0 + } + // Memory Data Access Control + Data = 0; + pDATCTR_Data = (pDATCTR_Data_t)&Data; + pDATCTR_Data->RGB = GLCD_DEF_DPL_RGB_ORD; // BGR / RGB order + /* Because NXP_logo data was generated by reverse row direction so have to set MY = 1 */ + pDATCTR_Data->MY = 1; // no mirror Y + pDATCTR_Data->MX = GLCD_DEF_DPL_MX; // no mirror X + pDATCTR_Data->MV = GLCD_DEF_DPL_V; // vertical RAM write in Y/X direction + pDATCTR_Data->ML = GLCD_DEF_DPL_ML; // line address order (bottom to top) / (top to bottom) + // support only 4k type A colored scheme + GLCD_SendCmd(DATCTR,(unsigned char *)&Data,0); + // Display Data Write & Display On + // COLUMN ADDRESS SET and PAGE ADDRESS SET + Data = 0 | ((GLCD_HORIZONTAL_SIZE - 1)<<8); + GLCD_SendCmd(RASET,(unsigned char *)&Data,0); + GLCD_SendCmd(CASET,(unsigned char *)&Data,0); + + // Init display memory + if(pInitData == NULL) + { + Data = DEF_BACKGND_COLOUR; + for(i = 0; i < (GLCD_HORIZONTAL_SIZE * GLCD_VERTICAL_SIZE); ++i) + { + LCD_WRITE_PIXEL(Data); + } + LCD_FLUSH_PIXELS(); + } + else + { + GLCD_SendCmd(RAMWR,pInitData,GLCD_HORIZONTAL_SIZE * GLCD_VERTICAL_SIZE * 2); + } + if(Glcd_Iss == GLCD_ISS_1) + { + // PWRCTR + Data = 0x1F; + GLCD_SendCmd(PWRCTR,(unsigned char *)&Data,0); + } + // Memory Data Access Control + /* Reset default control mode after drawing */ + pDATCTR_Data = (pDATCTR_Data_t)&Data; + pDATCTR_Data->RGB = GLCD_DEF_DPL_RGB_ORD; // BGR / RGB order + pDATCTR_Data->MY = GLCD_DEF_DPL_MY; // no mirror Y + pDATCTR_Data->MX = GLCD_DEF_DPL_MX; // no mirror X + pDATCTR_Data->MV = GLCD_DEF_DPL_V; // vertical RAM write in Y/X direction + pDATCTR_Data->ML = GLCD_DEF_DPL_ML; // line address order (bottom to top) / (top to bottom) + // support only 4k type A colored scheme + GLCD_SendCmd(DATCTR,(unsigned char *)&Data,0); + + // Wait for more than 120ms after power control command + Dly100us((void *)GLCD_BOOSTER_ON_DLY); + GLCD_SendCmd(GLCD_DISPLAY_STATE?DISPON:DISPOFF,NULL,0); + return(GLCD_OK); +} + +/************************************************************************* + * Function Name: GLCD_SetFont + * Parameters: pFontType_t pFont, LdcPixel_t Color + * LdcPixel_t BackgndColor + * + * Return: none + * + * Description: Set current font, font color and background color + * + *************************************************************************/ +void GLCD_SetFont(pFontType_t pFont, LdcPixel_t Color, LdcPixel_t BackgndColor) +{ + pCurrFont = pFont; + TextColour = Color; + TextBackgndColour = BackgndColor; +} + +/************************************************************************* + * Function Name: GLCD_SetWindow + * Parameters: uint32_t X_Left, uint32_t Y_Up, + * uint32_t X_Right, uint32_t Y_Down + * + * Return: none + * + * Description: Set draw window XY coordinate in pixels + * + *************************************************************************/ +void GLCD_SetWindow(uint32_t X_Left, uint32_t Y_Up, + uint32_t X_Right, uint32_t Y_Down) +{ + assert(X_Right < GLCD_HORIZONTAL_SIZE); + assert(Y_Down < GLCD_VERTICAL_SIZE); + assert(X_Left < X_Right); + assert(Y_Up < Y_Down); + XL_Win = X_Left; + YU_Win = Y_Up; + XR_Win = X_Right; + YD_Win = Y_Down; +} + +/************************************************************************* + * Function Name: GLCD_TextSetPos + * Parameters: uint32_t X_UpLeft, uint32_t Y_UpLeft, + * uint32_t X_DownLeft, uint32_t Y_DownLeft + * + * Return: none + * + * Description: Set text X,Y coordinate in characters + * + *************************************************************************/ +void GLCD_TextSetPos(uint32_t X, uint32_t Y) +{ + TextX_Pos = X; + TextY_Pos = Y; +} + +/************************************************************************* + * Function Name: GLCD_TextSetTabSize + * Parameters: uint32_t Size + * + * Return: none + * + * Description: Set text tab size in characters + * + *************************************************************************/ +void GLCD_TextSetTabSize(uint32_t Size) +{ + TabSize = Size; +} + +/************************************************************************* + * Function Name: GLCD_TextCalcWindow + * Parameters: pInt32U pXL, pInt32U pXR, + * pInt32U pYU, pInt32U pYD, + * pInt32U pH_Size, pInt32U pV_Size + * + * Return: Bool + * FALSE - out of window coordinate aren't valid + * TRUE - the returned coordinate are valid + * + * Description: Calculate character window + * + *************************************************************************/ +static Bool GLCD_TextCalcWindow (unsigned int *pXL, unsigned int *pXR, + unsigned int *pYU, unsigned int *pYD, + unsigned int *pH_Size, unsigned int *pV_Size) +{ + *pH_Size = pCurrFont->H_Size; + *pV_Size = pCurrFont->V_Size; + *pXL = XL_Win + (TextX_Pos*pCurrFont->H_Size); + if(*pXL > XR_Win) + { + return(FALSE); + } + *pYU = YU_Win + (TextY_Pos*pCurrFont->V_Size); + if(*pYU > YD_Win) + { + return(FALSE); + } + + *pXR = XL_Win + ((TextX_Pos+1)*pCurrFont->H_Size) - 1; + if(*pXR > XR_Win) + { + *pH_Size -= *pXR - XR_Win; + *pXR = XR_Win; + } + + *pYD = YU_Win + ((TextY_Pos+1)*pCurrFont->V_Size) - 1; + if(*pYD > YD_Win) + { + *pV_Size -= *pYD - YD_Win; + *pYD = YD_Win; + } + + return(TRUE); +} + +/************************************************************************* + * Function Name: GLCD_putchar + * Parameters: int c + * + * Return: none + * + * Description: Put char function + * + *************************************************************************/ +int GLCD_putchar (int c) +{ + unsigned char *pSrc; + uint32_t H_Line, i, j, k; + uint32_t xl,xr,yu,yd,Temp,V_Size, H_Size, SrcInc = 1; + uint32_t WhiteSpaceNumb; + if(pCurrFont == NULL) + { + return(-1); + } + H_Line = (pCurrFont->H_Size / 8) + ((pCurrFont->H_Size % 8)?1:0); + switch(c) + { + case '\n': // go to start of next line (NewLine) + ++TextY_Pos; + break; + case '\r': // go to start of this line (Carriage Return) + // clear from current position to end of line + while(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size)) + { + LCD_SET_WINDOW(xl,xr,yu,yd); + for(i = 0; i < V_Size; ++i) + { + for(j = 0; j < H_Size; ++j) + { + LCD_WRITE_PIXEL(TextBackgndColour); + } + } + ++TextX_Pos; + } + TextX_Pos = 0; + break; + case '\b': // go back one position (BackSpace) + if(TextX_Pos) + { + --TextX_Pos; + // del current position + if(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size)) + { + LCD_SET_WINDOW(xl,xr,yu,yd); + for(i = 0; i < V_Size; ++i) + { + for(j = 0; j < H_Size; ++j) + { + LCD_WRITE_PIXEL(TextBackgndColour); + } + } + } + } + break; + case '\t': // go to next Horizontal Tab stop + WhiteSpaceNumb = TabSize - (TextX_Pos%TabSize); + for(k = 0; k < WhiteSpaceNumb; ++k) + { + LCD_SET_WINDOW(xl,xr,yu,yd); + if(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size)) + { + for(i = 0; i < V_Size; ++i) + { + for(j = 0; j < H_Size; ++j) + { + LCD_WRITE_PIXEL(TextBackgndColour); + } + } + ++TextX_Pos; + } + else + { + break; + } + } + break; + case '\f': // go to top of page (Form Feed) + // clear entire window + H_Size = XR_Win - XL_Win; + V_Size = YD_Win - YU_Win; + // set character window X left, Y right + LCD_SET_WINDOW(XL_Win,XR_Win,YU_Win,YD_Win); + // Fill window with background font color + for(i = 0; i <= V_Size; ++i) + { + for(j = 0; j <= H_Size; ++j) + { + LCD_WRITE_PIXEL(TextBackgndColour); + } + } + + TextX_Pos = TextY_Pos = 0; + break; + case '\a': // signal an alert (BELl) + TEXT_BEL1_FUNC(); + break; + default: + // Calculate the current character base address from stream + // and the character position + if((c < pCurrFont->CharacterOffset) && (c >= pCurrFont->CharactersNuber)) + { + c = 0; + } + else + { + c -= pCurrFont->CharacterOffset; + } + pSrc = pCurrFont->pFontStream + (H_Line * pCurrFont->V_Size * c); + // Calculate character window and fit it in the text window + if(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size)) + { + // set character window X left, Y right + LCD_SET_WINDOW(xl,xr,yu,yd); + // Send char data + for(i = 0; i < V_Size; ++i) + { + SrcInc = H_Line; + for(j = 0; j < H_Size; ++j) + { + Temp = (*pSrc & (1UL << (j&0x7)))?TextColour:TextBackgndColour; + LCD_WRITE_PIXEL(Temp); + if((j&0x7) == 7) + { + ++pSrc; + --SrcInc; + } + } + // next line of character + pSrc += SrcInc; + } + } + ++TextX_Pos; + } + LCD_FLUSH_PIXELS(); + return(c); +} + +/************************************************************************* + * Function Name: GLCD_print + * Parameters: int c + * + * Return: none + * + * Description: Put char function + * + *************************************************************************/ +void GLCD_print (const char *fmt) +{ + while(0 != *fmt) + { + if(-1 == GLCD_putchar(*fmt++)) + { + break; + } + } +}