diff --git a/bsp/includes/BEAGLESYNTH/bsp.h b/bsp/includes/BEAGLESYNTH/bsp.h --- a/bsp/includes/BEAGLESYNTH/bsp.h +++ b/bsp/includes/BEAGLESYNTH/bsp.h @@ -64,7 +64,7 @@ extern void bsp_uart_init(); extern void bsp_iic_init(); extern void bsp_spi_init(); extern void bsp_SD_init(); -extern void bsp_FSMC_init(); +extern int bsp_FSMC_init(); /* VS1053 */ extern void clearXCS(); @@ -77,6 +77,12 @@ char bspsdcardpresent(); void bspsdcardselect(char YESNO); char bspsdcardwriteprotected(); + +void bsp_lcd0_write_reg(uint32_t reg,uint32_t data); +uint32_t bsp_lcd0_read_reg(uint32_t reg); +void bsp_lcd0_writeGRAM(void *buffer, uint32_t count); +void bsp_lcd0_readGRAM(void *buffer, uint32_t count); + #endif 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 @@ -33,8 +33,23 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; -LCD_t lcd0; -LCD_IF_t lcdIF0; + +LCD_IF_t lcdIF0={ + .init = &bsp_FSMC_init, + .writereg = &bsp_lcd0_write_reg, + .readreg = &bsp_lcd0_read_reg, + .writeGRAM = &bsp_lcd0_writeGRAM, + .readGRAM = &bsp_lcd0_readGRAM +}; + +LCD_t lcd0={ + .interface = &lcdIF0, + .init = &ili9328init, + .paint = &ili9328paint, + .refreshenable = &ili9328refreshenable, + .width= 240, + .height = 320 +}; volatile int16_t* lcd0_CMD=(volatile int16_t*) 0x60000000; volatile int16_t* lcd0_DATA=(volatile int16_t*)(0x61FFFFF0); @@ -103,12 +118,9 @@ void bsp_uart_init() } } -void bsp_lcd0_write_reg(uint32_t reg,uint32_t data); -uint32_t bsp_lcd0_read_reg(uint32_t reg); -void bsp_lcd0_writeGRAM(void *buffer, uint32_t count); -void bsp_lcd0_readGRAM(void *buffer, uint32_t count); + -void bsp_FSMC_init() +int bsp_FSMC_init() { #define GPIOGETPORT(gpio) ((GPIO_TypeDef*)(((((uint32_t)gpio) & (uint32_t)0x0000FF00)*(uint32_t)4) + (uint32_t)GPIOA)) #define GPIOPORTNUM(gpio) (((uint32_t)(gpio) & (uint32_t)0x0000FF00)>>(uint32_t)8) @@ -138,10 +150,10 @@ void bsp_FSMC_init() /*----------------------- SRAM Bank 3 ----------------------------------------*/ /* FSMC_Bank1_NORSRAM4 configuration */ //p.FSMC_AddressSetupTime = 5; - p.FSMC_AddressSetupTime = 1; + p.FSMC_AddressSetupTime = 2; p.FSMC_AddressHoldTime = 0; //p.FSMC_DataSetupTime = 9; - p.FSMC_DataSetupTime = 3; + p.FSMC_DataSetupTime = 4; p.FSMC_BusTurnAroundDuration = 0; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; @@ -175,15 +187,9 @@ void bsp_FSMC_init() /* Enable FSMC NOR/SRAM Bank1 */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); - lcdIF0.writereg=&bsp_lcd0_write_reg; - lcdIF0.readGRAM=&bsp_lcd0_readGRAM; - lcdIF0.readreg=&bsp_lcd0_read_reg; - lcdIF0.writeGRAM=&bsp_lcd0_writeGRAM; - lcd0.interface=&lcdIF0; - lcd0.init=&ili9328init; - lcd0.paint=&ili9328paint; gpioset(LCD_RESET); lcd0.init(&lcd0); + return 1; } void bsp_spi_init() @@ -233,6 +239,7 @@ 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; } @@ -245,12 +252,14 @@ 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(uint32_t i=0;i extern int ili9328init(struct LCD_t* LCD); -extern void ili9328setFrame(LCD_t* LCD,uint16_t HaddressStart,uint16_t VaddressStart,uint16_t HaddressStop,uint16_t VaddressStop); +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 ili9328refreshenable(struct LCD_t* LCD,int enable); #define ILI9328_REGISTER_DRIVERCODEREAD ((uint32_t) 0x0000 ) #define ILI9328_REGISTER_DRIVEROUTPUTCONTROL1 ((uint32_t) 0x0001 ) 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 @@ -31,12 +31,29 @@ void ili9328setGRAMaddress(LCD_t* LCD,ui LCD->interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,Vaddress); } -void ili9328setFrame(LCD_t* LCD,uint16_t HaddressStart,uint16_t VaddressStart,uint16_t HaddressStop,uint16_t VaddressStop) +void ili9328refreshenable(struct LCD_t* LCD,int enable) { - LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION,HaddressStart); - LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION,VaddressStart); - LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION,HaddressStop); - LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION,VaddressStop); + if(enable) + { + //LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE,0x1018); + } + else + { + //LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE,0x1008); + + } +} + +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); } void ili9328paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height) @@ -44,8 +61,8 @@ void ili9328paint(LCD_t* LCD,void* buffe if((LCD!=NULL) && (LCD->interface!=NULL) && (LCD->interface->writeGRAM!=NULL) && (LCD->width<(Xpos+Width)) && (LCD->height<(Ypos+Height))) { printf("paint\n\r"); - ili9328setFrame(LCD,Xpos,Ypos,Xpos+Width,Ypos+Height); - ili9328setGRAMaddress(LCD,Xpos,Ypos); + ili9328setFrame(LCD,Xpos,Ypos,Width,Height); + //ili9328setGRAMaddress(LCD,Xpos,Ypos); LCD->interface->writeGRAM(buffer,Width*Height); } } @@ -93,7 +110,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, 0x1030); + LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x1018); LCD->interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL1, 0x0100); //ili9328WriteCmd(ILI9328_REGISTER_WRITEDATATOGRAM); }