diff --git a/radio/src/gui/horus/lcd.h b/radio/src/gui/horus/lcd.h index eec785458..cd3055085 100644 --- a/radio/src/gui/horus/lcd.h +++ b/radio/src/gui/horus/lcd.h @@ -170,7 +170,7 @@ extern uint16_t lcdColorTable[LCD_COLOR_COUNT]; #if defined(SIMU) extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; #else -extern uint32_t CurrentFrameBuffer; +extern uint8_t * CurrentFrameBuffer; #define displayBuf ((uint16_t *)CurrentFrameBuffer) #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 38b4faf69..32ac42164 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -28,8 +28,11 @@ ModelData g_model; Clipboard clipboard; #endif -#if (defined(PCBTARANIS) || defined(PCBHORUS)) && defined(SDCARD) +#if defined(PCBTARANIS) uint8_t modelBitmap[MODEL_BITMAP_SIZE] __DMA; +#endif + +#if defined(PCBTARANIS) || defined(PCBHORUS) bool loadModelBitmap(char * name, uint8_t * bitmap) { uint8_t len = zlen(name, LEN_BITMAP_NAME); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index ac07c0517..8874b5aab 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -212,6 +212,12 @@ #else #define __DMA __ALIGNED #endif + +#if defined(PCBHORUS) + #define __SDRAM __attribute__((section(".sdram"), aligned(32))) +#else + #define __SDRAM __DMA +#endif #if defined(SIMU) || defined(CPUARM) || GCC_VERSION < 472 typedef int32_t int24_t; diff --git a/radio/src/targets/horus/board_horus.h b/radio/src/targets/horus/board_horus.h index bb374f50e..57ae09e0a 100644 --- a/radio/src/targets/horus/board_horus.h +++ b/radio/src/targets/horus/board_horus.h @@ -153,10 +153,7 @@ uint32_t isFirmwareStart(const void * buffer); uint32_t isBootloaderStart(const void * buffer); // SDRAM driver -#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) void SDRAM_Init(void); -void SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize); -void SDRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize); // Pulses driver #define INTERNAL_MODULE_ON() GPIO_SetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 3d35089b5..8ab931a3a 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -37,16 +37,18 @@ #define LCD_BKLIGHT_PWM_FREQ 300 -#define LCD_FIRST_FRAME_BUFFER SDRAM_BANK_ADDR -#define LCD_SECOND_FRAME_BUFFER (SDRAM_BANK_ADDR + DISPLAY_BUFFER_SIZE) -#define LCD_BACKUP_FRAME_BUFFER (SDRAM_BANK_ADDR + 2*DISPLAY_BUFFER_SIZE) +uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE] __SDRAM; +uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE] __SDRAM; +uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE] __SDRAM; -uint32_t CurrentFrameBuffer = LCD_FIRST_FRAME_BUFFER; +uint8_t * CurrentFrameBuffer = LCD_FIRST_FRAME_BUFFER; uint32_t CurrentLayer = LCD_FIRST_LAYER; #define NRST_LOW() do { LCD_GPIO_NRST->BSRRH = LCD_GPIO_PIN_NRST; } while(0) #define NRST_HIGH() do { LCD_GPIO_NRST->BSRRL = LCD_GPIO_PIN_NRST; } while(0) +uint8_t modelBitmap[MODEL_BITMAP_SIZE] __SDRAM; + static void LCD_AF_GPIOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; @@ -144,6 +146,7 @@ static void LCD_NRSTConfig(void) GPIO_Init(LCD_GPIO_NRST, &GPIO_InitStructure); } +// TODO delay function static void delay3(uint32_t nCount) { uint32_t index = 0; @@ -291,7 +294,7 @@ void LCD_LayerInit() LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_H; /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */ - LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FIRST_FRAME_BUFFER; + LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)LCD_FIRST_FRAME_BUFFER; /* Initialize LTDC layer 1 */ LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct); @@ -301,7 +304,7 @@ void LCD_LayerInit() LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA; /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */ - LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FIRST_FRAME_BUFFER + DISPLAY_BUFFER_SIZE; + LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)LCD_SECOND_FRAME_BUFFER; /* Initialize LTDC layer 2 */ LTDC_LayerInit(LTDC_Layer2, <DC_Layer_InitStruct); @@ -387,14 +390,12 @@ void LCD_Init(void) */ void LCD_SetLayer(uint32_t Layerx) { - if (Layerx == LCD_FIRST_LAYER) - { + if (Layerx == LCD_FIRST_LAYER) { CurrentFrameBuffer = LCD_FIRST_FRAME_BUFFER; CurrentLayer = LCD_FIRST_LAYER; } - else - { - CurrentFrameBuffer = LCD_FIRST_FRAME_BUFFER + DISPLAY_BUFFER_SIZE; + else { + CurrentFrameBuffer = LCD_SECOND_FRAME_BUFFER; CurrentLayer = LCD_SECOND_LAYER; } } @@ -438,7 +439,7 @@ void lcdInit(void) void lcdDrawSolidFilledRectDMA(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) { - uint32_t addr = CurrentFrameBuffer + 2*(LCD_W*y + x); + uint32_t addr = (uint32_t)CurrentFrameBuffer + 2*(LCD_W*y + x); uint8_t red = (0xF800 & color) >> 11; uint8_t blue = 0x001F & color; uint8_t green = (0x07E0 & color) >> 5; @@ -470,7 +471,7 @@ void lcdDrawBitmapDMA(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint if ((uint32_t(bitmap) & 0x03) != 0) return; - uint32_t addr = CurrentFrameBuffer + 2*(LCD_W*y + x); + uint32_t addr = (uint32_t)CurrentFrameBuffer + 2*(LCD_W*y + x); DMA2D_DeInit(); @@ -538,14 +539,12 @@ void DMAcopy(void * src, void * dest, int len) void lcdStoreBackupBuffer() { - uint16_t * src = (uint16_t *)CurrentFrameBuffer, * dest = (uint16_t *)LCD_BACKUP_FRAME_BUFFER; - DMAcopy(src, dest, DISPLAY_BUFFER_SIZE); + DMAcopy(CurrentFrameBuffer, LCD_BACKUP_FRAME_BUFFER, DISPLAY_BUFFER_SIZE); } int lcdRestoreBackupBuffer() { - uint16_t * dest = (uint16_t *)CurrentFrameBuffer, * src = (uint16_t *)LCD_BACKUP_FRAME_BUFFER; - DMAcopy(src, dest, DISPLAY_BUFFER_SIZE); + DMAcopy(LCD_BACKUP_FRAME_BUFFER, CurrentFrameBuffer, DISPLAY_BUFFER_SIZE); return 1; }