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(¶, (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, ¶); 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(¶, (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, ¶, ubuffer[2]); break; } case DISP_LAYER_GET_CONFIG: { disp_layer_config para; if(copy_from_user(¶, (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, ¶, ubuffer[2]); if(copy_to_user(¶, (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(¶, (void *)ubuffer[1],sizeof(disp_fb_create_info))) { __wrn("copy_from_user fail\n"); return -1; } ret = Display_Fb_Request(ubuffer[0], ¶); 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], ¶); if(copy_to_user((void *)ubuffer[1],¶, 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(¶); if(copy_to_user((void *)ubuffer[0],¶, 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; }
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(¶, 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, ¶); } 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 ; } } }