⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xf86dmc.c

📁 一份介绍在S3C2410上液晶屏驱动程序的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
	set_1_pkt_calib_dat(&p->x01,priv->calib_data[1]);	set_1_pkt_calib_dat(&p->x02,priv->calib_data[2]);	set_1_pkt_calib_dat(&p->x10,priv->calib_data[3]);	set_1_pkt_calib_dat(&p->x11,priv->calib_data[4]);	set_1_pkt_calib_dat(&p->x12,priv->calib_data[5]);	set_1_pkt_calib_dat(&p->x20,priv->calib_data[6]);	set_1_pkt_calib_dat(&p->x21,priv->calib_data[7]);	set_1_pkt_calib_dat(&p->x22,priv->calib_data[8]);	p->max_x = 1024;	p->max_y = 768;	adj_pkt_calib_dat(true,p,priv->max_x,priv->max_y);	cnv_lowhigh_calib_dat(true,p);	k = sizeof(Pkt_W_EEPROM) + 1;	if( priv->usb_dev )	{		res = ioctl(priv->fd,USBDMC_WRITE_EEPROM,p) == -1 ? false : true;	}	else	{		res = exec_cmd_send(priv,s,k,true);	}	asleep(priv,2);	#if LOG_PROM_WR		if( res )			disp_calib_data(priv,"write_eeprom",priv->calib_data);		else			xf86Msg(0, "DMC : write_eeprom Error\n");	#endif	return( res );#endif}static void set_1_pkt_calib_dat(Pkt_Calib *p,u_int dat[]){	p->rawx = (u_short)dat[0];	p->rawy = (u_short)dat[1];	p->refx = (u_short)dat[2];	p->refy = (u_short)dat[3];}static void adj_pkt_calib_dat(Bool write_exec,void *top,int max_x,int max_y){Pkt_W_EEPROM *wp;Pkt_R_EEPROM *rp;short wx,nmax_x,x0,fx,mx,ex,a;short wy,nmax_y,y0,fy,my,ey;char s[300];	if( write_exec )	{		wp = (Pkt_W_EEPROM *)top;		wx = max_x;		wy = max_y;		nmax_x = wp->max_x;		nmax_y = wp->max_y;		fx = wp->x00.refx;		ex = nmax_x - fx;		mx = nmax_x / 2;		fy = wp->x00.refy;		ey = nmax_y - fy;		my = nmax_y / 2;		wp->x00.refx = fx; wp->x00.refy = fy;		wp->x01.refx = mx; wp->x01.refy = fy;		wp->x02.refx = ex; wp->x02.refy = fy;		wp->x10.refx = fx; wp->x10.refy = my;		wp->x11.refx = mx; wp->x11.refy = my;		wp->x12.refx = ex; wp->x12.refy = my;		wp->x20.refx = fx; wp->x20.refy = ey;		wp->x21.refx = mx; wp->x21.refy = ey;		wp->x22.refx = ex; wp->x22.refy = ey;		//x00		adj_1_pkt_calib_dat(&wp->x00.rawx,false,&wp->x01.rawx,fx,wx,nmax_x);		adj_1_pkt_calib_dat(&wp->x00.rawy,false,&wp->x10.rawy,fy,wy,nmax_y);		//x01		adj_1_pkt_calib_dat(&wp->x01.rawy,false,&wp->x11.rawy,fy,wy,nmax_y);		//x02		adj_1_pkt_calib_dat(&wp->x02.rawx,true ,&wp->x01.rawx,fx,wx,nmax_x);		adj_1_pkt_calib_dat(&wp->x02.rawy,false,&wp->x12.rawy,fy,wy,nmax_y);		//x10		adj_1_pkt_calib_dat(&wp->x10.rawx,false,&wp->x11.rawx,fx,wx,nmax_x);		//x11		//x12		adj_1_pkt_calib_dat(&wp->x12.rawx,true ,&wp->x11.rawx,fx,wx,nmax_x);		//x20		adj_1_pkt_calib_dat(&wp->x20.rawx,false,&wp->x21.rawx,fx,wx,nmax_x);		adj_1_pkt_calib_dat(&wp->x20.rawy,true ,&wp->x10.rawy,fy,wy,nmax_y);		//x21		adj_1_pkt_calib_dat(&wp->x21.rawy,true ,&wp->x11.rawy,fy,wy,nmax_y);		//x22		adj_1_pkt_calib_dat(&wp->x22.rawx,true ,&wp->x21.rawx,fx,wx,nmax_x);		adj_1_pkt_calib_dat(&wp->x22.rawy,true ,&wp->x12.rawy,fy,wy,nmax_y);		//		wp->max_x -= 1;		wp->max_y -= 1;	}	else	{		memcpy(s,top,sizeof(Pkt_R_EEPROM));		cnv_lowhigh_calib_dat(false,s);		rp = (Pkt_R_EEPROM *)s;		if( rp->max_x != (max_x-1) || rp->max_y != (max_y-1) )		{			wx = rp->max_x + 1;			wy = rp->max_y + 1;			nmax_x = max_x;			nmax_y = max_y;			fx = rp->x00.refx;			ex = nmax_x - fx;			mx = nmax_x / 2;			fy = rp->x00.refy;			ey = nmax_y - fy;			my = nmax_y / 2;			rp->x00.refx = fx; rp->x00.refy = fy;			rp->x01.refx = mx; rp->x01.refy = fy;			rp->x02.refx = ex; rp->x02.refy = fy;			rp->x10.refx = fx; rp->x10.refy = my;			rp->x11.refx = mx; rp->x11.refy = my;			rp->x12.refx = ex; rp->x12.refy = my;			rp->x20.refx = fx; rp->x20.refy = ey;			rp->x21.refx = mx; rp->x21.refy = ey;			rp->x22.refx = ex; rp->x22.refy = ey;			//x00			adj_1_pkt_calib_dat(&rp->x00.rawx,false,&rp->x01.rawx,fx,wx,nmax_x);			adj_1_pkt_calib_dat(&rp->x00.rawy,false,&rp->x10.rawy,fy,wy,nmax_y);			//x01			adj_1_pkt_calib_dat(&rp->x01.rawy,false,&rp->x11.rawy,fy,wy,nmax_y);			//x02			adj_1_pkt_calib_dat(&rp->x02.rawx,true ,&rp->x01.rawx,fx,wx,nmax_x);			adj_1_pkt_calib_dat(&rp->x02.rawy,false,&rp->x12.rawy,fy,wy,nmax_y);			//x10			adj_1_pkt_calib_dat(&rp->x10.rawx,false,&rp->x11.rawx,fx,wx,nmax_x);			//x11			//x12			adj_1_pkt_calib_dat(&rp->x12.rawx,true ,&rp->x11.rawx,fx,wx,nmax_x);			//x20			adj_1_pkt_calib_dat(&rp->x20.rawx,false,&rp->x21.rawx,fx,wx,nmax_x);			adj_1_pkt_calib_dat(&rp->x20.rawy,true ,&rp->x10.rawy,fy,wy,nmax_y);			//x21			adj_1_pkt_calib_dat(&rp->x21.rawy,true ,&rp->x11.rawy,fy,wy,nmax_y);			//x22			adj_1_pkt_calib_dat(&rp->x22.rawx,true ,&rp->x21.rawx,fx,wx,nmax_x);			adj_1_pkt_calib_dat(&rp->x22.rawy,true ,&rp->x12.rawy,fy,wy,nmax_y);			//			rp->max_x = (short)nmax_x;			rp->max_y = (short)nmax_y;		}		else		{			rp->max_x = (short)max_x;			rp->max_y = (short)max_y;		}		cnv_lowhigh_calib_dat(false,s);		memcpy(top,s,sizeof(Pkt_R_EEPROM));	}}static void adj_1_pkt_calib_dat(u_short *st,int plus,u_short *ed							,int def,u_short omax,u_short nmax){float fraw,fref,fa,fdef;	//	fdef = def;	if( plus )		fraw = *st - *ed;	else		fraw = *ed - *st;	fref = (omax - (fdef*2)) / 2;	fa = ((fraw / fref) * omax);	//	fraw = fa / nmax;	fref = (nmax - (fdef*2)) / 2;	//	if( plus )		*st = *ed + (fref * fraw);	else		*st = *ed - (fref * fraw);}static void cnv_lowhigh_calib_dat(Bool write_exec,void *top){Pkt_W_EEPROM *wp;Pkt_R_EEPROM *rp;	if( write_exec )	{		wp = (Pkt_W_EEPROM *)top;		cnv_1_lowhigh_calib_dat(&wp->x00);		cnv_1_lowhigh_calib_dat(&wp->x01);		cnv_1_lowhigh_calib_dat(&wp->x02);		cnv_1_lowhigh_calib_dat(&wp->x10);		cnv_1_lowhigh_calib_dat(&wp->x11);		cnv_1_lowhigh_calib_dat(&wp->x12);		cnv_1_lowhigh_calib_dat(&wp->x20);		cnv_1_lowhigh_calib_dat(&wp->x21);		cnv_1_lowhigh_calib_dat(&wp->x22);		wp->max_x = CONV_LOWHIGH(wp->max_x);		wp->max_y = CONV_LOWHIGH(wp->max_y);	}	else	{		rp = (Pkt_R_EEPROM *)top;		cnv_1_lowhigh_calib_dat(&rp->x00);		cnv_1_lowhigh_calib_dat(&rp->x01);		cnv_1_lowhigh_calib_dat(&rp->x02);		cnv_1_lowhigh_calib_dat(&rp->x10);		cnv_1_lowhigh_calib_dat(&rp->x11);		cnv_1_lowhigh_calib_dat(&rp->x12);		cnv_1_lowhigh_calib_dat(&rp->x20);		cnv_1_lowhigh_calib_dat(&rp->x21);		cnv_1_lowhigh_calib_dat(&rp->x22);		rp->max_x = CONV_LOWHIGH(rp->max_x);		rp->max_y = CONV_LOWHIGH(rp->max_y);	}}static void cnv_1_lowhigh_calib_dat(Pkt_Calib *p){	p->rawx = CONV_LOWHIGH(p->rawx);	p->rawy = CONV_LOWHIGH(p->rawy);	p->refx = CONV_LOWHIGH(p->refx);	p->refy = CONV_LOWHIGH(p->refy);}static int asleep(DMCPrivatePtr priv,int sec){int c;	XisbBlockDuration (priv->buffer, sec*1000000);	while ((c = XisbRead (priv->buffer)) >= 0)	{	#if 0		xf86Msg(X_WARNING, "DMC : $%x\n",c);	#endif	}}static Bool read_save_file(DMCPrivatePtr priv){FILE *fp;int i,dat,point;u_int a,b;char s[256],str[256];unsigned int t1[16][2],t2[16][2];	memset(priv->calib_temp_data,0,sizeof(priv->calib_temp_data));	memset(priv->calib_data,0,sizeof(priv->calib_data));	priv->tp_state = 0;	priv->samp_rate = 0;	if( !priv->save_file || (fp = fopen(priv->save_file,"r")) == NULL )	{		priv->tp_state = B_BELL_DOWN | B_BELL_UP;		xf86Msg(0, "DMC : don't open calib data file [%s]\n",priv->save_file);		return(false);	}	memset(t1,0,sizeof(t1));	memset(t2,0,sizeof(t2));	xf86Msg(0, "DMC : open calib data file [%s]\n",priv->save_file);	for( i=0,point=0 ; ; )	{		if( fread(&s[i],1,1,fp) <= 0 )			break;		if( s[i] < ' ' )		{			if( i == 0 || s[0] == '#' )			{				i = 0;				continue;			}			s[i] = 0;			i = 0;			if( sscanf(s,"%s %d",str,&dat) != 2 )				break;			switch( get_cfg_calib_str(str,&a,&b) )			{			case	0:	t1[a][b] = dat;	point++;						break;			case	1:	t2[a][b] = dat;									break;			case	2:	priv->tp_state |= (dat == 1 ? B_BELL_DOWN : 0);	break;			case	3:	priv->tp_state |= (dat == 1 ? B_BELL_UP : 0);	break;			case	4:	priv->samp_rate = dat;							break;			default:													break;			}		}		else		{			i++;			if( i >= sizeof(s) )				i = 0;		}	}	priv->calib_point = point / 2;	xf86Msg(0, "DMC : read - calib point %d\n",priv->calib_point);	set_temp_data_rs(priv,priv->calib_point,0,t1);	set_temp_data_rs(priv,priv->calib_point,2,t2);	fclose(fp);	memcpy(priv->calib_data,priv->calib_temp_data,sizeof(priv->calib_data));	adj_read_save_file(priv);	disp_calib_data(priv,"Config",priv->calib_data);	set_calib_area(priv,false);	return(true);}static int get_cfg_calib_str(char *str,unsigned int *a,unsigned int *b){int i,k;	for( i=0 ; cfgrawstr[i] ; i++ )	{		if( StrCmp(str,cfgrawstr[i]) == 0 )		{			*a = (i / 2);			*b = (i % 2);			return(0);		}	}	for( i=0 ; cfgcalstr[i] ; i++ )	{		if( StrCmp(str,cfgcalstr[i]) == 0 )		{			*a = (i / 2);			*b = (i % 2);			return(1);		}	}	for( i=0 ; cfgetcstr[i] ; i++ )	{		if( StrCmp(str,cfgetcstr[i]) == 0 )			return( 2 + i );	}	return(-1);}static Bool write_save_file(DMCPrivatePtr priv){FILE *fp;int i;	if( !priv->save_file || (fp = fopen(priv->save_file,"w")) == NULL )	{		xf86Msg(0, "DMC : don't save calib data file [%s]\n",priv->save_file);		return(false);	}	xf86Msg(0, "DMC : save calib data file [%s]\n",priv->save_file);	fprintf(fp,"# ------------------------- \n");	fprintf(fp,"# DMC Touch-Panel Setup\n");	fprintf(fp,"# ------------------------- \n");	fprintf(fp,"%s %4d\n",cfgetcstr[0],(priv->tp_state & B_BELL_DOWN ? 1 : 0));	fprintf(fp,"%s %4d\n",cfgetcstr[1],(priv->tp_state & B_BELL_UP ? 1 : 0));	fprintf(fp,"%s %4d\n",cfgetcstr[2],priv->samp_rate);	fprintf(fp,"# ------------------------- \n");	fprintf(fp,"# raw data\n");	fprintf(fp,"# ------------------------- \n");	adj_write_save_file(priv);	switch( priv->calib_point )	{	case	2:		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+0],priv->calib_data[0][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+1],priv->calib_data[0][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+0],priv->calib_data[8][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+1],priv->calib_data[8][1]);		break;	case	3:		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+0],priv->calib_data[0][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+1],priv->calib_data[0][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+0],priv->calib_data[4][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+1],priv->calib_data[4][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+0],priv->calib_data[8][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+1],priv->calib_data[8][1]);		break;	case	4:		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+0],priv->calib_data[0][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+1],priv->calib_data[0][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+0],priv->calib_data[2][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+1],priv->calib_data[2][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+0],priv->calib_data[6][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+1],priv->calib_data[6][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(3*2)+0],priv->calib_data[8][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(3*2)+1],priv->calib_data[8][1]);		break;	case	5:		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+0],priv->calib_data[0][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+1],priv->calib_data[0][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+0],priv->calib_data[2][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+1],priv->calib_data[2][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+0],priv->calib_data[4][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+1],priv->calib_data[4][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(3*2)+0],priv->calib_data[6][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(3*2)+1],priv->calib_data[6][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(4*2)+0],priv->calib_data[8][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(4*2)+1],priv->calib_data[8][1]);		break;	case	6:		break;	case	9:		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+0],priv->calib_data[0][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(0*2)+1],priv->calib_data[0][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+0],priv->calib_data[1][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(1*2)+1],priv->calib_data[1][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+0],priv->calib_data[2][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(2*2)+1],priv->calib_data[2][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(3*2)+0],priv->calib_data[3][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(3*2)+1],priv->calib_data[3][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(4*2)+0],priv->calib_data[4][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(4*2)+1],priv->calib_data[4][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(5*2)+0],priv->calib_data[5][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(5*2)+1],priv->calib_data[5][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(6*2)+0],priv->calib_data[6][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(6*2)+1],priv->calib_data[6][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(7*2)+0],priv->calib_data[7][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(7*2)+1],priv->calib_data[7][1]);		fprintf(fp,"%s %4d\n",cfgrawstr[(8*2)+0],priv->calib_data[8][0]);		fprintf(fp,"%s %4d\n",cfgrawstr[(8*2)+1],priv->calib_data[8][1]);		break;	}	fprintf(fp,"# ------------------------- \n");	fprintf(fp,"# calibration data\n");	fprintf(fp,"# ------------------------- \n");	switch( priv->calib_point )	{	case	2:		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+0],priv->calib_data[0][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+1],priv->calib_data[0][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+0],priv->calib_data[8][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+1],priv->calib_data[8][3]);		break;	case	3:		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+0],priv->calib_data[0][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+1],priv->calib_data[0][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+0],priv->calib_data[4][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+1],priv->calib_data[4][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(2*2)+0],priv->calib_data[8][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(2*2)+1],priv->calib_data[8][3]);		break;	case	4:		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+0],priv->calib_data[0][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+1],priv->calib_data[0][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+0],priv->calib_data[2][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+1],priv->calib_data[2][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(2*2)+0],priv->calib_data[6][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(2*2)+1],priv->calib_data[6][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(3*2)+0],priv->calib_data[8][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(3*2)+1],priv->calib_data[8][3]);		break;	case	5:		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+0],priv->calib_data[0][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+1],priv->calib_data[0][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+0],priv->calib_data[2][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+1],priv->calib_data[2][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(2*2)+0],priv->calib_data[4][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(2*2)+1],priv->calib_data[4][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(3*2)+0],priv->calib_data[6][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(3*2)+1],priv->calib_data[6][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(4*2)+0],priv->calib_data[8][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(4*2)+1],priv->calib_data[8][3]);		break;	case	6:		break;	case	9:		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+0],priv->calib_data[0][2]);		fprintf(fp,"%s %4d\n",cfgcalstr[(0*2)+1],priv->calib_data[0][3]);		fprintf(fp,"%s %4d\n",cfgcalstr[(1*2)+0],priv->calib_data[1][2]);		fprintf(fp,"%s %4d\n"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -