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

📄 driver.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 C
字号:
/* driver.c - device initialization */

/* Copyright 2007 evoc, Inc. */
#include "copyright_wrs.h"

#include "vxWorks.h"
#include "iv.h"
#include "intLib.h"
#include "config.h"
#include "sysLib.h"
#include "i8250Sio.h"
#include "taskLib.h"
#include "config.h"

#include <end.h>
#include <in.h>
#include <stdio.h>
#include <time.h>
#include "dosFsLib.h"
#include "tffs/tffsDrv.h"
#include <drv/parallel/lptDrv.h>

#define inportb sysInByte
#define outportb sysOutByte

extern void ledRun(void);
extern int wncan_esd_pc104_200_init(void);

#ifdef INCLUDE_ATA_686
extern STATUS usrAtaConfig (int ctrl, int drive, char *fileName);
extern ATA_CTRL  ataCtrl [ATA_MAX_CTRLS];   /* Number of controllers is hardware dependant */
#endif

#ifdef INCLUDE_END
#include "muxLib.h"
#include "muxTkLib.h"
#include "m2Lib.h"

IMPORT int 	ipAttach ();
/*IMPORT END_TBL_ENTRY endDevTbl[];*/

typedef struct cookie_tbl
    {
    int unitNo;
    char devName[END_NAME_MAX];
    void* pCookie;
    }COOKIE_TBL;

COOKIE_TBL cookieTbl[32];


#ifndef MUX_MAX_BINDS
#define MUX_MAX_BINDS 8
#endif

void*   pCookie;
M2_INTERFACETBL endM2Tbl;
#endif 	/* INCLUDE_END */

#define WATCH_DOG_REG				(*(volatile unsigned char *)0xffc00002) /*bit 7*/
#define WATCH_DOG_ADDR				(*(volatile unsigned char *)0xffc00001) /*bit 0-7*/

/*并口测试函数*/
int lptPrint()
{
	int fd = 0;
	int loop=0;
	char buffer[64];
	int i;
	int pages = 5;
	memset(buffer,0,sizeof(buffer));
#if 1
	fd=open("/lpt/0",O_WRONLY,0);
	
	if(fd== ERROR)
	{
		printf("Parallel port open error!\n");
		close(fd);
		return ERROR;
	}
	
	for(i=0;i<pages;i++)
	{	
		memset(buffer,0,sizeof(buffer));	
		sprintf(buffer,"\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"aaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"bbbbbbbbbccccccccccccccccccccccccccccc\r\n\t");
		write(fd,buffer,sizeof(buffer));	

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"cccccccccddddddddddddddddddddddddddddd\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"dddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeee\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"cccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"ddddddddfffffffffffffffffffffffffffffffff\r\n\t");
		write(fd,buffer,sizeof(buffer));
		sprintf(buffer,"eeeeeeeeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n\t"); 
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"ffffffffBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\r\n\t");
		write(fd,buffer,sizeof buffer);

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"ggggggggCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"11111111DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"22222222AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"3333333ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\r\n\t");
		write(fd,buffer,sizeof buffer);

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"44444444VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\r\n\t");
		write(fd,buffer,sizeof(buffer)); 

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"5555555??????????????????????????????????????????\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"6666666!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n\t");
		write(fd,buffer,sizeof(buffer));

		sprintf(buffer,"77777777++++++++++++++++++++++++++++++++++++++++\r\n\t");
		write(fd,buffer,sizeof(buffer));
		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"88888888=======================================\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"99999999````````222@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"This is www.evoc.com.cn parallel port test programer \r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"OK,parallel Port is good OK\r\n\t");
		write(fd,buffer,sizeof(buffer));

		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"if you find a bug,please email: sz.ywkuang@evoc.com.cn\r\n\n\r");
		write(fd,buffer,sizeof(buffer));
		   /*sleep(1);*/
	}
	
	close(fd);
#endif	
	return OK;
}

void lptTest()
{
    /*启动打印任务*/
    (void)taskSpawn("lptPrintTask",110,0,4000,(FUNCPTR)lptPrint,0,0,0,0,0,0,0,0,0,0);
}


