s3c2440 地址分配硬件連接及其啓動原理分析(轉)

轉自--https://blog.csdn.net/eastonwoo/article/details/8767608 對一些自己感覺比較難以理解的地方額外做了註解與修改,並新增了一些內容

一.CPU 地址分配:

1.   s3c2440A 的存儲器控制器有以下特性:

  • 大小端(通過軟件選擇)
  • 地址空間:每個bank有128M 的字節(總共1G字節/8個banks)
  • 可編程的訪問位寬,bank0(16/32 位),其他bank(8/16/32 位)
  • 共8個存儲器banks
  • 6 個是ROM,SRAM 等類型存儲器bank   (bank0 ---- bank5)
  • 2 個是可以作爲ROM、SRAM、SDRAM 等存儲器bank   (bank6 ---- bank7)
  • 7 個固定的存儲器bank起始地址   (bank0 ---- bank6)
  • 最後一個bank 的起始地址可調整   (bank7, 接兩片sdram時.接在bank7上的sdram會根據bank6上的結束地址而調整)
  • 最後兩個bank 大小可編程
  • 所有存儲器bank的訪問週期可編程
  • 總線訪問週期可通過插入外部wait來延長
  • 支持SDRAM 的自刷新和掉電模式

 

理論上,cpu是32位的.可以尋址的空間爲2的32次方,也就是4GB的地址空間.但我們cpu只用了其中一1GB多一點的空間,其它的空間都是未到到.且看下圖,我們作一個感性認識:

                                                圖1

(1) S3C2440A的存儲器管理器提供訪問外部存儲器的所有控制信號,27位地址信號(ADDR[26:0])、32位數據信號(DATA[31:0])、8個片選信號(nGCS[7:0])、以及讀/寫控制信號等.

看圖1,我們知道.從0x4000 0000 地址開始,有片內SRAM,片內寄存器,還有未使用的空間.這是都是固定的,不能動的.留給我們用戶的只有0x0000 0000 到 0x3FFF FFFF這1GB的地址空間給我們用. 1GB的地址空間我們需要30根地址線才能完全尋址完畢,2 的 30次方 剛好等於1GB,但是,芯片引腳上只給出了27根地址()ADDR[26:0]),單靠芯片上的27根引腳,它只能控制128M的空間,那3根線去哪裏.其實這3根線用在了3-8譯碼器(如:000表示00000001,001表示00000010,010表示00000100,011表示00001000等等)的輸入端去了,而這個3-8譯碼器的輸出端,就是對應這nGCS0~7,對應着8個bank,用於選擇當前處於哪個bank,這樣做的好處在於很模塊化結構化了,便於管理.不會造成一片和手動去分割地址.

(2) bank0---bank5爲固定128MB,bank6和bank7的容量可編程改變,可以是2、4、8、16、32、64、128MB

請看圖2

                                                                                                   圖2

圖內確定了bank6-bank7在不同容量時的起始地址。bank7的開始地址與bank6的結束地址相連接,但是二者的容量必須相等,s3c2440最小可以支支持2MB(2MB一片,只接bank6) 最大支持是256MB(bank6接128MB,bank7接128MB),另需注意一點就是如果,需要接兩片sdram的話,兩片的容量大小必須是一樣的.看圖2就清楚了.

(3) bank0可以作爲引導ROM。其數據線寬只能是16位和32位,其它存儲器的數據線寬可以是8位、16位和32位

(4) 地址:

0x0000 0000 ----- 0x3FFF FFFF : 分配了8個bank ,每個bank 有128MB尋址空間, 每個bank也都會有片選信號,這8個bank 的地址提供給nandflash ,norflash,sdram使用(下面sdram的接入我們會祥細講解)

0x4000 0000 ----- 0x47FF FFFF : 其中的前4KB空間,也就是0x4000 0000 到 0x4000 1000 爲片內SRAM地址空間,這就是所謂的steppingstone(下面s3c2440啓動時會再討論steppingstone的作用),其它的空間未使用.

0x4800 0000 ----- 0x5FFF FFFF : 特殊功能寄存器,CPU的寄存器都在這時定義和配置.

0x6000 0000 ----- 0xFFFF FFFF : 這大概3G的空間是沒有使用的.

 

二.s3c2440接線規則:

                                                 圖3

1) SDRAM接法規則,分三步(以K4S561632E爲例):

1-1).需得到邏輯bank的選擇IO:

                                                                                 圖4-1

                                 

                                                                                     圖4-2

Bank Size: 外接內存容量大小(K4S561632E是4M*16bit*4Bank*2Chips/8=64MB)

Bus Width: 總線寬度 (兩片16位K4S561632E,並聯成32位)
Base Component:單個芯片容量(bit)(256Mb)
Memory Configration:內存配置 ((4M*16*4banks)*2Chips )

根據K4S561632E的規格書(如圖4-1,圖4-2)得到一些信息.再結合圖3 ,我們可以得到邏輯bank的選擇I/O A[25:24](地址線的第24,25腳需接芯片的BA0,BA1)

1-2).需要得到芯片的開始pin 號:

                                                       圖5

我們選擇了兩片的K4S561632E sdram,所以是32位的.從A2(cpu地址先ADDR2需接到SDRAM的A0上)開始, 

s3c2440的ADDR2   -------------   K4S561632E 的A0

s3c2440的ADDR3   -------------   K4S561632E 的A1

如此類推...

爲什麼要從ADD2開始了.我們知道SDRAM的尋址原理是一個存儲陣列,如圖6:

                      

                                                 圖6

