Example #1
0
long disp_ioctl(void *hd, unsigned int cmd, void *arg)
{
	unsigned long karg[4];
	unsigned long ubuffer[4] = {0};
	s32 ret = 0;
	int num_screens = 2;
	struct disp_manager *mgr = NULL;
	struct disp_device *dispdev = NULL;
	struct disp_enhance *enhance = NULL;
	struct disp_smbl *smbl = NULL;
	struct disp_capture *cptr = NULL;

	num_screens = bsp_disp_feat_get_num_screens();

	if (copy_from_user((void*)karg,(void*)arg, 4*sizeof(unsigned long))) {
		__wrn("copy_from_user fail\n");
		return -1;
	}

	ubuffer[0] = *(unsigned long*)karg;
	ubuffer[1] = (*(unsigned long*)(karg+1));
	ubuffer[2] = (*(unsigned long*)(karg+2));
	ubuffer[3] = (*(unsigned long*)(karg+3));

	if(ubuffer[0] < num_screens)
		mgr = g_disp_drv.mgr[ubuffer[0]];
	if(mgr) {
		dispdev = mgr->device;
		enhance = mgr->enhance;
		smbl = mgr->smbl;
		cptr = mgr->cptr;
	}

	if(cmd < DISP_FB_REQUEST)	{
		if(ubuffer[0] >= num_screens) {
			__wrn("para err in disp_ioctl, cmd = 0x%x,screen id = %d\n", cmd, (int)ubuffer[0]);
			return -1;
		}
	}
	if(DISPLAY_DEEP_SLEEP == suspend_status) {
		__wrn("ioctl:%x fail when in suspend!\n", cmd);
		return -1;
	}

	if(cmd == disp_cmd_print) {
		//__wrn("cmd:0x%x,%ld,%ld\n",cmd, ubuffer[0], ubuffer[1]);
	}

	switch(cmd)	{
	//----disp global----
	case DISP_SET_BKCOLOR:
	{
		disp_color para;

		if(copy_from_user(&para, (void*)ubuffer[1],sizeof(disp_color)))	{
			__wrn("copy_from_user fail\n");
			return  -1;
		}
		if(mgr && (mgr->set_back_color != NULL))
			ret = mgr->set_back_color(mgr, &para);
		break;
	}

	case DISP_GET_OUTPUT_TYPE:
	{
		if(mgr && mgr->device)
			ret = mgr->device->type;
		break;
	}

	case DISP_GET_SCN_WIDTH:
	{
		unsigned int width = 0,height = 0;
		if(mgr && mgr->device && mgr->device->get_resolution) {
			mgr->device->get_resolution(mgr->device, &width, &height);
		}
		ret = width;
		break;
	}

	case DISP_GET_SCN_HEIGHT:
	{
		unsigned int width = 0,height = 0;
		if(mgr && mgr->device && mgr->device->get_resolution) {
			mgr->device->get_resolution(mgr->device, &width, &height);
		}
		ret = height;
		break;
	}

	case DISP_VSYNC_EVENT_EN:
	{
		ret = bsp_disp_vsync_event_enable(ubuffer[0], ubuffer[1]);
		break;
	}

	case DISP_SHADOW_PROTECT:
	{
		ret = bsp_disp_shadow_protect(ubuffer[0], ubuffer[1]);
		break;
	}

	case DISP_BLANK:
	{
		if(ubuffer[1]) {
			if(dispdev && dispdev->disable)
				ret = dispdev->disable(dispdev);
		} else {
			if(dispdev && dispdev->enable)
				ret = dispdev->enable(dispdev);
		}
		break;
	}

	case DISP_DEVICE_SWITCH:
	{
		if(ubuffer[1] == (unsigned long)DISP_OUTPUT_TYPE_LCD)
			ret = drv_lcd_enable(ubuffer[0]);
		else
			ret = bsp_disp_device_switch(ubuffer[0], (disp_output_type)ubuffer[1], (disp_tv_mode)ubuffer[2]);
		break;
	}

	//----layer----
	case DISP_LAYER_SET_CONFIG:
	{
		disp_layer_config para;

		if(copy_from_user(&para, (void *)ubuffer[1],sizeof(disp_layer_config)))	{
			__wrn("copy_from_user fail\n");
			return  -1;
		}
		if(mgr && mgr->set_layer_config)
			ret = mgr->set_layer_config(mgr, &para, ubuffer[2]);
		break;
	}

	case DISP_LAYER_GET_CONFIG:
	{
		disp_layer_config para;

		if(copy_from_user(&para, (void *)ubuffer[1],sizeof(disp_layer_config)))	{
			__wrn("copy_from_user fail\n");
			return  -1;
		}
		if(mgr && mgr->get_layer_config)
			ret = mgr->get_layer_config(mgr, &para, ubuffer[2]);
		if(copy_to_user(&para, (void *)ubuffer[1], sizeof(disp_layer_config)))	{
			__wrn("copy_to_user fail\n");
			return  -1;
		}
		break;
	}

	//----lcd----
	case DISP_LCD_SET_BRIGHTNESS:
	{
		if(dispdev && (DISP_OUTPUT_TYPE_LCD == dispdev->type)) {
			ret = dispdev->set_bright(dispdev, ubuffer[1]);
		}
		break;
	}

	case DISP_LCD_GET_BRIGHTNESS:
	{
		if(dispdev && (DISP_OUTPUT_TYPE_LCD == dispdev->type)) {
			ret = dispdev->get_bright(dispdev);
		}
		break;
	}


	case DISP_HDMI_GET_HPD_STATUS:
		if(DISPLAY_NORMAL == suspend_status) {
			ret = bsp_disp_hdmi_get_hpd_status(ubuffer[0]);
		}	else {
			ret = 0;
		}
		break;

	case DISP_HDMI_SUPPORT_MODE:
		ret = bsp_disp_hdmi_check_support_mode(ubuffer[0], ubuffer[1]);
		break;

	case DISP_TV_GET_HPD_STATUS:
		if(DISPLAY_NORMAL == suspend_status) {
			ret = bsp_disp_tv_get_hpd_status(ubuffer[0]);
		}	else {
			ret = 0;
		}
		break;

	case DISP_HDMI_GET_EDID:
	{
		u8 *buf;
		u32 bytes = 1024;

		ret = 0;
		buf = (u8*)bsp_disp_hdmi_get_edid(ubuffer[0]);
		if(buf) {
			bytes = (ubuffer[2] > bytes)?bytes:ubuffer[2];
			if(copy_to_user(buf, (void *)ubuffer[1], bytes)) {
				__wrn("copy_to_user fail\n");
			} else {
				ret = bytes;
			}
		}

		break;
	}

#if 0
	case DISP_CMD_HDMI_SET_SRC:
		ret = bsp_disp_hdmi_set_src(ubuffer[0], (disp_lcd_src)ubuffer[1]);
		break;

	//----framebuffer----
	case DISP_CMD_FB_REQUEST:
	{
		disp_fb_create_info para;

		if(copy_from_user(&para, (void *)ubuffer[1],sizeof(disp_fb_create_info))) {
			__wrn("copy_from_user fail\n");
			return  -1;
		}
		ret = Display_Fb_Request(ubuffer[0], &para);
		break;
	}

	case DISP_CMD_FB_RELEASE:
	ret = Display_Fb_Release(ubuffer[0]);
	break;

	case DISP_CMD_FB_GET_PARA:
	{
		disp_fb_create_info para;

		ret = Display_Fb_get_para(ubuffer[0], &para);
		if(copy_to_user((void *)ubuffer[1],&para, sizeof(disp_fb_create_info))) {
			__wrn("copy_to_user fail\n");
			return  -1;
		}
		break;
	}

	case DISP_CMD_GET_DISP_INIT_PARA:
	{
		disp_init_para para;

		ret = Display_get_disp_init_para(&para);
		if(copy_to_user((void *)ubuffer[0],&para, sizeof(disp_init_para)))	{
			__wrn("copy_to_user fail\n");
			return  -1;
		}
		break;
	}

#endif
		//----enhance----
	case DISP_ENHANCE_ENABLE:
	{
		if(enhance && enhance->enable)
			ret = enhance->enable(enhance);
		break;
	}

	case DISP_ENHANCE_DISABLE:
	{
		if(enhance && enhance->disable)
			ret = enhance->disable(enhance);
		break;
	}

	//---smart backlight --
	case DISP_SMBL_ENABLE:
	{
		if(smbl && smbl->enable)
			ret = smbl->enable(smbl);
		break;
	}

	case DISP_SMBL_DISABLE:
	{
		if(smbl && smbl->disable)
			ret = smbl->disable(smbl);
		break;
	}

	case DISP_SMBL_SET_WINDOW:
	{
		disp_rect rect;

		if(copy_from_user(&rect, (void *)ubuffer[1],sizeof(disp_rect)))	{
			__wrn("copy_from_user fail\n");
			return  -1;
		}
		if(smbl && smbl->set_window)
			ret = smbl->set_window(smbl, &rect);
		break;
	}

	//---capture --
	case DISP_CAPTURE_START:
	{
		if(cptr && cptr->start)
			ret = cptr->start(cptr);
		break;
	}

	case DISP_CAPTURE_STOP:
	{
		if(cptr && cptr->stop)
			ret = cptr->stop(cptr);
		break;
	}

	case DISP_CAPTURE_COMMIT:
	{
		disp_capture_info info;

		if(copy_from_user(&info, (void *)ubuffer[1],sizeof(disp_capture_info)))	{
			__wrn("copy_from_user fail\n");
			return  -1;
		}
		if(cptr && cptr->commmit)
			ret = cptr->commmit(cptr, &info);
		break;
	}

#if defined(CONFIG_ARCH_SUN9IW1P1)

#if 0
	//----for test----
	case DISP_CMD_MEM_REQUEST:
		ret =  disp_mem_request(ubuffer[0],ubuffer[1]);
		break;

	case DISP_CMD_MEM_RELEASE:
		ret =  disp_mem_release(ubuffer[0]);
		break;

	case DISP_CMD_MEM_SELIDX:
		g_disp_mm_sel = ubuffer[0];
		break;

	case DISP_CMD_MEM_GETADR:
		ret = g_disp_mm[ubuffer[0]].mem_start;
		break;

//	case DISP_CMD_PRINT_REG:
//		ret = bsp_disp_print_reg(1, ubuffer[0], 0);
//		break;
#endif
#endif

	case DISP_SET_EXIT_MODE:
        ret = g_disp_drv.exit_mode = ubuffer[0];
		break;

	case DISP_LCD_CHECK_OPEN_FINISH:
		ret = drv_lcd_check_open_finished(ubuffer[0]);
		break;

	case DISP_LCD_CHECK_CLOSE_FINISH:
		ret = drv_lcd_check_close_finished(ubuffer[0]);
		break;

	default:
		break;
	}

  return ret;
}
Example #2
0
static void dispdbg_process(void)
{
	int start = simple_strtoul(dispdbg_priv.start,NULL,0);
	if(start != 1)
		return ;

	if(!strncmp(dispdbg_priv.name,"layer",5)) {
		char *p = dispdbg_priv.name + 5;
		int disp,chan,id;
		struct disp_layer *lyr = NULL;

		printk("%s,%s\n", dispdbg_priv.command, dispdbg_priv.name);

		disp = (unsigned int)simple_strtoul(p, &p, 10);
		p++;
		chan = (unsigned int)simple_strtoul(p, &p, 10);
		p++;
		id = (unsigned int)simple_strtoul(p, &p, 10);
		lyr = disp_get_layer(disp, chan, id);
		if(NULL == lyr) {
			sprintf(dispdbg_priv.info,"get %s fail!", dispdbg_priv.name);
			return ;
		}
		if(!strncmp(dispdbg_priv.command,"enable",6)) {
			//lyr->enable(lyr);
		} else if(!strncmp(dispdbg_priv.command,"disable",7)) {
			//lyr->disable(lyr);
		} else if(!strncmp(dispdbg_priv.command,"getinfo",7)) {
			lyr->dump(lyr, dispdbg_priv.info);
		} else {
			sprintf(dispdbg_priv.info,"not support command for %s!", dispdbg_priv.name);
			return ;
		}
	} else if(!strncmp(dispdbg_priv.name,"lcd",3)) {
		char *p = dispdbg_priv.name + 3;
		int disp;
		struct disp_device *lcd = NULL;

		disp = (unsigned int)simple_strtoul(p, &p, 10);
		lcd = disp_get_lcd(disp);
		if(NULL == lcd) {
			sprintf(dispdbg_priv.info,"get %s fail!", dispdbg_priv.name);
			return ;
		}
		if(!strncmp(dispdbg_priv.command,"enable",6)) {
			lcd->enable(lcd);
		} else if(!strncmp(dispdbg_priv.command,"disable",7)) {
			lcd->disable(lcd);
		} else if(!strncmp(dispdbg_priv.command,"setbl",6)) {
			int bl = (unsigned int)simple_strtoul(dispdbg_priv.param, NULL, 10);
			if(lcd->set_bright)
				lcd->set_bright(lcd, bl);
			else
				sprintf(dispdbg_priv.info,"set lcd%d backlight fail", disp);
		} else if(!strncmp(dispdbg_priv.command,"getbl",5)) {
		int bl;
			if(lcd->get_bright) {
				bl = lcd->get_bright(lcd);
				sprintf(dispdbg_priv.info,"%d", bl);
			} else
				sprintf(dispdbg_priv.info,"get lcd%d backlight fail", disp);
		} else {
				sprintf(dispdbg_priv.info,"not support command for %s!", dispdbg_priv.name);
				return ;
		}
	}	else if(!strncmp(dispdbg_priv.name,"disp",4)) {
		char *p = dispdbg_priv.name + 4;
		int disp;
		char* next;
		char* tosearch;
		struct disp_manager *mgr = NULL;

		disp = (unsigned int)simple_strtoul(p, &p, 10);
		mgr = disp_get_layer_manager(disp);
		if(NULL == mgr) {
			sprintf(dispdbg_priv.info,"get %s fail!", dispdbg_priv.name);
			return ;
		}
		if(!strncmp(dispdbg_priv.command,"getinfo",7)) {
			mgr->dump(mgr, dispdbg_priv.info);
		} else if(!strncmp(dispdbg_priv.command,"switch",6)) {
			u32 type,mode;
			tosearch = dispdbg_priv.param;
			next = strsep(&tosearch, " ");
			type = simple_strtoul(next,NULL,0);
			next = strsep(&tosearch, " ");
			mode = simple_strtoul(next,NULL,0);
			printk("disp %d, type %d, mode%d\n", disp, type, mode);
			bsp_disp_device_switch(disp, type, mode);
		} else if(!strncmp(dispdbg_priv.command,"blank",5)) {
			u32 level;
			struct disp_device *dispdev = mgr->device;

			if(NULL == dispdev) {
				sprintf(dispdbg_priv.info,"get device fail for disp %d!", disp);
				return ;
			}

			level = simple_strtoul(dispdbg_priv.param,NULL,0);
			printk("disp %d, blank%d\n", disp, level);
			if(0 == level)
				dispdev->enable(dispdev);
			else
				dispdev->disable(dispdev);
		} else if(!strncmp(dispdbg_priv.command,"getxres",7)) {
			u32 width, height;
			struct disp_device *dispdev = mgr->device;

			if(NULL == dispdev) {
				sprintf(dispdbg_priv.info,"get device fail for disp %d!", disp);
				return ;
			}
			dispdev->get_resolution(dispdev, &width, &height);

			sprintf(dispdbg_priv.info,"%d", width);
		} else if(!strncmp(dispdbg_priv.command,"getyres",7)) {
			u32 width, height;
			struct disp_device *dispdev = mgr->device;

			if(NULL == dispdev) {
				sprintf(dispdbg_priv.info,"get device fail for disp %d!", disp);
				return ;
			}
			dispdev->get_resolution(dispdev, &width, &height);

			sprintf(dispdbg_priv.info,"%d", height);
		}  else if(!strncmp(dispdbg_priv.command,"getfps",6)) {
			u32 fps = bsp_disp_get_fps(disp);
			u32 count = 0;

			count = sprintf(dispdbg_priv.info,"device:%d.%d fps\n", fps/10, fps%10);
			composer_dump(dispdbg_priv.info+count);
		} 
#if defined(SUPPORT_TV)
		else if(!strncmp(dispdbg_priv.command,"suspend",7)) {
			//dispdev = disp_device_get(dispdev, DISP_OUTPUT_TYPE_TV);
			if(mgr->device) {
				if((DISP_OUTPUT_TYPE_TV == mgr->device->type)) {
				disp_tv_suspend(mgr->device);
				}
			
			}

		} else if(!strncmp(dispdbg_priv.command,"resume",6)) {
			//dispdev = disp_device_get(dispdev, DISP_OUTPUT_TYPE_TV);
			if(mgr->device) {
				if((DISP_OUTPUT_TYPE_TV == mgr->device->type)) {
					disp_tv_resume(mgr->device);
				}
			}

		}
#endif	
		else {
			sprintf(dispdbg_priv.info,"not support command for %s!", dispdbg_priv.name);
			return ;
		}
	}
	else if(!strncmp(dispdbg_priv.name,"enhance",7)) {
		char *p = dispdbg_priv.name + 7;
		int disp;
		char* next;
		char* tosearch;
		struct disp_manager *mgr = NULL;
		struct disp_enhance *enhance = NULL;
		disp_enhance_para para;

		memset(&para, 0, sizeof(disp_enhance_para));
		disp = (unsigned int)simple_strtoul(p, &p, 10);
		mgr = disp_get_layer_manager(disp);
		if(NULL == mgr) {
			sprintf(dispdbg_priv.info,"get %s fail!", dispdbg_priv.name);
			return ;
		}
		enhance = mgr->enhance;
		if(NULL == enhance) {
			sprintf(dispdbg_priv.info,"get %s fail!", dispdbg_priv.name);
			return ;
		}
		if(!strncmp(dispdbg_priv.command,"setinfo",7)) {
			/* en */
			tosearch = dispdbg_priv.param;
			next = strsep(&tosearch, " ");
			para.enable = simple_strtoul(next,NULL,0);

			/* mode */
			next = strsep(&tosearch, " ");
			para.mode = simple_strtoul(next,NULL,0);

			/* bright/contrast/saturation/hue */
			next = strsep(&tosearch, " ");
			para.bright = simple_strtoul(next,NULL,0);
			next = strsep(&tosearch, " ");
			para.contrast = simple_strtoul(next,NULL,0);
			next = strsep(&tosearch, " ");
			para.saturation = simple_strtoul(next,NULL,0);
			next = strsep(&tosearch, " ");
			para.hue = simple_strtoul(next,NULL,0);

			/* sharp */
			next = strsep(&tosearch, " ");
			para.sharp = simple_strtoul(next,NULL,0);

			/* auto color */
			next = strsep(&tosearch, " ");
			para.auto_contrast = simple_strtoul(next,NULL,0);
			next = strsep(&tosearch, " ");
			para.auto_color = simple_strtoul(next,NULL,0);

			/* fancycolor */
			next = strsep(&tosearch, " ");
			para.fancycolor_red = simple_strtoul(next,NULL,0);
			next = strsep(&tosearch, " ");
			para.fancycolor_green = simple_strtoul(next,NULL,0);
			next = strsep(&tosearch, " ");
			para.fancycolor_blue = simple_strtoul(next,NULL,0);

			/* window */
			next = strsep(&tosearch, " ");
			if(!strncmp(next,"win",3)) {
				next = strsep(&tosearch, " ");
				para.window.x = simple_strtoul(next,NULL,0);
				next = strsep(&tosearch, " ");
				para.window.y = simple_strtoul(next,NULL,0);
				next = strsep(&tosearch, " ");
				para.window.width = simple_strtoul(next,NULL,0);
				next = strsep(&tosearch, " ");
				para.window.height = simple_strtoul(next,NULL,0);
			}
			printk("enhance %d, en(%d), mode(%d), bcsh(%d,%d,%d,%d), sharp(%d), autocolor(%d,%d), fancycolor(%d,%d,%d)\n",
				disp, para.enable, para.mode, para.bright, para.contrast, para.saturation,
				para.hue, para.sharp, para.auto_contrast, para.auto_color,
				para.fancycolor_red, para.fancycolor_green, para.fancycolor_blue);
			enhance->set_para(enhance, &para);
		}  else if(!strncmp(dispdbg_priv.command,"getinfo",7)) {
			if(enhance->dump)
				enhance->dump(enhance, dispdbg_priv.info);
		} else {
			sprintf(dispdbg_priv.info,"not support command for %s!", dispdbg_priv.name);
			return ;
		}
	}
	else if(!strncmp(dispdbg_priv.name,"smbl",4)) {
		char *p = dispdbg_priv.name + 4;
		int disp;
		struct disp_manager *mgr = NULL;
		struct disp_smbl *smbl = NULL;

		disp = (unsigned int)simple_strtoul(p, &p, 10);
		mgr = disp_get_layer_manager(disp);
		if(NULL == mgr) {
			sprintf(dispdbg_priv.info,"get %s fail!", dispdbg_priv.name);
			return ;
		}
		smbl = mgr->smbl;
		if(NULL == smbl) {
			sprintf(dispdbg_priv.info,"get %s fail!", dispdbg_priv.name);
			return ;
		}
		if(!strncmp(dispdbg_priv.command,"setinfo",7)) {

		} else if(!strncmp(dispdbg_priv.command,"getinfo",7)) {
			if(smbl->dump)
				smbl->dump(smbl, dispdbg_priv.info);
		} else {
			sprintf(dispdbg_priv.info,"not support command for %s!", dispdbg_priv.name);
			return ;
		}
	} else if(!strncmp(dispdbg_priv.name,"hdmi",4)) {
		char *p = dispdbg_priv.name + 4;
		int disp;
		unsigned int mode;

		disp = (unsigned int)simple_strtoul(p, &p, 10);
		if(!strncmp(dispdbg_priv.command,"is_support",10)) {
			int is_support = 0;
			mode = (unsigned int)simple_strtoul(dispdbg_priv.param, NULL, 10);
			is_support = bsp_disp_hdmi_check_support_mode(disp, (disp_tv_mode)mode);
			sprintf(dispdbg_priv.info,"%d", is_support);
		} else {
			sprintf(dispdbg_priv.info,"not support command for %s!", dispdbg_priv.name);
			return ;
		}
	}
}