/*1、向RTL8139网口绑定TCP/IP协议栈
2、给RTL8139网口添加IP地址*/
void Pentium_Eth_Add_Rtl(int unit)
{
    BOOT_PARAMS params;

    BOOL rtlBind = 0;
    END_OBJ *pEnd;
	char IpAddr[20] = {0};
	char GateWay[20] = {0};
	char* pIpAddr;
	char *pGateWay;
	int mask;
    struct in_addr iaddr;
    char  devName [10];


	pIpAddr = IpAddr;
	pGateWay = GateWay;

	if(unit >2)
	{
		printf("End unit error!\n");
		return;
	}

	/*如果获取IP地址失败,将使用默认值*/
	if(DrvGetIp(unit,pIpAddr,&mask,pGateWay) != OK)
	{
		switch(unit)
		{
			case 0:
			/*把一个数转化为IP地址*/        
			iaddr.s_addr = 0xc0a863dc;/*192.168.99.220*/
			pIpAddr = ( char*)inet_ntoa (iaddr);
			
			iaddr.s_addr = 0xc0a86301;/*192.168.99.1*/
			pGateWay = ( char*)inet_ntoa (iaddr);

			mask = 0xffffff00;
			break;
			case 1:
			/*把一个数转化为IP地址*/        
			iaddr.s_addr = 0xc0a864dc;/*192.168.100.220*/
			pIpAddr = ( char*)inet_ntoa (iaddr);
			
			iaddr.s_addr = 0xc0a86401;/*192.168.100.1*/
			pGateWay = ( char*)inet_ntoa (iaddr);

			mask = 0xffffff00;
			
			break;
			}

	}
			
    if (!rtlBind)
        {  
        /*This routine takes a string name and a unit number and 
        finds the device that has that name/unit combination.*/
        pEnd = (END_OBJ *)endFindByName("rtl",unit);
        
        if (pEnd != NULL)
        {
            /*This routine takes the unit number and device name of an END or NPT driver 
            and attaches the IP protocol to the corresponding device. 
            Following a successful attachment IP will begin receiving packets from the devices.*/
            if (ipAttach(unit, "rtl") != OK)
    	     {
    		   printf("Failed to attach TCP/IP to device %s%d\n","rtl", unit);
    		   return;
    	     }
    	     else
    	     {
                rtlBind= 1;
    	     }
    	     
        }
        else
        {
             printf("\r\n  can't find %s%d","rtl",unit);
        }
     }

	sprintf (devName, "%s%d", "rtl", unit);/*获取设备名*/

    /*配置IP地址和子网掩码*/
    if (!rtlBind ||usrNetIfConfig ("rtl", 
	                                      unit, 
	                                      pIpAddr,
                                    devName,
			                        mask) !=OK)
    {
        return;
    }
		
    printf ("\nAttached TCP/IP interface to %s\n", devName);
		
	/*添加网关*/
	if(routeAdd( pIpAddr, pGateWay ) !=OK )
	{
		printf("Add gateway \"%s\",for \"%s\" error!\n",pGateWay, pIpAddr);
	}
	else
	{
		printf("Add gateway \"%s\" for \"%s\"  OK!\n", pGateWay,pIpAddr);
	}

}


#ifdef INCLUDE_ATA_686	
/**************************************************************************
*
* atapiParamsPrint - Print the drive parameters.
*
* This user callable routine will read the current parameters from the
* corresponding drive and will print the specified range of parameters on
* the console.
*
* RETURNS: N/A.
*/

void atapiParamsPrint
    (
    int ctrl,
    int drive
    )
    {
    ATA_CTRL  * pCtrl        = &ataCtrl[ctrl];
    ATA_DRIVE * pDrive       = &pCtrl->drive[drive];
    ATA_PARAM * pParam       = &pDrive->param;
    char      * mychar       = (char *)pParam;
    int         i            = 0;

    for (i = 0; i <= sizeof(ATA_PARAM)/2; i++)
        {
        printf("\n            pParam[%d] = %#x %#x         %c %c          ",
               i, *(mychar + 2 * i + 1 ), *(mychar + 2 * i ),
               *(mychar + 2 * i + 1),*(mychar + 2 * i ));
        }

    }
#endif

/*启动硬件看门狗*/
void watchDogStart()
{
	WATCH_DOG_REG &= ~0x80 ;
}

