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

📄 xf86dmc.c

📁 一份介绍在S3C2410上液晶屏驱动程序的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
		// 0  -  2     -> 0  1  2		// -  -  -     -> 3  4  5		// 1  -  3     -> 6  7  8		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		caldif(&priv->calib_temp_data[1][ofs],temp[0],temp[2]);		memcpy(&priv->calib_temp_data[2][ofs],temp[2],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[1]);		caldif(&priv->calib_temp_data[4][ofs],temp[0],temp[3]);		caldif(&priv->calib_temp_data[5][ofs],temp[2],temp[3]);		memcpy(&priv->calib_temp_data[6][ofs],temp[1],sizeof(int)*2);		caldif(&priv->calib_temp_data[7][ofs],temp[1],temp[3]);		memcpy(&priv->calib_temp_data[8][ofs],temp[3],sizeof(int)*2);		break;	case	5:		// 0  -  3     -> 0  1  2		// -  2  -     -> 3  4  5		// 1  -  4     -> 6  7  8#if CALIB_PAT_A		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[1][ofs],temp[2],temp[0]);		memcpy(&priv->calib_temp_data[2][ofs],temp[3],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[3][ofs],temp[1],temp[2]);		memcpy(&priv->calib_temp_data[4][ofs],temp[2],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[5][ofs],temp[3],temp[2]);		memcpy(&priv->calib_temp_data[6][ofs],temp[1],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[7][ofs],temp[2],temp[1]);		memcpy(&priv->calib_temp_data[8][ofs],temp[4],sizeof(int)*2);#else		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		caldif(&priv->calib_temp_data[1][ofs],temp[0],temp[3]);		memcpy(&priv->calib_temp_data[2][ofs],temp[3],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[1]);		memcpy(&priv->calib_temp_data[4][ofs],temp[2],sizeof(int)*2);		caldif(&priv->calib_temp_data[5][ofs],temp[3],temp[4]);		memcpy(&priv->calib_temp_data[6][ofs],temp[1],sizeof(int)*2);		caldif(&priv->calib_temp_data[7][ofs],temp[1],temp[4]);		memcpy(&priv->calib_temp_data[8][ofs],temp[4],sizeof(int)*2);#endif		break;	case	6:		// 0  2  4     -> 0  1  2		// -  -  -     -> 3  4  5		// 1  3  5     -> 6  7  8		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		memcpy(&priv->calib_temp_data[1][ofs],temp[2],sizeof(int)*2);		memcpy(&priv->calib_temp_data[2][ofs],temp[4],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[1]);		caldif(&priv->calib_temp_data[4][ofs],temp[0],temp[5]);		caldif(&priv->calib_temp_data[5][ofs],temp[4],temp[5]);		memcpy(&priv->calib_temp_data[6][ofs],temp[1],sizeof(int)*2);		memcpy(&priv->calib_temp_data[7][ofs],temp[3],sizeof(int)*2);		memcpy(&priv->calib_temp_data[8][ofs],temp[5],sizeof(int)*2);		break;	case	9:		// 0  3  6     -> 0  1  2		// 1  4  7     -> 3  4  5		// 2  5  8     -> 6  7  8		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		memcpy(&priv->calib_temp_data[1][ofs],temp[3],sizeof(int)*2);		memcpy(&priv->calib_temp_data[2][ofs],temp[6],sizeof(int)*2);		memcpy(&priv->calib_temp_data[3][ofs],temp[1],sizeof(int)*2);		memcpy(&priv->calib_temp_data[4][ofs],temp[4],sizeof(int)*2);		memcpy(&priv->calib_temp_data[5][ofs],temp[7],sizeof(int)*2);		memcpy(&priv->calib_temp_data[6][ofs],temp[2],sizeof(int)*2);		memcpy(&priv->calib_temp_data[7][ofs],temp[5],sizeof(int)*2);		memcpy(&priv->calib_temp_data[8][ofs],temp[8],sizeof(int)*2);		break;	}	return( 0 );}static int set_temp_data_rs(DMCPrivatePtr priv,int calib_point,int ofs,unsigned int a[][2]){int i;unsigned int temp[16][2];	memcpy(temp,a,sizeof(temp));	switch( calib_point )	{	case	2:		// 0  -  -2    -> 0  1  2		// -  -  -     -> 3  4  5		// -3 -  1     -> 6  7  8		temp[2][0] = temp[1][0];		temp[2][1] = temp[0][1];		temp[3][0] = temp[0][0];		temp[3][1] = temp[1][1];		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		caldif(&priv->calib_temp_data[1][ofs],temp[0],temp[2]);		memcpy(&priv->calib_temp_data[2][ofs],temp[2],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[3]);		caldif(&priv->calib_temp_data[4][ofs],temp[0],temp[1]);		caldif(&priv->calib_temp_data[5][ofs],temp[2],temp[1]);		memcpy(&priv->calib_temp_data[6][ofs],temp[3],sizeof(int)*2);		caldif(&priv->calib_temp_data[7][ofs],temp[3],temp[1]);		memcpy(&priv->calib_temp_data[8][ofs],temp[1],sizeof(int)*2);		break;	case	3:		// 0  -  -3    -> 0  1  2		// -  1  -     -> 3  4  5		// -4 -  2     -> 6  7  8		temp[3][0] = temp[2][0];		temp[3][1] = temp[0][1];		temp[4][0] = temp[0][0];		temp[4][1] = temp[2][1];#if CALIB_PAT_A		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[1][ofs],temp[1],temp[0]);		memcpy(&priv->calib_temp_data[2][ofs],temp[3],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[3][ofs],temp[4],temp[1]);		memcpy(&priv->calib_temp_data[4][ofs],temp[1],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[5][ofs],temp[3],temp[1]);		memcpy(&priv->calib_temp_data[6][ofs],temp[4],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[7][ofs],temp[1],temp[4]);		memcpy(&priv->calib_temp_data[8][ofs],temp[2],sizeof(int)*2);#else		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		caldif(&priv->calib_temp_data[1][ofs],temp[0],temp[3]);		memcpy(&priv->calib_temp_data[2][ofs],temp[3],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[4]);		memcpy(&priv->calib_temp_data[4][ofs],temp[1],sizeof(int)*2);		caldif(&priv->calib_temp_data[5][ofs],temp[2],temp[3]);		memcpy(&priv->calib_temp_data[6][ofs],temp[4],sizeof(int)*2);		caldif(&priv->calib_temp_data[7][ofs],temp[2],temp[4]);		memcpy(&priv->calib_temp_data[8][ofs],temp[2],sizeof(int)*2);#endif		break;	case	4:		// 0  -  1     -> 0  1  2		// -  -  -     -> 3  4  5		// 2  -  3     -> 6  7  8		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		caldif(&priv->calib_temp_data[1][ofs],temp[0],temp[1]);		memcpy(&priv->calib_temp_data[2][ofs],temp[1],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[2]);		caldif(&priv->calib_temp_data[4][ofs],temp[0],temp[3]);		caldif(&priv->calib_temp_data[5][ofs],temp[1],temp[3]);		memcpy(&priv->calib_temp_data[6][ofs],temp[2],sizeof(int)*2);		caldif(&priv->calib_temp_data[7][ofs],temp[2],temp[3]);		memcpy(&priv->calib_temp_data[8][ofs],temp[3],sizeof(int)*2);		break;	case	5:		// 0  -  1     -> 0  1  2		// -  2  -     -> 3  4  5		// 3  -  4     -> 6  7  8#if CALIB_PAT_A		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[1][ofs],temp[2],temp[0]);		memcpy(&priv->calib_temp_data[2][ofs],temp[1],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[3][ofs],temp[3],temp[2]);		memcpy(&priv->calib_temp_data[4][ofs],temp[2],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[5][ofs],temp[1],temp[2]);		memcpy(&priv->calib_temp_data[6][ofs],temp[3],sizeof(int)*2);		aaacpy(&priv->calib_temp_data[7][ofs],temp[2],temp[3]);		memcpy(&priv->calib_temp_data[8][ofs],temp[4],sizeof(int)*2);#else		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		caldif(&priv->calib_temp_data[1][ofs],temp[0],temp[1]);		memcpy(&priv->calib_temp_data[2][ofs],temp[1],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[3]);		memcpy(&priv->calib_temp_data[4][ofs],temp[2],sizeof(int)*2);		caldif(&priv->calib_temp_data[5][ofs],temp[1],temp[4]);		memcpy(&priv->calib_temp_data[6][ofs],temp[3],sizeof(int)*2);		caldif(&priv->calib_temp_data[7][ofs],temp[3],temp[4]);		memcpy(&priv->calib_temp_data[8][ofs],temp[4],sizeof(int)*2);#endif		break;	case	6:		// 0  1  2     -> 0  1  2		// -  -  -     -> 3  4  5		// 3  4  5     -> 6  7  8		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		memcpy(&priv->calib_temp_data[1][ofs],temp[1],sizeof(int)*2);		memcpy(&priv->calib_temp_data[2][ofs],temp[2],sizeof(int)*2);		caldif(&priv->calib_temp_data[3][ofs],temp[0],temp[3]);		caldif(&priv->calib_temp_data[4][ofs],temp[0],temp[5]);		caldif(&priv->calib_temp_data[5][ofs],temp[2],temp[5]);		memcpy(&priv->calib_temp_data[6][ofs],temp[3],sizeof(int)*2);		memcpy(&priv->calib_temp_data[7][ofs],temp[4],sizeof(int)*2);		memcpy(&priv->calib_temp_data[8][ofs],temp[5],sizeof(int)*2);		break;	case	9:		// 0  1  2     -> 0  1  2		// 3  4  5     -> 3  4  5		// 6  7  8     -> 6  7  8		memcpy(&priv->calib_temp_data[0][ofs],temp[0],sizeof(int)*2);		memcpy(&priv->calib_temp_data[1][ofs],temp[1],sizeof(int)*2);		memcpy(&priv->calib_temp_data[2][ofs],temp[2],sizeof(int)*2);		memcpy(&priv->calib_temp_data[3][ofs],temp[3],sizeof(int)*2);		memcpy(&priv->calib_temp_data[4][ofs],temp[4],sizeof(int)*2);		memcpy(&priv->calib_temp_data[5][ofs],temp[5],sizeof(int)*2);		memcpy(&priv->calib_temp_data[6][ofs],temp[6],sizeof(int)*2);		memcpy(&priv->calib_temp_data[7][ofs],temp[7],sizeof(int)*2);		memcpy(&priv->calib_temp_data[8][ofs],temp[8],sizeof(int)*2);		break;	}	return( 0 );}static void disp_calib_data(DMCPrivatePtr priv,char *s,unsigned int d[][4]){int i;	for( i=0 ; i < MAX_CALIB_POINT ; i++ )	{		xf86Msg(0, "DMC : %s[%d]:Raw=%4d,%4d Adj=%4d,%4d \n"						,s ,i ,d[i][0] ,d[i][1] ,d[i][2] ,d[i][3]);	}}static void aaacpy(u_int *d,u_int *a,u_int *b){	d[0] = a[0];	d[1] = b[1];}static void caldif(u_int *od,u_int *oa,u_int *ob){int *a,*b,*d;	d = (int *)od;	a = (int *)oa;	b = (int *)ob;	if( a[0] > b[0] )		d[0] = ((a[0] - b[0]) / 2) + b[0];	else		d[0] = ((b[0] - a[0]) / 2) + a[0];	if( a[1] > b[1] )		d[1] = ((a[1] - b[1]) / 2) + b[1];	else		d[1] = ((b[1] - a[1]) / 2) + a[1];}/********************************************* calibration function end ***/static Bool specify_set(DMCPrivatePtr priv,int fd){int res,a;DMCState st;	st = priv->lex_mode;	xf86FlushInput(fd);	priv->lex_mode = DMC_Response0;	res = tx_reset_goto_init(priv,true);	XisbBlockDuration (priv->buffer, -1);	priv->lex_mode = st;	return(res);}static Bool tx_reset_goto_init(DMCPrivatePtr priv,Bool wait_ack){#if _3MEX2	return(true);#elseu_char reset[] = { RESET };	if( priv->usb_dev )		return( ((ioctl(priv->fd,USBDMC_RESET,0)) == -1 ? false : true) );	return( exec_cmd_send(priv,reset,sizeof(reset),wait_ack) );#endif}static Bool tx_specify_goto_idle(DMCPrivatePtr priv,Bool wait_ack){#if _3MEX2	return(true);#elseu_char	specify[2] = { INI_2_IDLE, S_RATE };int a;	if( priv->usb_dev )	{		a = priv->samp_rate;		return( ((ioctl(priv->fd,USBDMC_SPECIFY,&a)) == -1 ? false : true) );	}	specify[1] += priv->samp_rate;	return( exec_cmd_send(priv,specify,sizeof(specify),wait_ack) );#endif}static Bool tx_xyp_exit_goto_idle(DMCPrivatePtr priv,Bool wait_ack){#if _3MEX2	return(true);#elseu_char to_idle[] = { XYP_2_IDLE };	if( priv->usb_dev )		return( ((ioctl(priv->fd,USBDMC_GOTO_IDLE,0)) == -1 ? false : true) );	return( exec_cmd_send(priv,to_idle,sizeof(to_idle),wait_ack) );#endif}static Bool goto_rom_read(DMCPrivatePtr priv){#if _3MEX2	return(false);#elseu_char to_rom_read[] = { IDLE_2_RomRd };	if( priv->usb_dev )		return(true);	return( exec_cmd_send(priv,to_rom_read,sizeof(to_rom_read),false) );#endif}static Bool goto_xyp(DMCPrivatePtr priv){#if _3MEX2	return(true);#elseu_char to_xyp[] = { IDLE_2_XYP };	if( priv->usb_dev )		return( ((ioctl(priv->fd,USBDMC_GOTO_XYP,0)) == -1 ? false : true) );	return( exec_cmd_send(priv,to_xyp,sizeof(to_xyp),false) );#endif}static Bool exec_cmd_send(DMCPrivatePtr priv,u_char s[],int len,Bool wait_ack){int i;	// ...............gott idle	#if DEBUG_CMD		xf86Msg(X_WARNING, "DMC : exec_cmd_send len=%d ",len);		for( i=0 ; i < len ; i++ )			xf86Msg(X_WARNING,"$%02X ",s[i]);		xf86Msg(X_WARNING,"\n");	#endif	XisbBlockDuration (priv->buffer, -1);	if( DMCSendPacket(priv,s,len) != Success )		return(false);	if( len >= 80 )		XisbBlockDuration (priv->buffer, 10000000);	else		XisbBlockDuration (priv->buffer, 10000000);		//XisbBlockDuration (priv->buffer, 500000);	if( !wait_ack )		return(true);	priv->lex_mode = DMC_Response0;	if( DMCGetPacket(priv) != Success )	{		#if DEBUG_CMD			xf86Msg(X_WARNING, "DMC : None \n");		#endif		return(false);	}	if( priv->packet[0] == ACK )	{		#if DEBUG_CMD			xf86Msg(X_WARNING, "DMC : cmd = $%x -> ACK \n",s[0]);		#endif		return(true);	}	if( DMCGetPacket(priv) == Success )		xf86Msg(X_WARNING, "DMC : cmd = $%x -> NAK + $%x\n"														,s[0],priv->packet[0]);	return(false);}static Bool get_status(DMCPrivatePtr priv){u_char stts[] = { 0x15 };u_char s[2];	// ...............gott idle	#if DEBUG_CMD		xf86Msg(X_WARNING, "DMC : get_status \n");	#endif	XisbBlockDuration (priv->buffer, 500000);	if( DMCSendPacket(priv,stts,sizeof(stts)) != Success )		return(false);	priv->lex_mode = DMC_Response0;	if( DMCGetPacket(priv) != Success )	{		return(false);	}	s[0] = priv->packet[0];	priv->lex_mode = DMC_Response0;	if( DMCGetPacket(priv) != Success )	{		xf86Msg(X_WARNING, "DMC : status $%x Err\n",s[0]);		return(false);	}	xf86Msg(X_WARNING, "DMC : status $%x $%x\n",s[0],priv->packet[0]);	return(true);}static int read_eeprom(DMCPrivatePtr priv){#if _3MEX2	return(-1);#elseint x,y,i,k,cnt,ofs;int c;u_short st;u_char s[300];	// ...............read EEPROM data	#if DEBUG_PROM		xf86Msg(X_WARNING, "DMC : read_eeprom s\n");	#endif	if( priv->usb_dev )	{		if( ioctl(priv->fd,USBDMC_READ_EEPROM,s) == -1 )			return(-1);	}	else	{		if( !goto_rom_read(priv) )			return(-1);		XisbBlockDuration (priv->buffer, 500000);		cnt = 2 + ((5 * 5) * 8) + 2 + 2;		for( i=k=0 ; k < cnt ; i++ )		{			if( (c = XisbRead (priv->buffer)) >= 0 )			{				s[k++] = (u_char)c;			}			else				return(-1);		}	}	#if DEBUG_PROM		xf86Msg(X_WARNING, "DMC : read_eeprom e\n");		xf86Msg(X_WARNING, "DMC : read_eeprom %x %x %x %x %x %x\n",s[0],s[1],s[2],s[3],s[4],s[5]);	#endif	if( s[0] != 3 || s[1] != 3 )		return(0);	#if DEBUG_PROM		xf86Msg(X_WARNING, "DMC : read_eeprom set 1\n");	#endif	adj_pkt_calib_dat(false,s,priv->max_x,priv->max_y);	cnt = 2 + ((5 * 5) * 8);	for( i=0,k=2 ; k < cnt && i < MAX_CALIB_POINT ; k+=2 )	{		ofs = ((k - 2) % 8) / 2;		if( (((k-2)/8) % 5) < 3 )		{			//xf86Msg(X_WARNING, "DMC : read_eeprom %d $%x\n",k,((s[k]<<8)+s[k+1]));			priv->calib_temp_data[i][ofs] = (s[k]*0x100) + s[k+1];			if( ofs >= 3 )				i++;		}	}	k = cnt;	x = (s[k]*0x100) + s[k+1];	k+=2;	y = (s[k]*0x100) + s[k+1];	#if LOG_PROM_RD		xf86Msg(0, "DMC : read_eeprom SCREEN %dx%d \n",x,y);		disp_calib_data(priv,"read_eeprom",priv->calib_temp_data);	#endif	memcpy(priv->calib_data,priv->calib_temp_data,sizeof(priv->calib_data));	priv->calib_point = MAX_CALIB_POINT;	set_calib_area(priv,false);	return(1);#endif}static Bool write_eeprom(DMCPrivatePtr priv){#if _3MEX2	return(false);#elseBool res;int k;u_char s[256];Pkt_W_EEPROM *p;	memset(s,0,sizeof(s));	s[0] = IDEL_2_RomWr;	p = (Pkt_W_EEPROM *)&s[1];	p->x = 3;	p->y = 3;	set_1_pkt_calib_dat(&p->x00,priv->calib_data[0]);

⌨️ 快捷键说明

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