1. 程式人生 > >儲存管理器

儲存管理器

cpu配置儲存管理器
cpu讀操作發命令給儲存管理器,儲存管理器根據配置讀取資料

Nand Flash啟動方式,開機片內sram拷貝nand flash前4k執行,在這4k的程式裡需要完成sram->sdram跳轉


s3c2440有8個BANK,即8個片選訊號,直連可以接8個記憶體類外設
SDRAM,Nor Flash,網絡卡等等


BANK6 BANK7 可以接 SDRAM


地址線
資料線 8/16/32
時鐘/頻率
晶片相關


SDRAM:位寬,列/行,重新整理週期,BANK


1,上電,NandFlash前4k硬體自動拷貝到片內SRAM,然後從SRAM的0地址開始執行
2,程式:關看門狗,初始化儲存管理器
3,SRAM中,把程式碼從NandFlash(從#00000000開始)拷到SDRAM(從#30000000開始),繼續執行


.align 4
mem_cfg_val:
    @ 儲存控制器13個暫存器的設定值
    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3  
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5
    .long   0x00018005      @ BANKCON6
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6
    .long   0x00000030      @ MRSRB7


用SDRAM需配置13個暫存器,以下逐個來看:
1、 BWSCON:Bus width & wait status control register匯流排位寬和等待狀態控制暫存器。
此暫存器用於配置BANK0 – BANK7的位寬和狀態控制,每個BANK用4位來配置,分別是:
● ST(啟動/禁止SDRAM的資料掩碼引腳。對於SDRAM,此位置0;對於SRAM,此位置1)
● WS(是否使用儲存器的WAIT訊號,通常置0為不使用)
● DW(兩位,設定位寬。此板子的SDRAM是32位,故將DW6設為10)
特殊的是bit[2:1],即DW0,設定BANK0的位寬,又板上的跳線決定,只讀的。我這板子BWSCON可設定為0x22111110。其實只需將BANK6對應的4位設為0010即可。
2、 BANKCON0 – BANKCON7
用來分別配置8個BANK的時序等引數。SDRAM是對映到BANK6和BANK7上的(記憶體只能對映到這兩個BANK,具體對映多大的空間,可用BANKSIZE暫存器設定),所以只需參照SDRAM晶片的datasheet配置好BANK6和BANK7,BANKCON0 – BANKCON5使用預設值0x00000700即可。
對於BANKCON6和BANKCON7中的各個位的描述:
(1)MT(bit[16:15]):設定本BANK對映的實體記憶體是SRAM還是SDRAM,後面的低位就根據此MT的選擇而分開設定。本板子應置0b11,所以只需要再設定下面兩個引數
(2)Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手冊上的薦值是0b01。我們PC的BIOS裡也可以調節的,應該玩過吧。
(3)SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位數。查閱HY57V561620CT-H晶片手冊得知此值是9,所以SCAN=0b01。
綜合以上各值,BANKCON6 – 7設為0x00018005。
3、 REFRESH:重新整理控制暫存器。
此暫存器的bit[23:11]可參考預設值,或自己根據經驗修改,這裡用0x008c0000,關鍵是最後的Refresh Counter(簡稱R_CNT,bit[10:0])的設定,2410手冊上給出了公式計算方法。SDRAM手冊上“8192 refresh cycles / 64ms”的描述,得到重新整理週期為64ms/8192=7.8125us,結合公式,R_CNT=2^11 + 1 – 12 * 7.8125 = 1955。所以可得REFRESH=0x008c0000+1995=0x008c07a3。
4、 BANKSIZE:設定SDRAM的一些引數。其中BK76MAP(bit[2:0])配置BANK6/7對映的大小,可設定為010 = 128MB/128MB或001 = 64MB/64MB,只要比實際RAM大都行,因為bootloader和linux核心都可以檢測可用空間的。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。這個CAS在BIOS中應該也設定過吧,對PC的速度提升很明顯哦J
    至此,13個暫存器全部配置好了,下面就可以把程式碼複製到SDRAM中執行了,同樣的程式速度要比片內SRAM執行的慢不少。

.text
.global _start
_start:
ldr r0,=0x56000010 @ WatchDog地址,r0不能mov賦值,但可以ldr賦值
mov r1,#0x00000000
str r1,[r0] @ 關閉WatchDog
bl meminit
bl memcopy
ldr pc,=ready @ ldr與adrl的區別,ldr:絕對地址(需要=號),adrl:相對地址(不需要=號)

ready:
ldr sp,=0x34000000
bl main

memcopy:
mov r1,#0x00000000
@ Nand Flash起始地址
mov r2,#0x30000000 @ SDRam起始地址
mov r3,#0x00001000 @ 4K的大小
1:
ldr r4,[r1],#4
str r4,[r2],#4 @ [r1] = [r2] , r1 += 4 , r2 += 4
cmp r1,r3
bne 1b
mov pc,lr


meminit:
mov r1,#0x48000000 @ 記憶體控制器地址
adrl r2,meminitdata
add r3,r1,#52 @ 4 * 13 = 52
1:
ldr r4,[r2],#4
str r4,[r1],#4 @ [r1] = [r2] , r1 += 4 , r2 += 4
cmp r1,r3
bne 1b
mov pc,lr @ 地址暫存器間可以直接mov操作



.align 4
meminitdata:
.long   0x22011110      @ BWSCON
.long   0x00000700      @ BANKCON0
.long   0x00000700      @ BANKCON1
.long   0x00000700      @ BANKCON2
.long   0x00000700      @ BANKCON3  
.long   0x00000700      @ BANKCON4
.long   0x00000700      @ BANKCON5
.long   0x00018005      @ BANKCON6
.long   0x00018005      @ BANKCON7
.long   0x008C07A3      @ REFRESH
.long   0x000000B1      @ BANKSIZE
.long   0x00000030      @ MRSRB6
.long   0x00000030      @ MRSRB7