simplified MMU initialization

removed (apparently unneeded) MMU TLBs
added source file templates for SPI dma routines
This commit is contained in:
Markus Fröschle
2013-07-28 07:19:57 +00:00
parent 074f0176fc
commit 884f9eedd4
13 changed files with 663 additions and 569 deletions

View File

@@ -7,4 +7,6 @@ define tbtr
target remote | m68k-bdm-gdbserver pipe /dev/tblcf3 target remote | m68k-bdm-gdbserver pipe /dev/tblcf3
end end
source mcf5474.gdb source mcf5474.gdb
set breakpoint auto-hw

View File

@@ -29,7 +29,7 @@ OBJCOPY=$(TCPREFIX)objcopy
AR=$(TCPREFIX)ar AR=$(TCPREFIX)ar
RANLIB=$(TCPREFIX)ranlib RANLIB=$(TCPREFIX)ranlib
INCLUDE=-Iinclude INCLUDE=-Iinclude -Imcdapi
CFLAGS=-mcpu=5474\ CFLAGS=-mcpu=5474\
-Wall\ -Wall\
-g\ -g\
@@ -72,6 +72,7 @@ CSRCS= \
$(SRCDIR)/wait.c \ $(SRCDIR)/wait.c \
$(SRCDIR)/s19reader.c \ $(SRCDIR)/s19reader.c \
$(SRCDIR)/flash.c \ $(SRCDIR)/flash.c \
$(SRCDIR)/spidma.c \
$(SRCDIR)/xhdi_sd.c \ $(SRCDIR)/xhdi_sd.c \
$(SRCDIR)/xhdi_interface.c $(SRCDIR)/xhdi_interface.c
@@ -113,7 +114,7 @@ $(FLASH_EXEC): TARGET_ADDRESS=0xe0000000
$(FLASH_EXEC): LDCFILE=bas.lk $(FLASH_EXEC): LDCFILE=bas.lk
$(FLASH_EXEC): MAPFILE=bas.map $(FLASH_EXEC): MAPFILE=bas.map
$(RAM_EXEC): TARGET_ADDRESS=0x00008000 $(RAM_EXEC): TARGET_ADDRESS=0x1d000000
$(RAM_EXEC): LDCFILE=ram.lk $(RAM_EXEC): LDCFILE=ram.lk
$(RAM_EXEC): MAPFILE=ram.map $(RAM_EXEC): MAPFILE=ram.map

View File

@@ -30,6 +30,10 @@ SECTIONS
objs/supervisor.o(.text) objs/supervisor.o(.text)
objs/illegal_instruction.o(.text) objs/illegal_instruction.o(.text)
objs/exceptions.o(.text) objs/exceptions.o(.text)
objs/spidma.o(.text)
mcdapi/MCD_dmaApi.o(.text)
mcdapi/MCD_tasks.o(.text)
mcdapi/MCD_tasksInit.o(.text)
objs/xhdi_sd.o(.text) objs/xhdi_sd.o(.text)
objs/xhdi_interface.o(text) objs/xhdi_interface.o(text)
objs/xhdi_vec.o(text) objs/xhdi_vec.o(text)

View File

@@ -17,6 +17,7 @@ extern size_t strlen(const char *str);
extern char *strcat(char *dst, const char *src); extern char *strcat(char *dst, const char *src);
extern char *strncat(char *dst, const char *src, int max); extern char *strncat(char *dst, const char *src, int max);
extern int atoi(const char *c); extern int atoi(const char *c);
extern void *memcpy(void *dst, const void *src, size_t n);
#define isdigit(c) (((c) >= '0') && ((c) <= '9')) #define isdigit(c) (((c) >= '0') && ((c) <= '9'))
#define isupper(c) ((c) >= 'A' && ((c) <= 'Z')) #define isupper(c) ((c) >= 'A' && ((c) <= 'Z'))

16
include/spidma.h Normal file
View File

@@ -0,0 +1,16 @@
/*
* spidma.h
*
* Created on: 27.07.2013
* Author: mfro
*/
#ifndef _SPIDMA_H_
#define _SPIDMA_H_
#include <MCF5475.h>
extern int spidma_init(void);
#endif /* _SPIDMA_H_ */

File diff suppressed because it is too large Load Diff

View File

