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

📄 kgl.c

📁 vxworks下
💻 C
字号:
#include "kgl.h"

#include "vxworks.h"
#include "tasklib.h"
#include "syslib.h"
#include "config.h"
#include "vmlib.h"
#include "errnoLib.h"
#include "drv/pci/pciIntLib.h"
#include "logLib.h"
#include "string.h"

#define KGL_WRITELOW_OFFSET 0x00000000	/*写低16位偏移*/
#define KGL_WRITEHIGH_OFFSET 0x00000002	/*写高16位偏移*/
#define KGL_READLOW_OFFSET 0x00000004		/*读低16位偏移*/
#define KGL_READHIGH_OFFSET 0x00000006	/*读高16位偏移*/

#define KGL_LOW_FLAG 0	/*读写低地址标志*/
#define KGL_HIGH_FLAG 1	/*读写高地址标志*/

LOCAL int kglDrvNum=0;/*驱动索引号*/
LOCAL UINT32 memBaseAdr=0;	/*内存空间在系统中的起始地址*/
LOCAL UINT initialStateMask = (VM_STATE_MASK_FOR_ALL);
LOCAL UINT initialState = (VM_STATE_FOR_PCI);
typedef struct
{
	DEV_HDR devHdr;
	int ix;	/*设备索引号*/
	SEL_WAKEUP_LIST selWakeupList;
	BOOL Opened;
	BOOL ReadyToRead;
	BOOL ReadyToWrite;
	BOOL DevCreate;
} kgl_DEV;
LOCAL kgl_DEV *pkglDev;

STATUS kglDrv()
{
	/*首先判断驱动是否已经安装*/
	if(kglDrvNum>0)  
		return(OK);
	/*在这里添加驱动的初始化部分*/
	/*将驱动添加到驱动描述表中*/
	if((kglDrvNum = iosDrvInstall((FUNCPTR )kglOpen,(FUNCPTR)kglDelete, (FUNCPTR )kglOpen,
		(FUNCPTR)kglClose,(FUNCPTR )kglRead,(FUNCPTR )kglWrite, NULL))==ERROR)
	{
		logMsg("Failed to install driver\n",0,0,0,0,0,0);
		return(ERROR);
	} 
	logMsg("Succeed to install driver\n",0,0,0,0,0,0);
	return(OK);
}

STATUS kglDevCreate(char * devName)
{
/*	kgl_DEV *pkglDev;*/
	/*检查驱动是否安装*/
	if(kglDrvNum<1)
	{
		errno=S_ioLib_NO_DRIVER;
		return(ERROR);
	}
	/*分配内存并初始化*/
	if((pkglDev=(kgl_DEV *)malloc(sizeof(kgl_DEV)))==NULL)
		return(ERROR);  
	bzero(pkglDev, sizeof(kgl_DEV));
	selWakeupListInit(&pkglDev->selWakeupList);
	/*初始化必要的描述结构pkglDev*/
	pkglDev->Opened=FALSE;
	pkglDev->ReadyToRead=FALSE;
	pkglDev->ReadyToWrite=FALSE;
	pkglDev->DevCreate=TRUE;
	/*执行设备的初始化*/              

	/*将设备添加到设备列表*/
	if(iosDevAdd(&pkglDev->devHdr, devName, kglDrvNum)==ERROR)
	{
		free((char *)pkglDev);
		return(ERROR);
	}
	logMsg("Succeed to Create Device:%s\n",devName,0,0,0,0,0);
	return(OK);
}

int kglOpen(DEV_HDR *pkglDevHdr, char * name,int option, int flags)
{
	kgl_DEV* pkglDev=(kgl_DEV *)pkglDevHdr;
	if(pkglDevHdr==NULL)
	{
		errnoSet(S_kgl_NODEV);
		return(ERROR);
	};
	if(pkglDev->Opened)
	{
		errnoSet(S_kgl_DEVOPENED);
		return(ERROR);
	}
	pkglDev->Opened=TRUE;
	pkglDev->ReadyToWrite=TRUE;
	pkglDev->ReadyToRead=TRUE;
	/*在这里作必要的初始化*/
	logMsg("Succeed to Open device\n",0,0,0,0,0,0);
	return((int)pkglDevHdr);
} 

