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

📄 hal_platform_setup.h

📁 开放源码实时操作系统源码.
💻 H
📖 第 1 页 / 共 3 页
字号:
#ifndef CYGONCE_HAL_PLATFORM_SETUP_H
#define CYGONCE_HAL_PLATFORM_SETUP_H
//=============================================================================
//
//      hal_platform_setup.h
//
//      Platform specific support for HAL (assembly code)
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s):    Patrick Doyle <wpd@delcomsys.com>
// Contributors: Patrick Doyle <wpd@delcomsys.com>
// Date:         2002-12-02
// Purpose:      Innovator platform specific support routines
// Description: 
// Usage:        #include <cyg/hal/hal_platform_setup.h>
//     Only used by "vectors.S"         
//
//####DESCRIPTIONEND####
//
//=============================================================================

#include <pkgconf/system.h>             // System-wide configuration info
#include CYGBLD_HAL_VARIANT_H           // Variant specific configuration
#include CYGBLD_HAL_PLATFORM_H          // Platform specific configuration
#include CYGHWR_MEMORY_LAYOUT_H
#include <cyg/hal/hal_mmu.h>            // MMU definitions
#include <cyg/hal/innovator.h>          // Platform specific hardware definitions

#define nDEBUG

#if defined(CYG_HAL_STARTUP_ROM)
#define PLATFORM_SETUP1 _platform_setup1
#define CYGHWR_HAL_ARM_HAS_MMU
#define CYGSEM_HAL_ROM_RESET_USES_JUMP

// This is a trick.  If the first two words of SRAM are 0x12345678 and
// 0x87654321, then, then the reset routine in FLASH branches to the
// third location in SRAM.  This allows us to test startup code (which may
// be broken) without writing it to FLASH and rendering the board useless.
// (Well, not permanently useless.  Just useless until we track down an
// emulator and reload a working copy of RedBoot.)  The nifty thing with
// the innovator is that, if you press and hold the reset button for
// 2 seconds it triggers a power-on-reset.  The contents of the internal
// SRAM are maintained across such a reset.  Thus, we can write our
// new test version of RedBoot to SRAM (configured with CYGPRI_HAL_ROM_MLT
// set to SRAM) (more on that later), press and hold the reset button,
// and see if the new startup code works.
//
// Now for some notes about this
// 1) I am guessing about the "2 seconds" part.  If you press and hold
//    the reset button long enough, the FPGA triggers a power-on-reset.
//
// 2) In order to test the SRAM version of RedBoot, import the
//    redboot_SRAM.ecm file (instead of redboot_RAM.ecm or redboot_ROM.ecm)
//    and build RedBoot.  If you already have RedBoot in FLASH, you can
//    use that to load redboot.bin with a base address of 0x20000000.
//    You will be prompted with a "Gee, I don't think 0x20000000 is
//    a valid address in RAM, are you sure you want to do this?" message.
//    You should answer "Yes".  Here is the command I use:
//
//    RedBoot> load -v -r -b 0x20000000 redboot.bin
//
//    You can also use the "sloader" application (loaded via
//    Code Composer Studio) to to load the S-Record file for the SRAM
//    version of RedBoot.
//
// 3) I may have seen a case where the code tested fine in SRAM, but didn't
//    work when I placed it in FLASH.  But other things could have been
//    going on.

#ifdef CYGPRI_HAL_ROM_MLT_SRAM
#define PLATFORM_PREAMBLE _platform_preamble
        .macro  _platform_preamble
        .long   0x12345678
        .long   0x87654321
        .endm
#endif


#if defined(DEBUG) && !defined(CYGPRI_HAL_ROM_MLT_SRAM)
// Don't enable these macro when we are executing from SRAM because
// they overwrite SRAM.

#define FAKE_LED_MACRO_SETUP                    \
        ldr     r0,=0x20000000;                 \
        ldr     r1,[r0];                        \
	subs	r2,r1,#0x20000000;              \
	movlo	r1,#0x20000000;                 \
	ldr	r4,=0x2002fff8;                 \
	subs	r2,r1,r4;                       \
	movhi	r1,#0x20000000;                 \
	bic	r1,r1,#0x3;                     \
	add	r1,r1,#4;                       \
	str	r1, [r0];

