ARM 儲存控制器

2021-06-07 23:42:31 字數 4686 閱讀 7384

初入領悟:

1、 bank、l-bank的概念

2、 s3c2440內部管理sdram暫存器配置

frist part:原理分析

s3c2440為32位微處理器,其可訪問空間為4g;但其中提供1g外設訪問空間,這1g空間有8個bank組成;及平均每個bank有128m的訪問空間;其中8bank的特性為:

1、 bank0~bank5支援外接sram、rom等,bank6、bank7支援外接sram、rom與sdram等;

2、 bank0~bank6的起始位址是固定

3、 bank7的起始位址可程式設計設定

4、 bank6、bank7大小可程式設計確定

5、 每個bank訪問週期均可程式設計設定

6、 外接sdram是支援自重新整理與省電模式

左邊為nor flash下;右邊為nand flash;

說到此又想起一概念,就是有關於nor flash與nand flash啟動方式;

一、norflash啟動

簡而言之,既是nor flash啟動模式下cpu啟動會執行位址0x00000000的指令此指令在使能了nor flash下是就是nor flash的首位址;其中原因為nor flash支援一種名為xip的執行機制;

二、nandflash啟動

nand flash下不支援xip因此在執行nandflash的程式是,系統將會把nandflash的頭4k(最大)啟動**拷貝至系統sram中既s3c2440中的steppingstone;

我使用的是gt2440開發板從原理圖中可知:

bank6外接2片h57v2562gtr晶元;

在使用sdram時要設定到如下13個暫存器的操作:

各個暫存器值的設定參考開發板每乙個bank所接的外設進行設定;

.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

(.long 彙編中詞法,既long資料型)

second part:程式編寫

現在開始編寫**,如我上訴一樣啟動時cpu將會報前4k程式拷貝至steppingstone中執行;現在編寫的**任務為將steppingstone中的**拷貝回sdram中,並程式從sdram中開始執行;

彙編部分:

.equ       mem_ctl_base,       0x48000000

.equ       sdram_base,         0x30000000

.text

.global _start

_start:

bl  disable_watch_dog               @ 關閉watchdog,否則cpu會不斷重啟

bl  memsetup                        @ 設定儲存控制器

bl  copy_steppingstone_to_sdram     @ 複製**到sdram中

ldr pc,=on_sdram                   @ 跳到sdram中繼續執行

on_sdram:

ldr sp, =0x34000000                 @ 設定堆疊

bl  main

halt_loop:

b   halt_loop

disable_watch_dog:

@ 往watchdog暫存器寫0即可

movr1,     #0x53000000

movr2,     #0x0

strr2,     [r1]

movpc,     lr                      @返回

copy_steppingstone_to_sdram:

@ 將steppingstone的4k資料全部複製到sdram中去

@steppingstone起始位址為0x00000000,sdram中起始位址為0x30000000

mov r1, #0

ldr r2,=sdram_base

mov r3,#4*1024

1: 

ldr r4,[r1],#4     @ 從steppingstone讀取4位元組的資料,並讓源位址加4

str r4,[r2],#4     @ 將此4位元組的資料複製到sdram中,並讓目地位址加4

bne1b              @ 若沒有複製完,繼續

movpc,     lr      @ 返回

memsetup:

@ 設定儲存控制器以便使用sdram等外設

movr1,     #mem_ctl_base       @ 儲存控制器的13個暫存器的開始位址

adrl    r2, mem_cfg_val         @ 這13個值的起始儲存位址

addr3,     r1, #52             @ 13*4 = 54

1: 

ldrr4,     [r2], #4            @ 讀取設定值,並讓r2加4

strr4,     [r1], #4            @ 將此值寫入暫存器,並讓r1加4

cmpr1,     r3                  @ 判斷是否設定完所有13個暫存器

bne1b                          @ 若沒有寫成,繼續

movpc,     lr                  @ 返回

.align 4                            @arm位址指標對齊偽指令

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

c函式部分:

#define	gpfcon		(*(volatile unsigned long *)0x56000050)

#define gpfdat (*(volatile unsigned long *)0x56000054)

#define gpf4_out (1<

#define gpf5_out (1<

#define gpf6_out (1<

void wait(volatile unsigned long dly)

int main(void)

return 0;

}

最後一步:makefile

sdram.bin : head.s leds.c

arm-linux-gcc  -c -o head.o head.s

arm-linux-gcc -c -oleds.o leds.c

arm-linux-ld -ttext0x30000000 head.o leds.o -o sdram_elf

arm-linux-objcopy -obinary -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

原理概念純屬個人見解,可能存在一定的不嚴謹性。

儲存控制器

嵌入式linux學習筆記 三 儲存控制器 一 使用儲存控制器訪問外設的原理 1 s3c2440的位址空間 s3c2440對外引出27根位址線addr0 addr26,訪問範圍只有128mb,cpu對外還引出8根片選訊號ngcs0 ngcs7,對應bank0 bank7,當訪問bankx的位址空間時,...

儲存控制器

在s3c2410 s3c2440中,儲存控制器提供了訪問外設 所需的訊號。其中,位址線addr0 addr26的訪問範圍為128m,此外cpu還對外引出了8根片選訊號,ngsc0 ngsc7,對應於bank0 bank7,如此一來,位址空間達到了1g。每乙個bank其實可以對應一種外設。比如 ban...

儲存控制器

個人看資料的理解,可能有誤,歡迎指正 這一部件是用於擴充套件的外設的,它所產生引導出的rom的8個bank是應用於擴充套件的外設 如網絡卡,sdram等 使得這些擴充套件外設可以通過匯流排形式來訪問擴充套件的外設。對於32位cpu,它可使用的位址範圍達到4gb。其中的1gb就是該部件所引申對應的,另...