fix(NV14): set lcd pixel clock depending on the detected LCD (#2097)

Code kindly provided by FlySky has been used as the reference.
This commit is contained in:
Malte Langermann
2022-07-04 09:41:06 +02:00
committed by GitHub
parent 1bc35f54de
commit 097964147b
+11 -4
View File
@@ -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";*/