ARM裸機(jī)開(kāi)發(fā)bootloader內(nèi)存初始化
內(nèi)存由于其訪問(wèn)速度快,訪問(wèn)方式簡(jiǎn)單成為PC機(jī)與嵌入式設(shè)備不可缺少的部件。
本文引用地址:http://m.butianyuan.cn/article/201611/318212.htm1、內(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)論