Updates to standard STM32LTDC based boards to ensure the LTDC clock is fully operational before continuing
This commit is contained in:
parent
891b78a62c
commit
aeef03a83e
@ -189,6 +189,7 @@ static void init_board(GDisplay *g) {
|
||||
RCC->PLLSAICFGR = (STM32_PLLSAIN_VALUE << 6) | (STM32_PLLSAIR_VALUE << 28) | (STM32_PLLSAIQ_VALUE << 24);
|
||||
RCC->DCKCFGR = (RCC->DCKCFGR & ~RCC_DCKCFGR_PLLSAIDIVR) | STM32_PLLSAIR_POST;
|
||||
RCC->CR |= RCC_CR_PLLSAION;
|
||||
while(!(RCC->CR & RCC_CR_PLLSAIRDY)); // wait for PLLSAI to lock
|
||||
|
||||
// Initialise the SDRAM
|
||||
SDRAM_Init();
|
||||
|
@ -89,6 +89,7 @@ static void configureLcdClock(void)
|
||||
RCC->PLLSAICFGR = (LCD_PLLSAIN_VALUE << 6) | (LCD_PLLSAIR_VALUE << 28) | (LCD_PLLSAIQ_VALUE << 24);
|
||||
RCC->DCKCFGR = (RCC->DCKCFGR & ~RCC_DCKCFGR_PLLSAIDIVR) | LCD_PLLSAIDIVR_VALUE;
|
||||
RCC->CR |= RCC_CR_PLLSAION;
|
||||
while(!(RCC->CR & RCC_CR_PLLSAIRDY)); // wait for PLLSAI to lock
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -104,8 +104,9 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||
RCC->PLLSAICFGR = (STM32_PLLSAIN_VALUE << 6) | (STM32_PLLSAIR_VALUE << 28) | (STM32_PLLSAIQ_VALUE << 24);
|
||||
RCC->DCKCFGR = (RCC->DCKCFGR & ~RCC_DCKCFGR_PLLSAIDIVR) | STM32_PLLSAIR_POST;
|
||||
RCC->CR |= RCC_CR_PLLSAION;
|
||||
while(!(RCC->CR & RCC_CR_PLLSAIRDY)); // wait for PLLSAI to lock
|
||||
#endif
|
||||
|
||||
|
||||
__HAL_RCC_DSI_CLK_ENABLE();
|
||||
|
||||
DSI_PLLInitTypeDef dsiPllInit;
|
||||
@ -119,7 +120,7 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||
/* TXEscapeCkdiv = f(LaneByteClk)/15.62 = 4 -> 500MHz/4 = 25MHz datasheet says around 20MHz */
|
||||
dsiHandle.Init.TXEscapeCkdiv = laneByteClk_kHz/15620; // Low power clock relative to the laneByteClock
|
||||
dsiHandle.Init.NumberOfLanes = DSI_TWO_DATA_LANES; // Two data lines for the fastest transfer speed
|
||||
|
||||
|
||||
/* Fill in the command mode struct. */
|
||||
dsiCmdMode.VirtualChannelID = 0; // The first virtual channel
|
||||
|
||||
@ -139,7 +140,7 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||
dsiCmdMode.VSyncPol = DSI_VSYNC_FALLING;
|
||||
dsiCmdMode.AutomaticRefresh = DSI_AR_ENABLE; // Use the automatic refresh mode
|
||||
dsiCmdMode.TEAcknowledgeRequest = DSI_TE_ACKNOWLEDGE_DISABLE; // Not needed when using TE through GPIO
|
||||
|
||||
|
||||
/* GPIO configuration. */
|
||||
GPIO_InitTypeDef gpioInit;
|
||||
/* PH7 LCD_RESET */
|
||||
@ -149,14 +150,14 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||
gpioInit.Pull = GPIO_NOPULL;
|
||||
gpioInit.Speed = GPIO_SPEED_HIGH;
|
||||
HAL_GPIO_Init(GPIOH, &gpioInit);
|
||||
|
||||
|
||||
/* PJ2 DSIHOST_TE */
|
||||
__HAL_RCC_GPIOJ_CLK_ENABLE();
|
||||
gpioInit.Pin = GPIO_PIN_2;
|
||||
gpioInit.Mode = GPIO_MODE_AF_PP;
|
||||
gpioInit.Alternate = GPIO_AF13_DSI;
|
||||
HAL_GPIO_Init(GPIOJ, &gpioInit);
|
||||
|
||||
|
||||
/* PA3 LCD_BL_CTRL This pin is not physically connected. */
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
gpioInit.Pin = GPIO_PIN_3;
|
||||
@ -177,7 +178,7 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||
|
||||
/* Initialize the DSI peripheral. */
|
||||
HAL_DSI_Init(&dsiHandle, &dsiPllInit);
|
||||
|
||||
|
||||
DSI_PHY_TimerTypeDef PhyTimings;
|
||||
/* Configure DSI PHY HS2LP and LP2HS timings. Datasheet says 95ns max */
|
||||
PhyTimings.ClockLaneHS2LPTime = 35;
|
||||
@ -189,8 +190,8 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||
HAL_DSI_ConfigPhyTimer(&dsiHandle, &PhyTimings);
|
||||
|
||||
/* Configure adapted command mode. */
|
||||
HAL_DSI_ConfigAdaptedCommandMode(&dsiHandle, &dsiCmdMode);
|
||||
|
||||
HAL_DSI_ConfigAdaptedCommandMode(&dsiHandle, &dsiCmdMode);
|
||||
|
||||
/* Hardware reset LCD */
|
||||
reset_lcd(g);
|
||||
|
||||
@ -230,7 +231,7 @@ static GFXINLINE void post_init_board(GDisplay* g)
|
||||
{
|
||||
(void)g;
|
||||
DSI_LPCmdTypeDef dsiAPBCmd;
|
||||
|
||||
|
||||
/* Enable the DSI host and wrapper after the LTDC initialization
|
||||
To avoid any synchronization issue, the DSI shall be started after enabling the LTDC */
|
||||
HAL_DSI_Start(&dsiHandle);
|
||||
@ -249,7 +250,7 @@ static GFXINLINE void post_init_board(GDisplay* g)
|
||||
dsiAPBCmd.LPDcsShortReadNoP = DSI_LP_DSR0P_ENABLE;
|
||||
dsiAPBCmd.LPDcsLongWrite = DSI_LP_DLW_ENABLE;
|
||||
HAL_DSI_ConfigCommand(&dsiHandle, &dsiAPBCmd);
|
||||
|
||||
|
||||
/* Configure the LCD. */
|
||||
#ifdef GDISP_PIXELFORMAT_RGB565
|
||||
OTM8009A_Init(OTM8009A_FORMAT_RBG565, 1);
|
||||
@ -259,7 +260,7 @@ static GFXINLINE void post_init_board(GDisplay* g)
|
||||
|
||||
/* Enable the tearing effect line. */
|
||||
HAL_DSI_ShortWrite(&dsiHandle, 0, DSI_DCS_SHORT_PKT_WRITE_P1, DSI_SET_TEAR_ON, 0); // Only V-Blanking info
|
||||
|
||||
|
||||
/* Disable the APB command mode again to go into adapted command mode. (going into high speed mode) */
|
||||
dsiAPBCmd.LPGenShortWriteNoP = DSI_LP_GSW0P_DISABLE;
|
||||
dsiAPBCmd.LPGenShortWriteOneP = DSI_LP_GSW1P_DISABLE;
|
||||
@ -273,7 +274,7 @@ static GFXINLINE void post_init_board(GDisplay* g)
|
||||
dsiAPBCmd.LPDcsShortReadNoP = DSI_LP_DSR0P_DISABLE;
|
||||
dsiAPBCmd.LPDcsLongWrite = DSI_LP_DLW_DISABLE;
|
||||
HAL_DSI_ConfigCommand(&dsiHandle, &dsiAPBCmd);
|
||||
|
||||
|
||||
HAL_DSI_Refresh(&dsiHandle);
|
||||
}
|
||||
|
||||
|
@ -450,6 +450,7 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||
RCC->PLLSAICFGR = ((STM32_PLLSAIP_VALUE/2-1)<<16) | (STM32_PLLSAIN_VALUE << 6) | (STM32_PLLSAIR_VALUE << 28) | (STM32_PLLSAIQ_VALUE << 24);
|
||||
RCC->DCKCFGR1 = (RCC->DCKCFGR1 & ~RCC_DCKCFGR1_PLLSAIDIVR) | STM32_PLLSAIR_POST;
|
||||
RCC->CR |= RCC_CR_PLLSAION;
|
||||
while(!(RCC->CR & RCC_CR_PLLSAIRDY)); // wait for PLLSAI to lock
|
||||
#endif
|
||||
|
||||
// Initialise the SDRAM
|
||||
|
Loading…
Reference in New Issue
Block a user