新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM裸機開發(fā)bootloader內(nèi)存初始化

ARM裸機開發(fā)bootloader內(nèi)存初始化

作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
一、從內(nèi)部看內(nèi)存

內(nèi)存由于其訪問速度快,訪問方式簡單成為PC機與嵌入式設備不可缺少的部件。

本文引用地址:http://2s4d.com/article/201611/318212.htm

1、內(nèi)存的分類

內(nèi)存分為DRAM和SRAM,其中DRAM又包含SDRAM、DDR、DDR2。

DRAM:它的基本部件是小電容,電容可以再兩個極板上保留電荷,但是需要定期的充電(刷新),否則數(shù)據(jù)就好丟失。缺點:要進行不斷的刷新才能保持數(shù)據(jù),存取速度較慢。

SRAM:它是一種具有靜止存取功能的內(nèi)存,不需要定期刷新電路就能保持它們內(nèi)部存儲的數(shù)據(jù)。其優(yōu)點:存取的速度快;但是缺點是:功耗大,成本高。常用于存儲容量不高,但存取速度快的場合,比如stepping stone。

DRAM的分類:在嵌入式系統(tǒng)中,除了CPU內(nèi)部的墊腳石采用SRAM外,板載內(nèi)存一般會采用DRAM,而DRAM又可以分為SDRAM,DDR,DDR2等。

SDRAM(Synchronous Dynamic Random Access Memory):同步動態(tài)隨機存儲器。

同步:內(nèi)存工作需要同步時鐘,內(nèi)部命令的發(fā)送與數(shù)據(jù)的傳輸都以該時鐘為基準。

動態(tài):存儲陣列要不斷保持刷新來保證數(shù)據(jù)不丟失。

隨機:數(shù)據(jù)不是線性依次存儲,而是自由指定地址進行數(shù)據(jù)讀寫。

2440使用的是SDRAM

DDR:(Double Data Rate SDRAM),即“雙倍速率同步動態(tài)隨機存儲器”。與早起的SDRAM相比,DDR除了可以在時鐘脈沖的上升沿傳輸數(shù)據(jù),還可以在下降沿傳輸信號,這就意味著在相同的工作頻率下,DDR的理論傳輸速度為SDRAM的兩倍。DDR2則在DDR的基礎上再次進行了改進,使得數(shù)據(jù)傳輸速率在DDR的基礎上再次翻倍。

6410開發(fā)板通常采用DDR內(nèi)存

210開發(fā)板通常采用DDR2內(nèi)存

2、內(nèi)存的內(nèi)部結構

內(nèi)存的內(nèi)部結構包含三項內(nèi)容:表結構、L-Bank、尋址信息

2.1內(nèi)存的內(nèi)部如同表格,數(shù)據(jù)就存放在每個單元格中。數(shù)據(jù)讀寫時,先指定行號(行地址),再指定列號(列地址),我們就可以準確地找到所需要的單元格。而這張表格稱為:Logical Bank(L-Bank)。

由于技術、成本等原因,一塊內(nèi)存不可能把所有的單元格做到一個L-Bank,現(xiàn)在內(nèi)存內(nèi)部基本都會分割成4個L-Bank。

內(nèi)存的尋址有三個重要因素:1、L-Bank選擇信號 2、行地址 3、列地址

二、內(nèi)存初始化

1、2440

對于這部分內(nèi)容,接下來要從以下四個方面來闡述:1、地址空間2、內(nèi)存芯片的硬件連接3、存儲控制寄存器的設置4、編寫代碼進行內(nèi)存初始化設置

1、S3c2440芯片對外提供的引腳上,只給出了27根地址線Addr[0:26]。單靠芯片上的27根引腳,它只能訪問128M的外設空間。為了擴大外設的訪問范圍,S3c2440芯片又提供了8個片選信號nGCS0-nGCS7.當某個片選信號nGCSX有效時,則可以通過27根地址線去訪問對應的片選的128MB空間。由于有8個片選,所以2440芯片能訪問的外設空間總共為8*128MB=1GB。而1G(0x40000000)以上的空間,則安排給了2440內(nèi)部的寄存器,訪問這些內(nèi)部寄存器,則是通過32位的處理器內(nèi)部總線來完成的。

ARM9核不知道內(nèi)存、NorFlash、網(wǎng)卡芯片寄存器地址,而是通過存儲器控制器來進行解析,從而使得ARM核可以通過存儲控制器寄存器來設置訪問外設寄存器。

2、S3c2440有32根數(shù)據(jù)線引腳,兩片32M的內(nèi)存芯片并聯(lián)在數(shù)據(jù)線的高、低位上。所以說2440的數(shù)據(jù)是32位的。

3、設置2440存儲控制寄存器,參考2440的芯片手冊進行設置。

BWSCON 0x22000000

BANK CON0-5 保持不變,為0x00000070.因為0-5不存放內(nèi)存。只有6-7才存放了內(nèi)存。

在計算機中,RAM一般用于內(nèi)存。ROM用來存放一些硬件的驅(qū)動程序,也就是固件。

咱們平時用的U盤為Flash。它可以在相同的電壓下讀寫,且容量大,成本低。而ROM一般讀為5V,寫12V。

BANK6-7 0x18001

REFRESH 定期充電

BANKSEZE

MRSRB6-7

