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:
@@ -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";*/
|
||||
|
||||
Reference in New Issue
Block a user