📄 vt82c686.c
字号:
/*vt82c686.c */
/*
modification history
--------------------
2007.10.11,kuangyaowen,creat,evoc
*/
/*
DESCRIPTION
.CS
Upon completion, SIO resource registers are mapped as follows:
Resource Enabled Address
UART1 Yes COM1 3F8-3FF
UART2 Yes COM2 2F8-2FF
PARALLEL Yes LPT1 378-37f
RTC Yes 070, 071
KBC Yes 060, 064
.CE
*/
/* includes */
#include "vxWorks.h"
#include "ftpLib.h"
/* defines */
/* typedefs */
/* globals */
/* forward declarations */
/* externals */
/*初始化串口控制器*/
void initSerial(void)
{
char confval,val = 0;
/*配置super io,进入配置模式,并使能super io*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,0x3);
#ifdef HIGH_SPEED_SERIAL
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xee);
val=sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,val|0xc0); /* both ports on high speed*/
#endif
/*set COM1 base Addr =0x3f8*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe7);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,COM1_ADR>>2);
/*logMsg("reg e7 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);*/
/*set COM2 base Addr =0x2f8*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe8);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,COM2_ADR>>2);
/*logMsg("reg e8 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);*/
/*COM1,COM2 IRQ routing*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG2,1,COM1_IRQ|COM2_IRQ);
/*使能COM1,COM2*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe2);
val=sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,val | E2_S1|E2_S2);
/*logMsg("reg e2 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);*/
/*退出配置模式*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,0x1);
}
/*初始化LPT*/
void initLPT(void)
{
char confval,val;
/*配置super io,进入配置模式*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,0x3);
/*set LPT base Addr =0x378*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe6);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,LPT_ADR>>2);
/*logMsg("reg e6 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);*/
/*LPT IRQ routing*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG1,1,PARALLEL_IRQ);
/*使能LPT*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe2);
val=sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,val&(~0x3));
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe2);
val=sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,val | E2_EPP);/*设置EPP模式*/
/*退出配置模式*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,0x1);
}
/*初始化中断路由*/
void initIRQ(void)
{
char val = 0;
/*并口(LPT)*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG1,1,PARALLEL_IRQ);
/*COM1,COM2*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG2,1,COM1_IRQ|COM2_IRQ);
/*PCI A*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG4,1,&val);
val &= 0x0f;
val |= PCIA_IRQ;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG4,1,val);
/*PCI B,C*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG5,1,PCIB_IRQ|PCIC_IRQ);
/*PCI D*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG6,1,&val);
val &= 0x0f;
val |= PCID_IRQ;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG6,1,val);
/*PCI 中断类型(edge(边缘) <- 1,level(电平) <- 0)*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,PCI_IRQ_TYPE_REG,1,&val);
val &= 0xf0;/*PCI A-D均为电平中断(只有电平中断才能共享)*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,PCI_IRQ_TYPE_REG,1,val);
}
/*初始化键盘*/
void initKeyBoard(void)
{
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x5a,1,0xff);
}
/*初始化IDE*/
void initIDE(void)
{
char val;
/*PCI function 0*/
/* IDE controller enable */
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x48,1,&val);
val &= ~2;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x48,1,val);
/* IDE IRQ Route (primary IDE <- 14,second IDE <- 15)*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x4a,1,&val);
val &= 0xf0;
val |= 0x4;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x4a,1,val);
/*PCI function 1*/
/* enable IO space */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x04,1,0x07);
/* set to compatible mode */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x09,1,0x8a);
/* latency */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x0d,1,0x0/*0xd0*/);
/* set to legacy interrupt */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x3d,1,0x00);
/* enable primary/secondary channel */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x40,1,/*0x0b*/0x3);
/* disable prefetch buffer & post write buffer */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x41,1,0xf2);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x42,1,0x09);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x43,1,0x25);
/* set zero wait state for master read/write
* to make ict nb happy
*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x44,1,0x1c);
/* disable memory read multiple/memory write and invalidate
*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x45,1,0x10);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x46,1,0xc0);
/*Drive Timing Control*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x48,4,0x20202020);
/*Address Setup Time 00--->1T
(很重要:可以解决部分慢速硬盘的访问问题)*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x4c,1,0x00);
/*Primary IDE Status*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x70,1,0x82);
/*Primary Interrupt Control*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x71,1,0x01);
/*Primary IDE Status*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x78,1,0x82);
/*Primary Interrupt Control*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x79,1,0x01);
/*IDE I/O space*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x10,4,0x1f1);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x14,4,0x3f5);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x18,4,0x171);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x1c,4,0x375);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_IDE_FUNC,0x20,4,0xcc01);
}
/*禁止USB*/
void disableUSB(void)
{
}
/*初始化USB*/
void initUSB(void)
{
char val;
/* USB controller enable*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x48,1,&val);
val &= ~4;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x48,1,val);
/* Command */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_USB_FUNC_01,0x4,2,0x3);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_USB_FUNC_23,0x4,2,0x3);
/*I/O base address(port 0-1)*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_USB_FUNC_01,0x20,4,0xa001);
/*IRQ(port 0-1)*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_USB_FUNC_01,0x3c,1,0xa);
/*I/O base address(port 2-3)*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_USB_FUNC_23,0x20,4,0xc001);
/*IRQ(port 2-3)*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_USB_FUNC_23,0x3c,1,0xb);
}
/*初始化I/O译码*/
void enableIoDecode(void)
{
char val;
/*enable super-io*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x85,1,0x01);
#if 0
/*enable On-Board I/O Port Positive Decoding*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x81,1,&val);
val |= 0x80;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x81,1,val);
#endif
#if 1
/*enable LPT I/O译码*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x82,1,&val);
val |= 0x50;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x82,1,val);
#endif
/*enable com1 and com2 I/O译码*/
vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x83,1,&val);
val |= 0x90|0x08;
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x83,1,val);
}
void isaInit(void)
{
/* FIXME: Try to generate a PCI reset */
/*vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x47,1,0x01);
taskDelay(20);*/
/* Enable I/O Recovery time */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x40,1,0x08);
/* Enable ISA refresh */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x41,1,0x01);
/* disable ISA line buffer*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x45,1,0x00);
/* Gate INTR, and flush line buffer */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x46,1,0xe0);
/* Enable EISA ports 4D0/4D1. Do we need this ? */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x47,1,0xe6);
/* 512 K PCI Decode */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x48,1,0x01);
/* Wait for PGNT before grant to ISA Master/DMA */
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x4a,1,0x84);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x80,1,0x00);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x85,1,0x01);
}
/*南桥芯片初始化*/
void vt82c686Init(void)
{
/*isaInit();*/
initSerial();
initLPT();
initKeyBoard();
/*initIDE();*/
initIRQ();
enableIoDecode();
initUSB();
}
/*CPCI桥芯片(PCI 6150)初始化*/
void pci6150Init(void)
{
/*PCI Command*/
vt82c686PciConfigWrite(0,17,0,0x4,2,0x0107);
/*PCI Cache Line Size*/
vt82c686PciConfigWrite(0,17,0,0x0c,1,0x08);
/*Primary PCI Bus Latency Timer*/
vt82c686PciConfigWrite(0,17,0,0x0d,1,0x40);
/*PCI Primary Bus Number*/
vt82c686PciConfigWrite(0,17,0,0x18,1,0);/*bus 0*/
/*PCI Secondary Bus Number*/
vt82c686PciConfigWrite(0,17,0,0x19,1,1);/*bus 1*/
/*PCI Subordinate Bus Number*/
vt82c686PciConfigWrite(0,17,0,0x1a,1,1);/*bus 1*/
/*Secondary PCI Bus Latency Timer*/
vt82c686PciConfigWrite(0,17,0,0x1b,1,0x40);
/*I/O Base*/
vt82c686PciConfigWrite(0,17,0,0x1c,1,0xf1);
vt82c686PciConfigWrite(0,17,0,0x1d,1,0x01);
/*Memory Base*/
vt82c686PciConfigWrite(0,17,0,0x20,2,0xff40);
vt82c686PciConfigWrite(0,17,0,0x22,2,0xff40);
/*Prefetchable Memory Base*/
vt82c686PciConfigWrite(0,17,0,0x24,2,0xfff1);
vt82c686PciConfigWrite(0,17,0,0x26,2,0x01);
/*Prefetchable Memory Base Upper 32 Bits*/
vt82c686PciConfigWrite(0,17,0,0x28,4,0x0);
vt82c686PciConfigWrite(0,17,0,0x2c,4,0x0);
/*Bridge Control*/
vt82c686PciConfigWrite(0,17,0,0x3e,1,0x03);
}
void pci6150show()
{
int i;
int reg=0;
printf("pci 6150 registers:\n");
for(i=0;i<=0xec;i+=4)
{
vt82c686PciConfigRead(0,17,0,i,4,®);
printf("index=0x%x,reg=0x%x\n",i,reg);
}
}
void serial()
{
char confval,val = 0;
printf("---serial---\n");
/*配置super io,进入配置模式*/
/*vt82c686PciConfigRead(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,&confval);
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,confval | 0x2);*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,0x3);
/*enable super-io*/
/*vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,0x85,1,0x01);*/
/*set COM1 base Addr =0x3f8*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe7);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,COM1_ADR>>2);
logMsg("reg e7 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);
/*set COM2 base Addr =0x2f8*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe8);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,COM2_ADR>>2);
logMsg("reg e8 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);
/*COM1,COM2 IRQ routing*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,IRQ_ROUTE_REG2,1,COM1_IRQ|COM2_IRQ);
/*使能COM1,COM2*/
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe2);
val=sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1,val | E2_S1|E2_S2);
logMsg("reg e2 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe0);
logMsg("e0 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe7);
logMsg("e7 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe8);
logMsg("e8 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);
sysOutByte(PCI_MSTR_ISA_IO_LOCAL+0x3f0,0xe2);
logMsg("e2 = %x\n",sysInByte(PCI_MSTR_ISA_IO_LOCAL+0x3f1),0,0,0,0,0);
/*退出配置模式*/
/*vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,confval);*/
vt82c686PciConfigWrite(VTSB_BUS,VTSB_DEV,VTSB_ISA_FUNC,SUPERIO_CFG_REG,1,0x1);
}
/*******************************************************************************
*
* go - start at specified address
*/
void go
(
FUNCPTR entry
)
{
printf ("Starting at 0x%x...\n\n", (int) entry);
taskDelay (sysClkRateGet ()); /* give the network a moment to close */
intLock();
(entry) (); /* go to entry point - never to return */
}
int ftptest()
{
int ctrlSock;
int dataSock;
char buf [15];
int nBytes;
STATUS status;
int i;
FUNCPTR * pEntry;
char *pbuf;
int n =0;
char get;
pbuf = (char *)malloc(0x200000);
memset(pbuf,0,sizeof(pbuf));
if(pbuf ==NULL)
{
printf("malloc error!\n");
return ERROR;
}
if (ftpXfer ("host", "target", "target", "",
"RETR %s", "", "vxworks",
&ctrlSock, &dataSock) == ERROR)
return (ERROR);
/*
while ((nBytes = read (dataSock, pbuf, sizeof (pbuf))) > 0)
{
}
*/
/* printf( "Read file:\n" ) ;
while(fscanf(dataSock,"%c",&get) != EOF )
{
pbuf[n] = get;
n++;
}*/
#if 0
nBytes = read (dataSock, pbuf, 0x1b3333/*sizeof (pbuf)*/);
for(i=0;i<15;i++)
{
printf("buf %d = %c\n",i,pbuf[i]);
}
#endif
if(bootLoadModule (dataSock, pEntry) != OK)
{
printf("read error.\n");
}
printf("pbuf=0x%x,nBytes=0x%x\n",pEntry,nBytes);
close (dataSock);
if (nBytes < 0) /* read error? */
{
status = ERROR;
}
if (ftpReplyGet (ctrlSock, TRUE) != FTP_COMPLETE)
status = ERROR;
if (ftpCommand (ctrlSock, "QUIT", 0, 0, 0, 0, 0, 0) != FTP_COMPLETE)
status = ERROR;
close (ctrlSock);
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -