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

📄 mpc8xx_hi.c

📁 motorola自己开发的针对coldfire 5272的Dbug bootloader程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (cipr & MPC8XX_CPIC_CIPR_PC12)
	{
		printf("PC12 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_SDMA)
	{
		printf("SDMA ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_IDMA1)
	{
		printf("IDMA1 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_IDMA2)
	{
		printf("IDMA2 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_TIMER2)
	{
		printf("TIMER2 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_RTT)
	{
		printf("RTT ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_I2C)
	{
		printf("I2C ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC11)
	{
		printf("PC11 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC10)
	{
		printf("PC10 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_TIMER3)
	{
		printf("TIMER3 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC9)
	{
		printf("PC9 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC8)
	{
		printf("PC8 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC7)
	{
		printf("PC7 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_TIMER4)
	{
		printf("TIMER4 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC6)
	{
		printf("PC6 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_SPI)
	{
		printf("SPI ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_SMC1)
	{
		printf("SMC1 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_SMC2)
	{
		printf("SMC2 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PIP)
	{
		printf("PIP ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC5)
	{
		printf("PC5 ");
	}
	if (cipr & MPC8XX_CPIC_CIPR_PC4)
	{
		printf("PC4 ");
	}

	printf("\n");

	/*
	 * Clear interrupts
	 */
	imm->cpic.CIPR = ~0;
}

/*********************************************************************/
static void
siu_handler (void)
{
	MPC8XX_IMM *imm = mpc8xx_get_immp();
	uint32 sipend;

	sipend = imm->siu.SIPEND & imm->siu.SIMASK;

	printf("SIU  IRQ(s): ");

	if (sipend & MPC8XX_SIU_SIPEND_IRQ0)
	{
		printf("IRQ0 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL0)
	{
		printf("LVL0 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_IRQ1)
	{
		printf("IRQ1 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL1)
	{
		printf("LVL1 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_IRQ2)
	{
		printf("IRQ2 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL2)
	{
		printf("LVL2 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_IRQ3)
	{
		printf("IRQ3 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL3)
	{
		printf("LVL3 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_IRQ4)
	{
		printf("IRQ4 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL4)
	{
		printf("LVL4 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_IRQ5)
	{
		printf("IRQ5 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL5)
	{
		printf("LVL5 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_IRQ6)
	{
		printf("IRQ6 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL6)
	{
		printf("LVL6 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_IRQ7)
	{
		printf("IRQ7 ");
	}
	if (sipend & MPC8XX_SIU_SIPEND_LVL7)
	{
		printf("LVL7 ");
	}

	printf("\n");
	cpic_handler();
}

/*********************************************************************/
int
cpu_handler (int exception)
{
	/*
	 * This is the exception handler for all defined exceptions.  Most
	 * exceptions do nothing, but some of the more important ones are
	 * handled to some extent.
	 */
	int user_brkpnt, user_triggered;
	int cpu_handler_flag;

	/*
	 * Most exceptions result in dumping out to the dBUG prompt.
	 */
	cpu_handler_flag = EXEC_DBUG;

	/*
	 * The value passed in for 'exception' is actually the LR.  So,
	 * pick-off the actual exception number now.
	 */
	exception = (exception & 0x0000FF00);

	/*
	 * Handle breakpoints properly.
	 */
	user_brkpnt = breakpoint_deinstall((ADDRESS)context.srr0, &user_triggered);

	switch (exception)
	{
		case 0x0000:
			printf(EXCEPT, exception, "Reserved");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0100:
			printf(EXCEPT, exception, "Reset");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0200:
			printf(EXCEPT, exception, "Machine Check");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0300:
			printf(EXCEPT, exception, "Data Storage");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0400:
			printf(EXCEPT, exception, "Instruction Storage");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0500:
			printf(EXCEPT, exception, "External Interrupt");
			siu_handler();
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0600:
			printf(EXCEPT, exception, "Alignment");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0700:
			printf(EXCEPT, exception, "Program");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0800:
			printf(EXCEPT, exception, "Floating-point Unavailable");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0900:
			printf(EXCEPT, exception, "Decrementer");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0A00:
		case 0x0B00:
			printf(EXCEPT, exception, "Reserved");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0C00:
			printf(EXCEPT, exception, "System Call");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0D00:
			if ((int)trace_thru)
			{
				/* place breakpoint at trace_thru */
				cpu_write_data(trace_thru,32,(int)ILLEGAL);
				/* turn off tracing */
				CPU_REG_MSR &= (~MPC8XX_MSR_SE);
				/* nullify trace_thru and continue execution */
				trace_thru = NULL;
				cpu_handler_flag = EXEC_RFI;
				break;
			}

			/* each time through, decrement cpu_trace_count */
			if (--cpu_trace_count > 0)
			{
				/* turn tracing on */
				CPU_REG_MSR |= MPC8XX_MSR_SE;
				cpu_handler_flag = EXEC_RFI;
			}
			else
			{
				/* turn off trace bit in MSR */
				CPU_REG_MSR &= (~MPC8XX_MSR_SE);
				cpu_handler_flag = EXEC_DBUG;
				cpu_trace_count = 0;
			}
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0E00:
			printf(EXCEPT, exception, "Floating-Point Assist");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0F00:
			printf(EXCEPT, exception, "Reserved");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1000:
			if (!user_brkpnt)
			{
				printf(EXCEPT, exception, "Software Emulation");
				cpu_reg_display(NULL);
				cpu_disasm(CPU_REG_SRR0, TRUE);
			}
			else
			{
				if ((ADDRESS)cpu_step_over == (ADDRESS)CPU_REG_SRR0)
				{
					/* clean up at end of handler */
					cpu_reg_display(NULL);
					cpu_disasm(CPU_REG_SRR0, TRUE);
					break;
				}
				if (user_triggered)
				{
					printf("Breakpoint encountered at %#08X\n",
						CPU_REG_SRR0);
					cpu_reg_display(NULL);
					cpu_disasm(CPU_REG_SRR0, TRUE);
				}
				/* else reinstall breakpoints and continue */
				/* execution of the task...we will return  */
				/* task from here, not write out regs and RFI */
				else
				{
					if (breakpoint_install((ADDRESS)context.srr0))
					{
						/* about to execute at breakpoint */
						/* trace thru rather than breaking */
						trace_thru = CPU_REG_SRR0;
						/* turn tracing on */
						CPU_REG_MSR |= MPC8XX_MSR_SE;
						cpu_handler_flag = EXEC_RFI;
					}
				}
			}
			break;
		case 0x1100:
			printf(EXCEPT, exception, "Instruction TLB Miss");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1200:
			printf(EXCEPT, exception, "Data TLB Miss");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1300:
			printf(EXCEPT, exception, "Instruction TLB Error");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1400:
			printf(EXCEPT, exception, "Data TLB Error");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1500:
		case 0x1600:
		case 0x1700:
		case 0x1800:
		case 0x1900:
		case 0x1A00:
		case 0x1B00:
			printf(EXCEPT, exception, "Reserved");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1C00:
			printf(EXCEPT, exception, "Data Breakpoint");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1D00:
			printf(EXCEPT, exception, "Instruction Breakpoint");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1E00:
			printf(EXCEPT, exception, "Peripheral Breakpoint");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x1F00:
			printf(EXCEPT, exception, "Development Port");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
		case 0x0FF00:	/* cheat for exit to dbug prompt */
			cpu_handler_flag = EXEC_DBUG;
			printf("\n");
			break;
		default:
			printf(EXCEPT, exception, "Unknown");
			cpu_reg_display(NULL);
			cpu_disasm(CPU_REG_SRR0, TRUE);
			break;
	}

	if ((cpu_handler_flag == EXEC_DBUG) && cpu_step_over)
	{
		breakpoint_remove (cpu_step_over);
		cpu_step_over = 0;
	}

	return cpu_handler_flag;
}

/*********************************************************************/
void
cpu_cache_flush (void)
{
	/*
	 * This routine flushes the D-Cache using an MPC8XX specific
	 * implementation.  This routine doesn't require knowing the
	 * exact size of memory, and instead flushes specific cache
	 * lines.
	 */
	int line;

	/*
	 * Flash invalidate I-cache
	 */
	mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_DISABLE);
	mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_UNLOCKALL);
	mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_INVALIDATE);
/*	mpc8xx_wr_ic_cst(MPC8XX_IC_CST_CMD_ENABLE);*/

	mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_DISABLE);
	mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_UNLOCKALL);
	for (line = 0; line < (MPC8XX_DCACHE_SIZE/16); ++line)
	{
		mpc8xx_wr_dc_adr(line);
		mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_FLUSHLINE);
	}
	mpc8xx_wr_dc_cst(MPC8XX_DC_CST_CMD_INVALIDATE);
}

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

#define REGREAD  (1)
#define REGWRITE (0)

static const char FORMAT8[]  = " %8s: %02X\n";
static const char FORMAT16[] = " %8s: %04X\n";
static const char FORMAT32[] = " %8s: %08X\n";

#define IRMD(MOD,REG,SIZE)	\
	if ((strcasecmp(#REG,reg) == 0) || display_all)			\
	{														\
		if (regread)										\
		{													\
			printf(FORMAT ## SIZE, #REG,					\
				imm-> MOD . REG );							\
			pause(&displayed);								\
		}													\
		else												\
			imm-> MOD . REG = value;						\
 															\
		if (!display_all)									\
			return;											\
	}

static int display_all;
static int displayed;

/*********************************************************************/
#ifdef Mpc8xx_siu
static void
irmd_siu (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(siu, SIUMCR, 32)
	IRMD(siu, SYPCR,  32)
#ifndef SWT
	IRMD(siu, SWT,    32)
#endif
	IRMD(siu, SWSR,   16)
	IRMD(siu, SIPEND, 32)
	IRMD(siu, SIMASK, 32)
	IRMD(siu, SIEL,   32)
	IRMD(siu, SIVEC,  32)
	IRMD(siu, TESR,   32)
	IRMD(siu, SDCR,   32)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_pcmcia
static void
irmd_pcmcia (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(pcmcia, PBR0,   32)
	IRMD(pcmcia, POR0,   32)
	IRMD(pcmcia, PBR1,   32)
	IRMD(pcmcia, POR1,   32)
	IRMD(pcmcia, PBR2,   32)
	IRMD(pcmcia, POR2,   32)
	IRMD(pcmcia, PBR3,   32)
	IRMD(pcmcia, POR3,   32)
	IRMD(pcmcia, PBR4,   32)
	IRMD(pcmcia, POR4,   32)
	IRMD(pcmcia, PBR5,   32)
	IRMD(pcmcia, POR5,   32)
	IRMD(pcmcia, PBR6,   32)
	IRMD(pcmcia, POR6,   32)
	IRMD(pcmcia, PBR7,   32)
	IRMD(pcmcia, POR7,   32)
#ifndef PGCRA
	IRMD(pcmcia, PGCRA,  32)
#endif
	IRMD(pcmcia, PGCRB,  32)
	IRMD(pcmcia, PSCR,   32)
	IRMD(pcmcia, PIPR,   32)
	IRMD(pcmcia, PER,    32)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_memc
static void
irmd_memc (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(memc, BR0,   32)
	IRMD(memc, OR0,   32)
	IRMD(memc, BR1,   32)
	IRMD(memc, OR1,   32)
	IRMD(memc, BR2,   32)
	IRMD(memc, OR2,   32)
	IRMD(memc, BR3,   32)
	IRMD(memc, OR3,   32)
	IRMD(memc, BR4,   32)
	IRMD(memc, OR4,   32)
	IRMD(memc, BR5,   32)
	IRMD(memc, OR5,   32)
	IRMD(memc, BR6,   32)
	IRMD(memc, OR6,   32)
	IRMD(memc, BR7,   32)
	IRMD(memc, OR7,   32)
	IRMD(memc, MAR,   32)
	IRMD(memc, MCR,   32)
	IRMD(memc, MAMR,  32)
	IRMD(memc, MBMR,  32)
	IRMD(memc, MSTAT, 16)
	IRMD(memc, MPTPR, 16)
	IRMD(memc, MDR,   32)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_sit
static void
irmd_sit (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(sit, TBSCR,	16)
	IRMD(sit, TBREFF0,	32)
	IRMD(sit, TBREFF1,	32)
	IRMD(sit, RTCSC,	16)
	IRMD(sit, RTC,		32)
	IRMD(sit, RTSEC,	32)
	IRMD(sit, RTCAL,	32)
	IRMD(sit, PISCR,	16)
	IRMD(sit, PITC,		32)
	IRMD(sit, PITR,		32)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_clock
static void
irmd_clock (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(clock, SCCR,    32)
	IRMD(clock, PLPRCR,  32)
	IRMD(clock, RSR,     32)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_sitkey
static void
irmd_sitkey (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(sitkey, TBSCRK,   32)
	IRMD(sitkey, TBREFF0K, 32)
	IRMD(sitkey, TBREFF1K, 32)
	IRMD(sitkey, TBK,      32)
	IRMD(sitkey, RTCSCK,   32)
	IRMD(sitkey, RTSECK,   32)
	IRMD(sitkey, RTCALK,   32)
	IRMD(sitkey, PISCRK,   32)
	IRMD(sitkey, PITCK,    32)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_clockey
static void
irmd_clockey (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(clockey, SCCRK,   32)
	IRMD(clockey, PLPRCRK, 32)
	IRMD(clockey, RSRK,    32)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_i2c
static void
irmd_i2c (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(i2c, I2MOD,  8)
	IRMD(i2c, I2ADD,  8)
	IRMD(i2c, I2BRG,  8)
	IRMD(i2c, I2COM,  8)
	IRMD(i2c, I2CER,  8)
	IRMD(i2c, I2CMR,  8)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_dma
static void
irmd_dma (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(dma, SDAR,  32)
	IRMD(dma, SDSR,   8)
	IRMD(dma, SDMR,   8)
	IRMD(dma, IDSR1,  8)
	IRMD(dma, IDMR1,  8)
	IRMD(dma, IDSR2,  8)
	IRMD(dma, IDMR2,  8)

	if (!display_all)
		printf(INVREG,reg);
}
#endif

/*********************************************************************/
#ifdef Mpc8xx_cpic
static void
irmd_cpic (MPC8XX_IMM *imm, char *reg, int regread, uint32 value)
{
	IRMD(cpic, CIVR,  16)
	IRMD(cpic, CICR,  32)
	IRMD(cpic, CIPR,  32)
	IRMD(cpic, CIMR,  32)
	IRMD(cpic, CISR,  32)

	if (!display_all)

⌨️ 快捷键说明

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