S3C2410 SDRAM寄存器初始化設(shè)置
1、 BWSCON:Bus width & wait status control register總線位寬和等待狀態(tài)控制寄存器。
此寄存器用于配置BANK0 – BANK7的位寬和狀態(tài)控制,每個(gè)BANK用4位來(lái)配置,分別是:
● ST(啟動(dòng)/禁止SDRAM的數(shù)據(jù)掩碼引腳。對(duì)于SDRAM,此位置0;對(duì)于SRAM,此位置1)
● WS(是否使用存儲(chǔ)器的WAIT信號(hào),通常置0為不使用)
● DW(兩位,設(shè)置位寬。此板子的SDRAM是32位,故將DW6設(shè)為10)
特殊的是bit[2:1],即DW0,設(shè)置BANK0的位寬,又板上的跳線決定,只讀的。我這板子BWSCON可設(shè)置為0x22111110。其實(shí)只需將BANK6對(duì)應(yīng)的4位設(shè)為0010即可。
2、 BANKCON0 – BANKCON7
用來(lái)分別配置8個(gè)BANK的時(shí)序等參數(shù)。SDRAM是映射到BANK6和BANK7上的(內(nèi)存只能映射到這兩個(gè)BANK,具體映射多大的空間,可用BANKSIZE寄存器設(shè)置),所以只需參照SDRAM芯片的datasheet配置好BANK6和BANK7,BANKCON0 – BANKCON5使用默認(rèn)值0x00000700即可。
對(duì)于BANKCON6和BANKCON7中的各個(gè)位的描述:
(1)MT(bit[16:15]):設(shè)置本BANK映射的物理內(nèi)存是SRAM還是SDRAM,后面的低位就根據(jù)此MT的選擇而分開設(shè)置。本板子應(yīng)置0b11,所以只需要再設(shè)置下面兩個(gè)參數(shù)
(2)Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手冊(cè)上的薦值是0b01。我們PC的BIOS里也可以調(diào)節(jié)的,應(yīng)該玩過(guò)吧。
(3)SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位數(shù)。查閱HY57V561620CT-H芯片手冊(cè)得知此值是9,所以SCAN=0b01。
綜合以上各值,BANKCON6 – 7設(shè)為0x00018005。
3、 REFRESH:刷新控制寄存器。
此寄存器的bit[23:11]可參考默認(rèn)值,或自己根據(jù)經(jīng)驗(yàn)修改,這里用0x008e0000,關(guān)鍵是最后的Refresh Counter(簡(jiǎn)稱R_CNT,bit[10:0])的設(shè)置,2410手冊(cè)上給出了公式計(jì)算方法。SDRAM手冊(cè)上“8192 refresh cycles / 64ms”的描述,得到刷新周期為64ms/8192=7.8125us,結(jié)合公式,R_CNT=2^11 + 1 – 12 * 7.8125 = 1955。所以可得REFRESH=0x008e0000+1995=0x008e07a3。
4、 BANKSIZE:設(shè)置SDRAM的一些參數(shù)。其中BK76MAP(bit[2:0])配置BANK6/7映射的大小,可設(shè)置為010 = 128MB/128MB或001 = 64MB/64MB,只要比實(shí)際RAM大都行,因?yàn)閎ootloader和linux內(nèi)核都可以檢測(cè)可用空間的。BANKSIZE=0x000000b2。
5、 MRSRB6、MRSRB7:Mode register set register bank6/7
可以修改的只有CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的全部是固定的(fixed),故值為0x00000030。這個(gè)CAS在BIOS中應(yīng)該也設(shè)置過(guò)吧,對(duì)PC的速度提升很明顯哦J
————————————————————
1。關(guān)于CPU和SDRAM的硬件連接參考s3c2410datasheet的“MEMORY (SROM/SDRAM) ADDRESS PIN CONNECTIONS”可以得知,那么復(fù)制4K以后的代碼需要使用NANDFLASH控制器來(lái)讀取NANDFLASH,以后的實(shí)驗(yàn)中將列舉,本實(shí)驗(yàn)系統(tǒng)啟動(dòng)后將NANDFLASH開始的4K數(shù)據(jù)復(fù)制到SRAM中,然后跳轉(zhuǎn)到0地址開始執(zhí)行,然后初始化存儲(chǔ)控制器,把程序本身從SRAM中復(fù)制到SDRAM中,最后跳轉(zhuǎn)到SDRAM中運(yùn)行,程序的標(biāo)號(hào):on_sdram,這個(gè)地址在連接程序時(shí)被確定為30000010,這個(gè)是SDRAM的地址,通過(guò)ldr pc,on_sdram,程序就可以跳轉(zhuǎn)到SDRAM去了。那么on_sdram的值為什么等于31000010呢?原因在于Makefile中連接程序的命令為arm-softfloat-linux-gnu-ld -Ttext 30000000 head_yoyo.o leds_yoyo.o -o sdram_elf,意思就是代碼段的起始地址為30000000,即程序的第一條指令( bl disable_watchdog)的連接地址為30000000,其他類推,其程序標(biāo)號(hào)為on_sdram的值為30000010,雖然 bl disable_watchdog,bl memsetup, bl copy_steppingstone_to_sdram,的連接地址都在SDRAM中,但是由于他們都是位置無(wú)關(guān)的相對(duì)跳轉(zhuǎn)指令,所以可以在SRAM中運(yùn)行。
@**********************************************************
2 @ File : head_yoyo.S
3 @ 功能 : 設(shè)置SDRAM,將程序復(fù)制到SDRAM中,并跳轉(zhuǎn)到SDRAM中運(yùn)行
4 @**********************************************************
5
6 .equ
7 .equ
8 .text
9 .global _start
10 _start:
11
12
13
14
15
16
17 @*********************************************************
18 @ 子函數(shù)說(shuō)明:跳轉(zhuǎn)到SDRAM中運(yùn)行
19 @*********************************************************
20
21 on_sdram:
22
24
25
26 halt_loop:
27
28
29 @*********************************************************
30 @ 子函數(shù)說(shuō)明:關(guān)閉看門狗
31 @*********************************************************
32
33 disable_watchdog:
34
35
36
37
38
39 @*********************************************************
40 @子函數(shù)說(shuō)明:初始化內(nèi)存控制器
41 @*********************************************************
42
43 memsetup:
45
46
47 1:
48
49
50
51
52
53
54
55 @*****************************************************************
56 @子函數(shù)說(shuō)明:復(fù)制代碼到SDRAM,將SRAM中的4K數(shù)據(jù)全部復(fù)制到SDRAM,
57 @
58 @*****************************************************************
59
60 copy_steppingstone_to_sdram:
61
62
63
65
66
67
68
69
70
71 .align 4
72
73 @******************************************************
74 @存儲(chǔ)控制器13個(gè)寄存器的設(shè)置值
75 @******************************************************
76 mem_cfg_val:
77
78
79
80
81
82
84
85
86
87
88
89
說(shuō)明:
BWSCON:對(duì)應(yīng)BANK0-BANK7,每BANK使用4位。這4位分別表示:
a.STx:?jiǎn)?dòng)/禁止SDRAM的數(shù)據(jù)掩碼引腳,對(duì)于SDRAM,此位為0;對(duì)于SRAM,此位為1。有原理圖可知Not using UB/LB (The pins are dedicated nWBE[3:0])。
b.WSx:是否使用存儲(chǔ)器的WAIT信號(hào),通常設(shè)為0
c.DWx:使用兩位來(lái)設(shè)置存儲(chǔ)器的位寬:00-8位,01-16位,10-32位,11-保留。
d.比較特殊的是BANK0對(duì)應(yīng)的4位,它們由硬件跳線決定,只讀。
對(duì)于本開發(fā)板,使用兩片容量為32Mbyte、位寬為16的SDRAM組成容量為64Mbyte、位寬為32的存儲(chǔ)器,所以其BWSCON相應(yīng)位為: 0010。對(duì)于本開發(fā)板,BWSCON可設(shè)為0x22111110:其實(shí)我們只需要將BANK6對(duì)應(yīng)的4位設(shè)為0010即可,其它的是什么值沒(méi)什么影響,這個(gè)值是參考手冊(cè)上給出的。
BANKCON0-BANKCON5:我們沒(méi)用到,使用默認(rèn)值0x00000700;
BANKCON6-BANKCON7:設(shè)為0x00018005 在8個(gè)BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7與BANKCON0-5有點(diǎn)不同:
a.MT([16:15]):用于設(shè)置本BANK外接的是SRAM還是SDRAM:SRAM-0b00,SDRAM-0b11
b.當(dāng)MT=0b11時(shí),還需要設(shè)置兩個(gè)參數(shù):
Trcd([3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),由于使用的是HY57V561620(L)T-H,查看其手冊(cè)具體在“DEVICE OPERATING OPTION TABLE”,在100M的工作頻率下的推薦值為3clocks,所以設(shè)為推薦值0b01。
SCAN([1:0]):SDRAM的列地址位數(shù),(00 = 8-bit,01 = 9-bit,10= 10-bit)對(duì)于本開發(fā)板使用的SDRAM HY57V561620(L)T-H(Column Address : CA0 ~ CA8),列地址位數(shù)為9,所以SCAN=0b01。
如果使用其他型號(hào)的SDRAM,您需要查看它的數(shù)據(jù)手冊(cè)來(lái)決定SCAN的取值:00-8位,01-9位,10-10位.
REFRESH:設(shè)為0x008e0000+ R_CNT 其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,它的取值可如下計(jì)算(SDRAM時(shí)鐘頻率就是HCLK):
R_CNT = 2^11 + 1 – SDRAM時(shí)鐘頻率(MHz) * SDRAM刷新周期(uS)
在未使用PLL時(shí),SDRAM時(shí)鐘頻率等于晶振頻率12MHz;
SDRAM 的刷新周期在SDRAM的數(shù)據(jù)手冊(cè)上有標(biāo)明,在本開發(fā)板使用的SDRAM HY57V561620(L)-H的數(shù)據(jù)手冊(cè)上,可看見(jiàn)這么一行“8192 refresh cycles / 64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。
對(duì)于本實(shí)驗(yàn),R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955, REFRESH=0x008e0000 + 1955 = 0x008e07a3
Trp([21:20]):設(shè)置為0即可
Tsrc([19:18]):設(shè)置默認(rèn)值即可。
BANKSIZE:
位[7]=1:Enable burst operation (0=ARM核禁止突發(fā)傳輸,1=ARM核支持突發(fā)傳輸)
位[5]=1:SDRAM power down mode enable(0=不使用SCKE信號(hào)令SDRAM進(jìn)入省電模式,1=使用SCKE信號(hào)令SDRAM進(jìn)入省電模式)
位[4]=1:SCLK is active only during the access (recommended)
位 [2:1]=010:BANK6、BANK7對(duì)應(yīng)的地址空間與BANK0-5不同。BANK0-5的地址空間都是固定的128M,地址范圍是 (x*128M)到(x+1)*128M-1,x表示0到5。但是BANK7的起始地址是可變的,您可以從S3C2410數(shù)據(jù)手冊(cè)第5章“Table 5-1. Bank 6/7 Addresses”中了解到BANK6、7的地址范圍與地址空間的關(guān)系。本開發(fā)板僅使用BANK6的64M空間,我們可以令位 [2:1]=010(128M/128M)或001(64M/64M):這沒(méi)關(guān)系,多出來(lái)的空間程序會(huì)檢測(cè)出來(lái),不會(huì)發(fā)生使用不存在的內(nèi)存的情況——后面介紹到的bootloader和linux內(nèi)核都會(huì)作內(nèi)存檢測(cè)。
位[6]、位[3]沒(méi)有使用。
MRSRBx:
能讓我們修改的只有位[6:4](CL=CAS latency,查看SDRAM的DATASHEET)這是SDRAM時(shí)序的一個(gè)時(shí)間參數(shù),SDRAM 不支持CL=1的情況,所以位[6:4]取值為010(CL=2)或011(CL=3)。開發(fā)板保守的值為0b11。
NOTE:
In Power_OFF mode, SDRAM has to enter SDRAM self-refresh mode.
1
18
19 #define rGPFCON
20 #define rGPFDAT
23 #define GPF5_OUTP
24 #define GPF6_OUTP
25 #define GPF7_OUTP
26
27 void wait(unsigned long time)
28 {
29
30 }
31
32 int main()
33 {
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 }
評(píng)論