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

📄 test.c

📁 在DOS下进行PCI设备的操作。经过BC3.1编译。
💻 C
字号:
#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <ver.h>

#include "Bottom.h"
#include "Bottom.c"

#define PCI_CONFIG_ADDRESS 			0xcf8
#define PCI_CONFIG_DATA   			0xcfc
#define IntDataBaseAddress			0xa00000L    //10M+227,082,240, to save das data
#define	TransPause					0x5a5a
typedef unsigned long  int	DWORD;
//#define	 loop_f
/*
#if defined(loop_f)
	printf("this ver software will loop deadly when some error occur!\n");
#endif
*/



struct config_header//pci卡配置空间结构
{
 unsigned int VID;
 unsigned int DID;
 unsigned int PCICMD;
 unsigned int PCISTS;
 unsigned long int RID_CLCD;
 unsigned long int Addr0c;
 unsigned long int BADR[6];
 unsigned long int Res1[2];
 unsigned long int EXROM;
 unsigned long int Res2[2];
 unsigned long int Addr3c;
 };

unsigned char       Comu_IntNo;//通讯卡中断号
unsigned short int  Comu_IntVector;//通讯卡中断向量
unsigned long int   Comu_CfgAddr;//通讯卡配置空间基地址
unsigned long int 	Comu_IOAddr;//通讯卡io空间基地址;
unsigned short int  ComuCardVer;
unsigned long int 	CmuCtrlWord;//通讯控制字
unsigned long int	ComuState;
unsigned short int	IsIntOK;
unsigned long int 	IsTransfateErr;
unsigned long int	TotalViewNums,StoreViewNums,SendViewNums,StoreViewInHV;
unsigned long int	ReadDataPointer,WriteDataPointer;
unsigned long int  	ScanViewNums;
unsigned long int 	StoreViewNums_Bak,SendViewNums_Bak,StoreViewInHV_Bak;
unsigned long int 	WriteDataPointer_Bak,ReadDataPointer_Bak;

unsigned char 		IsDataTransPause;
char 				PauseState;//0:not pause, 1:放线终止或传输终止
char 				StopTrans;//收到主控台发送的传输暂停后为1,以阻止继续向主控台传递das数据
char 				GetPauseInfo;
unsigned char 		IsDataTrans;//如果在传递数据过程中,按面板则不会响应


//unsigned long int   IntNums;
//unsigned long int 	ViewNumsCount;  //view计数器
extern unsigned short int 	SendDiskDataByNet(unsigned char *);
extern unsigned short int 	SendSingleDataByNet(unsigned char *);
extern unsigned char		ScanTypes;//扫描类型, 0 =das data retrans 5=pilot scan 6=simu flat scan
extern unsigned short int	JumpViews;
extern unsigned long int	HVSTS;//夹在数据中的高压状态
extern unsigned long int	IntNums,IntNums_Bak;
extern unsigned short int	Detector_F;



unsigned char	FindComuCard(void)//寻找通信卡
{
	struct config_header *PCIConfigHeader;
	unsigned long int buffer[16];
	unsigned char DeviceNumber,FunctionNumber;
	unsigned char RegisterNumber;
	unsigned int BusNumber;
	unsigned long int temp;
	unsigned char device_nums=0;
	unsigned char VersionNum;
	for(BusNumber=0;BusNumber<256;BusNumber++) {
		for(DeviceNumber=0;DeviceNumber<32;DeviceNumber++) {
			for(FunctionNumber=0;FunctionNumber<8;FunctionNumber++) {
				temp=0x80000000L+((DWORD)FunctionNumber<<8)+
     				((DWORD)DeviceNumber<<11)+((DWORD)BusNumber<<16);
				outpd(PCI_CONFIG_ADDRESS,temp);
				temp=inpd(PCI_CONFIG_DATA);
				if(temp!=0xffffffff) {
					for(RegisterNumber=0;RegisterNumber<0x10;RegisterNumber++) {
				        	temp=0x80000000L+((DWORD)RegisterNumber<<2)+
						  ((DWORD)FunctionNumber<<8)+
		 				 ((DWORD)DeviceNumber<<11)+((DWORD)BusNumber<<16);
							 outpd(PCI_CONFIG_ADDRESS,temp);
	    					 buffer[RegisterNumber]=inpd(PCI_CONFIG_DATA);
						}
					(DWORD*) PCIConfigHeader=buffer;

					if(((PCIConfigHeader->VID)==0x10b5)&&((PCIConfigHeader->DID)==0x9054)) {
						device_nums++;
						VersionNum=(unsigned char)(PCIConfigHeader->RID_CLCD);
						if(VersionNum==12) {
							ComuCardVer=200;
							printf("find communcation card ver 2.0 for Dual!\n");
						}
						else {
							ComuCardVer=250;
							printf("find communcation card for Dual!, ver is later than 2.0\n");
						}
						Comu_CfgAddr=buffer[5]&0xfffffffe;
						Comu_IOAddr=buffer[6]&0xfffffffe;
						Comu_IntNo=PCIConfigHeader->Addr3c&0x0ffL;
						if(Comu_IntNo>7)
							Comu_IntVector=Comu_IntNo-8+0x70;
						else
							Comu_IntVector=Comu_IntNo+8;
						printf("Vendor ID is %x\n",PCIConfigHeader->VID);
						printf("Device ID is %x\n",PCIConfigHeader->DID);
						printf("Communcation card version number is %d\n",VersionNum);
						printf("configration base address is %lx\n",Comu_CfgAddr);
						printf("I/O space base address is %lx\n",Comu_IOAddr);
						printf("int no is %d\n",Comu_IntNo);
						break;
					}
				}
			}
		}
	}
	if(device_nums==1){
		printf("find our pci Comu device(s)\n");
	}
	return device_nums;
}

void WriteCmd(unsigned long int cmd1,unsigned long int cmd2,unsigned long int cmd3,unsigned char IOAddr)
{
	outpd(Comu_IOAddr,0x11112228);
    //delay(2);
    outpd(Comu_IOAddr + 0x04,0x33334444);
    //delay(2);
    outpd(Comu_IOAddr + 0x08,0x55556666);
}


int main(){

	unsigned char device_nums = 0;
	unsigned long int 	LedData = 0;
	unsigned long int 	Mcmd1,Mcmd2,Mcmd3;
	

	printf("this is PC104 test 2006-1-13\n");
	device_nums = 0;
	device_nums = FindComuCard();
	if (device_nums == 1)
		printf("find CPCI OK.2006-3-29 \n");
	else
		printf("find error.\n");
	
	printf("-----------------------------------------\n");
	WriteCmd(Mcmd1,Mcmd2,Mcmd3,0x00);
	/*
	while(1)
	{
	printf("Enter three data to Mcmd1,Mcmd2 and Mcmd3:   \n");
    scanf("%d", &Mcmd1);
    scanf("%d", &Mcmd2);
    scanf("%d", &Mcmd3);
    printf("Mcmd1 = %d, Mcmd2 = %d, Mcmd3 = %d\n",Mcmd1,Mcmd2,Mcmd3);
    WriteCmd(Mcmd1,Mcmd2,Mcmd3,0x00);
	}
	*/
	//do{//test                                                                      
		//	}while(1);
	//printf("ri = %d\n",ri);
	return 0;	
	
}






⌨️ 快捷键说明

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