概述與sdram執行
按照友善之臂說明書,安裝好arm-linux-gcc4.4.3,我的編譯器目錄是/home/sun/study/crosstools/4.4.3/ ,我所用的開發環境為linux發行版 ubuntu10.10。
二. 啟動**問題[cpp]view plain
copy
_text_base:
.word text_base
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads smrdata out of flash rather than memory ! */
ldr r0, =smrdata @取smadata的絕對位址
ldr r1, _text_base @text_base = 0x33f80000 所以r1 = 0x33f80000
sub r0, r0, r1
ldr r1, =bwscon /* bus width status controller */
add r2, r0, #13*4
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
/* everything is fine now */
mov pc, lr
.ltorg
/* the literal pools origin */
smrdata:
.word (0+(b1_bwscon<<4)+(b2_bwscon<<8)+(b3_bwscon<<12)+(b4_bwscon<<16)+(b5_bwscon<<20)+(b6_bwscon<<24)+(b7_bwscon<<28))
.word ((b0_tacs<<13)+(b0_tcos<<11)+(b0_tacc<<8)+(b0_tcoh<<6)+(b0_tah<<4)+(b0_tacp<<2)+(b0_pmc))
.word ((b1_tacs<<13)+(b1_tcos<<11)+(b1_tacc<<8)+(b1_tcoh<<6)+(b1_tah<<4)+(b1_tacp<<2)+(b1_pmc))
.word ((b2_tacs<<13)+(b2_tcos<<11)+(b2_tacc<<8)+(b2_tcoh<<6)+(b2_tah<<4)+(b2_tacp<<2)+(b2_pmc))
.word ((b3_tacs<<13)+(b3_tcos<<11)+(b3_tacc<<8)+(b3_tcoh<<6)+(b3_tah<<4)+(b3_tacp<<2)+(b3_pmc))
.word ((b4_tacs<<13)+(b4_tcos<<11)+(b4_tacc<<8)+(b4_tcoh<<6)+(b4_tah<<4)+(b4_tacp<<2)+(b4_pmc))
.word ((b5_tacs<<13)+(b5_tcos<<11)+(b5_tacc<<8)+(b5_tcoh<<6)+(b5_tah<<4)+(b5_tacp<<2)+(b5_pmc))
.word ((b6_mt<<15)+(b6_trcd<<2)+(b6_scan))
.word ((b7_mt<<15)+(b7_trcd<<2)+(b7_scan))
.word ((refen<<23)+(trefmd<<22)+(trp<<20)+(trc<<18)+(tchr<<16)+refcnt)
.word 0x32
.word 0x30
.word 0x30
[cpp]view plain
copy
_text_base:
.word 0x33f80000
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads smrdata out of flash rather than memory ! */
ldr r0, =smrdata @取smrdata的絕對位址
ldr r1, =lowlevel_init @取lowlevel_init的絕對位址
sub r0, r0, r1 @相減之後,r0裡儲存的是smrdata相對與lowlevel_init標號的偏移
/* r3 <- current position of code */
add r0, r0, r3 @加上偏移之後就是smrdata的真實位址
ldr r1, =bwscon /* bus width status controller */
add r2, r0, #13*4
以上修改之後u-boot就可以在記憶體中執行了,我們的啟動**也可以在記憶體中執行了。這個修改是友善之臂u-boot移植文件修改的,我感覺這樣做有點羅嗦了,直接乙個adr r0,smrdata就可以取到他的相對位址,事實證明的確是這樣。所以這段程式就是這樣了:
[cpp]view plain
copy
lowlevel_init:
adr r0, smrdata
ldr r1, =bwscon /* bus width status controller */
add r2, r0, #13*4
接下來就寫乙個小小的測試程式,驗證一下。就像程式設計師每次學習新語言時,第乙個跑的程式都是hello world!一樣,我們搞嵌入式的每次在新的架構上執行的都是流水燈。以下是流水燈的程式:
[cpp]view plain
copy
//延時函式
void delay(int a)
int main(void)
//返回
for (i=0;i<3;i++)
}
}
注:編譯成功後的**在我的資源裡:
nand flash裸機程式
開發板 mini2440 nand flash k9f2g08u0b2,56m arm處理器裸機開發實戰 機制而非策略 知識點梳理 頁的絕對位址與相對位址 在nand.c中有乙個函式void rdnf2sdram 它的功能是將nand flah的內容複製到sdram,如下 nand flash的頁讀...
uarts裸機程式
硬體平台 jz2440 實現功能 向串列埠軟體實現輸出putchar函式 start.s 設定堆疊,關閉看門狗,初始化時鐘,初始化sdram init.c 初始化函式 uart.c 初始化串列埠暫存器 uart.h main.c start.s原始碼 extern main text global ...
Nand Flash 裸機程式
硬體平台 jz2440 實現功能 初始化 nand flash 和 sdram,並將 從 nand flash 拷貝到 sdram。start.s 上電初始化 nand 與sdram nand.c nand flash 初始化函式 sdram.c sdram 初始化函式 leds.c led 閃爍 ...