static void cwValidatePicture(PicturePtr pPicture, Mask mask) { DrawablePtr pDrawable = pPicture->pDrawable; ScreenPtr pScreen = pDrawable->pScreen; cwPsDecl(pScreen); cwPicturePrivate; cwPsUnwrap(ValidatePicture); /* * Must call ValidatePicture to ensure pPicture->pCompositeClip is valid */ (*ps->ValidatePicture) (pPicture, mask); if (!cwDrawableIsRedirWindow(pDrawable)) { if (pPicturePrivate) cwDestroyPicturePrivate(pPicture); } else { PicturePtr pBackingPicture; DrawablePtr pBackingDrawable; int x_off, y_off; pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off); if (pPicturePrivate && pPicturePrivate->pBackingPicture->pDrawable != pBackingDrawable) { cwDestroyPicturePrivate(pPicture); pPicturePrivate = 0; } if (!pPicturePrivate) { pPicturePrivate = cwCreatePicturePrivate(pPicture); if (!pPicturePrivate) { cwPsWrap(ValidatePicture, cwValidatePicture); return; } } pBackingPicture = pPicturePrivate->pBackingPicture; /* * Always copy transform and filters because there's no * indication of when they've changed */ SetPictureTransform(pBackingPicture, pPicture->transform); if (pBackingPicture->filter != pPicture->filter || pPicture->filter_nparams > 0) { char *filter = PictureGetFilterName(pPicture->filter); SetPictureFilter(pBackingPicture, filter, strlen(filter), pPicture->filter_params, pPicture->filter_nparams); } pPicturePrivate->stateChanges |= mask; if (pPicturePrivate->serialNumber != pDrawable->serialNumber || (pPicturePrivate-> stateChanges & (CPClipXOrigin | CPClipYOrigin | CPClipMask))) { SetPictureClipRegion(pBackingPicture, x_off - pDrawable->x, y_off - pDrawable->y, pPicture->pCompositeClip); pPicturePrivate->serialNumber = pDrawable->serialNumber; pPicturePrivate->stateChanges &= ~(CPClipXOrigin | CPClipYOrigin | CPClipMask); } CopyPicture(pPicture, pPicturePrivate->stateChanges, pBackingPicture); ValidatePicture(pBackingPicture); } cwPsWrap(ValidatePicture, cwValidatePicture); }
/** * @brief Main program * @param None * @retval None */ int main(void) { uint8_t lcd_status = LCD_OK; /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization: global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Initialize the SDRAM */ BSP_SDRAM_Init(); /* Initialize the LCD */ lcd_status = LCD_Init(); OnError_Handler(lcd_status != LCD_OK); /* Initialize LTDC layer 0 iused for Hint */ LCD_LayertInit(0, LAYER0_ADDRESS); BSP_LCD_SelectLayer(0); HAL_DSI_LongWrite(&hdsi_eval, 0, DSI_DCS_LONG_PKT_WRITE, 4, OTM8009A_CMD_CASET, pColLeft); HAL_DSI_LongWrite(&hdsi_eval, 0, DSI_DCS_LONG_PKT_WRITE, 4, OTM8009A_CMD_PASET, pPage); /* Update pitch : the draw is done on the whole physical X Size */ HAL_LTDC_SetPitch(&hltdc_eval, BSP_LCD_GetXSize(), 0); /* Display example brief */ LCD_BriefDisplay(); /* Show first image */ CopyPicture((uint32_t *)Images[ImageIndex++], (uint32_t *)LAYER0_ADDRESS, 240, 160, 320, 240); pending_buffer = 0; active_area = LEFT_AREA; HAL_DSI_LongWrite(&hdsi_eval, 0, DSI_DCS_LONG_PKT_WRITE, 2, OTM8009A_CMD_WRTESCN, pSyncLeft); /* Infinite loop */ while (1) { if(pending_buffer < 0) { CopyPicture((uint32_t *)Images[ImageIndex++], (uint32_t *)LAYER0_ADDRESS, 240, 160, 320, 240); if(ImageIndex >= 2) { ImageIndex = 0; } pending_buffer = 1; HAL_DSI_LongWrite(&hdsi_eval, 0, DSI_DCS_LONG_PKT_WRITE, 2, OTM8009A_CMD_WRTESCN, pSyncLeft); } /* Wait some time before switching to next image */ HAL_Delay(2000); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { uint8_t lcd_status = LCD_OK; /* This sample code displays a fixed image 800x480 on LCD KoD in */ /* orientation mode landscape and DSI mode video burst */ /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization: global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Initialize used LED1 and LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED3); /* Configure user push-button */ BSP_PB_Init(BUTTON_WAKEUP, BUTTON_MODE_GPIO); /* Initialize the LCD DSI in Video Burst mode with LANDSCAPE orientation */ lcd_status = BSP_LCD_Init(); OnError_Handler(lcd_status != LCD_OK); /* Program a line event at line 0 */ HAL_LTDC_ProgramLineEvent(&hltdc_eval, 0); /* Copy texture to be displayed on LCD from Flash to SDRAM */ CopyPicture((uint32_t *)&candies_800x480_argb8888, (uint32_t *)LCD_FB_START_ADDRESS, 0, 0, BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER_BACKGROUND, LCD_FB_START_ADDRESS); BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER_BACKGROUND); /* Prepare area to display frame number in the image displayed on LCD */ BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_FillRect(0, 400, BSP_LCD_GetXSize(), 80); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetBackColor(LCD_COLOR_BLUE); BSP_LCD_SetFont(&Font16); /* Display title */ BSP_LCD_DisplayStringAt(0, 420, (uint8_t *) "LCD_DSI_ULPM_Data example", CENTER_MODE); BSP_LCD_DisplayStringAt(0, 440, (uint8_t *) "Press TAMPER button to enter ULPM", CENTER_MODE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetBackColor(LCD_COLOR_BLUE); BSP_LCD_SetFont(&Font16); /* Infinite loop */ while (1) { /* Clear previous line */ BSP_LCD_ClearStringLine(460); /* New text to display */ sprintf(str_display, ">> Frame Nb : %lu", frameCnt); /* Print updated frame number */ BSP_LCD_DisplayStringAt(0, 460, (uint8_t *)str_display, CENTER_MODE); if (CheckForUserInput() > 0) { /* Clear previous line */ BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_ClearStringLine(440); BSP_LCD_DisplayStringAt(0, 440, (uint8_t *) "Enter ULPM - switch Off LCD 6 seconds", CENTER_MODE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); /* Display Off with ULPM management Data lane only integrated */ BSP_LCD_DisplayOff(); HAL_Delay(1000); /* Switch Off bit LTDCEN */ __HAL_LTDC_DISABLE(&hltdc_eval); /* Enter ultra low power mode (data lane only integrated) */ HAL_DSI_EnterULPMData(&hdsi_eval); BSP_LED_On(LED1); HAL_Delay(6000); BSP_LCD_ClearStringLine(440); BSP_LCD_DisplayStringAt(0, 440, (uint8_t *) " Exited ULPM with success - Press To enter Again ULPM. ", CENTER_MODE); /* Exit ultra low power mode (data lane only integrated) */ HAL_DSI_ExitULPMData(&hdsi_eval); BSP_LED_Off(LED1); /* Switch On bit LTDCEN */ __HAL_LTDC_ENABLE(&hltdc_eval); /* Display On with ULPM exit Data lane only integrated */ BSP_LCD_DisplayOn(); } } }