(杭州電子科技大學微電子CAD研究所,浙江 杭州310018)
U-boot是目前被廣泛采用并支持數(shù)十種cpu 架構和400 多種開發(fā)板的開源系統(tǒng)[1],被許多學者和公司用于研究和學習,并添加自己編寫的代碼到u-boot中,如輕量級安全TFTP 協(xié)議的研究[2]。但是U-boot 只是給具體架構的cpu 編寫配置內(nèi)存代碼,無法判斷內(nèi)存的大小配置是否正確,不具備自動檢測系統(tǒng)內(nèi)存容量的機制。由于不同的系統(tǒng)所使用的內(nèi)存不同,而大多數(shù)系統(tǒng)的解決辦法是在U-boot中配置適合自己系統(tǒng)的這一型號的內(nèi)存。有的在cpu_init.S 文件中增加了適合TQ6410系統(tǒng)的內(nèi)存識別功能和合適的配置,并沒有介紹在不知內(nèi)存容量的情況下是如何獲得內(nèi)存容量[3]。有的介紹了內(nèi)存的分布,卻沒有實現(xiàn)在不同內(nèi)存容量的條件下U-boot 還能運行的功能[4]。如果將這些U-boot 用到其他不同內(nèi)存的系統(tǒng)中就無法工作,這導致對U-boot 移植的難度增加了,同時也增加了開發(fā)時間并降低了應用的廣泛度,基于這一背景,本文介紹了一種自動檢測內(nèi)存容量的機制,根據(jù)檢測的結果重新配置參數(shù),實現(xiàn)了在不同內(nèi)存的系統(tǒng)中都可以正常運行和引導操作系統(tǒng)的功能。
目前絕大多數(shù)處理器包括arm系列支持外接兩片16/32位的存儲器。處理器上電后,初始化內(nèi)存控制器,外設存儲器就會映射到處理器內(nèi)部邏輯空間。自動檢測內(nèi)存容量機制是先假定一個實際內(nèi)存大小,然后根據(jù)這一假設進行內(nèi)存控制器的配置,接著對存儲空間進行訪問,根據(jù)反饋的信息驗證假設是否成立,如果不成立進行下一個假設,直至假設成立。本文以三星S3C6410為例進行說明,S3C6410支持兩片外接16/32位的存儲器,最大內(nèi)存為256 MB。首先假設內(nèi)存是256 MB,并配置DRAM控制器為256 MB 內(nèi)存的參數(shù)。如果內(nèi)存是128 MB,會出現(xiàn)一種現(xiàn)象:由于XM1_ADDR[13]沒有連接,DDR內(nèi)存的第1個32 MB和第2個32 MB 存儲的內(nèi)容對應相同,第3個32 MB和第4個32 MB 存儲的內(nèi)容對應也是相同,根據(jù)這一現(xiàn)象可以推斷,一共有2 對相同大小的存儲空間的內(nèi)容互相對應相同。如果內(nèi)存容量是64 MB,也會有類似的現(xiàn)象:DDR 內(nèi)存的第1個16 MB、第2個16 MB、第3個16 MB和第4個16 MB 存儲的內(nèi)容對應是相同的;第5個16 MB、第6個16 MB、第7個16 MB和第8個16 MB 存儲的內(nèi)容對應也是相同的,也是2 對相同大小的存儲空間的內(nèi)容互相對應相同。如果XM1_ADDR[13]位連接,內(nèi)存是256 MB 容量時,沒有出現(xiàn)大段內(nèi)容互相相同的現(xiàn)象。驗證這種現(xiàn)象,便能檢測出連接的內(nèi)存容量。以128 MB的內(nèi)存為例,在U-boot中向內(nèi)存的第1個32 MB的0x0 地址寫一個32 bit的特殊數(shù)據(jù)0xdeadbeef,接著讀取第2個32 MB 對應的偏移內(nèi)存地址的內(nèi)容,假如讀取的數(shù)據(jù)和寫的數(shù)據(jù)相同,便說明這兩個內(nèi)存段對應的內(nèi)容相同。為了避免特殊性(這兩個地址的數(shù)據(jù)本身就是一樣的),向第2個32 MB的同一地址處寫入另一個數(shù)據(jù)0xbeefdead,接著讀取第1個32 MB 對應的偏移內(nèi)存地址的內(nèi)容,假如讀寫的數(shù)據(jù)相同,便證明這兩個內(nèi)存段對應的內(nèi)容相同。
對于OK6410,128 MB 內(nèi)存用的是兩片K4X51163PC 芯片構成一個128 MB的內(nèi)存;256 MB 內(nèi)存用的是兩片K4X1G163PC 芯片構成一個256 MB的內(nèi)存。地址線連接如下:
1)128MB 容量的內(nèi)存。XM1_ADDR[15∶14]([ba1∶ba0]):XM1_ADDR[12∶0](row addr):XM1_ADDR[9∶0](column addr)。XM1_ADDR[15∶14]是芯片選擇位,與13位行地址和10位列地址組成尋址為128 MB的內(nèi)存;
2)256MB 容量的內(nèi)存。XM1_ADDR[15∶14]([ba1∶ba0]):XM1_ADDR[13∶0](行地址):XM1_ADDR[9∶0](列地址)。XM1_ADDR[15∶14]也是是芯片選擇位,與14位行地址和10位列地址組成尋址為256 MB的內(nèi)存;
內(nèi)存映射后,如果檢測的結果和假設的不同,則要對S3C6410的內(nèi)存控制器進行重新配置。配置程序要放在啟動代碼的前4 kB(cpu 片上內(nèi)存)中,不能放在DDR中,因為內(nèi)存控制器重新配置后會使得內(nèi)存無法正常運行。所以配置程序必須存儲在U-boot 把自己復制到內(nèi)存之前的位置,存儲在cpu_init.S 文件中能夠很好地解決這一問題。cpu_init.S 文件中的內(nèi)存初始化函數(shù)mem_ctrl_asm_init 對DRAM控制器和DDR 做了初始化。識別內(nèi)存的關鍵代碼如下:
0x50000000是第1個32 MB的起始地址,0x52000000是第2個8 M×32 bit的起始地址,對這個兩個地址進行讀寫,先讀它們的內(nèi)存值,如果內(nèi)存值不一樣,說明這兩個區(qū)域不是鏡像,進入內(nèi)存識別后的函數(shù)mem_rec_end 中處理下一步。但是這兩個內(nèi)存值相同這還不能說明內(nèi)存是128 MB,因為存在這兩個值本身就是相同的情況。繼續(xù)進行檢查分析,將一個比較特殊的數(shù)0xdeadbeef 寫到地址0x50000000,接著讀地址0x52000000,如果地址的內(nèi)容相同,就證明這兩個區(qū)域是鏡像的,從而證明內(nèi)存是128 MB,否則就是256 MB。
如果上面的步驟中測試出了鏡像的存在,說明假設內(nèi)存為256 MB是錯誤的,實際內(nèi)存為128 MB,之前的內(nèi)存是根據(jù)256 MB 內(nèi)存配置的,所以必須重新配置內(nèi)存控制器,配置流程如圖1所示。配置內(nèi)存控制器步驟如下[5]:
1)設置DRAM控制器的狀態(tài)為paused;
2)循環(huán)檢測內(nèi)存狀態(tài)寄存器P1MEMSTAT 低兩位,確認DRAM控制器的狀態(tài)paused 狀態(tài);
3)設置DRAM控制器的狀態(tài)為config 狀態(tài);
4)循環(huán)讀內(nèi)存狀態(tài)寄存器P1MEMSTAT 低兩位,確認DRAM控制器的狀態(tài)config 狀態(tài);
5)根據(jù)檢測結果修改內(nèi)存配置寄存器;
6)設置DRAM控制器為運行go 狀態(tài),重新啟動內(nèi)存;
7)循環(huán)讀內(nèi)存狀態(tài)寄存器P1MEMSTAT 低兩位,確認DRAM控制器的狀態(tài)為ready 狀態(tài)。
圖1 內(nèi)存控制器配置圖
把自動檢測內(nèi)存容量的機制應用在內(nèi)存為128 MB和256 MB的OK6410 開發(fā)板,識別內(nèi)存容量后,并重新配置內(nèi)存控制器,系統(tǒng)上電后加載U-boot,U-boot 啟動后,內(nèi)存分布如圖2、圖3所示。
圖2 256 MB 內(nèi)存空間分布圖
圖3 128 MB 內(nèi)存空間分布圖
在圖2和圖3中,圖的左邊是U-boot 啟動后分配的內(nèi)存地址,格子里面是內(nèi)存區(qū)域存放的代碼,圖的右邊是各區(qū)域的代碼指針。根據(jù)圖2和圖3可以看出,對于不同容量的內(nèi)存,U-boot 各段代碼代碼存放的內(nèi)存區(qū)域不同,根據(jù)地址的大小和內(nèi)存分配可以看出U-boot 已經(jīng)檢測出內(nèi)存并配置成功,U-boot相同段的內(nèi)容在容量不同的內(nèi)存中分配的地址不盡相同。這說明自動檢測內(nèi)存容量的機制應用在容量為128 MB和256 MB 內(nèi)存的OK6410 開發(fā)板是可行的,這個機制是正確的,且該機制的代碼只需要不到1 k 字節(jié)的存儲空間就實現(xiàn)了這一功能。
本文面向U-boot 設計了一種自動檢測內(nèi)存容量大小的機制,并在基于S3C6410的開發(fā)板OK6410上進行實例驗證。實現(xiàn)這一機制所需要的代碼不到1k 字節(jié)的存儲空間。這一機制使一個U-boot可以支持多個不同內(nèi)存大小的S3C6410 開發(fā)板,減少了開發(fā)人員的工作量。
[1]DENX Software Engineering.Das U-Boot[EB/OL].http://en.wikipedia.org/wiki/Das_U-Boot.2013-07-22.
[2]Mohd Anuar Mat Isa,Nur Nabila Mohamed,Habibah Hashim,et al.A lightweight and secure TFTP protocol for smart environment[C].Kota Kinabalu:Computer Applications and Industrial Electronics,2012:302-306.
[3]周健昌,李振興.基于S3C6410的u-boot 分析與移植[J].電子設計工程,2012,17(20):53-56.
[4]Ding X C,Liao Y G,F(xiàn)u J G,et al.Analysis of Bootloader and Transplantation of U-boot Based on S5PC100 Processor[C].Hangzhou:Intelligent Human-Machine Systems and Cybernetics.2011:61-64.
[5]Samsung.S3C6410X user's manual Rev 1.20[EB/OL].http://www.Samsungsemi.com.2008-08-22.