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; }
static void osd_clone_process(void) { canvas_t cs, cd; u32 x0 = 0; u32 y0 = 0; u32 y1 = 0; unsigned char x_rev = 0; unsigned char y_rev = 0; unsigned char xy_swap = 0; config_para_ex_t *ge2d_config = &s_osd_clone.ge2d_config; ge2d_context_t *context = s_osd_clone.ge2d_context; canvas_read(OSD1_CANVAS_INDEX, &cs); canvas_read(OSD2_CANVAS_INDEX, &cd); y0 = s_osd_clone.osd1_yres*s_osd_clone.buffer_number; y1 = s_osd_clone.osd2_yres*s_osd_clone.buffer_number; if (s_osd_clone.angle == 1) { xy_swap = 1; x_rev = 1; } else if (s_osd_clone.angle == 2) { x_rev = 1; y_rev = 1; } else if (s_osd_clone.angle == 3) { xy_swap = 1; y_rev = 1; } memset(ge2d_config, 0, sizeof(config_para_ex_t)); ge2d_config->alu_const_color = 0; ge2d_config->bitmask_en = 0; ge2d_config->src1_gb_alpha = 0; ge2d_config->dst_xy_swap = 0; ge2d_config->src_planes[0].addr = cs.addr; ge2d_config->src_planes[0].w = cs.width/4; ge2d_config->src_planes[0].h = cs.height; ge2d_config->dst_planes[0].addr = cd.addr; ge2d_config->dst_planes[0].w = cd.width/4; ge2d_config->dst_planes[0].h = cd.height; ge2d_config->src_para.canvas_index = OSD1_CANVAS_INDEX; ge2d_config->src_para.mem_type = CANVAS_OSD0; ge2d_config->dst_para.format = GE2D_FORMAT_S32_ABGR; ge2d_config->src_para.fill_color_en = 0; ge2d_config->src_para.fill_mode = 0; ge2d_config->src_para.x_rev = 0; ge2d_config->src_para.y_rev = 0; ge2d_config->src_para.color = 0xffffffff; ge2d_config->src_para.top = 0; ge2d_config->src_para.left = 0; ge2d_config->src_para.width = cs.width/4; ge2d_config->src_para.height = cs.height; ge2d_config->dst_para.canvas_index = OSD2_CANVAS_INDEX; ge2d_config->dst_para.mem_type = CANVAS_OSD1; ge2d_config->dst_para.format = GE2D_FORMAT_S32_ABGR; ge2d_config->dst_para.top = 0; ge2d_config->dst_para.left = 0; ge2d_config->dst_para.width = cd.width/4; ge2d_config->dst_para.height = cd.height; ge2d_config->dst_para.fill_color_en = 0; ge2d_config->dst_para.fill_mode = 0; ge2d_config->dst_para.color = 0; ge2d_config->dst_para.x_rev = x_rev; ge2d_config->dst_para.y_rev = y_rev; ge2d_config->dst_xy_swap = xy_swap; if (ge2d_context_config_ex(context, ge2d_config) < 0) { printk("++ osd clone ge2d config error.\n"); return; } stretchblt(context, x0, y0, cs.width/4, s_osd_clone.osd1_yres, x0, y1, cd.width/4, s_osd_clone.osd2_yres); }
static void osd_antiflicker_process(void) { canvas_t cs, cd; u32 x0 = 0; u32 y0 = 0; u32 y1 = 0; config_para_ex_t *ge2d_config = &ge2d_osd_antiflicker.ge2d_config; ge2d_context_t *context = ge2d_osd_antiflicker.ge2d_context; canvas_read(OSD1_CANVAS_INDEX, &cs); canvas_read(OSD2_CANVAS_INDEX, &cd); if (ge2d_osd_antiflicker.pan == 1) { y0 = cs.height/2; //y1 = cd.height/2; } memset(ge2d_config, 0, sizeof(config_para_ex_t)); ge2d_config->alu_const_color = 0; ge2d_config->bitmask_en = 0; ge2d_config->src1_gb_alpha = 0; ge2d_config->src_planes[0].addr = cs.addr; ge2d_config->src_planes[0].w = cs.width/4; ge2d_config->src_planes[0].h = cs.height; ge2d_config->dst_planes[0].addr = cd.addr; ge2d_config->dst_planes[0].w = cd.width/4; ge2d_config->dst_planes[0].h = cd.height; ge2d_config->src_para.canvas_index = OSD1_CANVAS_INDEX; ge2d_config->src_para.mem_type = CANVAS_OSD0; ge2d_config->dst_para.format = GE2D_FORMAT_S32_ARGB; ge2d_config->src_para.fill_color_en = 0; ge2d_config->src_para.fill_mode = 0; ge2d_config->src_para.x_rev = 0; ge2d_config->src_para.y_rev = 0; ge2d_config->src_para.color = 0xffffffff; ge2d_config->src_para.top = 0; ge2d_config->src_para.left = 0; ge2d_config->src_para.width = cs.width/4; ge2d_config->src_para.height = cs.height; ge2d_config->dst_para.canvas_index = OSD2_CANVAS_INDEX; ge2d_config->dst_para.mem_type = CANVAS_OSD1; ge2d_config->dst_para.format = GE2D_FORMAT_S32_ARGB; ge2d_config->dst_para.top = 0; ge2d_config->dst_para.left = 0; ge2d_config->dst_para.width = cd.width/4; ge2d_config->dst_para.height = cd.height; ge2d_config->dst_para.fill_color_en = 0; ge2d_config->dst_para.fill_mode = 0; ge2d_config->dst_para.color = 0; ge2d_config->dst_para.x_rev = 0; ge2d_config->dst_para.y_rev = 0; ge2d_config->dst_xy_swap = 0; if (ge2d_context_config_ex(context, ge2d_config) < 0) { printk("++ osd antiflicker ge2d config error.\n"); return; } stretchblt(context, x0, y0, cs.width/4, cs.height/2, x0, y1, cd.width/4, cd.height); }
static void osd_clone_process(void) { struct canvas_s cs, cd; u32 x0 = 0; u32 y0 = 0; u32 y1 = 0; unsigned char x_rev = 0; unsigned char y_rev = 0; unsigned char xy_swap = 0; struct config_para_ex_s *ge2d_config = &s_osd_ext_clone.ge2d_config; struct ge2d_context_s *context = s_osd_ext_clone.ge2d_context; canvas_read(OSD1_CANVAS_INDEX, &cs); canvas_read(OSD3_CANVAS_INDEX, &cd); if (s_osd_ext_clone.pan == 1) { y0 = cs.height / 2; y1 = cd.height / 2; } if (s_osd_ext_clone.angle == 1) { xy_swap = 1; x_rev = 1; } else if (s_osd_ext_clone.angle == 2) { x_rev = 1; y_rev = 1; } else if (s_osd_ext_clone.angle == 3) { xy_swap = 1; y_rev = 1; } memset(ge2d_config, 0, sizeof(struct config_para_ex_s)); ge2d_config->alu_const_color = 0; ge2d_config->bitmask_en = 0; ge2d_config->src1_gb_alpha = 0; ge2d_config->dst_xy_swap = 0; ge2d_config->src_planes[0].addr = cs.addr; ge2d_config->src_planes[0].w = cs.width / 4; ge2d_config->src_planes[0].h = cs.height; ge2d_config->dst_planes[0].addr = cd.addr; ge2d_config->dst_planes[0].w = cd.width / 4; ge2d_config->dst_planes[0].h = cd.height; ge2d_config->src_para.canvas_index = OSD1_CANVAS_INDEX; ge2d_config->src_para.mem_type = CANVAS_OSD0; ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID; ge2d_config->dst_para.format = GE2D_FORMAT_S32_ARGB; ge2d_config->src_para.fill_color_en = 0; ge2d_config->src_para.fill_mode = 0; ge2d_config->src_para.x_rev = 0; ge2d_config->src_para.y_rev = 0; ge2d_config->src_para.color = 0xffffffff; ge2d_config->src_para.top = 0; ge2d_config->src_para.left = 0; ge2d_config->src_para.width = cs.width / 4; ge2d_config->src_para.height = cs.height; ge2d_config->dst_para.canvas_index = OSD3_CANVAS_INDEX; ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID; ge2d_config->dst_para.format = GE2D_FORMAT_S32_ARGB; ge2d_config->dst_para.top = 0; ge2d_config->dst_para.left = 0; ge2d_config->dst_para.width = cd.width / 4; ge2d_config->dst_para.height = cd.height; ge2d_config->dst_para.fill_color_en = 0; ge2d_config->dst_para.fill_mode = 0; ge2d_config->dst_para.color = 0; ge2d_config->dst_para.x_rev = x_rev; ge2d_config->dst_para.y_rev = y_rev; ge2d_config->dst_xy_swap = xy_swap; if (ge2d_context_config_ex(context, ge2d_config) < 0) { osd_log_err("++ osd clone ge2d config error.\n"); return; } stretchblt(context, x0, y0, cs.width / 4, cs.height / 2, x0, y1, cd.width / 4, cd.height / 2); }