##// END OF EJS Templates
Added OpenOCD target for olimex-arm-usb-tiny....
Added OpenOCD target for olimex-arm-usb-tiny. Working D51E5TA7601 driver. Added Framebuffer interface. Added generic memory to memory DMA api, mmainly used by framebuffer API. ADS7843 work in progress. Added SOSmartPSU bsp.

File last commit:

r103:3311a844031e dev_alexis
r103:3311a844031e dev_alexis
Show More
D51E5TA7601.c
357 lines | 14.5 KiB | text/x-c | CLexer
/*------------------------------------------------------------------------------
-- 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);
}