lcdc_layer_csc_mode(lcdc_dev, win);
if (win->id == 0) {
- mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP;
+ mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP |
+ m_WIN0_UV_SWAP;
val = v_WIN0_EN(win->state) |
v_WIN0_FORMAT(win->area[0].fmt_cfg) |
- v_WIN0_RB_SWAP(win->area[0].swap_rb);
+ v_WIN0_RB_SWAP(win->area[0].swap_rb) |
+ v_WIN0_UV_SWAP(win->area[0].swap_uv);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
v_X_SCL_FACTOR(win->scale_yrgb_x) |
case ARGB888:
win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
win->area[0].swap_rb = 0;
+ win->area[0].swap_uv = 0;
break;
case XBGR888:
win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
win->area[0].swap_rb = 1;
+ win->area[0].swap_uv = 0;
break;
case ABGR888:
win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
win->area[0].swap_rb = 1;
+ win->area[0].swap_uv = 0;
break;
case RGB888:
win->area[0].fmt_cfg = VOP_FORMAT_RGB888;
win->area[0].swap_rb = 0;
+ win->area[0].swap_uv = 0;
break;
case RGB565:
win->area[0].fmt_cfg = VOP_FORMAT_RGB565;
win->scale_cbcr_y =
CalScale(win->area[0].yact, win->area[0].ysize);
win->area[0].swap_rb = 0;
+ win->area[0].swap_uv = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n", __func__);
win->scale_cbcr_y =
CalScale(win->area[0].yact, win->area[0].ysize);
win->area[0].swap_rb = 0;
+ win->area[0].swap_uv = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n", __func__);
win->scale_cbcr_y =
CalScale(win->area[0].yact / 2, win->area[0].ysize);
win->area[0].swap_rb = 0;
+ win->area[0].swap_uv = 0;
+ } else {
+ dev_err(lcdc_dev->driver.dev,
+ "%s:un supported format!\n", __func__);
+ }
+ break;
+ case YUV420_NV21:
+ if (win_id == 0) {
+ win->area[0].fmt_cfg = VOP_FORMAT_YCBCR420;
+ win->scale_cbcr_x =
+ CalScale(win->area[0].xact / 2, win->area[0].xsize);
+ win->scale_cbcr_y =
+ CalScale(win->area[0].yact / 2, win->area[0].ysize);
+ win->area[0].swap_rb = 0;
+ win->area[0].swap_uv = 1;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n", __func__);
if(win->state == 1){
mask = m_WIN0_EN | m_WIN0_DATA_FMT | m_WIN0_FMT_10 |
- m_WIN0_LB_MODE | m_WIN0_RB_SWAP;
+ m_WIN0_LB_MODE | m_WIN0_RB_SWAP | m_WIN0_UV_SWAP;
val = v_WIN0_EN(win->state) |
v_WIN0_DATA_FMT(win->area[0].fmt_cfg) |
v_WIN0_FMT_10(win->fmt_10) |
v_WIN0_LB_MODE(win->win_lb_mode) |
- v_WIN0_RB_SWAP(win->area[0].swap_rb);
+ v_WIN0_RB_SWAP(win->area[0].swap_rb) |
+ v_WIN0_UV_SWAP(win->area[0].swap_uv);
lcdc_msk_reg(lcdc_dev, WIN0_CTRL0+off, mask,val);
mask = m_WIN0_BIC_COE_SEL |
struct rk_screen *screen, struct rk_lcdc_win *win)
{
u32 xact,yact,xvir, yvir,xpos, ypos;
- u8 fmt_cfg = 0, swap_rb;
+ u8 fmt_cfg = 0, swap_rb, swap_uv = 0;
char fmt[9] = "NULL";
xpos = win->area[0].xpos + screen->mode.left_margin + screen->mode.hsync_len;
swap_rb = 0;
win->fmt_10 = 0;
break;
+ case YUV420_NV21:
+ fmt_cfg = 4;
+ swap_rb = 0;
+ swap_uv = 1;
+ win->fmt_10 = 0;
+ break;
case YUV444:
fmt_cfg = 6;
swap_rb = 0;
win->area[0].swap_rb = swap_rb;
win->area[0].dsp_stx = xpos;
win->area[0].dsp_sty = ypos;
+ win->area[0].swap_uv = swap_uv;
xact = win->area[0].xact;
yact = win->area[0].yact;
xvir = win->area[0].xvir;
struct rk_screen *screen, struct rk_lcdc_win *win)
{
u32 xact, yact, xvir, yvir, xpos, ypos;
- u8 fmt_cfg = 0, swap_rb;
+ u8 fmt_cfg = 0, swap_rb, swap_uv = 0;
char fmt[9] = "NULL";
xpos = win->area[0].xpos + screen->mode.left_margin + screen->mode.hsync_len;
swap_rb = 0;
win->fmt_10 = 0;
break;
+ case YUV420_NV21:
+ fmt_cfg = 4;
+ swap_rb = 0;
+ swap_uv = 1;
+ win->fmt_10 = 0;
+ break;
case YUV444:
fmt_cfg = 6;
swap_rb = 0;
win->area[0].swap_rb = swap_rb;
win->area[0].dsp_stx = xpos;
win->area[0].dsp_sty = ypos;
+ win->area[0].swap_uv = swap_uv;
xact = win->area[0].xact;
yact = win->area[0].yact;
xvir = win->area[0].xvir;
break;
case YUV422:
case YUV420:
+ case YUV420_NV21:
case YUV444:
pixel_width = 1 * 8;
break;
case HAL_PIXEL_FORMAT_YCbCr_422_SP: /* yuv422 */
fb_data_fmt = YUV422;
break;
+ case HAL_PIXEL_FORMAT_YCrCb_420_SP: /* YUV420---vuvuvu */
+ fb_data_fmt = YUV420_NV21;
+ break;
case HAL_PIXEL_FORMAT_YCrCb_NV12: /* YUV420---uvuvuv */
fb_data_fmt = YUV420;
break;
strcpy(fmt, "RGB565");
break;
case YUV420:
+ case YUV420_NV21:
strcpy(fmt, "YUV420");
break;
case YUV422:
fix->line_length = stride;
uv_y_act = win->area[0].yact >> 1;
break;
- case YUV420: /* 420sp */
+ case YUV420: /* nv12 */
+ case YUV420_NV21: /* nv21 */
case YUV420_A:
is_pic_yuv = 1;
stride = stride_32bit_1;
if (win_data) {
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
(win_data->reg_area_data[0].data_format == YUV420 ||
+ win_data->reg_area_data[0].data_format == YUV420_NV21 ||
win_data->reg_area_data[0].data_format == YUV420_A))
continue;
mutex_lock(&dev_drv->win_config);
fix->line_length = stride;
uv_y_act = win_par->area_par[0].yact >> 1;
break;
- case YUV420: /* 420sp */
+ case YUV420: /* nv12 */
+ case YUV420_NV21: /* nv21 */
case YUV420_A:
is_pic_yuv = 1;
stride = stride_32bit_1;
/* only read the current frame buffer */
if (win->area[0].format == RGB565) {
total_size = win->area[0].y_vir_stride * win->area[0].yact << 1;
- } else if (win->area[0].format == YUV420) {
+ } else if ((win->area[0].format == YUV420) ||
+ (win->area[0].format == YUV420_NV21)) {
total_size =
(win->area[0].y_vir_stride * win->area[0].yact * 6);
} else {
cblen = crlen = (xvir * yvir) >> 1;
uv_y_act = win->area[0].yact >> 1;
break;
- case YUV420: /* 420sp */
+ case YUV420: /* nv12 */
+ case YUV420_NV21: /* nv21 */
case YUV420_A:
is_pic_yuv = 1;
stride = stride_32bit_1;
win->g_alpha_val = 0;
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
- (win->area[0].format == YUV420 || win->area[0].format == YUV420_A))
- win->state = 1;
+ (win->area[0].format == YUV420 ||
+ win->area[0].format == YUV420_NV21 ||
+ win->area[0].format == YUV420_A))
+ win->state = 1;
dev_drv->ops->set_par(dev_drv, win_id);
case RGB565:
return "RGB565";
case YUV420:
+ case YUV420_NV21:
return "YUV420";
case YUV422:
return "YUV422";
case FBDC_RGBX_888:
return "FBDC_RGBX_888";
default:
- break;
+ return "invalid";
}
-
- return "invalid";
}
static ssize_t show_screen_info(struct device *dev,
YUV420_A = 10,
YUV422_A,
YUV444_A,
+ YUV420_NV21,
FBDC_RGB_565 = 0x26,
FBDC_ARGB_888,
FBDC_RGBX_888,
enum data_format format;
u8 fmt_cfg;
u8 swap_rb;
+ u8 swap_uv;
u32 y_offset; /*yuv/rgb offset -->LCDC_WINx_YRGB_MSTx*/
u32 c_offset; /*cb cr offset--->LCDC_WINx_CBR_MSTx*/
u16 xpos; /*start point in panel --->LCDC_WINx_DSP_ST*/