fix rga2 yuv 420p uv swap bug
authorzsq <zsq@rock-chips.com>
Tue, 1 Apr 2014 09:58:21 +0000 (17:58 +0800)
committerzsq <zsq@rock-chips.com>
Tue, 1 Apr 2014 09:58:21 +0000 (17:58 +0800)
drivers/video/rockchip/rga2/rga2_drv.c
drivers/video/rockchip/rga2/rga2_reg_info.c

index 5af573b33fddfaad9afef5f7b408e25c2d7a6b47..64ea4f2aa04bb938126522eefb8daced85fd3ca5 100755 (executable)
@@ -693,12 +693,14 @@ static int rga2_convert_dma_buf(struct rga2_req *req)
         }\r
            ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);\r
         req->src.yrgb_addr = phy_addr;\r
-        req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+        req->src.uv_addr = req->src.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+        req->src.v_addr = req->src.uv_addr + (req->dst.vir_w * req->dst.vir_h)/4;\r
         ion_free(rga2_drvdata->ion_client, hdl);\r
     }\r
     else {\r
         req->src.yrgb_addr = req->src.uv_addr;\r
-        req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+        req->src.uv_addr = req->src.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+        req->src.v_addr = req->src.uv_addr + (req->dst.vir_w * req->dst.vir_h)/4;\r
     }\r
 \r
     if(req->dst.yrgb_addr) {\r
@@ -711,11 +713,13 @@ static int rga2_convert_dma_buf(struct rga2_req *req)
            ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);\r
         req->dst.yrgb_addr = phy_addr;\r
         req->dst.uv_addr = req->dst.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+        req->dst.v_addr = req->dst.uv_addr + (req->dst.vir_w * req->dst.vir_h)/4;\r
         ion_free(rga2_drvdata->ion_client, hdl);\r
     }\r
     else {\r
         req->dst.yrgb_addr = req->dst.uv_addr;\r
-        req->dst.uv_addr = req->dst.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+        req->dst.uv_addr = req->dst.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+        req->dst.v_addr = req->dst.uv_addr + (req->dst.vir_w * req->dst.vir_h)/4;\r
     }\r
 \r
     return 0;\r
index eff8fed668f01bad7565abc9aff09132f04ddc66..b80ac018ee2c05a07f2f6c02e35c98f5c823e1de 100644 (file)
@@ -535,8 +535,23 @@ RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
     }\r
 \r
     *bRGA_DST_BASE0 = (RK_U32)yrgb_addr;\r
-    *bRGA_DST_BASE1 = (RK_U32)u_addr;\r
-    *bRGA_DST_BASE2 = (RK_U32)v_addr;\r
+\r
+    if((msg->dst.format == RGA2_FORMAT_YCbCr_420_P) || (msg->dst.format == RGA2_FORMAT_YCrCb_420_P))\r
+    {\r
+        if(dst_cbcr_swp == 0) {\r
+            *bRGA_DST_BASE1 = (RK_U32)v_addr;\r
+            *bRGA_DST_BASE2 = (RK_U32)u_addr;\r
+        }\r
+        else {\r
+            *bRGA_DST_BASE1 = (RK_U32)u_addr;\r
+            *bRGA_DST_BASE2 = (RK_U32)v_addr;\r
+        }\r
+    }\r
+    else {\r
+        *bRGA_DST_BASE1 = (RK_U32)u_addr;\r
+        *bRGA_DST_BASE2 = (RK_U32)v_addr;\r
+    }\r
+\r
     *bRGA_SRC_BASE3 = (RK_U32)s_y_lt_addr;\r
 }\r
 \r