static int32_t __init gp_fb_init( void ) { int32_t ret = 0; struct gp_fb_info *info; #if 0 /* Init display device */ if (disp_open(0, 0) < 0) return -EIO; if (disp_init() < 0) return -EIO; #endif fbinfo = framebuffer_alloc(sizeof(struct gp_fb_info), NULL); if (!fbinfo) return -ENOMEM; info = fbinfo->par; info->first_open = 0; /*Get panel resolution */ disp_get_panel_res(&info->panelRes); /* Color */ ret = gp_fb_setColorType(fbinfo); if (ret < 0) { printk("[%s:%d], set color type error\n", __FUNCTION__, __LINE__); goto dealloc_fb; } /* Get buffer width, height, and size */ gp_fb_getBufInfo(fbinfo); /* Get panel rect */ gp_fb_getPanelRect(fbinfo); info->fbmem = disp_allocate_buffer(info->bufinfo); if (info->fbmem == NULL) { ret = -ENXIO; goto dealloc_fb; } memset(info->fbmem, 0x00, info->bufinfo.size); fbinfo->fbops = &gp_fb_ops; fbinfo->flags = FBINFO_FLAG_DEFAULT; fbinfo->pseudo_palette = NULL; fbinfo->screen_base = info->fbmem; fbinfo->screen_size = 0; /* Resolution */ fbinfo->var.xres = info->bufinfo.width; fbinfo->var.yres = info->bufinfo.height; fbinfo->var.xres_virtual = fbinfo->var.xres; fbinfo->var.yres_virtual = fbinfo->var.yres * 2; /* Timing */ fbinfo->var.left_margin = 0; fbinfo->var.right_margin = 0; fbinfo->var.upper_margin = 0; fbinfo->var.lower_margin = 0; fbinfo->var.hsync_len = 0; fbinfo->var.vsync_len = 0; fbinfo->var.activate = FB_ACTIVATE_FORCE; fbinfo->var.accel_flags = 0; fbinfo->var.vmode = FB_VMODE_NONINTERLACED; /* fixed info */ memset(&fbinfo->fix.id, 0, sizeof(fbinfo->fix.id)); strncpy(fbinfo->fix.id, driver_name, sizeof(driver_name)); fbinfo->fix.mmio_start = 0x93000000; fbinfo->fix.mmio_len = 0x1000; fbinfo->fix.type = FB_TYPE_PACKED_PIXELS; fbinfo->fix.type_aux = 0; fbinfo->fix.visual = FB_VISUAL_TRUECOLOR; fbinfo->fix.xpanstep = 0; fbinfo->fix.ypanstep = 1; fbinfo->fix.ywrapstep = 0; fbinfo->fix.accel = FB_ACCEL_NONE; fbinfo->fix.smem_start = gp_chunk_pa(info->fbmem); fbinfo->fix.smem_len = info->bufinfo.size; fbinfo->fix.line_length = (fbinfo->var.xres_virtual * fbinfo->var.bits_per_pixel) / 8; gp_fb_activate(fbinfo); ret = register_framebuffer(fbinfo); if (ret < 0) { printk(KERN_ERR "Failed to register framebuffer device: %d\n", ret); goto release_fbmem; } printk(KERN_INFO "fb%d: %s frame buffer device\n", fbinfo->node, fbinfo->fix.id); return 0; release_fbmem: disp_free_buffer(FB_BUFFER_ID); dealloc_fb: framebuffer_release(fbinfo); return ret; }
static int32_t __init gp_fb_init( void ) { int32_t ret = 0; struct gp_fb_info *info; fbinfo = framebuffer_alloc(sizeof(struct gp_fb_info), NULL); if (!fbinfo) return -ENOMEM; info = fbinfo->par; /*Get panel resolution & allocate frame buffer (double buffer) */ disp1_get_panel_res(&info->panelRes); info->fbsize = info->panelRes.width * info->panelRes.height * 4 * 2; info->fbmem = gp_chunk_malloc(current->tgid, info->fbsize); if (info->fbmem == NULL) { ret = -ENXIO; goto dealloc_fb; } memset(info->fbmem, 0x00, info->fbsize); fbinfo->fbops = &gp_fb_ops; fbinfo->flags = FBINFO_FLAG_DEFAULT; fbinfo->pseudo_palette = NULL; fbinfo->screen_base = info->fbmem; fbinfo->screen_size = 0; /* Resolution */ fbinfo->var.xres = info->panelRes.width; fbinfo->var.yres = info->panelRes.height; fbinfo->var.xres_virtual = fbinfo->var.xres; fbinfo->var.yres_virtual = fbinfo->var.yres * 2; /* Timing */ fbinfo->var.left_margin = 0; fbinfo->var.right_margin = 0; fbinfo->var.upper_margin = 0; fbinfo->var.lower_margin = 0; fbinfo->var.hsync_len = 0; fbinfo->var.vsync_len = 0; /* Color RGBA8888 */ fbinfo->var.bits_per_pixel = 32; fbinfo->var.grayscale = 0; fbinfo->var.transp.offset = 0; fbinfo->var.red.offset = 24; fbinfo->var.green.offset = 16; fbinfo->var.blue.offset = 8; fbinfo->var.transp.length = 8; fbinfo->var.red.length = 8; fbinfo->var.green.length = 8; fbinfo->var.blue.length = 8; fbinfo->var.nonstd = 0; fbinfo->var.activate = FB_ACTIVATE_FORCE; fbinfo->var.accel_flags = 0; fbinfo->var.vmode = FB_VMODE_NONINTERLACED; /* fixed info */ strcpy(fbinfo->fix.id, driver_name); fbinfo->fix.mmio_start = 0x93000000; fbinfo->fix.mmio_len = 0x1000; fbinfo->fix.type = FB_TYPE_PACKED_PIXELS; fbinfo->fix.type_aux = 0; fbinfo->fix.visual = FB_VISUAL_TRUECOLOR; fbinfo->fix.xpanstep = 0; fbinfo->fix.ypanstep = 1; fbinfo->fix.ywrapstep = 0; fbinfo->fix.accel = FB_ACCEL_NONE; fbinfo->fix.smem_start = gp_chunk_pa(info->fbmem); fbinfo->fix.smem_len = info->fbsize; fbinfo->fix.line_length = (fbinfo->var.xres_virtual * fbinfo->var.bits_per_pixel) / 8; gp_fb_activate(fbinfo); ret = register_framebuffer(fbinfo); if (ret < 0) { printk(KERN_ERR "Failed to register framebuffer device: %d\n", ret); goto release_fbmem; } printk(KERN_INFO "fb%d: %s frame buffer device\n", fbinfo->node, fbinfo->fix.id); return 0; release_fbmem: gp_chunk_free(info->fbmem); dealloc_fb: framebuffer_release(fbinfo); return ret; }