D51E5TA7601.c
357 lines
| 14.5 KiB
| text/x-c
|
CLexer
r79 | /*------------------------------------------------------------------------------ | |||
-- 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 | ||||
r103 | 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(); | ||||
} | ||||
} | ||||
} | ||||
r79 | ||||
r103 | 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); | ||||
} | ||||
r79 | ||||
r103 | 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)); | ||||
r79 | ||||
r103 | } | |||
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++]; | ||||
} | ||||
} | ||||
} | ||||
r79 | ||||
r103 | 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) | ||||
{ | ||||
} | ||||
r79 | ||||
r103 | 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++; | ||||
} | ||||
} | ||||
r79 | ||||
r103 | ||||
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); | ||||
} | ||||