@@ -29,6 +29,7 @@
#include "startcf.h" #include "startcf.h"
#include "cache.h" #include "cache.h"
#include "bas_printf.h" #include "bas_printf.h"
#include "bas_string.h"
#include "bas_types.h" #include "bas_types.h"
#include "sd_card.h" #include "sd_card.h"
#include "wait.h" #include "wait.h"
@@ -36,6 +37,7 @@
#include "diskio.h" #include "diskio.h"
#include "ff.h" #include "ff.h"
#include "s19reader.h" #include "s19reader.h"
#include "spidma.h"
/* imported routines */ /* imported routines */
extern int mmu_init(); extern int mmu_init();
@@ -151,10 +153,15 @@ void nvram_init(void)
xprintf("finished\r\n"); xprintf("finished\r\n");
} }
/* ACP interrupt controller */
#define FPGA_INTR_CONTRL 0xf0010000
#define FPGA_INTR_ENABLE 0xf0010004
#define FPGA_INTR_PENDIN 0xf0010008
void enable_coldfire_interrupts() void enable_coldfire_interrupts()
{ {
xprintf("enable interrupts: "); xprintf("enable interrupts: ");
* (volatile uint32_t *) 0xf0010004 = 0L; /* disable all interrupts */ * (volatile uint32_t *) FPGA_INTR_CONTRL = 0L; /* disable all interrupts */
MCF_EPORT_EPPAR = 0xaaa8; /* all interrupts on falling edge */ MCF_EPORT_EPPAR = 0xaaa8; /* all interrupts on falling edge */
MCF_GPT0_GMS = MCF_GPT_GMS_ICT(1) | /* timer 0 on, video change capture on rising edge */ MCF_GPT0_GMS = MCF_GPT_GMS_ICT(1) | /* timer 0 on, video change capture on rising edge */
@@ -189,11 +196,7 @@ void BaS(void)
/* copy EMUTOS */ /* copy EMUTOS */
src = (uint8_t *) EMUTOS; src = (uint8_t *) EMUTOS;
while (src < (uint8_t *)(EMUTOS + EMUTOS_SIZE)) memcpy(dst, src, EMUTOS_SIZE);
{
*dst++ = *src++;
}
xprintf("finished\r\n"); xprintf("finished\r\n");
/* we have copied a code area, so flush the caches */ /* we have copied a code area, so flush the caches */
@@ -308,6 +311,8 @@ void BaS(void)
xprintf("Call OS. BaS initialization finished...\r\n"); xprintf("Call OS. BaS initialization finished...\r\n");
enable_coldfire_interrupts(); enable_coldfire_interrupts();
spidma_init();
ROM_HEADER* os_header = (ROM_HEADER*)TOS; ROM_HEADER* os_header = (ROM_HEADER*)TOS;
os_header->initial_pc(); os_header->initial_pc();
} }

View File

