]>
Commit | Line | Data |
---|---|---|
1bfda055 | 1 | //\r |
2 | // Copyright (c) 2011, ARM Limited. All rights reserved.\r | |
3 | // \r | |
4 | // This program and the accompanying materials \r | |
5 | // are licensed and made available under the terms and conditions of the BSD License \r | |
6 | // which accompanies this distribution. The full text of the license may be found at \r | |
7 | // http://opensource.org/licenses/bsd-license.php \r | |
8 | //\r | |
9 | // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r | |
10 | // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r | |
11 | //\r | |
12 | //\r | |
13 | \r | |
14 | #include <AsmMacroIoLib.h>\r | |
15 | #include <Library/PcdLib.h>\r | |
f501f5d1 | 16 | #include <Drivers/PL354Smc.h>\r |
1bfda055 | 17 | #include <AutoGen.h>\r |
18 | \r | |
19 | INCLUDE AsmMacroIoLib.inc\r | |
20 | \r | |
f501f5d1 | 21 | EXPORT SMCInitializeNOR\r |
22 | EXPORT SMCInitializeSRAM\r | |
23 | EXPORT SMCInitializePeripherals\r | |
24 | EXPORT SMCInitializeVRAM\r | |
1bfda055 | 25 | \r |
26 | PRESERVE8\r | |
27 | AREA ModuleInitializeSMC, CODE, READONLY\r | |
28 | \r | |
1bfda055 | 29 | // CS0 CS0-Interf0 NOR1 flash on the motherboard\r |
30 | // CS1 CS1-Interf0 Reserved for the motherboard\r | |
31 | // CS2 CS2-Interf0 SRAM on the motherboard\r | |
32 | // CS3 CS3-Interf0 memory-mapped Ethernet and USB controllers on the motherboard\r | |
33 | // CS4 CS0-Interf1 NOR2 flash on the motherboard\r | |
34 | // CS5 CS1-Interf1 memory-mapped peripherals\r | |
35 | // CS6 CS2-Interf1 memory-mapped peripherals\r | |
36 | // CS7 CS3-Interf1 system memory-mapped peripherals on the motherboard.\r | |
37 | \r | |
38 | // IN r1 SmcBase\r | |
f501f5d1 | 39 | // IN r2 ChipSelect\r |
1bfda055 | 40 | // NOTE: This code is been called before any stack has been setup. It means some registers\r |
41 | // could be overwritten (case of 'r0')\r | |
f501f5d1 | 42 | SMCInitializeNOR\r |
43 | // Write to set_cycle register(holding register for NOR 1 cycle register or NAND cycle register)\r | |
44 | // - Read cycle timeout = 0xA (0:3)\r | |
45 | // - Write cycle timeout = 0x3(7:4)\r | |
46 | // - OE Assertion Delay = 0x9(11:8)\r | |
47 | // - WE Assertion delay = 0x3(15:12)\r | |
48 | // - Page cycle timeout = 0x2(19:16)\r | |
1bfda055 | 49 | ldr r0, = 0x0002393A\r |
f501f5d1 | 50 | str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r |
1bfda055 | 51 | \r |
f501f5d1 | 52 | // Write to set_opmode register(holding register for NOR 1 opomode register or NAND opmode register)\r |
53 | ldr r0, = (PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_BURST_LENGTH_CONT :OR: PL354_SMC_SET_OPMODE_SET_WR_BURST_LENGTH_CONT :OR: PL354_SMC_SET_OPMODE_SET_ADV)\r | |
54 | str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r | |
55 | \r | |
56 | // Write to direct_cmd register so that the NOR 1 registers(set-cycles and opmode) are updated with holding registers\r | |
57 | ldr r0, =PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE\r | |
58 | orr r0, r0, r2\r | |
59 | str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r | |
1bfda055 | 60 | \r |
f501f5d1 | 61 | bx lr\r |
62 | \r | |
63 | \r | |
1bfda055 | 64 | //\r |
65 | // Setup SRAM (CS2-Interface0)\r | |
66 | //\r | |
f501f5d1 | 67 | SMCInitializeSRAM\r |
1bfda055 | 68 | ldr r0, = 0x00027158\r |
f501f5d1 | 69 | str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r |
1bfda055 | 70 | \r |
f501f5d1 | 71 | ldr r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_ADV)\r |
72 | str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r | |
1bfda055 | 73 | \r |
f501f5d1 | 74 | ldr r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,2))\r |
75 | str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r | |
76 | \r | |
77 | bx lr\r | |
1bfda055 | 78 | \r |
f501f5d1 | 79 | SMCInitializePeripherals\r |
1bfda055 | 80 | //\r |
81 | // USB/Eth/VRAM (CS3-Interface0)\r | |
82 | //\r | |
83 | ldr r0, = 0x000CD2AA\r | |
f501f5d1 | 84 | str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r |
1bfda055 | 85 | \r |
f501f5d1 | 86 | ldr r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_SYNC :OR: PL354_SMC_SET_OPMODE_SET_WR_SYNC)\r |
87 | str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r | |
1bfda055 | 88 | \r |
f501f5d1 | 89 | ldr r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,3))\r |
90 | str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r | |
91 | \r | |
1bfda055 | 92 | \r |
1bfda055 | 93 | //\r |
94 | // Setup Peripherals (CS3-Interface1)\r | |
95 | //\r | |
96 | ldr r0, = 0x00025156\r | |
f501f5d1 | 97 | str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r |
1bfda055 | 98 | \r |
f501f5d1 | 99 | ldr r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_SYNC :OR: PL354_SMC_SET_OPMODE_SET_WR_SYNC)\r |
100 | str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r | |
1bfda055 | 101 | \r |
f501f5d1 | 102 | ldr r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(1,3))\r |
103 | str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r | |
1bfda055 | 104 | \r |
f501f5d1 | 105 | bx lr\r |
106 | \r | |
107 | \r | |
108 | // IN r1 SmcBase\r | |
109 | // IN r2 VideoSRamBase\r | |
110 | // NOTE: This code is been called before any stack has been setup. It means some registers\r | |
111 | // could be overwritten (case of 'r0')\r | |
112 | SMCInitializeVRAM\r | |
113 | //\r | |
114 | // Setup VRAM (CS1-Interface0)\r | |
115 | //\r | |
1bfda055 | 116 | ldr r0, = 0x00049249\r |
f501f5d1 | 117 | str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r |
1bfda055 | 118 | \r |
f501f5d1 | 119 | ldr r0, = (PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_SYNC :OR: PL354_SMC_SET_OPMODE_SET_WR_SYNC)\r |
120 | str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r | |
1bfda055 | 121 | \r |
f501f5d1 | 122 | ldr r0, = (PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,1))\r |
123 | str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r | |
1bfda055 | 124 | \r |
f501f5d1 | 125 | //\r |
126 | // Page mode setup for VRAM\r | |
127 | //\r | |
128 | \r | |
129 | // Read current state\r | |
1bfda055 | 130 | ldr r0, [r2, #0] \r |
131 | ldr r0, [r2, #0] \r | |
132 | ldr r0, = 0x00000000\r | |
133 | str r0, [r2, #0] \r | |
134 | ldr r0, [r2, #0] \r | |
135 | \r | |
f501f5d1 | 136 | // Enable page mode\r |
1bfda055 | 137 | ldr r0, [r2, #0] \r |
138 | ldr r0, [r2, #0] \r | |
139 | ldr r0, = 0x00000000\r | |
140 | str r0, [r2, #0] \r | |
141 | ldr r0, = 0x00900090\r | |
142 | str r0, [r2, #0] \r | |
143 | \r | |
f501f5d1 | 144 | // Confirm page mode enabled\r |
1bfda055 | 145 | ldr r0, [r2, #0] \r |
146 | ldr r0, [r2, #0] \r | |
147 | ldr r0, = 0x00000000\r | |
148 | str r0, [r2, #0] \r | |
149 | ldr r0, [r2, #0] \r | |
150 | \r | |
151 | bx lr\r | |
152 | \r | |
153 | END\r |