x86 版的 Arduino Intel Galileo 开发板的体验、分析和应用
1.前言
在今年(2013)罗马举办的首届欧洲 Make Faire 上,Intel 向对外发布了采用 x86 构架的 Arduino 开发板:Intel Galileo。这无疑是一个开源硬件领域的重磅消息。作为 CPU 领域的巨头 Intel,为开源硬件 /Maker 领域这个从前相对小众的圈子推出专门的硬件,无疑说明对开源硬件领域发展的重视程度。同时,Intel 也作为本届欧洲 Maker Faire 的主要赞助商。
图:Intel Galileo 开发板,图片来自 intel.com
在 PC 行业,Intel x86 构架的强大性能一直被行业称道,自然这次推出的 Arduino 开发板,也给业界带来了无限的遐想。我相信很多人都会略带调侃问:这个开发板能不能运行 Windows 这样的问题。同时,相信也有不少人会关心 Intel Galileo 的功耗问题,以及开发使用上是否具有难度。
作为曾在 Intel 工作过的作者,对老东家能够推出针对开源硬件市场的产品感到欣慰。通过朋友,我也有幸在较早时间拿到了一块 Intel Galileo。经过了一段时间的使用和体验,这里我就将我们对 Intel Galileo 的一些使用体验向大家分享。并且作为开源硬件和机器人开发的从业人员,聊聊 Intel Galileo 到底可以给我们带来哪些想象空间?
这里也先针对那个调侃问题做个回应:是的,通过软件的调整,Intel Galileo 的确可以运行 Windows。
图:使用 RoboPeak 微型 USB 显示屏,给 Galileo 增加显示屏变成标准 PC
2.开箱体验与基本使用
2.1 开箱体验
由于 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 摄氏度左右。
3.Intel Galileo 技术浅析
通过前文的介绍,大家应该了解到通过 Intel 提供的 Arduino IDE,就可以像标准的 Arduino 版那样进行开发了。不过光是实现标准 Arduino 开发板能做的事情,这完全没法体现出 Intel Galileo 有何特殊之处,最多只能是一个速度更快的 Arduino 罢了。
如果功能上没有任何比传统 Arduino 过人之处,相信 Intel 也不会推出这样的产品了。其实 Intel Galileo 真正强大之处并不在于前面提到的基于 Arduino IDE 的开发,而是背后基于 UEFI/Linux 的软件平台以及 Galileo 自身的硬件配置。为此,Intel 提供了丰富的开发文档、软件代码支持,方便开发人员真正的发挥出 Galileo 的所有潜力。而要了解使用这些功能,就需要我们更加深入的去了解 Intel Galileo 的内部构成和更深入的软件构架。
大家可能也会有这几个问题:
- Galileo采用的处理器是Atom处理器还是别的?
- 处理器的功耗问题
- 外设/GPIO等是怎么与CPU互连的
- 有哪些接口和资源可以使用
- Arduino的程序是如何运行的
- Galileo可以运行Windows或者Linux吗?
这里我将为大家揭开这些谜团。
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 芯片那样支持 x64、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 编译器和工具链
4. Intel Galileo 的高级操作
在分析了 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 系统包含了更多的驱动,以及带有如下的库/程序:
- OpenCV
- Python
- node.js
图:在 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 界面
5. 扩展开发举例和可能性探讨
介绍完了 Intel Galileo 的实现细节以及各种使用后,我来向大家分享下基于 Intel Galileo 进行开发的心得。这里我主要围绕操作系统层次进行介绍。
5.1 参考资料一览
Intel 目前几乎提供了 Galileo 一切的资料,有了这些资料,只要能购买到 Quark SoC 芯片,自己 DIY 一块 Galileo 是完全没问题的。目前在 Intel Galileo 官方网站[1]中已经提供的资料有:
- Intel Galileo 的电路原理图
- Intel Galileo PCB Layout
- Intel Galileo BOM 清单
- Intel Galileo 采用的 UEFI、Grub、Linux 的源代码以及开发文档
- Quark SoC x1000 数据手册
- Quark SoC x1000 开发文档
如果你打算基于 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 盾等。
6.小结
本文是我对 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
相关文章
【Arduino】开发入门教程【一】什么是Arduino
【Ardunio】开发入门教程【二】数据类型
【Arduino】开发入门教程【三】Arduino开发工具
【Arduino】开发入门教程【四】Arduino驱动安装
【Arduino】开发入门教程【五】Hello Arduino
【Arduino】开发入门教程【六】数据类型转换函数
【Arduino】开发入门教程【七】7段显示器实现+源代码
【Arduino】开发入门教程【八】舵机操作+源代码
【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信
//////////////////////////////////////////////