儲存管理器

2021-06-22 05:21:05 字數 4297 閱讀 1356

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:

ldrr0,=0x56000010

@ watchdog位址,r0不能mov賦值,但可以ldr賦值

movr1,#0x00000000

strr1,[r0]

@ 關閉watchdog

blmeminit

blmemcopy

ldrpc,=ready

@ ldr與adrl的區別,ldr:絕對位址(需要=號),adrl:相對位址(不需要=號)

ready:

ldrsp,=0x34000000

blmain

memcopy:

movr1,#0x00000000

@ nand flash起始位址

movr2,#0x30000000

@ sdram起始位址

movr3,#0x00001000

@ 4k的大小

1:ldr

r4,[r1],#4

strr4,[r2],#4

@ [r1] = [r2] , r1 += 4 , r2 += 4

cmpr1,r3

bne1b

movpc,lr

meminit:

movr1,#0x48000000

@ 記憶體控制器位址

adrl

r2,meminitdata

addr3,r1,#52

@ 4 * 13 = 52

1:ldr

r4,[r2],#4

strr4,[r1],#4

@ [r1] = [r2] , r1 += 4 , r2 += 4

cmpr1,r3

bne1b

movpc,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

儲存管理器

一儲存暫存器的性質 儲存管理器負責管理2440的所有記憶體裝置,2440的位址線addr0 addr26,即最大執行定址2 27 128m空間。cpu通過8根片選訊號ngcs0 ngcs7,控制bank0 bank7,每個bank大小為128m,這樣就實現了須知1g位址空間。2440是32位的cpu...

儲存管理器基礎知識

一 框架 想訪問乙個晶元,需要哪些條件 1.位址線 2.資料線 8 16 32 資料寬度 3.時鐘 頻率 我們看到cpu上整合了乙個儲存管理器,外圍的儲存裝置都接在這個儲存管理器上。cpu負責發出命令,其它的一切工作都交給了儲存管理器。那麼儲存管理器是如何來管理這些外設的呢?首先位址空間被分為8個b...

布局管理器 網格袋布局管理器

網格袋布局管理器中的約束條件constrains中有如下字段需要設定 1 constrains.gridx和constrains.gridy 這兩個欄位僅用於指定元件的起始網格座標。2 constrains.gridwidth和constrains.gridheight 這兩個字段用於指定元件所佔網...