?? fastboot.c.bak
字號:
/********************************************************************/
/*Copyright (c) 2003 DJ
**All rights reserved.
**
**File Name:fastBoot.c
**File Desc:act as a bootLoader.
**Cur Ver: 1.0
**
**Author: Shawnsan
**Date: 2003-05-20
**
**Modify:
**Old Ver:
**
*/
/*******************************************************************/
#include "vxWorks.h"
#include "errno.h"
#include "ftpLib.h"
#include "hostLib.h"
#include "loadLib.h"
#include "string.h"
#include "memLib.h"
#include "sockLib.h"
#include "stdio.h"
#include "fioLib.h"
#include "fcntl.h"
#include "bootLib.h"
#include "ioLib.h"
#include "iosLib.h"
#include "string.h"
#include "rebootLib.h"
#include "sysSymTbl.h"
#include "symbol.h"
#include "ctype.h"
#include <stdlib.h>
#include <unistd.h>
#include <selectLib.h>
#include <errnoLib.h>
#include <ftpLib.h>
#include "sysLib.h"
#include "netinet/in.h"
#include "sockLib.h"
#include "fastBoot.h"
#include "sst39vf160.h"
#define MAX_LINE 80
#define SST39VF160_FLASH_BASE_ADDR 0x2100000
#undef DM_DYNLOAD_DEBUG
char *flashDataBuf;
int flashDataLen;
LOCAL STATUS modLoadViaFtp(char *hostName,char *fileName,char *usr,char *passwd);
LOCAL STATUS dmGetFileViaFtp(char *host, char *user, char *passwd, char *acct,
char *cmd, char *dirname, char *filename,int *pCtrlSock, int *pDataSock);
LOCAL STATUS flashDataStart();
extern int consoleFd; /* fd of initial console device */
STATUS objFlash(void)
{
char *hostName=(char *) malloc(MAX_LINE);
char *fileName=(char *) malloc(MAX_LINE);
char *usr=(char *)malloc(MAX_LINE);
char *passwd=(char *) malloc(MAX_LINE);
char line[MAX_LINE];
char *pLine;
/*malloc 4M bytes*/
if((flashDataBuf=(char *)malloc(256*8*5*512*(sizeof(char))))==NULL)
{
printf("Error in malloc mem with flashDataBuf\n");
return (ERROR);
}
(void) ioctl (consoleFd, FIOSETOPTIONS, OPT_TERMINAL);
printf("\n請輸入主機IP[192.168.0.80]:");
fioRdString (STD_IN, line, sizeof (line));
strcpy(hostName,line);
if(*hostName == EOS)
{
hostName="192.168.0.80";
}
printf("\n請輸入燒錄映像文件[uclinux.bin]:");
fioRdString (STD_IN, line, sizeof (line));
strcpy(fileName,line);
if(*fileName == EOS)
{
fileName="uclinux.bin";
}
printf("\n請輸入FTP用戶名[efun]:");
fioRdString (STD_IN, line, sizeof (line));
strcpy(usr,line);
if(*usr == EOS)
{
usr="efun";
}
printf("\n請輸入FTP用戶密碼[efun]:");
fioRdString (STD_IN, line, sizeof (line));
strcpy(passwd,line);
if(*passwd == EOS)
{
passwd="efun";
}
printf("\n主機IP:%s\n映像文件名:%s\n用戶名:%s\n用戶密碼:%s",hostName,fileName,usr,passwd);
printf("\n以上參數是否正確,確認要燒寫嗎(y/n):");
fioRdString (STD_IN, line, sizeof (line));
pLine = line;
if((*pLine != 'y')&&(*pLine != 'Y'))
{
return(ERROR);
}
if(modLoadViaFtp(hostName,fileName,usr,passwd)==OK)
{
if(flashDataStart()==OK)
{
/* free(flashDataBuf);*/
/* free(hostName);
free(fileName);
free(usr);
free(passwd);*/
return(OK);
}
else
{
/* free(flashDataBuf);
free(hostName);
free(fileName);
free(usr);
free(passwd); */
return(ERROR);
}
}
else
{
/* free(flashDataBuf);
free(hostName);
free(fileName);
free(usr);
free(passwd);*/
return(ERROR);
}
}
/*******************************************************************
* Function Name : LOCAL STATUS modLoadViaFtp(char *hostName,char *fileName,char *usr,char *passwd)
* Description : get file from host via ftp and load it to system
* Input : options to login ftp server
* Output : none
* Returns : OK on success; ERROR if a failure was encountered
* Oautions : none
*******************************************************************/
STATUS modLoadViaFtp(char *hostName,char *fileName,char *usr,char *passwd)
{
int fd;
int errFd; /* for receiving standard error messages from Unix */
int nBytes,datalen;
#ifdef DM_DYNLOAD_DEBUG
printf ("Loading... ");
#endif
/*get file from host,if cann't get*/
if(dmGetFileViaFtp(hostName, usr, passwd, "", "RETR %s", "", fileName,&errFd, &fd) == ERROR)
{
printf("can't get file from host\n");
return(ERROR);
}
/*read the ftp socket to a buf*/
flashDataLen = 0;
datalen = 0x1000;
memset(flashDataBuf,0,(256*8*4*512));
while(1)
{
nBytes = read (fd, flashDataBuf+flashDataLen, datalen);
if(nBytes > 0)
{
flashDataLen += nBytes;
}
else
{
break;
}
}
ftpCommand (errFd, "QUIT",0,0,0,0,0,0); /*quit ftp*/
free(flashDataBuf);
close (fd);
close (errFd);
return (OK);
}
#define FTP_DATA_CONN_TIMEOUT 80 /* sec */
#undef DM_FTP_DEBUG
/*******************************************************************
* Function Name : STATUS dmGetFileViaFtp(char *host, char *user, char *passwd, char *acct,
char *cmd, char *dirname, char *filename,int *pCtrlSock, int *pDataSock)
* Description : implement ftp connect to host
* Input : paras used by ftp authentication
* Output : pCtrlSock, pDataSock
* Returns : OK on success; ERROR if a failure was encountered
* Oautions : none
*******************************************************************/
LOCAL STATUS dmGetFileViaFtp(char *host, char *user, char *passwd, char *acct,
char *cmd, char *dirname, char *filename,int *pCtrlSock, int *pDataSock)
{
int ctrlSock = ERROR, dataSock = ERROR;
struct fd_set rfd;
int result;
struct timeval tmo;
char *errmsg = NULL;
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: hookup host=%s file=%s\n", host, filename);
#endif
if ((ctrlSock = ftpHookup(host)) == ERROR)
{
errmsg = "server unreachable";
goto error;
}
*pCtrlSock = ctrlSock; /*return ctrlSock by pointer pCtrlSock*/
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: login user=%s\n", user);
#endif
if (ftpLogin(ctrlSock, user, passwd, acct) != OK) /*login host */
{
errmsg = "authentication failed";
goto error;
}
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: set binary\n");
#endif
if (ftpCommand(ctrlSock, "TYPE I", 0, 0, 0, 0, 0, 0) != FTP_COMPLETE) /*set binary mode*/
{
errmsg = "set binary mode failed";
goto error;
}
if (dirname[0]) /*if directory not empty ,chaged it by send command to host*/
{
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: cd %s\n", dirname);
#endif
if(ftpCommand(ctrlSock, "CWD %s",(int) dirname, 0, 0, 0, 0, 0) != FTP_COMPLETE)
{
errmsg = "change directory failed";
goto error;
}
}
/*
* Retry loop for transient errors, such as the remote host being
* unable to assign the requested port number.
*/
retry_transient_error:
/*
* If this is a transfer command requiring a data connection,
* first establish socket for server to connect back to.
*/
if (pDataSock)
{
int len;
short port;
struct sockaddr_in ownAddr;
struct sockaddr_in dataAddr;
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: set binary\n");
#endif
/* Find out our own address */
len = sizeof (ownAddr);
if (getsockname(ctrlSock, (struct sockaddr *) &ownAddr, &len) < 0)
{
errmsg = "FTP could not get own addr";
goto error;
}
if ((dataSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
errmsg = "FTP could not create data socket";
goto error;
}
dataAddr = ownAddr;
dataAddr.sin_port = htons(0);
if (bind(dataSock,(struct sockaddr *) &dataAddr,sizeof (dataAddr)) != OK)
{
close(dataSock);
errmsg = "FTP could not bind data socket";
goto error;
}
/* Read back to find out what port was bound */
len = sizeof (dataAddr);
if (getsockname(dataSock, (struct sockaddr *) &dataAddr, &len) < 0)
{
errmsg = "FTP could not get data addr";
goto error;
}
port = ntohs(dataAddr.sin_port);
if (listen(dataSock, 1) < 0)
{
close(dataSock);
errmsg = "FTP could not listen on data socket";
goto error;
}
/* Use PORT command to inform server of data socket address */
if (ftpCommand(ctrlSock,
"PORT %d,%d,%d,%d,%d,%d",
(int) ((UINT8 *) &dataAddr.sin_addr)[0],
(int) ((UINT8 *) &dataAddr.sin_addr)[1],
(int) ((UINT8 *) &dataAddr.sin_addr)[2],
(int) ((UINT8 *) &dataAddr.sin_addr)[3],
(int) (port >> 8),
(int) (port & 0xff)) != FTP_COMPLETE)
{
close(dataSock);
errmsg = "FTP could not send PORT command";
goto error;
}
}
/*
* Send the FTP command.
*/
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: command %s\n", cmd);
#endif
result = ftpCommand(ctrlSock, cmd, (int) filename, 0, 0, 0, 0, 0);
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: result %d\n", result);
#endif
switch (result)
{
case FTP_TRANSIENT:
if (pDataSock)
{
close(dataSock);
}
goto retry_transient_error;
case FTP_COMPLETE:
case FTP_CONTINUE:
if (pDataSock)
{
close(dataSock);
errmsg = "server returned COMPLETE or CONTINUE instead of PRELIM";
goto error;
}
return OK; /* Non-transfer command succeeded */
case FTP_PRELIM:
if (! pDataSock)
{
errmsg = "server returned PRELIM for non-transfer command";
goto error;
}
break; /* Continue below to start transfer */
default:
if (pDataSock)
{
close(dataSock);
}
errmsg = "command failed";
goto error;
}
/*
* Wait for server to connect back on data socket.
* Use select to provide a timeout.
*/
FD_ZERO(&rfd);
FD_SET(dataSock, &rfd);
tmo.tv_sec = FTP_DATA_CONN_TIMEOUT;
tmo.tv_usec = 0;
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: wait for data\n");
#endif
if (select(FD_SETSIZE, &rfd, NULL, NULL, &tmo) < 0)
{
if (pDataSock)
close(dataSock);
errmsg = "data conn failed or timed out";
goto error;
}
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: get data conn\n");
#endif
if ((dataSock = ftpDataConnGet(dataSock)) == ERROR)
{
errmsg = "failed to accept server connection";
goto error;
}
*pDataSock = dataSock; /*return data socket*/
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: return OK\n");
#endif
return OK;
error:
if (errmsg)
printErr("FTP ERROR: %s (errno=%d)\n", errmsg, errnoGet());
if (ctrlSock != ERROR)
{
(void) ftpCommand(ctrlSock, "QUIT", 0, 0, 0, 0, 0, 0);
close(ctrlSock);
}
#ifdef DM_FTP_DEBUG
printf("dmGetFileViaFtp: return ERROR\n");
#endif
return ERROR;
}
STATUS flashDataStart(void)
{
printf("\nErasing flash......");
if(sstChipErase()==ERROR)
{
printf("failed!");
return ERROR;
}
printf("OK");
printf("\nWriting flash......");
if(sstWrite((UINT16 *)SST39VF160_FLASH_BASE_ADDR , flashDataBuf , flashDataLen)==NULL)
{
printf("failed!");
return ERROR;
}
printf("OK");
return(OK);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -