# HG changeset patch # User jeandet@pc-de-jeandet3.LAB-LPP.LOCAL # Date 2012-11-26 13:37:46 # Node ID b6a4710d362ae679ca69b23c3bae0798ff20524b # Parent f47a2524d7d3e439aabf5b1708984ac90b8fba2c added text painter on ili9328 diff --git a/bsp/cfg/BEAGLESYNTH/bsp.pri b/bsp/cfg/BEAGLESYNTH/bsp.pri --- a/bsp/cfg/BEAGLESYNTH/bsp.pri +++ b/bsp/cfg/BEAGLESYNTH/bsp.pri @@ -1,3 +1,7 @@ CPU=stm32f4xxxG DEFINES+=BSP=\\\"BEAGLESYNTH\\\" include($$(libuc2)/rules/stm32f4-arm-none-eabi-gcc/rules.pri) + +beagleCp.target = beagleCp +beagleCp.commands = scp $$DESTDIR/$(QMAKE_TARGET).bin root@192.168.7.2://opt/stm32flashAje/hello.bin +QMAKE_EXTRA_TARGETS += beagleCp diff --git a/bsp/src/BEAGLESYNTH/bsp.c b/bsp/src/BEAGLESYNTH/bsp.c --- a/bsp/src/BEAGLESYNTH/bsp.c +++ b/bsp/src/BEAGLESYNTH/bsp.c @@ -150,10 +150,10 @@ int bsp_FSMC_init() /*----------------------- SRAM Bank 3 ----------------------------------------*/ /* FSMC_Bank1_NORSRAM4 configuration */ //p.FSMC_AddressSetupTime = 5; - p.FSMC_AddressSetupTime = 2; + p.FSMC_AddressSetupTime = 1; p.FSMC_AddressHoldTime = 0; //p.FSMC_DataSetupTime = 9; - p.FSMC_DataSetupTime = 4; + p.FSMC_DataSetupTime = 11; p.FSMC_BusTurnAroundDuration = 0; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; @@ -239,7 +239,6 @@ void bspsdcardselect(char YESNO) void bsp_lcd0_write_reg(uint32_t reg,uint32_t data) { - printf("Write %X @ %d\n\r",data,reg); *lcd0_CMD=(uint16_t)reg; *lcd0_DATA=(uint16_t)data; } @@ -252,14 +251,12 @@ uint32_t bsp_lcd0_read_reg(uint32_t reg) void bsp_lcd0_writeGRAM(void* buffer,uint32_t count) { - printf("Write to GRAM %d pixels from 0x%X\t\n\r",count,(int)buffer); *lcd0_CMD=(uint16_t)ILI9328_REGISTER_WRITEDATATOGRAM; uint16_t* castedBuff=(uint16_t*)buffer; for(int i=0;i<(int)count;i++) { *lcd0_DATA=castedBuff[i]; } - printf("[Done]\n\r"); } void bsp_lcd0_readGRAM(void* buffer,uint32_t count) diff --git a/examples/BeagleSynthHello/main.c b/examples/BeagleSynthHello/main.c --- a/examples/BeagleSynthHello/main.c +++ b/examples/BeagleSynthHello/main.c @@ -12,6 +12,18 @@ extern streamdevice* __opnfiles__[]; +#define LCD_COLOR_WHITE 0xFFFF +#define LCD_COLOR_BLACK 0x0000 +#define LCD_COLOR_GREY 0xF7DE +#define LCD_COLOR_BLUE 0x001F +#define LCD_COLOR_BLUE2 0x051F +#define LCD_COLOR_RED 0xF800 +#define LCD_COLOR_MAGENTA 0xF81F +#define LCD_COLOR_GREEN 0x07E0 +#define LCD_COLOR_CYAN 0x7FFF +#define LCD_COLOR_YELLOW 0xFFE0 + + int main() { INA226_t ina5VSens,ina33VSens,ina15VSens; @@ -22,34 +34,20 @@ int main() //ina226open(&ina15VSens,i2c2,INA226_MODE_SHUNT_VOLTAGE_CONTINUOUS|INA226_AVERAGES_16|INA226_BUS_CONV_8244us|INA226_SHUNT_CONV_8244us,1,0,15,1000000); *regtest=(int16_t)0; printf("LCD ID=%x\n\r",0xFFFF&(*regtest2)); - //lcd0.refreshenable(&lcd0,1); + uint16_t x=90,y=0; + ili9328paintFilRect(&lcd0,0,0,240,320,0x01F,0x01F); + // ili9328paintText(&lcd0,"Hello",14,38,&Font16x24,0); + ili9328paintText(&lcd0,"Hello",10,34,&Font16x24,0xF800); while(1) { - //ili9328setFrame(&lcd0,0,0,240,320); - //ili9328setGRAMaddress(&lcd0,0,0); - *regtest=(int16_t)0x20; - *regtest2=(int16_t)0x0; - *regtest=(int16_t)0x21; - *regtest2=(int16_t)0x0; - *regtest=(int16_t)0x22; - for(int i=0;i<(320*240);i++) - { - *regtest2=(int16_t)0x001F; - } - for(volatile int i=0;i<(320*240*100);i++); - //uint16_t test[100]; - //ili9328setFrame(&lcd0,10,10,10,10); - //*regtest=(int16_t)0x22; - //for(int i=0;i<(10*10);i++) - //{ - // *regtest2=(int16_t)(0xF800); - //test[i]=(int16_t)0xF800; - //for(volatile int l=0;l<(1024);l++); - - //} - //bsp_lcd0_writeGRAM(test,10*10); - //lcd0.paint(&lcd0,test,100,100,80,80); - //for(volatile int i=0;i<(320*240*100);i++); + ili9328paintText(&lcd0," World !",90,y+24,&Font16x24,0xF800); + ili9328paintFilRect(&lcd0,x,y,20,20,0x01F,0xF800); + for(volatile int i=0;i<(320*500);i++); + ili9328paintFilRect(&lcd0,90,y,150,24,0x01F,0x01F); + ili9328paintFilRect(&lcd0,x,y,20,20,0x01F,0x01F); + y+=10; + if(y>290){y=0;x+=20;} + if(x>220){x=90;} } if(-1==ina226open(&ina33VSens,i2c2,INA226_MODE_SHUNT_VOLTAGE_CONTINUOUS|INA226_AVERAGES_16|INA226_BUS_CONV_8244us|INA226_SHUNT_CONV_8244us,0,1,15,1000000)) diff --git a/lib/includes/GRAPHIC/CONTROLERS/ili9328.h b/lib/includes/GRAPHIC/CONTROLERS/ili9328.h --- a/lib/includes/GRAPHIC/CONTROLERS/ili9328.h +++ b/lib/includes/GRAPHIC/CONTROLERS/ili9328.h @@ -25,11 +25,14 @@ #include #include #include +#include extern int ili9328init(struct LCD_t* LCD); extern void ili9328setFrame(LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H); extern void ili9328setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress); extern void ili9328paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height); +extern void ili9328paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color); +extern void ili9328paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint32_t fillColor); extern void ili9328refreshenable(struct LCD_t* LCD,int enable); #define ILI9328_REGISTER_DRIVERCODEREAD ((uint32_t) 0x0000 ) diff --git a/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c b/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c --- a/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c +++ b/lib/src/common/GRAPHIC/CONTROLERS/ILI9328/ili9328.c @@ -46,24 +46,70 @@ void ili9328refreshenable(struct LCD_t* void ili9328setFrame(LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H) { - printf("setFrame X=%d Y=%d W=%d H=%d\n\r",(int)X,(int)Y,(int)W,(int)H); - LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,X); - LCD->interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,Y); - LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION,X); - LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION,X); - LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION,W+X); - LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION,Y); - LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION,Y+H); + LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,(uint32_t)X); + LCD->interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,(uint32_t)Y); + LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION,(uint32_t)X); + LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION,(uint32_t)(W+X-1)); + LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION,(uint32_t)Y); + LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION,(uint32_t)(Y+H-1)); } void ili9328paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height) { - if((LCD!=NULL) && (LCD->interface!=NULL) && (LCD->interface->writeGRAM!=NULL) && (LCD->width<(Xpos+Width)) && (LCD->height<(Ypos+Height))) + if((LCD!=NULL) && (LCD->interface!=NULL) && (LCD->interface->writeGRAM!=NULL) && (LCD->width>(Xpos+Width)) && (LCD->height>(Ypos+Height))) + { + ili9328setFrame(LCD,Xpos,Ypos,Width,Height); + LCD->interface->writeGRAM(buffer,Width*Height); + } +} + +void ili9328paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint32_t fillColor) +{ + ili9328setFrame(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->writeGRAM(tmp,32); + } + int rem=(w*h)%32; + if(rem)LCD->interface->writeGRAM(tmp,rem); +} + +void ili9328paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color) +{ + int w=font->Width,h=font->Height,pix=0,tableoffset=0; + uint16_t tmp[w]; + uint16_t line=0,linenum=0,charnum=0; + while(*buffer) { - printf("paint\n\r"); - ili9328setFrame(LCD,Xpos,Ypos,Width,Height); - //ili9328setGRAMaddress(LCD,Xpos,Ypos); - LCD->interface->writeGRAM(buffer,Width*Height); + ili9328setFrame(LCD,Xpos+(charnum*w),Ypos-h,w,1); + LCD->interface->readGRAM(tmp,w); + for(int i=0;i<(h*w);i++) + { + if( ((i%w)==0) ) //read current line to apply text pixmap + { + if(linenum++>0) + { + ili9328setFrame(LCD,Xpos+(charnum*w),Ypos + linenum -h,w,1); + LCD->interface->writeGRAM(tmp,w); + ili9328setFrame(LCD,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1); + LCD->interface->readGRAM(tmp,w); + pix=0; + } + } + if((i%16) == 0) + { + line=font->table[(((*buffer)-32)*h)+tableoffset++]; + } + if((line & 0x0001)==1)tmp[pix]=(uint16_t)color; + pix++; + line>>=1; + } + linenum=0; + tableoffset=0; + charnum++; + buffer++; } } @@ -74,7 +120,7 @@ int ili9328init(struct LCD_t* LCD) LCD->interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL1, 0x0100); // Driver Output Control Register (R01h) LCD->interface->writereg(ILI9328_REGISTER_LCDDRIVINGCONTROL, 0x0700); // LCD Driving Waveform Control (R02h) LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x1030); // Entry Mode (R03h) - LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL2, 0x0302); + LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL2, 0x0202); LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL3, 0x0000); LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL4, 0x0000); // Fmark On LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL1, 0x0000); // Power Control 1 (R10h) @@ -110,9 +156,7 @@ int ili9328init(struct LCD_t* LCD) // Display On LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL1, 0x0133); // Display Control (R07h) _delay_(500000); - LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x1018); - LCD->interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL1, 0x0100); - //ili9328WriteCmd(ILI9328_REGISTER_WRITEDATATOGRAM); + LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x0038); } return 0; } diff --git a/lib/src/stm32f4/CPU/stm32f4xxxG/cpuinit.c b/lib/src/stm32f4/CPU/stm32f4xxxG/cpuinit.c --- a/lib/src/stm32f4/CPU/stm32f4xxxG/cpuinit.c +++ b/lib/src/stm32f4/CPU/stm32f4xxxG/cpuinit.c @@ -12,7 +12,7 @@ extern int main(); void cpu_init() { extern uint32_t currentCpuFreq; - currentCpuFreq = 140000000; + currentCpuFreq = 160000000; enable_FPU(); RCC->CR |= (uint32_t)0x00000001; FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;