source: rtems/c/src/lib/libbsp/m68k/av5282/startup/bspstart.c @ c499856

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/*
2 *  BSP startup
3 *
4 *  This routine starts the application.  It includes application,
5 *  board, and monitor specific initialization and configuration.
6 *  The generic CPU dependent initialization has been performed
7 *  before this routine is invoked.
8 *
9 *  Author:
10 *    David Fiddes, D.J@fiddes.surfaid.org
11 *    http://www.calm.hw.ac.uk/davidf/coldfire/
12 *
13 *  COPYRIGHT (c) 1989-1998.
14 *  On-Line Applications Research Corporation (OAR).
15 *
16 *  The license and distribution terms for this file may be
17 *  found in the file LICENSE in this distribution or at
18 *  http://www.rtems.org/license/LICENSE.
19 */
20
21#include <bsp.h>
22#include <string.h>
23
24/*
25 * Cacheable areas
26 */
27#define SDRAM_BASE      0
28#define SDRAM_SIZE      (16*1024*1024)
29#define FLASH_BASE      0xFF800000
30#define FLASH_SIZE      (8*1024*1024)
31
32/*
33 * CPU-space access
34 */
35#define m68k_set_acr0(_acr0) __asm__ volatile ("movec %0,%%acr0" : : "d" (_acr0))
36#define m68k_set_acr1(_acr1) __asm__ volatile ("movec %0,%%acr1" : : "d" (_acr1))
37
38/*
39 * Read/write copy of common cache
40 *   Split I/D cache
41 *   Allow CPUSHL to invalidate a cache line
42 *   Enable buffered writes
43 *   No burst transfers on non-cacheable accesses
44 *   Default cache mode is *disabled* (cache only ACRx areas)
45 */
46static uint32_t cacr_mode = MCF5XXX_CACR_CENB |
47                              MCF5XXX_CACR_DBWE |
48                              MCF5XXX_CACR_DCM;
49/*
50 * Cannot be frozen
51 */
52void _CPU_cache_freeze_data(void) {}
53void _CPU_cache_unfreeze_data(void) {}
54void _CPU_cache_freeze_instruction(void) {}
55void _CPU_cache_unfreeze_instruction(void) {}
56
57/*
58 * Write-through data cache -- flushes are unnecessary
59 */
60void _CPU_cache_flush_1_data_line(const void *d_addr) {}
61void _CPU_cache_flush_entire_data(void) {}
62
63void _CPU_cache_enable_instruction(void)
64{
65    rtems_interrupt_level level;
66
67    rtems_interrupt_disable(level);
68    cacr_mode &= ~MCF5XXX_CACR_DIDI;
69    m68k_set_cacr(cacr_mode);
70    rtems_interrupt_enable(level);
71}
72
73void _CPU_cache_disable_instruction(void)
74{
75    rtems_interrupt_level level;
76
77    rtems_interrupt_disable(level);
78    cacr_mode |= MCF5XXX_CACR_DIDI;
79    m68k_set_cacr(cacr_mode);
80    rtems_interrupt_enable(level);
81}
82
83void _CPU_cache_invalidate_entire_instruction(void)
84{
85    m68k_set_cacr(cacr_mode | MCF5XXX_CACR_CINV | MCF5XXX_CACR_INVI);
86}
87
88void _CPU_cache_invalidate_1_instruction_line(const void *addr)
89{
90    /*
91     * Top half of cache is I-space
92     */
93    addr = (void *)((int)addr | 0x400);
94    __asm__ volatile ("cpushl %%bc,(%0)" :: "a" (addr));
95}
96
97void _CPU_cache_enable_data(void)
98{
99    rtems_interrupt_level level;
100
101    rtems_interrupt_disable(level);
102    cacr_mode &= ~MCF5XXX_CACR_DISD;
103    m68k_set_cacr(cacr_mode);
104    rtems_interrupt_enable(level);
105}
106
107void _CPU_cache_disable_data(void)
108{
109    rtems_interrupt_level level;
110
111    rtems_interrupt_disable(level);
112    rtems_interrupt_disable(level);
113    cacr_mode |= MCF5XXX_CACR_DISD;
114    m68k_set_cacr(cacr_mode);
115    rtems_interrupt_enable(level);
116}
117
118void _CPU_cache_invalidate_entire_data(void)
119{
120    m68k_set_cacr(cacr_mode | MCF5XXX_CACR_CINV | MCF5XXX_CACR_INVD);
121}
122
123void _CPU_cache_invalidate_1_data_line(const void *addr)
124{
125    /*
126     * Bottom half of cache is D-space
127     */
128    addr = (void *)((int)addr & ~0x400);
129    __asm__ volatile ("cpushl %%bc,(%0)" :: "a" (addr));
130}
131
132/*
133 *  bsp_start
134 *
135 *  This routine does the bulk of the system initialisation.
136 */
137void bsp_start( void )
138{
139  /*
140   * Invalidate the cache and disable it
141   */
142  m68k_set_acr0(0);
143  m68k_set_acr1(0);
144  m68k_set_cacr(MCF5XXX_CACR_CINV);
145
146  /*
147   * Cache SDRAM and FLASH
148   */
149  m68k_set_acr0(MCF5XXX_ACR_AB(SDRAM_BASE)    |
150                MCF5XXX_ACR_AM(SDRAM_SIZE-1)  |
151                MCF5XXX_ACR_EN                |
152                MCF5XXX_ACR_BWE               |
153                MCF5XXX_ACR_SM_IGNORE);
154
155  /*
156   * Enable the cache
157   */
158  m68k_set_cacr(cacr_mode);
159}
160
161extern char _CPUClockSpeed[];
162
163uint32_t get_CPU_clock_speed(void)
164{
165  return( (uint32_t)_CPUClockSpeed);
166}
Note: See TracBrowser for help on using the repository browser.