每一片的K4S561632E 有4個邏輯bank,每個bank有4M個存儲單元,每個存儲單元有16位.這就是規格書所說的 4M*16bit*4Bank = 256Mbit.

而2片K4S561632E就有4M*4Bank*32bit = 512Mbit = 64MB,(市面上很少有32位寬的單片SDRAM,一般選擇2片16位SDRAM擴展到32位寬)

內存尋址一次,就是行(ROW)列(Column)交叉一次,得到一個存儲單元,也就是說內存是以"存儲單元(本例爲4個字節,低16位與高16位合成一個存儲單元)"爲單位的,而不是以"字節"爲單位的.但是,cpu尋址是以字節爲單位的.也就是說,cpu移動到下一個才一個字節,而本例內存移動到下一個就是4個字節,所以我們寫程序時常常說要字節對齊就是這個原因(所以是不是能單字節尋址的就不需要字節對齊?)。下面我舉例子具體說明一下:

cpu 尋址內存     內存返回給cpu

0000 0000          第0個單元(其實包含0000 0000 至 0000 0011  這4個字節)

0000 0100          第1個單元(其實包含0000 0100 至 0000 0111  這4個字節)

0000 0101          第1個單元(其實包含0000 0100 至 0000 0111  這4個字節)  因爲s3c2440沒接A1和A0,所以相於邏輯與0xFFFF FF00,取到內存的4個字節後再用低兩位去選擇

0000 1100          第3個單元(其實包含0000 1100 至 0000 1111  這4個字節) 

如此類推.....

cpu 的第2位對應了內存的第0位.也就是說cpu的4,而內存看成是1,他們的單位不同而已,一個是字節,一個是存儲單位,也就是位寬.

同理,16位的位寬SDRAM的A0應該接到s3c2440的ADDR1上.

結論:SDRAM的A0接到s3c2440的那一個引腳上是根據整個SDRAM的位寬決定的.

1-3).開始連接SDRAM到s3c2440:

                                                                                                       圖7

2) norflash接法規則,以EN29LV160A爲例.

這個IC 位寬是通過引腳號爲47的高低電平來選擇BYTE/WORD,也就是有8位,16位兩種模式.

                                                                                  圖8

                                         圖9

規則大同小異,我這裏就不多說了.

 

3)NANDFLASH接法規則,以K9FXX08爲例:

三.s3c2440系統啓動:

s3c2440支持兩種啓動模式:NAND和非NAND(這裏是nor flash)。
具體採用的方式取決於OM0、OM1兩個引腳

OM[1:0]所決定的啓動方式

OM[1:0]=00時,處理器從NAND Flash啓動

OM[1:0]=01時,處理器從16位寬度的ROM啓動

OM[1:0]=10時,處理器從32位寬度的ROM啓動。

OM[1:0]=11時,處理器從Test Mode啓動。

1當引腳OM0跟OM1有一個是高電平時,這時地址0會映射到外部nGCS0片選的空間,也就是Norflash,程序就會從Norflash中啓動,arm直接取Norflash中的指令運行。

2當OM0跟OM1都爲低電平,則0地址內部bootbuf(一段4k的SRAM)開始。系統上電,arm會自動把NANDflash中的前4K內容考到bootbuf(也就是0地址),然後從0地址運行。

原理圖內關於OM0OM1的接法如下: OM1由一個開關控制,OM1直接接地。

 

 

Arm的啓動都是從0地址開始,所不同的是地址的映射不一樣。在arm開電的時候,要想讓arm知道以某種方式(地址映射方式)運行,不可能通過你寫的某段程序控制,因爲這時候你的程序還沒啓動,這時候arm會通過引腳的電平來判斷。

1) 從NorFlash啓動時,與nGCS0相連的NorFlash就被映射到nGCS0片選的Bank0空間,其地址被映射爲0x0000 0000;

2) 從NandFlash啓動時,S3C2440芯片內部自帶的一塊容量爲4K的被稱爲“Steppingstone”(起步石)的BootRAM被映射到nGCS0片選的Bank0空間,其地址被映射爲0x0000 0000。當系統上電或復位時,程序會從0x0地址處開始執行,因此我們編寫的啓動代碼要確保存儲在0地址處(所以燒錄u-boot時,都需要燒錄在0地址上)

如果系統的所有程序在編譯鏈接後的大小小於4K,那在系統的啓動代碼中無需考慮將程序從NandFlash搬運到SDRAM這個問題,因爲所有的程序在啓動時即全部由NandFlash拷貝至BootSRAM,程序在BootSRAM中運行即可;

如果系統的所有程序在編譯鏈接後的大小大於4K,那在系統的啓動代碼中就需要包含一段將系統的全部程序從NandFlash搬運到SDRAM的代碼,因爲系統啓動時只將NandFlash的前4K拷貝到了BootSRAM中,還有部分程序在NandFlash中,而程序在NandFlash中是無法運行的,需要將所有程序拷貝至SDRAM並在其中運行,所以系統的啓動代碼中要包含這段有關程序拷貝的代碼,並在所有程序拷貝完成後使程序跳轉到SDRAM中運行。也就是說NandFlash啓動時需要考慮到涉及的兩次搬移,第一次搬運是S3C2440硬件機制自動實現的,無需干預,第二次搬運需要程序員來實現,搬運程序量大小是系統的所有程序。

 

 

NANDFLASH啓動流程如圖所示:


————————————————
版權聲明:本文爲CSDN博主「EastonWoo」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/eastonwoo/article/details/8767608

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章