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

📄 main.c

📁 motorola自己开发的针对coldfire 5272的Dbug bootloader程序
💻 C
字号:
/*
 * File:		main.c
 * Purpose:		Main entry point of debugger.
 *
 * Notes:
 *
 * Author:		Eric DeVolder
 * Date:		
 *
 * Modifications:
 *
 */

/********************************************************************/

#include "src/include/dbug.h"
#include "src/uif/uif.h"

/********************************************************************/

/*
 * Static variables
 */
const int UIF_VER_MAJOR = 3;
const char UIF_VER_MINOR = 'b';

static const char PROMPT[] = "dBUG> ";
static const char SYNTAX[] = "Error: Invalid syntax for: %s\n";

static char cmdline1 [UIF_MAX_LINE];
static char cmdline2 [UIF_MAX_LINE];

/********************************************************************/
char *
get_line (char *line)
{
	int pos;
	int ch;

	pos = 0;
	board_putchar_flush();
	ch = (int)board_getchar();
	while (	(ch != 0x0D /* CR */) &&
			(ch != 0x0A /* LF/NL */) &&
			(pos < UIF_MAX_LINE))
	{
		switch (ch)
		{
			case 0x08:		/* Backspace */
			case 0x7F:		/* Delete */
				if (pos > 0)
				{
					pos -= 1;
					board_putchar(0x08);	/* backspace */
					board_putchar(' ');
					board_putchar(0x08);	/* backspace */
				}
				break;
			default:
				if ((pos+1) < UIF_MAX_LINE)
				{
					if ((ch > 0x1f) && (ch < 0x80))
					{
						line[pos++] = (char)ch;
						board_putchar((char)ch);
					}
				}
				break;
		}
		ch = (int)board_getchar();
	}
	line[pos] = '\0';
	board_putchar(0x0D);	/* CR */
	board_putchar(0x0A);	/* LF */

	return line;
}

/********************************************************************/
int
make_argv (char *cmdline, char *argv[])
{
	int argc, i, in_text;

	/* break cmdline into strings and argv */
	/* it is permissible for argv to be NULL, in which case */
	/* the purpose of this routine becomes to count args */
	argc = 0;
	i = 0;
	in_text = FALSE;
	while (cmdline[i] != '\0')	/* getline() must place 0x00 on end */
	{
		if (((cmdline[i] == ' ')   ||
			 (cmdline[i] == '\t')) )
		{
			if (in_text)
			{
				/* end of command line argument */
				cmdline[i] = '\0';
				in_text = FALSE;
			}
			else
			{
				/* still looking for next argument */
				
			}
		}
		else
		{
			/* got non-whitespace character */
			if (in_text)
			{
			}
			else
			{
				/* start of an argument */
				in_text = TRUE;
				if (argc < UIF_MAX_ARGS)
				{
					if (argv != NULL)
						argv[argc] = &cmdline[i];
					argc++;
				}
				else
					/*return argc;*/
					break;
			}

		}
		i++;	/* proceed to next character */
	}
	if (argv != NULL)
		argv[argc] = NULL;
	return argc;
}

