aboutsummaryrefslogtreecommitdiff
path: root/tcl/board/embedded-artists_lpc2478-32.cfg
blob: 1bbf4bb659f779f41b37581f0afb748094ce93f1 (plain)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# Embedded Artists eval board for LPC2478
# http://www.embeddedartists.com/

# Delays on reset lines
adapter_nsrst_delay 500
jtag_ntrst_delay 1

# Adaptive JTAG clocking through RTCK.
# 
jtag_rclk 20

# Target device: LPC2478
set CCLK 72000
source [find target/lpc2478.cfg]

# A working area will help speeding the flash programming
$_TARGETNAME configure -work-area-phys 0x40000200 -work-area-size [expr 0x10000-0x200-0x20] -work-area-backup 0

# External 16-bit flash at chip select CS0 (SST39VF3201-70, 4 MiB)
flash bank $_CHIPNAME.extflash cfi 0x80000000 0x400000 2 2 $_TARGETNAME jedec_probe

# Helper
#
proc read_register {register} {
    set result ""
    mem2array result 32 $register 1
    return $result(0)
}


# Enable the PLL.
# Generate maximum CPU clock (72 MHz) Run from internal RC oscillator.
# Note: The PLL output runs at a frequency N times the desired CPU clock.
#       It in unavoidable that the CPU clock drops down to (4 MHz/N) during
#       the initialization!
#       Here: N=4
#       Note that if the PLL is already active at the time this script is
#       called, the effective value of N is the value of CCLKCFG at that time!
#
proc enable_pll {} {
    # Disconnect PLL in case it is already connected
    if {[expr [read_register 0xE01FC080] & 0x03] == 3} {
        # Disconnect it, but leave it enabled
        # (This MUST be done in two steps)
        mww 0xE01FC080 0x00000001       ;# PLLCON: disconnect PLL
        mww 0xE01FC08C 0x000000AA       ;# PLLFEED
        mww 0xE01FC08C 0x00000055       ;# PLLFEED
    }
    # Disable PLL (as it might already be enabled at this time!)
    mww 0xE01FC080 0x00000000       ;# PLLCON: disable PLL
    mww 0xE01FC08C 0x000000AA       ;# PLLFEED
    mww 0xE01FC08C 0x00000055       ;# PLLFEED

    # Setup PLL to generate 288 MHz from internal RC oscillator
    mww 0xE01FC10C 0x00000000       ;# CLKSRCSEL: IRC
    mww 0xE01FC084 0x00000023       ;# PLLCFG: N=1, M=36
    mww 0xE01FC08C 0x000000AA       ;# PLLFEED
    mww 0xE01FC08C 0x00000055       ;# PLLFEED
    mww 0xE01FC080 0x00000001       ;# PLLCON: enable PLL
    mww 0xE01FC08C 0x000000AA       ;# PLLFEED
    mww 0xE01FC08C 0x00000055       ;# PLLFEED
    sleep 100
    mww 0xE01FC104 0x00000003       ;# CCLKCFG: divide by 4 (72 MHz)
    mww 0xE01FC080 0x00000003       ;# PLLCON: connect PLL
    mww 0xE01FC08C 0x000000AA       ;# PLLFEED
    mww 0xE01FC08C 0x00000055       ;# PLLFEED
}


# Event handlers
#
$_TARGETNAME configure -event reset-start {
    # Back to the slow JTAG clock
    jtag_rclk 20
}


$_TARGETNAME configure -event reset-init {

    arm core_state arm
    arm7_9 dcc_downloads enable     ;# Speed up downloads by using DCC transfer
    arm7_9 fast_memory_access enable

    # Peripheral clocks
    mww 0xE01FC0C4 0x04280FFE       ;# PCONP: (reset value)

    # Map the user flash to the vector table area (0x00...0x3F)
    mww 0xE01FC040 0x00000001       ;# MEMMAP: User flash

    # Memory accelerator module
    mww 0xE01FC004 0x00000003       ;# MAMTIM: 3 clock cycles
    mww 0xE01FC000 0x00000002       ;# MAMCR: fully enabled

    # Enable external memory bus (32-bit SDRAM at DYCS0, 16-bit flash at CS0)
    mww 0xE002C014 0x55010115       ;# PINSEL5: P2.16=CAS, P2.17=RAS, P2.18=CLKOUT0,
                                     # P2.20=DYCS0, P2.24=CKEOUT0, P2.28=DQMOUT0,
                                     # P2.29=DQMOUT1, P2.30=DQMOUT2, P2.31=DQMOUT3
    mww 0xE002C018 0x55555555       ;# PINSEL6: P3.0...P3.15=D0...D15
    mww 0xE002C01C 0x55555555       ;# PINSEL7: P3.16...P3.31=D16...D31
    mww 0xE002C020 0x55555555       ;# PINSEL8: P4.0...P4.15=A0...A15
    mww 0xE002C024 0x50051555       ;# PINSEL9: P4.16...P4.22=A16...A22, P4.24=OE,
                                     # P4.25=WE, P4.30=CS0, P4.31=CS1
    mww 0xFFE08000 0x00000001       ;# EMCControl: Enable EMC

    # Start PLL, then use faster JTAG clock
    enable_pll
    jtag_rclk 3000

    # 16-bit flash @ CS0 (SST39VF3201-70)
    mww 0xFFE08200 0x00080081       ;# EMCStaticConfig0: 16 bit, PB=1, buffers on
    mww 0xFFE08204 0x00000000       ;# EMCStaticWaitWen0
    mww 0xFFE08208 0x00000000       ;# EMCStaticWaitOen0
    mww 0xFFE0820C 0x00000005       ;# EMCStaticWaitRd0
    mww 0xFFE08210 0x00000005       ;# EMCStaticWaitPage0
    mww 0xFFE08214 0x00000003       ;# EMCStaticWaitWr0
    mww 0xFFE08218 0x00000001       ;# EMCStaticWaitTurn0

    # 8-bit NAND @ CS1
    # TODO

    # 32-bit SDRAM @ DYCS0 (K4M563233G-HN75)
    mww 0xFFE08028 0x00000001       ;# EMCDynamicReadConfig
    mww 0xFFE08030 0x00000001       ;# EMCDynamicRP
    mww 0xFFE08034 0x00000003       ;# EMCDynamicRAS
    mww 0xFFE08038 0x00000005       ;# EMCDynamicSREX
    mww 0xFFE0803C 0x00000001       ;# EMCDynamicAPR
    mww 0xFFE08040 0x00000005       ;# EMCDynamicDAL
    mww 0xFFE08044 0x00000001       ;# EMCDynamicWR
    mww 0xFFE08048 0x00000005       ;# EMCDynamicRC
    mww 0xFFE0804C 0x00000005       ;# EMCDynamicRFC
    mww 0xFFE08050 0x00000005       ;# EMCDynamicXSR
    mww 0xFFE08054 0x00000001       ;# EMCDynamicRRD
    mww 0xFFE08058 0x00000001       ;# EMCDynamicMRD
    #
    mww 0xFFE08104 0x00000202       ;# EMCDynamicRasCas0
    mww 0xFFE08100 0x00005488       ;# EMCDynamicConfig0
    sleep 100
    mww 0xFFE08020 0x00000183       ;# EMCDynamicControl: Clock on continuously, NOP
    sleep 10
    mww 0xFFE08020 0x00000103       ;# EMCDynamicControl: PRECHARGE-ALL
    mww 0xFFE08024 0x00000046       ;# EMCDynamicRefresh
    sleep 100
    mww 0xFFE08020 0x00000083       ;# EMCDynamicControl: MODE
    mdw 0xA0011000 1                ;# Set SDRAM mode register
    mww 0xFFE08020 0x00000000       ;# EMCDynamicControl: NORMAL
    mww 0xFFE08100 0x00085488       ;# EMCDynamicConfig0: Enable buffers
}