C
Qt Quick Ultralite freertos_app_switch Example
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
#include "fsl_gpio.h"
#include "fsl_common.h"
#include "fsl_elcdif.h"
#include "bg_image.h"
#include "string.h" //for memcpy and memset
extern int __BOOT_VAL_ADDR;
extern unsigned char *backBuffer();
extern void QUL_CleanInvalidateDCache_by_Addr(void *, int);
#define APP_IMG_WIDTH 480
#define APP_IMG_HEIGHT 272
#define BG_IMG_WIDTH 200
#define BG_IMG_HEIGHT BG_IMG_WIDTH
int readBootValue()
{
int *ptr = &__BOOT_VAL_ADDR;
return *ptr;
}
void writeBootValue(int app)
{
int *ptr = &__BOOT_VAL_ADDR;
*ptr = app;
QUL_CleanInvalidateDCache_by_Addr((void *) ptr, 4);
}
void reset(int app)
{
writeBootValue(app);
NVIC_SystemReset();
}
#define LOGIC_LED_ON (0U)
#define LOGIC_LED_OFF (1U)
#ifndef BOARD_USER_LED_GPIO
#define BOARD_USER_LED_GPIO GPIO1
#endif
#ifndef BOARD_USER_LED_GPIO_PIN
#define BOARD_USER_LED_GPIO_PIN (9U)
#endif
void initLED()
{
GPIO_PinWrite(BOARD_USER_LED_GPIO, BOARD_USER_LED_GPIO_PIN, LOGIC_LED_OFF);
BOARD_USER_LED_GPIO->GDIR |= (1U << BOARD_USER_LED_GPIO_PIN);
}
void toggleLED()
{
GPIO_PinWrite(BOARD_USER_LED_GPIO,
BOARD_USER_LED_GPIO_PIN,
0x1 ^ GPIO_PinRead(BOARD_USER_LED_GPIO, BOARD_USER_LED_GPIO_PIN));
}
void displayApp2Background()
{
//Init LCD
ELCDIF_EnableInterrupts(LCDIF, kELCDIF_CurFrameDoneInterruptEnable | LCDIF_CTRL1_UNDERFLOW_IRQ_EN_MASK);
ELCDIF_RgbModeStart(LCDIF);
//Get framebuffer pointer
unsigned char *fb = backBuffer();
//Set white background (memset framebuffer to 255)
const int width = APP_IMG_WIDTH;
const int height = APP_IMG_HEIGHT;
const int bpp = 2;
memset((void *) fb, 255, width * height * bpp);
//Copy the content of bg_image to the framebuffer line by line
const unsigned int h_offset = ((height - BG_IMG_HEIGHT) / 2) * width * bpp;
const unsigned int w_offset = ((width - BG_IMG_WIDTH) / 2) * bpp;
for (int i = 0; i < BG_IMG_HEIGHT; ++i) {
unsigned char *dst = fb + h_offset + w_offset + i * width * bpp;
unsigned char *src = &bg_image[i * BG_IMG_WIDTH * bpp];
memcpy((void *) dst, (void *) src, BG_IMG_WIDTH * bpp);
}
}