unsigned short kglRead(int kglDevId,int hlflag)
{
	
	kgl_DEV* pkglDev=(kgl_DEV*)kglDevId;
/*	int ReadLength=ERROR;*/
	unsigned short data=0;
	BOOL FoundError;
	if (pkglDev==(kgl_DEV*)NULL)
	{
		errnoSet(S_kgl_NODEV);
		return(ERROR);
	}
	
	if(pkglDev->ReadyToRead)
	{
	/*	ReadLength=0;
		while(ReadLength<nBytes)
		{*/
		/*从设备接收*/
		switch(hlflag)
		{
		case KGL_LOW_FLAG:
			data=*((UINT16* )(memBaseAdr+KGL_READLOW_OFFSET));
			break;
		case KGL_HIGH_FLAG:
			data=*((UINT16* )(memBaseAdr+KGL_READHIGH_OFFSET));
			break;
		default:
		errnoSet(S_kgl_NOADDR);
		return(ERROR);	 
		}
		/*data=*((UINT16* )(memBaseAdr+KGL_READLOW_OFFSET));
		data=*((UINT16* )(memBaseAdr+KGL_READHIGH_OFFSET));
		data=sysInWord(memBaseAdr+KGL_READLOW_OFFSET);
		data=sysInWord(memBaseAdr+KGL_READHIGH_OFFSET);*/
		/*}*/
		/*判断状态寄存器、接收到的字符数目*/ 
		/*根据数据返回状态*/
		if(FoundError)/*非正常接收*/
			return(ERROR);
		return(data);
	}
	return(data);
}

STATUS kglWrite(int kglDevId, unsigned short data,int hlflag)
{
	kgl_DEV* pkglDev=(kgl_DEV *)kglDevId;
	BOOL FoundError; 
	if (pkglDev==(kgl_DEV *)NULL)
	{
		errnoSet(S_kgl_NODEV);
		return(ERROR);
	}
	if(pkglDev->ReadyToWrite)
	{
		pkglDev->ReadyToWrite=FALSE;
		switch(hlflag)
		{
			case KGL_LOW_FLAG:
				*((UINT16*)(memBaseAdr+KGL_WRITELOW_OFFSET))=data;
				break;
			case KGL_HIGH_FLAG:
				*((UINT16*)(memBaseAdr+KGL_WRITEHIGH_OFFSET))=data;
				break;
			default:
			errnoSet(S_kgl_NOADDR);
			pkglDev->ReadyToWrite=TRUE;
			return(ERROR);	 
		}
		/*向设备发送*/
	/*	*((UINT16* )(memBaseAdr+KGL_WRITELOW_OFFSET))=data;
		*((UINT16* )(memBaseAdr+KGL_WRITEHIGH_OFFSET))=data;*/
		/*判断相关状态*/
	}
	pkglDev->ReadyToWrite=TRUE; 
	if(FoundError)
		return(ERROR);
	return(OK);
}

/*
int kglIoctl(int kglDevId, int cmd, int arg)
{
	int status;
	kgl_DEV *pkglDev=(kgl_DEV *)kglDevId;
	switch(cmd)
	{
	case FIOSELECT:
		selNodeAdd(&pkglDev->selWakeupList,(SEL_WAKEUP_NODE *)arg);
		if((selWakeupType((SEL_WAKEUP_NODE *)arg)==SELREAD)&&(&pkglDev->ReadyToRead))
			selWakeup((SEL_WAKEUP_NODE *)arg);
		if((selWakeupType((SEL_WAKEUP_NODE *)arg)==SELWRITE)&&(&pkglDev->ReadyToWrite))
			selWakeup((SEL_WAKEUP_NODE *)arg);
		break;
	case FIOUNSELECT:
		selNodeDelete(&pkglDev->selWakeupList, (SEL_WAKEUP_NODE *)arg);
		break;
	case kgl_STATUS_GET:
		status=kglStatusGet(&arg);
		break;
	case kgl_CONTROL_SET:
		status=kglCMDSet(arg);
		break;
	default:
		errno=S_ioLib_UNKNOWN_REQUEST;
		status=ERROR;
	}
	return(status);
}
*/

int kglClose(int kglDevId)
{
	kgl_DEV* pkglDev=(kgl_DEV*)kglDevId;
	if(pkglDev==(kgl_DEV *)NULL)
	{
		errnoSet(S_kgl_NODEV);	/*errnoSet(S_kgl_NOMem);*/
		return(ERROR);
	}
	/*设备相关操作*/
	/*释放相关资源*/
	free(pkglDev);
	return (OK);
}


STATUS kglDelete(char *devName)
{
	DEV_HDR *pDevHdr;
	char * pNameTail;
	pDevHdr=iosDevFind(devName, &pNameTail);
	if(pDevHdr==NULL||*pNameTail!='\0')
		return(ERROR);
	iosDevDelete(pDevHdr);
	return(OK);
}


