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

📄 parse.c

📁 jtag 和 ARM9 的编程源码
💻 C
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

#include "jtag.h"
#include "debug.h"
#include "memory.h"
#include "regs.h"

char previous_command_line[128] = "";

unsigned long hex_to_num(char * value)
{
	int temp;
	unsigned long number;
	unsigned base =  16;

	number = 0;

	for (temp=0; temp < strlen(value); temp ++) {
		if (value[temp] < 58 && value[temp] > 47)
			/* number */
			number = (number * base) + (value[temp] - 48);
		else if (value[temp] < 103 && value[temp] > 96)
			/* letter */
			number = (number * base) + (value[temp] - 97 + 10);
		else if (value[temp] == 43) {
			number = 0;
			base = 10;
		} else
			/* illegal character */
			return(number);
	}
	
	return(number);
}

int parse_script(void)
{
	FILE * script_file;
	char script_line[128];
	char * value;

	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: script <file_name>\n");
		return(1);
	}
	
	script_file = fopen(value, "r");

	if (script_file == 0) {
		printf("Error opening script file : %s\n", value);
		return(1);
	}
	
	while (fgets(script_line, sizeof(script_line), script_file)) {
		if(parse_main(script_line)) {
			printf("Abborted - Error running:\n%s\n", script_line);
			break;
		}
	}

	fclose(script_file);

	/* rebuild previous_command_line */
	strcpy(previous_command_line, "script ");
	strcat(previous_command_line, value);

	return(0);
}

int parse_echo(void)
{
	char * value;

	value = strtok(NULL, " ");
	while (value ) {
		printf("%s ", value);
		value = strtok(NULL, " ");
	}

	printf("\n");

	return(0);
}

int parse_pause(void)
{
	char * value;
	unsigned long snooze;

	value = strtok(NULL, " ");

	if (value ) {
		snooze = hex_to_num(value);
		printf("Pausing for 0x%8.8X seconds\n", snooze);
		sleep(snooze);
	}

	return(0);
}

int parse_poke(void)
{
	unsigned long address;
	unsigned long data;
	unsigned long length = 1;

	char * value;

	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: poke <address> <data> [<length>]\n");
		return(1);
	}
	address = hex_to_num(value);

	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: poke <address> <data> [<length>]\n");
		return(1);
	}
	data = hex_to_num(value);
	
	value = strtok(NULL, " ");
	if (value != 0)
		length = hex_to_num(value);

	memory_poke(address, data, length);

	return(0);
}

int parse_peek(void)
{
	char * value;
	unsigned long address;
	unsigned long data = 0;

	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: peek <address>\n");
		return(1);
	}
	address = hex_to_num(value);

	memory_peek(address, &data);

	return(0);
}

int parse_load(void)
{
	char * value;

	FILE * data_file;
	unsigned long address;
	unsigned long * data;
	unsigned long * data_start;
	unsigned long length;

	unsigned long temp;
	unsigned long temp2;
	unsigned char data_byte;
	unsigned char data_ended = 0;

	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: load <file_name> <address> [<length>]\n");
		return(1);
	}
	
	data_file = fopen(value, "rb");

	if (data_file == 0) {
		printf("Error opening file : %s\n", value);
		return(1);
	}
	
	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: load <file_name> <address> [<length>]\n");
		return(1);
	}
	address = hex_to_num(value);

	value = strtok(NULL, " ");
	if (value != 0)
		/* length in long words */
		length = hex_to_num(value)/4;
	else
		/* do whole file */
		length = 0xFFFFFFFF;

	data_start = malloc(1024 * sizeof(unsigned long));

	if (data_start == NULL) {
		printf("Unable to allocate temporary storage\n");
		fclose(data_file);
		return(1);
	}

	data = data_start;

	while (length) {
		for (temp = 0; temp < 1024; temp++) {
			*data = 0;
	
			/* read in bytes convert to long words */
			for (temp2 = 0; temp2 < 4; temp2++) {
#if 1
				if (fread(&data_byte, sizeof(data_byte), 1, data_file) == 0) {
					data_ended = (unsigned char) EOF;
					break;
				}

#else
				data_byte = fgetc(data_file);

				if (data_byte == (unsigned char)EOF)
					break;
#endif				
				*data = (*data >> 8) + (data_byte << 24);
			}
			
			if (data_ended == (unsigned char)EOF) {
				length = temp + 1;
				break;
			}
	
			data++;
		}

		if (length < 1024 ) {
			memory_write(address, data_start, length);
			length = 0;
		} else {
			memory_write(address, data_start, temp);
			address = address + 4096;
			length = length - 1024;
			data = data_start;
		}
	}
		
	
	fclose(data_file);
	free(data_start);

	return(0);
}

int parse_run(void)
{
	char * value;

	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: run <address>\n");
		return(1);
	}

	arm_regs.pc = hex_to_num(value);
	debug_restart();

	return(0);
}

int parse_regs(void)
{
	int reg;
	unsigned long data;
	char * value;

	value = strtok(NULL, " ");
	if (value == 0) {
		regs_print();
		return(0);
	}

	/* ok trying to set a register value */
	reg = (int) hex_to_num(value);

	value = strtok(NULL, " ");
	if (value == 0) {
		printf("Usage: regs [<reg> <value>]\n");
		return(1);
	}

	data = hex_to_num(value);

	regs_set(reg, data);
#if 0
	regs_write();
	regs_read();
#endif
	regs_print();
	return(0);
}


int parse_main(char * command_line)
{
	char * command;

	if (*command_line == '.')
		strcpy(command_line, previous_command_line);
	else 
		strcpy(previous_command_line, command_line);

	/* strip off \n and get commmand head */
	command = strtok(command_line, "\n");
	command = strtok(command, " ");

	if (command) {
		/* basic commands */
		if (strcmp(command, "#") == 0)
			return(0);
		if (strcmp(command, "script") == 0)
			return(parse_script());
		if (strcmp(command, "echo") == 0)
			return(parse_echo());
		if (strcmp(command, "pause") == 0)
			return(parse_pause());

		/* jtag commands */
		if (strcmp(command, "jtag") == 0)
			return(jtag_reset());
		if (strcmp(command, "idcode") == 0)
			return(jtag_idcode());
		if (strcmp(command, "quit") == 0)
			exit(0);

		/* debug commands */
		if (strcmp(command,"poll") == 0)
			return(debug_poll());
		if (strcmp(command,"halt") == 0)
			return(debug_halt());
		if (strcmp(command,"restart") == 0)
			return(debug_restart());
		if (strcmp(command,"run") == 0)
			return(parse_run());

		/* memory commands */
		if (strcmp(command, "poke") == 0)
			return(parse_poke());
		if (strcmp(command, "peek") == 0)
			return(parse_peek());
		if (strcmp(command, "load") == 0)
			return(parse_load());

		/* register commands */
		if (strcmp(command, "regs") == 0)
			return(parse_regs());

		printf("Unknown command: %s\n", command);
	}

	return(1);	
}

⌨️ 快捷键说明

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