#define FAKE_LED_MACRO(n)                       \
        ldr     r11,=0x20000000;                \
        ldr     r11,[r11];                      \
        ldr     r12,=n;                         \
        str     r12,[r11]                       
#else
#define FAKE_LED_MACRO_SETUP
#define FAKE_LED_MACRO(n)
#endif

// This macro represents the initial startup code for the platform        
        .macro  _platform_setup1
        // See if we should branch to an application stored in
        // internal SRAM.  We do this by checking for a magic cookie
        // in the first two locations of SRAM and jumping to the
        // third location in SRAM if we find it (after zeroing those
        // two locations so we don't create an infinite reboot loop).
        ldr     r0,=0x12345678
        ldr     r1,=0x87654321
        ldr     r2,=0x20000000
        ldr     r3,[r2]
        cmp     r3,r0
        ldr     r3,[r2,#4]
        cmpeq   r3,r1
        ldr     r3,=0
        streq   r3,[r2],#4
        streq   r3,[r2],#4
        moveq   pc,r2

	FAKE_LED_MACRO_SETUP
        FAKE_LED_MACRO(1)

        //#define PLATFORM_SETUP_FROM_CCS_GEL_SCRIPT
#ifdef PLATFORM_SETUP_FROM_CCS_GEL_SCRIPT	
        // This is the version of _platform_setup adapted from the contents
        // of the GEL script shipped with Code Composer Studio

	// This is all stolen from the ipaq setup

        // Make sure MMU is OFF
	mov r0,#INTERNAL_SRAM_BASE // Force cache writeback by reloading
	add r2,r0,#0x2000	   // cache from the internal memory bank
123:    ldr r1,[r0],#16
	cmp r0, r2
	bne 123b
	mov r0,#0
	mov r1,#0x0070		// MMU Control System bit
	mcr p15,0,r0,c7,c7,0	// Flush data and instruction cache
	mcr p15,0,r0,c8,c7,0	// Flush ID TLBs
	mcr p15,0,r0,c9,c0,0	// Flush Read-Buffer
	mcr p15,0,r0,c7,c10,4	// Drain write buffer
	mcr p15,0,r0,c13,c0,0	// Disable virtual ID mapping
	mcr p15,0,r1,c1,c0,0	// Write MMU control register
	nop; nop; nop; nop

        mov     r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE)
        msr     cpsr,r0

        // The rest of this is stolen from "init.c" in the sloader program.
        // FIXME -- add configury
        // Set up DPLL1:
        // (reserved)                                 00
        // IOB        = 1     Initialize on break       1
        // (reserved)                                    0
        // PLL_MULT   = 5     60 MHz clock                 0010 1
        // PLL_DIV    = 00:   CLKOUT = CLKREF                    00
        // PLL_ENABLE = 1     Enable DPLL                          1
        // BYPASS_DIV = 00:   CLKOUT = CLKREF                        00
        // (read only)                                                 00
        //
        // 0x2290:                                    0010 0010 1001 0000
        //

	ldr	r1,=DPLL1_BASE
	ldr	r2,=0x2290
	str	r2,[r1,#_DPLL_CTL_REG]
  /* Wait for lock */
1:	ldr	r2,[r1,#_DPLL_CTL_REG]
	and	r2,r2,#1
	cmp	r2,#1
	bne	1b

  /* memif_init() */
  /* Configure ARM9 Memory Interface */
  /* Set up CS0 for memory & bus size of 16 bits, asynchronous read,
   * 3 wait states, and a divide by 2 clock.
   * Set up CS1, CS2, & CS3 the same way, except with 1 wait state.
   */
/*
  TC_EMIFS_CS0_CONFIG   = 0x00003339;
  TC_EMIFS_CS1_CONFIG   = 0x00001139;
  TC_EMIFS_CS2_CONFIG   = 0x00001139;
  TC_EMIFS_CS3_CONFIG   = 0x00001139;
*/
	ldr	r1,=TC_BASE
	ldr	r2,=0x3339
	str	r2,[r1,#0x10]
	ldr	r2,=0x1149
	str	r2,[r1,#0x14]
	ldr	r2,=0x1139
	str	r2,[r1,#0x18]
	str	r2,[r1,#0x1c]
	
  /* Configure the SDRAM */
  /* EMIFF (nCS4) configuration */
  /* TC_EMIFF_SDRAM_CONFIG = 0x000100F4; */
  /* MRS (nCS4) initialization  */
  /* TC_EMIFF_MRS          = 0x00000037; */
	ldr	r2,=0x000100F4
	str	r2,[r1,#0x20]
	ldr	r2,=0x00000037
	str	r2,[r1,#0x24]

  /* Disable ARM9 Watchdog Timer by writing the special sequence to it */
/*
  WATCHDOG_TIMER_MODE = 0x00F5;
  WATCHDOG_TIMER_MODE = 0x00A0;
*/
	ldr	r1,=WATCHDOG_BASE
	ldr	r2,=0xF5
	strh	r2,[r1,#0x08]
	ldr	r2,=0xA0
	strh	r2,[r1,#0x08]
  /* Select the 12MHz oscillator for the frequency reference for the
   * internal timers.  I am doing this today (12/19/02) to simplify my
   * life -- This way, I don't care what the clock rate of the core is.
   */
        ldr     r1,=CLKM_BASE
        ldrh    r2,[r1,#0x00]   // ARM_CKCTL
        bic     r2,r2,#0x1000   // Set ARM_TIMXO = 0
        strh    r2,[r1,#0x00]

  /* Enable the MPUXOR_CK by:
   * "MPUXOR_CK ... is derived from CK_REF ... and is enabled by EN_XORPCK"
   *
   * EN_XORPCK is bit 1 of ARM_IDLECT2
   */
/*
  CLKM_ARM_IDLECT2 |= 0x0002;
*/
	ldrh	r2,[r1,#0x08]
	orr	r2,r2,#0x0082   // Bits 7 (EN_TIMCK) and 1 (EN_XORPCK)
	strh	r2,[r1,#0x08]
	
  /* Then set the PER_EN bit to 1
   * 
   * PER_EN is bit 0 of ARM_RSTCT2
   */
/*
  CLKM_ARM_RSTCT2 |= 0x0001;
*/
	ldrh	r2,[r1,#0x14]
	orr	r2,r2,#0x0001
	strh	r2,[r1,#0x14]

  /* Set the "BT_UART_GATING" bit to 1 in the FUNC_MUX_CTRL_0 register.
   * This enables the TX1 and RTS1 pins.
   */
/*
  CONFIG_FUNC_MUX_CTRL_0 |= BIT_25;
*/
	ldr	r1,=CONFIG_BASE
        ldr     r3,=0x02000000
	ldr	r2,[r1,#0x00]
	orr	r2,r2,r3
	str	r2,[r1,#0x00]

  /* Set bit 6 of the FPGA Power Control Register.  If I could find some
   * documentation on this, I could explain better why I am doing this, but
   * for now, emperical evidence suggests that this disables the "shutdown"
   * signal to the RS232 level shifter.
   */
/*
  FPGA_PWR_CTRL_REG |= BIT_06;
*/
	ldr	r1,=FPGA_BASE
	ldrb	r2,[r1,#0x05]
	orr	r2,r2,#0x20
#ifdef ADD_COMPATIBILITY_FOR_THE_EVM_SOMEDAY
        orr     r2,r2,#0x40
#endif
	strb	r2,[r1,#0x05]

        // Set up a stack [for calling C code]
#if defined(CYG_HAL_STARTUP_SLOADER) || defined(CYG_HAL_STARTUP_ROM)
        // The startup stack is in internal SRAM
        ldr     sp,=__startup_stack
        // This _MOST_DEFINATELY_ needs to be fixed
        orr     sp,sp,#0x10000000
#else
        // The startup stack is in SDRAM, at some virtual address, but
        // we have not set up the MMU yet, so we need to initialize SP
        // with the physical address of '__startup_stack'
#error "Somehow"
#endif
        bl      hal_mmu_init

        // Enable MMU

⌨️ 快捷键说明

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