詳細解析uboot移植(針對開發闆mini2440)
下面會對每一個步驟詳細解答,包括為什麼這樣做?版本用的是u-boot-2008.10。(不知道為什麼,新浪直接屏蔽掉所有以這種格式的注釋,是以有些内容顯示不出來,不過不影響閱讀)
我們選擇一般都是尋找最相近的進行移植,首先應該考慮選擇MCU(微型控制晶片)一樣的開發闆,如果沒有這類存在,就退而求其次,選擇MPU(微型處理晶片,即IP核)一樣的開發闆。在uboot中沒有支援S3C2440(MCU)的開發闆,就考慮MPU,S3C2440是arm920t的IP核,是以選擇相近的,鎖定目标smdk2410開發闆,它是以arm920t為核心,三星公司開發的一塊開發闆。標明目标之後就可以開始移植了。
第一步:移植一般從最頂層檔案開始,最頂層當然是Makefile了,從它開始編譯的。打開Makefile後找到下面這行字:(最左邊的是行數,這個在同類版本中有一些出入,大家找到關鍵詞就行了)
2625 smdk2400_config : unconfig:
2626 @$(MKCONFIG)$(@:_config=) arm arm920t smdk2400 NULLs3c24x0
2627
2628 smdk2410_config : unconfig
2629 @$(MKCONFIG) $(@:_config=) armarm920t smdk2410 NULL s3c24x0
2630
2631 SX1_config: unconfig
2632 @$(MKCONFIG)$(@:_config=) arm arm925t sx1
這幾行有什麼用呢?定義開發闆的名字和其他相關資訊,以smdk2410為例,即:
arm:cpu架構;
arm920t:cpu的核;
smdk2410:開發闆的名字;
NULL:開發者,這裡沒有,也可寫上你想取的名字;
S3C24X0:片上系統(Soc);
現在我們就可以知道哪些可以修改,哪些不用修改了。
這裡沒有對我們想要移植的開發闆的支援,是以應該加上,改成如下:(紅色字為修改的):
2625 smdk2400_config : unconfig:
2626 @$(MKCONFIG)$(@:_config=) arm arm920t smdk2400 NULLs3c24x0
2627
2628 smdk2410_config : unconfig
2629 @$(MKCONFIG) $(@:_config=) armarm920t smdk2410 NULL s3c24x0
2630
2631MINI2440_config : unconfig
2632@$(MKCONFIG) $(@:_config=) arm arm920t MINI2410 NULLs3c24x0
2633
2634 SX1_config: unconfig
2635 @$(MKCONFIG)$(@:_config=) arm arm925t sx1
這裡注意一點,如果你取名為MINI2440,那麼以後涉及開發闆的名字時(接下去的會講到)就必須以這個名字,而且是必須是大寫的,否則編譯時會找不到相應的檔案。
修改完頂層檔案後就開始修改其他與頂層檔案不在同一層的檔案了,我們知道uboot中很多都不需要修改,不同的大部分在于cpu以及board這兩個目錄中,為什麼呢?因為一個關于cpu架構,一個關于開發闆類型的。比如smdk2410在board中就有自己的目錄,是以建立的這個開發闆就得在board中也有自己的目錄,這個待會再講。那麼cpu呢?這裡面有自己的各種核,比如arm920t,powerPC,x86等,接下去修改的便是arm920t這個目錄,讓這個IP核也支援它的産品S3C2440。
第二步:進入/cpu/arm920t/start.S,這是一個很重要的檔案,我們根據連結腳本可以看出,程式執行都是從這個檔案開始執行的。我們講一下,當在編譯前,我們不是一般都會執行這個指令:makesmdk2410_config,這意味着待會編譯時就隻會講與smdk2410有關的檔案連結一起,是以其他不相關的不會參與編譯。那麼這個start.S裡面有哪些内容需要修改呢?我們檢視檔案不難發現,裡面有對S3C2410的支援,那麼S3C2410與S3C2440很類似,是以修改的地方就不多了,隻是添加上一些宏定義而已,源代碼如下:
136 #if defined(CONFIG_S3C2400) ||defined(CONFIG_S3C2410)
137
138
138 # ifdefined(CONFIG_S3C2400)
140 # definepWTCON 0x15300000
141 # defineINTMSK 0x14400008
142 # defineCLKDIVN 0x14800014
143 #else
144 # definepWTCON 0x53000000
145 # defineINTMSK 0x4A000008
146 # defineINTSUBMSK 0x4A00001C
147 # defineCLKDIVN 0x4C000014
148# endif
149
150 ldr r0, =pWTCON
151 mov r1, #0x0
152 str r1, [r0]
153
154
157 mov r1,#0xffffffff
158 ldr r0, =INTMSK
159 str r1, [r0]
160 # ifdefined(CONFIG_S3C2410)
161 ldr r1, =0x3ff
162 ldr r0, =INTSUBMSK
163 str r1, [r0]
164 # endif
165
166
167
168 ldr r0, =CLKDIVN
169 mov r1,#3
170 str r1, [r0]
171 #endif
現在修改這些代碼如下:
135
136 #ifdefined(CONFIG_S3C2400) ||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
137
138
139 #if defined(CONFIG_S3C2400)
140 # definepWTCON 0x15300000
141 # defineINTMSK 0x14400008
142 # defineCLKDIVN 0x14800014
143 #else
144 # definepWTCON 0x53000000
145 # defineINTMSK 0x4A000008
146 # defineINTSUBMSK 0x4A00001C
147 # defineCLKDIVN 0x4C000014
148 #endif
149
150# defineCLK_CTL_BASE 0x4C000000
151# defineMDIV_405 0x7f<<12
152# definePSDIV_405 0x21
153# defineUPLL_MDIV_48 0x38<<12
154# defineUPLL_PSDIV_48 0x22
155# defineMDIV_200 0xa1<<12
156# definePSDIV_200 0x31
157#endif
158
159 ldr r0, =pWTCON
160 mov r1, #0x0
161 str r1, [r0]
162
163
166 mov r1,#0xffffffff
167 ldr r0, =INTMSK
168 str r1, [r0]
169 #if defined(CONFIG_S3C2410)
170 ldr r1, =0x3ff
171 ldr r0, =INTSUBMSK
172 str r1, [r0]
173 #endif
174
175 #ifdefined(CONFIG_S3C2440)
176 ldr r1,=0x7fff
177 ldr r0,=INTSUBMSK
178 str r1,[r0]
179#endif
180
181 #ifdefined(CONFIG_S3C2440)
182
183
184 ldr r0, =CLKDIVN
185 mov r1,#5
186 strr1, [r0]
187 mrc p15,0,r1,c1,c0,0
188 orr r1,r1,#0xc0000000
189 mcr p15,0,r1,c1,c0,0
190
191
192 movr1,#CLK_CTL_BASE
193
194 mov r2,#UPLL_MDIV_48
195 add r2,r2,#UPLL_PSDIV_48
196 strr2,[r1,#0x08]
197
198 mov r2,#MDIV_405
199 add r2,r2,#PSDIV_405
200 str r2,[r1,#0x04]
201 #else
202
203
204 ldr r0,=CLKDIVN
205 mov r1,#3
206 str r1,[r0]
207
208 mrc p15,0,r1,c1,c0,0
209 orr r1,r1,#0xc0000000
210 mcr p15,0,r1,c1,c0,0
211
212
213 mov r1,#CLK_CTL_BASE
214
215 mov r2,#MDIV_200
216 add r2,r2,#PSDIV_200
217 str r2,[r1,#0X04]
218
219#endif
現在我們詳細講解為什麼這麼改?以便以後自己移植新的系統會修改!!
修改136行是因為讓編譯時支援S3C2440,這跟#if defined有關,關于這個關鍵詞不會的話自行查找C語言的書。
我們可以略掉S3C2400的語句,144行定義watchdog的寄存器位址,由于S3C2440與S3C2410這一寄存器位址一樣,是以無需修改的。關于這個寄存器見S3C2440手冊462頁。除了這個一樣之外還有相同的是INTMSK、INTSUBMSK、CLKDIVN,分别在S3C2440手冊的388、395、58頁。
從150行定義的都是根據實際需要修改的。因為我們要求将S3C2440設定為主頻405MHz。150行是定義寄存器基址,即從0x4c000000開始,MPLL寄存器是0x4c000004,UPLL寄存器是0x4c000008,是以有後面的“196 strr2,[r1,#0x08]”與“200 str r2,[r1,#0x04] ” ,即将r2寄存器的值傳給r1偏移8(或者4)後的位址的存儲器。這是定義CLK_CTL_BASE的用意。那麼r2裡面存的是什麼值呢?首先194行與195行的“mov r2,#UPLL_MDIV_48“”add r2,r2,#UPLL_PSDIV_48“,根據上面對UPLL_MDIV_48與
UPLL_PSDIV_48的定義,可以看出MDIV=64,為什麼要那樣定義呢?我們知道64是0x38,将其左移12位便是和UPLL寄存器定義的一樣,那麼UPLL_PSDIV_48則是PDIV和SDIV的組合,這樣就構成了UPLL寄存器的值,然後我們計算一下,這裡注意一點,UPLL與MPLL的計算公式不一樣的(前提是2440,如果是2410那麼兩者是一樣的)。UPLL=((MIDV+8)*Fin)/((PDIV+2)*2SDIV)=48MHz。是以要這樣寫。同理MPLL與此類似,隻是公式有點不一樣,MPLL=(2*(MIDV+8)*Fin)/((PDIV+2)*2SDIV)=405MHz。詳細見S3C2440手冊的235頁第7部分“clock&powermanagement“。注意這裡并沒有出現這兩個公式,具體是在/cpu/arm920t/s3c24x0/speed.c函數中出現,這會在後面修改。對于201行~217行的設定是對于沒有定義S3C2440的例外情況,其方法與前面講的類似,本可以不要的,這裡加上友善以後移植。
再回過頭來看175行,這裡是為了設定INTSUBMSK寄存器,檢視S3C2440手冊395頁可知,該寄存器15位可用且初始值都為1,是以指派0x7fff。
接下去設定分頻比,同樣檢視S3C2440手冊246頁的分頻比設定,由表可知,1:4:8對應的HDIVN是2(占用CLKDIVN的[2:1]),PDIVN是1(占用CLKDIVN的[0]),是以是0x5。這就是對于這段修改的全部解析!!!!!!至于187行~189行的則是些約定俗成的語句,不解析了。
第三步:現在跳出start.S函數,進入/cpu/arm920t/s3c24x0/interrupts.c函數。這個函數是實作中斷相關資訊的。改動之處1:源代碼如下:
33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined (CONFIG_TRAB)
34
35 #include<arm920t.h>
36 #if defined(CONFIG_S3C2400)
37 #include<s3c2400.h>
38 #elifdefined(CONFIG_S3C2410)
39 #include<s3c2410.h>
40 #endif
修改後的:
33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined (CONFIG_TRAB) ||defined (CONFIG_S3C2440)
34
35 #include<arm920t.h>
36 #if defined(CONFIG_S3C2400)
37 #include<s3c2400.h>
38 #elif defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
39 #include<s3c2410.h>
40 #endif
這些就不細說了,兩個改動是為了包含arm920t.h和s3c2410.h這兩個頭檔案。
改動之處2:源代碼:
177 #if defined(CONFIG_SMDK2400) ||defined(CONFIG_TRAB)
178 tbclk = timer_load_val * 100;
179 #elifdefined(CONFIG_SBC2410X) || \
180 defined(CONFIG_SMDK2410) || \
181 defined(CONFIG_VCMA9)
182 tbclk = CFG_HZ;
183 #else
改動之後:
177 #if defined(CONFIG_SMDK2400) ||defined(CONFIG_TRAB)
178 tbclk = timer_load_val * 100;
179 #elifdefined(CONFIG_SBC2410X) || \
180 defined(CONFIG_SMDK2410) || \
181 defined(CONFIG_MINI2440)|| \
182 defined(CONFIG_VCMA9)
183 tbclk = CFG_HZ;
184 #else
第四步:修改/cpu/arm920t/s3c24x0/speed.c函數,改動之處1:源代碼如下:
33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined (CONFIG_TRAB)
34
35 #if defined(CONFIG_S3C2400)
36 #include<s3c2400.h>
37 #elifdefined(CONFIG_S3C2410)
38 #include<s3c2410.h>
39 #endif
修改之後如下:f
33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)|| defined (CONFIG_TRAB)
34
35 #if defined(CONFIG_S3C2400)
36 #include<s3c2400.h>
37 #elifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
38 #include<s3c2410.h>
39 #endif
同樣是添加定義支援2440,不解析了。
改動之處2:便是我們上次提到修改MPLL與UPLL公式的地方。源代碼:
66 m =((r & 0xFF000) >> 12)+ 8;
67 p = ((r & 0x003F0) >>4) + 2;
68 s = r & 0x3;
69
70 return((CONFIG_SYS_CLK_FREQ * m) / (p<< s));
上面代碼僅僅支援2410的,是以我們要添加上2440的計算方法,改動如下:
66 m = ((r& 0xFF000) >> 12) +8;
67 p = ((r & 0x003F0) >>4) + 2;
68 s = r & 0x3;
69 #if defined(CONFIG_S3C2440)
70 if(pllreg==MPLL)
71 return((CONFIG_SYS_CLK_FREQ*m*2)/(p<<s));
72 else if (pllreg==UPLL)
73#endif
74 return((CONFIG_SYS_CLK_FREQ * m) / (p<< s));
上面66行、67行、68行的r是指MPLLCON(UPLLCON),m、p、s是根據我們S3C2440手冊的238頁的計算公式得來的,接下去的71行便是MPLL的頻率計算公式。你可能會問,那UPLL怎麼沒有公式呢?那是有的,在74行便定義了。因為它的計算與2410一樣,就無需畫蛇添足了!由此可見,uboot的代碼也是相當簡練的!
改動之處3:在get_HCLK(void)函數内修改HCLK的計算,源代碼:
82 S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();
83
84 return((clk_power->CLKDIVN & 0x2) ?get_FCLK()/2 : get_FCLK());
這是僅僅針對2410的,是以我們要添加定義2440的,改動如下:
82 S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();
83
84 #ifdefined(CONFIG_S3C2440)
85if(clk_power->CLKDIVN&0x6)
86 {
87 if((clk_power->CLKDIVN&0x6)==2)
88 return(get_FCLK()/2);
89 if((clk_power->CLKDIVN&0x6)==6)
90 return((clk_power->CAMDIVN&0x100)?get_FCLK()/6:get_FCLK()/3);
91 if((clk_power->CLKDIVN&0x6)==4)
92 return((clk_power->CAMDIVN&0x200)?get_FCLK()/8:get_FCLK()/4);
93return(get_FCLK());
94 }
95 elsereturn((clk_power->CLKDIVN&0x2)?get_FCLK()/2:get_FCLK());
96#endif
什麼意思呢?就是如果定義了S3C2440的話,如果CLKDIVN的[2:1]不為0的話,那麼進入判斷語句中。首先如果CLKDIVN與0x6位與等于2的話,就可以知道HCLK=FCLK/2,接下去的分析都是遵循S3C2440手冊242頁的一個表,這裡轉換成程式設計語言,你會發現這轉換的技巧很經典!!最後是如果CLKDIVN的[2:1]為0的話就執行另外一種情況。不難吧!
第五步:修改MINI2440的機器ID,這ID号必須與S3C2440提供的源碼的ID号一緻,這ID可以在源碼的/include/asm-arm/math-types.h中找到,一般都是1999,源代碼如下:
1859 #defineMACH_TYPE_GENEVA 1873
1860
1861 #ifdefCONFIG_ARCH_EBSA110
添加後如下:
1859 #defineMACH_TYPE_GENEVA 1873
1860 #defineMACH_TYPE_MINI2440 1999
1861
1862 #ifdefCONFIG_ARCH_EBSA110
第六步:修改序列槽,讓其支援2440,源代碼如下:
22 #ifdefined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_TRAB)
23
24 #ifdefined(CONFIG_S3C2400) || defined(CONFIG_TRAB)
25 #include<s3c2400.h>
26 #elifdefined(CONFIG_S3C2410)
27 #include<s3c2410.h>
28 #endif
修改宏定義,支援2440,如下:
22 #ifdefined(CONFIG_S3C2400) || defined (CONFIG_S3C2410)||defined(CONFIG_S3C2440)|| defined (CONFIG_TRAB)
23
24 #ifdefined(CONFIG_S3C2400) || defined(CONFIG_TRAB)
25 #include<s3c2400.h>
26 #elifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
27 #include<s3c2410.h>
28 #endif
第七步:驅動裡的實時時鐘代碼,以支援S3C2440。源代碼如下:
33 #ifdefined(CONFIG_S3C2400)
34 #include<s3c2400.h>
35 #elifdefined(CONFIG_S3C2410)
36 #include<s3c2410.h>
37 #endif
修改如下:
33 #ifdefined(CONFIG_S3C2400)
34 #include<s3c2400.h>
35 #elifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
36 #include<s3c2410.h>
37 #endif
第八步:修改/include/s3c24x0.h,其中有關s3c24x0的寄存器資訊以及各個單元的寄存器,比如中斷管理單元、時鐘管理單元等。改動之處1,讓中斷支援2440,源代碼如下:
85 #ifdefCONFIG_S3C2410
86 S3C24X0_REG32 SUBSRCPND;
87 S3C24X0_REG32 INTSUBMSK;
修改如下:
85 #ifdefCONFIG_S3C2410||defined(CONFIG_S3C2440)
86 S3C24X0_REG32 SUBSRCPND;
87 S3C24X0_REG32 INTSUBMSK;
改動之處2,讓DMA方式支援2440源代碼如下:
95 #ifdefCONFIG_S3C2410
S3C24X0_REG32 DISRCC;
#endif
S3C24X0_REG32 DIDST;
99 #ifdef CONFIG_S3C2410,
S3C24X0_REG32 DIDSTC;
#endif
S3C24X0_REG32 DCON;
S3C24X0_REG32 DSTAT;
S3C24X0_REG32 DCSRC;
S3C24X0_REG32 DCDST;
S3C24X0_REG32 DMASKTRIG;
#ifdef CONFIG_S3C2400
S3C24X0_REG32 res[1];
#endif
110 #ifdefCONFIG_S3C2410
S3C24X0_REG32 res[7];
#endif
修改如下:
95 #ifdef CONFIG_S3C2410||defined(CONFIG_S3C2440)
S3C24X0_REG32 DISRCC;
#endif
S3C24X0_REG32 DIDST;
99#ifdef CONFIG_S3C2410||defined(CONFIG_S3C2440)
S3C24X0_REG32 DIDSTC;
#endif
S3C24X0_REG32 DCON;
S3C24X0_REG32 DSTAT;
S3C24X0_REG32 DCSRC;
S3C24X0_REG32 DCDST;
S3C24X0_REG32 DMASKTRIG;
#ifdef CONFIG_S3C2400
S3C24X0_REG32 res[1];
#endif
110 #ifdefCONFIG_S3C2410||defined(CONFIG_S3C2440)
S3C24X0_REG32 res[7];
#endif
改動之處3:在時鐘與電源管理單元中添加2440獨有的CAMDIVN寄存器,源代碼如下:
126 S3C24X0_REG32 CLKCON;
127 S3C24X0_REG32 CLKSLOW;
128 S3C24X0_REG32 CLKDIVN;
修改後如下:
126 S3C24X0_REG32 CLKCON;
127 S3C24X0_REG32 CLKSLOW;
128 S3C24X0_REG32 CLKDIVN;
129 #ifdefined(CONFIG_S3C2440)
130 S3C24X0_REG32 CAMDIVN;
131 #endif
改動之處4:修改LCD單元子產品,增加對2440的支援,源代碼如下:
151 #ifdefCONFIG_S3C2410
152 S3C24X0_REG32 LCDINTPND;
153 S3C24X0_REG32 LCDSRCPND;
154 S3C24X0_REG32 LCDINTMSK;
155 S3C24X0_REG32 LPCSEL;
改動之後如下:
151 #ifdefCONFIG_S3C2410||defined(CONFIG_S3C2440)
152 S3C24X0_REG32 LCDINTPND;
153 S3C24X0_REG32 LCDSRCPND;
154 S3C24X0_REG32 LCDINTMSK;
155 S3C24X0_REG32 LPCSEL;
改動之處5:修改I/O口單元,以支援2440,這些都是和2410一樣的,是以我們改動時都僅僅添加宏定義就行了。源代碼如下:
407 #if defined(CONFIG_S3C2410)
408 S3C24X0_REG32 GPACON;
409 S3C24X0_REG32 GPADAT;
410 S3C24X0_REG32 res1[2];
411 S3C24X0_REG32 GPBCON;
修改後如下:
407 #if defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
408 S3C24X0_REG32 GPACON;
409 S3C24X0_REG32 GPADAT;
410 S3C24X0_REG32 res1[2];
411 S3C24X0_REG32 GPBCON;
第九步:在board目錄中建立一個目錄,取名為你的開發闆名稱:MINI2440,記住這得和你剛開始取的名字一樣,也就是說MINI2440得貫徹到底。然後拷貝smdk2410裡面的檔案進這個新檔案。進入MINI2440目錄後修改其中名為smdk2410.c的檔案名為MINI2440.c(為了免除不必要的麻煩,檔案名也取成和開發闆名字一樣的,即大寫字母)。然後修改Makefile,源代碼如下:
COBJS := smdk2410.o flash.o
SOBJS := lowlevel_init.o
改成:
COBJS:= MINI2440.o flash.o
SOBJS := lowlevel_init.o
第十步:進入/board/MINI2440/MINI2440.c,修改MINI2440目錄下的MINI2440.c,修改裡面的PLL配置,源代碼如下:
39 #elifFCLK_SPEED==1
40 #defineM_MDIV 0xA1
41 #defineM_PDIV 0x3
42 #defineM_SDIV 0x1
43 #endif
44 #define USB_CLOCK1
改為:
39 #elifFCLK_SPEED==1
40 #if defined(CONFIG_S3C2410)
41 #define M_MDIV 0xA1
42 #define M_PDIV 0x3
43 #define M_SDIV 0x1
44 #endif
45 #if defined(CONFIG_S3C2440)
46 #define M_MDIV 0x7f
47 #define M_PDIV 0x2
48 #define M_SDIV 0x1
49 #endif
上面的修改是和在/cpu/arm920t/start.S中隊時鐘的設定一樣的,詳細見上面的。
改動之處2:修改UPLL的配置,同樣這和/cpu/arm920t/start.S中UPLL的設定也是一樣的。源代碼如下:
47 #if USB_CLOCK==0
48 #define U_M_MDIV 0xA1
49 #define U_M_PDIV 0x3
50 #define U_M_SDIV 0x1
51 #elif USB_CLOCK==1
52 #define U_M_MDIV 0x48
53 #define U_M_PDIV 0x3
54 #define U_M_SDIV 0x2
55 #endif
修改後如下:
47 #elif USB_CLOCK==1
48 #ifdefined(CONFIG_S3C2410)
49#define U_M_MDIV 0x48
50#define U_M_PDIV 0x3
51#endif
52 #ifdefined(CONFIG_S3C2440)
53#define U_M_MDIV 0x38
54#define U_M_PDIV 0x2
55
56#endif
57#define U_M_SDIV 0x2
58#endif
改動之處3:為了引導核心,我們需要修改board_init中開發闆的類型,源代碼如下:
121
gd->bd->bi_arch_number =MACH_TYPE_SMDK2440;
改成如下:
gd->bd->bi_arch_number =MACH_TYPE_MINI2440;
第十一步:進入/board/MINI2440/lowlevel_init.S,修改重新整理周期,源代碼如下:
120
121 #define REFEN 0x1
122 #define TREFMD 0x0
123 #define Trp 0x0
124 #define Trc 0x3
125 #define Tchr 0x2
126 #define REFCNT 1113
修改後如下:
120
121 #define REFEN 0x1
122 #define TREFMD 0x0
123 #define Trp 0x2
124 #define Trc 0x3
125 #define Tchr 0x2
126 #define REFCNT 1012
現在講一下重新整理周期。在S3C2440手冊的210頁有關于這個的介紹,從121行到125行的設定見手冊,詳細講一下最後一個宏定義REFCNT,檢視SDRAM手冊的第1頁,有一句話“8192 refresh cycles / 64ms“,可見重新整理周期為64ms/8192=7.8125us。HCLK=101.25MHz,是以RFCNT(2048+1101.25*7.8125)=1257。
第十二步:在/include/configs/目錄下,先複制smdk2410.h,然後重新改名為MINI2440.h,然後修改MINI2440.h。改動之處1:修改宏定義,源代碼如下:
36 #define CONFIG_ARM920T 1
37 #define CONFIG_S3C2410 1
38 #define CONFIG_SMDK2410 1
修改如下:
36 #define CONFIG_ARM920T 1
37#define CONFIG_S3C2440 1
38#define CONFIG_MINI2440 1
這是定義一些宏,這些宏我們通過上面的修改知道,這些宏都用到了。
改動之處2:修改在顯示器的指令提示符,。源代碼如下:
114 #define CFG_PROMPT "SMDK2410# "
修改後如下:
114 #define CFG_PROMPT "MINI2440 # "
至此所有初步移植完成了!!!以後還有網卡與flash的修改!