project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp: Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem. sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately. sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades. sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for fastboot. Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
276 lines
9.6 KiB
C
276 lines
9.6 KiB
C
/*
|
|
* Copyright 2021 Rockchip Electronics Co. LTD
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*/
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#endif /* End of #ifdef __cplusplus */
|
|
|
|
#include <errno.h>
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <sys/poll.h>
|
|
#include <unistd.h>
|
|
|
|
#include "sample_comm.h"
|
|
|
|
static RK_S32 test_rgn_load_bmp(SAMPLE_RGN_CTX_S *ctx) {
|
|
OSD_SURFACE_S Surface;
|
|
OSD_BITMAPFILEHEADER bmpFileHeader;
|
|
OSD_BITMAPINFO bmpInfo;
|
|
RK_BOOL bCPU = RK_FALSE;
|
|
|
|
if (get_bmp_info(ctx->srcFileBmpName, &bmpFileHeader, &bmpInfo) < 0) {
|
|
RK_LOGE("GetBmpInfo err, generate from cpu!\n");
|
|
bCPU = RK_TRUE;
|
|
// return RK_FAILURE;
|
|
}
|
|
|
|
switch (ctx->u32BmpFormat) {
|
|
case RK_FMT_ARGB8888:
|
|
Surface.enColorFmt = OSD_COLOR_FMT_ARGB8888;
|
|
break;
|
|
case RK_FMT_BGRA8888:
|
|
Surface.enColorFmt = OSD_COLOR_FMT_BGRA8888;
|
|
break;
|
|
case RK_FMT_ARGB1555:
|
|
Surface.enColorFmt = OSD_COLOR_FMT_ARGB1555;
|
|
break;
|
|
case RK_FMT_BGRA5551:
|
|
Surface.enColorFmt = OSD_COLOR_FMT_BGRA5551;
|
|
break;
|
|
default:
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
if (bCPU) {
|
|
ctx->stBitmap.pData =
|
|
malloc(4 * (ctx->stRegion.u32Width) * (ctx->stRegion.u32Height));
|
|
|
|
if (RK_NULL == ctx->stBitmap.pData) {
|
|
RK_LOGE("malloc osd memroy err!");
|
|
return RK_FAILURE;
|
|
}
|
|
SAMPLE_COMM_FillImage(ctx->stBitmap.pData, ctx->stRegion.u32Width,
|
|
ctx->stRegion.u32Height, ctx->stRegion.u32Width,
|
|
ctx->stRegion.u32Height, ctx->u32BmpFormat, 0);
|
|
ctx->stBitmap.u32Width = ctx->stRegion.u32Width;
|
|
ctx->stBitmap.u32Height = ctx->stRegion.u32Height;
|
|
ctx->stBitmap.enPixelFormat = ctx->u32BmpFormat;
|
|
return RK_SUCCESS;
|
|
}
|
|
|
|
ctx->stBitmap.pData =
|
|
malloc(4 * (bmpInfo.bmiHeader.biWidth) * (bmpInfo.bmiHeader.biHeight));
|
|
|
|
if (RK_NULL == ctx->stBitmap.pData) {
|
|
RK_LOGE("malloc osd memroy err!");
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
create_surface_by_bitmap(ctx->srcFileBmpName, &Surface,
|
|
(RK_U8 *)(ctx->stBitmap.pData));
|
|
|
|
ctx->stBitmap.u32Width = Surface.u16Width;
|
|
ctx->stBitmap.u32Height = Surface.u16Height;
|
|
ctx->stBitmap.enPixelFormat = (PIXEL_FORMAT_E)ctx->u32BmpFormat;
|
|
|
|
return RK_SUCCESS;
|
|
}
|
|
|
|
RK_S32 SAMPLE_COMM_RGN_CreateChn(SAMPLE_RGN_CTX_S *ctx) {
|
|
RK_S64 s64TimeStart;
|
|
RK_S64 s64TimeEnd;
|
|
RK_S32 s32Ret = RK_SUCCESS;
|
|
|
|
switch (ctx->stRgnAttr.enType) {
|
|
case OVERLAY_RGN: {
|
|
ctx->stRgnAttr.enType = OVERLAY_RGN;
|
|
ctx->stRgnAttr.unAttr.stOverlay.enPixelFmt = (PIXEL_FORMAT_E)ctx->u32BmpFormat;
|
|
ctx->stRgnAttr.unAttr.stOverlay.stSize.u32Width = ctx->stRegion.u32Width;
|
|
ctx->stRgnAttr.unAttr.stOverlay.stSize.u32Height = ctx->stRegion.u32Height;
|
|
|
|
ctx->stRgnChnAttr.bShow = RK_TRUE;
|
|
ctx->stRgnChnAttr.enType = OVERLAY_RGN;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = ctx->stRegion.s32X;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = ctx->stRegion.s32Y;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = ctx->u32BgAlpha;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = ctx->u32FgAlpha;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32Layer = ctx->u32Layer;
|
|
|
|
s32Ret = test_rgn_load_bmp(ctx);
|
|
if (s32Ret != RK_SUCCESS) {
|
|
RK_LOGE("test_rgn_load_bmp failure:%#X", s32Ret);
|
|
return s32Ret;
|
|
}
|
|
} break;
|
|
case COVER_RGN: {
|
|
ctx->stRgnAttr.enType = COVER_RGN;
|
|
ctx->stRgnChnAttr.bShow = RK_TRUE;
|
|
ctx->stRgnChnAttr.enType = COVER_RGN;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.s32X = ctx->stRegion.s32X;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.s32Y = ctx->stRegion.s32Y;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.u32Width = ctx->stRegion.u32Width;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.u32Height = ctx->stRegion.u32Height;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.u32Color = ctx->u32Color;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.u32Layer = ctx->u32Layer;
|
|
} break;
|
|
case MOSAIC_RGN: {
|
|
ctx->stRgnAttr.enType = MOSAIC_RGN;
|
|
ctx->stRgnChnAttr.bShow = RK_TRUE;
|
|
ctx->stRgnChnAttr.enType = MOSAIC_RGN;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.s32X = ctx->stRegion.s32X;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.s32Y = ctx->stRegion.s32Y;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.u32Width = ctx->stRegion.u32Width;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.u32Height =
|
|
ctx->stRegion.u32Height;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.enBlkSize = MOSAIC_BLK_SIZE_64;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.u32Layer = ctx->u32Layer;
|
|
} break;
|
|
default:
|
|
RK_LOGE("unsupport type %d.", ctx->stRgnAttr.enType);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
s32Ret = RK_MPI_RGN_Create(ctx->rgnHandle, &ctx->stRgnAttr);
|
|
if (RK_SUCCESS != s32Ret) {
|
|
RK_LOGE("RK_MPI_RGN_Create (%d) failed with %#x!", ctx->rgnHandle, s32Ret);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
s32Ret = RK_MPI_RGN_AttachToChn(ctx->rgnHandle, &ctx->stMppChn, &ctx->stRgnChnAttr);
|
|
if (RK_SUCCESS != s32Ret) {
|
|
RK_LOGE("RK_MPI_RGN_AttachToChn (%d) failed with %#x!", ctx->rgnHandle, s32Ret);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
if (ctx->stRgnAttr.enType == OVERLAY_RGN) {
|
|
// s64TimeStart = mpi_test_utils_get_now_us();
|
|
|
|
s32Ret = RK_MPI_RGN_SetBitMap(ctx->rgnHandle, &ctx->stBitmap);
|
|
if (s32Ret != RK_SUCCESS) {
|
|
RK_LOGE("RK_MPI_RGN_SetBitMap failed with %#x!", s32Ret);
|
|
if (RK_NULL != ctx->stBitmap.pData) {
|
|
free(ctx->stBitmap.pData);
|
|
ctx->stBitmap.pData = NULL;
|
|
}
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
if (RK_NULL != ctx->stBitmap.pData) {
|
|
free(ctx->stBitmap.pData);
|
|
ctx->stBitmap.pData = NULL;
|
|
}
|
|
|
|
// s64TimeEnd = mpi_test_utils_get_now_us();
|
|
// RK_LOGI("Handle:%d, space time %lld us, load bmp success!",
|
|
// ctx->rgnHandle, s64TimeEnd -
|
|
// s64TimeStart);
|
|
}
|
|
|
|
s32Ret =
|
|
RK_MPI_RGN_GetDisplayAttr(ctx->rgnHandle, &ctx->stMppChn, &ctx->stRgnChnAttr);
|
|
if (RK_SUCCESS != s32Ret) {
|
|
RK_LOGE("RK_MPI_RGN_GetDisplayAttr (%d)) failed with %#x!", ctx->rgnHandle,
|
|
s32Ret);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
switch (ctx->stRgnAttr.enType) {
|
|
case OVERLAY_RGN: {
|
|
ctx->stRgnChnAttr.bShow = RK_TRUE;
|
|
ctx->stRgnChnAttr.enType = OVERLAY_RGN;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = ctx->stRegion.s32X;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = ctx->stRegion.s32Y;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = ctx->u32BgAlpha;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = ctx->u32FgAlpha;
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32Layer = ctx->u32Layer;
|
|
RK_LOGE("resize the overlay region %d to <%d, %d> BgAlpha %d "
|
|
"FgAlpha%d, color<0x%x>",
|
|
ctx->rgnHandle, ctx->stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32X,
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y,
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32BgAlpha,
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32FgAlpha,
|
|
ctx->stRgnChnAttr.unChnAttr.stOverlayChn.u32Layer);
|
|
} break;
|
|
case COVER_RGN: {
|
|
ctx->stRgnChnAttr.bShow = RK_TRUE;
|
|
ctx->stRgnChnAttr.enType = COVER_RGN;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.s32X = ctx->stRegion.s32X;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.s32Y = ctx->stRegion.s32Y;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.u32Width = ctx->stRegion.u32Width;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.u32Height = ctx->stRegion.u32Height;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.u32Color = ctx->u32Color;
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.u32Layer = ctx->u32Layer;
|
|
RK_LOGE("resize the cover region %d to <%d, %d, %d, %d>, color<0x%x>",
|
|
ctx->rgnHandle, ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.s32X,
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.s32Y,
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.u32Width,
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.stRect.u32Height,
|
|
ctx->stRgnChnAttr.unChnAttr.stCoverChn.u32Color);
|
|
} break;
|
|
case MOSAIC_RGN: {
|
|
ctx->stRgnChnAttr.bShow = RK_TRUE;
|
|
ctx->stRgnChnAttr.enType = MOSAIC_RGN;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.s32X = ctx->stRegion.s32X;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.s32Y = ctx->stRegion.s32Y;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.u32Width = ctx->stRegion.u32Width;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.stRect.u32Height =
|
|
ctx->stRegion.u32Height;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.enBlkSize = MOSAIC_BLK_SIZE_64;
|
|
ctx->stRgnChnAttr.unChnAttr.stMosaicChn.u32Layer = ctx->u32Layer;
|
|
} break;
|
|
default:
|
|
RK_LOGE("unsupport type %d.", ctx->stRgnAttr.enType);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
s32Ret =
|
|
RK_MPI_RGN_SetDisplayAttr(ctx->rgnHandle, &ctx->stMppChn, &ctx->stRgnChnAttr);
|
|
if (RK_SUCCESS != s32Ret) {
|
|
RK_LOGE("RK_MPI_RGN_SetDisplayAttr (%d)) failed with %#x!", ctx->rgnHandle,
|
|
s32Ret);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
return RK_SUCCESS;
|
|
}
|
|
|
|
RK_S32 SAMPLE_COMM_RGN_DestroyChn(SAMPLE_RGN_CTX_S *ctx) {
|
|
RK_S32 s32Ret = RK_SUCCESS;
|
|
|
|
s32Ret = RK_MPI_RGN_DetachFromChn(ctx->rgnHandle, &ctx->stMppChn);
|
|
if (RK_SUCCESS != s32Ret) {
|
|
RK_LOGE("RK_MPI_RGN_DetachFrmChn (%d) failed with %#x!", ctx->rgnHandle, s32Ret);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
s32Ret = RK_MPI_RGN_Destroy(ctx->rgnHandle);
|
|
if (RK_SUCCESS != s32Ret) {
|
|
RK_LOGE("RK_MPI_RGN_Destroy [%d] failed with %#x", ctx->rgnHandle, s32Ret);
|
|
return RK_FAILURE;
|
|
}
|
|
|
|
return RK_SUCCESS;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* End of #ifdef __cplusplus */
|