close

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 開發板提供之相關資料

 

arrow
arrow
    全站熱搜

    iammic 發表在 痞客邦 留言(0) 人氣()