中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中如何自動識別內存大小

發布時間:2022-04-16 15:50:13 來源:億速云 閱讀:213 作者:iii 欄目:開發技術

這篇“Android中如何自動識別內存大小”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android中如何自動識別內存大小”文章吧。

1、MINI6410的內存硬件結構與尋址關系

在MINI6410上的內存硬件結構:

對于MINI6410的設計,用了兩塊引腳兼容的DDR內存芯片來實現128MB內存和256MB內存可共用一個PCB。
128MB內存使用的是兩片K4X51163PG(32Mx16bit),形成一個32M×32bit(128MB) 的內存。256MB內存使用的是兩片K4X1G163PE(64Mx16bit),形成一個64M×32bit(256MB) 的內存。而這兩款芯片在引腳上的差別就是K4X51163PG的F7是NC腳,而K4X1G163PE的F7腳是A13 。這個F7引腳在 128MB內存版本的MINI6410中這個引腳是不連接的,而256MB版本中是通過一個0歐電阻和S3C6410的Xm1ADDR13相連的 。

看了這兩個內存芯片和S3C6410(DRAM控制器)的數據手冊 的朋友一定知道,這種連接形成一個這樣的尋址關系:

128MB內存版本:Xm1ADDR[15:14](bank):Xm1ADDR[12 :0](行地址):Xm1ADDR[9:0](列地址) 。一共25根地址線剛好可尋址32M空間。256MB內存版本:Xm1ADDR[15:14](bank):Xm1ADDR[13 :0](行地址):Xm1ADDR[9:0](列地址) 。一共26根地址線剛好可尋址64M空間。而這兩種連接和芯片配置也要通過修改S3C6410的DRAM控制器的兩個寄存器的參數來匹配。

2、U-boot中內存自適應代碼應處的位置
 
做好了以上的兩個知識準備后,我們看看在u-boot中應該在什么位置來識別和自適應不同的內存大小。
首先我們在識別了內存大小之后可能需要重新配置S3C6410的內存控制器。這么一來,這些代碼不能在DDR中運行。因為一旦重新配置內存控制器,必然導致內存暫時無法使用,如果代碼在DDR中CPU可能無法得到下一步的代碼。所以這些代碼要放在u-boot實現自拷貝到內存之前的地方,其實***的地方就是在u-boot的SPL部分中初始化內存控制器的代碼段中。

這些代碼就在:arch/arm/cpu/arm1176/s3c64xx/cpu_init.S

這個文件是匯編代碼,其中的函數mem_ctrl_asm_init是通過start.S中的“bl    lowlevel_init”------>/board/samsung/mini6410/lowlevel_init.S中的 lowlevel_init ”bl    mem_ctrl_asm_init”調用的。mem_ctrl_asm_init函數中的代碼對S3C6410的DRAM控制器進行了初始化,并對外部的DDR內存也進行了初始化,所以內存的識別和自適應代碼應該放在這些初始化之后。先識別內存的大小,如果內存大小和原先DRAM控制器的配置不相符,就修改DRAM控制器的配置。

3、內存大小的識別

針對MINI6410的情況,我們只需要識別內存是128MB還是256MB。由于這兩種內存大小關系到DRAM控制器的兩個寄存器的參數 ,所有我們必須先假設我們的內存大小,再通過讀寫的方式來證明,如果證明我們的假設是錯誤的,再修改寄存器的參數。

我移植的U-boot代碼中首先假設內存是256MB,并先配置DRAM控制器為256MB內存的參數。如果這時連接的是128MB內存 ,那么就會有這樣一個有趣的現象:

由于Xm1ADDR[13 ] 沒有連接,所以DDR內存的***個8M×32bit(32MB)和第二個8M×32bit(32MB)是鏡像關系,第三個8M×32bit(32MB)和第四個8M×32bit(32MB)是鏡像關系,以此類推。一共有四個這樣的鏡像關系,共256MB。如果連接的就是256MB的內存就不會有這樣的現象。所以,只要我們證明了這種現象存在,就證明了我們其實連接的是128MB內存,然后重新配置DRAM控制器為128MB內存的參數就大功告成了。

所以我移植的U-boot代碼中首先寫一個32bit的測試數據 到***個8M×32bit(32MB)的某個位置 (比如0x0地址),然后就去第二個8M×32bit(32MB)相應偏移位置讀取,如果數據一致就可以證明鏡像關系。但是還不保險,如果就是這么巧(在連接 256MB的內存的情況下)第二個8M×32bit(32MB)相應位置本身就是這個數據怎么辦?不要緊,我們再去第二個8M×32bit(32MB)同一位置 寫入另一個測試數據 ,然后去***個8M×32bit(32MB)的那個位置(也就是一開始的那個寫入位置)讀取數據,如果數據一致就完全可以證明鏡像關系。通過這樣的兩次測試,看看是否要重新配置DRAM控制器參數

但是我們不能 假設內存是128MB ,并先配置DRAM控制器為128MB內存的參數。如果連接的是256MB的內存,沒有任何特殊的現象可以測試到。通過上面的尋址關系,如果連接的是256MB的內存,只是第二、四、六、八(假設Xm1ADDR[13 ]一直是0 )個8M×32bit(32MB)是沒法訪問的(可以說是內存空洞),這個無法通過讀寫證明。(通過尋址關系推斷,未通過實驗證明)

4、關于內存控制器的重配置

如果上面的步驟中測試出了鏡像的存在,我們必須重新配置兩個寄存器的值,但是如何重新配置,這個三星的數據手冊是沒有講的,我通過測試發現可以通過以下的步驟重新配置DRAM控制器:

1、將DRAM控制器設為暫停(Paused)狀態;

2、檢測P1MEMSTAT,直到確認了暫停(Paused)狀態;

3、將DRAM控制器設為配置(Config)狀態;

4、檢測P1MEMSTAT,直到確認了配置(Config)狀態;

5、修改需要重新配置的寄存器

6、將DRAM控制器設為啟動(Go)狀態;

7、檢測P1MEMSTAT,直到確認了就緒(Ready)狀態;

以上就是關于“Android中如何自動識別內存大小”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定结县| 合川市| 洞口县| 永和县| 宜阳县| 宁阳县| 诸暨市| 漳浦县| 静安区| 怀安县| 大关县| 双峰县| 清原| 邵阳县| 新闻| 济源市| 读书| 哈尔滨市| 潮安县| 安多县| 壶关县| 铁岭县| 东至县| 会昌县| 古丈县| 宁阳县| 民县| 滨州市| 淅川县| 铁力市| 赤壁市| 潮州市| 鄄城县| 白城市| 东港市| 新干县| 大兴区| 赤壁市| 福清市| 辽宁省| 瑞丽市|