對以上的所有寄存器進行完初始化后,內(nèi)存控制器的所有寄存器就都進行了初始化。

4、代碼編寫:

由于數(shù)據(jù)和寄存器比較多,所以運用循環(huán)把相應的數(shù)據(jù)存入各個寄存器。

#define mem_contrl 0x48000000init_sdram:ldr r0, =mem_contrl add r3, r0, #4*13adrl r1, mem_data0:ldr r2, [r1], #4str r2, [r0], #4cmp r0, r3bne 0b /*表示向前跳轉*/mov pc, lrmem_data:.long 0x22000000 .long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00018001.long 0x00018001.long 0x008c04f5.long 0x000000b1.long 0x00000030.long 0x00000030
介紹一下匯編語言中的訪問存儲器 [r1] 就是取出r1地址處的內(nèi)容,實際就是指針操作。

6410:

1、地址空間:S3C6410處理器擁有32位地址總線,其尋址空間為4GB。其中高2G為保留區(qū),低2G區(qū)域又可分為兩部分:主存儲區(qū)和外設存區(qū)。

2、主存儲區(qū)又分為:

啟動鏡像區(qū):這個區(qū)域的作用正如它的名字所述,是用來啟動ARM系統(tǒng)的。但是這個區(qū)域并沒有固定的存儲介質(zhì)與之對應。而是通過修改啟動選項,把不同的啟動介質(zhì)映射到

該區(qū)域。比如說選擇了IROM啟動方式后,就把IROM映射到該區(qū)域。

內(nèi)部存儲區(qū):這個區(qū)域?qū)鴥?nèi)部的內(nèi)存地址,iROM和SRAM都是分布在這個區(qū)間。0x08000000-0x0bffffff對應著內(nèi)部ROM,但是IROM實際只有32KB,選擇從IROM啟動的時候,首先運行就是這里面的程序BL0,這部分代碼由三星固化。0x0c000000-ox0fffffff對應內(nèi)部SRAM,實際就是8KB的Steppingstone。

靜態(tài)存儲區(qū):這個區(qū)域用于訪問掛在外部總線上的設備,比如說NOR flash、oneNand等。這個區(qū)域被分割為6個bank,每個bank為128MB,數(shù)據(jù)寬度最大支持16bit,每個bank由片選Xm0CS[0]-Xm0CS[5]選中。

動態(tài)存儲區(qū):該區(qū)域從0x50000000-0x6fffffff,又分為2個區(qū)間,分別占256MB,可以片選Xm1CS[0]-Xm1CS[1]來進行著2個區(qū)間的選擇。我們6410開發(fā)板上256MB的DDR內(nèi)存就安排在這個區(qū)域,這也就是為什么6410的內(nèi)存地址是從0x50000000開始的原因。

2、內(nèi)存芯片的連接可以參考2440

3、代碼編寫:

由于這部分代碼量比較大,所以我把這部分單獨放在了一個文件下并命名為

mem.S,并要在makefile中做相應的修改

.text.global mem_initmem_init:@set data pin;ldr r0, =0x7e00f120 mov r1, #0x0str r1, [r0]@program memc_cmd to b100,which makes DRAM Controller enter Configstate.	ldr r0, =0x7e001004 mov r1, #0x4         str r1, [r0]ldr r0, =0x7e001010  ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) )      str r1, [r0]ldr r0, =0x7e001014  mov r1, #(3 << 1)str r1, [r0]ldr r0, =0x7e001018  mov r1, #0x1str r1, [r0]ldr r0, =0x7e00101c  mov r1, #0x2str r1, [r0]ldr r0, =0x7e001020   ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001024  ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001028  ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00102c  ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001030   ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001034   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001038   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )@  ldr r2, [r0]str r1, [r0]ldr r0, =0x7e00103c   mov r1, #0x07str r1, [r0]ldr r0, =0x7e001040   mov r1, #0x02str r1, [r0]ldr r0, =0x7e001044   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001048   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00100c   ldr r1, =0x00010012   str r1, [r0]ldr r0, =0x7e00104c   ldr r1, =0x0b45str r1, [r0]ldr r0, =0x7e001200   ldr r1, =0x150f8str r1, [r0]ldr r0, =0x7e001304   mov r1, #0x0str r1, [r0]@Issue NOPldr r0, =0x7e001008 ldr r1, =0x000c0000str r1, [r0]@prechargeallldr r1, =0x00000000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@mrsldr r1, =0x000a0000str r1, [r0]@mrsldr r1, =0x00080032str r1, [r0]ldr r0, =0x7e001004mov r1, #0x0str r1, [r0]check_dmc1_ready:ldr r0, =0x7e001000 ldr r1, [r0]mov r2, #0x3and r1, r1, r2cmp r1, #0x1bne check_dmc1_readynopmov pc, lr

210:

1、地址空間


1、210有4G的尋址空間,內(nèi)存地址從0x20000000開始,0地址處為映射區(qū),系統(tǒng)從此開始。

2、210采用的芯片是8bit的4個內(nèi)存芯片(128M)。

其中DRAM0為512M

DRAM1為1G。

警告:當編寫代碼時,如果可以保持默認值不變,就把寄存器設置為默認值。

4、代碼的編寫部分可以參考210的芯片手冊或U-Boot中的代碼。



評論


技術專區(qū)

關閉