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

📄 regs.c

📁 jtag 和 ARM9 的编程源码
💻 C
字号:
#include "jtag.h"
#include "debug.h"
#include "regs.h"

regs_type arm_regs;

int regs_read(void)
{
	int temp;
	/* read in the contents of all the arm_regs. except PC and R0 */
	/* select Scan Chain 1 */
	Data[0] = JTAG_SCAN_N;
	jtag_ireg(Data, JTAG_IRLENGTH);

	Data[0] = 0x00000001;
	jtag_dreg(Data, 5);

	/* select Intest */
	Data[0] = JTAG_INTEST;
	jtag_ireg(Data, JTAG_IRLENGTH);

	/* STMIA r0, {r1-r15} */
	Data[0] = 0xe880fffe;
	debug_exec(Data, DEBUG_SPEED);

	/* NOP */
	Data[0] = 0xe1a00000;
	debug_exec(Data, DEBUG_SPEED);

	/* NOP */
	Data[0] = 0xe1a00000;
	debug_exec(Data, DEBUG_SPEED);

	for (temp = 1; temp < 16; temp ++) {
		Data[0] = 0xe1a00000;
		Data[1] = 0;
		debug_exec(Data, DEBUG_SPEED);
		arm_regs.r[temp] = Data[1];
	}

	printf("registers read\n");
	arm_regs.status = ARM_HALTED_WITH_REGS;
	return(0);
}

int regs_write(void)
{
	int temp;

	/* select Scan Chain 1 */
	Data[0] = JTAG_SCAN_N;
	jtag_ireg(Data, JTAG_IRLENGTH);

	Data[0] = 0x00000001;
	jtag_dreg(Data, 5);

	/* select Intest */
	Data[0] = JTAG_INTEST;
	jtag_ireg(Data, JTAG_IRLENGTH);

	/* LDMIA r0, {r1-r15} */
	Data[0] = 0xe890fffe;
	debug_exec(Data, DEBUG_SPEED);

	/* NOP */
	Data[0] = 0xe1a00000;
	debug_exec(Data, DEBUG_SPEED);

	/* NOP */
	Data[0] = 0xe1a00000;
	debug_exec(Data, DEBUG_SPEED);

	for (temp = 1; temp < 16; temp ++) {
		Data[0] = 0xe1a00000;
		Data[1] = arm_regs.r[temp];
		debug_exec(Data, DEBUG_SPEED);
	}

	printf("registers written\n");
	arm_regs.status = ARM_HALTED_WITH_REGS_WRITTEN;
}

int regs_print(void)
{
	/* print out the registers */
	int temp;
	
	if (arm_regs.status == ARM_RUNNING) {
		printf("Error: Target not halted.\n");
		return(1);
	}

	if (arm_regs.status == ARM_HALTED) 
		regs_read();

	printf("Registers:\n");
	for (temp = 0; temp < 8; temp++)
		printf("  R%2.2d - 0x%8.8x   R%2.2d - 0x%8.8x\n",
				temp, arm_regs.r[temp],
				temp+8, arm_regs.r[temp+8]);

	printf("\n  PC  - 0x%8.8x\n", arm_regs.pc);

	return(0);
}

int regs_set(int reg, unsigned long value)
{
	if (arm_regs.status == ARM_RUNNING) {
		printf("System not halted..\n");
		return(1);
	}

	if (arm_regs.status == ARM_HALTED) {
		/* need to read the registers */
		regs_read();
	}

	if (reg < 0 || reg > 15) {
		printf("register must be between 0 and 15\n");
		return(1);
	}

	arm_regs.r[reg] = value;
	arm_regs.status = ARM_HALTED_WITH_REGS;
	return (0);
}

⌨️ 快捷键说明

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