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

📄 cmd_1760.c

📁 安装comedi板卡驱动之后的测试程序
💻 C
字号:
//*************************************************************************//				//	         Copyright (c) 2001 IAG Software Team, ////		           Beijing R&D Center //	//		           Advantech Co., Ltd.////	      User program for Linux comedi device driver//// This is An Unpublished Work Containing Confidential  And Proprietary//    Information Which Is The Property Of Advantech  Automation Corp.//// Any Disclosure, Use, Or Reproduction, Without Written Authorization From//           Advantech Automation Corp., Is Strictly Prohibit.//////*************************************************************************// Program :    do_1760.c// Revision:    1.0                                        // Author  :    Zhang Aimin                                             // Date    :    12/30/01                                           //// Description:  Test various functions of PCI-1760.                             // 		 This program use insn method to read from the IMB or write to the OMB//		 of PCI-1760.//-------------------------------------------------------------------------/*Options: * -i   Digital input   No parameters. * -f   Digital filter  Param: Channel SampleNum   * -p   Pattern match   Param: Status * -c   Counter         Param: ResetValue MatchValue CountEdge * -r   Relay output    Param: RelayMask * -s   State change    Param: RisingMask FallingMask * -m   PWM             Param: PWMn EnableFlag LowPeriods HighPeriods BurstCount */#include<stdio.h>#include<stdlib.h>#include<unistd.h>   		//sleep()#include <comedilib.h>		//comedi library#include <fcntl.h>		//file control library#include<errno.h>		//error codes report library #include<string.h>		//string function library#include<getopt.h>		//argument analyse function library#include<ctype.h>	    //c languge type librarychar *filename="/dev/comedi0";	//comedi device file nameint verbose_flag;comedi_t *device;		//comedi deviceint subdevice=2;		//subdevice numberint channel=0;			//channel indexvoid Usage(char *progname){	printf("Usage:\n");	printf("    (1) %s -i\n",progname);	printf("    (2) %s -f Channel SampleNum \n",progname);	printf("    (3) %s -p ChanMask Pattern\n",progname);	printf("    (4) %s -c ResetValue MatchValue CountEdge\n",progname);	printf("    (5) %s -r RelayMask\n",progname);	printf("    (6) %s -r RisingMask FallingMask\n",progname);	printf("    (7) %s -m PWMn EnableFlag [HighPeriod LowPeriod BurstCount]\n",progname);	exit(0);}int GetStatus(comedi_insn *insn,int cmd,int *imb0) //COMMAND 0x07{	lsampl_t imb[4],omb[4]={0x0,0x0,0x7,0x0};		insn->insn=INSN_WRITE;	insn->data=omb;        	omb[0]=cmd & 0xff;	if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error:%d %s\n",errno,strerror(errno));		return -1;	}	usleep(500);		insn->insn=INSN_READ;	insn->data=imb;	if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error:%d %s\n",errno,strerror(errno));		return -1;	}	*imb0=imb[0] & 0xff;	return 0;}int DigitalInput(comedi_insn *insn,int *data){	lsampl_t dataread[4];		insn->insn=INSN_READ;	insn->data=dataread;	if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error:%d %s\n",errno,strerror(errno));		return -1;	}	*data=insn->data[3] &0xff;	printf("data read: 0x%x.\n",*data);	return 0;}int DigitalFilter(comedi_insn *insn,int chan,int samplenum){	return 0;}int PatternMatch(comedi_insn *insn, int mask,int pattern){	int count;	lsampl_t datawrite[4]={0x0,0x0,0x0,0x0},dataread[4];	insn->insn=INSN_WRITE;	insn->data=datawrite;	printf("mask: %d,pattern: %d\n",mask,pattern);	datawrite[2]=0x21;  //Enable/Disable the pattern match function of IDI	datawrite[0]=mask & 0xff;  //Pattern match enable mask	if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error:%d %s\n",errno,strerror(errno));		return -1;	}	sleep(1);		insn->insn=INSN_READ;	insn->data=dataread;	if(comedi_do_insn(device,insn)<0)	{		printf("read error!\n");		return -1;	}	insn->insn=INSN_WRITE;		datawrite[2]=0x22;  //Set the pattern match value of IDI	datawrite[0]=pattern & 0xff;  //Pattern match enable mask	if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error:%d %s\n",errno,strerror(errno));		return -1;	}	printf("dataread: 0x%x 0x%x 0x%x 0x%x\n",dataread[0],dataread[1],dataread[2],dataread[3]);		sleep(2);		insn->data=datawrite;	datawrite[2]=0x60;	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}		insn->insn=INSN_READ;	insn->data=dataread;	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}		printf("dataread: 0x%x 0x%x 0x%x 0x%x\n",dataread[0],dataread[1],dataread[2],dataread[3]);	count=0;	while(count++<10000)		sleep(1);		return 0;}int RelayOutput(comedi_insn *insn,int mask){	lsampl_t omb[4]={0x0,0x0,0x1,0x0};		insn->insn=INSN_WRITE;	insn->data=omb;		omb[0]=mask;		if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error:%d %s\n",errno,strerror(errno));		return -1;	}	return 0;}	int StateChange(comedi_insn *insn,int rMask,int fMask){	lsampl_t omb[4]={0x0,0x0,0x0,0x0};	lsampl_t dataread[4],count;		insn->insn=INSN_WRITE;	insn->data=omb;		omb[0]=rMask; //Rising mask	omb[2]=0x23;  //Enable/Disable rising edge detection function of IDI		if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error!\n");		return -1;	}	sleep(1);	omb[0]=fMask;  //Falling mask	omb[2]=0x24;   //Enable/Disable falling edge detection funciton of IDI	if(comedi_do_insn(device,insn)<0)	{		printf("comedi_do_insn error!\n");		return -1;	}	sleep(8);		insn->data=omb;	omb[2]=0x60;	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}		insn->insn=INSN_READ;	insn->data=dataread;	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}	printf("dataread: 0x%x 0x%x 0x%x 0x%x\n",dataread[0],dataread[1],dataread[2],dataread[3]);	count=0;	while(count++<10000)		sleep(1);	return 0;}int PWM(comedi_insn *insn,int PWMn,int flagEnable,int lPeriod,int hPeriod,int burst){	lsampl_t omb[4]={0x0,0x0,0x0,0x0};	int hByte,lByte;	int PWMStatus;	PWMn &= 1;  //We assure that PWMn=0 or 1		insn->insn=INSN_WRITE;	insn->data=omb;		/*Step 1: Sets the high period value of PWMn*/	lByte=hPeriod & 0xff;      	hByte=(hPeriod >>8) & 0xff;		omb[0]=lByte;  	omb[1]=hByte;	omb[2]=0x10+2*PWMn;  //Command code	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}	/*Step 2: Sets the low period value of PWMn*/	lByte=lPeriod & 0xff;       	hByte=(lPeriod >>8) & 0xff;		omb[0]=lByte;  	omb[1]=hByte;	omb[2]=0x11+2*PWMn;  //Command code	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}		/*Step 3: Sets the burst count of PWMn*/	lByte=burst & 0xff;       //Maximum value is 0xff	hByte=(burst >>8) & 0xff;		omb[0]=lByte;  	omb[1]=hByte;	omb[2]=0x14+PWMn;  //Command code	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}	usleep(100);		/*Step 4: Read the PWM outputs' enable/disable flags.	 *We do this in order not to affect another channel when	 *we deal with a channel.	 */	GetStatus(insn,0x1f,&PWMStatus);	PWMStatus &= 0x3;  //Only bit0 and bit1 is valid value	printf("PWMStatus: %d\n",PWMStatus);	/*Step 5: Enable the PWMn outputs.*/	insn->insn=INSN_WRITE;	insn->data=omb;	flagEnable &= 1;	if(PWMn==0)		omb[0]=(2 & PWMStatus) | flagEnable;  	else		omb[0]=(1 & PWMStatus) |(flagEnable <<1);	omb[2]=0x1f;  //Command code		printf("PWMn %d   ~PWMn   %d   ~PWMn&PWMStatus %d  flagEnable %d   Enableflag: %d.\n",PWMn,~PWMn, ~PWMn&PWMStatus,flagEnable,omb[0]);	if(comedi_do_insn(device,insn)<0)	{		printf("write error!\n");		return -1;	}		sleep(1);		GetStatus(insn,0x1f,&PWMStatus);	PWMStatus &= 0x3;  //Only bit0 and bit1 is valid value	printf("PWMStatus: %d\n",PWMStatus);	sleep(50);	return 0;}int main(int argc,char *argv[]){	char progname[20];	char ch,option='i';	int optioncount=0;	extern int optind;	lsampl_t dataread[4];	int data;	comedi_insn insn;  	strncpy(progname,argv[0],19>strlen(argv[0])?19:strlen(argv[0])); while((ch=getopt(argc,argv,"if:p:c:r:s:m:"))!=EOF)   {	  switch(ch)      {case 'i':       case 'f':       case 'c':       case 'p':       case 'r':       case 's':       case 'm':	       option=ch;	       optioncount++;	       break;	   default: Usage(progname);      }   } if(optioncount >1) {	printf("One and only one option required!\n");	Usage(progname); }  printf("argc=%d,optioncount=%d\n",argc,optioncount); argc -=2; argv+=2;	if((device=comedi_open(filename))==NULL)	{		printf("comedi_open(\"%s\") error: %s\n",filename,strerror(errno));		exit(0);	}	memset(&insn,0,sizeof(insn));	insn.subdev=2;	insn.insn=INSN_READ;	insn.n=4;	insn.chanspec=CR_PACK(channel,0,0);	insn.data=dataread; switch(option) {	case 'i':		DigitalInput(&insn,&data);		break;	case 'f':	{		int chan,samplenum;		if(argc <2)		{			printf("Invalid parameters!\n");			Usage(progname);		}		chan=atoi(argv[0]);		samplenum=atoi(argv[1]);		    DigitalFilter(&insn,chan,samplenum);		break;	}	case 'c':	{		int resetValue,matchValue,enable;		if(argc <3)		{			printf("Invalid parameters!\n");			Usage(progname);		}		resetValue=atoi(argv[0]);		matchValue=atoi(argv[1]);		enable=atoi(argv[2]);//		Counter(&insn,resetValue,matchValue,enable);		break;			}	case 'p':	{		int mask,pattern;		printf("optind=%d,argc=%d %s %s\n",optind,argc, argv[0],argv[1]);		if(argc<2)		{			printf("Invalid parameters!\n");			Usage(progname);		}		mask=atoi(argv[0]) &0xff;		pattern=atoi(argv[1]) & 0xff;			PatternMatch(&insn,mask,pattern);		break;	}    case 'r':	{		int mask;		if(argc<1)		{			printf("Invalid parameter number!\n");			Usage(progname);		}		mask=atoi(argv[0]) & 0xff;		RelayOutput(&insn,mask);		break;	}    case 's':	{		int rMask,fMask;		if(argc<2)		{			printf("Invalid parameter number!\n");			Usage(progname);		}		rMask=atoi(argv[0]) & 0xff;		fMask=atoi(argv[1]) & 0xff;				StateChange(&insn,rMask,fMask);		break;	}    case 'm':	{		int PWMn,flagEnable,hPeriod,lPeriod,burst;		hPeriod=1;  //Default value		lPeriod=1;		burst=0;   //Continuous		if(argc<2)		{			printf("Invalid parameter number!\n");			Usage(progname);		}		PWMn=atoi(argv[0]) & 1;		flagEnable=atoi(argv[1]) & 1;		argc -=2;  argv+=2;		if(argc>=3)			lPeriod=atoi(argv[0]) & 0xffff;		if(argc>=4)			hPeriod=atoi(argv[1]) & 0xffff;		if(argc>=5)			burst=atoi(argv[2]) & 0xffff;				PWM(&insn,PWMn,flagEnable,lPeriod,hPeriod,burst);		break;	} } return 0;}

⌨️ 快捷键说明

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