#define PMEM_UI_SIZE SZ_32M\r
#define PMEM_VPU_SIZE SZ_32M\r
#define PMEM_CAM_SIZE SZ_16M\r
+#define MEM_FB_SIZE SZ_4M\r
\r
#define PMEM_GPU_BASE ((u32)RK29_SDRAM_PHYS + SDRAM_SIZE - PMEM_GPU_SIZE)\r
#define PMEM_UI_BASE (PMEM_GPU_BASE - PMEM_UI_SIZE)\r
#define PMEM_VPU_BASE (PMEM_UI_BASE - PMEM_VPU_SIZE)\r
#define PMEM_CAM_BASE (PMEM_VPU_BASE - PMEM_CAM_SIZE)\r
-#define LINUX_SIZE (PMEM_CAM_BASE - RK29_SDRAM_PHYS)\r
+#define MEM_FB_BASE (PMEM_CAM_BASE - MEM_FB_SIZE)\r
+#define LINUX_SIZE (MEM_FB_BASE - RK29_SDRAM_PHYS)\r
\r
extern struct sys_timer rk29_timer;\r
\r
},\r
};\r
\r
+#ifdef CONFIG_FB_RK29\r
/*****************************************************************************************\r
* lcd devices\r
* author: zyw@rock-chips.com\r
.io_init = rk29_fb_io_init,\r
};\r
\r
+/* rk29 fb resource */\r
+struct resource rk29_fb_resource[] = {\r
+ [0] = {\r
+ .name = "lcdc reg",\r
+ .start = RK29_LCDC_PHYS,\r
+ .end = RK29_LCDC_PHYS + RK29_LCDC_SIZE - 1,\r
+ .flags = IORESOURCE_MEM,\r
+ },\r
+ [1] = {\r
+ .name = "lcdc irq",\r
+ .start = IRQ_LCDC,\r
+ .end = IRQ_LCDC,\r
+ .flags = IORESOURCE_IRQ,\r
+ },\r
+ [2] = {\r
+ .name = "win1 buf",\r
+ .start = MEM_FB_BASE,\r
+ .end = MEM_FB_BASE + MEM_FB_SIZE,\r
+ .flags = IORESOURCE_MEM,\r
+ },\r
+};\r
+\r
+/*platform_device*/\r
+struct platform_device rk29_device_fb = {\r
+ .name = "rk29-fb",\r
+ .id = 4,\r
+ .num_resources = ARRAY_SIZE(rk29_fb_resource),\r
+ .resource = rk29_fb_resource,\r
+ .dev = {\r
+ .platform_data = &rk29_fb_info,\r
+ }\r
+};\r
+#endif\r
+\r
static struct android_pmem_platform_data android_pmem_pdata = {\r
.name = "pmem",\r
.start = PMEM_UI_BASE,\r
#include "./display/screen/screen.h"
-#define ANDROID_USE_THREE_BUFS 0 //android use three buffers to accelerate UI display in rgb plane
#if 0
#define fbprintk(msg...) printk(msg);
static DECLARE_WAIT_QUEUE_HEAD(wq);
static int wq_condition = 0;
-#if ANDROID_USE_THREE_BUFS
-static int new_frame_seted = 1;
-#endif
-
void set_lcd_pin(struct platform_device *pdev, int enable)
{
struct rk29fb_info *mach_info = pdev->dev.platform_data;
u16 mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend;
u16 right_margin = screen->right_margin, lower_margin = screen->lower_margin;
u16 x_res = screen->x_res, y_res = screen->y_res;
- u32 clk_rate = 0;
u32 aclk_rate = 150000000;
if(!g_pdev){
struct rk29fb_screen *screen = inf->cur_screen;
u8 format = 0;
- dma_addr_t map_dma;
u32 offset=0, addr=0, map_size=0, smem_len=0;
u16 xres_virtual = var->xres_virtual; //virtual screen size
smem_len = fix->line_length * var->yres_virtual; //cursor buf also alloc here
map_size = PAGE_ALIGN(smem_len);
- if (smem_len != fix->smem_len) // buffer need realloc
+ if (smem_len > fix->smem_len) // buffer need realloc
{
+ printk("%s win1 buf \n",__FUNCTION__);
+ #if 0
fbprintk(">>>>>> win1 buffer size is change(%d->%d)! remap memory!\n",fix->smem_len, smem_len);
fbprintk(">>>>>> smem_len %d = %d * %d \n", smem_len, fix->line_length, var->yres_virtual);
fbprintk(">>>>>> map_size = %d\n", map_size);
memset(info->screen_base, 0, map_size);
fix->smem_start = map_dma;
fix->smem_len = smem_len;
+
fbprintk(">>>>>> alloc succ, mem=%08x, len=%d!\n", (u32)fix->smem_start, fix->smem_len);
+ #endif
}
- addr = fix->smem_start + offset;
-#if ANDROID_USE_THREE_BUFS
- if(0==new_frame_seted) {
- wq_condition = 0;
- wait_event_interruptible_timeout(wq, wq_condition, HZ/20);
- }
- new_frame_seted = 0;
-#endif
+ addr = fix->smem_start + offset;
LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE|m_W1_FORMAT, v_W1_ENABLE(1)|v_W1_FORMAT(format));
mcu_refresh(inf);
-#if !ANDROID_USE_THREE_BUFS
// flush end when wq_condition=1 in mcu panel, but not in rgb panel
if(SCREEN_MCU == inf->cur_screen->type) {
wait_event_interruptible_timeout(wq, wq_condition, HZ/20);
wq_condition = 0;
wait_event_interruptible_timeout(wq, wq_condition, HZ/20);
}
-#endif
-
-#if 0
- int i;
- for(i=0;i<=(0xc0/4);i+=4)
- {
- fbprintk("0x%02X: 0x%08X 0x%08X 0x%08X 0x%08X \n", i*4,
- *((u32*)inf->reg_vir_base+i),
- *((u32*)inf->reg_vir_base+i+1),
- *((u32*)inf->reg_vir_base+i+2),
- *((u32*)inf->reg_vir_base+i+3));
- }
-#endif
return 0;
}
}
}
-#if ANDROID_USE_THREE_BUFS
- new_frame_seted = 1;
-#endif
-
wq_condition = 1;
wake_up_interruptible(&wq);
/* get virtual basic address of lcdc register */
fbprintk(">> get virtual basic address of lcdc register \n");
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lcdc reg");
if (res == NULL)
{
dev_err(&pdev->dev, "failed to get memory registers\n");
if (ret < 0)
goto release_cmap;
+ /* alloc win1 buf */
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "win1 buf");
+ if (res == NULL)
+ {
+ dev_err(&pdev->dev, "failed to get win1 memory \n");
+ ret = -ENOENT;
+ goto release_win1fb;
+ }
+ inf->win1fb->fix.smem_start = res->start;
+ inf->win1fb->fix.smem_len = res->end - res->start;
+ inf->win1fb->screen_base = ioremap(res->start, inf->win1fb->fix.smem_len);
+ memset(inf->win1fb->screen_base, 0, inf->win1fb->fix.smem_len);
+
/* Prepare win0 info */
fbprintk(">> Prepare win0 info \n");
inf->win0fb = framebuffer_alloc(sizeof(struct win0_par), &pdev->dev);
if(inf->win1fb) {
info = inf->win1fb;
if (info->screen_base) {
- dma_free_writecombine(NULL, PAGE_ALIGN(info->fix.smem_len),info->screen_base, info->fix.smem_start);
+ // dma_free_writecombine(NULL, PAGE_ALIGN(info->fix.smem_len),info->screen_base, info->fix.smem_start);
info->screen_base = 0;
info->fix.smem_start = 0;
info->fix.smem_len = 0;