上篇博文我們按照210的啟動流程,分析到了時鍾初始化,今天我們繼續按照u-boot的啟動流程對內存的初始化進行分析。
今天我們會用到的文檔:
1. 2440芯片手冊:http://download.csdn.net/detail/wrjvszq/8358949
2. 6410芯片手冊:http://download.csdn.net/detail/wrjvszq/8358965
3. 210芯片手冊:S5PV210_UM_REV1.1(我的不知道為什么傳不上去大家去百度搜吧)
4. 內存芯片手冊:大家根據自己的內存芯片去找相應的芯片手冊
內存的初始化也是比較復雜我們今天會通過以下幾點,對內存的初始化進行介紹:
1. 內存基本分類
2. 深入認識內存
3. 編程分析
為了讓大家對內存有個初步的認識,簡單介紹其分類
1. DRAM
有小電容組成,需要刷新(充電),所以導致速度較慢
1) SDRAM(2440常用)
2) DDR(6410常用)
3) DDR2(210常用)
4) 其他衍生產品
以上幾種都是速度依次增高。
2. SRAM
不用刷新,速度快,價格昂貴,比如我們前面提到的墊腳石就是采用的是SRAM
l 深入認識DRAM
1. 表結構:
內存的內部結構如同一張表格,我們稱為l-bank類似與下圖,其中每個單元格中可以存放數據
2. 內存尋址
內存經過以下信息進行尋址
一方面由於技術、成本等原因,不可能只做一個全容量的L-Bank,而另一方面由於SDRAM的工作原理限制,單一的L-Bank將會造成非常嚴重的尋址沖突,大幅降低內存效率。所以人們在SDRAM內部分割成多個L-Bank。
因此我們在尋址時就要先確定是哪個L-Bank,然后再在這個選定的L-Bank中選擇行列地址進行尋址。
2) 行地址(Row)
3) 列地址(Column)
上面已經說明了內存的尋址方法,其實其內部構造如下圖
3. 內存芯片容量的計算
內存芯片的容量就是所有的L-Bank中的存儲單元的總容量,那么我們可以得到總的存儲單元數量
存儲單元數量=行數×列數(一個L-Bank的存儲單元數量)×L-Bank的數量
那么如何知道一個存儲單元的容量呢?其實在內存芯片的文檔中都會有說明,大家可以自己找找看。大家也可以參考其芯片命名進行計算,這里有篇博文簡單分析了常見內存芯片的命名規則http://blog.chinaunix.net/uid-20964486-id-1831487.html
經過上述內容我們對內存有了一定的了解,接下來我們分析其編程方法。
l 編程分析
我們的芯片通過存儲控制器對內存進行訪問,我們對內存的初始化起始就是對控制器的初始化,所以我們知道怎么對存儲控制器進行初始化,下面以210為例進行分析
1. 初始化流程
通過閱讀210的芯片手冊(2440、6410也有類似的東西),很輕松我們在可以找到其給出的初始化配置過程
2. 內存的位置
本以為拿到了內存的初始化流程,就可以開始寫代碼了,但是在寫的過程中會發現其有部分硬件的東西需要了解一下,首先是內存的位置,再以前的博文中說過地址布局的問題,下面以210為例進行分析:
從上圖可知210的DRAM分為兩個區域,DRAM0和DRAM1總共為1.5G大小,分別通過DMC0和DMC1進行控制,我們要根據自己手頭的板子進行確定。
3. 代碼分析
有了上面的DDR2的初始化流程和地址布局的分析,我們就不難理解210內存的初始化代碼,由於u-boot代碼太多看着不太清楚,我將自己按照流程寫的代碼給大家分享一下
1 #define DMC_PHYCONTROL0 0xf0000018 2 #define DMC_PHYCONTROL1 0xf000001c 3 #define DMC_CONCONTROL 0xf0000000 4 #define DMC_MEMCONTROL 0xf0000004 5 #define DMC_MEMCONFIG0 0xf0000008 6 #define DMC_MEMCONFIG1 0xf000000c 7 #define DMC_PRECHCONFIG 0xf0000014 8 #define DMC_TIMINGAREF 0xf0000030 9 #define DMC_TIMINGROW 0xf0000034 10 #define DMC_TIMINGDATA 0xf0000038 11 #define DMC_TIMINGPOWER 0xf000003c 12 #define DMC_PHYSTATUS 0xf0000040 13 #define DMC_DIRECTCMD 0xf0000010 14 #define DMC_PWRDNCONFIG 0xf0000028 15 16 #define DMC0_MEMCONTROL 0x00202400 17 #define DMC0_MEMCONFIG_0 0x20F00313 18 #define DMC0_MEMCONFIG_1 0x00F00313 19 20 #define DMC0_TIMINGA_REF 0x00000618 21 #define DMC0_TIMING_ROW 0x2B34438A 22 #define DMC0_TIMING_DATA 0x24240000 23 #define DMC0_TIMING_PWR 0x0BDC0343 24 25 26 27 .globl init_mem 28 init_mem: 29 @ step 2.1 30 ldr r0, =DMC_PHYCONTROL0 31 ldr r1, =0x00101000 32 str r1, [r0] 33 34 ldr r0, =DMC_PHYCONTROL1 35 ldr r1, =0x00000086 36 str r1, [r0] 37 38 @ step 2.2 39 ldr r0, =DMC_PHYCONTROL0 40 ldr r1, =0x00101002 41 str r1, [r0] 42 43 44 45 @ step 4 46 ldr r0, =DMC_PHYCONTROL0 47 ldr r1, =0x00101003 48 str r1, [r0] 49 50 @ step 5 51 ldr r0, =DMC_CONCONTROL 52 ldr r1, =0x0FFF1350 53 str r1, [r0] 54 55 @ step 6 56 ldr r0, =DMC_MEMCONTROL 57 ldr r1, =DMC0_MEMCONTROL 58 str r1, [r0] 59 60 @ step 7 61 ldr r0, =DMC_MEMCONFIG0 62 ldr r1, =DMC0_MEMCONFIG_0 63 str r1, [r0] 64 65 @ step 8 66 ldr r0, =DMC_PRECHCONFIG 67 ldr r1, =0xFF000000 68 str r1, [r0] 69 70 @ step 9.1 71 ldr r0, =DMC_TIMINGAREF 72 ldr r1, =DMC0_TIMINGA_REF 73 str r1, [r0] 74 75 @ step 9.2 76 ldr r0, =DMC_TIMINGROW 77 ldr r1, =DMC0_TIMING_ROW 78 str r1, [r0] 79 80 @ step 9.3 81 ldr r0, =DMC_TIMINGDATA 82 ldr r1, =DMC0_TIMING_DATA 83 str r1, [r0] 84 85 @ step 9.4 86 ldr r0, =DMC_TIMINGPOWER 87 ldr r1, =DMC0_TIMING_PWR 88 str r1, [r0] 89 90 @ step 11 91 wait_lock: 92 ldr r0, =DMC_PHYSTATUS 93 ldr r1, [r0] 94 and r2, r1, #0x4 95 cmp r2, #0x4 96 bne wait_lock 97 98 @ step 14 99 ldr r0, =DMC_DIRECTCMD 100 ldr r1, =0x07000000 101 str r1, [r0] 102 103 @ step 16 104 ldr r1, =0x01000000 105 str r1, [r0] 106 107 @ step 17 108 ldr r1, =0x00020000 109 str r1, [r0] 110 111 @ step 18 112 ldr r1, =0x00030000 113 str r1, [r0] 114 115 @ step 19 116 ldr r1, =0x00010400 117 str r1, [r0] 118 119 @ step 20 120 ldr r1, =0x00000542 121 str r1, [r0] 122 123 @ step 21 124 ldr r1, =0x01000000 125 str r1, [r0] 126 127 @ step 22.1 128 ldr r1, =0x05000000 129 str r1, [r0] 130 131 @ step 22.2 132 ldr r1, =0x05000000 133 str r1, [r0] 134 135 @ step 23 136 ldr r1, =0x00000442 137 str r1, [r0] 138 139 @ step 25.1 140 ldr r1, =0x00010780 141 str r1, [r0] 142 143 @ step 25.2 144 ldr r1, =0x00010400 145 str r1, [r0] 146 147 @ step 26, repeat step14~step25 148 ldr r1, =0x07100000 149 str r1, [r0] 150 151 ldr r1, =0x01100000 152 str r1, [r0] 153 154 ldr r1, =0x00120000 155 str r1, [r0] 156 157 ldr r1, =0x00130000 158 str r1, [r0] 159 160 ldr r1, =0x00110400 161 str r1, [r0] 162 163 ldr r1, =0x00100542 164 str r1, [r0] 165 166 ldr r1, =0x01100000 167 str r1, [r0] 168 169 ldr r1, =0x05100000 170 str r1, [r0] 171 172 ldr r1, =0x05100000 173 str r1, [r0] 174 175 ldr r1, =0x00100442 176 str r1, [r0] 177 178 ldr r1, =0x00110780 179 str r1, [r0] 180 181 ldr r1, =0x00110400 182 str r1, [r0] 183 184 @ step 27 185 ldr r0, =DMC_CONCONTROL 186 ldr r1, =0x0FF02030 187 str r1, [r0] 188 189 ldr r0, =DMC_PWRDNCONFIG 190 ldr r1, =0xFFFF00FF 191 str r1, [r0] 192 193 ldr r0, =DMC_CONCONTROL 194 ldr r1, =0x00202400 195 str r1, [r0] 196 197 mov pc, lr