static long fbconfig_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret = 0; void __user *argp = (void __user *)arg; DISP_DRV_WRAN("sxk=>run in fbconfig_ioctl**\n"); switch (cmd) { case LCM_GET_ID: { /* get_lcm_id() need implemented in lcm driver ... */ #if 0 LCM_DRIVER *lcm = lcm_drv; unsigned int lcm_id = lcm->get_lcm_id(); #else unsigned int lcm_id = 0; #endif return copy_to_user(argp, &lcm_id, sizeof(lcm_id)) ? -EFAULT : 0; } case LCM_GET_DSI_CONTINU: { int ret; if (fbconfig_if_drv->set_spread_frequency) ret = fbconfig_if_drv->set_spread_frequency(10); DISP_DRV_WRAN("fbconfig=>LCM_GET_DSI_CONTINU:%d\n", ret); return copy_to_user(argp, &ret, sizeof(ret)) ? -EFAULT : 0; } case LCM_TEST_DSI_CLK: { LCM_TYPE_FB lcm_fb; lcm_fb.clock = lcm_params->dsi.PLL_CLOCK; lcm_fb.lcm_type = lcm_params->dsi.mode; DISP_DRV_WRAN("fbconfig=>LCM_TEST_DSI_CLK:%d\n", ret); return copy_to_user(argp, &lcm_fb, sizeof(lcm_fb)) ? -EFAULT : 0; } case LCM_GET_DSI_CLK: { int ret; if (fbconfig_if_drv->set_spread_frequency) ret = fbconfig_if_drv->set_spread_frequency(11); DISP_DRV_WRAN("fbconfig=>LCM_GET_DSI_CLK:%d\n", ret); return copy_to_user(argp, &ret, sizeof(ret)) ? -EFAULT : 0; } case LCM_GET_DSI_CLK_V2: { unsigned int ret = 0; MIPI_CLK_V2 clock_v2; if (fbconfig_if_drv->set_spread_frequency) ret = fbconfig_if_drv->set_spread_frequency(11); clock_v2.div1 = ret & 0x00000600; clock_v2.div2 = ret & 0x00000180; clock_v2.fbk_div = ret & 0x0000007F; return copy_to_user(argp, &clock_v2, sizeof(clock_v2)) ? -EFAULT : 0; } case LCM_GET_DSI_SSC: { int ret; if (fbconfig_if_drv->set_spread_frequency) ret = fbconfig_if_drv->set_spread_frequency(9); DISP_DRV_WRAN("fbconfig=>LCM_GET_DSI_SSC:%d\n", ret); return copy_to_user(argp, &ret, sizeof(ret)) ? -EFAULT : 0; } case LCM_GET_DSI_LANE_NUM: { int ret; if (fbconfig_if_drv->set_spread_frequency) ret = fbconfig_if_drv->set_spread_frequency(12); DISP_DRV_WRAN("fbconfig=>LCM_GET_DSI_LANE_NUM:%d\n", ret); return copy_to_user(argp, &ret, sizeof(ret)) ? -EFAULT : 0; } case LCM_GET_DSI_TE: { int ret; if (fbconfig_if_drv->set_spread_frequency) ret = fbconfig_if_drv->set_spread_frequency(13); DISP_DRV_WRAN("fbconfig=>LCM_GET_DSI_TE:%d\n", ret); return copy_to_user(argp, &ret, sizeof(ret)) ? -EFAULT : 0; } case LCM_GET_DSI_TIMING: { int ret = 0; MIPI_TIMING timing; if (copy_from_user(&timing, (void __user *)argp, sizeof(timing))) { DISP_DRV_WRAN("[MIPI_SET_TIMING]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } if (fbconfig_if_drv->set_spread_frequency) ret = fbconfig_if_drv->set_spread_frequency(100 + timing.type); DISP_DRV_WRAN("fbconfig=>LCM_GET_DSI_TIMING:%d\n", ret); timing.value = ret; return copy_to_user(argp, &timing, sizeof(timing)) ? -EFAULT : 0; } case DRIVER_IC_CONFIG: { DISP_DRV_WRAN("sxk=>run in case:DRIVER_IC_CONFIG**\n"); if (record_list_initialed == 0) { record_list_init(); if (copy_from_user(record_head, (void __user *)arg, sizeof(CONFIG_RECORD))) { DISP_DRV_WRAN("sxk=>copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } #if 0 print_record(record_head); #endif record_list_initialed = 1; } else { if (copy_from_user(record_tmp, (void __user *)arg, sizeof(CONFIG_RECORD))) { DISP_DRV_WRAN("[DRIVER_IC_CONFIG]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } #if 0 /* FBCONFIG_DEBUG */ DISP_DRV_WRAN("sxk=>will print before add to list\n"); print_record(record_tmp); #endif record_list_add(); /* add new node to list ; */ } return 0; } case MIPI_SET_CLK: { unsigned int clk; if (copy_from_user(&clk, (void __user *)argp, sizeof(clk))) { DISP_DRV_WRAN("[MIPI_SET_CLK]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } else { fbconfig_disp_set_mipi_clk(clk); } return 0; } case MIPI_SET_CLK_V2: { MIPI_CLK_V2 clk; if (copy_from_user(&clk, (void __user *)argp, sizeof(clk))) { DISP_DRV_WRAN("[MIPI_SET_CLK]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } else { unsigned int clk_v2 = 0; /* div1_2bits div2_2bits fbk_div_7bits */ clk_v2 = (clk.div1 << 9) | (clk.div2 << 7) | clk.fbk_div; fbconfig_disp_set_mipi_clk(clk_v2); } return 0; } case MIPI_SET_SSC: { unsigned int ssc; DISP_DRV_WRAN("sxk=>debug.c call set mipi ssc line:%d\n", __LINE__); if (copy_from_user(&ssc, (void __user *)argp, sizeof(ssc))) { DISP_DRV_WRAN("[MIPI_SET_SSC]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } else { DISP_DRV_WRAN("sxk=>debug.c call set mipi ssc line:%d\n", __LINE__); fbconfig_disp_set_mipi_ssc(ssc); } return 0; } case MIPI_SET_LANE: { unsigned int lane_num; if (copy_from_user(&lane_num, (void __user *)argp, sizeof(lane_num))) { DISP_DRV_WRAN("[MIPI_SET_LANE]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } else { fbconfig_disp_set_mipi_lane_num(lane_num); } return 0; } case MIPI_SET_TIMING: { if (!is_early_suspended) { MIPI_TIMING timing; if (copy_from_user(&timing, (void __user *)argp, sizeof(timing))) { DISP_DRV_WRAN("[MIPI_SET_TIMING]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } else { fbconfig_disp_set_mipi_timing(timing); } return 0; } else return -EFAULT; } case TE_SET_ENABLE: { char enable; if (copy_from_user(&enable, (void __user *)argp, sizeof(enable))) { DISP_DRV_WRAN("[TE_SET_ENABLE]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } else { if (fbconfig_if_drv->set_te_enable) fbconfig_if_drv->set_te_enable(enable); } return 0; } case FB_LAYER_GET_EN: { FBCONFIG_LAYER_INFO layers; fbconfig_get_layer_info(&layers); return copy_to_user(argp, &layers, sizeof(layers)) ? -EFAULT : 0; } case FB_LAYER_GET_SIZE: { LAYER_H_SIZE tmp; int layer_size, enable, height, fmt; if (copy_from_user(&tmp, (void __user *)argp, sizeof(LAYER_H_SIZE))) { DISP_DRV_WRAN("[TE_SET_ENABLE]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } global_layer_id = tmp.height; DISP_DRV_WRAN("sxk==>global_layer_id is %d\n", global_layer_id); fbconfig_get_layer_height(global_layer_id, &layer_size, &enable, &height, &fmt); if ((layer_size == 0) || (enable == 0) || (height == 0)) return -2; else { tmp.height = height; tmp.layer_size = layer_size; tmp.fmt = DP_COLOR_BITS_PER_PIXEL(fmt); return copy_to_user(argp, &tmp, sizeof(tmp)) ? -EFAULT : 0; } } case FB_LAYER_DUMP: { int layer_size, enable; int ret = 0; unsigned int kva = 0; unsigned int mapped_size = 0; unsigned int mva = fbconfig_get_layer_vaddr(global_layer_id, &layer_size, &enable); if ((layer_size != 0) && (enable != 0)) { DISP_DRV_WRAN("sxk==>FB_LAYER_DUMP==>layer_size is %d mva is 0x%x\n", layer_size, mva); m4u_mva_map_kernel(mva, layer_size, 0, &kva, &mapped_size); DISP_DRV_WRAN("sxk==> addr from user space is 0x%x\n", (unsigned int)argp); DISP_DRV_WRAN("sxk==> kva is 0x%x mmaped size is %d\n", kva, mapped_size); ret = copy_to_user(argp, (void *)kva, mapped_size) ? -EFAULT : 0; m4u_mva_unmap_kernel(mva, mapped_size, kva); return ret; } else return -2; } case MIPI_SET_CC: { int enable; if (copy_from_user(&enable, (void __user *)argp, sizeof(enable))) { DISP_DRV_WRAN("[MIPI_SET_CC]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } else { if (fbconfig_if_drv->set_continuous_clock) fbconfig_if_drv->set_continuous_clock(enable); } return 0; } case LCM_GET_ESD: { ESD_PARA esd_para; int i = 0; if (copy_from_user(&esd_para, (void __user *)arg, sizeof(esd_para))) { DISP_DRV_WRAN("[LCM_GET_ESD]: copy_from_user failed! line:%d\n", __LINE__); return -EFAULT; } esd_check_addr = esd_para.addr; esd_check_para_num = esd_para.para_num; ret = fbconfig_get_esd_check(); if ((ret != 0) && (esd_check_buffer != NULL)) { kfree(esd_check_buffer); return -2; } else { for (i = 0; i < esd_check_para_num + 6; i++) DISP_DRV_WRAN("sxk=>%s, esd_check_buffer[%d]=0x%x\n", __func__, i, esd_check_buffer[i]); return 0; } } case LCM_GET_ESD_RET: { ret = (copy_to_user(argp, (void *)esd_check_buffer, sizeof(char) * (esd_check_para_num + 6)) ? -EFAULT : 0); if (esd_check_buffer != NULL) { kfree(esd_check_buffer); esd_check_buffer = NULL; } return ret; } case DRIVER_IC_RESET: { fbconfig_reset_lcm_setting(); fbconfig_free_backup_setting(); return 0; } default: return ret; } }
int fmt_bpp(DpColorFormat fmt) { return DP_COLOR_BITS_PER_PIXEL(fmt)/4; }
int disp_draw_num(unsigned long va, /* dst buf va */ unsigned int x, /* x offset (pixel) */ unsigned int y, /* y offset */ unsigned int pitch, /* dst pitch */ DpColorFormat fmt, /* dst buf format */ unsigned int number, /* data_digit number */ unsigned int alpha_en, /* transparent */ unsigned int color_argb) /* background oqupa or not */ { unsigned int h = 0; unsigned int w = 0; unsigned int bpp = 0; unsigned int num_offset = 0; unsigned int len = 0; unsigned int i = 0; unsigned int num[20] = { 0 }; unsigned int value; if (DP_COLOR_BITS_PER_PIXEL(fmt) != 32 && DP_COLOR_BITS_PER_PIXEL(fmt) != 24) { DDPERR(" only support ARGB / RGB888 now !\n "); return -1; } bpp = DP_COLOR_BITS_PER_PIXEL(fmt) / 8; do { if (len >= 20 || DISP_DIGIT_W * (len + 1) > pitch / bpp - x) { /* len to long or buf width too short */ DDPERR(" number too big for dst buf !\n "); break; } num[len++] = number % 10; number = number / 10; } while (number > 0); for (i = 0; i < len; i++) { num_offset = DISP_DIGIT_W * DISP_DIGIT_H / 8 * num[len - i - 1]; for (h = 0; h < DISP_DIGIT_H; h++) { /* DDPMSG(" h = %d, value = 0x%x.\n ", h, value); */ for (w = 0; w < DISP_DIGIT_W; w++) { value = (unsigned int)data_digit[num_offset + (h * DISP_DIGIT_W + w) / 8]; if (bpp == 4) { if ((value & 0xff & (1 << (7 - (w % 8)))) == 0) *(unsigned int *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp) = color_argb; else if (alpha_en == 0) *(unsigned int *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp) = 0xffffffff; /* DDPMSG(" w = %d, of = %d.\n ", w, h*pitch+w*bpp+y*pitch+x*bpp+i*DISP_DIGIT_W*bpp); */ } else if (bpp == 3) { if ((value & 0xff & (1 << (7 - (w % 8)))) == 0) { *(unsigned char *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp) = (unsigned char)(color_argb & 0xff); *(unsigned char *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp + 1) = (unsigned char)((color_argb >> 8) & 0xff); *(unsigned char *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp + 2) = (unsigned char)((color_argb >> 16) & 0xff); } else if (alpha_en == 0) { *(unsigned int *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp) = 0xff; *(unsigned int *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp + 1) = 0xff; *(unsigned int *)(va + h * pitch + w * bpp + y * pitch + x * bpp + i * DISP_DIGIT_W * bpp + 2) = 0xff; } } } }