1 #ifndef CYGONCE_HAL_VAR_SETUP_H
2 #define CYGONCE_HAL_VAR_SETUP_H
4 //=============================================================================
8 // Variant specific support for HAL (assembly code)
10 //=============================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
15 // Copyright (C) 2003 Nick Garnett <nickg@calivar.com>
16 // Copyright (C) 2006 eCosCentric Ltd
18 // eCos is free software; you can redistribute it and/or modify it under
19 // the terms of the GNU General Public License as published by the Free
20 // Software Foundation; either version 2 or (at your option) any later version.
22 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
23 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 // You should have received a copy of the GNU General Public License along
28 // with eCos; if not, write to the Free Software Foundation, Inc.,
29 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
31 // As a special exception, if other files instantiate templates or use macros
32 // or inline functions from this file, or you compile this file and link it
33 // with other works to produce a work based on this file, this file does not
34 // by itself cause the resulting work to be covered by the GNU General Public
35 // License. However the source code for this file must still be made available
36 // in accordance with section (3) of the GNU General Public License.
38 // This exception does not invalidate any other reasons why a work based on
39 // this file might be covered by the GNU General Public License.
40 // -------------------------------------------
41 //####ECOSGPLCOPYRIGHTEND####
42 //=============================================================================
43 //#####DESCRIPTIONBEGIN####
45 // Author(s): Ilija Koco <ilijak@siva.com.mk>
48 // Purpose: MAC7100 variant specific support routines
50 // Usage: in <cyg/hal/hal_platform_serup.h> include following:
51 // #include <cyg/hal/hal_var_setup.h>
53 //####DESCRIPTIONEND####
55 //===========================================================================
57 // Clock initilalization
59 #if defined(CYGNUM_HAL_ARM_MAC7100_FDIV) // Divider set by user.
60 # define MAC7100_CRG_REFDV_VAL (CYGNUM_HAL_ARM_MAC7100_FDIV-1)
61 #else // Divider calculated.
62 //NOTE: works for f_osc <= 8MHz
63 # define MAC7100_CRG_REFDV_VAL (((CYGNUM_HAL_ARM_MAC7100_F_OSC/500000) - 1) & 0x0F) // 15 (1)
65 #define MAC7100_CRG_SYNR_VAL (CYGNUM_HAL_ARM_MAC7100_CLOCK_SPEED / 2 / \
66 (CYGNUM_HAL_ARM_MAC7100_F_OSC / (MAC7100_CRG_REFDV_VAL+1))-1) // 47 (5)
68 #define MAC7100_CRG_PLLCTL_VAL \
69 (MAC7100_CRG_CME|MAC7100_CRG_PLLON|MAC7100_CRG_AUTO| \
70 MAC7100_CRG_ACQ|MAC7100_CRG_SCME)
71 #define MAC7100_CRG_CLKSEL_VAL (MAC7100_CRG_PLLSEL)
73 .macro _mac7100_setpll
74 ldr r2,=MAC7100_CRG_BASE
76 // Disable clock interrupts
77 strb r3,[r2,#(MAC7100_CRG_CRGINT-MAC7100_CRG_BASE)]
79 mov r3,#MAC7100_CRG_REFDV_VAL
80 // Reference Divider reg.
81 strb r3,[r2,#(MAC7100_CRG_REFDV-MAC7100_CRG_BASE)]
82 mov r3,#MAC7100_CRG_SYNR_VAL
83 // Synthesizer register
84 strb r3,[r2,#(MAC7100_CRG_SYNR-MAC7100_CRG_BASE)]
85 mov r3,#MAC7100_CRG_PLLCTL_VAL
86 // PLL control register
87 strb r3,[r2,#(MAC7100_CRG_PLLCTL-MAC7100_CRG_BASE)]
88 // Wait PLL lock <-----------------------------------<
89 1: ldrb r3,[r2,#(MAC7100_CRG_CRGFLG-MAC7100_CRG_BASE)]
90 tst r3,#MAC7100_CRG_LOCK
91 bne 2f // PLL locked, GO ON ---------->>
92 b 1b // Still waiting for PLL lock ------------>
93 2: mov r3,#MAC7100_CRG_CLKSEL_VAL // <<-------<<
95 strb r3,[r2,#(MAC7100_CRG_CLKSEL-MAC7100_CRG_BASE)]
97 strb r3,[r2,#(MAC7100_CRG_BDMCTL-MAC7100_CRG_BASE)] // Set CRG BDMCTL
101 // Memory re-mapping for single chip configuration
102 // Re-map internal memory so that vectors can reside in RAM.
103 // RAM base 0x00000000 (as well as 0x40000000)
104 // Flash base 0x20000000
105 .macro _mac7100_remap_single_chip
107 ldr r1, _mac7100_teleport
108 ldr r0, [r1] //AAMR Register
110 mvn r4, #0xf0000000 // 1.Copy telepoter to RAM
111 ldr r2, _mac7100_teleport+4 // TelePorter
112 ldr r3, _mac7100_teleport+8 // TelePort (TelePorter end)
115 mov r4, #0x40000000 // RAM address
116 1: // Copy teleporter: // copying teleporter <---<
120 bne 1b // Copy teleporter -------->
121 ldr r3,_mac7100_teleport+12
122 mov pc,#0x40000000 // 2.Jump to _mac7100_teleporter in RAM
124 bic r0,r0,#0x000000ff // 3.Re-map memory
125 orr r0,r0,#0x8b // Flash -> 0x20000000
126 str r0,[r1] // RAM -> 0x00000000 and 0x40000000
127 mov pc,r3 // 4.Teleport back to Flash
129 .long MAC7100_MCM_AAMR
130 .long _mac7100_teleporter
131 .long _mac7100_teleport
132 .long _mac7100_teleport_return
133 _mac7100_teleport_return:
136 // End memory re-mapping for single chip configuration
138 //-----------------------------------------------------------------------------
139 // end of hal_var_setup.h
140 #endif // CYGONCE_HAL_VAR_SETUP_H