詳細解析mini2440uboot移植

2023-02-02 10:27:02 字數 5685 閱讀 2870

下面會對每乙個步驟詳細解答,包括為什麼這樣做?版本用的是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 null s3c24x0

2627

2628 smdk2410_config : unconfig

2629 @$(mkconfig) $(@:_config=) arm arm920t smdk2410 null s3c24x0

2630

2631 sx1_configunconfig

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 null s3c24x0

2627

2628 smdk2410_config : unconfig

2629 @$(mkconfig) $(@:_config=) arm arm920t smdk2410 null s3c24x0

2630/*modified by mike,we let it support the developed board of mini2440*/

2631 mini2440_config : unconfig

2632 @$(mkconfig) $(@:_config=) arm arm920t mini2410 null s3c24x0

2633

2634 sx1_configunconfig

2635 @$(mkconfig) $(@:_config=) arm arm925t sx1

這裡注意一點,如果你取名為mini2440,那麼以後涉及開發板的名字時(接下去的會講到)就必須以這個名字,而且是必須是大寫的,否則編譯時會找不到相應的檔案。

修改完頂層檔案後就開始修改其他與頂層檔案不在同一層的檔案了,我們知道uboot中很多都不需要修改,不同的大部分在於cpu以及board這兩個目錄中,為什麼呢?因為乙個關於cpu架構,乙個關於開發板型別的。比如smdk2410在board中就有自己的目錄,所以新建的這個開發板就得在board中也有自己的目錄,這個待會再講。

那麼cpu呢?這裡面有自己的各種核,比如arm920t,powerpc,x86等,接下去修改的便是arm920t這個目錄,讓這個ip核也支援它的產品s3c2440。

第二步:進入/cpu/arm920t/這是乙個很重要的檔案,我們根據鏈結指令碼可以看出,程式執行都是從這個檔案開始執行的。我們講一下,當在編譯前,我們不是一般都會執行這個命令:

make smdk2410_config,這意味著待會編譯時就只會講與smdk2410有關的檔案鏈結一起,所以其他不相關的不會參與編譯。那麼這個裡面有哪些內容需要修改呢?我們檢視檔案不難發現,裡面有對s3c2410的支援,那麼s3c2410與s3c2440很類似,所以修改的地方就不多了,只是新增上一些巨集定義而已,源**如下:

136 #if defined(config_s3c2400) || defined(config_s3c2410)

137 /* turn off the watchdog */

138138 # if defined(config_s3c2400)

140 # define pwtcon 0x15300000

141 # define intmsk 0x14400008 /* interupt-controller base addresses */

142 # define clkdivn 0x14800014 /* clock divisor register */

143 #else

144 # define pwtcon 0x53000000

145 # define intmsk 0x4a000008 /* interupt-controller base addresses */

146 # define intsubmsk 0x4a00001c

147 # define clkdivn 0x4c000014 /* clock divisor register */

148# endif

149150 ldr r0, =pwtcon

151 mov r1, #0x0

152 str r1, [r0]

153154 /*

155 * mask all irqs by setting all bits in the intmr - default

156 */

157 mov r1, #0xffffffff

158 ldr r0, =intmsk

159 str r1, [r0]

160 # if defined(config_s3c2410)

161 ldr r1, =0x3ff

162 ldr r0, =intsubmsk

163 str r1, [r0]

164 # endif

165166 /* fclk:hclk:pclk = 1:2:4 */

167 /* default fclk is 120 mhz ! */

168 ldr r0, =clkdivn

169 mov r1, #3

170 str r1, [r0]

171 #endif /* config_s3c2400 || config_s3c2410 */

現在修改這些**如下:

135 /*modified by mike,add the 2440,close the watchdog*/

136 #if defined(config_s3c2400) || defined(config_s3c2410)||defined(config_s3c2440)

137 /* turn off the watchdog */

138139 #if defined(config_s3c2400)

140 # define pwtcon 0x15300000

141 # define intmsk 0x14400008 /* interupt-controller base addresses */

142 # define clkdivn 0x14800014 /* clock divisor register */

143 #else

144 # define pwtcon 0x53000000

145 # define intmsk 0x4a000008 /* interupt-controller base addresses */

146 # define intsubmsk 0x4a00001c

147 # define clkdivn 0x4c000014 /* clock divisor register */

148 #endif

149150 # define clk_ctl_base 0x4c000000

151 # define mdiv_405 0x7f<<12

152 # define psdiv_405 0x21

153 # define upll_mdiv_48 0x38<<12

154 # define upll_psdiv_48 0x22

155 # define mdiv_200 0xa1<<12

156 # define psdiv_200 0x31

157 #endif

158159 ldr r0, =pwtcon

160 mov r1, #0x0

161 str r1, [r0]

162163 /*

164 * mask all irqs by setting all bits in the intmr - default

165 */

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

174175 #if defined(config_s3c2440)

176 ldr r1,=0x7fff

177 ldr r0,=intsubmsk

178 str r1,[r0]

179 #endif

180/*modify the clock*/

181 #if defined(config_s3c2440)

182 /* fclk:hclk:pclk = 1:4:8 */

183184 ldr r0, =clkdivn

185 mov r1, #5

186 str r1, [r0]

187 mrc p15,0,r1,c1,c0,0 /*read ctrl register*/

188 orr r1,r1,#0xc0000000 /*asynchronous*/

189 mcr p15,0,r1,c1,c0,0 /*write ctrl register*/

190191 /*now, the cpu clock is 405mhz*/

鎖合底結構詳細解析

舌 寬 2 b 紙張厚度 快速鎖合底結構解析 快速鎖合底,英文名 snap lock bottom 一般通稱其為 1.2.3底 意思是該盒底的鎖合就分1 2 3步。1.2.3.底結構簡單 美觀 經濟,有一定的強度和密封性,是目前包裝紙盒中運用最為普遍的鎖合底結構,造價也比自動鎖合底低。廣泛得運用於化...

溶劑術語的詳細解析彙總

在印刷過程中我們常用到的溶劑術語基本如下 1 環己酮 具有非常好的溶解效能,除了可溶解部分天然樹脂外,對許多合成樹脂都能溶解,並且可與絕大多數有機溶劑互溶,是溶劑揮發型油墨的良好溶劑。2 甲乙酮 它基本與丙酮相似,但閃點較高,蒸發速度較慢,可溶於水 乙醇 乙醚和烴類 油類。3 異丙醇 它可溶於水 乙...

烈火戰道土職業詳細解析

以強大的精神力作為自身基礎的就是道士了,擁有 術的技能。對大自然的一切都異常熟悉,用毒更是一流,博學多才劍術和魔法樣樣精通。任何時刻都能發揮多樣的法術。道士 以長時間鍛鍊的內功為基礎,發揮強大魔法攻擊的就是法師職業了。體力相當弱,收到普通攻擊時的防禦力相當脆弱,另外發揮高階的魔法技能時則需要較長的時...