我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 2692|回复: 1

RK平台  HDMI和LVDS异显的驱动  给有需求的人

[复制链接]

该用户从未签到

812

主题

399

回帖

499

积分

二级逆天

积分
499

社区居民社区明星忠实会员宣传大使奖终身成就奖特殊贡献奖

QQ
发表于 2015-6-28 10:38:14 | 显示全部楼层 |阅读模式
!= info && extend_win->state &&
             hdmi_switch_complete) {
@@ -1488,6 +1500,7 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
             extend_dev_drv->ops->cfg_done(extend_dev_drv);
         }
     }
+#endif   
#ifdef    CONFIG_FB_MIRRORING
     if (video_data_to_mirroring)
         video_data_to_mirroring(info, NULL);
@@ -1501,7 +1514,7 @@ static int rk_fb_get_list_stat(struct rk_lcdc_driver *dev_drv)
     int i, j;

     i = list_empty(&dev_drv->update_regs_list);
-    j = list_empty(&saved_list);
+    j = list_empty(&dev_drv->saved_list);
     return i == j ? 0 : 1;
}

@@ -1601,7 +1614,9 @@ void rk_fb_free_dma_buf(struct rk_lcdc_driver *dev_drv,
     struct rk_fb_reg_area_data *area_data;
     struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
#if defined(CONFIG_ROCKCHIP_IOMMU)
+    #ifdef HDMI_SET_BY_FB
     struct rk_lcdc_driver *ext_dev_drv = rk_get_extend_lcdc_drv();
+    #endif
#endif

     for (i = 0; i < reg_win_data->area_num; i++) {
@@ -1614,6 +1629,7 @@ void rk_fb_free_dma_buf(struct rk_lcdc_driver *dev_drv,
                     area_data->ion_handle);
             freed_addr[freed_index++] = area_data->smem_start;
         }
+#ifdef HDMI_SET_BY_FB
         if (rk_fb->disp_mode == DUAL && hdmi_switch_complete) {
             if (ext_dev_drv->iommu_enabled)
                 ion_unmap_iommu(ext_dev_drv->dev,
@@ -1621,6 +1637,7 @@ void rk_fb_free_dma_buf(struct rk_lcdc_driver *dev_drv,
                         area_data->ion_handle);
         }
#endif
+#endif
         if (area_data->ion_handle != NULL) {
             ion_unmap_kernel(rk_fb->ion_client,
                      area_data->ion_handle);
@@ -1632,6 +1649,7 @@ void rk_fb_free_dma_buf(struct rk_lcdc_driver *dev_drv,
     memset(reg_win_data, 0, sizeof(struct rk_fb_reg_win_data));
}

+#ifdef HDMI_SET_BY_FB
/*
  * function: update extend win info acorrding to primary win info,
     the function is only used for dual display mode
@@ -1771,6 +1789,7 @@ static int rk_fb_update_ext_win(struct rk_lcdc_driver *ext_dev_drv,

     return 0;
}
+#endif

static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
                                 struct rk_lcdc_win *win,
@@ -1908,8 +1927,10 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
     struct rk_lcdc_win *win;
     ktime_t timestamp = dev_drv->vsync_info.timestamp;
     struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
+#ifdef HDMI_SET_BY_FB
     struct rk_lcdc_driver *ext_dev_drv;
     struct rk_lcdc_win *ext_win;
+#endif
     struct rk_fb_reg_win_data *win_data;
     bool wait_for_vsync;
     int count = 100;
@@ -1932,12 +1953,15 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
         win_data = rk_fb_get_win_data(regs, i);
         if (win_data) {
             if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
-                 win_data->data_format == YUV420)
+                (win_data->data_format == YUV420 ||
+                 win_data->data_format == YUV420_A))
                 continue;
+            mutex_lock(&dev_drv->win_config);
             rk_fb_update_win(dev_drv, win, win_data);
             win->state = 1;
             dev_drv->ops->set_par(dev_drv, i);
             dev_drv->ops->pan_display(dev_drv, i);
+            mutex_unlock(&dev_drv->win_config);
#if defined(CONFIG_ROCKCHIP_IOMMU)
             if (dev_drv->iommu_enabled) {
                 g_last_addr = win_data->reg_area_data[0].smem_start +
@@ -1952,6 +1976,8 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
     dev_drv->ops->ovl_mgr(dev_drv, 0, 1);
     if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
         dev_drv->ops->cfg_done(dev_drv);
+
+#ifdef HDMI_SET_BY_FB
     if ((rk_fb->disp_mode == DUAL)
         && (hdmi_get_hotplug() == HDMI_HPD_ACTIVED)
         && hdmi_switch_complete) {
@@ -1990,6 +2016,8 @@ static void rk_fb_update_reg(struct rk_lcdc_driver *dev_drv,
         ext_dev_drv->ops->cfg_done(ext_dev_drv);
     }
ext_win_exit:
+#endif
+
     dev_drv->ops->cfg_done(dev_drv);

     do {
@@ -1997,12 +2025,28 @@ ext_win_exit:
         timeout = wait_event_interruptible_timeout(dev_drv->vsync_info.wait,
                 ktime_compare(dev_drv->vsync_info.timestamp, timestamp) > 0,
                 msecs_to_jiffies(25));
+        #ifdef HDMI_SET_BY_FB
+        if ((rk_fb->disp_mode == DUAL) &&
+            (hdmi_get_hotplug() == HDMI_HPD_ACTIVED) &&
+            hdmi_switch_complete) {
+            /*
+             * If dual output, we need make sure the extend display
+             * cfg take effect before release fence.
+             */
+            ext_dev_drv = rk_get_extend_lcdc_drv();
+            timeout = wait_event_interruptible_timeout(ext_dev_drv->vsync_info.wait,
+                    ktime_compare(ext_dev_drv->vsync_info.timestamp, timestamp) > 0,
+                    msecs_to_jiffies(25));
+        }
+        #endif
+
         dev_drv->ops->get_dsp_addr(dev_drv, dsp_addr);
         wait_for_vsync = false;
         for (i = 0; i < dev_drv->lcdc_win_num; i++) {
             if (dev_drv->win->state == 1) {
                 if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
                     (dev_drv->win->format == YUV420 ||
+                     dev_drv->win->format == YUV420_A ||
                      !strcmp(dev_drv->win->name, "hwc"))) {
                     continue;
                 } else {
@@ -2037,19 +2081,50 @@ ext_win_exit:
             g_last_timeout = timeout;
         }
#endif
-        for (i = 0; i < g_last_win_num; i++)
-            rk_fb_free_dma_buf(dev_drv, &g_reg_win_data);
+        if(dev_drv->id==0)
+        {
+                for (i = 0; i < lcdc0_g_last_win_num; i++)
+                {
+                        rk_fb_free_dma_buf(dev_drv, &lcdc0_g_reg_win_data);
+                        //printk("----lcdc0 %s rk_fb_free_dma_buf i=%d,g_last_win_num=%d\n",__FUNCTION__,i,lcdc0_g_last_win_num);
+
+                }
+        }
+        else//(dev_drv->id==1)
+        {
+                for (i = 0; i < lcdc1_g_last_win_num; i++)
+                {
+                  
回复

使用道具 举报

该用户从未签到

459

主题

1539

回帖

4574

积分

二级逆天

PCB画板兼职QQ469573335

积分
4574

社区居民忠实会员社区劳模最爱沙发社区明星原创达人终身成就奖优秀斑竹奖宣传大使奖

QQ
发表于 2015-6-28 10:45:19 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表