下面會對每乙個步驟詳細解答,包括為什麼這樣做?版本用的是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 異丙醇 它可溶於水 乙...
烈火戰道土職業詳細解析
以強大的精神力作為自身基礎的就是道士了,擁有 術的技能。對大自然的一切都異常熟悉,用毒更是一流,博學多才劍術和魔法樣樣精通。任何時刻都能發揮多樣的法術。道士 以長時間鍛鍊的內功為基礎,發揮強大魔法攻擊的就是法師職業了。體力相當弱,收到普通攻擊時的防禦力相當脆弱,另外發揮高階的魔法技能時則需要較長的時...