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

📄 fastboot.c

📁 demo开发板TEK4510(S3C4510)在vxWorks下的BSP1.0
💻 C
字号:
/********************************************************************/
/*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 + -