/** * @brief Initializes the LCD. * @retval LCD state */ uint8_t BSP_LCD_Init(void) { /* Select the used LCD */ /* The RK043FN48H LCD 480x272 is selected */ /* Timing Configuration */ hLtdcHandler.Init.HorizontalSync = (RK043FN48H_HSYNC - 1); hLtdcHandler.Init.VerticalSync = (RK043FN48H_VSYNC - 1); hLtdcHandler.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1); hLtdcHandler.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1); hLtdcHandler.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1); hLtdcHandler.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1); hLtdcHandler.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1); hLtdcHandler.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1); /* LCD clock configuration */ BSP_LCD_ClockConfig(&hLtdcHandler, NULL); /* Initialize the LCD pixel width and pixel height */ hLtdcHandler.LayerCfg->ImageWidth = RK043FN48H_WIDTH; hLtdcHandler.LayerCfg->ImageHeight = RK043FN48H_HEIGHT; /* Background value */ hLtdcHandler.Init.Backcolor.Blue = 0; hLtdcHandler.Init.Backcolor.Green = 0; hLtdcHandler.Init.Backcolor.Red = 0; /* Polarity */ hLtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL; hLtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL; hLtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL; hLtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hLtdcHandler.Instance = LTDC; if(HAL_LTDC_GetState(&hLtdcHandler) == HAL_LTDC_STATE_RESET) { /* Initialize the LCD Msp: this __weak function can be rewritten by the application */ BSP_LCD_MspInit(&hLtdcHandler, NULL); } HAL_LTDC_Init(&hLtdcHandler); /* Assert display enable LCD_DISP pin */ HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET); /* Assert backlight LCD_BL_CTRL pin */ HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET); #if !defined(DATA_IN_ExtSDRAM) /* Initialize the SDRAM */ BSP_SDRAM_Init(); #endif /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); return LCD_OK; }
/** * @brief Initializes the LCD. * @retval LCD state */ uint8_t BSP_LCD_Init(void) { /* Timing Configuration */ ltdc_handle.Init.HorizontalSync = (RK043FN48H_HSYNC - 1); ltdc_handle.Init.VerticalSync = (RK043FN48H_VSYNC - 1); ltdc_handle.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1); ltdc_handle.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1); ltdc_handle.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1); ltdc_handle.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1); ltdc_handle.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1); ltdc_handle.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1); /* LCD clock configuration */ BSP_LCD_ClockConfig(<dc_handle, NULL); /* Initialize the LCD pixel width and pixel height */ ltdc_handle.LayerCfg->ImageWidth = RK043FN48H_WIDTH; ltdc_handle.LayerCfg->ImageHeight = RK043FN48H_HEIGHT; /* Background value */ ltdc_handle.Init.Backcolor.Blue = 0; ltdc_handle.Init.Backcolor.Green = 0; ltdc_handle.Init.Backcolor.Red = 0; /* Polarity */ ltdc_handle.Init.HSPolarity = LTDC_HSPOLARITY_AL; ltdc_handle.Init.VSPolarity = LTDC_VSPOLARITY_AL; ltdc_handle.Init.DEPolarity = LTDC_DEPOLARITY_AL; ltdc_handle.Init.PCPolarity = LTDC_PCPOLARITY_IPC; ltdc_handle.Instance = LTDC; if (HAL_LTDC_GetState(<dc_handle) == HAL_LTDC_STATE_RESET) { BSP_LCD_MspInit(<dc_handle, NULL); } HAL_LTDC_Init(<dc_handle); /* allocate the framebuffer */ size_t fb_size_pages = PAGE_ALIGN(RK043FN48H_WIDTH * RK043FN48H_HEIGHT * 4) / PAGE_SIZE; void *fb_address = novm_alloc_pages(fb_size_pages, NOVM_ARENA_SECONDARY); if (!fb_address) panic("failed to allocate framebuffer for LCD\n"); BSP_LCD_LayerDefaultInit(0, (uint32_t)fb_address); BSP_LCD_SelectLayer(0); /* clear framebuffer */ memset((void *)ltdc_handle.LayerCfg[active_layer].FBStartAdress, 0, BSP_LCD_GetXSize() * BSP_LCD_GetYSize() * BSP_LCD_PixelSize()); /* turn the display on */ BSP_LCD_DisplayOn(); return LCD_OK; }
/** * @brief Initializes the LCD. * @param PclkConfig : pixel clock profile * @retval LCD state */ uint8_t BSP_LCD_InitEx(uint32_t PclkConfig) { PCLK_profile = PclkConfig; /* Select the used LCD */ /* The AMPIRE 480x272 does not contain an ID register then we check the availability of AMPIRE 480x640 LCD using device ID of the STMPE811 mounted on MB1046 daughter board */ if(stmpe811_ts_drv.ReadID(TS_I2C_ADDRESS) == STMPE811_ID) { /* The AMPIRE LCD 480x272 is selected */ /* Timing Configuration */ hltdc_eval.Init.HorizontalSync = (AMPIRE480272_HSYNC - 1); hltdc_eval.Init.VerticalSync = (AMPIRE480272_VSYNC - 1); hltdc_eval.Init.AccumulatedHBP = (AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); hltdc_eval.Init.AccumulatedVBP = (AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); hltdc_eval.Init.AccumulatedActiveH = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP - 1); hltdc_eval.Init.AccumulatedActiveW = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP - 1); hltdc_eval.Init.TotalHeigh = (AMPIRE480272_HEIGHT + AMPIRE480272_VSYNC + AMPIRE480272_VBP + AMPIRE480272_VFP - 1); hltdc_eval.Init.TotalWidth = (AMPIRE480272_WIDTH + AMPIRE480272_HSYNC + AMPIRE480272_HBP + AMPIRE480272_HFP - 1); /* Initialize the LCD pixel width and pixel height */ hltdc_eval.LayerCfg->ImageWidth = AMPIRE480272_WIDTH; hltdc_eval.LayerCfg->ImageHeight = AMPIRE480272_HEIGHT; } else { /* The LCD AMPIRE 640x480 is selected */ /* Timing configuration */ hltdc_eval.Init.HorizontalSync = (AMPIRE640480_HSYNC - 1); hltdc_eval.Init.VerticalSync = (AMPIRE640480_VSYNC - 1); hltdc_eval.Init.AccumulatedHBP = (AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_eval.Init.AccumulatedVBP = (AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_eval.Init.AccumulatedActiveH = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP - 1); hltdc_eval.Init.AccumulatedActiveW = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP - 1); hltdc_eval.Init.TotalHeigh = (AMPIRE640480_HEIGHT + AMPIRE640480_VSYNC + AMPIRE640480_VBP + AMPIRE640480_VFP - 1); hltdc_eval.Init.TotalWidth = (AMPIRE640480_WIDTH + AMPIRE640480_HSYNC + AMPIRE640480_HBP + AMPIRE640480_HFP - 1); /* Initialize the LCD pixel width and pixel height */ hltdc_eval.LayerCfg->ImageWidth = AMPIRE640480_WIDTH; hltdc_eval.LayerCfg->ImageHeight = AMPIRE640480_HEIGHT; } /* Background value */ hltdc_eval.Init.Backcolor.Blue = 0; hltdc_eval.Init.Backcolor.Green = 0; hltdc_eval.Init.Backcolor.Red = 0; /* Polarity */ hltdc_eval.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc_eval.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc_eval.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc_eval.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc_eval.Instance = LTDC; /* LCD clock configuration */ BSP_LCD_ClockConfig(&hltdc_eval, &PCLK_profile); MspInit(); HAL_LTDC_Init(&hltdc_eval); #if !defined(DATA_IN_ExtSDRAM) /* Initialize the SDRAM */ BSP_SDRAM_Init(); #endif /* DATA_IN_ExtSDRAM */ /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); return LCD_OK; }