📄 kgl.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 + -