揭开面纱

机缘巧合的情况下,博主有幸得到了一次高通Dragonboard410C开发板的试用机会,Dragonboard410C也熟称龙板,下面简单介绍一下这个板子吧,资料摘录于网上。
硬件方面,DragonBoard 410c是一款搭载Qualcomm® Snapdragon™ 410(64位的四核处理器)的开发板,内置 8GB eMMC (支持标准microSD卡槽),内置wifi、蓝牙、和GPS模块,具有HDMI 输出及USB 接口 (3个),兼容96Boards消费版(CE)规范。
软件方面,DragonBoard 410c目前已经可以运行Android5.1、Ubuntu、Windows 10 IoT Core、Debian系统。

经过一段时间的等待,开发板送到博主手里,博主便面临了第一个问题,以往树莓派或者国产Pi这类开发板都是USB供电,但是龙板需要12V 2A的电源进行供电,而且电源插头还比较小,经过淘宝筛选,最终选定如下电源组合方案:网件路由器原装电源 + 万能DC转接头。东西到手后发现非常好用。

IMG_5854.jpg
IMG_5858.jpg
IMG_5861.jpg
IMG_5862.jpg
IMG_5868.jpg
IMG_1598.jpg
IMG_2291.jpg
IMG_2353.jpg

装系统

龙板装系统还是比较简单的,博主选用Debian系统,装新系统前使用了一会默认自带的Android,正好接到电视上,运行十分的流程,毫无卡顿的感觉。
1.TF卡安装
Mac终端登录到root用户
diskutil unmount /dev/disk1s1
dd bs=409600 if=debian.img | pv | dd bs=409600 of=/dev/rdisk1
这里加pv命令是为了能看见写入进度
当TF卡烧录完成之后,龙板断电,把TF卡插入龙板,将开发板背面的启动选择开关拨动为0-1-0-0,即将SD Boot拨动到ON位置,其他关闭,之后连接显示器、鼠标、键盘等外设,龙板上电开机,按照图形提示安装即可,步骤很少比较简单。
2.Fastboot线刷
博主是iOS程序猿,一些Android程序猿电脑估计Fastboot是必备的,博主这里现安装的
下载Google官方的Fastboot独立包:
platform-tools-latest-darwin.zip
platform-tools-latest-linux.zip
platform-tools-latest-windows.zip
之后解压缩到工作目录,并在终端里导入环境变量
export PATH=$PATH:工作目录/platform-tools
龙板Fastboot连接
首先需要确保开发板背面的启动选择开关处于0-0-0-0状态,然后需要通过usb连接到电脑。先启动时按住S4(音量 -)键再插电源,20左右fastboot devices看见设备。之后烧写bootloader、boot、root

顺便利用nBench来横向测评一下龙板、树莓派3、树莓派2的性能横向对比
龙板:
Dragonboard410C.png
树莓派3:
3.png
树莓派2:
2.png

试用选题

起初博主是打算把之前做的机器人核心板用这个龙板来实现的,但是后来考虑时间很短,虽然三周,但是帝都的程序员加班大家懂的,难免保证不了开发时间,所以再三考虑,决定把选题修改为环境监测器,模拟要解决的情景就是上班族在下班回家的路上就可以通过手机查看家里的温湿度情况,然后控制空调,来预先调节好家里舒适的温度环境。

功能设计

针对上述情景,其实博主想做的就是一个最简单的闭环操作,检测到传感器检测到温湿度->反馈给开发板->开发板通过手机反馈给人->人操作空调调整温湿度->形成闭环。那么就设计功能如下
1.外网服务器,跑内网穿透服务端用;
2.开发板需实现温湿度采集,和控制空调,以及搭建Web服务器和运行内网穿透客户端;
3.后端服务接口,提供历史温湿度、实时温湿度;
4.iOS客户端,用来查看温湿度和控制空调;

查找资料

1.内网穿透之前就一直在用,这个就不过多说明了,Ngork和FRP都可以,博主选用的是FRP,服务于家里的Gen8塔式服务器和几个树莓派。
2.温湿度采集需要用到DHT11模块,之前这类模块可以很简单方便的在树莓派上使用因为有现成的驱动和程序,在龙板上需要自己写驱动,DHT11使用GPIO通信,故需要查找龙板的GPIO操作方法,以及Linux系统下与驱动相关的知识(设备树、内核编译等)。
3.遥控空调使用的是Linux下开源的LIRC软件,这是一个红外万能遥控器程序,需要与红外发射模块和红外接收模块配合使用,但是有一个困难跟上一条一样,就是树莓派内置了LIRC的设备驱动lirc_rpi,龙板上没有,也得自己想办法编写驱动。
到这里博主其实遇见了很多困难和问题,最主要的一点客观原因是,博主本质职iOS程序猿,接触硬件是兴趣因素比如我喜欢鼓捣玩或者做做机器人玩玩模型啥的,另一点接触硬件的原因就是第一份全职工作是开发智能家居,所以综上,博主属于那种软件程序猿,但是硬件懂一些懂的不特别深入的那种,这时候查阅高通文档的时候就遇见了一些困难,比如操作GPIO需要了解设备手册和原理图一类的,有时候搜索查阅文档就显得有些力不从心。

开发环境的搭建

这里博主在Gen8上虚拟化了一个Ubuntu来做编译内核和驱动用,之后再传到龙板上,因为毕竟服务器的编译速度和磁盘空间大很多。
下载内核源码,内核源码仓库地址:
kernel.git
使用Tag:debian-qcom-dragonboard410c-17.09
可以用git克隆下来自己检出代码,也可以直接下载源码压缩包
kernel-debian-qcom-dragonboard410c-17.09.tar.gz

下载编译工具:
gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz(这里博主机器上用的是老版本的)
下载DTC(设备树编译工具):
sudo apt-get install device-tree-compiler
git clone git://codeaurora.org/quic/kernel/skales
下载initrd镜像
打开http://builds.96boards.org/releases/dragonboard410c/linaro/debian/latest/
下载:initrd.img-4.9.56-linaro-lt-qcom
至此下载准备工作完成,把文件按照分类放到工作目录的根目录下,分别是gcc-linaro-4.8-2015.06-x86_64_aarch64-linux-gnu(编译工具)、image(镜像)、kernel-debian-qcom-dragonboard410c-17.09(内核源码)、skales(设备树编译工具)
QQ20171208-0343002x.png
工作目录如上
配置编译源码时编译工具的环境变量,有2种方法:
1.直接修改内核源码的Makefile,修改ARCH和CROSS_COMPILE
ARCH ?= arm64
CROSS_COMPILE ?= /root/db410c/gcc-linaro-4.8-2015.06-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
kernel-Makefile.jpg
2.Makefile里写默认是环境变量,所以可以每次ssh登录到终端后,export环境变量,当然,想写死在环境变量的配置文件里也是可以的
export ARCH=arm64
export CROSS_COMPILE=/root/db410c/gcc-linaro-4.8-2015.06-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
至此,开发环境准备完成

开发

QQ20171208-0326022x.png
看了博主说那么多应该也能感觉到,博主是好折腾的那种人,软件、硬件、服务器、服务端、运维全都接触,所以上来就先在自己的Git上创建了该试用项目的组织,并邀请好友一起帮忙开发(PS.一个人时间太紧了,总加班,ಥ_ಥ)~

QQ20171208-0333522x.jpg
QQ20171208-0334032x.jpg
花了两天晚上的业余时间,参考了一款天气预报的APP,画出了原型图

内网穿透

使用FRP,穿透的方案是:公网Nginx(域名解析)->公网FRP服务端->龙板FRP客户端->龙板Nginx(域名解析)。
创建工作路径mkdir -p /etc/frp
分别把frpc frpc.ini放到工作路径下

安装supervisor做FRP的守护进程
sudo apt-get install supervisor
编写服务的conf
sudo vim /etc/supervisor/conf.d/frpc.conf
启动supervisor
supervisord -c /etc/supervisor/supervisord.conf

接下来是恼人的驱动开发了,网上Google搜索DragonBoard410C GPIO的关键词,搜出来的全是如下
1. 导出
/sys/class/gpio# echo 44 > export
2. 设置方向
/sys/class/gpio/gpio44# echo out > direction
3. 查看方向
/sys/class/gpio/gpio44# cat direction
4. 设置输出
/sys/class/gpio/gpio44# echo 1 > value
5. 查看输出值
/sys/class/gpio/gpio44# cat value
6. 取消导出
/sys/class/gpio# echo 44 > unexport
但是后来发现驱动里一般不用这个方法,于是静下心来开始查阅学习了Linux ARM板的驱动开发流程。

DHT11

先改写设备树增加设备描述,之后编译内核、设备树,并与initrd一起生成boot.img引导镜像。
QQ20171208-0344482x.png
添加设备树在跟节点上
之后配置编译
make defconfig distro.config
make -j4 Image.gz dtbs KERNELRELEASE=4.9.56-linaro-lt-qcom
把编译好的设备树生成镜像
./skales/dtbTool -o image/dt.img -s 2048 kernel-debian-qcom-dragonboard410c-17.09/arch/arm64/boot/dts/qcom/
把内核镜像和设备树镜像和初始化磁盘镜像,打包生成boot镜像
./skales/mkbootimg –kernel kernel-debian-qcom-dragonboard410c-17.09/arch/arm64/boot/Image –ramdisk image/initrd.img-4.9.56-linaro-lt-qcom –output image/boot-db410c.img –dt image/dt.img –pagesize 2048 –base 0x80000000 –cmdline “root=/dev/disk/by-partlabel/rootfs rw rootwait console=ttyMSM0,115200n8”

之后龙板开启到fastboot模式,刷入boot镜像,系统镜像不需要重刷。
刷好后重启进入系统,这里的感受就是,龙板每次重启速度真的很快。重启后进入/sys/devices/platform/路径下,如果有dht11路径,则说明设备树添加成功,进入DHT11路径后发现没有iio设备,这是因为我们还没有挂载驱动的原因。
这里使用github搜到的dht11.c驱动为蓝本,更改驱动的匹配标识跟设备树的一致,调整gpio获取方式,调整数据原始数据的读取。
QQ20171208-0358402x.png
中间多次尝试多次失败的过程就不在累述,直接贴驱动源码

Makefile如下

之后make编译,编译后生成dht11.ko,注意Linaro用户下要sudo执行insmod dht11.ko,当驱动挂载成功后,在路径/sys/devices/platform/dht11/下会出现iio:device0设备,进入设备,发现有in_humidityrelative_input,in_temp_input文件,cat这两个文件就能获取到温湿度的值。

PHP

到这一步之前,已经把外网访问到开发板以及DHT11的底层驱动都做好,这里只要写出PHP,来读取温湿度,并配合crontab实现定时任务,写入数据库,即可完整服务端接口的工作。于是先搭建Web服务器,可以选择LNMP或者Lighttpd+SQLite3+PHP
龙板的性能完全没有问题,出于习惯使用LNMP
安装Web服务
apt-get -y install nginx
安装PHP
apt-get -y install php7.0-fpm php7.0-mysql
安装数据库
apt-get install -y mysql-server mysql-client(会自动安装最新的MariaDB)
初始化数据库权限
mysql_secure_installation,密码设置为xxxxxx
mysql -uroot -pxxxxx
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’localhost’ IDENTIFIED BY ‘xxxxxx’;
至此Web服务器安装完成,接下来配置温湿度的nginx配置文件

至此Web服务器配置完成

接着在刚配置的Nginx工作路径下,配置部署PHP代码
文件分为Mysql.php(数据库读写) crontab.php(定时任务) index.php(获取历史温湿度) now.php(获取试试温湿度)

采集策略是每30分钟定时采集一次,由于温湿度可能会当次采集失败,所以定时采集时,如果失败则间隔1.5秒再次重试,重试上限15次,将采集到的结果写入数据库。如果是实时获取温湿度,如果失败则间隔1秒再次重试,重试上限3次。

iOS客户端

设计采用上下滑屏的方式,初始屏幕是当前天气预报和实时的房屋温湿度,上滑屏幕出现历史温湿度曲线,不仅能看见数值,还能看见趋势。这个挺简单的,也就没什么可说的了

最终成果

IMG_2290.jpg
IMG_2308.jpg
IMG_2309.jpg
Dragonboard410CiOS.gif

关于红外遥控

本来在等待龙板到手的这段时间里,已经在树莓派上把LIRC遥控空调跑通了,并且录制了空调的红外码,不过试用时间只够调整完DHT11驱动的,LIRC的驱动踩了很多坑需要调整lirc_dev和lirc_rpi(用树莓派的改写)两个驱动,所以目前还没有改写完- -!