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

📄 mcf5249_hi.c

📁 motorola自己开发的针对coldfire 5272的Dbug bootloader程序
💻 C
字号:
/*
 * File:		mcf5249_hi.c
 * Purpose:		Register display/modify routines for MCF5249 modules.
 *
 * Notes:
 *
 */

#include "src/include/dbug.h"

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

/*
 * CPU name string and source code version for display at boot-up.
 */
const char CPU_STR[] = "ColdFire MCF5249";
const int  CPU_VER_MAJOR   = 1;
const char CPU_VER_MINOR   = 'b';

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

static const char FORMAT8[]  = "%-15s (%-15s): %02X\n";
static const char FORMAT16[] = "%-15s (%-15s): %04X\n";
static const char FORMAT32[] = "%-15s (%-15s): %08X\n";
static const char XFORMAT[]	 = "%-15s (%-15s): %12s\n";

static const char INVMOD[] = "Error: Invalid Module: %s\n";
static const char NOREG[]  = "XXXXXX";

#define IRMD(MOD,RDREG,WRREG,SIZE)  \
if (regread)											\
{														\
	if ((strcasecmp(#RDREG,reg) == 0) || display_all)	\
	{													\
		rdata = MCF5249_ ## MOD ## _ ## RDREG;	\
		printf(FORMAT ## SIZE, #RDREG, #WRREG, rdata);	\
														\
		pause(&displayed);								\
														\
		if (!display_all) return;						\
	}													\
}														\
else													\
{														\
	if (strcasecmp(#WRREG,reg) == 0)					\
	{													\
		MCF5249_ ## MOD ## _ ## WRREG =(uint ## SIZE)value;	\
		return;											\
	}													\
}

#define IRMD_NOWR(MOD,RDREG,SIZE)  \
if (regread)											\
{														\
	if ((strcasecmp(#RDREG,reg) == 0) || display_all)	\
	{													\
		rdata = MCF5249_ ## MOD ## _ ## RDREG;	\
		printf(FORMAT ## SIZE, #RDREG, NOREG, rdata);	\
														\
		pause(&displayed);								\
														\
		if (!display_all) return;						\
	}													\
}

#define IRMD_NORD(MOD,WRREG,SIZE)  \
if (regread && display_all)								\
{														\
	printf(XFORMAT, NOREG, #WRREG, NOREG);				\
}														\
else													\
{														\
	if (strcasecmp(#WRREG,reg) == 0)					\
	{													\
		MCF5249_ ## MOD ## _ ## WRREG =(uint ## SIZE) value;	\
		return;											\
	}													\
}

static int display_all;
static int displayed;
static uint32 rdata;

/********************************************************************/
static void
//irmd_sim (void *imm, char *reg, int regread, uint32 value)
irmd_sim (char *reg, int regread, uint32 value)
{
	IRMD(SIM,	RSR,	RSR,	8);
	IRMD(SIM,	SYPCR,	SYPCR,	8);
	IRMD(SIM,	SWIVR,	SWIVR,	8);
	IRMD(SIM,	SWSR,	SWSR,	8);
	IRMD(SIM,	IRQPAR,	IRQPAR,	8);
	IRMD(SIM,	MPARK,	MPARK,	8);
	IRMD(SIM,	IPR,	IPR,	32);
	IRMD(SIM,	IMR,	IMR,	32);


	IRMD(SIM,	ICR0,	ICR0,	8);
	IRMD(SIM,	ICR1,	ICR1,	8);
	IRMD(SIM,	ICR2,	ICR2,	8);
	IRMD(SIM,	ICR3,	ICR3,	8);
	IRMD(SIM,	ICR4,	ICR4,	8);
	IRMD(SIM,	ICR5,	ICR5,	8);
	IRMD(SIM,	ICR6,	ICR6,	8);
	IRMD(SIM,	ICR7,	ICR7,	8);
	IRMD(SIM,	ICR8,	ICR8,	8);
	IRMD(SIM,	ICR9,	ICR9,	8);
	IRMD(SIM,	ICR10,	ICR10,	8);

	IRMD_NOWR(SIM,	DEVID,	32);

	IRMD(SIM,	GPIO_READ,		GPIO_READ,		32);
	IRMD(SIM,	GPIO_OUT,		GPIO_OUT,		32);
	IRMD(SIM,	GPIO_ENABLE,	GPIO_ENABLE,	32);
	IRMD(SIM,	GPIO_FUNC,		GPIO_FUNC,		32);
	IRMD(SIM,	GPIO1_READ,		GPIO1_READ,		32);
	IRMD(SIM,	GPIO1_OUT,		GPIO1_OUT,		32);
	IRMD(SIM,	GPIO1_ENABLE,	GPIO1_ENABLE,	32);
	IRMD(SIM,	GPIO1_FUNC,		GPIO1_FUNC,		32);
	IRMD(SIM,	GPIO_INT_STAT,	GPIO_INT_STAT,	32);
	IRMD(SIM,	GPIO_INT_CLEAR,	GPIO_INT_CLEAR,	32);
	IRMD(SIM,	GPIO_INT_EN,	GPIO_INT_EN,	32);
	IRMD(SIM,	INTERRUPT_STAT3,INTERRUPT_STAT3,32);
	IRMD(SIM,	INTERRUPT_CLR3,	INTERRUPT_CLR3,	32);
	IRMD(SIM,	INTERRUPT_EN3,	INTERRUPT_EN3,	32);
	IRMD(SIM,	INTLEV1,		INTLEV1,		8);
	IRMD(SIM,	INTLEV2,		INTLEV2,		8);
	IRMD(SIM,	INTLEV3,		INTLEV3,		8);
	IRMD(SIM,	INTLEV4,		INTLEV4,		8);
	IRMD(SIM,	INTLEV5,		INTLEV5,		8);
	IRMD(SIM,	INTLEV6,		INTLEV6,		8);
	IRMD(SIM,	INTLEV7,		INTLEV7,		8);
	IRMD(SIM,	INTLEV8,		INTLEV8,		8);
	IRMD(SIM,	SPURVEC,		SPURVEC,		8);
	IRMD(SIM,	INTBASE,		INTBASE,		8);

	if (!display_all)
		printf(INVREG,reg);
}
/********************************************************************/
static void
irmd_pll (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(PLL,	PLLCR,	PLLCR,	32);

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

/********************************************************************/
static void
irmd_cs (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(CS,	CSAR0,	CSAR0,	16);
	IRMD(CS,	CSMR0,	CSMR0,	32);
	IRMD(CS,	CSCR0,	CSCR0,	16);
	IRMD(CS,	CSAR1,	CSAR1,	16);
	IRMD(CS,	CSMR1,	CSMR1,	32);
	IRMD(CS,	CSCR1,	CSCR1,	16);
	IRMD(CS,	CSAR2,	CSAR2,	16);
	IRMD(CS,	CSMR2,	CSMR2,	32);
	IRMD(CS,	CSCR2,	CSCR2,	16);
	IRMD(CS,	CSAR3,	CSAR3,	16);
	IRMD(CS,	CSMR3,	CSMR3,	32);
	IRMD(CS,	CSCR3,	CSCR3,	16);
	IRMD(CS,	IDECONFIG1,	IDECONFIG1,	32);
	IRMD(CS,	IDECONFIG2,	IDECONFIG2,	32);

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

/********************************************************************/
static void
irmd_qspi (/*void *imm,*/ char *reg, int regread, uint32 value)
{

	IRMD(QSPI,	QMR,	QMR,	32);
	IRMD(QSPI,	QDLYR,	QDLYR,	32);
	IRMD(QSPI,	QWR,	QWR,	32);
	IRMD(QSPI,	QIR,	QIR,	32);
	IRMD(QSPI,	QAR,	QAR,	32);
	IRMD(QSPI,	QDR,	QDR,	32);

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

/********************************************************************/
static void
irmd_dma0 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(DMA0,	SAR,	SAR,	32);
	IRMD(DMA0,	DAR,	DAR,	32);
	IRMD(DMA0,	DCR,	DCR,	16);
	IRMD(DMA0,	BCR,	BCR,	16);
	IRMD(DMA0,	DSR,	DSR,	8);
	IRMD(DMA0,	DIVR,	DIVR,	8);

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

/********************************************************************/
static void
irmd_dma1 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(DMA1,	SAR,	SAR,	32);
	IRMD(DMA1,	DAR,	DAR,	32);
	IRMD(DMA1,	DCR,	DCR,	16);
	IRMD(DMA1,	BCR,	BCR,	16);
	IRMD(DMA1,	DSR,	DSR,	8);
	IRMD(DMA1,	DIVR,	DIVR,	8);

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

/********************************************************************/
static void
irmd_dma2 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(DMA2,	SAR,	SAR,	32);
	IRMD(DMA2,	DAR,	DAR,	32);
	IRMD(DMA2,	DCR,	DCR,	16);
	IRMD(DMA2,	BCR,	BCR,	16);
	IRMD(DMA2,	DSR,	DSR,	8);
	IRMD(DMA2,	DIVR,	DIVR,	8);

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

/********************************************************************/
static void
irmd_dma3 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(DMA3,	SAR,	SAR,	32);
	IRMD(DMA3,	DAR,	DAR,	32);
	IRMD(DMA3,	DCR,	DCR,	16);
	IRMD(DMA3,	BCR,	BCR,	16);
	IRMD(DMA3,	DSR,	DSR,	8);
	IRMD(DMA3,	DIVR,	DIVR,	8);

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

/********************************************************************/
static void
irmd_uart0 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(UART0,	UMR,	UMR,	8);
	IRMD(UART0,	USR,	UCSR,	8);
	IRMD_NORD(UART0,	UCR,	8);
	IRMD(UART0,	URB,	UTB,	8);
	IRMD(UART0,	UIPCR,	UACR,	8);
	IRMD(UART0,	UISR,	UIMR,	8);
	IRMD_NORD(UART0,	UBG1,	8);
	IRMD_NORD(UART0,	UBG2,	8);
	IRMD(UART0,	UIVR,	UIVR,	8);
	IRMD_NOWR(UART0,	UIP,	8);
	IRMD_NORD(UART0,	UOP1,	8);
	IRMD_NORD(UART0,	UOP0,	8);

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

/********************************************************************/
static void
irmd_uart1 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(UART1,	UMR,	UMR,	8);
	IRMD(UART1,	USR,	UCSR,	8);
	IRMD_NORD(UART1,	UCR,	8);
	IRMD(UART1,	URB,	UTB,	8);
	IRMD(UART1,	UIPCR,	UACR,	8);
	IRMD(UART1,	UISR,	UIMR,	8);
	IRMD_NORD(UART1,	UBG1,	8);
	IRMD_NORD(UART1,	UBG2,	8);
	IRMD(UART1,	UIVR,	UIVR,	8);
	IRMD_NOWR(UART1,	UIP,	8);
	IRMD_NORD(UART1,	UOP1,	8);
	IRMD_NORD(UART1,	UOP0,	8);

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

/********************************************************************/
static void
irmd_sdramc (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(DRAMC,	DCR,	DCR,	16);
	IRMD(DRAMC,	DACR0,	DACR0,	32);
	IRMD(DRAMC,	DMR0,	DMR0,	32);
	IRMD(DRAMC,	DACR1,	DACR1,	32);
	IRMD(DRAMC,	DMR1,	DMR1,	32);

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

/********************************************************************/
static void
irmd_timer0 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(TIMER0,	TMR,	TMR,	16);
	IRMD(TIMER0,	TRR,	TRR,	16);
	IRMD_NOWR(TIMER0,		TCR,	16);
	IRMD(TIMER0,	TCN,	TCN,	16);
	IRMD(TIMER0,	TER,	TER,	8);

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

/********************************************************************/
static void
irmd_timer1 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(TIMER1,	TMR,	TMR,	16);
	IRMD(TIMER1,	TRR,	TRR,	16);
	IRMD_NOWR(TIMER1,		TCR,	16);
	IRMD(TIMER1,	TCN,	TCN,	16);
	IRMD(TIMER1,	TER,	TER,	8);

	if (!display_all)
		printf(INVREG,reg);
}
/********************************************************************/
static void
irmd_audio (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(AUDIO,		IIS1_CFG,	IIS1_CFG,	32);
	IRMD(AUDIO,		IIS2_CFG,	IIS2_CFG,	32);
	IRMD(AUDIO,		IIS3_CFG,	IIS3_CFG,	32);
	IRMD(AUDIO,		IIS4_CFG,	IIS4_CFG,	32);
	IRMD(AUDIO,		EBU_CFG,	EBU_CFG,	32);
	IRMD(AUDIO,		EBU_RCV_C_CH_1,	EBU_RCV_C_CH_1,	32);
	IRMD(AUDIO,		EBU_TX_C_CH_1,	EBU_TX_C_CH_1,	32);
	IRMD(AUDIO,		EBU_TX_C_CH_2,	EBU_TX_C_CH_2,	32);

	IRMD(AUDIO,		DATA_IN_CONTROL,	DATA_IN_CONTROL,	16);
	IRMD(AUDIO,		PDIR1_L,	PDIR1_L,	32);
	IRMD(AUDIO,		PDIR3_L,	PDIR3_L,	32);
	IRMD(AUDIO,		PDIR1_R,	PDIR1_R,	32);
	IRMD(AUDIO,		PDIR3_R,	PDIR3_R,	32);

	IRMD(AUDIO,		PDOR1_L,	PDOR1_L,	32);
	IRMD(AUDIO,		PDOR1_R,	PDOR1_R,	32);
	IRMD(AUDIO,		PDOR2_L,	PDOR2_L,	32);
	IRMD(AUDIO,		PDOR2_R,	PDOR2_R,	32);
	IRMD(AUDIO,		PDOR3,	PDOR3,	32);
	IRMD(AUDIO,		PDIR,	PDIR,	32);

	IRMD(AUDIO,		U_CHANNEL_XMIT,	U_CHANNEL_XMIT,	32);
	IRMD(AUDIO,		U_CHANNEL_RCV,	U_CHANNEL_RCV,	32);
	IRMD(AUDIO,		Q_CHANNEL_RCV,	Q_CHANNEL_RCV,	32);

	IRMD(AUDIO,		CD_TEXT_CONTROL,	CD_TEXT_CONTROL,	8);

	IRMD(AUDIO,		INTERRUPT_EN,	INTERRUPT_EN,	32);
	IRMD(AUDIO,		INTERRUPT_CLEAR,	INTERRUPT_CLEAR,	32);
	IRMD(AUDIO,		INTERRUPT_STAT,	INTERRUPT_STAT,	32);
	IRMD(AUDIO,		DMA_CONFIG,	DMA_CONFIG,	8);
	IRMD(AUDIO,		PHASE_CONFIG,	PHASE_CONFIG,	8);
	IRMD(AUDIO,		XTRIM,	XTRIM,	16);
	IRMD(AUDIO,		FREQ_MEAS,	FREQ_MEAS,	32);

	IRMD(AUDIO,		BLOCK_CONTROL,	BLOCK_CONTROL,	16);
	IRMD(AUDIO,		GLOB,	GLOB,	16);
	IRMD(AUDIO,		EBU2_CONFIG,	EBU2_CONFIG,	32);
	IRMD(AUDIO,		EBU2_RCV_C_CNL_1,	EBU2_RCV_C_CNL_1,	32);
	IRMD(AUDIO,		U2_CHANNEL_RCV,	U2_CHANNEL_RCV,	32);
	IRMD(AUDIO,		Q2_CHANNEL_RCV,	Q2_CHANNEL_RCV,	32);

	if (!display_all)
		printf(INVREG,reg);
}
/********************************************************************/
static void
irmd_adc (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(ADC,	ADCONFIG,	ADCONFIG,	16);
	IRMD(ADC,	ADVALUE,	ADVALUE,	16);

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

/********************************************************************/
static void
irmd_i2c (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(I2C,	MADR,	MADR,	8);
	IRMD(I2C,	MFDR,	MFDR,	8);
	IRMD(I2C,	MBCR,	MBCR,	8);
	IRMD(I2C,	MBSR,	MBSR,	8);
	IRMD(I2C,	MBDR,	MBDR,	8);

	if (!display_all)
		printf(INVREG,reg);
}
/********************************************************************/
static void
irmd_i2c2 (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(I2C2,	MADR,	MADR,	8);
	IRMD(I2C2,	MFDR,	MFDR,	8);
	IRMD(I2C2,	MBCR,	MBCR,	8);
	IRMD(I2C2,	MBSR,	MBSR,	8);
	IRMD(I2C2,	MBDR,	MBDR,	8);

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

/********************************************************************/
static void
irmd_flashmedia (/*void *imm,*/ char *reg, int regread, uint32 value)
{
	IRMD(FLASHMEDIA,	CONFIG,	CONFIG,	32);
	IRMD(FLASHMEDIA,	CMD1,	CMD1,	32);
	IRMD(FLASHMEDIA,	CMD2,	CMD2,	32);
	IRMD(FLASHMEDIA,	DATA1,	DATA1,	32);
	IRMD(FLASHMEDIA,	DATA2,	DATA2,	32);
	IRMD(FLASHMEDIA,	STATUS,	STATUS,	32);
	IRMD(FLASHMEDIA,	INT_EN,	INT_EN,	32);
	IRMD(FLASHMEDIA,	INT_STAT,	INT_STAT,	32);
	IRMD(FLASHMEDIA,	INT_CLEAR,	INT_CLEAR,	32);

	if (!display_all)
		printf(INVREG,reg);
}
/********************************************************************/
static const struct module_t
{
	char	*module;
	void	(*func)(char *, int, uint32);
} MODULE[] =
{
	{"SIM",		irmd_sim},
	{"CS",		irmd_cs},
	{"PLL",		irmd_pll},
	{"QSPI",	irmd_qspi},
	{"DMA0",	irmd_dma0},
	{"DMA1",	irmd_dma1},
	{"DMA2",	irmd_dma2},
	{"DMA3",	irmd_dma3},
	{"UART0",	irmd_uart0},
	{"UART1",	irmd_uart1},
	{"SDRAMC",	irmd_sdramc},
	{"TIMER0",	irmd_timer0},
	{"TIMER1",	irmd_timer1},
	{"AUDIO",	irmd_audio},
	{"ADC",	irmd_adc},
	{"I2C",	irmd_i2c},
	{"I2C2",	irmd_i2c2},
	{"FLASHMEDIA",	irmd_flashmedia}


} ;

#define MODULE_SIZE (int)(sizeof(MODULE)/sizeof(struct module_t))

/********************************************************************/
void
mcf5249_ird (int argc, char **argv)
{
	/*
	 * Display Internal Memory Mapped register contents
	 */
	char *rstr;
	char mstr[20];
	int mi;

	(void)argc;

	display_all = FALSE;

	if (argv[1] == NULL)
	{
		printf("Internal Modules (MBAR = %#08X):",MBAR_ADDRESS);
		for (mi = 0; mi < MODULE_SIZE; ++mi)
		{
			if (!(mi % 9))
				printf("\n");
			printf("%-6s ",MODULE[mi].module);
		}
		printf("\n\n");
		return;
	}

	/*
	 * Pick out module name and point to register name
	 */
	mi = 0;
	rstr = argv[1];
	while (*rstr != '.')
	{
		mstr[mi++] = *rstr;
		if (*++rstr == '\0')
		{
			rstr = NULL;
			break;
		}
	}
	mstr[mi] = '\0';
	if (*rstr == '.')
		++rstr;

	/*
	 * Display the module contents
	 */
	for (mi = 0; mi < MODULE_SIZE; ++mi)
	{
		if (strcasecmp(MODULE[mi].module,mstr) == 0)
		{
			if (rstr == NULL)
			{
				display_all = TRUE;
				printf("Module: %s\n",MODULE[mi].module);
			}
			MODULE[mi].func(rstr, TRUE, 0);
			return;
		}
	}

	printf(INVMOD,argv[1]);
}

/********************************************************************/
void
mcf5249_irm (int argc, char **argv)
{
	/*
	 * Modify Internal Memory Mapped register contents
	 */
	uint32 value;
	int success;
	char *rstr;
	char mstr[20];
	int mi;

	(void)argc;

	display_all = FALSE;

	/*
	 * Pick out module name and point to register name
	 */
	mi = 0;
	rstr = argv[1];
	while (*rstr != '.')
	{
		mstr[mi++] = *rstr;
		if (*++rstr == '\0')
		{
			rstr = NULL;
			break;
		}
	}
	mstr[mi] = '\0';
	if (*rstr == '.')
		++rstr;

	/*
	* Get the new value
	*/

	value = get_value(argv[2],&success,16);
	if(success == 0)
	{
		printf(INVALUE,argv[2]);
		return;
	}

	/*
	 * Modify the module contents
	 */
	for (mi = 0; mi < MODULE_SIZE; ++mi)
	{
		if (strcasecmp(MODULE[mi].module,mstr) == 0)
		{
			MODULE[mi].func(rstr, FALSE, value);
			return;
		}
	}

	printf(INVMOD,argv[1]);
}

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

⌨️ 快捷键说明

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