From 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 13 May 2024 10:30:14 +0000
Subject: [PATCH] modify sin led gpio
---
kernel/drivers/video/rockchip/vehicle/vehicle_flinger.c | 114 ++++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 76 insertions(+), 38 deletions(-)
diff --git a/kernel/drivers/video/rockchip/vehicle/vehicle_flinger.c b/kernel/drivers/video/rockchip/vehicle/vehicle_flinger.c
index 5fd2795..e2c0e67 100644
--- a/kernel/drivers/video/rockchip/vehicle/vehicle_flinger.c
+++ b/kernel/drivers/video/rockchip/vehicle/vehicle_flinger.c
@@ -46,7 +46,6 @@
static int vehicle_dump_cif;
static int vehicle_dump_rga;
static int vehicle_dump_vop;
-static bool nv12_display = true;
enum force_value {
FORCE_WIDTH = 1920,
@@ -326,8 +325,11 @@
if (inited)
return 0;
+ VEHICLE_INFO("%s: v_cfg->rotate_mirror(0x%x)\n", __func__, v_cfg->rotate_mirror);
+
// if (FORCE_ROTATION == RGA_TRANSFORM_ROT_270 || FORCE_ROTATION == RGA_TRANSFORM_ROT_90) {
- if (v_cfg->rotate_mirror == 0x01 || v_cfg->rotate_mirror == 0x04) {
+ if ((v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x01 ||
+ (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x04) {
w = FORCE_WIDTH;
h = ALIGN(FORCE_HEIGHT, 64);
s = ALIGN(FORCE_HEIGHT, 64);
@@ -387,7 +389,8 @@
// f = HAL_PIXEL_FORMAT_RGBX_8888;
// if (FORCE_ROTATION == RGA_TRANSFORM_ROT_270 ||
// FORCE_ROTATION == RGA_TRANSFORM_ROT_90)
- if (v_cfg->rotate_mirror == 0x01 || v_cfg->rotate_mirror == 0x04)
+ if ((v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x01 ||
+ (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x04)
ret = rk_flinger_alloc_buffer(flg, buffer, h, w, s, f);
else
ret = rk_flinger_alloc_buffer(flg, buffer, w, h, s, f);
@@ -528,7 +531,7 @@
src_rect = &buffer->src;
dst_rect = &buffer->dst;
- switch (buffer->rotation) {
+ switch (buffer->rotation & RGA_TRANSFORM_ROT_MASK) {
case RGA_TRANSFORM_ROT_90:
case RGA_TRANSFORM_ROT_270:
dst_rect->x = src_rect->x;
@@ -662,7 +665,10 @@
rga_request.rotate_mode = 0;
rga_request.sina = 0;
rga_request.cosa = 0;
- rga_request.yuv2rgb_mode = 0x1 << 0; // limit range
+
+ rga_request.yuv2rgb_mode = 0x0 << 0; // yuvtoyuv config 0
+ /* yuv to rgb color space transform if need */
+ //rga_request.yuv2rgb_mode = 0x1 << 0; // limit range
//rga_request.yuv2rgb_mode = 0x2 << 0; // full range
rga_request.src.act_w = src_buffer->src.w;
@@ -685,7 +691,7 @@
rga_request.dst.yrgb_addr = dst_buffer->fd;
rga_request.dst.uv_addr = 0;
rga_request.dst.v_addr = 0;
- rga_request.dst.format = RGA_FORMAT_RGBX_8888;
+ rga_request.dst.format = RGA_FORMAT_YCrCb_420_SP;
rga_request.scale_mode = 1;
@@ -834,7 +840,7 @@
rga_request.rotate_mode = 0;
rga_request.sina = 0;
rga_request.cosa = 0;
- rga_request.dst.vir_w = ALIGN(ds, 64);
+ rga_request.dst.vir_w = ds;
rga_request.dst.vir_h = dh;
rga_request.dst.act_w = dw;
rga_request.dst.act_h = dh;
@@ -843,7 +849,7 @@
break;
case RGA_TRANSFORM_FLIP_H:/*x mirror*/
rga_request.rotate_mode = 2;
- rga_request.dst.vir_w = ALIGN(ds, 64);
+ rga_request.dst.vir_w = ds;
rga_request.dst.vir_h = dh;
rga_request.dst.act_w = dw;
rga_request.dst.act_h = dh;
@@ -852,7 +858,7 @@
break;
case RGA_TRANSFORM_FLIP_V:/*y mirror*/
rga_request.rotate_mode = 3;
- rga_request.dst.vir_w = ALIGN(ds, 64);
+ rga_request.dst.vir_w = ds;
rga_request.dst.vir_h = dh;
rga_request.dst.act_w = dw;
rga_request.dst.act_h = dh;
@@ -863,7 +869,7 @@
rga_request.rotate_mode = 1;
rga_request.sina = 65536;
rga_request.cosa = 0;
- rga_request.dst.vir_w = ALIGN(ds, 64);
+ rga_request.dst.vir_w = ds;
rga_request.dst.vir_h = dh;
rga_request.dst.act_w = dh;
rga_request.dst.act_h = dw;
@@ -874,7 +880,7 @@
rga_request.rotate_mode = 1;
rga_request.sina = 0;
rga_request.cosa = -65536;
- rga_request.dst.vir_w = ALIGN(ds, 64);
+ rga_request.dst.vir_w = ds;
rga_request.dst.vir_h = dh;
rga_request.dst.act_w = dw;
rga_request.dst.act_h = dh;
@@ -885,7 +891,7 @@
rga_request.rotate_mode = 1;
rga_request.sina = -65536;
rga_request.cosa = 0;
- rga_request.dst.vir_w = ALIGN(ds, 64);
+ rga_request.dst.vir_w = ds;
rga_request.dst.vir_h = dh;
rga_request.dst.act_w = dh;
rga_request.dst.act_h = dw;
@@ -896,7 +902,7 @@
rga_request.rotate_mode = 0;
rga_request.sina = 0;
rga_request.cosa = 0;
- rga_request.dst.vir_w = ALIGN(ds, 64);
+ rga_request.dst.vir_w = ds;
rga_request.dst.vir_h = dh;
rga_request.dst.act_w = dw;
rga_request.dst.act_h = dh;
@@ -952,19 +958,41 @@
static int rk_flinger_rga_render(struct flinger *flinger,
struct graphic_buffer *src_buffer,
- struct graphic_buffer *dst_buffer)
+ struct graphic_buffer *dst_buffer,
+ struct graphic_buffer *tmp_buffer)
{
+ int rotation;
+
if (!flinger || !src_buffer || !dst_buffer)
return -EINVAL;
if (dst_buffer && dst_buffer->rel_fence)
dst_buffer->rel_fence = NULL;
- rk_flinger_rga_blit(flinger, src_buffer, dst_buffer);
- rk_flinger_fill_buffer_rects(dst_buffer, &src_buffer->dst,
- &src_buffer->dst);
- dst_buffer->src.f = src_buffer->dst.f;
+ if ((src_buffer->rotation & RGA_TRANSFORM_ROT_MASK) &&
+ (src_buffer->rotation & RGA_TRANSFORM_FLIP_MASK)) {
+ rotation = flinger->v_cfg.rotate_mirror;
+ /* 1. rotate */
+ src_buffer->rotation = rotation & RGA_TRANSFORM_ROT_MASK;
+ rk_flinger_rga_blit(flinger, src_buffer, tmp_buffer);
+ rk_flinger_fill_buffer_rects(tmp_buffer, &src_buffer->dst,
+ &src_buffer->dst);
+ tmp_buffer->src.f = src_buffer->dst.f;
+ tmp_buffer->rotation = rotation & RGA_TRANSFORM_FLIP_MASK;
+ /* 2. mirror */
+ rk_flinger_rga_blit(flinger, tmp_buffer, dst_buffer);
+ rk_flinger_fill_buffer_rects(dst_buffer, &tmp_buffer->dst,
+ &tmp_buffer->dst);
+ dst_buffer->src.f = src_buffer->dst.f;
+
+ src_buffer->rotation = rotation;
+ } else {
+ rk_flinger_rga_blit(flinger, src_buffer, dst_buffer);
+ rk_flinger_fill_buffer_rects(dst_buffer, &src_buffer->dst,
+ &src_buffer->dst);
+ dst_buffer->src.f = src_buffer->dst.f;
+ }
/* save rga out buffer */
if (vehicle_dump_rga) {
struct file *filep = NULL;
@@ -1074,6 +1102,7 @@
rockchip_drm_direct_show_commit(flinger->drm_dev, &commit_info);
}
+static int drop_frames_number;
static int rk_flinger_vop_show(struct flinger *flinger,
struct graphic_buffer *buffer)
{
@@ -1082,6 +1111,12 @@
VEHICLE_DG("flinger vop show buffer wxh(%zux%zu)\n",
buffer->src.w, buffer->src.h);
+ if (drop_frames_number > 0) {
+ VEHICLE_INFO("%s discard the frame num(%d)!\n", __func__, drop_frames_number);
+ drop_frames_number--;
+ return 0;
+ }
+
if (!flinger->running)
return 0;
@@ -1160,9 +1195,11 @@
FORCE_XOFFSET, FORCE_YOFFSET,
v_cfg->width, v_cfg->height,
v_cfg->width, FORCE_FORMAT);
- rk_flinger_set_buffer_rotation(buffer, FORCE_ROTATION);
+ rk_flinger_set_buffer_rotation(buffer, v_cfg->rotate_mirror);
rk_flinger_cacultae_dst_rect_by_rotation(buffer);
buffer->dst.f = buffer->src.f;
+ VEHICLE_INFO("buffer[%d]->rotation(%d).\n",
+ i, buffer->rotation);
}
}
}
@@ -1294,20 +1331,12 @@
VEHICLE_DG("it is ypbpr signal\n");
iep_buffer = &(flg->target_buffer[NUM_TARGET_BUFFERS - 1]);
iep_buffer->state = ACQUIRE;
- //scaler by rga for rgbx8888/rgb888/rgb565 display
- if (!nv12_display) {
- rk_flinger_rga_render(flg, src_buffer, iep_buffer);
- src_buffer->state = FREE;
- rk_flinger_rga_scaler(flg, iep_buffer, dst_buffer);
- iep_buffer->state = FREE;
- rk_flinger_vop_show(flg, dst_buffer);
- } else {
- rk_flinger_rga_render(flg, src_buffer, dst_buffer);
- src_buffer->state = FREE;
- rk_flinger_vop_show(flg, dst_buffer);
- // rk_flinger_vop_show(flg, src_buffer);
- }
-
+ //scaler by rga to force widthxheight display
+ rk_flinger_rga_render(flg, src_buffer, iep_buffer, dst_buffer);
+ src_buffer->state = FREE;
+ rk_flinger_rga_scaler(flg, iep_buffer, dst_buffer);
+ iep_buffer->state = FREE;
+ rk_flinger_vop_show(flg, dst_buffer);
for (i = 0; i < NUM_TARGET_BUFFERS; i++) {
buffer = &(flinger->target_buffer[i]);
if (buffer->state == DISPLAY)
@@ -1318,7 +1347,7 @@
} else {
// cvbs
VEHICLE_DG("it is a cvbs signal\n");
- rk_flinger_rga_render(flg, src_buffer, dst_buffer);
+ rk_flinger_rga_render(flg, src_buffer, dst_buffer, iep_buffer);
src_buffer->state = FREE;
rk_flinger_iep_deinterlace(flg, dst_buffer, iep_buffer);
dst_buffer->state = FREE;
@@ -1384,18 +1413,27 @@
static bool vehicle_rotation_param_check(struct vehicle_cfg *v_cfg)
{
- switch (v_cfg->rotate_mirror) {
+ switch (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) {
case RGA_TRANSFORM_ROT_90:
case RGA_TRANSFORM_ROT_270:
case RGA_TRANSFORM_ROT_0:
case RGA_TRANSFORM_ROT_180:
+ return true;
+ default:
+ VEHICLE_INFO("invalid rotate-mirror param %d\n",
+ v_cfg->rotate_mirror);
+ v_cfg->rotate_mirror = v_cfg->rotate_mirror & RGA_TRANSFORM_FLIP_MASK;
+ return false;
+ }
+
+ switch (v_cfg->rotate_mirror & RGA_TRANSFORM_FLIP_MASK) {
case RGA_TRANSFORM_FLIP_H:
case RGA_TRANSFORM_FLIP_V:
return true;
default:
VEHICLE_INFO("invalid rotate-mirror param %d\n",
v_cfg->rotate_mirror);
- v_cfg->rotate_mirror = 0;
+ v_cfg->rotate_mirror = v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK;
return false;
}
}
@@ -1450,6 +1488,7 @@
flg->cvbs_field_count = 0;
memcpy(&flg->v_cfg, v_cfg, sizeof(struct vehicle_cfg));
flg->running = true;
+ drop_frames_number = v_cfg->drop_frames;
return 0;
}
@@ -1475,9 +1514,8 @@
int i;
src_buffer = NULL;
- found = last_src_index + 1;
for (i = 1; i < NUM_SOURCE_BUFFERS; i++) {
- found = (found + i) % NUM_SOURCE_BUFFERS;
+ found = (last_src_index + i) % NUM_SOURCE_BUFFERS;
VEHICLE_DG("%s,flg->source_buffer[%d].state(%d)",
__func__, found, flg->source_buffer[found].state);
if (flg->source_buffer[found].state == FREE) {
--
Gitblit v1.6.2