新聞中心

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

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

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

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

本文引用地址:http://m.butianyuan.cn/article/201611/318212.htm

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

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

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

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

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

SDRAM(Synchronous Dynamic Random Access Memory):同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器。

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

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

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

2440使用的是SDRAM

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

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

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

2、內(nèi)存的內(nèi)部結(jié)構(gòu)

內(nèi)存的內(nèi)部結(jié)構(gòu)包含三項(xiàng)內(nèi)容:表結(jié)構(gòu)、L-Bank、尋址信息

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

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

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

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

1、2440

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

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

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

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

3、設(shè)置2440存儲(chǔ)控制寄存器,參考2440的芯片手冊(cè)進(jìn)行設(shè)置。

BWSCON 0x22000000

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

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

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

BANK6-7 0x18001

REFRESH 定期充電

BANKSEZE

MRSRB6-7

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

4、代碼編寫(xiě):

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

#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 /*表示向前跳轉(zhuǎn)*/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
介紹一下匯編語(yǔ)言中的訪問(wèn)存儲(chǔ)器 [r1] 就是取出r1地址處的內(nèi)容,實(shí)際就是指針操作。

6410:

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

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

啟動(dòng)鏡像區(qū):這個(gè)區(qū)域的作用正如它的名字所述,是用來(lái)啟動(dòng)ARM系統(tǒng)的。但是這個(gè)區(qū)域并沒(méi)有固定的存儲(chǔ)介質(zhì)與之對(duì)應(yīng)。而是通過(guò)修改啟動(dòng)選項(xiàng),把不同的啟動(dòng)介質(zhì)映射到

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

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

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

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

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

3、代碼編寫(xiě):

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

mem.S,并要在makefile中做相應(yīng)的修改

.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開(kāi)始,0地址處為映射區(qū),系統(tǒng)從此開(kāi)始。

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

其中DRAM0為512M

DRAM1為1G。

警告:當(dāng)編寫(xiě)代碼時(shí),如果可以保持默認(rèn)值不變,就把寄存器設(shè)置為默認(rèn)值。

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



評(píng)論


技術(shù)專區(qū)

關(guān)閉