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

📄 fbcmd.c

📁 ti dsp 5402 的BOOT程序。利用此程序实现将代码写入到FLASH 的功能。
💻 C
字号:
/**********************************************************************
 *		 (C) COPYRIGHT TEXAS INSTRUMENTS, INC. 2000, 2001 				  *
 *																	  *
 * FBCmd.c -- Process FlashBurn Target Component commands             *
 *				for FBTC54.                                           *
 **********************************************************************
 */
/* Change Log:
 */
/*
 * $Log: FBCmd.c,v $
 * Revision 1.9  2001/04/19 18:56:32  heeschen
 * v00.30 Alpha - Updated comments
 *
 * Revision 1.8  2001/04/19 16:29:00  heeschen
 * v00.30 Snapshot
 * Saving this stuff after massive redesign to remove RTDX dependency.
 * Next step is to clean up, fix comments, and do unit testing.
 *
*/

#include "fbtc54.h"
#include "fbcmd.h"
#include <stdio.h>


#define DBPRINT 0

/* -------------
 * Globals
 * -------------
 */


/* -------------
 * Local statics
 * -------------
 */

/* ----------------
 * Local prototypes
 * ----------------
 */
static void SendVersionID(u16 *msg);


void doCommand(u16 *msg)
{
	u16 cmd = msg[CMDINDEX];
	
			#if DBPRINT == 1
			printf("CMD: %x", cmd);
			#endif

	/* Dispatch to a command processor.
	 * Each case is essentially a message parser.
	 * Each case will either completely process
	 * a simple message, or else call a function
	 * to handle a more complicated message.
	 */
	switch(cmd)
	{
	case 0x0000:      /* NOP */
		break;
		
	case 0x0001:      /* QUERY PROTOCOL VERSION */
		SetErrorBits(CMDOK);
		SendI2ToHost(cmd, GetProtocolVersionID());
		break;
	case 0x0002:      /* QUERY STATUS */
			#if DBPRINT == 1
			printf("  Status: %x", GetProtocolStatusWord());
			#endif
		SendI2ToHost(cmd, GetProtocolStatusWord());
		break;
	case 0x0003:      /* ERASE ENTIRE FLASH */
		SetErrorBits(CMDOK);
		EraseFlash();
		SendI2ToHost(cmd, 0);
		break;
	case 0x0004:      /* QUERY FLASH BASE ADDRESS VALUE */
		SetErrorBits(CMDOK);
		SendI4ToHost(cmd, FLBASE);
		break;
	case 0x0005:      /* RETURN CONTENTS OF ONE LOCATION OF FLASH */	
			#if DBPRINT == 1
			printf(" ARGS: %x %x", msg[ARGINDEX+0], msg[ARGINDEX+1]);
			#endif
		SetErrorBits(CMDOK);
		SendI2ToHost(cmd, GetFlashVal(GetFlashBase() + ShortsToULong(msg[ARGINDEX+0], msg[ARGINDEX+1])));
		break;
	case 0x0006: /* READ FLASH MEMORY BLOCK */
			#if DBPRINT == 1
			printf(" ARGS: %x %x %x", msg[ARGINDEX+0], msg[ARGINDEX+1], msg[ARGINDEX+2]);
			#endif
		SetErrorBits(CMDOK);
		SendFlashBufToHost(cmd, GetFlashBase() + ShortsToULong(msg[ARGINDEX+0], msg[ARGINDEX+1]), msg[ARGINDEX+2]);
		break;
	case 0x0007:   /* WRITE (BURN) DATA TO FLASH  */
			#if DBPRINT == 1
			printf(" ARGS: %x %x %x",  msg[ARGINDEX+0], msg[ARGINDEX+1], msg[ARGINDEX+2]);
			#endif
		SetFlashAddr(GetFlashBase() + ShortsToULong(msg[ARGINDEX+0], msg[ARGINDEX+1]));
		SetErrorBits(CMDOK);
		BurnFlash(&msg[DATAINDEX], msg[ARGINDEX+2]);
		break;
	case 0x0008:    /* MORE DATA TO BURN */
			#if DBPRINT == 1
			printf(" ARG: %x",  msg[ARGINDEX+0]);
			#endif
		SetErrorBits(CMDOK);
		BurnFlash(&msg[DATAINDEX], msg[ARGINDEX+0]);
		break;
	case 0x0009:   /* RESPOND WITH FLASH DATA CHECKSUM */
			#if DBPRINT == 1
			printf(" ARGS: %x %x %x %x",  msg[ARGINDEX+0], msg[ARGINDEX+1], msg[ARGINDEX+2], msg[ARGINDEX+3]);
			#endif
		SetErrorBits(CMDOK);

		CKSSet(0);
		SendI2ToHost(cmd,
			CKSAccumBuf(GetFlashBase() + ShortsToULong(msg[ARGINDEX+0], msg[ARGINDEX+1]),
						ShortsToULong(msg[ARGINDEX+2], msg[ARGINDEX+3])));
		break;
    case 0x000a:   /* ACCEPT USER DATA
	                * Simply accept & toss data.
                    * I use this for timing tests.
                    * It could contain your own proprietary
                    * commands or data, sort of an escape
                    * sequence.
                    */
			#if DBPRINT == 1
			printf(" ARG: %x",  msg[ARGINDEX+0]);
			#endif
		SetErrorBits(CMDOK);
		/* This implementation doesn't do anything
		 * with the data)
		 */
		SendI2ToHost(cmd, 0);
		break;

    case 0x000b:      /* QUERY FLASHSIZE VALUE */
		SetErrorBits(CMDOK);
		SendI4ToHost(cmd, GetFlashSize());
		break;

	case 0x000c:      /* CHANGE FLASH BASE ADDRESS */
			#if DBPRINT == 1
			printf(" ARGS: %x %x", msg[ARGINDEX+0], msg[ARGINDEX+1]);
			#endif
		SetErrorBits(CMDOK);
		SetFlashBase(ShortsToULong(msg[ARGINDEX+0], msg[ARGINDEX+1]));
		break;

	case 0x000d:      /* CHANGE FLASH BASE SIZE */
			#if DBPRINT == 1
			printf(" ARGS: %x %x\n", msg[ARGINDEX+0], msg[ARGINDEX+1]);
			#endif
		SetErrorBits(CMDOK);
		SetFlashSize(ShortsToULong(msg[ARGINDEX+0], msg[ARGINDEX+1]));
		break;

	case 0x000e:      /* QUERY FBTC VERSION IDD */
		SetErrorBits(CMDOK);
		SendVersionID(msg);
		break;

	case 0x000f:      /* QUERY EDIT FLASH PERMISSION */
		SetErrorBits(CMDOK);
		SendI2ToHost(cmd, EDITFLASHPERMIT);
		break;

	case 0x0010:      /* QUERY MAX DATA BLOCK SIZE IN 8-BIT BYTES */
		SetErrorBits(CMDOK);
		SendI2ToHost(cmd, MAXDATABYTES);
		break;

	default:
			#if DBPRINT == 1
			printf(" *** UNKNOWN! ***");
			#endif
		break;
	}
	
	#if DBPRINT == 1
	printf("\n");
	#endif
	
}


/* Send my version ID back to the Host.
 */
static void SendVersionID(u16 *msg)
{
	msg[CMDINDEX] = 0x000e;  /* response to this command */	
	msg[ARGINDEX+0] = FBTCVersionMajor; /* Arg0 */
	msg[ARGINDEX+1] = FBTCVersionMinor; /* Arg1 */
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -