结缘 Radxa Rock
从选板、开箱到跑起 Debian,再用 GPIO 控制板载 LED

去年的时候,就发现身边不少学 EE 的小伙伴们都在玩 Raspberry Pi,我也一直想找块开源开发板来折腾一下,不过之前都木有时间,一直到了前几周的时候,才开始考虑这个问题。

基于 ARM 的开发板看着确实很诱人,由于这些板子都运行着 Linux 或者 Android 等操作系统,并且具有可以自己编程控制的 GPIO 接口,因而就使得 Geek 们以较低的代价来实现对于很多小设备的简单控制功能。我本人虽然不使用任何 Android 设备,但是能运行 Linux 对于我的折腾需求来说,就已经足够了。

准备买板子的时候,总觉得 RPi 的性能好像太差了一点,毕竟板子已经出来多年了,上面用的好多东西现在看来有些过时,周围玩 RPi 的童鞋也告诉我这东西跑 Linux 其实也就性能一般的样子。所以就想找找其他的板子,一开始我是很想从易络盟订一块 TI 的 BeagleBone Black,TI 的产品质量向来不错,而且 BBB 的软件支持也相当不错。不巧的是,易络盟的中国区销售表示他们暂时缺货,等他们重新订到货估计就是年后了,看样子我又只能暂时把这件事情搁置一下了。

这时候遇到了一件很有意思的事情,Cubieboard 的作者 Tom Cubie 大神在我的 hosts 站点上留了言,使我偶然间关注到了他的新产品 Radxa Rock。由于是 Tom 新团队的第一个产品,在发售以前,Radxa 似乎在国内还没有多少人气,国外倒是已经见到相关的文章提到这块板子了(我也觉得略不科学,怎么说 Tom Cubie 也是中国人呀 :-P)。

国内设计的东西向来是以较低的成本可以实现相当凶残的性能,Radxa 应该就算是这个情况,下面的这张表格就是翻译自其官网的具体硬件规格。

基本信息

项目 配置

CPU

ARM Cortex-A9 四核处理器,主频 1.6GHz

内存

2GB DDR3,频率 800MHz

存储

8GB 板载 NAND,最大支持 128GB Micro-SD SDXC

GPU

Mali400-MP4,频率 533MHz,OpenGL ES 2.0

数字视频

HDMI 1.4,支持 1080p@60Hz

模拟视频

AV 输出

局域网

10/100M 以太网接口

Wi-Fi

150Mbps 802.11b/g/n,带天线

蓝牙

蓝牙 4.0

音频接口

S/PDIF 接口、3.5mm 音频输出接口

USB 接口

2 个 USB 2.0 标准接口

USB OTG

Micro-USB OTG 接口

串行接口

串行控制台接口

红外线

支持自定义红外遥控

开关

1 个电源开关、1 个恢复开关、1 个重启开关

LED

三个可编程 LED

RTC

支持关机定时动作

扩展接口

80 针接口,包括 GPIO、I2C、SPI、Line in、USB 2.0、PWM、ADC、LCD 等

从表中参数来看,Radxa 的硬件规格已经足够秒 BBB 的 1GHz Cortex-A8 的配置了,更不用说是性能更为寒酸的树莓派。Radxa 的硬件性能理论上已经和若干年前的 PC 机不相上下了,加上标称功耗 5W,如果不使用移动硬盘之类的大功耗 USB 外设的话,最多也就 2~3W 的样子,放在家里长期开着也没啥成本。

Radxa Rock 开发板外观

价格上,Radxa 官方报价 99 刀,虽然有些贵了,但是照着这个性能来说,还算不错。加上 Tom Cubie 这次的产品主要就是面向国际市场,并且从第一批工程样板的照片来看,这板子的做工方面也不会太差。元旦发售的时候,因为发售前就关注过,他们送了 10 刀的优惠券,果断 89 刀拿下。

接下来,送上我自己收到东西后的几张开箱照片。

Radxa Rock 包装与配件
Radxa Rock 开箱照片
Radxa Rock 开发板实物

板子到手,后面又可以有新玩具折腾了 :-)

让 Debian 在 Radxa 上跑起

Radxa Rock 到手以后,对我而言,需要折腾的第一件事情就是装一个 Linux 跑起来。Radxa 发出来的时候默认在板子上安装了 Android,官方也提供了一个 Ubuntu 的系统镜像,不过我个人很想用 Debian 来玩这板子,所以这回就来折腾一下适合 Radxa 的 Debian 版本 root 文件系统,后面简称 rootfs。

Radxa Rock 与绝大多数采用瑞芯微 RK 系列 CPU 的设备引导方式类似,可以将 Linux 系统的内核以及引导刷到 NAND 中的 recovery 分区,对应的 rootfs 可以设置在 NAND 或者外部存储设备上。需要自己动手折腾一下的主要就是做 rootfs。

因为 Radxa 官方没有提供 Debian 的 rootfs 镜像,自己折腾的话无非就是两个选择,从头开始或者找一个比较干净的半成品再加工。我这里用了省事儿一点的做法,找了一个给 RK3188 板子用的 Debian 7 Wheezy 镜像,使用 Rockchip 的工厂工具解包,提取出 rootfs 部分。

原始镜像压缩得非常精简,里面已经没剩下太大的空间,特别是剩余可供分配的 inode 也不充足了。为了后续添加内核模块,以及配置需要的软件包,我先对镜像文件进行了扩容。

因为镜像原本针对其他板子配置,硬件上肯定会有差异,所以还需要替换成 Radxa 对应的内核模块。虽然 Radxa 的 Linux 内核驱动还不是做得很完善,比如 GPU 这部分暂时还不能驱动起来,不过配置一下 kernel modules 总比不配置强,至少无线模块这部分可以驱动起来。

后面的系统配置,我是在 Ubuntu 12.04 LTS 下使用 qemu-user-static 和 binfmt-support,通过 chroot 进入 ARM 的 rootfs 来完成的。修改设备名、软件源和网络配置,安装 SSH 等基础软件包,最后再把镜像写到 TF 卡上。

可能我有给东西分配名字的不良嗜好,不过至少要比 TBBT 的 Sheldon 同学给几乎所有东西贴上标签来得正常 :-P 我这里直接把原来的 rk3188 改成了 radxa。

Radxa 上默认的有线网络 MAC 地址是随机生成的,可能每次使用都会有变化,这就非常不适合局域网管理,所以我在网络配置里手动指定了一个。也可以在路由器上给它分配固定 IP,便于后续远程管理。

实话说,Radxa 用的 NAND 颗粒 I/O 速度确实比较慢,我完全不考虑在 Linux 下用这部分空间。从官方给出的模块示意图来看,TF 卡槽直接连在 CPU 的控制器部分,而不是从 USB 控制器上分出来的。

Radxa Rock 硬件框图与外设连接关系
图 1. Radxa Rock 硬件框图

我找了一块 SanDisk 的 85MB/s MicroSD 卡装上,果断速度很给力,所以把系统放在了读写性能好一点的卡上,用起来可以快很多。

最后再附上一张 Radxa 运行 Debian 桌面的截图,需要提醒的是,因为 GPU 暂时还没有驱动起来,不是很建议通过图形桌面来在 Radxa 上管理 Linux。

Radxa Rock 运行 Debian 桌面的截图
图 2. Radxa Rock 上运行 Debian 桌面

通过 GPIO 控制 Radxa 的 LED

在 Radxa Rock 官方的配置说明中,板子上带了三个可编程控制的 LED 指示灯,正式版中分别为红、绿、蓝三个,并依次排列在电源开关附近。在启动默认的 Android 系统的时候,也会亮起蓝色的指示灯。那要如何在 Linux 下控制这些 LED 呢?

首先来看 Radxa 官方 Wiki 给出的一段演示脚本,用于控制绿色 LED 闪烁。

#!/bin/sh

# enable the gpio 172 -> green led
echo 172 > /sys/class/gpio/export

# set the direction to output
echo "out" > /sys/class/gpio/gpio172/direction
while true;
do
    echo 0 > /sys/class/gpio/gpio172/value #led on
    sleep 1
    echo 1 > /sys/class/gpio/gpio172/value #led off
    sleep 1
done

从这个演示程序中可以看到,Radxa 的 LED 直接连接在 GPIO 上,利用 Linux 下 /sys/class/gpio 这个文件接口进行操作,就可以实现简单的控制功能。如果有比较高级的需求,还是需要编写相关的驱动程序,不过这回就先不折腾驱动程序这部分了。

LED 的控制非常简单,只需要控制对应 GPIO 管脚的电平高低即可控制其发光状态。需要了解的最主要信息,无非就是 LED 对应的控制引脚编号。官方已经给出了 设计图,所以要确定 LED 的控制引脚并不困难。

绿色 LED 连接在 GPIO0_B4,蓝色 LED 连接在 GPIO0_B6,而红色则由 GPIO0_B7 控制。接下来,需要计算这些引脚在 Linux 下对应的编号,参考 RK3188 内核中 GPIO 头文件即可找到相关定义。

RK3188 内核中 GPIO 引脚编号的定义
图 3. 内核中的 GPIO 引脚定义

将 PIN_BASE = 160 以及 NUM_GROUP = 32 代入计算,可以得出绿色、蓝色、红色 LED 的引脚编号分别为 172、174、175,相关计算也可参考 Bitbanging the Radxa Rock GPIOs。

我准备通过一个简单的脚本,实现开机后自动熄灭红色 LED,并亮起绿色 LED 的功能。创建 /usr/local/bin/power-led-on.sh,写入下面的内容。

#!/bin/bash

for LED_IO in 172 175
do
    echo $LED_IO > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio$LED_IO/direction
    echo 0 > /sys/class/gpio/gpio$LED_IO/value
    echo $LED_IO > /sys/class/gpio/unexport
done

由于连接线路不同,蓝绿 LED 与红色 LED 的发光控制数值正好相反。

蓝绿 LED 的连接电路,低电平点亮
图 4. 蓝绿 LED 的连接电路
红色 LED 的连接电路,高电平点亮
图 5. 红色 LED 的连接电路

蓝绿 LED 使用 0 输出控制点亮,1 控制熄灭,而红色 LED 则使用 1 控制点亮,0 控制熄灭,因而这里的操作可以方便地写在同一段循环体内。

为脚本赋予执行权限。

sudo chmod +x /usr/local/bin/power-led-on.sh

然后编辑板子上的 /etc/rc.local,在 exit 0 之前添加下面的内容。

/usr/local/bin/power-led-on.sh

做完设置以后,重启 Radxa,就可以看到板子上的绿色 LED 亮起,红色 LED 熄灭。


最后修改于 2014-02-02