|
|
/*------------------------------------------------------------------------------
|
|
|
-- 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 <D51E5TA7601.h>
|
|
|
#include <stdio.h>
|
|
|
#include <stddef.h>
|
|
|
#include <core.h>
|
|
|
#include <math.h>
|
|
|
#include <malloc.h>
|
|
|
|
|
|
#ifdef __OPTIMIZED_MATH
|
|
|
#include <optimised_math.h>
|
|
|
#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);
|
|
|
}
|
|
|
|