@@ -7,6 +7,16 @@
#include "bas_string.h" #include "bas_string.h"
void *memcpy(void *dst, const void *src, size_t n)
{
char *to = dst;
while (to < (char *) dst + n)
*to++ = * (char *) src++;
return dst;
}
int strncmp(const char *s1, const char *s2, int max) int strncmp(const char *s1, const char *s2, int max)
{ {
int i; int i;

View File

@@ -100,9 +100,9 @@
#define std_mmutr (MCF_MMU_MMUTR_SG|MCF_MMU_MMUTR_V) #define std_mmutr (MCF_MMU_MMUTR_SG|MCF_MMU_MMUTR_V)
#define mmuord_d ( MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA) #define mmuord_d ( MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA)
#define mmuord_i (MCF_MMU_MMUOR_ITLB|MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA) #define mmuord_i (MCF_MMU_MMUOR_ITLB|MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA)
#define wt_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(00)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X) #define writethrough_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(00)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X)
#define cb_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(01)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X) #define copyback_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(01)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X)
#define nc_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(10)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X) #define nocache_precise_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(10)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X)
//--------------------------------------------------- //---------------------------------------------------
/********************************************************************* /*********************************************************************
* *
@@ -519,10 +519,10 @@ irq6: // mfp
add.l #std_mmutr,d0 add.l #std_mmutr,d0
move.l d3,d1 // page 0? move.l d3,d1 // page 0?
beq irq6_sca_pn0 // ja -> beq irq6_sca_pn0 // ja ->
add.l #cb_mmudr,d1 // sonst page cb add.l #copyback_mmudr,d1 // sonst page cb
bra irq6_sca_pn1c bra irq6_sca_pn1c
irq6_sca_pn0: irq6_sca_pn0:
add.l #wt_mmudr|MCF_MMU_MMUDR_LK,d1 // page wt and locked add.l #writethrough_mmudr|MCF_MMU_MMUDR_LK,d1 // page wt and locked
irq6_sca_pn1c: irq6_sca_pn1c:
mvz.w #0x10b,d2 // MMU update mvz.w #0x10b,d2 // MMU update
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
@@ -824,7 +824,7 @@ video_copy_data_loop:
move.l d4,MCF_MMU_MMUAR move.l d4,MCF_MMU_MMUAR
move.l d0,d1 move.l d0,d1
add.l #MCF_MMU_MMUTR_ID(sca_page_ID)|std_mmutr,d0 add.l #MCF_MMU_MMUTR_ID(sca_page_ID)|std_mmutr,d0
add.l #0x60000000|wt_mmudr|MCF_MMU_MMUDR_LK,d1 add.l #0x60000000|writethrough_mmudr|MCF_MMU_MMUDR_LK,d1
mvz.w #0x10b,d2 // MMU update mvz.w #0x10b,d2 // MMU update
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR

View File

@@ -93,7 +93,7 @@ static volatile DSTATUS Stat = 0 /* STA_NOINIT */; /* Physical drive status */
static uint8_t CardType; /* Card type flags */ static uint8_t CardType; /* Card type flags */
static uint32_t dspi_fifo_val = // MCF_DSPI_DTFR_CONT | /* enable continous chip select */ static uint32_t dspi_fifo_val = MCF_DSPI_DTFR_CONT | /* enable continous chip select */
/* CTAS use DCTAR0 for clock and attributes */ /* CTAS use DCTAR0 for clock and attributes */
MCF_DSPI_DTFR_CTCNT; MCF_DSPI_DTFR_CTCNT;

View File

@@ -71,9 +71,9 @@
#define std_mmutr (MCF_MMU_MMUTR_SG|MCF_MMU_MMUTR_V) #define std_mmutr (MCF_MMU_MMUTR_SG|MCF_MMU_MMUTR_V)
#define mmuord_d ( MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA) #define mmuord_d ( MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA)
#define mmuord_i (MCF_MMU_MMUOR_ITLB|MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA) #define mmuord_i (MCF_MMU_MMUOR_ITLB|MCF_MMU_MMUOR_ACC|MCF_MMU_MMUOR_UAA)
#define wt_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(00)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X) #define writethrough_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(00)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X)
#define cb_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(01)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X) #define copyback_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(01)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X)
#define nc_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(10)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X) #define nocache_precise_mmudr (MCF_MMU_MMUDR_SZ(00)|MCF_MMU_MMUDR_CM(10)|MCF_MMU_MMUDR_R|MCF_MMU_MMUDR_W|MCF_MMU_MMUDR_X)
.global _mmu_init .global _mmu_init
.global _mmutr_miss .global _mmutr_miss
@@ -112,66 +112,75 @@ _mmu_init:
move.l #MCF_MMU_MMUOR_CA,d0 // clear all entries, move.l #MCF_MMU_MMUOR_CA,d0 // clear all entries,
move.l d0,MCF_MMU_MMUOR move.l d0,MCF_MMU_MMUOR
nop nop
// 0000'0000 locked // 0000'0000 locked
moveq.l #0x00000000|std_mmutr,d0 moveq.l #0x00000000|std_mmutr,d0
moveq.l #0x00000000|cb_mmudr|MCF_MMU_MMUDR_LK,d1 moveq.l #0x00000000|copyback_mmudr|MCF_MMU_MMUDR_LK,d1
moveq.l #mmuord_d,d2 // MMU update date moveq.l #mmuord_d,d2 // MMU update data
moveq.l #mmuord_i,d3 // MMU update instruction moveq.l #mmuord_i,d3 // MMU update instruction
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // MMU update date move.l d2,MCF_MMU_MMUOR // MMU update data
move.l d3,MCF_MMU_MMUOR // MMU update instruction move.l d3,MCF_MMU_MMUOR // MMU update instruction
//--------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------
// 00d0'0000 locked ID=6 // 00d0'0000 locked ID=6
// video ram: read write execute normal write true // video ram: read write execute normal write true
move.l #0x00d00000|MCF_MMU_MMUTR_ID(sca_page_ID)|std_mmutr,d0 move.l #0x00d00000|MCF_MMU_MMUTR_ID(sca_page_ID)|std_mmutr,d0
move.l #0x60d00000|wt_mmudr|MCF_MMU_MMUDR_LK,d1 move.l #0x60d00000|writethrough_mmudr|MCF_MMU_MMUDR_LK,d1
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // MMU update date move.l d2,MCF_MMU_MMUOR // MMU update data
move.l #0x00d00000|std_mmutr,d0 move.l #0x00d00000|std_mmutr,d0
move.l d3,MCF_MMU_MMUOR // MMU update instruction move.l d3,MCF_MMU_MMUOR // MMU update instruction
move.l #0x2000,d0 move.l #0x2000,d0
move.l d0,_video_tlb // set page as video page move.l d0,_video_tlb // set page as video page
clr.l _video_sbt // clear time clr.l _video_sbt // clear time
#ifdef _NOT_USED_
//------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------
// Make the TOS (in SDRAM) read-only // Make the TOS (in SDRAM) read-only
move.l #__TOS+std_mmutr,d0 move.l #__TOS+std_mmutr,d0
move.l #__TOS+cb_mmudr+MCF_MMU_MMUDR_LK,d1 move.l #__TOS+copyback_mmudr+MCF_MMU_MMUDR_LK,d1
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // setzen read only ?????? noch nicht move.l d2,MCF_MMU_MMUOR // setzen read only ?????? noch nicht
move.l d3,MCF_MMU_MMUOR // setzen move.l d3,MCF_MMU_MMUOR // setzen
#endif /* _NOT_USED_ */
// 00f0'0000 locked // 00f0'0000 locked
move.l #0x00f00000|std_mmutr,d0 move.l #0x00f00000|std_mmutr,d0
move.l #0xfff00000|nc_mmudr|MCF_MMU_MMUDR_LK,d1 move.l #0xfff00000|nocache_precise_mmudr|MCF_MMU_MMUDR_LK,d1
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // maped to ffffxxx, precise, move.l d2,MCF_MMU_MMUOR // mapped to ffffxxx, precise,
move.l d3,MCF_MMU_MMUOR // maped to ffffxxx, precise, move.l d3,MCF_MMU_MMUOR // mapped to ffffxxx, precise,
// 1fe0'0000 locked // 1fe0'0000 locked
move.l #0x1FE00000|std_mmutr,d0 move.l #0x1FE00000|std_mmutr,d0
move.l #0x1FE00000|cb_mmudr|MCF_MMU_MMUDR_LK,d1 move.l #0x1FE00000|copyback_mmudr|MCF_MMU_MMUDR_LK,d1
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // setzen data move.l d2,MCF_MMU_MMUOR // setzen data
move.l d3,MCF_MMU_MMUOR // setzen instr move.l d3,MCF_MMU_MMUOR // setzen instr
// 1ff0'0000 locked
#ifdef _NOT_USED_
// 1ff0'0000 locked (FIXME: why is this?)
move.l #0x1FF00000|std_mmutr,d0 move.l #0x1FF00000|std_mmutr,d0
move.l #0x1FF00000|cb_mmudr|MCF_MMU_MMUDR_LK,d1 move.l #0x1FF00000|copyback_mmudr|MCF_MMU_MMUDR_LK,d1
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d2,MCF_MMU_MMUOR // setzen data move.l d2,MCF_MMU_MMUOR // setzen data
move.l d3,MCF_MMU_MMUOR // setzen instr move.l d3,MCF_MMU_MMUOR // setzen instr
// instr 0xFFF0'0000 nach 0x1FF0'0000 umleiten -->> short sprung // instr 0xFFF0'0000 nach 0x1FF0'0000 umleiten -->> short sprung
/* move.l #0xFFF00000|std_mmutr,d0 /* move.l #0xFFF00000|std_mmutr,d0
move.l #0x1FF00000|cb_mmudr|MCF_MMU_MMUDR_LK,d1 move.l #0x1FF00000|copyback_mmudr|MCF_MMU_MMUDR_LK,d1
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
move.l d1,MCF_MMU_MMUDR move.l d1,MCF_MMU_MMUDR
move.l d3,MCF_MMU_MMUOR // setzen instr move.l d3,MCF_MMU_MMUOR // setzen instr
*/ */
#endif /* _NOT_USED_ */
move.l (sp)+,d2 // Restore registers move.l (sp)+,d2 // Restore registers
move.l (sp)+,d3 move.l (sp)+,d3
rts rts
@@ -185,7 +194,7 @@ _mmutr_miss:
or.l #std_mmutr,d0 or.l #std_mmutr,d0
move.l d0,MCF_MMU_MMUTR move.l d0,MCF_MMU_MMUTR
and.l #0xFFF00000,d0 and.l #0xFFF00000,d0
or.l #cb_mmudr,d0 or.l #copyback_mmudr,d0
move.l d0,MCF_MMU_MMUDR move.l d0,MCF_MMU_MMUDR
moveq.l #mmuord_d,d0 // MMU update data moveq.l #mmuord_d,d0 // MMU update data
move.l d0,MCF_MMU_MMUOR // set move.l d0,MCF_MMU_MMUOR // set

26
sources/spidma.c Normal file
View File

@@ -0,0 +1,26 @@
/*
* spidma.c
*
* Created on: 27.07.2013
* Author: mfro
*/
#include "spidma.h"
#include <MCD_dma.h>
#include "bas_printf.h"
extern char *_SYS_SRAM;
int spidma_init(void)
{
int res;
res = MCD_initDma((dmaRegs *) &MCF_DMA_TASKBAR, &_SYS_SRAM, MCD_RELOC_TASKS | MCD_COMM_PREFETCH_EN);
if (res != MCD_OK)
{
xprintf("DMA API initialization failed (0x%x)\r\n", res);
return 0;
}
xprintf("DMA API initialized. Tasks are at %p\r\n", &_SYS_SRAM);
return 1;
}

View File

@@ -30,6 +30,7 @@
#include "cache.h" #include "cache.h"
#include "sysinit.h" #include "sysinit.h"
#include "bas_printf.h" #include "bas_printf.h"
#include "bas_string.h"
#include "bas_types.h" #include "bas_types.h"
#include "wait.h" #include "wait.h"
@@ -796,10 +797,10 @@ extern uint8_t _FIRETOS[];
#define FIRETOS ((uint32_t)_FIRETOS) /* where FireTOS is stored in flash */ #define FIRETOS ((uint32_t)_FIRETOS) /* where FireTOS is stored in flash */
extern uint8_t _BAS_LMA[]; extern uint8_t _BAS_LMA[];
#define BAS_LMA ((uint32_t)_BAS_LMA) /* where the BaS is stored in flash */ #define BAS_LMA (&_BAS_LMA[0]) /* where the BaS is stored in flash */
extern uint8_t _BAS_IN_RAM[]; extern uint8_t _BAS_IN_RAM[];
#define BAS_IN_RAM ((uint32_t)_BAS_IN_RAM) /* where the BaS is run in RAM */ #define BAS_IN_RAM (&_BAS_IN_RAM[0]) /* where the BaS is run in RAM */
extern uint8_t _BAS_SIZE[]; extern uint8_t _BAS_SIZE[];
#define BAS_SIZE ((uint32_t)_BAS_SIZE) /* size of the BaS, in bytes */ #define BAS_SIZE ((uint32_t)_BAS_SIZE) /* size of the BaS, in bytes */
@@ -808,11 +809,6 @@ extern uint8_t _FASTRAM_END[];
#define FASTRAM_END ((uint32_t)_FASTRAM_END) #define FASTRAM_END ((uint32_t)_FASTRAM_END)
void initialize_hardware(void) { void initialize_hardware(void) {
/* used in copy loop */
uint32_t *src; /* src address to read from flash */
uint32_t *end; /* end address to read from flash */
uint32_t *dst; /* destination address to copy to */
/* Test for FireTOS switch: DIP switch #5 up */ /* Test for FireTOS switch: DIP switch #5 up */
if (!(DIP_SWITCH & (1 << 6))) { if (!(DIP_SWITCH & (1 << 6))) {
/* Minimal hardware initialization */ /* Minimal hardware initialization */
@@ -923,22 +919,11 @@ void initialize_hardware(void) {
//video_1280_1024(); //video_1280_1024();
init_ac97(); init_ac97();
/* copy the BaS .data and .bss contained in flash to its final location */ xprintf("copying BaS data (%p - %p) to RAM (%p)\r\n", BAS_LMA, BAS_LMA + BAS_SIZE, BAS_IN_RAM);
src = (uint32_t *) BAS_LMA;
end = (uint32_t *) (BAS_LMA + BAS_SIZE);
dst = (uint32_t *) BAS_IN_RAM;
xprintf("copying BaS data (%p - %p) to RAM (%p)\r\n", src, end, dst);
/* The linker script will ensure that the Bas size /* The linker script will ensure that the Bas size
* is a multiple of the following. * is a multiple of the following.
*/ */
while (src < end) memcpy((void *) BAS_IN_RAM, BAS_LMA, BAS_SIZE);
{
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
}
xprintf("finished.\r\n"); xprintf("finished.\r\n");
/* we have copied a code area, so flush the caches */ /* we have copied a code area, so flush the caches */