ge2d_context_t* dev_ge2d_setup(void* para) { config_para_t *config=(config_para_t*)para; static ge2d_context_t context; if(NULL==config) return NULL; amlog_mask_level(LOG_MASK_DEVICE,LOG_LEVEL_LOW,"current ge2d type:%d\n",config->src_dst_type); if(0==ge2d_context_config(&context,config)) { return &context; }else{ return NULL; } }
static int ge2d_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long args) { ge2d_context_t *context=(ge2d_context_t *)filp->private_data; void __user* argp =(void __user*)args; config_para_t ge2d_config; ge2d_para_t para ; config_para_ex_t ge2d_config_ex; int ret=0; if(!command_valid(cmd)) return -1; switch (cmd) { case GE2D_CONFIG: case GE2D_SRCCOLORKEY: copy_from_user(&ge2d_config,argp,sizeof(config_para_t)); break; case GE2D_CONFIG_EX: copy_from_user(&ge2d_config_ex,argp,sizeof(config_para_ex_t)); break; case GE2D_SET_COEF: case GE2D_ANTIFLICKER_ENABLE: break; default : copy_from_user(¶,argp,sizeof(ge2d_para_t)); break; } switch(cmd) { case GE2D_CONFIG: ret=ge2d_context_config(context,&ge2d_config) ; break; case GE2D_CONFIG_EX: ret=ge2d_context_config_ex(context,&ge2d_config_ex) ; break; case GE2D_SET_COEF: ge2d_wq_set_scale_coef(context,args&0xff,args>>16); break; case GE2D_ANTIFLICKER_ENABLE: ge2d_antiflicker_enable(context,args); break; case GE2D_SRCCOLORKEY: ge2dgen_src_key(context , ge2d_config.src_key.key_enable,ge2d_config.src_key.key_color, ge2d_config.src_key.key_mask,ge2d_config.src_key.key_mode); //RGBA MODE break; case GE2D_FILLRECTANGLE: amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"fill rect...,x=%d,y=%d,w=%d,h=%d,color=0x%x\r\n", para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.color); fillrect(context, para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.color) ; break; case GE2D_FILLRECTANGLE_NOBLOCK: amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"fill rect...,x=%d,y=%d,w=%d,h=%d,color=0x%x,noblk\r\n", para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.color); fillrect_noblk(context, para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.color) ; break; case GE2D_STRETCHBLIT: //stretch blit amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"stretchblt...,x=%d,y=%d,w=%d,h=%d,dst.w=%d,dst.h=%d\r\n", para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.w, para.dst_rect.h); stretchblt(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y, para.dst_rect.w, para.dst_rect.h); break; case GE2D_STRETCHBLIT_NOBLOCK: //stretch blit amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"stretchblt...,x=%d,y=%d,w=%d,h=%d,dst.w=%d,dst.h=%d,noblk\r\n", para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.w, para.dst_rect.h); stretchblt_noblk(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y, para.dst_rect.w, para.dst_rect.h); break; case GE2D_BLIT: //bitblt amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"blit...\r\n"); bitblt(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y); break; case GE2D_BLIT_NOBLOCK: //bitblt amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"blit...,noblk\r\n"); bitblt_noblk(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y); break; case GE2D_BLEND: amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"blend ...\r\n"); blend(context, para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.src2_rect.x, para.src2_rect.y, para.src2_rect.w, para.src2_rect.h, para.dst_rect.x, para.dst_rect.y, para.dst_rect.w, para.dst_rect.h, para.op) ; break; case GE2D_BLEND_NOBLOCK: amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"blend ...,noblk\r\n"); blend_noblk(context, para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.src2_rect.x, para.src2_rect.y, para.src2_rect.w, para.src2_rect.h, para.dst_rect.x, para.dst_rect.y, para.dst_rect.w, para.dst_rect.h, para.op) ; break; case GE2D_BLIT_NOALPHA: //bitblt_noalpha amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"blit_noalpha...\r\n"); bitblt_noalpha(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y); break; case GE2D_BLIT_NOALPHA_NOBLOCK: //bitblt_noalpha amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"blit_noalpha...,noblk\r\n"); bitblt_noalpha_noblk(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y); break; case GE2D_STRETCHBLIT_NOALPHA: //stretch blit amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"stretchblt_noalpha...,x=%d,y=%d,w=%d,h=%d,dst.w=%d,dst.h=%d\r\n", para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.w, para.dst_rect.h); stretchblt_noalpha(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y, para.dst_rect.w, para.dst_rect.h); break; case GE2D_STRETCHBLIT_NOALPHA_NOBLOCK: //stretch blit amlog_mask_level(LOG_MASK_IOCTL,LOG_LEVEL_LOW,"stretchblt_noalpha...,x=%d,y=%d,w=%d,h=%d,dst.w=%d,dst.h=%d,noblk\r\n", para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.w, para.dst_rect.h); stretchblt_noalpha_noblk(context , para.src1_rect.x, para.src1_rect.y, para.src1_rect.w, para.src1_rect.h, para.dst_rect.x, para.dst_rect.y, para.dst_rect.w, para.dst_rect.h); break; } return ret; }
int osd_init_progress_bar(void) { struct src_dst_info_s *op_info = &progress_bar.op_info; const struct vinfo_s *vinfo = progress_bar.vinfo; struct osd_fb_dev_s *fb_dev; struct canvas_s cs; struct config_para_s *cfg = &ge2d_config; struct ge2d_context_s *context = ge2d_context; u32 step = 1; memset(&progress_bar, 0, sizeof(struct osd_progress_bar_s)); vinfo = get_current_vinfo(); progress_bar.bar_border = (((vinfo->field_height ? vinfo->field_height : vinfo->height) * 4 / 720)>>2)<<2; progress_bar.bar_width = (((vinfo->width * 200 / 1280)>>2)<<2) + progress_bar.bar_border; progress_bar.bar_height = (((vinfo->field_height ? vinfo->field_height : vinfo->height) * 32 / 720) >> 2) << 2; if (0 == init_fb1_first(vinfo)) { fb_dev = gp_fbdev_list[1]; if (NULL == fb_dev) { pr_debug("fb1 should exit!!!"); return -EFAULT; } canvas_read(OSD2_CANVAS_INDEX, &cs); context = create_ge2d_work_queue(); if (!context) { pr_debug("create work queue error\n"); return -EFAULT; } memset(cfg, 0, sizeof(struct config_para_s)); cfg->src_dst_type = OSD1_OSD1; cfg->src_format = GE2D_FORMAT_S32_ARGB; cfg->src_planes[0].addr = cs.addr; cfg->src_planes[0].w = cs.width / 4; cfg->src_planes[0].h = cs.height; cfg->dst_planes[0].addr = cs.addr; cfg->dst_planes[0].w = cs.width / 4; cfg->dst_planes[0].h = cs.height; if (ge2d_context_config(context, cfg) < 0) { pr_debug("ge2d config error.\n"); return -EFAULT; } if (NULL == context) { pr_debug("ge2d_context is NULL!!!!!!\n"); return -EFAULT; } progress_bar.ge2d_context = context; pr_debug("progress bar setup ge2d device OK\n"); /* clear dst rect */ op_info->color = 0x000000bf; op_info->dst_rect.x = 0; op_info->dst_rect.y = 0; op_info->dst_rect.w = vinfo->width; op_info->dst_rect.h = vinfo->field_height ? vinfo->field_height : vinfo->height; fillrect(context, op_info->dst_rect.x, op_info->dst_rect.y, op_info->dst_rect.w, op_info->dst_rect.h, op_info->color); pr_debug("clear dstrect is - (%d, %d)-(%d, %d) -\n", op_info->dst_rect.x, op_info->dst_rect.y, op_info->dst_rect.w, op_info->dst_rect.h); /* show fb1 */ console_lock(); osd_blank(0, fb_dev->fb_info); console_unlock(); op_info->color = 0x555555ff; op_info->dst_rect.x = (vinfo->width / 2) - progress_bar.bar_width; op_info->dst_rect.y = ((vinfo->field_height ? vinfo->field_height : vinfo->height) * 9) / 10; op_info->dst_rect.w = progress_bar.bar_width * 2; op_info->dst_rect.h = progress_bar.bar_height; pr_debug("fill==dst:%d-%d-%d-%d\n", op_info->dst_rect.x, op_info->dst_rect.y, op_info->dst_rect.w, op_info->dst_rect.h); fillrect(context, op_info->dst_rect.x, op_info->dst_rect.y, op_info->dst_rect.w, op_info->dst_rect.h, op_info->color); } else { pr_debug("fb1 init failed, exit!!!"); return -EFAULT; } /* initial op info before draw actrualy */ op_info->dst_rect.x += progress_bar.bar_border; op_info->dst_rect.y += progress_bar.bar_border; op_info->dst_rect.w = (progress_bar.bar_width - progress_bar.bar_border) * 2 * step/100; op_info->dst_rect.h = progress_bar.bar_height - progress_bar.bar_border * 2; op_info->color = 0xffffff; return 0; }