初入領悟:
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就是該部件所引申對應的,另...