source: rtems/c/src/lib/libbsp/m68k/genmcf548x/startup/bspstart.c @ d80c921d

4.104.114.9
Last change on this file since d80c921d was d80c921d, checked in by Joel Sherrill <joel.sherrill@…>, on Aug 19, 2008 at 3:45:01 PM

2008-08-19 Sebastian Huber <sebastian.huber@…>

  • startup/bspstart.c: Fixed nested extern declarations.
  • Property mode set to 100644
File size: 10.7 KB
Line 
1/*===============================================================*\
2| Project: RTEMS generic mcf548x BSP                              |
3+-----------------------------------------------------------------+
4| File: bspstart.c                                                |
5+-----------------------------------------------------------------+
6| The file contains the startup code of generic MCF548x BSP       |
7+-----------------------------------------------------------------+
8|                    Copyright (c) 2007                           |
9|                    Embedded Brains GmbH                         |
10|                    Obere Lagerstr. 30                           |
11|                    D-82178 Puchheim                             |
12|                    Germany                                      |
13|                    rtems@embedded-brains.de                     |
14+-----------------------------------------------------------------+
15|                                                                 |
16| Parts of the code has been derived from the "dBUG source code"  |
17| package Freescale is providing for M548X EVBs. The usage of     |
18| the modified or unmodified code and it's integration into the   |
19| generic mcf548x BSP has been done according to the Freescale    |
20| license terms.                                                  |
21|                                                                 |
22| The Freescale license terms can be reviewed in the file         |
23|                                                                 |
24|    Freescale_license.txt                                        |
25|                                                                 |
26+-----------------------------------------------------------------+
27|                                                                 |
28| The generic mcf548x BSP has been developed on the basic         |
29| structures and modules of the av5282 BSP.                       |
30|                                                                 |
31+-----------------------------------------------------------------+
32|                                                                 |
33| The license and distribution terms for this file may be         |
34| found in the file LICENSE in this distribution or at            |
35|                                                                 |
36| http://www.rtems.com/license/LICENSE.                           |
37|                                                                 |
38+-----------------------------------------------------------------+
39|                                                                 |
40|   date                      history                        ID   |
41| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
42| 12.11.07                    1.0                            ras  |
43|                                                                 |
44\*===============================================================*/
45
46#include <bsp.h>
47#include <rtems/libio.h>
48#include <rtems/libcsupport.h>
49#include <string.h>
50
51char *HeapStart, *HeapEnd;
52unsigned long _HeapSize;
53
54extern uint32_t _CPU_cacr_shadow;
55
56extern unsigned long  _M68k_Ramsize;
57
58/*
59* These labels (!) are defined in the linker command file or when the linker is
60* invoked.
61* NOTE: The information (size) is the address of the object, not the object
62* itself.
63*/
64
65extern char _SdramBase[];
66extern char _BootFlashBase[];
67extern char _CodeFlashBase[];
68extern char _SdramSize[];
69extern char _BootFlashSize[];
70extern char _CodeFlashSize[];
71extern char _TopRamReserved [];
72extern char _WorkspaceBase [];
73extern char _RamSize[];
74
75/*
76 * CPU-space access
77 */
78#define m68k_set_cacr(_cacr) asm volatile ("movec %0,%%cacr\n\tnop" : : "d" (_cacr))
79#define m68k_set_acr0(_acr0) asm volatile ("movec %0,#0x0004" : : "d" (_acr0))
80#define m68k_set_acr1(_acr1) asm volatile ("movec %0,#0x0005" : : "d" (_acr1))
81#define m68k_set_acr2(_acr2) asm volatile ("movec %0,#0x0005" : : "d" (_acr2))
82#define m68k_set_acr3(_acr3) asm volatile ("movec %0,#0x0007" : : "d" (_acr3))
83
84/*
85 * Set initial cacr mode, mainly enables branch/intruction/data cache and switch off FPU.
86 */
87static uint32_t cacr_mode = (0                                          |
88                             MCF548X_CACR_DEC                           | /* enable data cache */
89                             MCF548X_CACR_BEC                           | /* enable branch cache */
90                             MCF548X_CACR_IEC                           | /* enable instruction cache */
91                             MCF548X_CACR_DDCM(DCACHE_ON_WRIGHTTHROUGH) | /* set data cache mode to write-through */
92                             MCF548X_CACR_DESB                          | /* enable data store buffer */
93                             MCF548X_CACR_DDSP                          | /* data access only in supv. mode */
94                             MCF548X_CACR_IDSP                          | /* instr. access only in supv. mode */
95                             MCF548X_CACR_DF);                            /* disable FPU */
96
97
98/*
99 * Coldfire cacr maintenance functions
100 */
101void _CPU_cacr_set_mode(uint32_t new_cacr_mode)
102{
103rtems_interrupt_level level;
104
105rtems_interrupt_disable(level);
106cacr_mode = new_cacr_mode;
107m68k_set_cacr(new_cacr_mode);
108rtems_interrupt_enable(level);
109}
110
111/*
112 * There is no complete cache lock (only 2 ways of 4 can be locked)
113 */
114void _CPU_cache_freeze_data(void)
115{
116}
117
118void _CPU_cache_unfreeze_data(void)
119{
120}
121
122void _CPU_cache_freeze_instruction(void)
123{
124}
125
126void _CPU_cache_unfreeze_instruction(void)
127{
128}
129
130void _CPU_cache_enable_instruction(void)
131{
132    cacr_mode &= ~(MCF548X_CACR_IDCM);
133    _CPU_cacr_set_mode(cacr_mode);
134}
135
136void _CPU_cache_disable_instruction(void)
137{
138    cacr_mode |= MCF548X_CACR_IDCM;
139    _CPU_cacr_set_mode(cacr_mode);
140}
141
142void _CPU_cache_invalidate_entire_instruction(void)
143{
144        cacr_mode |= MCF548X_CACR_ICINVA;
145    _CPU_cacr_set_mode(cacr_mode);
146}
147
148void _CPU_cache_invalidate_1_instruction_line(const void *addr)
149{
150
151    asm volatile ("cpushl %%ic,(%0)" :: "a" (addr));
152}
153
154void _CPU_cache_enable_data(void)
155{
156    cacr_mode &= ~MCF548X_CACR_DDCM(DCACHE_OFF_IMPRECISE);
157    _CPU_cacr_set_mode(cacr_mode);
158}
159
160void _CPU_cache_disable_data(void)
161{
162    cacr_mode |= MCF548X_CACR_DDCM(DCACHE_OFF_IMPRECISE);
163    _CPU_cacr_set_mode(cacr_mode);
164}
165
166void _CPU_cache_invalidate_entire_data(void)
167{
168    cacr_mode |= MCF548X_CACR_DCINVA;
169    _CPU_cacr_set_mode(cacr_mode);
170}
171
172void _CPU_cache_invalidate_1_data_line(const void *addr)
173{
174
175   asm volatile ("cpushl %%dc,(%0)" :: "a" (addr));
176}
177
178void _CPU_cache_flush_1_data_line(const void *addr)
179{
180   asm volatile ("cpushl %%dc,(%0)" :: "a" (addr));
181}
182
183void _CPU_cache_flush_entire_data(void)
184{
185register uint32_t way_cnt, set_cnt, addr;
186
187asm volatile("nop");
188
189for(way_cnt=0; way_cnt<4; way_cnt++)
190  {
191  for(addr=0,set_cnt=0; set_cnt<512; set_cnt++,addr+=0x10)
192    {
193    asm volatile ("cpushl %%dc,(%0)" :: "a" (addr));
194    }
195  addr=way_cnt;
196  }
197}
198
199/*
200 *  Use the shared implementations of the following routines
201 */
202
203void bsp_predriver_hook(void)
204{
205        /* Do nothing */
206}
207
208void bsp_postdriver_hook(void);
209void bsp_libc_init( void *, uint32_t, int );
210void bsp_pretasking_hook(void);         /* m68k version */
211
212void bsp_calc_mem_layout(void)
213{
214  /*
215   * compute the memory layout:
216   * - first unused address is Workspace start
217   * - Heap starts at end of workspace
218   * - Heap ends at end of memory - reserved memory area
219   */
220  Configuration.work_space_start = _WorkspaceBase;
221
222  HeapStart = ((char *)Configuration.work_space_start +
223                    Configuration.work_space_size);
224
225  HeapEnd = (void *)(RAM_END - (uint32_t)_TopRamReserved);
226
227  _HeapSize = HeapEnd - HeapStart;
228}
229
230
231/*
232 * Coldfire acr and mmu settings
233 */
234 void acr_mmu_mapping(void)
235   {
236
237  /*
238   * Cache disabled for internal register area (256 kB).
239   * Choose the smallest maskable size of 1MB.
240   */
241  m68k_set_acr0(MCF548X_ACR_BA((uint32_t)(__MBAR))                           |
242                MCF548X_ACR_ADMSK_AMM((uint32_t)(0xFFFFF))                   |
243                MCF548X_ACR_E                                                |
244                MCF548X_ACR_SP               /* supervisor protection */     |
245                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
246                MCF548X_ACR_CM(CM_OFF_PRECISE));
247
248#ifdef M5484FIREENGINE
249
250
251  /*
252   * Cache enabled for entire SDRAM (64 MB)
253   */
254  m68k_set_acr1(MCF548X_ACR_BA((uint32_t)(_SdramBase))                       |
255                MCF548X_ACR_ADMSK_AMM((uint32_t)(_SdramSize - 1))            |
256                MCF548X_ACR_E                                                |
257                MCF548X_ACR_SP               /* supervisor protection */     |
258                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
259                MCF548X_ACR_CM(CM_ON_WRIGHTTHROUGH));
260
261  /*
262   * Cache enabled for entire boot flash (2 MB)
263   */
264  m68k_set_acr2(MCF548X_ACR_BA((uint32_t)(_BootFlashBase))                   |
265                MCF548X_ACR_ADMSK_AMM((uint32_t)(_BootFlashSize - 1))        |
266                MCF548X_ACR_E                                                |
267                MCF548X_ACR_SP               /* supervisor protection */     |
268                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
269                MCF548X_ACR_CM(CM_ON_COPYBACK));
270
271  /*
272   * Cache enabled for entire code flash (16 MB)
273   */
274  m68k_set_acr3(MCF548X_ACR_BA((uint32_t)(_CodeFlashBase))                   |
275                MCF548X_ACR_ADMSK_AMM((uint32_t)(_CodeFlashSize - 1))        |
276                MCF548X_ACR_E                                                |
277                MCF548X_ACR_SP               /* supervisor protection */     |
278                MCF548X_ACR_S(S_ACCESS_SUPV) /* always in supervisor mode */ |
279                MCF548X_ACR_CM(CM_ON_COPYBACK));
280#endif
281
282   }
283
284/*
285 *  bsp_start
286 *
287 *  This routine does the bulk of the system initialisation.
288 */
289void bsp_start( void )
290{
291  _M68k_Ramsize = (unsigned long)_RamSize;              /* RAM size set in linker script */
292
293  /*
294   *  Allocate the memory for the RTEMS Work Space and Heap.  This can come from
295   *  a variety of places: hard coded address, malloc'ed from outside
296   *  RTEMS world (e.g. simulator or primitive memory manager), or (as
297   *  typically done by stock BSPs) by subtracting the required amount
298   *  of work space from the last physical address on the CPU board.
299   */
300  bsp_calc_mem_layout();
301
302  /*
303   * do mapping of acr's and/or mmu
304   */
305  acr_mmu_mapping();
306
307  /*
308   * Load the shadow variable of cacr with initial mode and write it to the cacr.
309   * Interrupts are still disabled, so there is no need for surrounding rtems_interrupt_enable()/rtems_interrupt_disable()
310   */
311  _CPU_cacr_shadow = cacr_mode;
312  m68k_set_cacr(_CPU_cacr_shadow);
313
314}
315
316
317/*
318 * Get the XLB clock speed
319 */
320uint32_t get_CPU_clock_speed(void)
321{
322    return (uint32_t)BSP_CPU_CLOCK_SPEED;
323}
Note: See TracBrowser for help on using the repository browser.