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 這兩個字段用於指定元件所佔網...