/*看门狗清狗函数*/
void watchDogClear()
{
	while(1)
	{
		WATCH_DOG_ADDR = 0x55;
		taskDelay(1);
		WATCH_DOG_ADDR = 0xaa;
		taskDelay(1);
		WATCH_DOG_ADDR = 0x55;
		taskDelay(1);
		WATCH_DOG_ADDR = 0xaa;
		taskDelay(1);
		WATCH_DOG_ADDR = 0x55;
		taskDelay(1);
		WATCH_DOG_ADDR = 0xaa;
		taskDelay(1);
		WATCH_DOG_ADDR = 0x55;
		
		taskDelay(100);/*1秒钟清一次狗*/
		
	}
}

/*业务板热插拔中断响应*/
void pci6150Int()
{

	int		i,count;
	ULONG	hotplugreg;	/*bit7:Insert, bit6:Extract*/
	ULONG	offset;
	ULONG	ulregv;

	/*loop all slot to check if some devices inserted or extracted*/
	for(i=0; i<32;  i++)
	{

		sysPciConfigRead(1,i,0,0x34,4,&offset);
		offset &= 0x000000ff;
		
		hotplugreg = 0l;
		
 		/*locate hot swap register*/
		while(offset != 0 && offset != 0xff)
		{
		
			sysPciConfigRead(1,i,0,offset,4,&ulregv);
		
			if((ulregv&0x000000ff) == 0x06)
			{
				/*is hot swap register
				clear	hot_swap status*/
				do{
					hotplugreg = (ulregv&0x00ff0000);
					hotplugreg >>= 16;

					sysPciConfigWrite(1,i,0,offset,4,ulregv);

					sysPciConfigRead(1,i,0,offset,4,&ulregv);

				}while(ulregv&0x00C00000);/*if bit22.23 != 0 clear continue*/


				logMsg("Hot swap board(busNO:%d,deviceNO:%d,funtionNO:%d) is on or off.\n",1,i,0,0,0,0);

				break;
			}
			else
			{
				offset = ulregv&0x0000ff00;
				offset >>= 8; /*point to next power item*/
			}
		};	
	
	}
	
}

/*初始化设备驱动*/
int drvInit()
{	
	ATA_RESOURCE *pAtaResource;
	char devName[20];
	int i,j;
	int ix;
	    BLK_DEV * pBlkDev;

#ifdef INCLUDE_LPT_686

	IMPORT LPT_RESOURCE lptResources[];
#endif

#ifdef INCLUDE_END
    int			count;
    END_TBL_ENTRY *	pDevTbl;
    void *		pCookie = NULL;
#endif /* INCLUDE_END */

#ifdef  INCLUDE_TFFS_1208
	tffsDevFormatParams params = 
	{   
		/*前面0.5M作为启动参数存放区,后面63.5M使用文件系统*/
		{0/*0x100000*/, 99, 20, 0x10000, NULL, {0,0,0,0}, NULL, 2, 0, NULL},
		FTL_FORMAT_IF_NEEDED
	};     /*预留20bolck用于坏块替换*/
#endif

	printf( "\n" ) ;

/*#ifdef  INCLUDE_ATA_686*/
#if 1
#if 1

initIDE();
	/*sysPicInit();/*初始化8259中断控制器(vt82c686)*/
	/*vt82c686Init();/*初始化vt82c686南桥*/
	/*sysPciIbcIntrInit(VT_IRQ);/*使能南桥中断(8259),VT_IRQ=0X02*/
	/*sysAtaInit(0);	/* device zero used first time through */
#endif

    for (ix = 0; ix < ATA_MAX_CTRLS; ix++)
    {
        pAtaResource = &ataResources[ix];
        if (pAtaResource->ctrlType == IDE_LOCAL)
            if ((ataDrv (ix, pAtaResource->drives, pAtaResource->intVector,
		   pAtaResource->intLevel, pAtaResource->configType,
                   pAtaResource->semTimeout, pAtaResource->wdgTimeout))
		== ERROR)
		{
        printf("Could not initialize ataDrv %d.\n",ix);
		}
		else
		{
			printf("ataDrv Ok!\n");
		}
    }
		
      (void)dosFsInit (NUM_DOSFS_FILES);        /* initialize DOS-FS */

	for(i=0;i<ATA_MAX_CTRLS;i++)
	{
		for(j=0;j<ATA_MAX_DRIVES;j++)
		{
			if(OK==devPresent(i,j))
			{
				sprintf(devName,"%s%d%s%d","/ata",i,"/ide",j);
				
				printf("Attach %s ...",devName);
				
				if(OK == usrAtaConfig (i, j, devName))
				{
					printf("OK.\n");
				}
				else
				{
					printf("Error.\n");
				}
			}
		}
	}
	
	cd("/ata1/ide0");
	
#endif

#ifdef  INCLUDE_TFFS_1208
#if 1
    /*初始化文件系统*/
    if (tffsDrv () != OK)
    {
        printf("Could not initialize tffsDrv.\n");
    }
    else
    {
         (void)dosFsInit (20);        /* initialize DOS-FS */
         printf ("Attaching to TFFS... ");
     
         if (usrTffsConfig (0, 0, "/tffs0") == ERROR)
         {
             printf ("usrTffsConfig failed.   format tffs now\n");
             
             if( tffsDevFormat( 0,(int)&params ) == OK )
             {
			(void)dosFsInit (20);        /* initialize DOS-FS */    

			printf ("Attaching to TFFS... ");
			(void)usrTffsConfig (0, 0, "/tffs0") ;
			printf ("done.\n");

             }
		else
		{
			printf( "tffsDevFormat ERROR!\n" );
		}
             
         }
         else
         {
             printf ("done.\n");
         }  
    }
	#endif
	#if 0
	  /*初始化文件系统*/
    if (tffsDrv () != OK)
    {
        printf("Could not initialize tffsDrv.\n");
    }
    else
    {
         (void)dosFsInit (20);        /* initialize DOS-FS */
         printf ("Attaching to TFFS... ");
		 
	 pBlkDev = tffsDevCreate(0,0);

         if (dosFsDevCreate("/tffs0",pBlkDev,100,0) == ERROR)
         {
             printf ("usrTffsConfig failed.   format tffs now\n");
             
             if( tffsDevFormat( 0,(int)&params ) == OK )
             {
			(void)dosFsInit (20);        /* initialize DOS-FS */    

			printf ("Attaching to TFFS... ");
			(void)dosFsDevCreate("/tffs0",pBlkDev,100,0) ;
			printf ("done.\n");

             }
		else
		{
			printf( "tffsDevFormat ERROR!\n" );
		}
             
         }
         else
         {
             printf ("done.\n");
         }  
    }
	#endif
#endif

/*初始化网络协议栈(vxworks.st)*/
/*usrNetInit();*/

#ifdef INCLUDE_END
	/*添加IP地址和网关*/
	Pentium_Eth_Add_Rtl(0);
	Pentium_Eth_Add_Rtl(1);
#endif


#ifdef INCLUDE_CAN_BUS
	wncan_esd_pc104_200_init();
#endif

/*添加并口驱动*/
#ifdef INCLUDE_LPT_686

    if(lptDrv (LPT_CHANNELS, &lptResources[0]) == ERROR) /* init LPT parallel driver */
  	{
  		printf("LPT install error!\n");
  	}
	else
	{
		printf("\nLPT install ...");
	}

	lptDevCreate("/lpt/0",0);

	printf("OK.\n");
#endif/*INCLUDE_LPT*/

#ifdef CPCI_PCI_6150
	/*CPCI桥芯片(PCI 6150)初始化*/
	pci6150Init();
	intConnect(0x4,pci6150Int,0);
	sysIntEnablePIC(0x4);
#endif
	iosDevShow() ;

    printf("\nDefault Device Path is:");
    pwd() ;
	
	
	    /*启动点灯任务*/
    /*(void)taskSpawn("ledRunTask",255,0,4000,(FUNCPTR)ledRun,0,0,0,0,0,0,0,0,0,0);*/

	/*启动清狗任务*/
	(void)taskSpawn("watchDogTask",5,0,4000,(FUNCPTR)watchDogClear,0,0,0,0,0,0,0,0,0,0);

	/*启动硬件看门狗*/
	watchDogStart();
	
				
	return OK;
}

⌨️ 快捷键说明

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