Ver Fonte

修复只有一层UI层显示时alpha叠加不生效的问题

huangliang há 2 anos atrás
pai
commit
e9312a6bb3

+ 2 - 0
linux/drivers/video/fbdev/arkmicro/ark1668e_lcdc.h

@@ -96,6 +96,8 @@ struct ark1668e_lcdfb_pdata {
     int	backlight_value;
 	int	backlight_delay;
 	int fb_buffer_nums;
+	u32 *osd3_buffer_virtaddr;
+	unsigned int osd3_buffer_phyaddr;
 	void (*ark1668e_lcdfb_power_control)(struct ark1668e_lcdfb_pdata *pdata, int on);
 	struct list_head	pwr_gpios;
 };

+ 30 - 3
linux/drivers/video/fbdev/arkmicro/ark1668e_lcdfb.c

@@ -884,10 +884,34 @@ static int ark1668e_lcdc_dev_init(struct fb_info *info)
 
 	/* set layer1(fb0) vp */
 
+	lcdc_writel(sinfo, ARK1668E_LCDC_BLD_MODE_LCD_REG0, 0x00040301);
+	lcdc_writel(sinfo, ARK1668E_LCDC_BLD_MODE_LCD_REG1, 0x0003f002);
 
-	/* set layer priority and blend mode */
-	lcdc_writel(sinfo, ARK1668E_LCDC_BLD_MODE_LCD_REG0, 0x04030200);
-	lcdc_writel(sinfo, ARK1668E_LCDC_BLD_MODE_LCD_REG1, 0x0003f001);
+	pdata->osd3_buffer_virtaddr= dma_alloc_wc(info->dev, 4,(dma_addr_t *)&pdata->osd3_buffer_phyaddr, GFP_KERNEL);
+	if (!pdata->osd3_buffer_virtaddr){
+		 printk(KERN_ALERT "%s dma_alloc_wc fail\n", __func__);
+	}
+
+
+	//*osd3_buffer_virtaddr = 0x0;
+	*pdata->osd3_buffer_virtaddr = 0x0;
+
+	/* Display osd layer3(fb0) size,pos,format,addr... */
+	ark1668e_lcdfb_pan_display(&info->var, info);
+	value = (1 << ARK1668E_LCDC_HEIGHT_OFFSET) | 1;
+	lcdc_writel(sinfo, ARK1668E_LCDC_OSD3_SIZE, value);
+	lcdc_writel(sinfo, ARK1668E_LCDC_OSD3_SOURCE_SIZE, value);
+	lcdc_writel(sinfo, ARK1668E_LCDC_OSD3_POSITION, 0);
+	lcdc_writel(sinfo, ARK1668E_LCDC_OSD3_WIN_POINT, 0);
+	value = (1 << 17) | (ARK1668E_LCDC_FORMAT_RGBA888 << 12) | 0xff;
+	lcdc_writel(sinfo, ARK1668E_LCDC_OSD3_CTL, value);
+
+	lcdc_writel(sinfo, ARK1668E_LCDC_OSD3_ADDR, pdata->osd3_buffer_phyaddr);
+
+	/* open osd layer3 */
+	value = lcdc_readl(sinfo, ARK1668E_LCDC_CONTROL);
+	value |= (1 << ARK1668E_LCDC_OSD3_EN_OFFSET);
+	lcdc_writel(sinfo, ARK1668E_LCDC_CONTROL, value);
 
 	ark1668e_lcdfb_start(sinfo);
 
@@ -1151,6 +1175,9 @@ static int __exit ark1668e_lcdfb_remove(struct platform_device *pdev)
 		ark1668e_lcdfb_free_video_memory(sinfo);
 	}
 
+	if(pdata->osd3_buffer_virtaddr)
+		dma_free_wc(dev, 4,pdata->osd3_buffer_virtaddr,pdata->osd3_buffer_phyaddr);
+
 	framebuffer_release(info);
 
 	return 0;

+ 1 - 0
linux/include/linux/soc/arkmicro/ark1668e_lcdc_regs.h

@@ -21,6 +21,7 @@
 #define ARK1668E_LCDC_CONTROL									0x004
 #define ARK1668E_LCDC_OSD1_EN_OFFSET					        7
 #define ARK1668E_LCDC_OSD2_EN_OFFSET					        8
+#define ARK1668E_LCDC_OSD3_EN_OFFSET					        9
 #define ARK1668E_LCDC_TIMING0									0x008
 #define	ARK1668E_LCDC_HFP							            (0x3ffU <<  0)
 #define	ARK1668E_LCDC_HBP_OFFSET						        10