制作自己的嵌入式 Linux 電腦
當(dāng)今所有最好的集成電路都大規(guī)模的使用BGA封裝法來焊接。因?yàn)锽GA封裝法連接在芯片底下,焊接更緊,需要使用回流焊箱或者熱印版。另一個(gè)問題是設(shè)計(jì)PCB(印刷電路板)時(shí),過孔和引線之間的焊接球需要足夠小,主板上通常需要更多層來為緊挨的引線來騰出空間,這意味著一個(gè)廉價(jià)的中國產(chǎn)的兩層主板沒有足夠的空間,所以需要更多的層。附加層則會(huì)顯著提高主板的成本 ,就算只多了幾個(gè)拷貝。
本文引用地址:http://butianyuan.cn/article/262475.htmlinux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
我想設(shè)計(jì)一款內(nèi)置BGA芯片的主板來體驗(yàn)下焊接它們究竟是有多難。于是我決定設(shè)計(jì)一個(gè)可運(yùn)行Linux的小型ARM嵌入式系統(tǒng),使用的ARM處理器是在一個(gè)217球的LFBGA包中的AT91SAM9N12,只是因?yàn)樵趲в羞\(yùn)行Linux必需的內(nèi)存管理單元的ARM處理器中,它是最便宜的。起初我只想用一塊BGA芯片,但是BGA包中的RAM比其他包里要便宜很多,所以我就決定在BGA包也增加一塊DDR2(Double Data Rate 2)的內(nèi)存。
為最大化可用空間定位過孔。
結(jié)果尋找主板生產(chǎn)商還頗費(fèi)了一番周折。兩層的空間是還不夠的,至少需要4層。217-LFBGA包的球直徑是0.4mm,臨接球的距離是0.8mm。為了給過孔多留些空間,球的焊盤布局做的要比焊球要稍小一些。我用的0.36mm的焊盤。在4個(gè)球之間放置過孔會(huì)最大程度的利用可用空間。廠商要能制造可以放進(jìn)0.8mm寬度的過孔。幾乎所有廠商都可以制造這種直徑大小的過孔,但問題是:這個(gè)距離包括了過孔的鉆孔直徑,兩倍的過孔繞環(huán)的寬度 ,兩倍的過孔和引線之間的最小距離。比如,iTead的4層主板最小的過孔鉆孔直徑是0.3mm, 最小環(huán)寬度是0.15mm,過孔和引線的最小距離是0.15mm,加起來是0.9 mm,這意味著最小尺寸的過孔不能放在BGA球之間。我發(fā)現(xiàn)的唯一一家可以實(shí)現(xiàn)這一要求而且價(jià)錢相對(duì)合理的生廠商是OSH parks。他們的四層主板有更小的限制,過孔剛剛可以放進(jìn)BGA球里面。額外的好處是,對(duì)于小主板而言,它要比iTead更便宜一些。
在OSH park設(shè)計(jì)原則下最小的過孔,剛剛能放下。
即使過孔可以放進(jìn)BGA 球中間,仍然有一些問題:過孔中間沒有足夠的空間走線。這意味著要讓每一個(gè)焊盤都有一個(gè)過孔的標(biāo)準(zhǔn)布線通道是不可能了。這就是說主板需要有足夠的未經(jīng)連接的焊盤,所以過線需要從里面進(jìn)行布置。幸運(yùn)的是,處理器還有很多通用的未連接的I/O引腳。
… 如果不違反設(shè)計(jì)原則的話,過線就不能正好在兩個(gè)過孔之間穿過。CAS 過線沒有足夠的空間來放入DQM0 和 D15過孔。
生產(chǎn)問題解決了,是時(shí)候開始想想主板上該放哪些部件了。我并不很在乎這塊主板的實(shí)際用處,相對(duì)于用處而言,整個(gè)項(xiàng)目更是一個(gè)學(xué)習(xí)的過程。為了降低成本,主板的尺寸要小。這意味著不會(huì)為其他額外的接口預(yù)留空間,比如:以太網(wǎng),串口或者SD卡。
除了處理器和RAM外,其他必需的部件是:大內(nèi)存,電壓調(diào)整器,以及處理芯片重置的監(jiān)控電路。處理器可以從NAND啟動(dòng),但是以防萬一我決定為引導(dǎo)裝載程序加入Dataflash(數(shù)據(jù)閃存),雖然最終會(huì)很少被用到。對(duì)于大內(nèi)存而言,NAND是一個(gè)很好的選擇因?yàn)樗萘看笥直阋?。在BGA包中加入會(huì)更便宜些,但我已經(jīng)被兩個(gè)BGA包折騰的夠嗆了,所以我決定在一個(gè)48引腳的TSOP(薄型小尺寸封裝)包里面使用4GB的NAND。連接各個(gè)組件在處理器的清單表中已經(jīng)解釋的很好了,但是在上千頁的文檔中要找到全部的細(xì)節(jié)還是很難的。Atmel 也發(fā)布了一個(gè)試用板的原理圖,在設(shè)計(jì)主板時(shí)會(huì)很有幫助。
DDR2 引線空間應(yīng)該有一定的自由度。正常的引線應(yīng)該長度合適,有可控的阻抗和可以終止或者串聯(lián)電阻。在開發(fā)板的參考設(shè)計(jì)中,所有DDR2的信號(hào)使用了串聯(lián)電阻。我沒有足夠的空間放置他們,所以我決定暫且放著不管。阻抗也不是50歐姆,因?yàn)槲冶仨毷褂眯∫恍┑囊€來填充其他的空間。我希望的是,因?yàn)镽AM更靠近處理器,就算缺少串聯(lián)電阻箱或者阻抗不匹配,關(guān)系也不大。所有從CPU到RAM的連線大約是25mm長。通常的經(jīng)驗(yàn)是:如果引線的長度要超過信號(hào)波長的10%時(shí),轉(zhuǎn)換線的影響應(yīng)該被考慮進(jìn)去。這種情況意味著頻率大約在1 GHz以上。RAM的時(shí)鐘頻率只有133 MHz, 甚至頭幾個(gè)諧波還在1 GHz以下,這預(yù)示著應(yīng)該會(huì)正常工作。為了保證可行,我?guī)缀跬耆ヅ淞艘€的長度,但這也許不是必須的。
供電有些復(fù)雜。處理器核心的電壓是1伏特,RAM需要1.8伏特, NAND需要3.3 伏特。因?yàn)閺腢SB輸入電壓是5伏特,主板需要有三種不同的電壓適配器。正常情況下比較好的做法是:在主板上為電力供應(yīng)保留一層并且保持它與信號(hào)脫離,來降低電力供應(yīng)的阻抗,但是主板只有4層,而且其中一層要用于做底板。這意味著只有兩層留給做信號(hào)處理,這顯示不夠。所以我沒有單獨(dú)拿出一層來供電,而是在不同的層里為不同的供電做了一些擋板。
對(duì)于USB供電的應(yīng)用,線形調(diào)整器的電力損失在最壞的情況下太大了些,所以我決定用3.3伏特的調(diào)整器作為一個(gè)更有效的可切換開關(guān)的調(diào)整器。1.0伏特和1.8伏特的調(diào)整期是一個(gè)以3.3伏特作為輸入電壓的線性調(diào)整器。因?yàn)榫€形調(diào)整器的損失決定于輸入和輸出電壓的差,所以使用3.3伏特的電壓比5伏特的電壓提高了效率。
電路圖。PDF
PCB布局,尚未焊錫。
焊接
空的電路板。
焊錫和部件被固定到背面。焊錫是用牙簽手動(dòng)固定的。這兒的部件都是1mm(0.04英寸)長。我只拿上一些做下試驗(yàn),先看下他們?nèi)绾位亓鞯?。如果情況不太好,我會(huì)換另外一塊板子。
使用一個(gè)烤箱和自制的控制器來控制回流。
回流之后。三個(gè)部件被焊接到一個(gè)錯(cuò)誤的地方。我最后還是把它們拿出來了,在主板上有足夠的解耦的電容器,即使丟了一小部分,也不過有什么影響。我還錯(cuò)誤的把一個(gè)電容器放在左上的位置,但那兒其實(shí)應(yīng)該是一個(gè)電阻。
對(duì)于上層,我有一個(gè)OSH的模板,所以我不必手動(dòng)把焊錫弄到BGA板上。直接按到桌子上,我就把主板和模具焊牢了。
模板隊(duì)形排列很整齊。
這看起來有些過了,但是幾乎所有的焊錫都可以用了。還需要一些額外的焊錫來讓模具平整一些。
把焊錫鋪開,然后挪掉模具。比我自己手動(dòng)弄的背面要好的多。
我從一個(gè)非BGA的部件開始。它們是用一雙沉穩(wěn)的手用鉗子固定的。
CPU 和我的指尖。球間距是0.8mm。許多新的BGA甚至使用小于0.5mm的間距。
BGA固定在板上。部件放置的位置誤差需要小于0.4mm,否則可能和一個(gè)行間隔焊接,而且因?yàn)楹盖蛟谛酒旅?,不能檢查。沒有絲網(wǎng)印刷的邊界,幾乎不可能按照要求的精度放置。有了絲網(wǎng)印刷,只需沿著絲網(wǎng)印刷邊沿對(duì)齊即可,很容易。
回焊正面,抬高PCB,這樣底面的部件也不會(huì)觸到其他地方。焊接表面的拉力會(huì)保持底面不倒下。
過烤箱后。焊接口看上去很好看,所有部件仍然在他們應(yīng)該的位置上。
焊接NAND Flash。我的焊接鐵片要比引腳大一些。一次焊接一個(gè)引腳太困難了。簡單些的辦法是灌錫后,用吸錫帶把多余的吸出來。
在移除多余焊錫后,焊接口現(xiàn)在質(zhì)量很高了。
在加入供電頭和調(diào)試串口后,主板焊接完畢。
最終的成品。
另一面,空著的位置是位Dataflash準(zhǔn)備的。
在把USB纜線接到USB設(shè)備口上,沒有出現(xiàn)什么意外,而且我看到了一個(gè)新的串口 /dev/ttyACM0 出現(xiàn)。再用SAM-BA程序(用來對(duì)啟動(dòng)加載程序和內(nèi)核編程)打開,一切都能用了。許多人說焊接BGA很難,但是從這次經(jīng)驗(yàn)來看,我覺得還好。也許只是幸運(yùn)吧,但是我的確沒出什么問題就搞定了。
打開SAM-BA。At91sam9n12ek是Atmel針對(duì)這款處理器提供的開發(fā)工具,他的配置同樣適用于這塊板。
DDR2 也可以工作,執(zhí)行程序,并且可以寫回NAND。一切都OK。
軟件
軟件啟動(dòng)加載程序
啟動(dòng)進(jìn)程開始工作時(shí),內(nèi)部的ROM加載器嘗試在不同的內(nèi)存區(qū)域發(fā)現(xiàn)一個(gè)合法的程序。他會(huì)掃描SPI (串行外設(shè)接口)緩存,SD卡,NAND flash,二級(jí)SPI flash 還有I2C EEPROM 對(duì)于一個(gè)合法的程序。一旦發(fā)現(xiàn)一個(gè),馬上就啟動(dòng)它,否則就會(huì)進(jìn)入SAM-BA監(jiān)控器,也就是進(jìn)入調(diào)試模式,此時(shí)處理器會(huì)監(jiān)聽來自串口和USB端口的指令。這種模式下可以對(duì)bootloader進(jìn)行編程。
ROM 啟動(dòng)不能直接啟動(dòng)linux內(nèi)核,所以需要一個(gè)二級(jí)的啟動(dòng)加載器。它會(huì)初始化RAM和時(shí)鐘,然后開始加載linux內(nèi)核。AT91 Bootstrap 是一個(gè)現(xiàn)成的啟動(dòng)加載器,可以完成這一系列操作。它被放在NAND flash開始的地方,或者如果我填充這些位置,它可能被放到Dataflash。即使AT91 bootstrap 可以直接啟動(dòng)linux,對(duì)于調(diào)試而言,之后啟動(dòng)U-boot的bootloader 對(duì)調(diào)試更有用。U-boot是它自帶的基于命令行的微操作系統(tǒng),可以讀取USB棒,使用以太網(wǎng),讀寫NAND,當(dāng)然可以啟動(dòng)linux。例如使用U-boot 可以清除NAND或者改變linux 啟動(dòng)參數(shù)。
為編譯bootloader,需要一個(gè)ARM 交叉編譯器。我用的是Sourcery codebench lite edition,因?yàn)樗菀自O(shè)置,而且效果不錯(cuò)。先加載AT91SAM9N12EK 開發(fā)板配置文件是最容易的。和從頭開始寫新的配置相比,修改文件要省事的多。
為了讓這份定制版同樣有效,需要做一些改動(dòng):RAM 大小需要設(shè)置成64MB,bank的數(shù)量改成4,一些試驗(yàn)需要稍微調(diào)整一下(試用版有128MB的RAM容量,8個(gè)banks)。NAND初始的函數(shù)也需要改動(dòng),這塊板比開發(fā)板相比,NAND flash要連接的地方有些不同,因此有必要告訴bootloader。
U-boot
因?yàn)锳T91 bootstrap已經(jīng)初始化了整個(gè)硬件,就可以直截了當(dāng)?shù)呐渲肬-boot。同樣有為at91sam9n12ek準(zhǔn)備的配置文件,但是默認(rèn)是從SD卡啟動(dòng)設(shè)置的。因?yàn)橛布呀?jīng)配置好了,所以其他需要改動(dòng)的地方就沒多少了。有一些可選項(xiàng)比如在NAND flash上創(chuàng)造和改變分區(qū)時(shí)啟動(dòng)UBIFS 工具 ,以及為讀取ext4格式的USB棒提供支持。USB支持使得從USB棒啟動(dòng)Linux 內(nèi)核變得可能,這讓試驗(yàn)不同的內(nèi)核配置變得容易了。
Linux和根文件系統(tǒng)
安裝linux不像安裝一臺(tái)常規(guī)的x86 pc一般容易。需要配置內(nèi)核來支持各種需要的設(shè)置,而且需要建立根目錄的鏡像文件。可以手動(dòng)來做,但是用buildroot做起來會(huì)很容易些。后者是用來建立根文件系統(tǒng)和內(nèi)核的一系列工具。整個(gè)過程可能會(huì)有一些難,因?yàn)閮?nèi)核和build root有很多的選項(xiàng)。
Buildroot 沒有為at91sam9n12ek開發(fā)板提供配置文件,但有為另一款 Atmel板 at91sam9260ek提供配置文件。使用這個(gè)配置文件作為基準(zhǔn)文件,配置會(huì)更容易些??梢酝ㄟ^“make at91sam9260ek_defconfig”加載。
開始我們想有一個(gè)相對(duì)新的內(nèi)核版本,因?yàn)橄鄬?duì)于處理器來說,只需要做一些很小的改動(dòng),所以我們就使用上周新發(fā)布的3.15.1版本吧。
Linux 被配置成用buildroot 的“make linux-menuconfig” 命令配置。它會(huì)打開尋常的Linux菜單配置窗口。內(nèi)核中大多數(shù)重要的配置是系統(tǒng)類型的配置菜單。我們需要檢查AT91SAM9N12的支持情況還有“Atmel AT91SAM Evaluation Kits with device-tree support”” 選項(xiàng)。設(shè)備樹是一個(gè)隨內(nèi)核一同加載的外部二進(jìn)制文件,描述了開發(fā)板上各硬件的可用性情況。這使得使用帶有不同開發(fā)板的同樣的內(nèi)核以及針對(duì)不同開發(fā)板的設(shè)備配置,可以用文本來寫,而不是為每塊板都寫一個(gè)只是略有不同的C文件。幸運(yùn)的是:有一個(gè)可以作為基準(zhǔn)文件的針對(duì)at91sam9n12ek 的設(shè)備樹文件。需要做得改動(dòng)只是一些簡單的移除不再使用的設(shè)備。這塊修改過的設(shè)備數(shù)文件需要被添加到buildroot配置,所以它可以知道如何編譯,并且從中構(gòu)造一個(gè)鏡像文件。
內(nèi)核里面其他值得啟動(dòng)的選項(xiàng)是:
USB 主機(jī)支持AT91_USB。
支持NAND flash還有處理器內(nèi)部的NAND ECC 控制器支持。
支持UBIFS,將被用作一個(gè)根文件系統(tǒng)。
讀取USB棒的Ext4 支持。
在buildroot 配置過程中,我們需要選擇我們想要在根目錄上安裝哪些程序以及產(chǎn)生根文件系統(tǒng)鏡像的選項(xiàng)。這塊開發(fā)板有不帶控制器的原始NAND內(nèi)存,所以一般的桌面文件系統(tǒng),比如ext4就不能用了。UBIFS是通常的選擇,在這正好也能用。
UBIFS 有一些依賴NAND flash 類型的選項(xiàng),如果設(shè)置錯(cuò)了,LInux將不能讀取最終的文件系統(tǒng)。這些選項(xiàng)可以從NAND FLASH 的數(shù)據(jù)清單里面得到,但是更容易的方法是從USB 棒啟動(dòng)linux,并且從那創(chuàng)建ubi 分區(qū)?;蛘咭部梢允褂?U-boot的“ubi info”指令,這將會(huì)讀取NAND 并且輸出需要的配置值。
在鍵入“make”后, Buildroot 會(huì)下載交叉編譯器,linux 內(nèi)核以及所有其他的包,構(gòu)建并輸出內(nèi)核,設(shè)備樹,以及根文件系統(tǒng)鏡像。然后可以用SAM-BA程序傳到開發(fā)板上。一些程序需要對(duì) NAND ECC controller 參數(shù)編程。一些參數(shù)也應(yīng)該被配置到AT91bootstrap, U-boot 以及l(fā)inux 內(nèi)核,否則他們會(huì)報(bào)告NAND已經(jīng)損壞。這種情況下NAND有2048個(gè)字節(jié),帶有512字節(jié)的扇區(qū),ECC能夠每1個(gè)扇區(qū)糾正4個(gè)字節(jié)。存儲(chǔ)這些鏡像的NAND地址可以在AT91的bootstrap 以及U-boot配置文件中找到。
在對(duì)主板編程以及重置后,ROM 啟動(dòng)加載器應(yīng)該可以在NAND上找到AT91bootstrap 并且開始啟動(dòng)過程。如果你對(duì)更多細(xì)節(jié)感興趣,所有硬件和軟件的文件都可以在這找到。
電容器相關(guān)文章:電容器原理
pic相關(guān)文章:pic是什么
linux相關(guān)文章:linux教程
回流焊相關(guān)文章:回流焊原理
評(píng)論