RobotPeak 是上海的一家硬件創業團隊,團隊致力於民用機器人平臺系統、機器人操做系統(ROS)以及相關設備的設計研發,並嘗試將突飛猛進的機器人技術融入人們的平常生活與娛樂當中。同時,RobotPeak 將盡力爲機器人技術在開源硬件、開源軟件社區的普及作出貢獻。陳士凱是 RobotPeak 聯合創始人,他給咱們帶來了最新的 x86 構架的 Arduino 開發板 Intel Galileo 的深度使用報告。php
在今年(2013)羅馬舉辦的首屆歐洲 Make Faire 上,Intel 向對外發布了採用 x86 構架的 Arduino 開發板:Intel Galileo。這無疑是一個開源硬件領域的重磅消息。做爲 CPU 領域的巨頭 Intel,爲開源硬件 /Maker 領域這個從前相對小衆的圈子推出專門的硬件,無疑說明對開源硬件領域發展的重視程度。同時,Intel 也做爲本屆歐洲 Maker Faire 的主要贊助商。node
圖:Intel Galileo 開發板,圖片來自 intel.compython
在 PC 行業,Intel x86 構架的強大性能一直被行業稱道,天然此次推出的 Arduino 開發板,也給業界帶來了無限的遐想。我相信不少人都會略帶調侃問:這個開發板能不能運行 Windows 這樣的問題。同時,相信也有很多人會關心 Intel Galileo 的功耗問題,以及開發使用上是否具備難度。linux
做爲曾在 Intel 工做過的做者,對老東家可以推出針對開源硬件市場的產品感到欣慰。經過朋友,我也有幸在較早時間拿到了一塊 Intel Galileo。通過了一段時間的使用和體驗,這裏我就將咱們對 Intel Galileo 的一些使用體驗向你們分享。而且做爲開源硬件和機器人開發的從業人員,聊聊 Intel Galileo 到底能夠給咱們帶來哪些想象空間?git
這裏也先針對那個調侃問題作個迴應:是的,經過軟件的調整,Intel Galileo 的確能夠運行 Windows。github
圖:使用 RoboPeak 微型 USB 顯示屏,給 Galileo 增長顯示屏變成標準 PC算法
2.1 開箱體驗shell
因爲 Intel Galileo 對外批量出貨還有一段時間,因此這裏先給你們介紹開箱的過程。Intel 在外包裝設計上也下了很多功夫,也有一些小驚喜,做爲一向的標誌性色彩,Intel Galileo 的小盒子也用了與 Intel Logo 同樣的藍色,封面上的那個老人頭像我想應該就是 Galileo 本人吧。編程
打開包裝後,就能看到 Galileo 電路板了,還有一些說明書等。盒子的內部是表示 Intel 芯片線路的裝飾畫。服務器
圖:簡介的說明文檔
圖:Intel Galileo 電路板用防靜電袋包裝着
在電路板旁邊印着 Intel 爲 Galileo 設計的宣傳語:What will you make? 在取出電路板的時候,忽然從盒子裏發出了 Intel 那使人熟悉的「燈,等燈等燈!」的音樂,這着實使人大吃一驚。這樣一個看似細小的設計,卻在客戶打開包裝是帶來了巨大的驚喜,真的很用心!而這種感覺可能也只有親身體驗才能感覺到。
將包裝盒第二層拿開,我在這層紙板的背後發現了發出音樂的玄機:
圖:包裝盒背面暗藏的光敏發音盒
不過這個發音盒只是個音樂賀卡用的音樂 IC,沒啥可 hack 的部分,否則相信它會慘遭全球人民的惡搞修改命運。在打開第二層後,又發現一個小驚喜:Intel 工做服的人偶:
盒子中剩餘的部分是電源適配器以及兼容不一樣國家地區插座規格的插頭以及 PCB 的固定柱子以及 micro-usb 線。
就此全部東西都取出了,咱們能夠感覺到 Intel 對這款產品的重視程度。固然爲實現這些細節也是要考慮成本的,而最終爲此買單的天然就是消費者。不過從目前 Mouser 網站的預訂網頁看,Intel Galileo 的售價爲:$69,考慮到性能和 BOM 成本都較低的 Arduino Yún 一樣在 Mouser 上售價爲 $76,Intel Galileo 的售價絕對算是厚道了。
2.2 基本使用方式
在進一步介紹 Intel Galileo 構造和原理前,先介紹下做爲一塊 Arduino 開發板的基本使用過程。因爲採用了 x86 構架,所以 Arduino 官方 IDE 尚不能直接用於 Intel Galileo,而且爲基於傳統 AVR 芯片設計的 Arduino 程序和庫也可能須要作出修改。爲此,Intel 提供了一個修改版本的 Arduino IDE,能夠從 Inte l的 maker 官網 maker.intel.com 下載到[1]。
圖:Intel 提供的配套開發工具、驅動等
對於具體的驅動安裝和使用,Intel 爲用戶提供了 Getting Started Guide 文檔[2],這裏我也不在重複了。
圖:Intel 編寫的快速上手手冊
這裏須要提醒你們的是,使用時須要先給 Intel Galileo 使用電源適配器供電,方可再經過 USB 線鏈接至電腦。這一點很是重要,由於Galileo 有專門的 DCDC 電源控制,而且啓動過程瞬間電流需求較大。若是隻鏈接 USB 企圖給電路板供電,則可能會損壞電路板或者電腦。
圖:Intel Galileo 須要使用特殊的驅動鏈接 PC
在後文我會提到,Intel Galileo 內部運行着 Linux,與 PC 鏈接時,它須要採用 Intel 專門提供的驅動描述來保證 PC 將它識別爲串口設備(僅用於 Windows,MacOS 和 Linux 請參考文檔)。
圖:被 PC 識別爲串口的 Galileo USB 接口
啓動 Arduino IDE,此時咱們就能夠把 Intel Galileo 做爲一個標準的 Arduino 開發板使用了:
圖:與其餘 Arduino 開發板同樣,Intel Galileo 也能夠在 Arduino IDE 中進行開發
2.2.1 解決 IDE 閃退問題
很多已經拿到 Intel Galileo 的朋友都會反映 Intel 提供的 Arduino IDE 會出現「閃退」問題,就是在啓動 IDE 出現版本畫面後,程序會默默退出。其實這並非 Intel 的問題,而是新版本 Arduino IDE 的 bug。因爲 Intel 定製的 Arduino IDE 採用了還未發佈的 1.5.3 版本 IDE,若是當前 OS 的區域設置不是英文(En/US)的話,IDE 就會本身退出。爲此,Arduino 開發團隊和 Intel 也已經意識到了這個問題,也將在 1.5.4 修復[4]。
目前爲了解決這個問題,最直接的辦法就是修改操做系統的語言設置,改成英文便可。不過這樣須要重啓系統,而且可能會對採用中文的應用程序形成影響。這裏我給你們分享一個不用修改系統語言設置的辦法,使用一個名爲 Locale Emulator 的開源軟件[3]:
圖:Locale Emulator 界面
該軟件能夠爲特定程序虛擬出特定的語言區域配置,而不用修改整個操做系統。使用這個辦法,就能夠直接使用 Intel Galileo 的 Arduino IDE。
圖:使用 Locale Emulator 啓動 Arduino IDE,解決閃退問題
2.3 發熱與功耗
功耗一直是困擾 x86 平臺在移動嵌入式領域應用的重要問題,我對 Intel Galileo 作了幾個簡單的測試。相比其餘 x86 平臺,Intel Galileo 功耗的確算小,可是與 ARM/MIPS 等同主頻等級的平臺相比,就顯得大不少。
在 CPU 幾乎空閒的工做狀態下,測得的功耗水平是 5V 0.5A,也就是 2.5W 的耗電量。而在啓動過程當中,會出現 1A 以上的峯值電流。
圖:Intel Galileo 運行的功耗狀況
不過考慮到目前 Galileo 中運行的 Linux Kernel 並無開啓動態 CPU 頻率控制功能,所以即便在滿負荷下,CPU 核心的功耗水平應該相比空閒狀態差距不大,所以啓動過程當中的峯值電流應該是在開啓外設產生的瞬間電流形成的。在啓動後的工做當中,即便 CPU 滿負荷運做,總體的功耗應該會維持在 0.5A 附近。
這樣的功耗水平對於使用電池供電就顯得有些壓力了,若是使用 2000mAh 3.7V 的鋰電池供電,Galileo 理論最長的待機時間是 2.96 小時。
從發熱角度上看,Intel Galileo 採用的 Quark 處理器芯片的 max TDP 是 2.2W,不須要主動散熱設備。Intel 也沒有給 Galileo 的處理器配置被動散熱片。但這並不表示運行過程當中就不發熱。在工做狀態下,即便是 CPU 保持空閒狀態,用手摸處理器表面仍舊會以爲燙手,實測的溫度在 65 攝氏度左右。
經過前文的介紹,你們應該瞭解到經過 Intel 提供的 Arduino IDE,就能夠像標準的 Arduino 版那樣進行開發了。不過光是實現標準 Arduino 開發板能作的事情,這徹底無法體現出 Intel Galileo 有何特殊之處,最多隻能是一個速度更快的 Arduino 罷了。
若是功能上沒有任何比傳統 Arduino 過人之處,相信 Intel 也不會推出這樣的產品了。其實 Intel Galileo 真正強大之處並不在於前面提到的基於 Arduino IDE 的開發,而是背後基於 UEFI/Linux 的軟件平臺以及 Galileo 自身的硬件配置。爲此,Intel 提供了豐富的開發文檔、軟件代碼支持,方便開發人員真正的發揮出 Galileo 的全部潛力。而要了解使用這些功能,就須要咱們更加深刻的去了解 Intel Galileo 的內部構成和更深刻的軟件構架。
你們可能也會有這幾個問題:
這裏我將爲你們揭開這些謎團。
3.1 硬件配置與構架分析
這裏咱們列出 Galileo 的基本配置:
Intel Galileo 的系統框圖以下:
圖:Galileo 的框圖,來自 Galileo Datasheet[5]
畫面中最醒目的天然是名爲 Quark SoC X1000 的處理器,這塊芯片究竟有哪些功能?這個咱們稍後再具體分析,不過看起來這塊處理器更加像單片機(MCU),除了處理器外傳統 x86 構架的南北橋芯片已經不見蹤影,PCIe、USB、串口等外設信號直接是從 Quark 處理器芯片連出。Intel官方也提過,他們會像 80 年代推進嵌入式領域那樣(是指 8051?)推廣 Quark 處理器構架[10],從 Galileo 的構架上可見一斑。
此外還能夠注意到 Galileo 配備了共計 256MB 的 DDR3 內存。如此大的內存空間,足以讓 Galileo 運行目前的各主流操做系統。
不過與單片機不一樣的是,做爲兼容標準 Arduino 板的各類 GPIO/PWM/ADC 信號,並無與 CPU 芯片直接相連,而是採用了獨立的 ADC 芯片和 IO 擴展芯片。
3.1.1 對外接口一覽
圖:Intel Galileo 外部接口一覽
從 Galileo 提供的對外接口來看,與其說是 x86 版本的 Arduino,我更願意認爲它是一個完整的 PC 主板。除了鏈接顯示器的 VGA/HDMI 等接口和 SATA 接口沒有提供外,幾乎 PC 主板該有的接口在 Galileo 上都提供了(也有辦法鏈接顯示器,如採用 PCI-E 或者 USB 接口的顯示器/顯卡)。豐富的接口給了從此基於 Galileo 進行擴展開發的無限可能。尤爲它還帶有我最中意的 Mini PCI-E 接口,這使得 Galileo 與 FPGA 結合運算加速成爲可能,這是目前各類 ARM 開發板中不多能看到的接口。
除了 Mini PCI-E,USB2.0 高速 Client/Host 口也爲不少應用提供便利。一方面經過 USB Host 能夠將各類 USB 外設鏈接在 Galileo 上,好比將 USB 攝像頭鏈接與 Galileo 結合 OpenCV 進行視覺計算,此外,也能夠經過 USB Client 將 Galileo 做爲外設鏈接至 PC,就像目前 Galileo 實現的那樣,固然,後文咱們會分析到,用戶是徹底能夠隨意定義這個 USB Client 具體行爲的,能夠將 Galileo 做爲任何但願的外設鏈接至 PC。
不過比較怪異的是調試用的串口採用的是 3.5mm 音頻接口,這給鏈接上帶來了必定的麻煩,我將在後文提到這個問題。
3.1.2 主要芯片
圖:Intel Galileo 主要芯片一覽
上圖給出了 Galileo 上主要芯片的佈局以及其功能。其具體型號和說明見下表。在後文咱們將挑選幾個有表明性的進行說明。
這裏我就不深刻討論這些芯片的具體參數、鏈接等問題了,對此感興趣的朋友能夠參考後文給出的 Intel Galileo 配套文檔,參考官方提供的電路圖瞭解具體細節。我將挑選幾個表明性的芯片作分析。
3.1.3 Quark SoC X1000
Galileo上使用的這款 Quark SoC X1000 的處理器芯片相信是你們最關心的。那麼它究竟是不是屬於 Intel Atom 系列的處理器呢?答案是否認的。
圖:Quark SoC X1000 特寫
在產品定位上,Intel 將 Quark 定位於面向物聯網、可穿戴設備的 x86 處理器,他的內部代號爲 Clanton。相比 Atom 系列處理器,Quark 差很少是 Atom 1/5 的尺寸,功耗也只有 Atom 的1/10 (詳見[6])。這估計也是叫作 Quark(夸克)的緣由。固然,做爲減少尺寸、功耗、下降成本($5)的代價,Quark 的性能也弱不少。它比較像是改良了製程,但閹割了 MMX 指令集的奔騰 I 代處理器(參考文獻[7]中猜想 Quark 是改良自 P54C 構架,P54C 構架是主頻在 75, 90, 100 MHz 奔騰 I 代處理器採用的構架,當年採用 0.5um 製程工藝)。
表:Quark SoC X1000 部分配置,按照 Quark Datasheet[8] 整理獲得
從支持的指令集看,Quark 並不像其餘 Atom 芯片那樣支持 x6四、MMX、SSE 等高級的指令集,但包含了浮點指令集(x87)。雖然 Intel 的官方參數中提到 Quark 的指令集是與奔騰兼容的,但很明顯,因爲缺乏了 MMX 指令這個做爲奔騰處理器的重要標誌,實際上不少能夠在奔騰 I CPU上運行的程序在 Quark 上多是不能運行的。這點算是一個遺憾,缺乏 MMX、SSE 這類 SIMD 的指令集加速,使得 Quark 在處理多媒體、圖像運算、計算機視覺等算法上可能會表現的較差。
不過,除了 MMX 指令集外,其餘奔騰指令集/構架在 Quark 中均有支持。所以如今的程序只要不帶有 MMX、SSE 指令,理論上是能夠在 Quark 上運行的很好的。這點我會在後續的軟件開發部分提到注意事項。這也能夠看到另外一個細節,就是目前 PC 上的主流操做系統,Windows 和 Linux 都有望在 Quark 中運行(目前 Intel Galileo 上運行的就是 Linux)。
做爲一款面向小型化設備的處理器,Quark 在 SoC 集成上作的仍是不錯的,幾乎是一個單片機該有的形態。即便不外接 DDR 內存,Quark 也能夠利用芯片內集成的 512kbyte 的 SRAM 工做。
圖:Quark SoC X1000 的內部框圖,圖片來自[8]
在功耗方面,Quark 將 max TDP 控制在 2.2W。對於採用 3.3V 供電而言,也就是最大須要提供 660mA 的電流。這樣的功耗相比其餘 x86 CPU 而言已經小了不少,可是咱們對比一樣主頻等級的其餘構架的處理器,如 ARM、MIPS 構架的一些處理器,就會發現 Quark 的功耗仍是相對偏高的。若是要將 Quark 做爲低功耗應用,Intel 爲此還須要作更多的功課。
3.1.4 GPIO/PWM/ADC 接口的實現和 Hack
從前面的框圖能夠發現,Galileo 上對外的 GPIO/PWM/ADC 接口並非直接從 Quark 芯片中直接提供的,而是採用了額外的芯片來實現,Quark CPU 與這些接口芯片再使用 SPI/I2C 進行鏈接。
這樣作天然有很多的好處,好比能夠作到電氣隔離。Quark 處理器採用 3.3V 電平,所以也沒法直接將自身的 GPIO 與 Arduino 接口直接鏈接。也能夠避免用戶因爲連線錯誤鏈接直接致使 Quark 芯片燒燬的可能。同時也提升了系統的靈活度。
圖:用於擴展 GPIO/PWM/ADC 的接口芯片
經過分析這些新品的數據手冊,在瞭解 Galileo 的實現細節的同時,還能夠發現更多能夠用來 Hack 的特性。好比用於實現 GPIO/PWM 信號擴展的 CY8C9540A 芯片的框圖:
圖:CY8C9540A IO 擴展芯片框圖,圖片來自[9]
從芯片框圖可知,該芯片除了提供了 PWM/GPIO 的信號擴展外,還自帶了一個能夠被 Quark 使用的 EEPROM,能夠存儲 11kbyte 的數據[9],用戶可使用 EEPROM 庫來操做他。此外,該芯片實際提供了 8 組 PWM 口,多於 Intel Galileo手 冊中描述的 6 組。不過額外的 PWM 輸出是沒法經過使用 Arduino IDE 來使用了,這即是從此能夠 hack 的部分。
觀察用於數模信號採集的 ADC 芯片 AD7298,發現性能也尚可。具備 12bit 1Msample/s 的採集能力。這樣的性能雖然不算高,但比基於 AVR 芯片的 Arduino 強不少,與目前的一些 32bit ARM MCU(如 STM32)的 ADC 處於同一等級。
3.1.5 SD 讀卡器
Intel Galileo 上的 SD 讀卡器直接與 Quark 處理器相鏈接。這個讀卡器比較吸引人的特色在於在 Galileo 啓動時,將嘗試引導位於 SD 卡上的操做系統。就像 PC 上的引導 U 盤同樣。用戶能夠將自定義的操做系統放置於 SD 卡,使得 Galileo 運行其餘的系統成爲可能。關於這點,我將在後續軟件構架和可能性探討部分具體涉及。
圖:Intel Galileo 支持從 SD 卡加載自定義操做系統
3.1.6 調試串口
Intel Galileo 提供了一個調試串口供開發人員經過終端鏈接 Galileo 調試底層的軟件系統。不過比較怪異的是,Galileo 將該串口接口作成了 3.5mm 的耳機插口。這不但使人容易疑惑,此外要找到這樣的串口接口也不容易,爲此我專門 DIY 了一個音頻插口轉 RS232 插座的轉接線:
圖:看似音頻輸出,實則爲調試串口插座
經過使用 Putty 等軟件,能夠觀測到 Intel Galileo 啓動過程以及進入內部的 Linux 進行操做。我將在軟件開發部分討論這個問題。
圖:透過調試串口,看到的 Intel Galileo 啓動中的 Grub 菜單
3.1.7 存放自帶固件的 Flash
位於 Intel Gaileo 主板上有塊 8MByte 大小的 SPI Flash,其中保存了 Galileo 啓動中的固件程序。類比 PC 主板,其實這塊芯片保存的就是 BIOS 程序。不過在後面的軟件構架中我會提到,Galileo 採用了 UEFI,這塊 Flash 芯片中包含了 UEFI 的固件程序用於 Galileo 初始化引導、以及一個小型的 Linux 操做系統,用於運行用戶經過 Arduino IDE 開發的程序並和 PC 完成互聯。
爲了方便用戶 hack,Intel Galileo 也很友善的將這塊 Flash 芯片的 SPI 接口引出,用戶能夠不須要拆下 Flash 芯片,直接使用編程器對 Flash 芯片內的固件程序作修改和備份。這個過程將在後續的擴展開發中討論。
圖:保存固件的 SPI Flash 芯片和方便編程的接口排針
3.2 軟件架構
3.2.1 整體構架淺析
在前文中介紹的利用 Arduino IDE 給 Intel Galileo 編程徹底只能看到 Galileo 軟件系統的冰山一角。Intel Galileo 並不像其餘單片機開發板那樣,它並非簡單的運行用戶所編寫的程序那麼簡單。
它的軟件構架環境基本與一臺標準PC一致:含有 UEFI(與傳統的 BIOS 等價)、Grub 引導、運行 Linux 操做系統。而用戶編寫的 Arduino Sketch 程序,在實現上只是運行在 Linux 系統中的一個 App 而已:
圖:Intel Galileo 的簡易軟件構架,圖片來源[12]
在 Intel Gaileo 主板的 SPI Flash 芯片內,保存了開機須要的 UEFI 初始化固件,以及一個微型的 Linux 操做系統。在編寫 Arduino 程序時,Arduino IDE 將編寫好的 Arduino 程序編譯成爲了一個標準的 Linux ELF 可執行文件,並下載進入 Galileo 上運行的 Linux 系統中執行。
經過直接基於 Galileo 上 Linux 系統進行開發,咱們能夠發揮出 Galileo 更大的潛力。而且藉助 Intel 提供的各類開發資料和開源的 UEFI 實現,咱們也可讓 Galileo 運行更多的操做系統,好比 Windows。
在 Intel Quark SoC 的介紹文檔[11]中,Intel 給出了目前基於 Quark SoC 的軟件棧的支持狀況:
圖:Intel Quark SoC X1000 Software Stack, 圖片來源[11]
手上的 Intel Galileo 並不運行 Wind River Linux 或者 Vxwork。它採用了基於 Yocto 項目的定製版本的 Linux 系統,並分爲運行在 SPI Flash 上的微型系統以及運行在 SD 卡的完整版本系統:
圖:用於 Intel Galileo 的軟件平臺構架
因爲 Intel Gaileo 主板上的 SPI Flash 8Mbyte 空間限制,Intel 將一個微型版本的 Linux 系統集成在該芯片當中。在 Galileo 啓動後將默認啓動該版本的 Linux,它帶有 Galileo 主板上基本的外設驅動,並保證 Arduino Sketch 能正常運做。但若是用戶須要更多功能,就須要採用外接 SD 卡,使用 Intel 提供的完整版本 Linux。該 Linux 還額外包括了 Wifi 網卡驅動,以及 OpenCV 等庫:
在設計上,經過 Arduino IDE 編寫的 Sketch 程序能夠永久保存在 SPI Flash 芯片內或者 SD 卡中。固然,若是要保存在主板上的 SPI Flash 芯片內,編寫的 Sketch 程序的大小就要有限制。
3.2.2 Intel Galileo 啓動過程簡介
在通電後,Intel Galileo 將會首先執行位於 SPI Flash 上的 UEFI 初始化程序,並逐漸進入 Linux 系統隨後開始運行用戶的 Sketch 程序。其大體啓動過程以下圖所示:
圖:Intel Galileo 的啓動過程
從上圖能夠看出,Galileo 的啓動過程與傳統 PC 一致。除了支持從 SD 卡引導,Intel Galileo 也一樣支持引導 U 盤、從網絡(可能須要修改 UEFI)等方式的啓動。不過與 PC 不一樣的是 Galileo 並非基於主引導記錄(MBR)來判斷是否須要進行引導的,畢竟 Galileo 並不含有傳統的老式 BIOS,它的引導是經過 Grub 進行的,所以須要引導的介質須要有能夠被 Galileo 自帶 Grub 識別的文件系統以及對應的 Grub 引導配置。
圖:從調試串口看到的 Intel Galileo 啓動輸出信息
此外,在 UEFI 階段,用戶也能夠要求運行其餘的EFI程序,好比 EFI Shell。這使得引導過程更加的靈活。對於目前 Intel 已經提供的軟件使用來講,引導過程最終都將啓動 Linux 操做系統。並在 Linux 啓動完畢後,從目錄/sketch 下加載 sketch.elf 程序(若是有),運行用戶保存在 Arduino 程序。
3.2.3 Arduino Sketch 是如何運行的?
前面已經提到爲 Intel Galileo 編寫的 Arduino 程序實質是標準的 Linux ELF 可執行 App。那麼他是如何操做 Galileo 的硬件外設呢?爲此咱們就須要經過瀏覽相關源代碼找到答案。
打開 Intel Galileo 專門的 Arduino IDE 所在目錄的 hardware\arduino\x86\cores\arduino 位置,這裏存放了 Intel 爲 Galileo 開發的 Arduino 庫的源代碼。能夠看出 Intel 徹底重寫了原先整個基於 AVR 芯片的 Arduino 實現。
圖:Intel 徹底重寫的 Arduino 運行庫代碼
這裏咱們挑選 fast_gpio_sc.c(實現 GPIO 操做)代碼進行研究。該代碼用於實現你們熟悉的 digitalWrite, digitalRead 等 IO 操做。從代碼可知,Intel Galileo 上的 Linux 系統已經對應的 IO 設備包裝成了 Linux 設備文件,用戶編寫的 Arduino 程序只須要像標準的 linux 程序那樣使用 mmap/ioctl 等系統調用便可操做具體的硬件外設。
圖:Galileo 上對 GPIO 操做的代碼實現片斷
上述代碼使用 open() 系統調用開始訪問 GPIO 外設,其 Linux 設備路徑爲 /dev/uio0。對於其餘諸如 I2C、ADC、SPI 等設備,基本的實現都是同樣的。
同時,在 Galileo 版的 Arduino IDE 目錄下也能夠找到專門爲 Quark 處理器定製的 gcc 編譯器,這對於熟悉 Linux 程序開發的朋友來講,也意味着能夠脫離 Arduino IDE,直接在 Galileo 的 Linux 中編寫程序與外部電路進行控制。
圖:Arduino IDE 中帶有的 Quark 平臺的 GCC 編譯器和工具鏈
在分析了 Galileo 的軟硬件構架後,我給你們分享一些除了使用 Arudino IDE 以外的進階的使用方式。不過在本文中並不會涉及編程開發的話題。
4.1 直接操做 Linux 系統
這裏聊聊如何直接操做 Galileo 中的 Linux。咱們可使用以太網或者調試串口鏈接到 Linux 中。具體的鏈接操做能夠查看 Intel 給出的文檔。
以串口爲例,我使用本身 DIY 的 3.5mm 音頻插座轉串口線將 Galileo 的調試串口與 PC 互連。並使用 Putty 打開串口中斷,設置 115200 波特率。
圖:能夠 DIY 一個音頻轉串口鏈接線
給 Intel Galileo 通電後,就能夠看到啓動過程的文本輸出,最終將看到 Linux 登陸提示畫面。直接使用 root 帳號登陸:
圖:經過串口登陸至板載的Linux終端
接下來就能夠像其餘 Linux 系統同樣進行操做了。
4.2 使用 SD 卡上的 Linux 系統
若是須要運行 Intel 提供的完整版 Galileo 定製的 Linux 系統,就須要從 SD 卡引導啓動。在 Intel 的 Galileo 下載頁面[1]提供了該 Linux 系統的 SD 卡文件。將他們複製到 FAT 格式的 SD 卡根目錄下:
圖:將配套的文件複製入 SD 卡
將 SD 卡插入 Galileo,並給 Galileo 通電便可,Galileo 將會引導來自 SD 卡的 Linux 系統。能夠經過串口或者以太網登陸至該系統:
圖:Grub 顯示將引導 SD 卡上的 Linux 系統
相比 SPI Flash 中的 Linux,SD 的 Linux 系統包含了更多的驅動,以及帶有以下的庫/程序:
圖:在 Galileo 的 Linux 中運行 python 程序
4.2.1 與 UEFI直接打交道
除了操做 Linux 外,Galileo 也提供了 UEFI Shell 供咱們操做更底層的固件以及在具體 OS 加載前,對 Galileo 進行一些簡單的操做。UEFI Shell 提供了一系列的命令可使用,能夠操做文件、對內存/外設等調試或者編寫腳本運行。若是須要修改 SPI Flash 的內容,但手頭有沒有硬件編程器,就能夠藉助 EFI Shell 來完成。具體的命令能夠參考文獻[13]。
經過調試串口,並使用 Putty 鏈接至 Intel Galileo。在啓動過程當中進入 Grub 菜單後按住 c。並輸入 quit 退出 grub:
圖:退出 Grub EFI 程序
此時 UEFI 將會提示新的啓動模式,選擇 UEFI Internal Shell:
圖:UEFI 輸出的啓動提示菜單
接下來便可進入 EFI Shell。後面提到的對 SPI Flash 進行更新的操做就是在 EFI Shell 當中進行的。
圖:EFI Shell 界面
介紹完了 Intel Galileo 的實現細節以及各類使用後,我來向你們分享下基於 Intel Galileo 進行開發的心得。這裏我主要圍繞操做系統層次進行介紹。
5.1 參考資料一覽
Intel 目前幾乎提供了 Galileo 一切的資料,有了這些資料,只要能購買到 Quark SoC 芯片,本身 DIY 一塊 Galileo 是徹底沒問題的。目前在 Intel Galileo 官方網站[1]中已經提供的資料有:
若是你打算基於 Galile o或者 Quark SoC X1000 進行開發,這些都是必讀的內容。他們足以解釋在對 Galileo 進行開發、系統定製、優化過程當中出現的問題。
5.2 自定義 Linux 系統
Intel Galileo 中運行的 Linux 系統是由 Yocto Buildroot[14] 系統產生的。接觸過路由器定製的朋友可能會對 OpenWRT 的系統定製有過研究,Yocto 與 Openwrt 的編譯系統相比,顯得更加的強大。它是一個高度可配置的嵌入式 Linux 的整合編譯環境。開發人員能夠比較方便的定製目標嵌入式設備所須要的 Linux kernel、各軟件包。Yocto 將會自動將所須要的軟件包進行代碼下載、編譯、打包動做,直接產生能夠燒錄進目標系統的鏡像文件。
圖:Yocto 編譯系統的構架,圖片來源[14]
在 Intel Galileo 軟件下載頁面[1]中提供了基於 Yocto 編譯系統的 Galileo 的全部軟件源代碼。按照文檔操做,便可本身編譯出前面所提到 UEFI 固件、Grub、用於 SPI Flash 的 Linux 和在 SD 卡中運行的完整版本的 Linux 鏡像。
那麼爲何要去本身定製 Linux 呢?緣由有不少,好比但願讓 Galileo 支持更多的硬件設備,例如讓它識別你的 3G 上網卡、鏈接 Kinect 等等,亦或你但願在 Linux 中增長更多的軟件包,好比但願運行 Apache 服務器。這是,只須要按照 Yocto 的配置過程定製系統便可。
圖:基於 Yocto 的 Intel Galileo BSP 代碼目錄結構
圖:配置 Intel Galileo 所使用的 Linux Kernel
5.3 爲Galileo增長顯示器、鍵盤等外設
這裏以最廣泛的各種 USB 設備爲例,因爲在 Intel Galileo 上的 USB Host 是 micro-usb 插座,標準的 USB 插頭無法直接鏈接,因此首先要準備一條 micro-usb OTG 線:
圖:準備一條 micro-usb OTG 線用於鏈接 USB 外設
此外,若是須要鏈接多個 USB 設備,則可使用 USB 集線器。
5.3.1 外接 USB 顯示屏用於顯示畫面
Intel Galileo 的一個遺憾之處在於沒有提供用於鏈接顯示器的 VGA、DVI、HDMI 等視頻輸出接口。這給一些應用和調試帶來不便,彷佛這樣就無法運行 Windows 的系統了。
不過咱們還有別的辦法來實現讓 Galileo 顯示畫面,這裏我使用的是 RoboPeak 迷你 USB 顯示器[15],經過修改 Galileo 的內核增長對應的驅動支持,可讓 Linux 的命令行和 X 圖形界面在 USB 顯示器中顯示:
圖:使用 USB 顯示屏爲 Intel Galileo 增長視頻輸出能力
5.3.2 外接鼠標鍵盤
在增長了視頻輸出後,很天然的就是嘗試給 Galileo 配置鼠標和鍵盤等輸入設備了。在 Intel 提供的 Linux kernel 配置中,並無加入對鼠標鍵盤等 HID 設備的支持,這須要咱們在 menuconfig 中增長。
圖:在 Linux Kernel 的 Menuconfig 加入對 USB HID 設備的支持
在加入了對應配置後,就能夠把 Intel Galileo 變成一臺真正意義上的 PC,固然沒中不足的是它暫時尚未運行 Windows,這將是下一步的工做。
圖:給 Galileo 配置鼠標鍵盤,變成完整的 PC
5.3.3 使用 USB 攝像頭
對於但願使用 Intel Galileo 進行計算機視覺處理的應用,則須要增長對應的 USB 攝像頭驅動。通常目前市面的 USB 攝像頭多爲採用 UVC 協議規範的芯片,而一些老式的攝像頭或者特殊攝像頭在 Linux 下則採用 GPSCA 驅動框架。一樣在,在 Kernel 的 menuconfig 中增長對應的驅動便可:
圖:增長對 USB 攝像頭的支持
5.4 其餘可能性討論
前面向你們分享了目前我使用 Intel Galileo 作的一些擴展開發。因爲目前剛使用 Galileo 不久,所以有更多好玩的可能性有待於去實現。這裏說說從此打算嘗試的可能性。
5.4.1 增長運算性能
因爲 Intel Galileo 的主頻只有 400Mhz,這的確給不少應用形成了不變。對於視覺運算而言,400Mhz 的主頻對於不少應用都顯得捉襟見肘。
不過 Galileo 提供了高速的 PCI-E 接口,咱們能夠利用該接口與外部更增強勁的運算系統創建高速互聯。最具表明的就是經過 PCI-E 與 FPGA 進行鏈接,經過 FPGA 實現視覺計算、密碼學處理、人工神經網絡等須要高速並行性的算法,並使用 Galileo 的 Quark 芯片實現高層的控制邏輯來協調運算。
在傳統的 PC 中,使用 PCI-E 接口的 FPGA 加速卡與 CPU 進行協同加速運算是比較常見的作法,藉助一樣是 x86 平臺的優點,使用 Intel Galileo 能夠將以往須要採用傳統 PC 的 FPGA 加速項目移植到更加小、低功耗的環境下。這能夠在移動機器人、飛行器等領域具備很大的應用前景。
5.4.2 運行其餘的操做系統
目前的 Intel Galileo 只能運行 Linux,而且因爲自身並無視頻輸出接口,Intel 默認的 Linux 配置是沒有 X 圖形系統的。不過做爲一個 x86 平臺,你們天然會但願 Galileo 運行其餘的操做系統,如 Windows。
在前面的分析中,咱們已經看到 Galileo 的構架和軟件支持徹底容許讓 Windows 運行在其中。這或許最終沒有什麼實際價值,但也是值得嘗試的事情。至少做爲 geek 來講,這樣作能夠增強「我能夠」的信條。此外,運行 Windows 也可讓 Galileo 驅動一些尚只有 Windows 驅動支持的外設,好比一些打印機設備、銀行 U 盾等。
本文是我對 Intel Galileo 的一些使用體會和經驗分享,因爲拿到手時間不長,所以不少 Galileo 的潛力尚未去嘗試。不過經過對軟硬件構架和開發過程的介紹,相信你們會了解 Intel Galileo 的巨大潛力,若是隻是看成標準 Arduino 來使用,那就太惋惜了。
參考文獻[1] Intel Galileo 相關軟件,https://communities.intel.com/community/makers/software/drivers[2] Intel Galileo Getting Started Guide,,https://communities.intel.com/docs/DOC-21838[3] Locale Emulator github,,https://github.com/xupefei/Locale-Emulator[4] Arduino IDE crash issue on github, https://github.com/arduino/Arduino/issues/1626[5] Intel Galileo Datasheet, https://communities.intel.com/docs/DOC-21835[6] Intel’s New Chip ‘Quark’ is Designed for Wearable Tech,http://www.crunchwear.com/intels-new-chip-quark-designed-wearable-tech/[7] What happens if you shrink a P54C Pentium to 32nm and call it Quark?, http://semiaccurate.com/2013/09/11/happens-shrink-p54c-pentium-32nm-call-quark/[8] Intel Quark Soc Datasheet, https://communities.intel.com/docs/DOC-21828[9] CY8C9520A,CY8C9540A, CY8C9560A,20-, 40-, and 60-Bit I/O Expander with EEPROM datasheet, http://www.cypress.com/?docID=31413[10] 英特爾開源PC伽利略將第一時間入華, http://tech.qq.com/a/20131208/001118.htm[11] Product Brief Intel® Quark SoC X1000, https://communities.intel.com/docs/DOC-21829[12] Product Brief Intel® Galileo Board, https://communities.intel.com/docs/DOC-21836[13] EFI Shells and Scripting, http://software.intel.com/en-us/articles/efi-shells-and-scripting[14] Yocto Project, https://www.yoctoproject.org/[15] RoboPeak迷你USB顯示器開源項目, http://www.robopeak.com/blog/?p=377