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

📄 vt82c686.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 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,&reg);
		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 + -