blob: e3d795d9c3c91b3a10f81393e2c79d100b4466c2 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/*
* Cogent CSB337 - AT91RM9200 Startup code
*
* Copyright (c) 2004 by Cogent Computer Systems
* Written by Jay Monkman <jtm@lopingdog.com>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
*
* http://www.rtems.com/license/LICENSE.
*
*
* $Id$
*/
#include <bsp.h>
#include <at91rm9200.h>
#include <at91rm9200_pmc.h>
#include <at91rm9200_emac.h>
/* Global Variables */
extern void *_flash_size;
extern void *_flash_base;
extern void *_sdram_size;
extern void *_sdram_base;
extern void *_bss_free_start;
unsigned long free_mem_start;
unsigned long free_mem_end;
/* Function prototypes */
extern void rtems_irq_mngt_init(void);
void bsp_libc_init( void *, uint32_t, int );
static void fix_mac_addr(void);
/*
* bsp_start_default - BSP initialization function
*
* This function is called before RTEMS is initialized and used
* adjust the kernel's configuration.
*
* This function also configures the CPU's memory protection unit.
*
* RESTRICTIONS/LIMITATIONS:
* Since RTEMS is not configured, no RTEMS functions can be called.
*/
void bsp_start_default( void )
{
/* disable interrupts */
AIC_CTL_REG(AIC_IDCR) = 0xffffffff;
/*
* Some versions of the bootloader have the MAC address
* reversed. This fixes it, if necessary.
*/
fix_mac_addr();
/*
* Init rtems exceptions management
*/
rtems_exception_init_mngt();
/*
* Init rtems interrupt management
*/
rtems_irq_mngt_init();
} /* bsp_start */
/*
* Some versions of the bootloader shipped with the CSB337
* reverse the MAC address. This function tests for that,
* and fixes the MAC address.
*/
static void fix_mac_addr(void)
{
uint8_t addr[6];
/* Read the MAC address */
addr[0] = (EMAC_REG(EMAC_SA1L) >> 0) & 0xff;
addr[1] = (EMAC_REG(EMAC_SA1L) >> 8) & 0xff;
addr[2] = (EMAC_REG(EMAC_SA1L) >> 16) & 0xff;
addr[3] = (EMAC_REG(EMAC_SA1L) >> 24) & 0xff;
addr[4] = (EMAC_REG(EMAC_SA1H) >> 0) & 0xff;
addr[5] = (EMAC_REG(EMAC_SA1H) >> 8) & 0xff;
/* Check which 3 bytes have Cogent's OUI */
if ((addr[5] == 0x00) && (addr[4] == 0x23) && (addr[3] == 0x31)) {
EMAC_REG(EMAC_SA1L) = ((addr[5] << 0) |
(addr[4] << 8) |
(addr[3] << 16) |
(addr[2] << 24));
EMAC_REG(EMAC_SA1H) = ((addr[1] << 0) |
(addr[0] << 8));
}
}
/*
* By making this a weak alias for bsp_start_default, a brave soul
* can override the actual bsp_start routine used.
*/
void bsp_start (void) __attribute__ ((weak, alias("bsp_start_default")));
/*
* Reset the system.
*
* This functions enables the watchdog and waits for it to
* fire, thus resetting the system.
*/
void bsp_reset(void)
{
rtems_interrupt_level level;
rtems_interrupt_disable(level);
/* Enable the watchdog timer, then wait for the world to end. */
ST_REG(ST_WDMR) = ST_WDMR_RSTEN | 1;
while(1);
}
|