S3C2440 中Memory Controller提供 8個Bank(0~7),可以用來連接外部設備,如SRAM、Nor Flash、Nand Flash、乙太網路,其中 SDRAM 是使用 Bank 6、Bank7,而 Nor Flash 則使用了Bank 0,當不使用 Nand Flash 啟動時,連接Bank 0的 Rom會 Map到 0x00000000,為 Boot Rom (可接 Nor Flash)。
使用Bank6、Bank7 連接SROM、SDRAM 時,當DATA BUS 32 bit 時,由Addr 2 腳開始接起。
JZ2440 開發板外接了 2 顆 32MB 的SDRAM,會使用到 Bank Address 接腳為 Addr 24、Addr 25。
JZ2440 開發板在 Bank 6 連接了2顆 32MB SDRAM,以下為接線圖。
初始化SDRAM 會使用到的 Register 介紹:
設定BWSCON 中的 Bank 6 Data Bus Width 為 32 bit。
BANKCON6:( JZ2440 開發板使用EM63A165TS-6G 記憶體 IC )
1. SCAN [1:0]:EM63A165TS-6G使用 Column Address 為 A0~A8(9bit)。
2. Trcd[3:2] :設為 3 clocks。
3. Tacc[10:8]:初始值為 111,這裡加快 Access cycle,設為 1 clock。
4. MT[16:15]:為預設值 Sync. DRAM
設定值設為11000000000000101 (18005)
REFRESH:
Refresh Counter計算方式如下
SDRAM 更新周期為 7.8μs,HCLK 為 12MHz (沒有使用 PLL)
2 的 11 次方 +1-12x7.8=1955.4
這裡將 Refresh Counter 設為 1955 其餘使用預設值。
BANKSIZE:
BK76MAP:由於 BANK6 與BANK7 可以用來連接 SDRAM,且空間也依照 SDRAM 大小不同,對應的位址也不同,JZ2440開發板 BANK 6提供了64MB SDRAM,所以 BK76MAP設定001。
SCLK_EN:設定為 1,僅在需要存取SDRAM 時發出 SCLK 訊號。
SCKE_EN:設定為1,輸出 SCKE 信號,使SDRAM 進入省電模式。
BURST_EN:設定為1,支持ARM 突發操作 SDRAM。
MRSRB6:
JZ2440 開發板上的 SDRAM (EM63A165TS-6G) CL僅支援 2 clocks與 3 clocks,此處 CL 設為 011。
程式:將 SDRMA 初始化後,進行 SDRAM 資料讀寫,讀寫成功 LED 則亮。
@************************************************************ @ File:sdram.S @************************************************************ .text .global _start _start: bl disable_watch_dog @ 關閉 WATCHDOG bl memsetup @ 初始化 SDRAM bl check_sdram @ Check SDRAM 讀寫 halt_loop: b halt_loop disable_watch_dog: mov r1,#0x53000000 mov r2,#0x0 str r2,[r1] mov pc,lr @ 返回
check_sdram: ldr r0,=0x30000000 @ SDRAM 開始處 mov r1,#0x1 str r1,[r0] @ 將 0x1 資料寫入 0x30000000 ldr r2,[r0] @ 取出 0x30000000 記憶體資料 cmp r2,#0x1 @ 比較 r2 = 0x1 bne 1f @ 不等於往後跳至 1 處 ldr r0,=0x56000050 @ R0 設為 GPFCON Register mov r1,#0x00000400 @ 0000 0100 0000 0000 [11:10] 為 01 str r1,[r0] @ 設定 GPFCON GPF5 [11:10] 為 01 Output 模式 ldr r0,=0x56000054 @ R0 設為 GPFDAT Register mov r1,#0x00000000 @ R1 設為 0x00000000 str r1,[r0] @設定 GPFDAT [7:0] 為 0,Output 低電位 LED 亮 1: mov pc, lr @ 返回
memsetup: adrl r2, mem_cfg_val ldr r1,=0x48000000 @ BWSCON Register ldr r4,[r2], #4 @ 讀取設定值,並讓 r2 加 4 str r4,[r1] ldr r1,=0x4800001C @ BANKCON6 Register ldr r4,[r2], #4 @ 讀取設定值,並讓 r2 加 4 str r4,[r1] ldr r1,=0x48000024 @ REFRESH Register ldr r4,[r2], #4 @ 讀取設定值,並讓 r2 加 4 str r4,[r1] ldr r1,=0x48000028 @ BANKSIZE Register ldr r4,[r2], #4 @ 讀取設定值,並讓 r2 加 4 str r4,[r1] ldr r1,=0x4800002C @ MRSRB6 Register ldr r4,[r2], #4 @ 讀取設定值,並讓 r2 加 4 str r4,[r1] mov pc, lr @ 返回 .align 4 mem_cfg_val: @初始化 SDRAM 設定值 .long 0x22011110 @ BWSCON .long 0x00018005 @ BANKCON6 .long 0x008C07A3 @ REFRESH .long 0x000000B1 @ BANKSIZE .long 0x00000030 @ MRSRB6 |
Makefile:
sdram.bin : sdram.S arm-linux-gcc -c -o sdram.o sdram.S arm-linux-ld -Ttext 0x00000000 sdram.o -o sdram_elf arm-linux-objcopy -O binary -S sdram_elf sdram.bin arm-linux-objdump -D -m arm sdram_elf > sdram.dis clean: rm -f sdram.dis sdram.bin sdram_elf *.o |
參考資料:
JZ2440 開發板提供之相關資料