溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android中如何自動(dòng)識(shí)別內(nèi)存大小

發(fā)布時(shí)間:2022-04-16 15:50:13 來(lái)源:億速云 閱讀:207 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“Android中如何自動(dòng)識(shí)別內(nèi)存大小”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Android中如何自動(dòng)識(shí)別內(nèi)存大小”文章吧。

1、MINI6410的內(nèi)存硬件結(jié)構(gòu)與尋址關(guān)系

在MINI6410上的內(nèi)存硬件結(jié)構(gòu):

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

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

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

2、U-boot中內(nèi)存自適應(yīng)代碼應(yīng)處的位置
 
做好了以上的兩個(gè)知識(shí)準(zhǔn)備后,我們看看在u-boot中應(yīng)該在什么位置來(lái)識(shí)別和自適應(yīng)不同的內(nèi)存大小。
首先我們?cè)谧R(shí)別了內(nèi)存大小之后可能需要重新配置S3C6410的內(nèi)存控制器。這么一來(lái),這些代碼不能在DDR中運(yùn)行。因?yàn)橐坏┲匦屡渲脙?nèi)存控制器,必然導(dǎo)致內(nèi)存暫時(shí)無(wú)法使用,如果代碼在DDR中CPU可能無(wú)法得到下一步的代碼。所以這些代碼要放在u-boot實(shí)現(xiàn)自拷貝到內(nèi)存之前的地方,其實(shí)***的地方就是在u-boot的SPL部分中初始化內(nèi)存控制器的代碼段中。

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

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

3、內(nèi)存大小的識(shí)別

針對(duì)MINI6410的情況,我們只需要識(shí)別內(nèi)存是128MB還是256MB。由于這兩種內(nèi)存大小關(guān)系到DRAM控制器的兩個(gè)寄存器的參數(shù) ,所有我們必須先假設(shè)我們的內(nèi)存大小,再通過(guò)讀寫的方式來(lái)證明,如果證明我們的假設(shè)是錯(cuò)誤的,再修改寄存器的參數(shù)。

我移植的U-boot代碼中首先假設(shè)內(nèi)存是256MB,并先配置DRAM控制器為256MB內(nèi)存的參數(shù)。如果這時(shí)連接的是128MB內(nèi)存 ,那么就會(huì)有這樣一個(gè)有趣的現(xiàn)象:

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

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

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

4、關(guān)于內(nèi)存控制器的重配置

如果上面的步驟中測(cè)試出了鏡像的存在,我們必須重新配置兩個(gè)寄存器的值,但是如何重新配置,這個(gè)三星的數(shù)據(jù)手冊(cè)是沒(méi)有講的,我通過(guò)測(cè)試發(fā)現(xiàn)可以通過(guò)以下的步驟重新配置DRAM控制器:

1、將DRAM控制器設(shè)為暫停(Paused)狀態(tài);

2、檢測(cè)P1MEMSTAT,直到確認(rèn)了暫停(Paused)狀態(tài);

3、將DRAM控制器設(shè)為配置(Config)狀態(tài);

4、檢測(cè)P1MEMSTAT,直到確認(rèn)了配置(Config)狀態(tài);

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

6、將DRAM控制器設(shè)為啟動(dòng)(Go)狀態(tài);

7、檢測(cè)P1MEMSTAT,直到確認(rèn)了就緒(Ready)狀態(tài);

以上就是關(guān)于“Android中如何自動(dòng)識(shí)別內(nèi)存大小”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI