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;
}
Example #3
0
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;
					}
				}
			}
		}