天天看點

詳細解析uboot移植(針對開發闆mini2440)

詳細解析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的修改!

繼續閱讀