void kglPciInit (void)
{
	int pciBus;
	int pciDevice;
	int pciFunc;
	int unit;
	int DevLoop;
	int BarLoop;
	UINT32 iCommand;
	UINT32 membaseCsr;
	UINT memLength;
	BOOL duplicate;
	int ix;
	
	logMsg("start kglPciInit**********************************\n",0,0,0,0,0,0);
	/*总共循环指定设备的次数,每设备循环4次(pci器件的标号),支持6个区段地址*/
/*	for(DevLoop=0; DevLoop<7; DevLoop++)
	{*/
		for (unit = 0; unit < 4; unit++)
		{
			if (pciFindDevice (KGL_VENDER_ID,KGL_DEVICE_ID,unit,&pciBus, &pciDevice, &pciFunc) != OK)
				break;
			/*找到正确设备 */
			logMsg("find device:VendorId=%d,devId=%d,pciBus=%d,pciDevice=%d,pciFunc=%d\n",\
					KGL_VENDER_ID,KGL_DEVICE_ID,pciBus,pciDevice,pciFunc,0);
		
			pciConfigInLong(pciBus,pciDevice,pciFunc,PCI_CFG_COMMAND,&iCommand);
			pciConfigOutLong(pciBus, pciDevice, pciFunc,PCI_CFG_COMMAND,iCommand | CSR_MEM_EN | CSR_BM_EN );    
		
			/*这里的循环确定了所需读入的基地址数量*/
			for(BarLoop=0; BarLoop<4; BarLoop++)
			{
				/* 获取内存基地址和I/O基地址 */
				pciConfigInLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_0+BarLoop*4, &membaseCsr);  /*读内存基地址1寄存器.*/
				/*检查所需的内存地址和I/O地址范围 Check out the range of memory and I/O that PMCDev board needs.*/
				pciConfigOutLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_0+BarLoop*4, 0xffffffff); 
				pciConfigInLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_0+BarLoop*4, &memLength); 
				/*这里面可能需要重新确定一下长度*/
				pciConfigOutLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_0+BarLoop*4, membaseCsr); 
				
				pciConfigInLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_2, &membaseCsr);  /*读内存基地址1寄存器.*/
				/*检查所需的内存地址和I/O地址范围 Check out the range of memory and I/O that PMCDev board needs.*/
				pciConfigOutLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_2, 0xffffffff); 
				pciConfigInLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_2, &memLength); 
				pciConfigInWord (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_2, &memLength); 
				/*这里面可能需要重新确定一下长度*/
				pciConfigOutLong (pciBus, pciDevice, pciFunc,
					PCI_CFG_BASE_ADDRESS_2, membaseCsr); 

				
				/*这里要判断一下是否是I/O空间*/
				if(membaseCsr&0x00001)/*I/O空间*/
				{
					membaseCsr &= PCI_IOBASE_MASK;
					/*I/O空间不需要做地址映射*/
				}
				else/*内存空间*/
				{
					membaseCsr &= PCI_MEMBASE_MASK;
					memBaseAdr=membaseCsr;	/**/
					/*将内存映射加入到sysPhysMemDesc[] */ 
				#if (defined(INCLUDE_MMU_FULL) || defined(INCLUDE_MMU_BASIC))
					if(sysMmuMapAdd((void *)membaseCsr,memLength,initialStateMask,initialState) == ERROR)
							break;
					logMsg("map memory mapping success\n",0,0,0,0,0,0);
					/***********************以下由lina加入*********************************
					if (sysMmuMapAdd((void *)membaseFlash, memLength,initialStateMask,initialState) == ERROR)
					break; 
					***********************以上由lina加入,完毕****************************/
				#endif
				 }
			 }
			 
		 }
	/* }*/
}

void test (void)
{
	int devId;
	STATUS writeStatus;
	int readLength;
	char * devName="kgl";
	unsigned short readdata;	
	logMsg("start test***********************************************\n",0,0,0,0,0,0);

	kglPciInit();	
	kglDrv();
	kglDevCreate(devName);	
	
	devId=kglOpen(&(pkglDev->devHdr),devName,0,0);
	devId=open(devName,O_RDWR,0);
	writeStatus=kglWrite(devId,0xfffa,0);
	writeStatus=kglWrite(devId,0xffff,1);
	readdata= kglRead(devId,0);
	readdata= kglRead(devId,1);

	writeStatus=kglWrite(devId,0x0000,0);
	writeStatus=kglWrite(devId,0x0000,1);
	readdata= kglRead(devId,0);
	readdata= kglRead(devId,1);

	
}

⌨️ 快捷键说明

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