You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
517 lines
13 KiB
C
517 lines
13 KiB
C
16 years ago
|
/*
|
||
|
* File: mcf5xxx.c
|
||
|
* Purpose: Generic high-level routines for generic ColdFire processors
|
||
|
*
|
||
|
* Notes:
|
||
|
*
|
||
|
* License: All software covered by license agreement in -
|
||
|
* docs/Freescale_Software_License.pdf
|
||
|
*/
|
||
|
|
||
|
#include "common.h"
|
||
|
|
||
|
/********************************************************************/
|
||
|
|
||
|
#define EXCEPTFMT "%s -- PC = %#08X\n"
|
||
|
|
||
|
/********************************************************************/
|
||
|
/*
|
||
|
* 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.
|
||
|
*
|
||
|
* Called by asm_exception_handler
|
||
|
*/
|
||
|
void
|
||
|
mcf5xxx_exception_handler (void *framep)
|
||
|
{
|
||
|
switch (MCF5XXX_RD_SF_FORMAT(framep))
|
||
|
{
|
||
|
case 4:
|
||
|
case 5:
|
||
|
case 6:
|
||
|
case 7:
|
||
|
break;
|
||
|
default:
|
||
|
printf(EXCEPTFMT,"Illegal stack type", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
switch (MCF5XXX_RD_SF_VECTOR(framep))
|
||
|
{
|
||
|
case 2:
|
||
|
printf(EXCEPTFMT, "Access Error", MCF5XXX_SF_PC(framep));
|
||
|
switch (MCF5XXX_RD_SF_FS(framep))
|
||
|
{
|
||
|
case 4:
|
||
|
printf("Error on instruction fetch\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("Error on operand write\n");
|
||
|
break;
|
||
|
case 9:
|
||
|
printf("Attempted write to write-protected space\n");
|
||
|
break;
|
||
|
case 12:
|
||
|
printf("Error on operand read\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved Fault Status Encoding\n");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case 3:
|
||
|
printf(EXCEPTFMT, "Address Error", MCF5XXX_SF_PC(framep));
|
||
|
switch (MCF5XXX_RD_SF_FS(framep))
|
||
|
{
|
||
|
case 4:
|
||
|
printf("Error on instruction fetch\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("Error on operand write\n");
|
||
|
break;
|
||
|
case 9:
|
||
|
printf("Attempted write to write-protected space\n");
|
||
|
break;
|
||
|
case 12:
|
||
|
printf("Error on operand read\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved Fault Status Encoding\n");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case 4:
|
||
|
printf(EXCEPTFMT, "Illegal instruction", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 8:
|
||
|
printf(EXCEPTFMT, "Privilege violation", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 9:
|
||
|
printf(EXCEPTFMT, "Trace Exception", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 10:
|
||
|
printf(EXCEPTFMT, "Unimplemented A-Line Instruction", \
|
||
|
MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 11:
|
||
|
printf(EXCEPTFMT, "Unimplemented F-Line Instruction", \
|
||
|
MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 12:
|
||
|
printf(EXCEPTFMT, "Debug Interrupt", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 14:
|
||
|
printf(EXCEPTFMT, "Format Error", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 15:
|
||
|
printf(EXCEPTFMT, "Unitialized Interrupt", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 24:
|
||
|
printf(EXCEPTFMT, "Spurious Interrupt", MCF5XXX_SF_PC(framep));
|
||
|
break;
|
||
|
case 25:
|
||
|
case 26:
|
||
|
case 27:
|
||
|
case 28:
|
||
|
case 29:
|
||
|
case 30:
|
||
|
case 31:
|
||
|
printf("Autovector interrupt level %d\n",
|
||
|
MCF5XXX_RD_SF_VECTOR(framep) - 24);
|
||
|
break;
|
||
|
case 32:
|
||
|
case 33:
|
||
|
case 34:
|
||
|
case 35:
|
||
|
case 36:
|
||
|
case 37:
|
||
|
case 38:
|
||
|
case 39:
|
||
|
case 40:
|
||
|
case 41:
|
||
|
case 42:
|
||
|
case 43:
|
||
|
case 44:
|
||
|
case 45:
|
||
|
case 46:
|
||
|
case 47:
|
||
|
printf("TRAP #%d\n", MCF5XXX_RD_SF_VECTOR(framep) - 32);
|
||
|
break;
|
||
|
case 5:
|
||
|
case 6:
|
||
|
case 7:
|
||
|
case 13:
|
||
|
case 16:
|
||
|
case 17:
|
||
|
case 18:
|
||
|
case 19:
|
||
|
case 20:
|
||
|
case 21:
|
||
|
case 22:
|
||
|
case 23:
|
||
|
case 48:
|
||
|
case 49:
|
||
|
case 50:
|
||
|
case 51:
|
||
|
case 52:
|
||
|
case 53:
|
||
|
case 54:
|
||
|
case 55:
|
||
|
case 56:
|
||
|
case 57:
|
||
|
case 58:
|
||
|
case 59:
|
||
|
case 60:
|
||
|
case 61:
|
||
|
case 62:
|
||
|
case 63:
|
||
|
printf("Reserved: #%d\n", MCF5XXX_RD_SF_VECTOR(framep));
|
||
|
break;
|
||
|
default:
|
||
|
cpu_handle_interrupt(MCF5XXX_RD_SF_VECTOR(framep));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/********************************************************************/
|
||
|
/*
|
||
|
* Interpret the reset values of D0 and D1
|
||
|
*
|
||
|
* Parameters:
|
||
|
* d0 - the reset value of data register zero
|
||
|
* d1 - the reset value of data register one
|
||
|
*/
|
||
|
void
|
||
|
mcf5xxx_interpret_d0d1(int d0, int d1)
|
||
|
{
|
||
|
#ifdef DEBUG_PRINT
|
||
|
printf("\nColdFire Core Configuration:\n");
|
||
|
printf("----------------------------\n");
|
||
|
printf("Processor Family %#02x\n",MCF5XXX_D0_PF(d0));
|
||
|
printf("ColdFire Core Version: %d\n",MCF5XXX_D0_VER(d0));
|
||
|
printf("Processor Revision: %d\n",MCF5XXX_D0_REV(d1));
|
||
|
printf("Bus Width: ");
|
||
|
switch (MCF5XXX_D1_BUSW(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("32-bit\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("ISA Version: ");
|
||
|
switch (MCF5XXX_D0_ISA(d0))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("A\n");
|
||
|
break;
|
||
|
case 1:
|
||
|
printf("B\n");
|
||
|
break;
|
||
|
case 2:
|
||
|
printf("C\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("A+\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("Debug Version: ");
|
||
|
switch (MCF5XXX_D0_DEBUG(d0))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("A\n");
|
||
|
break;
|
||
|
case 1:
|
||
|
printf("B\n");
|
||
|
break;
|
||
|
case 2:
|
||
|
printf("C\n");
|
||
|
break;
|
||
|
case 3:
|
||
|
printf("D\n");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("E\n");
|
||
|
break;
|
||
|
case 9:
|
||
|
printf("B+\n");
|
||
|
break;
|
||
|
default :
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("MAC: %s\n", MCF5XXX_D0_MAC(d0) ? "Yes" : "No");
|
||
|
printf("DIV: %s\n", MCF5XXX_D0_DIV(d0) ? "Yes" : "No");
|
||
|
printf("EMAC: %s\n", MCF5XXX_D0_EMAC(d0) ? "Yes" : "No");
|
||
|
printf("FPU: %s\n", MCF5XXX_D0_FPU(d0) ? "Yes" : "No");
|
||
|
printf("MMU: %s\n", MCF5XXX_D0_MMU(d0) ? "Yes" : "No");
|
||
|
printf("RAM Bank 0 Size: ");
|
||
|
switch (MCF5XXX_D1_RAM0SIZ(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
case 1:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
printf("None\n");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("4KB\n");
|
||
|
break;
|
||
|
case 5:
|
||
|
printf("8KB\n");
|
||
|
break;
|
||
|
case 6:
|
||
|
printf("16KB\n");
|
||
|
break;
|
||
|
case 7:
|
||
|
printf("32KB\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("64KB\n");
|
||
|
break;
|
||
|
case 9:
|
||
|
printf("128KB\n");
|
||
|
break;
|
||
|
case 10:
|
||
|
printf("256KB\n");
|
||
|
break;
|
||
|
case 11:
|
||
|
printf("512KB\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("RAM Bank 1 Size: ");
|
||
|
switch (MCF5XXX_D1_RAM1SIZ(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
case 1:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
printf("None\n");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("4KB\n");
|
||
|
break;
|
||
|
case 5:
|
||
|
printf("8KB\n");
|
||
|
break;
|
||
|
case 6:
|
||
|
printf("16KB\n");
|
||
|
break;
|
||
|
case 7:
|
||
|
printf("32KB\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("64KB\n");
|
||
|
break;
|
||
|
case 9:
|
||
|
printf("128KB\n");
|
||
|
break;
|
||
|
case 10:
|
||
|
printf("256KB\n");
|
||
|
break;
|
||
|
case 11:
|
||
|
printf("512KB\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("ROM Bank 0 Size: ");
|
||
|
switch (MCF5XXX_D1_ROM0SIZ(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
case 1:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
printf("None\n");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("4KB\n");
|
||
|
break;
|
||
|
case 5:
|
||
|
printf("8KB\n");
|
||
|
break;
|
||
|
case 6:
|
||
|
printf("16KB\n");
|
||
|
break;
|
||
|
case 7:
|
||
|
printf("32KB\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("64KB\n");
|
||
|
break;
|
||
|
case 9:
|
||
|
printf("128KB\n");
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("ROM Bank 1 Size: ");
|
||
|
switch (MCF5XXX_D1_ROM1SIZ(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
case 1:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
printf("None\n");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("4KB\n");
|
||
|
break;
|
||
|
case 5:
|
||
|
printf("8KB\n");
|
||
|
break;
|
||
|
case 6:
|
||
|
printf("16KB\n");
|
||
|
break;
|
||
|
case 7:
|
||
|
printf("32KB\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("64KB\n");
|
||
|
break;
|
||
|
case 9:
|
||
|
printf("128KB\n");
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("Cache Line Size: ");
|
||
|
switch (MCF5XXX_D1_CL(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("16-byte\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("I-Cache Associativity: ");
|
||
|
switch (MCF5XXX_D1_ICA(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("Four-way\n");
|
||
|
break;
|
||
|
case 1:
|
||
|
printf("Direct mapped\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("D-Cache Associativity: ");
|
||
|
switch (MCF5XXX_D1_DCA(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("Four-way\n");
|
||
|
break;
|
||
|
case 1:
|
||
|
printf("Direct mapped\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("I-Cache Size: ");
|
||
|
switch (MCF5XXX_D1_ICSIZ(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("None\n");
|
||
|
break;
|
||
|
case 1:
|
||
|
printf("512B\n");
|
||
|
break;
|
||
|
case 2:
|
||
|
printf("1KB\n");
|
||
|
break;
|
||
|
case 3:
|
||
|
printf("2KB\n");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("4KB\n");
|
||
|
break;
|
||
|
case 5:
|
||
|
printf("8KB\n");
|
||
|
break;
|
||
|
case 6:
|
||
|
printf("16KB\n");
|
||
|
break;
|
||
|
case 7:
|
||
|
printf("32KB\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("64KB\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("D-Cache Size: ");
|
||
|
switch (MCF5XXX_D1_DCSIZ(d1))
|
||
|
{
|
||
|
case 0:
|
||
|
printf("None\n");
|
||
|
break;
|
||
|
case 1:
|
||
|
printf("512B\n");
|
||
|
break;
|
||
|
case 2:
|
||
|
printf("1KB\n");
|
||
|
break;
|
||
|
case 3:
|
||
|
printf("2KB\n");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("4KB\n");
|
||
|
break;
|
||
|
case 5:
|
||
|
printf("8KB\n");
|
||
|
break;
|
||
|
case 6:
|
||
|
printf("16KB\n");
|
||
|
break;
|
||
|
case 7:
|
||
|
printf("32KB\n");
|
||
|
break;
|
||
|
case 8:
|
||
|
printf("64KB\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Reserved\n");
|
||
|
}
|
||
|
printf("\n");
|
||
|
#else
|
||
|
/* Remove compiler warnings. */
|
||
|
( void ) d0;
|
||
|
( void ) d1;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
/********************************************************************/
|
||
|
void
|
||
|
mcf5xxx_irq_enable (void)
|
||
|
{
|
||
|
asm_set_ipl(0);
|
||
|
}
|
||
|
/********************************************************************/
|
||
|
void
|
||
|
mcf5xxx_irq_disable (void)
|
||
|
{
|
||
|
asm_set_ipl(7);
|
||
|
}
|
||
|
/********************************************************************/
|
||
|
/*
|
||
|
* Write new interrupt vector handler into the vector table
|
||
|
* Return previous handler address
|
||
|
*/
|
||
|
|
||
|
ADDRESS
|
||
|
mcf5xxx_set_handler (int vector, ADDRESS new_handler)
|
||
|
{
|
||
|
ADDRESS old_handler;
|
||
|
extern uint32 __VECTOR_RAM[];
|
||
|
|
||
|
old_handler = (ADDRESS) __VECTOR_RAM[vector];
|
||
|
__VECTOR_RAM[vector] = (uint32)new_handler;
|
||
|
return old_handler;
|
||
|
}
|
||
|
|
||
|
/********************************************************************/
|