2013年6月11日 星期二

eMMC

目前手上的案子,使用了 SAMSUMG 的 eMMC,但是 HW 要找一個替代用料,最後找了 Kingston 的,不過 SAMSUNG 的是 eMMC v4.41,Kingston 的是 eMMC v4.5。為了要測試是不是相容,所以就跟廠商要了幾顆,換上去試。但是 eMMC 是用 BGA (Ball Grid Array)封裝的,它沒有金屬的接腳,而是小小的錫球。(可參考WIKI - Ball Grid Array)所以一般來說不是手工焊的,不過我們少量的情況下,就先用手焊的處理。結果他弄了兩片,全部都辦法用,所以就來找我,想要我查查是兩片都沒焊好?還是我們的 Driver 要修改?


為了確認這件事,我能做的就是 trace driver 還有印些 debug message 出來。還好的是,我們的 bootcode 是在另一顆 NOR flash 裡面,就算 eMMC 不正常,還是可以開機。兩片板子中,有一片連 NOR flash 都有問題,我沒辦法把修改過的 bootcode 寫進去。偏偏我們的系統又不能直接把 bootcode 放進 memory 裡面跑,所以只能捨棄這片板子。

還好,另一片是正常的,換上了開了 debug message 的 bootcode 之後。它就吐了一堆東西給我。在一堆嘗試後,系統給了我:

MMC Init: Card did not respond to voltage select
Could not start up mmc bus 0
所以我想就是沒焊好吧。

倒是這個開 debug message 的過程也不是很順。先是在 driver 裡看到一堆 

debug("OOXX\n");
有經驗的人就知道,應該有個地方可以 define DEBUG 之類的,就可以印出 debug message。一找之下,發現這個 driver 有 include 一個叫 common.h 的檔,裡面就有一段:
#define _DEBUG    1
#else
#define _DEBUG    0
#endif

#define debug_cond(cond, fmt, args...)        \

    do {                    \
        if (cond)            \
            printf(fmt, ##args);    \
    } while (0)

#define debug(fmt, args...)            \


    debug_cond(_DEBUG, fmt, ##args)

看起來就像是用來定義 debug 的部份,我很自然的就加了一個

#define DEBUG

結果卻有 error!!

找不出原因,最後只好把這一段搬進 driver 的檔案裡,才可以把 debug message 印出來。不然我就要手動把一堆 debug 換成 printf 了。

==============================================================

另外,eMMC 也帶來了另一個問題,如前面所說,它是 BGA 封裝,
底下一顆顆的小鍚球,在打件到板子上之後,就熔化了。
所以雖然可以解焊,但解焊之後,這些鍚球就損壞了,必需去除並重新擲鍚球,否則沒辦法用燒錄機讀出資料。
但是人工擲鍚球的失敗率是非常高的,所以我們並不期待這樣的做法可行…
但是…
那我要怎麼讀出裡面的資料來製作 pre-code呢?這就讓我頭大了。等解決了,再來另外寫一篇吧。

沒有留言:

張貼留言