diff --git a/radio/src/targets/nv14/lcd_driver.cpp b/radio/src/targets/nv14/lcd_driver.cpp index 55e56e1f1..795c7880b 100644 --- a/radio/src/targets/nv14/lcd_driver.cpp +++ b/radio/src/targets/nv14/lcd_driver.cpp @@ -43,6 +43,7 @@ static void startLcdRefresh(lv_disp_drv_t *disp_drv, uint16_t *buffer, lcdSpiInitFucPtr lcdInitFunction; lcdSpiInitFucPtr lcdOffFunction; lcdSpiInitFucPtr lcdOnFunction; +uint32_t lcdPixelClock; volatile uint8_t LCD_ReadBuffer[24] = { 0, 0 }; @@ -1138,10 +1139,11 @@ void LCD_Init_LTDC() { /* Configure PLLSAI prescalers for LCD */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */ - /* PLLLCDCLK = PLLSAI_VCO Output/PLL_LTDC = 192/3 = 64 Mhz */ - /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 64/4 = 16 Mhz */ - RCC_PLLSAIConfig(192 * 2 / 3, 6, 3); + /* PLLSAI_VCO Output = PLLSAI_VCO Input * lcdPixelclock * 16 = XX Mhz */ + /* PLLLCDCLK = PLLSAI_VCO Output/PLL_LTDC = PLLSAI_VCO/4 = YY Mhz */ + /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = YY/4 = lcdPixelClock Mhz */ + uint32_t clock = (lcdPixelClock*16) / 1000000; // clock*16 in MHz + RCC_PLLSAIConfig(clock, 6, 4); RCC_LTDCCLKDivConfig (RCC_PLLSAIDivR_Div4); /* Enable PLLSAI Clock */ @@ -1292,30 +1294,35 @@ void lcdInit(void) lcdInitFunction = LCD_ILI9481_Init; lcdOffFunction = LCD_ILI9481_Off; lcdOnFunction = LCD_ILI9481_On; + lcdPixelClock = 12000000; } else if (LCD_ILI9486_ReadID() == LCD_ILI9486_ID) { TRACE("LCD INIT: ILI9486"); boardLcdType = "ILI9486"; lcdInitFunction = LCD_ILI9486_Init; lcdOffFunction = LCD_ILI9486_Off; lcdOnFunction = LCD_ILI9486_On; + lcdPixelClock = 12000000; } else if (LCD_ILI9488_ReadID() == LCD_ILI9488_ID) { TRACE("LCD INIT: ILI9488"); boardLcdType = "ILI9488"; lcdInitFunction = LCD_ILI9488_Init; lcdOffFunction = LCD_ILI9488_Off; lcdOnFunction = LCD_ILI9488_On; + lcdPixelClock = 12000000; } else if (LCD_HX8357D_ReadID() == LCD_HX8357D_ID) { TRACE("LCD INIT: HX8357D"); boardLcdType = "HX8357D"; lcdInitFunction = LCD_HX8357D_Init; lcdOffFunction = LCD_HX8357D_Off; lcdOnFunction = LCD_HX8357D_On; + lcdPixelClock = 12000000; } else { /* if (LCD_ST7796S_ReadID() == LCD_ST7796S_ID) { */ // ST7796S detection is unreliable TRACE("LCD INIT (default): ST7796S"); boardLcdType = "ST7796S"; lcdInitFunction = LCD_ST7796S_Init; lcdOffFunction = LCD_ST7796S_Off; lcdOnFunction = LCD_ST7796S_On; + lcdPixelClock = 14500000; /* } else { TRACE("LCD INIT: unknown LCD controller"); boardLcdType = "unknown";*/