DDR內(nèi)存子系統(tǒng)常見(jiàn)硬件錯(cuò)誤及Uboot中檢測(cè)流程
在 U-Boot中,,Denx(U-Boot的開(kāi)發(fā)商)針對(duì)常見(jiàn)的DDR內(nèi)存故障進(jìn)行了嚴(yán)格的檢測(cè)處理,,下圖描述了該檢測(cè)處理過(guò)程的三個(gè)步驟:檢測(cè)數(shù)據(jù)線、地址線和DDR物理存儲(chǔ)部件,,主要涉及這三個(gè)步驟的處理過(guò)程和方法,,對(duì)于DDR子系統(tǒng),是很容易出故障并且是很難debug檢測(cè)出來(lái)的,,而Denx所針對(duì) DDR內(nèi)存故障設(shè)計(jì)的檢測(cè)方法是非常嚴(yán)謹(jǐn),,值得學(xué)習(xí)研究的,。
下面主要是相關(guān)的檢測(cè)處理思路及問(wèn)題:
1、為什么先檢測(cè)數(shù)據(jù)線,?
因?yàn)槿绻麛?shù)據(jù)線是斷開(kāi)的,,那么一切無(wú)從談起!接下來(lái)是檢測(cè)地址線,,只有數(shù)據(jù)線和地址線都通過(guò),,檢測(cè)內(nèi)存的存儲(chǔ)單元才有意義,這樣的流程也利于分割定位問(wèn)題,。上面testing sequence框圖將整個(gè)檢測(cè)過(guò)程分成三大步,,用三個(gè)虛線方框表示。
2,、數(shù)據(jù)線的連接錯(cuò)誤
數(shù)據(jù)線的連接可能存在兩種錯(cuò)誤,,一種是被斷開(kāi),另一種布線或生產(chǎn)造成互相短路,。
3,、如何檢測(cè)數(shù)據(jù)線的連接錯(cuò)誤
Denx 設(shè)計(jì)的數(shù)據(jù)線檢測(cè)算法還是很Tricky和精秒的,整個(gè)處理流程如下例子:如果是兩根數(shù)據(jù)線,,只需要寫(xiě)入并讀出一個(gè)pattern=0b01(0b開(kāi)頭表示二進(jìn)制數(shù))就能判斷它們是否短路或斷開(kāi),。很明顯,大部分的嵌入式平臺(tái)不止兩根數(shù)據(jù)線,,我們以64位地址線為例,,pattern = 0b101010101010101010.... 能檢測(cè)出奇偶位之間的數(shù)據(jù)錯(cuò)誤。如果這個(gè)錯(cuò)誤被排除,,每?jī)筛鶖?shù)據(jù)線組成一組(這是理解下一個(gè)pattern的關(guān)鍵),,再用相同的辦法,檢測(cè)每相鄰兩組之間是否有短路,,就得到第二個(gè)pattern,,就是 0b110011001100...... 依次類(lèi)推,以4根數(shù)據(jù)線為一組,,8根線為一組,,相繼得到共6個(gè)pattern,分別是 0xaaaaaaaaaaaaaaaa,,0xcccccccccccccccc,,0xf0f0f0f0f0f0f0f0,0xff00ff00ff00ff00,,0xffff0000ffff0000,,0xffffffff00000000。只要相繼寫(xiě)入并讀出這6個(gè)pattern就能驗(yàn)證是否存在數(shù)據(jù)線交叉短路錯(cuò)誤,。
4,、如何檢測(cè)數(shù)據(jù)線與板上其它信號(hào)線交叉短路或斷路
取以上6個(gè)paatern的反碼,,總共12個(gè)pattern就能檢測(cè)到每一位都可以寫(xiě)入和讀出0和1。
5,、什么是floating buses錯(cuò)誤
floating buses會(huì)“欺騙”測(cè)試軟件,,如果測(cè)試軟件寫(xiě)入并很快讀出一個(gè)值的時(shí)候,寫(xiě)操作會(huì)跟數(shù)據(jù)線上的電容充電,,總線會(huì)短暫的保持它的狀態(tài),。當(dāng)測(cè)試軟件讀操作時(shí),總線會(huì)返回剛寫(xiě)入的值,,即使實(shí)際上該數(shù)據(jù)線是斷路的,。
6、如何檢測(cè)數(shù)據(jù)線的floating buses錯(cuò)誤
檢測(cè)floating buses錯(cuò)誤的算法不復(fù)雜,,在寫(xiě)入和讀回之間再插入一次對(duì)不同地址寫(xiě)入不同值的操作,。例如,X寫(xiě)入X1位置,,Y寫(xiě)入Y1位置,,再?gòu)腦1位置讀出X值則表示floating buses錯(cuò)誤不存在。
7,、地址線的錯(cuò)誤
如果地址線存在錯(cuò)誤,,其癥狀是地址空間中的兩個(gè)不同位置被映射到同一物理存儲(chǔ)位置。更通俗地講,,就是寫(xiě)一個(gè)位置卻“改變”了另一個(gè)位置,。
8、地址線的錯(cuò)誤檢測(cè)
地址線的錯(cuò)誤檢測(cè)相對(duì)簡(jiǎn)單,,其算法是:
1),、將地址的值作為內(nèi)容寫(xiě)入該地址處,匯編的表示方法是 (addr) = addr,。即將地址值寫(xiě)到地址對(duì)應(yīng)的空間里,,這樣確保每一個(gè)位置的內(nèi)容不同。
2),、依次將內(nèi)存基地址的某一根地址線的值翻轉(zhuǎn)(flip/toggle)得到某個(gè)地址,,從該地址取值,如果該值和基地址的值相等,,則表示某一位地址線有問(wèn)題。
這個(gè)算法的特點(diǎn)是每次只檢測(cè)一根地址線,,方法簡(jiǎn)單有效,。
9、存儲(chǔ)單元的錯(cuò)誤
以上數(shù)據(jù)線和地址線的檢測(cè)都是檢測(cè)布線或工廠生產(chǎn)的錯(cuò)誤,,而存儲(chǔ)單元的檢測(cè)則是真正對(duì)DDR內(nèi)存芯片的檢測(cè),。內(nèi)存芯片的常見(jiàn)錯(cuò)誤是bit-stuck,,簡(jiǎn)而言之,就是讓它是0,,它偏為1,,讓它為1,它偏為0,,檢測(cè)方法也很簡(jiǎn)單,,就是用不同的pattern去寫(xiě)盡可能所有的地址并讀回比較。有一些常用的 pattern如0x5555,, 0xAAAA等,。
10、幾個(gè)簡(jiǎn)單的檢測(cè)DDR故障的方法
上面的DDR檢測(cè)算法,,雖然全面,,但是耗時(shí)比較長(zhǎng),常常需要好幾個(gè)小時(shí),,在Uboot命令行下也有幾個(gè)簡(jiǎn)單的命令可以檢測(cè)常見(jiàn)內(nèi)存故障,,如下所示:
1)、mtest addr lenth pattern
這個(gè)命令需要注意,,DDR在Uboot啟動(dòng)后被映射到了0地址,,但是uboot的代碼和堆、??臻g0x10000000處開(kāi)始,,這些空間是不能被刷的,否則就掛死了,。
2),、復(fù)制NOR flash的內(nèi)容到內(nèi)存中,如 cp.b 0x20080000 0x7fc0 20000,,然后比較 cmp.b 0x20080000 0x7fc0 20000,。
3)、下載kernel image到內(nèi)存中,,copy NOR flash 或tftp都行,,然后調(diào)用iminfo LOAD_ADDR 檢測(cè)CRC錯(cuò)誤。
第一種方法是用特定的pattern去刷DDR的空閑空間,,第二種和第三種方法可以說(shuō)Pattern的隨機(jī)性更大一些,。
當(dāng)然最徹底的檢測(cè)方法當(dāng)然是長(zhǎng)時(shí)間跑Linux系統(tǒng),上面的方法更適用于系統(tǒng)不穩(wěn)定時(shí)定位錯(cuò)誤
|