mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-19 09:38:32 -04:00
Add MCF52259 demo.
This commit is contained in:
parent
8981a8539a
commit
fe73d24184
60 changed files with 10188 additions and 0 deletions
81
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x.c
Normal file
81
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x.c
Normal file
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* File: mcf52xx.c
|
||||
* Purpose: Source to select CF derivative
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* License: All software covered by license agreement in -
|
||||
* docs/Freescale_Software_License.pdf
|
||||
*/
|
||||
/********************************************************************/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/********************************************************************/
|
||||
/*
|
||||
* Pause for the specified number of micro-seconds.
|
||||
* Uses DTIM3 as a timer
|
||||
*/
|
||||
void
|
||||
cpu_pause(int usecs)
|
||||
{
|
||||
/* Enable the DMA Timer 3 */
|
||||
MCF_DTIM3_DTRR = (vuint32)(usecs - 1);
|
||||
MCF_DTIM3_DTER = MCF_DTIM_DTER_REF;
|
||||
MCF_DTIM3_DTMR = 0
|
||||
| MCF_DTIM_DTMR_PS(SYSTEM_CLOCK)
|
||||
| MCF_DTIM_DTMR_FRR
|
||||
| MCF_DTIM_DTMR_CLK_DIV1
|
||||
| MCF_DTIM_DTMR_RST;
|
||||
|
||||
while ((MCF_DTIM3_DTER & MCF_DTIM_DTER_REF) == 0)
|
||||
{};
|
||||
|
||||
/* Disable the timer */
|
||||
MCF_DTIM3_DTMR = 0;
|
||||
}
|
||||
|
||||
/********************************************************************/
|
||||
void
|
||||
board_handle_interrupt (int vector)
|
||||
{
|
||||
switch (vector)
|
||||
{
|
||||
case 65: /* Eport Interrupt 1 */
|
||||
printf("SW2\n");
|
||||
MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF1;
|
||||
break;
|
||||
case 69: /* Eport Interrupt 5 */
|
||||
printf("SW1\n");
|
||||
MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF5;
|
||||
break;
|
||||
case 71: /* Eport Interrupt 7 */
|
||||
printf("ABORT\n");
|
||||
MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF7;
|
||||
break;
|
||||
case 66: /* Eport Interrupt 2 */
|
||||
case 67: /* Eport Interrupt 3 */
|
||||
case 68: /* Eport Interrupt 4 */
|
||||
case 70: /* Eport Interrupt 6 */
|
||||
default:
|
||||
MCF_EPORT_EPFR = (uint8)(0x01 << (vector - 64));
|
||||
printf("Edge Port Interrupt #%d\n",vector - 64);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/********************************************************************/
|
||||
|
||||
/********************************************************************/
|
||||
void
|
||||
cpu_handle_interrupt (int vector)
|
||||
{
|
||||
if (vector < 64 || vector > 192)
|
||||
return;
|
||||
|
||||
if (vector >= 64 && vector <= 71)
|
||||
board_handle_interrupt(vector);
|
||||
else
|
||||
printf("User Defined Vector #%d\n",vector);
|
||||
}
|
||||
/********************************************************************/
|
||||
|
48
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x.h
Normal file
48
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* File: mcf5225x.h
|
||||
* Purpose: Register and bit definitions
|
||||
*
|
||||
* License: All software covered by license agreement in -
|
||||
* docs/Freescale_Software_License.pdf
|
||||
*/
|
||||
|
||||
#ifndef __MCF5225x_H__
|
||||
#define __MCF5225x_H__
|
||||
|
||||
/********************************************************************/
|
||||
/*
|
||||
* 5225x includes
|
||||
*/
|
||||
|
||||
#include "MCF52259_SCM.h"
|
||||
#include "MCF52259_DMA.h"
|
||||
#include "MCF52259_UART.h"
|
||||
#include "MCF52259_I2C.h"
|
||||
#include "MCF52259_QSPI.h"
|
||||
#include "MCF52259_TMR.h"
|
||||
#include "MCF52259_INTC.h"
|
||||
#include "MCF52259_FEC.h"
|
||||
#include "MCF52259_GPIO.h"
|
||||
#include "MCF52259_PAD.h"
|
||||
#include "MCF52259_RCM.h"
|
||||
#include "MCF52259_CCM.h"
|
||||
#include "MCF52259_PMM.h"
|
||||
#include "MCF52259_CLOCK.h"
|
||||
#include "MCF52259_EPORT.h"
|
||||
#include "MCF52259_BWT.h"
|
||||
#include "MCF52259_PIT.h"
|
||||
#include "MCF52259_FlexCAN.h"
|
||||
#include "MCF52259_RTC.h"
|
||||
#include "MCF52259_ADC.h"
|
||||
#include "MCF52259_GPT.h"
|
||||
#include "MCF52259_PWM.h"
|
||||
#include "MCF52259_USB_OTG.h"
|
||||
#include "MCF52259_CFM.h"
|
||||
#include "MCF52259_RNGA.h"
|
||||
#include "MCF52259_fbcs.h"
|
||||
#include "mcf52259_dtim.h"
|
||||
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
#endif /* __MCF5225x_H__ */
|
153
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x_lo.s
Normal file
153
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x_lo.s
Normal file
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
* File: mcf5225x_lo.s
|
||||
* Purpose: Low-level routines for the MCF5225x.
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* License: All software covered by license agreement in -
|
||||
* docs/Freescale_Software_License.pdf
|
||||
*/
|
||||
|
||||
#define mcf5225x_init _mcf5225x_init
|
||||
#define common_startup _common_startup
|
||||
#define cpu_startup _cpu_startup
|
||||
#define main _main
|
||||
#define __IPSBAR ___IPSBAR
|
||||
#define __SRAM ___SRAM
|
||||
#define __FLASH ___FLASH
|
||||
#define __SP_INIT ___SP_INIT
|
||||
|
||||
.extern __IPSBAR
|
||||
.extern __SRAM
|
||||
.extern __FLASH
|
||||
.extern __SP_INIT
|
||||
.extern mcf5225x_init
|
||||
.extern common_startup
|
||||
.extern cpu_startup
|
||||
.extern main
|
||||
|
||||
.global asm_startmeup
|
||||
.global _asm_startmeup
|
||||
.global d0_reset
|
||||
.global _d0_reset
|
||||
.global d1_reset
|
||||
.global _d1_reset
|
||||
|
||||
.data
|
||||
|
||||
d0_reset:
|
||||
_d0_reset: .long 0
|
||||
d1_reset:
|
||||
_d1_reset: .long 0
|
||||
|
||||
.text
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* This is the main entry point upon hard reset. The memory map is
|
||||
* setup based on linker file definitions, then the higher level
|
||||
* system initialization routine is called. Finally, we jump to the
|
||||
* "main" process.
|
||||
*/
|
||||
asm_startmeup:
|
||||
_asm_startmeup:
|
||||
|
||||
move.w #0x2700,sr
|
||||
|
||||
/* Save off reset values of D0 and D1 */
|
||||
move.l d0,d6
|
||||
move.l d1,d7
|
||||
|
||||
/* Initialize RAMBAR1: locate SRAM and validate it */
|
||||
move.l #__SRAM,d0
|
||||
andi.l #0xFFFF0000,d0
|
||||
add.l #0x21,d0
|
||||
movec d0,RAMBAR1
|
||||
|
||||
/* Locate Stack Pointer */
|
||||
move.l #__SP_INIT,sp
|
||||
|
||||
/* Initialize IPSBAR */
|
||||
move.l #__IPSBAR,d0
|
||||
add.l #0x1,d0
|
||||
move.l d0,0x40000000
|
||||
|
||||
/* Initialize FLASHBAR */
|
||||
move.l #__FLASH,d0
|
||||
cmp.l #0x00000000,d0
|
||||
bne change_flashbar
|
||||
add.l #0x61,d0
|
||||
movec d0,RAMBAR0
|
||||
|
||||
_continue_startup:
|
||||
|
||||
/* Locate Stack Pointer */
|
||||
move.l #__SP_INIT,sp
|
||||
|
||||
/* Initialize the system */
|
||||
jsr mcf5225x_init
|
||||
|
||||
/* Common startup code */
|
||||
//jsr common_startup
|
||||
|
||||
/* Save off intial D0 and D1 to RAM */
|
||||
move.l d6,d0_reset
|
||||
move.l d7,d1_reset
|
||||
|
||||
/* CPU specific startup code */
|
||||
//jsr cpu_startup
|
||||
|
||||
/* Jump to the main process */
|
||||
jsr main
|
||||
|
||||
bra .
|
||||
nop
|
||||
nop
|
||||
halt
|
||||
|
||||
change_flashbar:
|
||||
/*
|
||||
* The following sequence is used to set FLASHBAR. Since we may
|
||||
* be executing from Flash, we must put the routine into SRAM for
|
||||
* execution and then jump back to Flash using the new address.
|
||||
*
|
||||
* The following instructions are coded into the SRAM:
|
||||
*
|
||||
* move.l #(__FLASH + 0x21),d0
|
||||
* movec d0, RAMBAR0
|
||||
* jmp _continue_startup
|
||||
*
|
||||
* An arbitrary SRAM address is chosen until the real address
|
||||
* can be loaded.
|
||||
*
|
||||
* This routine is not necessary if the default Flash address
|
||||
* (0x00000000) is used.
|
||||
*
|
||||
* If running in SRAM, change_flashbar should not be executed
|
||||
*/
|
||||
|
||||
move.l #__SRAM,a0
|
||||
|
||||
/* Code "move.l #(__FLASH + 0x21),d0" into SRAM */
|
||||
move.w #0x203C,d0
|
||||
move.w d0,(a0)+
|
||||
move.l #__FLASH,d0
|
||||
add.l #0x21,d0
|
||||
move.l d0,(a0)+
|
||||
|
||||
/* Code "movec d0,FLASHBAR" into SRAM */
|
||||
move.l #0x4e7b0C04,d0
|
||||
move.l d0,(a0)+
|
||||
|
||||
/* Code "jmp _continue_startup" into SRAM */
|
||||
move.w #0x4EF9,d0
|
||||
move.w d0,(a0)+
|
||||
move.l #_continue_startup,d0
|
||||
move.l d0,(a0)+
|
||||
|
||||
/* Jump to code segment in internal SRAM */
|
||||
jmp __SRAM
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
.end
|
301
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x_sysinit.c
Normal file
301
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x_sysinit.c
Normal file
|
@ -0,0 +1,301 @@
|
|||
/*
|
||||
* File: sysinit.c
|
||||
* Purpose: Reset configuration of the M52259EVB
|
||||
*
|
||||
* License: All software covered by license agreement in -
|
||||
* docs/Freescale_Software_License.pdf
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
void mcf5225x_init(void);
|
||||
void mcf5225x_wtm_init(void);
|
||||
void mcf5225x_pll_init(void);
|
||||
void mcf5225x_uart_init(void);
|
||||
void mcf5225x_scm_init(void);
|
||||
void mcf5225x_gpio_init(void);
|
||||
|
||||
/********************************************************************/
|
||||
void
|
||||
mcf5225x_init(void)
|
||||
{
|
||||
register uint32 n;
|
||||
register uint8 *dp, *sp;
|
||||
|
||||
|
||||
/*
|
||||
* Allow interrupts from ABORT, SW1, SW2 (IRQ[1,5,7])
|
||||
* and USB (IRQ[2,6])
|
||||
*/
|
||||
|
||||
|
||||
/* Enable IRQ signals on the port */
|
||||
MCF_GPIO_PNQPAR = 0
|
||||
| MCF_GPIO_PNQPAR_IRQ1_IRQ1
|
||||
| MCF_GPIO_PNQPAR_IRQ5_IRQ5
|
||||
| MCF_GPIO_PNQPAR_IRQ7_IRQ7;
|
||||
|
||||
/* Set EPORT to look for falling edges */
|
||||
MCF_EPORT_EPPAR = 0
|
||||
| MCF_EPORT_EPPAR_EPPA1_FALLING
|
||||
| MCF_EPORT_EPPAR_EPPA2_FALLING
|
||||
| MCF_EPORT_EPPAR_EPPA5_FALLING
|
||||
| MCF_EPORT_EPPAR_EPPA6_FALLING
|
||||
| MCF_EPORT_EPPAR_EPPA7_FALLING;
|
||||
|
||||
/* Clear any currently triggered events on the EPORT */
|
||||
MCF_EPORT_EPIER = 0
|
||||
| MCF_EPORT_EPIER_EPIE1
|
||||
| MCF_EPORT_EPIER_EPIE2
|
||||
| MCF_EPORT_EPIER_EPIE5
|
||||
| MCF_EPORT_EPIER_EPIE6
|
||||
| MCF_EPORT_EPIER_EPIE7;
|
||||
|
||||
/* Enable interrupts in the interrupt controller */
|
||||
MCF_INTC0_IMRL &= ~(0
|
||||
| MCF_INTC_IMRL_INT_MASK1
|
||||
| MCF_INTC_IMRL_INT_MASK2
|
||||
| MCF_INTC_IMRL_INT_MASK5
|
||||
| MCF_INTC_IMRL_INT_MASK6
|
||||
| MCF_INTC_IMRL_INT_MASK7
|
||||
| MCF_INTC_IMRL_MASKALL);
|
||||
|
||||
|
||||
/* Enable debug */
|
||||
MCF_GPIO_PDDPAR = 0x0F;
|
||||
|
||||
/* Set real time clock freq */
|
||||
|
||||
MCF_CLOCK_RTCCR = 48000000;
|
||||
|
||||
/* Copy the vector table to RAM */
|
||||
if (__VECTOR_RAM != VECTOR_TABLE)
|
||||
{
|
||||
for (n = 0; n < 256; n++)
|
||||
__VECTOR_RAM[n] = VECTOR_TABLE[n];
|
||||
|
||||
mcf5xxx_wr_vbr((uint32)__VECTOR_RAM);
|
||||
}
|
||||
|
||||
/*
|
||||
* Move initialized data from ROM to RAM.
|
||||
*/
|
||||
if (__DATA_ROM != __DATA_RAM)
|
||||
{
|
||||
dp = (uint8 *)__DATA_RAM;
|
||||
sp = (uint8 *)__DATA_ROM;
|
||||
n = (uint32)(__DATA_END - __DATA_RAM);
|
||||
while (n--)
|
||||
*dp++ = *sp++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Zero uninitialized data
|
||||
*/
|
||||
if (__BSS_START != __BSS_END)
|
||||
{
|
||||
sp = (uint8 *)__BSS_START;
|
||||
n = (uint32)(__BSS_END - __BSS_START);
|
||||
while (n--)
|
||||
*sp++ = 0;
|
||||
}
|
||||
mcf5225x_wtm_init();
|
||||
|
||||
mcf5225x_pll_init();
|
||||
mcf5225x_scm_init();
|
||||
mcf5225x_uart_init();
|
||||
}
|
||||
/********************************************************************/
|
||||
void
|
||||
mcf5225x_wtm_init(void)
|
||||
{
|
||||
/*
|
||||
* Disable Software Watchdog Timer
|
||||
*/
|
||||
MCF_SCM_CWCR = 0;
|
||||
}
|
||||
/********************************************************************/
|
||||
void
|
||||
mcf5225x_pll_init(void)
|
||||
{
|
||||
/*Required if booting with internal relaxation oscillator & pll off, clkmod[1:0]=00 & xtal=1 */
|
||||
#ifndef OMIT_OCLR_CONFIGURATION
|
||||
MCF_CLOCK_OCLR = 0xC0; //turn on crystal
|
||||
MCF_CLOCK_CCLR = 0x00; //switch to crystal
|
||||
MCF_CLOCK_OCHR = 0x00; //turn off relaxation osc
|
||||
#endif
|
||||
|
||||
/* The PLL pre divider - 48MHz / 6 = 8MHz */
|
||||
MCF_CLOCK_CCHR =0x05;
|
||||
|
||||
|
||||
/* The PLL pre-divider affects this!!!
|
||||
* Multiply 48Mhz reference crystal /CCHR by 10 to acheive system clock of 80Mhz
|
||||
*/
|
||||
|
||||
MCF_CLOCK_SYNCR &= ~(MCF_CLOCK_SYNCR_PLLEN);
|
||||
|
||||
MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_CLKSRC | MCF_CLOCK_SYNCR_PLLMODE;
|
||||
|
||||
//80
|
||||
MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_MFD(3) | MCF_CLOCK_SYNCR_RFD(0);
|
||||
//64
|
||||
//MCF_CLOCK_SYNCR = MCF_CLOCK_SYNCR_MFD(2) | MCF_CLOCK_SYNCR_RFD(0);
|
||||
//16
|
||||
//MCF_CLOCK_SYNCR = MCF_CLOCK_SYNCR_MFD(2) | MCF_CLOCK_SYNCR_RFD(2);
|
||||
//8
|
||||
//MCF_CLOCK_SYNCR = MCF_CLOCK_SYNCR_MFD(2) | MCF_CLOCK_SYNCR_RFD(3);
|
||||
//1
|
||||
//MCF_CLOCK_SYNCR = MCF_CLOCK_SYNCR_MFD(2) | MCF_CLOCK_SYNCR_RFD(6);
|
||||
|
||||
MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_PLLEN;
|
||||
|
||||
|
||||
while (!(MCF_CLOCK_SYNSR & MCF_CLOCK_SYNSR_LOCK))
|
||||
{
|
||||
}
|
||||
}
|
||||
/********************************************************************/
|
||||
void
|
||||
mcf5225x_scm_init(void)
|
||||
{
|
||||
/*
|
||||
* Enable on-chip modules to access internal SRAM
|
||||
*/
|
||||
MCF_SCM_RAMBAR = (0
|
||||
| MCF_SCM_RAMBAR_BA(SRAM_ADDRESS)
|
||||
| MCF_SCM_RAMBAR_BDE);
|
||||
}
|
||||
/********************************************************************/
|
||||
void
|
||||
mcf5225x_gpio_init(void)
|
||||
{
|
||||
/*
|
||||
* Initialize Port TA to enable Axcel control
|
||||
*/
|
||||
MCF_GPIO_PTAPAR = 0x00;
|
||||
MCF_GPIO_DDRTA = 0x0F;
|
||||
MCF_GPIO_PORTTA = 0x04;
|
||||
|
||||
}
|
||||
/********************************************************************/
|
||||
void
|
||||
mcf5225x_uart_init(void)
|
||||
{
|
||||
/*
|
||||
* Initialize all three UARTs for serial communications
|
||||
*/
|
||||
|
||||
register uint16 ubgs;
|
||||
|
||||
/*
|
||||
* Set Port UA to initialize URXD0/UTXD0
|
||||
*/
|
||||
MCF_GPIO_PUAPAR = 0
|
||||
| MCF_GPIO_PUAPAR_URXD0_URXD0
|
||||
| MCF_GPIO_PUAPAR_UTXD0_UTXD0;
|
||||
|
||||
MCF_GPIO_PUBPAR = 0
|
||||
| MCF_GPIO_PUBPAR_URXD1_URXD1
|
||||
| MCF_GPIO_PUBPAR_UTXD1_UTXD1;
|
||||
|
||||
MCF_GPIO_PUCPAR = 0
|
||||
| MCF_GPIO_PUCPAR_URXD2_URXD2
|
||||
| MCF_GPIO_PUCPAR_UTXD2_UTXD2;
|
||||
|
||||
/*
|
||||
* Reset Transmitter
|
||||
*/
|
||||
MCF_UART0_UCR = MCF_UART_UCR_RESET_TX;
|
||||
MCF_UART1_UCR = MCF_UART_UCR_RESET_TX;
|
||||
MCF_UART2_UCR = MCF_UART_UCR_RESET_TX;
|
||||
|
||||
/*
|
||||
* Reset Receiver
|
||||
*/
|
||||
MCF_UART0_UCR = MCF_UART_UCR_RESET_RX;
|
||||
MCF_UART1_UCR = MCF_UART_UCR_RESET_RX;
|
||||
MCF_UART2_UCR = MCF_UART_UCR_RESET_RX;
|
||||
|
||||
/*
|
||||
* Reset Mode Register
|
||||
*/
|
||||
MCF_UART0_UCR = MCF_UART_UCR_RESET_MR;
|
||||
MCF_UART1_UCR = MCF_UART_UCR_RESET_MR;
|
||||
MCF_UART2_UCR = MCF_UART_UCR_RESET_MR;
|
||||
|
||||
/*
|
||||
* No parity, 8-bits per character
|
||||
*/
|
||||
MCF_UART0_UMR1 = (0
|
||||
| MCF_UART_UMR_PM_NONE
|
||||
| MCF_UART_UMR_BC_8 );
|
||||
MCF_UART1_UMR1 = (0
|
||||
| MCF_UART_UMR_PM_NONE
|
||||
| MCF_UART_UMR_BC_8 );
|
||||
MCF_UART2_UMR1 = (0
|
||||
| MCF_UART_UMR_PM_NONE
|
||||
| MCF_UART_UMR_BC_8 );
|
||||
|
||||
/*
|
||||
* No echo or loopback, 1 stop bit
|
||||
*/
|
||||
MCF_UART0_UMR2 = (0
|
||||
| MCF_UART_UMR_CM_NORMAL
|
||||
| MCF_UART_UMR_SB_STOP_BITS_1);
|
||||
MCF_UART1_UMR2 = (0
|
||||
| MCF_UART_UMR_CM_NORMAL
|
||||
| MCF_UART_UMR_SB_STOP_BITS_1);
|
||||
MCF_UART2_UMR2 = (0
|
||||
| MCF_UART_UMR_CM_NORMAL
|
||||
| MCF_UART_UMR_SB_STOP_BITS_1);
|
||||
|
||||
/*
|
||||
* Set Rx and Tx baud by SYSTEM CLOCK
|
||||
*/
|
||||
MCF_UART0_UCSR = (0
|
||||
| MCF_UART_UCSR_RCS_SYS_CLK
|
||||
| MCF_UART_UCSR_TCS_SYS_CLK);
|
||||
MCF_UART1_UCSR = (0
|
||||
| MCF_UART_UCSR_RCS_SYS_CLK
|
||||
| MCF_UART_UCSR_TCS_SYS_CLK);
|
||||
MCF_UART2_UCSR = (0
|
||||
| MCF_UART_UCSR_RCS_SYS_CLK
|
||||
| MCF_UART_UCSR_TCS_SYS_CLK);
|
||||
|
||||
/*
|
||||
* Mask all UART interrupts
|
||||
*/
|
||||
MCF_UART0_UIMR = 0;
|
||||
MCF_UART1_UIMR = 0;
|
||||
MCF_UART2_UIMR = 0;
|
||||
|
||||
/*
|
||||
* Calculate baud settings
|
||||
*/
|
||||
ubgs = (uint16)((SYSTEM_CLOCK*1000000)/(UART_BAUD * 32));
|
||||
|
||||
MCF_UART0_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
|
||||
MCF_UART0_UBG2 = (uint8)(ubgs & 0x00FF);
|
||||
MCF_UART1_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
|
||||
MCF_UART1_UBG2 = (uint8)(ubgs & 0x00FF);
|
||||
MCF_UART2_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
|
||||
MCF_UART2_UBG2 = (uint8)(ubgs & 0x00FF);
|
||||
|
||||
/*
|
||||
* Enable receiver and transmitter
|
||||
*/
|
||||
MCF_UART0_UCR = (0
|
||||
| MCF_UART_UCR_TX_ENABLED
|
||||
| MCF_UART_UCR_RX_ENABLED);
|
||||
MCF_UART1_UCR = (0
|
||||
| MCF_UART_UCR_TX_ENABLED
|
||||
| MCF_UART_UCR_RX_ENABLED);
|
||||
MCF_UART2_UCR = (0
|
||||
| MCF_UART_UCR_TX_ENABLED
|
||||
| MCF_UART_UCR_RX_ENABLED);
|
||||
|
||||
}
|
||||
/********************************************************************/
|
242
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x_vectors.s
Normal file
242
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5225x_vectors.s
Normal file
|
@ -0,0 +1,242 @@
|
|||
/*
|
||||
* File: vectors.s
|
||||
* Purpose: MCF5225x vector table
|
||||
*
|
||||
* License: All software covered by license agreement in -
|
||||
* docs/Freescale_Software_License.pdf
|
||||
*/
|
||||
|
||||
#ifdef __GNUC__ /* { */
|
||||
#define sr %sr
|
||||
#define _asm_exception_handler irq_handler
|
||||
#define _timer_handler timer_handler
|
||||
#endif /* } __GNUC__ */
|
||||
|
||||
.global VECTOR_TABLE
|
||||
.global _VECTOR_TABLE
|
||||
.global start
|
||||
|
||||
.extern ___SP_INIT
|
||||
.extern _asm_startmeup
|
||||
.extern _asm_exception_handler
|
||||
.extern _vPIT0InterruptHandler
|
||||
.extern vPortYieldISR
|
||||
.extern _vFECISRHandler
|
||||
.text
|
||||
|
||||
/*
|
||||
* Exception Vector Table
|
||||
*/
|
||||
VECTOR_TABLE:
|
||||
_VECTOR_TABLE:
|
||||
INITSP: .long ___SP_INIT /* Initial SP */
|
||||
INITPC: .long _asm_startmeup /* Initial PC */
|
||||
vector02: .long _asm_exception_handler /* Access Error */
|
||||
vector03: .long _asm_exception_handler /* Address Error */
|
||||
vector04: .long _asm_exception_handler /* Illegal Instruction */
|
||||
vector05: .long _asm_exception_handler /* Reserved */
|
||||
vector06: .long _asm_exception_handler /* Reserved */
|
||||
vector07: .long _asm_exception_handler /* Reserved */
|
||||
vector08: .long _asm_exception_handler /* Privilege Violation */
|
||||
vector09: .long _asm_exception_handler /* Trace */
|
||||
vector0A: .long _asm_exception_handler /* Unimplemented A-Line */
|
||||
vector0B: .long _asm_exception_handler /* Unimplemented F-Line */
|
||||
vector0C: .long _asm_exception_handler /* Debug Interrupt */
|
||||
vector0D: .long _asm_exception_handler /* Reserved */
|
||||
vector0E: .long _asm_exception_handler /* Format Error */
|
||||
vector0F: .long _asm_exception_handler /* Unitialized Int. */
|
||||
vector10: .long _asm_exception_handler /* Reserved */
|
||||
vector11: .long _asm_exception_handler /* Reserved */
|
||||
vector12: .long _asm_exception_handler /* Reserved */
|
||||
vector13: .long _asm_exception_handler /* Reserved */
|
||||
vector14: .long _asm_exception_handler /* Reserved */
|
||||
vector15: .long _asm_exception_handler /* Reserved */
|
||||
vector16: .long _asm_exception_handler /* Reserved */
|
||||
vector17: .long _asm_exception_handler /* Reserved */
|
||||
vector18: .long _asm_exception_handler /* Spurious Interrupt */
|
||||
vector19: .long _asm_exception_handler /* Autovector Level 1 */
|
||||
vector1A: .long _asm_exception_handler /* Autovector Level 2 */
|
||||
vector1B: .long _asm_exception_handler /* Autovector Level 3 */
|
||||
vector1C: .long _asm_exception_handler /* Autovector Level 4 */
|
||||
vector1D: .long _asm_exception_handler /* Autovector Level 5 */
|
||||
vector1E: .long _asm_exception_handler /* Autovector Level 6 */
|
||||
vector1F: .long _asm_exception_handler /* Autovector Level 7 */
|
||||
vector20: .long _asm_exception_handler /* TRAP #0 */
|
||||
vector21: .long _asm_exception_handler /* TRAP #1 */
|
||||
vector22: .long _asm_exception_handler /* TRAP #2 */
|
||||
vector23: .long _asm_exception_handler /* TRAP #3 */
|
||||
vector24: .long _asm_exception_handler /* TRAP #4 */
|
||||
vector25: .long _asm_exception_handler /* TRAP #5 */
|
||||
vector26: .long _asm_exception_handler /* TRAP #6 */
|
||||
vector27: .long _asm_exception_handler /* TRAP #7 */
|
||||
vector28: .long _asm_exception_handler /* TRAP #8 */
|
||||
vector29: .long _asm_exception_handler /* TRAP #9 */
|
||||
vector2A: .long _asm_exception_handler /* TRAP #10 */
|
||||
vector2B: .long _asm_exception_handler /* TRAP #11 */
|
||||
vector2C: .long _asm_exception_handler /* TRAP #12 */
|
||||
vector2D: .long _asm_exception_handler /* TRAP #13 */
|
||||
vector2E: .long _asm_exception_handler /* TRAP #14 */
|
||||
vector2F: .long _asm_exception_handler /* TRAP #15 */
|
||||
vector30: .long _asm_exception_handler /* Reserved */
|
||||
vector31: .long _asm_exception_handler /* Reserved */
|
||||
vector32: .long _asm_exception_handler /* Reserved */
|
||||
vector33: .long _asm_exception_handler /* Reserved */
|
||||
vector34: .long _asm_exception_handler /* Reserved */
|
||||
vector35: .long _asm_exception_handler /* Reserved */
|
||||
vector36: .long _asm_exception_handler /* Reserved */
|
||||
vector37: .long _asm_exception_handler /* Reserved */
|
||||
vector38: .long _asm_exception_handler /* Reserved */
|
||||
vector39: .long _asm_exception_handler /* Reserved */
|
||||
vector3A: .long _asm_exception_handler /* Reserved */
|
||||
vector3B: .long _asm_exception_handler /* Reserved */
|
||||
vector3C: .long _asm_exception_handler /* Reserved */
|
||||
vector3D: .long _asm_exception_handler /* Reserved */
|
||||
vector3E: .long _asm_exception_handler /* Reserved */
|
||||
vector3F: .long _asm_exception_handler /* Reserved */
|
||||
vector40: .long _asm_exception_handler
|
||||
vector41: .long _asm_exception_handler
|
||||
vector42: .long _asm_exception_handler
|
||||
vector43: .long _asm_exception_handler
|
||||
vector44: .long _asm_exception_handler
|
||||
vector45: .long _asm_exception_handler
|
||||
vector46: .long _asm_exception_handler
|
||||
vector47: .long _asm_exception_handler
|
||||
vector48: .long _asm_exception_handler
|
||||
vector49: .long _asm_exception_handler
|
||||
vector4A: .long _asm_exception_handler
|
||||
vector4B: .long _asm_exception_handler
|
||||
vector4C: .long _asm_exception_handler
|
||||
vector4D: .long _asm_exception_handler
|
||||
vector4E: .long _asm_exception_handler
|
||||
vector4F: .long _asm_exception_handler
|
||||
vector50: .long vPortYieldISR
|
||||
vector51: .long _asm_exception_handler
|
||||
vector52: .long _asm_exception_handler
|
||||
vector53: .long _asm_exception_handler
|
||||
vector54: .long _asm_exception_handler
|
||||
vector55: .long _asm_exception_handler
|
||||
vector56: .long _asm_exception_handler
|
||||
vector57: .long _asm_exception_handler
|
||||
vector58: .long _asm_exception_handler
|
||||
vector59: .long _vFECISRHandler
|
||||
vector5A: .long _vFECISRHandler
|
||||
vector5B: .long _vFECISRHandler
|
||||
vector5C: .long _vFECISRHandler
|
||||
vector5D: .long _vFECISRHandler
|
||||
vector5E: .long _vFECISRHandler
|
||||
vector5F: .long _vFECISRHandler
|
||||
vector60: .long _asm_exception_handler
|
||||
vector61: .long _vFECISRHandler
|
||||
vector62: .long _vFECISRHandler
|
||||
vector63: .long _vFECISRHandler
|
||||
vector64: .long _asm_exception_handler
|
||||
vector65: .long _asm_exception_handler
|
||||
vector66: .long _asm_exception_handler
|
||||
vector67: .long _asm_exception_handler
|
||||
vector68: .long _asm_exception_handler
|
||||
vector69: .long _asm_exception_handler
|
||||
vector6A: .long _asm_exception_handler
|
||||
vector6B: .long _asm_exception_handler
|
||||
vector6C: .long _asm_exception_handler
|
||||
vector6D: .long _asm_exception_handler
|
||||
vector6E: .long _asm_exception_handler
|
||||
vector6F: .long _asm_exception_handler
|
||||
vector70: .long _asm_exception_handler
|
||||
vector71: .long _asm_exception_handler
|
||||
vector72: .long _asm_exception_handler
|
||||
vector73: .long _asm_exception_handler
|
||||
vector74: .long _asm_exception_handler
|
||||
vector75: .long _asm_exception_handler
|
||||
vector76: .long _asm_exception_handler
|
||||
vector77: .long _vPIT0InterruptHandler
|
||||
vector78: .long _asm_exception_handler
|
||||
vector79: .long _asm_exception_handler
|
||||
vector7A: .long _asm_exception_handler
|
||||
vector7B: .long _asm_exception_handler
|
||||
vector7C: .long _asm_exception_handler
|
||||
vector7D: .long _asm_exception_handler
|
||||
vector7E: .long _asm_exception_handler
|
||||
vector7F: .long _asm_exception_handler
|
||||
vector80: .long _asm_exception_handler
|
||||
vector81: .long _asm_exception_handler
|
||||
vector82: .long _asm_exception_handler
|
||||
vector83: .long _asm_exception_handler
|
||||
vector84: .long _asm_exception_handler
|
||||
vector85: .long _asm_exception_handler
|
||||
vector86: .long _asm_exception_handler
|
||||
vector87: .long _asm_exception_handler
|
||||
vector88: .long _asm_exception_handler
|
||||
vector89: .long _asm_exception_handler
|
||||
vector8A: .long _asm_exception_handler
|
||||
vector8B: .long _asm_exception_handler
|
||||
vector8C: .long _asm_exception_handler
|
||||
vector8D: .long _asm_exception_handler
|
||||
vector8E: .long _asm_exception_handler
|
||||
vector8F: .long _asm_exception_handler
|
||||
vector90: .long _asm_exception_handler
|
||||
vector91: .long _asm_exception_handler
|
||||
vector92: .long _asm_exception_handler
|
||||
vector93: .long _asm_exception_handler
|
||||
vector94: .long _asm_exception_handler
|
||||
vector95: .long _asm_exception_handler
|
||||
vector96: .long _asm_exception_handler
|
||||
vector97: .long _asm_exception_handler
|
||||
vector98: .long _asm_exception_handler
|
||||
vector99: .long _asm_exception_handler
|
||||
vector9A: .long _asm_exception_handler
|
||||
vector9B: .long _asm_exception_handler
|
||||
vector9C: .long _asm_exception_handler
|
||||
vector9D: .long _asm_exception_handler
|
||||
vector9E: .long _asm_exception_handler
|
||||
vector9F: .long _asm_exception_handler
|
||||
vectorA0: .long _asm_exception_handler
|
||||
vectorA1: .long _asm_exception_handler
|
||||
vectorA2: .long _asm_exception_handler
|
||||
vectorA3: .long _asm_exception_handler
|
||||
vectorA4: .long _asm_exception_handler
|
||||
vectorA5: .long _asm_exception_handler
|
||||
vectorA6: .long _asm_exception_handler
|
||||
vectorA7: .long _asm_exception_handler
|
||||
vectorA8: .long _asm_exception_handler
|
||||
vectorA9: .long _asm_exception_handler
|
||||
vectorAA: .long _asm_exception_handler
|
||||
vectorAB: .long _asm_exception_handler
|
||||
vectorAC: .long _asm_exception_handler
|
||||
vectorAD: .long _asm_exception_handler
|
||||
vectorAE: .long _asm_exception_handler
|
||||
vectorAF: .long _asm_exception_handler
|
||||
vectorB0: .long _asm_exception_handler
|
||||
vectorB1: .long _asm_exception_handler
|
||||
vectorB2: .long _asm_exception_handler
|
||||
vectorB3: .long _asm_exception_handler
|
||||
vectorB4: .long _asm_exception_handler
|
||||
vectorB5: .long _asm_exception_handler
|
||||
vectorB6: .long _asm_exception_handler
|
||||
vectorB7: .long _asm_exception_handler
|
||||
vectorB8: .long _asm_exception_handler
|
||||
vectorB9: .long _asm_exception_handler
|
||||
vectorBA: .long _asm_exception_handler
|
||||
vectorBB: .long _asm_exception_handler
|
||||
vectorBC: .long _asm_exception_handler
|
||||
vectorBD: .long _asm_exception_handler
|
||||
vectorBE: .long _asm_exception_handler
|
||||
vectorBF: .long _asm_exception_handler
|
||||
|
||||
.org 0x400
|
||||
|
||||
/*
|
||||
* CFM Flash Configuration Field
|
||||
*/
|
||||
KEY_UPPER: .long 0x00000000
|
||||
KEY_LOWER: .long 0x00000000
|
||||
CFMPROT: .long 0x00000000
|
||||
CFMSACC: .long 0x00000000
|
||||
CFMDACC: .long 0x00000000
|
||||
CFMSEC: .long 0x00000000
|
||||
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
|
||||
|
||||
.end
|
516
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5xxx.c
Normal file
516
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5xxx.c
Normal file
|
@ -0,0 +1,516 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
/********************************************************************/
|
283
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5xxx.h
Normal file
283
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5xxx.h
Normal file
|
@ -0,0 +1,283 @@
|
|||
/*
|
||||
* File: mcf5xxx.h
|
||||
* Purpose: Definitions common to all ColdFire processors
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* License: All software covered by license agreement in -
|
||||
* docs/Freescale_Software_License.pdf
|
||||
*/
|
||||
|
||||
#ifndef _CPU_MCF5XXX_H
|
||||
#define _CPU_MCF5XXX_H
|
||||
|
||||
/***********************************************************************/
|
||||
/*
|
||||
* Misc. Defines
|
||||
*/
|
||||
#ifdef FALSE
|
||||
#undef FALSE
|
||||
#endif
|
||||
#define FALSE (0)
|
||||
|
||||
#ifdef TRUE
|
||||
#undef TRUE
|
||||
#endif
|
||||
#define TRUE (1)
|
||||
|
||||
#ifdef NULL
|
||||
#undef NULL
|
||||
#endif
|
||||
#define NULL (0)
|
||||
|
||||
#ifdef ON
|
||||
#undef ON
|
||||
#endif
|
||||
#define ON (1)
|
||||
|
||||
#ifdef OFF
|
||||
#undef OFF
|
||||
#endif
|
||||
#define OFF (0)
|
||||
|
||||
/***********************************************************************/
|
||||
/*
|
||||
* The basic data types
|
||||
*/
|
||||
typedef unsigned char uint8; /* 8 bits */
|
||||
typedef unsigned short int uint16; /* 16 bits */
|
||||
typedef unsigned long int uint32; /* 32 bits */
|
||||
|
||||
typedef char int8; /* 8 bits */
|
||||
typedef short int int16; /* 16 bits */
|
||||
typedef int int32; /* 32 bits */
|
||||
|
||||
typedef volatile int8 vint8; /* 8 bits */
|
||||
typedef volatile int16 vint16; /* 16 bits */
|
||||
typedef volatile int32 vint32; /* 32 bits */
|
||||
|
||||
typedef volatile uint8 vuint8; /* 8 bits */
|
||||
typedef volatile uint16 vuint16; /* 16 bits */
|
||||
typedef volatile uint32 vuint32; /* 32 bits */
|
||||
|
||||
/***********************************************************************/
|
||||
/*
|
||||
* Common M68K & ColdFire definitions
|
||||
*/
|
||||
#define ADDRESS uint32
|
||||
#define INSTRUCTION uint16
|
||||
#define ILLEGAL 0x4AFC
|
||||
#define CPU_WORD_SIZE 16
|
||||
|
||||
/* Status Register */
|
||||
#define MCF5XXX_SR_T (0x8000)
|
||||
#define MCF5XXX_SR_S (0x2000)
|
||||
#define MCF5XXX_SR_M (0x1000)
|
||||
#define MCF5XXX_SR_IPL (0x0700)
|
||||
#define MCF5XXX_SR_IPL_0 (0x0000)
|
||||
#define MCF5XXX_SR_IPL_1 (0x0100)
|
||||
#define MCF5XXX_SR_IPL_2 (0x0200)
|
||||
#define MCF5XXX_SR_IPL_3 (0x0300)
|
||||
#define MCF5XXX_SR_IPL_4 (0x0400)
|
||||
#define MCF5XXX_SR_IPL_5 (0x0500)
|
||||
#define MCF5XXX_SR_IPL_6 (0x0600)
|
||||
#define MCF5XXX_SR_IPL_7 (0x0700)
|
||||
#define MCF5XXX_SR_X (0x0010)
|
||||
#define MCF5XXX_SR_N (0x0008)
|
||||
#define MCF5XXX_SR_Z (0x0004)
|
||||
#define MCF5XXX_SR_V (0x0002)
|
||||
#define MCF5XXX_SR_C (0x0001)
|
||||
|
||||
/* Cache Control Register */
|
||||
#define MCF5XXX_CACR_CENB (0x80000000)
|
||||
#define MCF5XXX_CACR_DEC (0x80000000)
|
||||
#define MCF5XXX_CACR_DW (0x40000000)
|
||||
#define MCF5XXX_CACR_DESB (0x20000000)
|
||||
#define MCF5XXX_CACR_CPDI (0x10000000)
|
||||
#define MCF5XXX_CACR_DDPI (0x10000000)
|
||||
#define MCF5XXX_CACR_CPD (0x10000000)
|
||||
#define MCF5XXX_CACR_CFRZ (0x08000000)
|
||||
#define MCF5XXX_CACR_DHLCK (0x08000000)
|
||||
#define MCF5XXX_CACR_DDCM_WT (0x00000000)
|
||||
#define MCF5XXX_CACR_DDCM_CB (0x02000000)
|
||||
#define MCF5XXX_CACR_DDCM_IP (0x04000000)
|
||||
#define MCF5XXX_CACR_DDCM_II (0x06000000)
|
||||
#define MCF5XXX_CACR_CINV (0x01000000)
|
||||
#define MCF5XXX_CACR_DCINVA (0x01000000)
|
||||
#define MCF5XXX_CACR_DIDI (0x00800000)
|
||||
#define MCF5XXX_CACR_DDSP (0x00800000)
|
||||
#define MCF5XXX_CACR_DISD (0x00400000)
|
||||
#define MCF5XXX_CACR_INVI (0x00200000)
|
||||
#define MCF5XXX_CACR_INVD (0x00100000)
|
||||
#define MCF5XXX_CACR_BEC (0x00080000)
|
||||
#define MCF5XXX_CACR_BCINVA (0x00040000)
|
||||
#define MCF5XXX_CACR_IEC (0x00008000)
|
||||
#define MCF5XXX_CACR_DNFB (0x00002000)
|
||||
#define MCF5XXX_CACR_IDPI (0x00001000)
|
||||
#define MCF5XXX_CACR_IHLCK (0x00000800)
|
||||
#define MCF5XXX_CACR_CEIB (0x00000400)
|
||||
#define MCF5XXX_CACR_IDCM (0x00000400)
|
||||
#define MCF5XXX_CACR_DCM_WR (0x00000000)
|
||||
#define MCF5XXX_CACR_DCM_CB (0x00000100)
|
||||
#define MCF5XXX_CACR_DCM_IP (0x00000200)
|
||||
#define MCF5XXX_CACR_DCM (0x00000200)
|
||||
#define MCF5XXX_CACR_DCM_II (0x00000300)
|
||||
#define MCF5XXX_CACR_DBWE (0x00000100)
|
||||
#define MCF5XXX_CACR_ICINVA (0x00000100)
|
||||
#define MCF5XXX_CACR_IDSP (0x00000080)
|
||||
#define MCF5XXX_CACR_DWP (0x00000020)
|
||||
#define MCF5XXX_CACR_EUSP (0x00000020)
|
||||
#define MCF5XXX_CACR_EUST (0x00000020)
|
||||
#define MCF5XXX_CACR_DF (0x00000010)
|
||||
#define MCF5XXX_CACR_CLNF_00 (0x00000000)
|
||||
#define MCF5XXX_CACR_CLNF_01 (0x00000002)
|
||||
#define MCF5XXX_CACR_CLNF_10 (0x00000004)
|
||||
#define MCF5XXX_CACR_CLNF_11 (0x00000006)
|
||||
|
||||
/* Access Control Register */
|
||||
#define MCF5XXX_ACR_AB(a) ((a)&0xFF000000)
|
||||
#define MCF5XXX_ACR_AM(a) (((a)&0xFF000000) >> 8)
|
||||
#define MCF5XXX_ACR_AM_4G (0x00FF0000)
|
||||
#define MCF5XXX_ACR_AM_2G (0x007F0000)
|
||||
#define MCF5XXX_ACR_AM_1G (0x003F0000)
|
||||
#define MCF5XXX_ACR_AM_1024M (0x003F0000)
|
||||
#define MCF5XXX_ACR_AM_512M (0x001F0000)
|
||||
#define MCF5XXX_ACR_AM_256M (0x000F0000)
|
||||
#define MCF5XXX_ACR_AM_128M (0x00070000)
|
||||
#define MCF5XXX_ACR_AM_64M (0x00030000)
|
||||
#define MCF5XXX_ACR_AM_32M (0x00010000)
|
||||
#define MCF5XXX_ACR_AM_16M (0x00000000)
|
||||
#define MCF5XXX_ACR_EN (0x00008000)
|
||||
#define MCF5XXX_ACR_SM_USER (0x00000000)
|
||||
#define MCF5XXX_ACR_SM_SUPER (0x00002000)
|
||||
#define MCF5XXX_ACR_SM_IGNORE (0x00006000)
|
||||
#define MCF5XXX_ACR_ENIB (0x00000080)
|
||||
#define MCF5XXX_ACR_CM (0x00000040)
|
||||
#define MCF5XXX_ACR_DCM_WR (0x00000000)
|
||||
#define MCF5XXX_ACR_DCM_CB (0x00000020)
|
||||
#define MCF5XXX_ACR_DCM_IP (0x00000040)
|
||||
#define MCF5XXX_ACR_DCM_II (0x00000060)
|
||||
#define MCF5XXX_ACR_CM (0x00000040)
|
||||
#define MCF5XXX_ACR_BWE (0x00000020)
|
||||
#define MCF5XXX_ACR_WP (0x00000004)
|
||||
|
||||
/* RAM Base Address Register */
|
||||
#define MCF5XXX_RAMBAR_BA(a) ((a)&0xFFFFC000)
|
||||
#define MCF5XXX_RAMBAR_PRI_00 (0x00000000)
|
||||
#define MCF5XXX_RAMBAR_PRI_01 (0x00004000)
|
||||
#define MCF5XXX_RAMBAR_PRI_10 (0x00008000)
|
||||
#define MCF5XXX_RAMBAR_PRI_11 (0x0000C000)
|
||||
#define MCF5XXX_RAMBAR_WP (0x00000100)
|
||||
#define MCF5XXX_RAMBAR_CI (0x00000020)
|
||||
#define MCF5XXX_RAMBAR_SC (0x00000010)
|
||||
#define MCF5XXX_RAMBAR_SD (0x00000008)
|
||||
#define MCF5XXX_RAMBAR_UC (0x00000004)
|
||||
#define MCF5XXX_RAMBAR_UD (0x00000002)
|
||||
#define MCF5XXX_RAMBAR_V (0x00000001)
|
||||
|
||||
/* Read macros for D0/D1 reset values */
|
||||
#define MCF5XXX_D0_PF(x) (((x)&0xFF000000)>>24)
|
||||
#define MCF5XXX_D0_VER(x) (((x)&0x00F00000)>>20)
|
||||
#define MCF5XXX_D0_REV(x) (((x)&0x000F0000)>>16)
|
||||
#define MCF5XXX_D0_MAC(x) ((x)&0x00008000)
|
||||
#define MCF5XXX_D0_DIV(x) ((x)&0x00004000)
|
||||
#define MCF5XXX_D0_EMAC(x) ((x)&0x00002000)
|
||||
#define MCF5XXX_D0_FPU(x) ((x)&0x00001000)
|
||||
#define MCF5XXX_D0_MMU(x) ((x)&0x00000800)
|
||||
#define MCF5XXX_D0_ISA(x) (((x)&0x000000F0)>>4)
|
||||
#define MCF5XXX_D0_DEBUG(x) (((x)&0x0000000F)>>0)
|
||||
#define MCF5XXX_D1_CL(x) (((x)&0xC0000000)>>30)
|
||||
#define MCF5XXX_D1_ICA(x) (((x)&0x30000000)>>28)
|
||||
#define MCF5XXX_D1_ICSIZ(x) (((x)&0x0F000000)>>24)
|
||||
#define MCF5XXX_D1_RAM0SIZ(x) (((x)&0x00F00000)>>20)
|
||||
#define MCF5XXX_D1_ROM0SIZ(x) (((x)&0x000F0000)>>16)
|
||||
#define MCF5XXX_D1_BUSW(x) (((x)&0x0000C000)>>14)
|
||||
#define MCF5XXX_D1_DCA(x) (((x)&0x00003000)>>12)
|
||||
#define MCF5XXX_D1_DCSIZ(x) (((x)&0x00000F00)>>8)
|
||||
#define MCF5XXX_D1_RAM1SIZ(x) (((x)&0x000000F0)>>4)
|
||||
#define MCF5XXX_D1_ROM1SIZ(x) (((x)&0x0000000F)>>0)
|
||||
|
||||
/***********************************************************************/
|
||||
/*
|
||||
* The ColdFire family of processors has a simplified exception stack
|
||||
* frame that looks like the following:
|
||||
*
|
||||
* 3322222222221111 111111
|
||||
* 1098765432109876 5432109876543210
|
||||
* 8 +----------------+----------------+
|
||||
* | Program Counter |
|
||||
* 4 +----------------+----------------+
|
||||
* |FS/Fmt/Vector/FS| SR |
|
||||
* SP --> 0 +----------------+----------------+
|
||||
*
|
||||
* The stack self-aligns to a 4-byte boundary at an exception, with
|
||||
* the FS/Fmt/Vector/FS field indicating the size of the adjustment
|
||||
* (SP += 0,1,2,3 bytes).
|
||||
*/
|
||||
#define MCF5XXX_RD_SF_FORMAT(PTR) \
|
||||
((*((uint16 *)(PTR)) >> 12) & 0x00FF)
|
||||
|
||||
#define MCF5XXX_RD_SF_VECTOR(PTR) \
|
||||
((*((uint16 *)(PTR)) >> 2) & 0x00FF)
|
||||
|
||||
#define MCF5XXX_RD_SF_FS(PTR) \
|
||||
( ((*((uint16 *)(PTR)) & 0x0C00) >> 8) | (*((uint16 *)(PTR)) & 0x0003) )
|
||||
|
||||
#define MCF5XXX_SF_SR(PTR) *((uint16 *)(PTR)+1)
|
||||
#define MCF5XXX_SF_PC(PTR) *((uint32 *)(PTR)+1)
|
||||
|
||||
/********************************************************************/
|
||||
/*
|
||||
* Functions provided in mcf5xxx.s
|
||||
*/
|
||||
int asm_set_ipl (uint32);
|
||||
void mcf5xxx_exe_wdebug (void *);
|
||||
void mcf5xxx_wr_sr (uint32);
|
||||
void mcf5xxx_wr_cacr (uint32);
|
||||
void mcf5xxx_wr_asid (uint32);
|
||||
void mcf5xxx_wr_acr0 (uint32);
|
||||
void mcf5xxx_wr_acr1 (uint32);
|
||||
void mcf5xxx_wr_acr2 (uint32);
|
||||
void mcf5xxx_wr_acr3 (uint32);
|
||||
void mcf5xxx_wr_mmubar (uint32);
|
||||
void mcf5xxx_wr_other_a7 (uint32);
|
||||
void mcf5xxx_wr_other_sp (uint32);
|
||||
void mcf5xxx_wr_vbr (uint32);
|
||||
void mcf5xxx_wr_macsr (uint32);
|
||||
void mcf5xxx_wr_mask (uint32);
|
||||
void mcf5xxx_wr_acc0 (uint32);
|
||||
void mcf5xxx_wr_accext01 (uint32);
|
||||
void mcf5xxx_wr_accext23 (uint32);
|
||||
void mcf5xxx_wr_acc1 (uint32);
|
||||
void mcf5xxx_wr_acc2 (uint32);
|
||||
void mcf5xxx_wr_acc3 (uint32);
|
||||
void mcf5xxx_wr_pc (uint32);
|
||||
void mcf5xxx_wr_rombar0 (uint32);
|
||||
void mcf5xxx_wr_rombar1 (uint32);
|
||||
void mcf5xxx_wr_rambar0 (uint32);
|
||||
void mcf5xxx_wr_rambar1 (uint32);
|
||||
void mcf5xxx_wr_mpcr (uint32);
|
||||
void mcf5xxx_wr_secmbar (uint32);
|
||||
void mcf5xxx_wr_mbar1 (uint32);
|
||||
void mcf5xxx_wr_mbar (uint32);
|
||||
void mcf5xxx_wr_mbar0 (uint32);
|
||||
void mcf5xxx_move_line (ADDRESS, ADDRESS);
|
||||
|
||||
/*
|
||||
* Functions provided in mcf5xxx.c
|
||||
*/
|
||||
void mcf5xxx_exception_handler (void *);
|
||||
void mcf5xxx_interpret_d0d1 (int, int);
|
||||
void mcf5xxx_irq_enable (void);
|
||||
void mcf5xxx_irq_disable (void);
|
||||
ADDRESS mcf5xxx_set_handler (int, ADDRESS);
|
||||
|
||||
/*
|
||||
* Functions provided by processor specific C file
|
||||
*/
|
||||
void cpu_handle_interrupt (int);
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
#endif /* _CPU_MCF5XXX_H */
|
||||
|
342
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5xxx_lo.s
Normal file
342
Demo/ColdFire_MCF52259_CodeWarrior/cpu/mcf5xxx_lo.s
Normal file
|
@ -0,0 +1,342 @@
|
|||
/*
|
||||
* File: mcf5xxx.s
|
||||
* Purpose: Lowest level routines for all ColdFire processors.
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* License: All software covered by license agreement in -
|
||||
* docs/Freescale_Software_License.pdf
|
||||
*/
|
||||
|
||||
#define mcf5xxx_exception_handler _mcf5xxx_exception_handler
|
||||
|
||||
.extern mcf5xxx_exception_handler
|
||||
|
||||
.global asm_exception_handler
|
||||
.global _asm_exception_handler
|
||||
.global asm_set_ipl
|
||||
.global _asm_set_ipl
|
||||
.global mcf5xxx_exe_wdebug
|
||||
.global _mcf5xxx_exe_wdebug
|
||||
.global mcf5xxx_move_line //added by Mac
|
||||
.global _mcf5xxx_move_line //added by Mac
|
||||
.global mcf5xxx_wr_cacr
|
||||
.global _mcf5xxx_wr_cacr
|
||||
.global mcf5xxx_wr_asid
|
||||
.global _mcf5xxx_wr_asid
|
||||
.global mcf5xxx_wr_acr0
|
||||
.global _mcf5xxx_wr_acr0
|
||||
.global mcf5xxx_wr_acr1
|
||||
.global _mcf5xxx_wr_acr1
|
||||
.global mcf5xxx_wr_acr2
|
||||
.global _mcf5xxx_wr_acr2
|
||||
.global mcf5xxx_wr_acr3
|
||||
.global _mcf5xxx_wr_acr3
|
||||
.global mcf5xxx_wr_mmubar
|
||||
.global _mcf5xxx_wr_mmubar
|
||||
.global mcf5xxx_wr_other_a7
|
||||
.global _mcf5xxx_wr_other_a7
|
||||
.global mcf5xxx_wr_vbr
|
||||
.global _mcf5xxx_wr_vbr
|
||||
.global mcf5xxx_wr_macsr
|
||||
.global _mcf5xxx_wr_macsr
|
||||
.global mcf5xxx_wr_mask
|
||||
.global _mcf5xxx_wr_mask
|
||||
.global mcf5xxx_wr_acc0
|
||||
.global _mcf5xxx_wr_acc0
|
||||
.global mcf5xxx_wr_accext01
|
||||
.global _mcf5xxx_wr_accext01
|
||||
.global mcf5xxx_wr_accext23
|
||||
.global _mcf5xxx_wr_accext23
|
||||
.global mcf5xxx_wr_acc1
|
||||
.global _mcf5xxx_wr_acc1
|
||||
.global mcf5xxx_wr_acc2
|
||||
.global _mcf5xxx_wr_acc2
|
||||
.global mcf5xxx_wr_acc3
|
||||
.global _mcf5xxx_wr_acc3
|
||||
.global mcf5xxx_wr_sr
|
||||
.global _mcf5xxx_wr_sr
|
||||
.global mcf5xxx_wr_pc
|
||||
.global _mcf5xxx_wr_pc
|
||||
.global mcf5xxx_wr_rombar0
|
||||
.global _mcf5xxx_wr_rombar0
|
||||
.global mcf5xxx_wr_rombar1
|
||||
.global _mcf5xxx_wr_rombar1
|
||||
.global mcf5xxx_wr_rambar0
|
||||
.global _mcf5xxx_wr_rambar0
|
||||
.global mcf5xxx_wr_rambar1
|
||||
.global _mcf5xxx_wr_rambar1
|
||||
.global mcf5xxx_wr_mpcr
|
||||
.global _mcf5xxx_wr_mpcr
|
||||
.global mcf5xxx_wr_secmbar
|
||||
.global _mcf5xxx_wr_secmbar
|
||||
.global mcf5xxx_wr_mbar
|
||||
.global _mcf5xxx_wr_mbar
|
||||
|
||||
.text
|
||||
|
||||
/********************************************************************
|
||||
* This routine is the lowest-level exception handler.
|
||||
*/
|
||||
|
||||
asm_exception_handler:
|
||||
_asm_exception_handler:
|
||||
lea -16(SP),SP
|
||||
movem.l D0-D1/A0-A1,(SP)
|
||||
lea 16(SP),A1
|
||||
move.l A1,-(SP)
|
||||
jsr mcf5xxx_exception_handler
|
||||
lea 4(SP),SP
|
||||
movem.l (SP),D0-D1/A0-A1
|
||||
lea 16(SP),SP
|
||||
rte
|
||||
|
||||
/********************************************************************/
|
||||
/*
|
||||
* This routines changes the IPL to the value passed into the routine.
|
||||
* It also returns the old IPL value back.
|
||||
* Calling convention from C:
|
||||
* old_ipl = asm_set_ipl(new_ipl);
|
||||
* For the Diab Data C compiler, it passes return value thru D0.
|
||||
* Note that only the least significant three bits of the passed
|
||||
* value are used.
|
||||
*/
|
||||
|
||||
asm_set_ipl:
|
||||
_asm_set_ipl:
|
||||
link A6,#-8
|
||||
movem.l D6-D7,(SP)
|
||||
|
||||
move.w SR,D7 /* current sr */
|
||||
|
||||
move.l D7,D0 /* prepare return value */
|
||||
andi.l #0x0700,D0 /* mask out IPL */
|
||||
lsr.l #8,D0 /* IPL */
|
||||
|
||||
move.l 8(A6),D6 /* get argument */
|
||||
andi.l #0x07,D6 /* least significant three bits */
|
||||
lsl.l #8,D6 /* move over to make mask */
|
||||
|
||||
andi.l #0x0000F8FF,D7 /* zero out current IPL */
|
||||
or.l D6,D7 /* place new IPL in sr */
|
||||
move.w D7,SR
|
||||
|
||||
movem.l (SP),D6-D7
|
||||
lea 8(SP),SP
|
||||
unlk A6
|
||||
rts
|
||||
|
||||
/********************************************************************/
|
||||
/*
|
||||
* These routines execute special ColdFire instructions
|
||||
*/
|
||||
|
||||
mcf5xxx_exe_wdebug:
|
||||
_mcf5xxx_exe_wdebug:
|
||||
move.l 4(sp),a0
|
||||
wdebug.l (a0)
|
||||
rts
|
||||
|
||||
mcf5xxx_move_line:
|
||||
_mcf5xxx_move_line:
|
||||
lea.l -24(sp),sp
|
||||
movem.l d0-d3/a0-a1,(sp)
|
||||
movea.l 28(sp),a0 /* source in a0 */
|
||||
movea.l 32(sp),a1 /* destination in a1 */
|
||||
movem.l (a0),d0-d3 /* move line from source */
|
||||
movem.l d0-d3,(a1) /* move line to destination */
|
||||
movem.l (sp),d0-d3/a0-a1
|
||||
lea.l 24(sp),sp
|
||||
rts
|
||||
|
||||
|
||||
/********************************************************************/
|
||||
/*
|
||||
* These routines write to the special purpose registers in the ColdFire
|
||||
* core. Since these registers are write-only in the supervisor model,
|
||||
* no corresponding read routines exist.
|
||||
*/
|
||||
|
||||
mcf5xxx_wr_sr:
|
||||
_mcf5xxx_wr_sr:
|
||||
move.l 4(SP),D0
|
||||
move.w D0,SR
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_cacr:
|
||||
_mcf5xxx_wr_cacr:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0002 /* movec d0,cacr */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_asid:
|
||||
_mcf5xxx_wr_asid:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0003 /* movec d0,asid */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acr0:
|
||||
_mcf5xxx_wr_acr0:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0004 /* movec d0,ACR0 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acr1:
|
||||
_mcf5xxx_wr_acr1:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0005 /* movec d0,ACR1 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acr2:
|
||||
_mcf5xxx_wr_acr2:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0006 /* movec d0,ACR2 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acr3:
|
||||
_mcf5xxx_wr_acr3:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0007 /* movec d0,ACR3 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_mmubar:
|
||||
_mcf5xxx_wr_mmubar:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0008 /* movec d0,MBAR */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_other_a7:
|
||||
_mcf5xxx_wr_other_a7:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0800 /* movec d0,OTHER_A7 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_vbr:
|
||||
_mcf5xxx_wr_vbr:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0801 /* movec d0,VBR */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_macsr:
|
||||
_mcf5xxx_wr_macsr:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0804 /* movec d0,MACSR */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_mask:
|
||||
_mcf5xxx_wr_mask:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0805 /* movec d0,MASK */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acc0:
|
||||
_mcf5xxx_wr_acc0:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0806 /* movec d0,ACC0 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_accext01:
|
||||
_mcf5xxx_wr_accext01:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0807 /* movec d0,ACCEXT01 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_accext23:
|
||||
_mcf5xxx_wr_accext23:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0808 /* movec d0,ACCEXT23 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acc1:
|
||||
_mcf5xxx_wr_acc1:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0809 /* movec d0,ACC1 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acc2:
|
||||
_mcf5xxx_wr_acc2:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b080A /* movec d0,ACC2 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_acc3:
|
||||
_mcf5xxx_wr_acc3:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b080B /* movec d0,ACC3 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_pc:
|
||||
_mcf5xxx_wr_pc:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b080F /* movec d0,PC */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_rombar0:
|
||||
_mcf5xxx_wr_rombar0:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0C00 /* movec d0,ROMBAR0 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_rombar1:
|
||||
_mcf5xxx_wr_rombar1:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0C01 /* movec d0,ROMBAR1 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_rambar0:
|
||||
_mcf5xxx_wr_rambar0:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0C04 /* movec d0,RAMBAR0 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_rambar1:
|
||||
_mcf5xxx_wr_rambar1:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0C05 /* movec d0,RAMBAR1 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_mpcr:
|
||||
_mcf5xxx_wr_mpcr:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0C0C /* movec d0,MPCR */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_secmbar:
|
||||
_mcf5xxx_wr_secmbar:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0C0E /* movec d0,MBAR1 */
|
||||
nop
|
||||
rts
|
||||
|
||||
mcf5xxx_wr_mbar:
|
||||
_mcf5xxx_wr_mbar:
|
||||
move.l 4(SP),D0
|
||||
.long 0x4e7b0C0F /* movec d0,MBAR0 */
|
||||
nop
|
||||
rts
|
||||
|
||||
/********************************************************************/
|
||||
.end
|
Loading…
Add table
Add a link
Reference in a new issue