OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [bootloaders/] [orpmon/] [common/] [common.c] - Rev 450

Go to most recent revision | Compare with Previous | Blame | View Log

#include "common.h"
#include "uart.h"
#include "screen.h"
#include "support.h"
#include "keyboard.h"
#include "spr-defs.h"
#include "spincursor.h"
#include "int.h"
 
#include "build.h"
 
#define MAX_COMMANDS  100
 
// Value from linker script
extern unsigned long _src_addr;
 
bd_t bd;
 
int num_commands = 0;
 
command_struct command[MAX_COMMANDS];
 
void putc(const char c)
{
	debug("putc %i, %i = %c\n", bd.bi_console_type, c, c);
	switch (bd.bi_console_type) {
	case CT_NONE:
		break;
	case CT_UART:
		uart_putc(c);
		break;
#if CRT_ENABLED==1
	case CT_CRT:
		screen_putc(c);
		break;
#endif
	case CT_SIM:
		__printf("%c", c);
		break;
	}
}
 
int getc()
{
	int ch = 0;
	debug("getc %i\n", bd.bi_console_type);
	switch (bd.bi_console_type) {
#if KBD_ENABLED==1
	case CT_CRT:
		while ((volatile int)kbd_head == (volatile int)kbd_tail) ;
		ch = kbd_buf[kbd_tail];
		kbd_tail = (kbd_tail + 1) % KBDBUF_SIZE;
		return ch;
#endif
	case CT_UART:
		return uart_getc();
		break;
	case CT_NONE:		/* just to satisfy the compiler */
	case CT_SIM:
		break;
	}
	return -1;
}
 
int testc()
{
	debug("testc %i\n", bd.bi_console_type);
	switch (bd.bi_console_type) {
#if KBD_ENABLED
	case CT_CRT:
		if (kbd_head == kbd_tail)
			return 0;
		else
			return getc();
#endif
	case CT_UART:
		return uart_testc();
		break;
	case CT_NONE:		/* just to satisfy the compiler */
	case CT_SIM:
		break;
	}
	return -1;
}
 
int ctrlc()
{
	if (testc()) {
		switch (getc()) {
		case 0x03:	/* ^C - Control C */
			return 1;
		default:
			break;
		}
	}
	return 0;
}
 
void print_or1k_cache_info()
{
	// Read out UPR, check what modules we have
	unsigned long upr = mfspr(SPR_UPR);
	printf("Instruction cache:\t");
	if (upr & SPR_UPR_ICP) {
		// We have instruction cache, read out ICCFGR
 
		unsigned long iccfgr = mfspr(SPR_ICCFGR);
		unsigned int cbs;	// cache block size
		unsigned long ncs = 1 << ((iccfgr & SPR_ICCFGR_NCS) >> 3);
		if (iccfgr & SPR_ICCFGR_CBS)
			cbs = 32;
		else
			cbs = 16;
 
		printf("%dkB (BS: %d Sets: %d)\n",
		       (cbs * ncs) / 1024, cbs, ncs);
 
	} else
		printf(" not present\n");
 
	printf("Data cache:\t\t");
	if (upr & SPR_UPR_DCP) {
		// We have instruction cache, read out DCCFGR
 
		unsigned long iccfgr = mfspr(SPR_DCCFGR);
		unsigned int cbs;	// cache block size
		unsigned long ncs = 1 << ((iccfgr & SPR_DCCFGR_NCS) >> 3);
		if (iccfgr & SPR_DCCFGR_CBS)
			cbs = 32;
		else
			cbs = 16;
 
		printf("%dkB (BS: %d Sets: %d)\n",
		       (cbs * ncs) / 1024, cbs, ncs);
 
	} else
		printf(" not present\n");
 
}
 
unsigned long parse_ip(char *ip)
{
	unsigned long num;
	num = strtoul(ip, &ip, 10) & 0xff;
	if (*ip++ != '.')
		return 0;
	num = (num << 8) | (strtoul(ip, &ip, 10) & 0xff);
	if (*ip++ != '.')
		return 0;
	num = (num << 8) | (strtoul(ip, &ip, 10) & 0xff);
	if (*ip++ != '.')
		return 0;
	num = (num << 8) | (strtoul(ip, &ip, 10) & 0xff);
	return num;
}
 
void change_console_type(enum bi_console_type_t con_type)
{
	debug("Console change %i -> %i\n", bd.bi_console_type, con_type);
	/* Close previous */
	switch (bd.bi_console_type) {
	case CT_NONE:
	case CT_UART:
	case CT_CRT:
	case CT_SIM:
		break;
	}
	bd.bi_console_type = con_type;
	/* Initialize new */
	switch (bd.bi_console_type) {
	case CT_NONE:
		break;
	case CT_UART:
		uart_init();
		break;
	case CT_CRT:
#if CRT_ENABLED==1
		screen_init();
#endif
#if KBD_ENABLED
		kbd_init();
#endif
		break;
	case CT_SIM:
		break;
	}
}
 
void register_command_func(const char *name, const char *params,
			   const char *help, int (*func) (int argc,
							  char *argv[]))
{
	debug("register_command '%s'\n", name);
	if (num_commands < MAX_COMMANDS) {
		command[num_commands].name = name;
		command[num_commands].params = params;
		command[num_commands].help = help;
		command[num_commands].func = func;
		num_commands++;
	} else
		printf("Command '%s' ignored; MAX_COMMANDS limit reached\n",
		       name);
}
 
/* Process command and arguments by executing
   specific function. */
void mon_command(void)
{
	char c = '\0';
	char str[1000];
	char *pstr = str;
	char *command_str;
	char *argv[20];
	int argc = 0;
	int chcnt = 0;
 
	/* Show prompt */
	printf("\n" BOARD_DEF_NAME "> ");
 
	while (1) {
		c = getc();
 
		if (c == 0x7f)	// Backspace on picocom is showing up as 0x7f
			c = '\b';
 
		if (c == '\r' || c == '\f' || c == '\n') {
			// Mark end of string
			*pstr = '\0';
			putc('\n');
			break;
		} else if (c == '\b')	// Backspace
		{
			if (chcnt > 0) {
				putc(c);
				putc(' ');	// cover char with space
				putc(c);
				pstr--;
				chcnt--;
			}
		} else {
			putc(c);
			*pstr++ = c;
			chcnt++;
		}
	}
 
	/* Skip leading blanks */
	pstr = str;
	while (*pstr == ' ' && *pstr != '\0')
		pstr++;
 
	/* Get command from the string */
	command_str = pstr;
 
	while (1) {
		/* Go to next argument */
		while (*pstr != ' ' && *pstr != '\0')
			pstr++;
		if (*pstr) {
			*pstr++ = '\0';
			while (*pstr == ' ')
				pstr++;
			argv[argc++] = pstr;
		} else
			break;
	}
 
	{
		int i, found = 0;
 
		for (i = 0; i < num_commands; i++)
			if (strcmp(command_str, command[i].name) == 0) {
				switch (command[i].func(argc, &argv[0])) {
				case -1:
					printf
					    ("Missing/wrong parameters, usage: %s %s\n",
					     command[i].name,
					     command[i].params);
					break;
				}
 
				found++;
				break;
			}
		/* 'built-in' build command */
		if (strcmp(command_str, "build") == 0) {
			printf("Build tag: %s", BUILD_VERSION);
			found++;
		}
		if (!found)
			printf("Unknown command. Type 'help' for help.\n");
	}
 
}
 
#if HELP_ENABLED
extern unsigned long _src_addr;	// Stack section ends here, will print it out
/* Displays help screen */
int help_cmd(int argc, char *argv[])
{
	int i;
	for (i = 0; i < num_commands; i++)
		printf("%-10s %-20s - %s\n", command[i].name, command[i].params,
		       command[i].help);
 
	// Build info....
	printf("\n");
	printf("CPU info\n");
	printf("Frequency\t\t%dMHz\n", IN_CLK / 1000000);
	print_or1k_cache_info();
	printf("\n");
	printf("Info: Stack section addr 0x%x\n", (unsigned long)&_src_addr);
	printf("Build tag: %s", BUILD_VERSION);
 
	return 0;
}
#endif /* HELP_ENABLED */
 
void module_cpu_init(void);
void module_memory_init(void);
void module_eth_init(void);
void module_dhry_init(void);
void module_coremark_init(void);
void module_camera_init(void);
void module_load_init(void);
void tick_init(void);
void module_touch_init(void);
void module_ata_init(void);
void module_hdbug_init(void);
 
/* List of all initializations */
void mon_init(void)
{
	/* Set defaults */
	global.erase_method = 2;	/* as needed */
	global.src_addr = (unsigned long)&_src_addr;
	global.dst_addr = FLASH_BASE_ADDR;
	global.eth_add[0] = ETH_MACADDR0;
	global.eth_add[1] = ETH_MACADDR1;
	global.eth_add[2] = ETH_MACADDR2;
	global.eth_add[3] = ETH_MACADDR3;
	global.eth_add[4] = ETH_MACADDR4;
	global.eth_add[5] = ETH_MACADDR5;
	global.ip = BOARD_DEF_IP;
	global.gw_ip = BOARD_DEF_GW;
	global.mask = BOARD_DEF_MASK;
 
#define CPU_CMDS
#define MEM_CMDS
#define DHRY_CMDS
#define COREMARK_CMDS
	//#define CAMERA_CMDS
#define LOAD_CMDS
	//#define TOUCHSCREEN_CMDS
	//#define ATA_CMDS
	//#define HDBUG_CMDS
#define TICK_CMDS
#define ETH_CMDS
#define LOAD_CMDS
 
	/* Init modules */
#ifdef CPU_CMDS
	module_cpu_init();
#endif
#ifdef MEM_CMDS
	module_memory_init();
#endif
#ifdef ETH_CMDS
	module_eth_init();
#endif
#ifdef DHRY_CMDS
	module_dhry_init();
#endif
#ifdef COREMARK_CMDS
	module_coremark_init();
#endif
#ifdef CAMERA_CMDS
	module_camera_init();
#endif
#ifdef LOAD_CMDS
	module_load_init();
#endif
#ifdef TOUCHSCREEN_CMDS
	module_touch_init();
#endif
#ifdef ATA_CMDS
	module_ata_init();
#endif
#ifdef HDBUG_CMDS
	module_hdbug_init();
#endif
 
#ifdef TICK_CMDS
#endif
 
}
 
int tboot_cmd(int argc, char *argv[]);
/* Main shell loop */
int main(int argc, char **argv)
{
	extern unsigned long calc_mycrc32(void);
 
#if 0
	extern unsigned long mycrc32, mysize;
#endif
 
	timestamp = 0;		// clear timer counter
 
	int_init();
 
	change_console_type(CONSOLE_TYPE);
 
	mtspr(SPR_SR, mfspr(SPR_SR) | SPR_SR_IEE);
 
#if SELF_CHECK
	printf("Self check... ");
	if ((t = calc_mycrc32()))
		printf("FAILED!!!\n");
	else
		printf("OK\n");
#endif /* SELF_CHECK */
 
	num_commands = 0;
	mon_init();
 
	disable_spincursor();
 
	tick_init();
 
	if (HELP_ENABLED)
		register_command("help", "", "shows this help", help_cmd);
 
	printf("\n" BOARD_DEF_NAME " monitor (type 'help' for help)\n");
	printf("\tbuild: %s", BUILD_VERSION);
 
	// Loop forever, accepting commands
	while (1) {
		mon_command();
	}
 
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.