/*------------------------------------------------------------------------------ -- This file is a part of the libuc, microcontroler library -- Copyright (C) 2012, Alexis Jeandet -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ------------------------------------------------------------------------------- -- Author : Alexis Jeandet -- Mail : alexis.jeandet@member.fsf.org -------------------------------------------------------------------------------*/ #define _PRVATE_D51E5TA7601_ #include #include #include #include #include #include #ifdef __OPTIMIZED_MATH #include #endif extern void bsp_lcd0_setGRAM(); int D51E5TA7601init(LCD_t *LCD) { if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writereg!=NULL)) { //first check which LCD controller is connected if(0x7601==LCD->interface.lcd_interface->readreg(0)) { LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_DRIVEROUTPUTCONTROL1, 0x003C); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_LCDDRIVINGCONTROL, 0x0100); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_ENTRYMODE, 0x1030); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_BLANKPERDIODCTRL, 0x0808); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_FRAMECYCLECONTROL, 0x0500); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_EXTERNALDISPLAYCTRL, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_LCDINTERFACECONTROL, 0x0770); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GATESCANPOSITIONCTRL, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_FRAMESIGNALCONTROL, 0x0001); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL2, 0x0406); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL3, 0x000E); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL4, 0x0222); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL5, 0x0015); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL6, 0x4277); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL7, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL9, 0x6A50); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL10, 0x00C9); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL11, 0xC7BE); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL12, 0x0003); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL15, 0x3443); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL20, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL21, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL5, 0x6A50); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL6, 0x00C9); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL7, 0xC7BE); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL8, 0x0003); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL14, 0x3443); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL18, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL19, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL1, 0x6A50); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL2, 0x00C9); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL3, 0xC7BE); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL4, 0x0003); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL13, 0x3443); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL16, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL17, 0x0000); delay_100us(500); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL3, 0x200E); delay_100us(500); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL3, 0x2003); delay_100us(500); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSENDPOSITION, 0x013F); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSSTARTPOSITION, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSENDPOSITION, 0x01DF); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSSTARTPOSITION, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET, 0x0000); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET, 0x013F); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_DISPLAYCONTROL4, 0x0012); delay_100us(500); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_DISPLAYCONTROL4, 0x0017); delay_100us(500); bsp_lcd0_setGRAM(); delay_100us(5000); bsp_lcd0_setGRAM(); } } } void D51E5TA7601setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress) { LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET,Vaddress); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET,Haddress); } void D51E5TA7601setFrame(LCD_t *LCD, uint16_t X, uint16_t Y, uint16_t W, uint16_t H) { // printf("X=%d Y=%d W=%d H=%d\n\r",X,Y,W,H); if((X>(LCD->width-1)) || (Y>(LCD->height-1)) || ((X+W)>LCD->width) || ((Y+H)>LCD->height)) { printf("Error painting out of screen! %dx%d @%d;%d\n",W,H,X,Y); return; } LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSENDPOSITION,(uint32_t)(X+W-1)); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSSTARTPOSITION,(uint32_t)X); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSENDPOSITION,(uint32_t)(Y+H-1)); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSSTARTPOSITION,(uint32_t)Y); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET,(uint32_t)(Y)); LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET,(uint32_t)(X)); } void D51E5TA7601paint(LCD_t *LCD, void *buffer, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) { if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writeGRAM!=NULL) && (LCD->width>=(Xpos+Width)) && (LCD->height>=(Ypos+Height))) { D51E5TA7601setFrame(LCD,Xpos,Ypos,Width,Height); LCD->interface.lcd_interface->writeGRAM(buffer,Width*Height); } } void D51E5TA7601paintFilRect(LCD_t *LCD, uint16_t Xpos, uint16_t Ypos, uint16_t w, uint16_t h, uint32_t contColor, uint16_t contSz, uint32_t fillColor) { D51E5TA7601setFrame(LCD,Xpos,Ypos,w,h); uint16_t tmp[32]; for(int i=0;i<32;i++)tmp[i]=fillColor; for(int i=0;i<(h*w);i+=32) { LCD->interface.lcd_interface->writeGRAM(tmp,32); } int rem=(w*h)%32; if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem); if(contSz) { D51E5TA7601setFrame(LCD,Xpos,Ypos,w,contSz); for(int i=0;i<32;i++)tmp[i]=contColor; rem=(w*contSz)%32; if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem); for(int i=rem;i<(w*contSz);i+=32) { LCD->interface.lcd_interface->writeGRAM(tmp,32); } D51E5TA7601setFrame(LCD,Xpos,Ypos+h-contSz,w,contSz); rem=(w*contSz)%32; if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem); for(int i=rem;i<(w*contSz);i+=32) { LCD->interface.lcd_interface->writeGRAM(tmp,32); } D51E5TA7601setFrame(LCD,Xpos,Ypos,contSz,h); rem=(h*contSz)%32; if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem); for(int i=rem;i<(h*contSz);i+=32) { LCD->interface.lcd_interface->writeGRAM(tmp,32); } D51E5TA7601setFrame(LCD,Xpos+w-contSz,Ypos,contSz,h); rem=(h*contSz)%32; if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem); for(int i=rem;i<(h*contSz);i+=32) { LCD->interface.lcd_interface->writeGRAM(tmp,32); } } } void D51E5TA7601getPix(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h) { #define __set__Address__(_x_,_y_) LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET,(uint32_t)(_x_)); \ LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET,(uint32_t)(_y_)) int cx=Xpos,cy=Ypos; D51E5TA7601setFrame(LCD,Xpos,Ypos,w,h); int status; do { status = LCD->interface.lcd_interface->status()>>8; // }while (status>=Ypos && status<=(Ypos+h)); }while (status!=0); LCD->interface.lcd_interface->readGRAM((void*)(buffer),w*h); } void D51E5TA7601paint_FrameBuff(LCD_t *frameBuff, void *buffer, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) { volatile uint16_t* OUTbuffer = (volatile uint16_t*)(frameBuff->interface.buffer); volatile uint16_t* INbuffer = (volatile uint16_t*)buffer; int index =0; for(int Col=Xpos;Col<(Xpos+Width);Col++) { for(int Line=Ypos;Line<(Ypos+Height);Line++) { int i=Line+(Col*frameBuff->height); OUTbuffer[i] = INbuffer[index++]; } } } void D51E5TA7601getPix_FrameBuff(LCD_t *frameBuff, uint16_t *buffer, uint16_t Xpos, uint16_t Ypos, uint16_t w, uint16_t h) { volatile uint16_t* OUTbuffer = (volatile uint16_t*)(frameBuff->interface.buffer); volatile uint16_t* INbuffer = (volatile uint16_t*)buffer; int index =0; for(int Col=Xpos;Col<(Xpos+w);Col++) { for(int Line=Ypos;Line<(Ypos+h);Line++) { int i=Line+(Col*frameBuff->height); INbuffer[index++] = OUTbuffer[i]; } } } int D51E5TA7601init_FrameBuff(LCD_t *LCD) { memset((void*)LCD->interface.buffer,-1,LCD->height*LCD->width*2); return 0; } void D51E5TA7601setFrame_FrameBuff(LCD_t *LCD, uint16_t X, uint16_t Y, uint16_t W, uint16_t H) { return; } void D51E5TA7601refreshenable_FrameBuff(LCD_t *LCD, int enable) { } void D51E5TA7601paintText(LCD_t *LCD, char *buffer, uint16_t Xpos, uint16_t Ypos, sFONT *font, uint32_t color) { } void D51E5TA7601refreshenable(LCD_t *LCD, int enable) { } void D51E5TA7601paintText_FrameBuff(LCD_t *frameBuff, char *buffer, uint16_t Xpos, uint16_t Ypos, sFONT *font, uint32_t color) { int w=font->Width,h=font->Height,bpl=font->bytesPerLine,pix=0,tableoffset=0; uint16_t tmp[w]; uint16_t linenum=0,charnum=0; uint8_t line=0; while(*buffer!='\0') { if(*buffer<32)*buffer=32; if(*buffer>127)*buffer=32; // LCD->setFrame(LCD,Xpos+(charnum*w),Ypos-h,w,1); // LCD->interface->readGRAM(tmp,w); frameBuff->getPix(frameBuff,tmp,Xpos+(charnum*w),Ypos-h,w,1); for(int i=0;i<(h*w);i++) { if( ((i%w)==0) ) //read current line to apply text pixmap { if(linenum++>0) { // LCD->setFrame(LCD,Xpos+(charnum*w),Ypos + linenum -h,w,1); // LCD->interface->writeGRAM(tmp,w); frameBuff->paint(frameBuff,tmp,Xpos+(charnum*w),Ypos + linenum -h,w,1); //ili9328setFrame(LCD,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1); // LCD->interface->readGRAM(tmp,w); frameBuff->getPix(frameBuff,tmp,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1); pix=0; } } if((pix%8) == 0) { line=font->table[(((*buffer)-32)*h*bpl)+tableoffset++]; } //tmp[pix]=0; if((line & (uint8_t)0x01)==(uint8_t)1)tmp[pix]=(uint16_t)color; pix++; line>>=1; } linenum=0; tableoffset=0; charnum++; buffer++; } } void D51E5TA7601paintFilRect_FrameBuff(LCD_t *frameBuff, uint16_t Xpos, uint16_t Ypos, uint16_t w, uint16_t h, uint32_t contColor, uint16_t contSz, uint32_t fillColor) { volatile uint16_t* buffer= frameBuff->interface.buffer; #define drawR(_X_,_Y_,_W_,_H_,_color_) \ for(int line=0;line<(_H_);line++)\ {\ for(int col=0;col<(_W_);col++)\ {\ buffer[(((_X_)+col)*frameBuff->height)+line+(_Y_)]=(_color_);\ }\ } if(((2*contSz)<=w) && ((2*contSz)<=h)) { drawR(Xpos+contSz,Ypos+contSz,w-(2*contSz),h-(2*contSz),fillColor); if(contSz) { drawR(Xpos,Ypos,w,contSz,contColor); drawR(Xpos,Ypos,contSz,h,contColor); drawR(Xpos,Ypos+h-contSz,w,contSz,contColor); drawR(Xpos+w-contSz,Ypos,contSz,h,contColor); } } } void D51E5TA7601paintFB(LCD_t *LCD, LCD_t *frameBuffer) { LCD->paint(LCD,(void*)frameBuffer->interface.buffer,0,0,frameBuffer->height,frameBuffer->width); }