/********************************************************************/
void
run_cmd (void)
{
	/*
	 * Global array of pointers to emulate C argc,argv interface
	 */
	extern void get_history_line (char *);
	int argc;
	char *argv[UIF_MAX_ARGS + 1];	/* one extra for null terminator */

	get_history_line(cmdline1);

	if (!(argc = make_argv(cmdline1,argv)))
	{
		/* no command entered, just a blank line */
		strcpy(cmdline1,cmdline2);
		argc = make_argv(cmdline1,argv);
	}
	cmdline2[0] = '\0';

	if (argc)
	{
		int i;
		/*
		 * First try for an exact match on command name
		 */
		for (i = 0; i < UIF_NUM_CMD; i++)
		{
			if (strcasecmp(UIF_CMDTAB[i].cmd,argv[0]) == 0)
			{
				if (((argc-1) >= UIF_CMDTAB[i].min_args) &&
					((argc-1) <= UIF_CMDTAB[i].max_args))
				{
					if (UIF_CMDTAB[i].flags & UIF_CMD_FLAG_REPEAT)
					{
						strcpy(cmdline2,argv[0]);
					}
					UIF_CMDTAB[i].func(argc,argv);
					return;
				}
				else
				{
					printf(SYNTAX,argv[0]);
					return;
				}
			}
		}

		/*
		 * Now try for short-hand match on command name
		 */
		for (i = 0; i < UIF_NUM_CMD; i++)
		{
			if (strncasecmp(UIF_CMDTAB[i].cmd,argv[0],
				UIF_CMDTAB[i].unique) == 0)
			{
				if (((argc-1) >= UIF_CMDTAB[i].min_args) &&
					((argc-1) <= UIF_CMDTAB[i].max_args))
				{
					if (UIF_CMDTAB[i].flags & UIF_CMD_FLAG_REPEAT)
					{
						strcpy(cmdline2,argv[0]);
					}
					UIF_CMDTAB[i].func(argc,argv);
					return;
				}
				else
				{
					printf(SYNTAX,argv[0]);
					return;
				}
			}
		}
		printf(INVCMD,argv[0]);
		printf(HELPMSG);
	}
}

static const char PAUSEMSG[] = "Press <ENTER> to continue.";

/********************************************************************/
int
pause (int *displayed)
{
	int quit = FALSE;
	int done = FALSE;
	int i;

	if (++*displayed >= 22)
	{
		printf(PAUSEMSG);
		while (TRUE)
		{
			switch (board_getchar())
			{
				case '\r':
				case '\n':
					done = TRUE;
					break;
				case 'Q':
				case 'q':
				case '\003':
				case '.':
					done = TRUE;
					quit = TRUE;
					break;
				default:
					break;
			}

			if (done)
				break;
		}
/*		printf("\n"); */
		for (i = 0; i < sizeof(PAUSEMSG); ++i)
		{
			board_putchar(0x08);	/* backspace */
			board_putchar(' ');
			board_putchar(0x08);	/* backspace */
		}
		*displayed = 0;
	}
	return quit;
}

/********************************************************************/
void mainloop (void)
{
	while (TRUE)
	{
		printf(PROMPT);
		run_cmd();
	}
}

/********************************************************************/
int
main (void)
{
	extern char __DATA_ROM[];
	extern char __DATA_RAM[];
	extern char __DATA_END[];
	extern char __BSS_START[];
	extern char __BSS_END[];
	extern uint32 VECTOR_TABLE[];
	extern uint32 __VECTOR_RAM[];

	extern void cpu_init (void);
	extern void uif_init (void);

	uint32 vector;

	/* move to cpu_init() ???? */

	/*
	 * Copy the dBUG vector table from ROM to RAM
	 */
	if (__VECTOR_RAM != VECTOR_TABLE)
	{
#if		defined(CPU_ARCH_CF)
		for (vector = 0; vector < 256; vector++)
		{
			__VECTOR_RAM[vector] = VECTOR_TABLE[vector];
		}

#elif	defined(CPU_ARCH_PPC)
		for (vector = 0; vector < (0x00002000>>2); vector++)
		{
			__VECTOR_RAM[vector] = VECTOR_TABLE[vector];
		}

#else
#error "Error: CPU vector table in main.c"
#endif
	}

	/*
	 * Move initialized data from ROM to RAM.
	 */
	if (__DATA_ROM != __DATA_RAM)
	{
		memcpy(__DATA_RAM,__DATA_ROM,__DATA_END-__DATA_RAM);
	}
 
	/*
	 * Zero uninitialized data
	 */
	if (__BSS_START != __BSS_END)
	{
		memset(__BSS_START,0,__BSS_END-__BSS_START);
	}

	board_init();
	cpu_init();
	uif_init();

	cmdline1[0] = '\0';
	cmdline2[0] = '\0';

	board_init2();

	uif_cmd_ver(NULL,NULL);

	board_init3();

	printf(HELPMSG);

	#if defined(DEBUG_PRINT)
		printf("High-level DEBUG_PRINT on\n");
	#endif

	printf("\n");

	mainloop();

	return 0;	/* useless, should never reach! */
}

/********************************************************************/

⌨️ 快捷键说明

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