📄 driver.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)¶ms ) == 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)¶ms ) == 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 + -