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
122
123
124
125
126
127
128
129
130
131
132
|
// define rom size
#define __ROM_SIZE 512k
#define __ROM_ADDR 0x08002000
// define ram size
#define __RAM_SIZE 64k
#define __RAM_ADDR 0x20000000
#define __NR_OF_VECTORS 42
#define __VECTOR_TABLE_SIZE (__NR_OF_VECTORS * 4)
#define __VECTOR_TABLE_ROM_ADDR 0x08002000
#define _Vectors 0x08002000
#define _ENTRYADDR (0x08002001 + __VECTOR_TABLE_SIZE + 80) /* xB0 */
#define _START max(_ENTRYADDR, 0x08002165)
#define __RESET 0x08002004
#define __STACK 0x400
#define __STACKADDR (__RAM_ADDR + __RAM_SIZE - __STACK)
#define __HEAP 2k
#define __TABLE_RAM_SIZE 20
#define __TABLE_RAM_ADDR (__STACKADDR - __STACK - __TABLE_RAM_SIZE)
#define __MEMORY
#define __PROCESSOR_MODE 0x10 /* User mode */
#define __IRQ_BIT 0x80 /* IRQ interrupts disabled */
#define __FIQ_BIT 0x40 /* FIQ interrupts disabled */
#define __APPLICATION_MODE (__PROCESSOR_MODE | __IRQ_BIT | __FIQ_BIT)
architecture ARM
{
endianness
{
little;
big;
}
space linear
{
id = 1;
mau = 8;
align = 4;
map (size = 4G, dest = bus:local_bus);
copytable
(
align = 4,
copy_unit = 1,
dest = linear
);
start_address
(
// It is not strictly necessary to define a run_addr for _START
// because hardware starts execution at address 0x0 which should
// be the vector table with a jump to the relocatable _START, but
// an absolute address can prevent the branch to be out-of-range.
// Or _START may be the entry point at reset and the reset handler
// copies the vector table to address 0x0 after some ROM/RAM memory
// re-mapping. In that case _START should be at a fixed address
// in ROM, specifically the alias of address 0x0 before memory
// re-mapping.
run_addr = _START,
symbol = "_START"
);
stack "stack"
(
align = 4,
min_size = __STACK,
grows = high_to_low
);
heap "heap"
(
align = 4,
min_size=__HEAP
);
section_layout
{
"_lc_ub_vector_table" = __VECTOR_TABLE_ROM_ADDR;
"_lc_ue_vector_table" = __VECTOR_TABLE_ROM_ADDR + __VECTOR_TABLE_SIZE + 8;
// "_lc_ub_table" = __TABLE_RAM_ADDR;
// "_lc_ue_table" = __TABLE_RAM_ADDR + __TABLE_RAM_SIZE;
"_lc_ub_vector_table_copy" := "_lc_ub_vector_table";
"_lc_ue_vector_table_copy" := "_lc_ue_vector_table";
group ( ordered, run_addr=__VECTOR_TABLE_ROM_ADDR )
{
select ".text.vector";
}
#ifdef __HEAPADDR
group ( ordered, run_addr=__HEAPADDR )
{
select "heap";
}
#endif
group ( ordered, run_addr=__STACKADDR)
{
select "stack";
}
}
}
bus local_bus
{
mau = 8;
width = 32;
}
}
///////////////////////////////////////////////////////////////////
memory flash
{
mau = 8;
type = rom;
size = __ROM_SIZE;
map ( size = __ROM_SIZE, dest_offset = __ROM_ADDR, dest = bus:ARM:local_bus );
}
memory sram
{
mau = 8;
type = ram;
size = __RAM_SIZE;
map ( size = __RAM_SIZE, dest_offset = __RAM_ADDR, dest = bus:ARM:local_bus );
}
|