前言 原创文章,转载引用务必注明链接。水平有限,如有疏漏,欢迎指正。 由于是markdown写成直接粘贴过来,建议直接访问 http://www.omoikane.cn/2016/08/20/edison-wyliodrin/ 以获得更好的阅读体验。 开发环境: - Windows 7 Home Pentium 64bit
- Deepin Linux 15.2 64bit
- iot-devkit-prof-dev-image-edison-20160606(Yocto Project)
wyliodrin是什么之前手头有一块意呆利的Udoo Neo开发板,在KickStarter上众筹大获成功,号称树莓派+蓝牙无线+九轴传感器三合一,做工不错,官网逼格高,开发文档、环境不错,特别是基于Linux USB Gadget的网页开发板配置前端(Web Control Panel),带有远程开发功能很是喜欢。 后来看到一则公告,说Udoo团队参与开发的Wyliodrin即将支持Udoo Neo,于是了解了一下Wyliodrin STUDIO,这就相当于Udoo Neo Web Control Panel(如上图)高级通用版。 Wyliodrin是一个专门为物联网和嵌入式Linux系统而生的开源集成开发环境,并且极大降低软硬件开发难度。我们来看看它有哪些特色呢? 官方支持众多主流开发板,Intel Edison也包含其中。 主要特色如下: - 支持使用TCP/IP或串行端口连接设备
- 支持众多编程语言(包括可视化编程)进行开发
- 提供可视化仪表盘显示传感器数据
- 支持Python和JavaScript包管理
- 支持设备任务管理
- 支持设备网络连接管理
- 使用网页前端开发,不依赖操作系统
- 提供C/C++、Python和JavaScript的Wyliodrin API接口文档
Wyliodrin使用价格: 免费版的话支持两块开发板,足够基本使用,如有更多要求可以付费使用。 如何在Intel Edison 上使用Wyliodrin注册配置Wyliodrin账户基本过程就是注册后登陆Wyliodrin,在新页面中点击“Add new device”,选择“Intel Edison”,点击“Next”并配置网络。完毕后点击小齿轮,选择“Setup Tutorial”即可以看到官方配置教程。 安装Wyliodrin官方编译安装
- mkdir /media/storage #默认这个目录已经有了,无需创建
- mount -o loop,ro,offset=8192 /dev/mmcblk0p9 /media/storage #挂载为loop文件
- cd /media/storage
- sh install_edison.sh #编译安装
复制代码
注意: install_edision.sh有些内容较陈旧,需要手动更新,比如软件仓库版本1.1>3.5。 使用预编译好的软件包大家应该还记得之前写的帖子如何为Edison添加第三方AlexT软件源,我们可以发现其中已经包含了预编译好的Wyliodrin-server,直接使用opkg install wyliodrin命令即可安装,systemctl enable wyliodrin-server命令设置开机启动。由于是已经编译好的包,可以解决部分依赖问题,但是其他设置,需要手动参考install_edison.sh修改,下文会介绍。 发现问题——USB Storage Gadget怪像首次烧录20160606发布的Yocto for Edison之后,使用USB-OTG接口连接笔记本电脑会提示格式化分区。格式化之后向该FAT32分区写入的文件在Edison下并不能访问。尝试安装wyliodrin时,要求将install_edison.sh和个人配置文件wyliodrin.json拷贝到宿主机下的edison分区内。按照要求做之后,结果不知道拷贝的文件跑哪去了。 - 理论上同一分区无法同时在宿主机和edison上挂载,但是连接USB-OTG至宿主机后两者都显示已挂载。
- /etc/fstab里面并没有自动挂载loop0、storage和sdcard的定义,是否是后台服务监控?
思考解决问题以下会接触到诸多知识,例如: - Linux USB Gadget 驱动
- 救援状态
- loop设备文件
- Edison的文件系统
救援模式为了重现该问题,折腾了近一周,无数次重新刷入系统,有几次刷入系统的时候系统关机,或者脑抽拔掉u***-otg,重启后串口输出各种failed。此时会进入救援状态,等同于systemctl rescue,注意被动进入救援模式时需要解决问题才能正常进入系统,主动进入时可以systemctl default或者systemctl reboot退出该模式。 Linux USB Gadget 驱动Edison 使用Linux下的USB Gadget驱动实现USB-OTG 接口模拟有线网络(Android下的USB Tether功能,使用USB数据线共享网络)、存储设备,本身Gadget驱动还支持虚拟串口的功能,这里没有引出。使用lsmod命令可以看到g_multi驱动,modinfo g_multi可以看到详细信息。 该驱动关于mass storage挂载的配置文件位于/etc/modprobe.d/g_multi.conf,内容如下: 意为挂载/dev/mmcblk0p9到宿主机,关闭stall选项(无法热挂载,大致这个意思,你自个儿试一下就知道了)。 那么我们看一看/dev/mmcblk0p9是何方神圣:分别输入以下命令:
- l***lk
- ls -l /dev/disk/by-partlabel/update
- losetup -a
- df -Th
复制代码
结果如下: 可以看到,分区大小为767M的mmcblk0p9分区,就是被挂载到电脑上的ota update分区,过去将系统升级文件在宿主机拷贝到该分区,即可以使用update ota这种命令升级固件,由于现在固件大小超出了该分区大小,默认无法使用(详情见intel支持社区的这条讨论),所以有了将这块分区合并到home分区(/dev/mmcblk0p5)以拓展可用空间的方法。 此外,p9被挂载为loop0设备文件,loop0又被挂载为/media/stoage。 关于如何为块设备提供持久化命名(Persistent block device naming)可以查看这里#by-partlabel),其中by-partlabel方法仅适用于GPT分区。使用ls -l /dev/disk/by-partlabel命令可以看到mmcblk0p9的partlabel就是update,也就是edison的OTA升级分区,大小约800M,如果你不需要OTA分区,可以将合并。 /home分区在每次重刷之后不会重置。 那么理论上,应该可以正常使用mass storage gadget的啊,我们来测试一下: 我们将Grove套件里面的8G 晟碟tf卡(话说SanDisk已经被WestDigital西部数据收购了啊),其分区格式为FAT32,插入到Edison卡槽里。连接USB-OTG线,宿主系统会先识别mmcblk0p9,SanDisk卡会被edison识别为/dev/mmcblk1p1,并自动挂载到/media/sdcard。 输入以下命令:
- # 从宿主系统卸载原来的 /dev/mmcblk0p9
- rmmod g_multi
- # 由于mass storage协议无法同时访问一个设备,我们需要先从edison卸载
- umount /media/sdcard
- # 重新挂载/dev/mmcblk1p1至宿主系统,当然你也可以挂载一个镜像文件
- modprobe g_multi file=/dev/mmcblk1p1 removable=1 stall=0
复制代码
在宿主机中新出现的分区里创建新文本文件host_sd.txt。卸载该分区并在edison里重新挂载:
- rmmod g_multi
- mount /dev/mmcblk1p1 /media/sdcard
- ls /media/sdcard
复制代码
OK,文件在的。反之创建edison_sd文件,同样在宿主机可以访问,证明g_multi驱动正常,问题可能出在mmcblk0p9上。 我们参考intel edison官方社区的讨论帖1、2、3 使用如下命令:
- rmmod g_multi
- mkdir /update
- losetup -o 8192 /dev/loop0 /dev/disk/by-partlabel/update
- mount /dev/loop0 /update # 这两句可以合并成一句:mount -o offset=8192 /dev/mmcblk0p9 /update/
- # To reverse this, and make it available on your host machine:
- cd /
- umount /update
- modprobe g_multi
- # then pull the u*** cable and re-insert it, at which stage the disk should re-appear on your host machine.
复制代码
这个偏移8192 bytes是什么意思我还不理解,希望大家不吝指教。stackoverflow.com上的一个问题讨论 loop文件关于loop文件的介绍推荐man.linuxde.net上[关于losetup的说明][%E3%80%82%E8%BF%99%E9%87%8C%E5%85%88%E5%B0%86mmcblk0p9%E6%8C%82%E8%BD%BD%E4%B8%BAloop0%EF%BC%8C%E7%84%B6%E5%90%8Eloop0%E6%8C%82%E8%BD%BD%E5%88%B0/media/storage%EF%BC%8C%E4%B8%8D%E7%9F%A5%E9%81%93%E5%8E%9F%E5%9B%A0%E6%98%AF%E4%BB%80%E4%B9%88%E3%80%82%E6%AD%A4%E5%A4%96%E8%BF%98%E6%9C%89%E5%81%8F%E7%A7%BB8192]http://man.linuxde.net/losetup]。这里先将mmcblk0p9挂载为loop0,然后loop0挂载到/media/storage,不知道原因是什么。此外还有偏移8192 bytes。 回头来看mmcblk0p9该分区为FAT32,而非FAT16,两者区别可以看文末的链接。linux下操作fat32文件系统的工具集是dosfstools,默认功能包括dosfsck,mkfs.vfat,dosfslabel等。执行以下命令从宿主机卸载mmcblk0p9并执行扫描:
- rmmod g_multi
- umount /media/sdcard
- dosfsck /dev/mmcblk0p9
复制代码
结果如下: 我们重新格式化该分区
- mkfs.vfat -F 32 -n EDISON /dev/disk/by-partlabel/update # 这样格式化以后没有8192 bytes偏移了
- echo "/dev/mmcblk0p9 /media/storage auto ro 0 0" >> /etc/fstab
复制代码
此时可以正常在宿主机和edison下挂载及写入读取文件了。 将wyliodrin.json从宿主机拷入EDISON分区。 使用Wyliodrin注意 8192 bytes偏移以及系统其他位置的挂载设置问题没解决,暂时无法自动挂载,需要手动挂载分区。后面希望在官方社区求助一下。
在Intel Edisong上启动Wyliodrin-server:
- mount /dev/mmcblk0p9 /media/storage # Wyliodrin需要从这里读取json配置文件,我们手动挂载它
- systemctl restart wyliodrin-server # 重启Wyliodrin-server使其从/media/storage读取配置
复制代码
我们回到https://projects.wyliodrin.com并登陆,稍等一会即可看到Edison处于online状态: 我们创建一个LED闪烁的demo——blink,这里使用Python,实际上Wyliodrin支持大多数主流编程语言以及ardublock这种图形编程语言。 此外,Wyliodrin还支持内置shell,手机APP显示各种传感器数据,以及可视化DashBoard的使用,如图所示。 总结基本情况介绍到此,其中还有很多不完善的地方,后续会慢慢解决。 Intel Edison 和树莓派相比,没有价格优势,社区不够大,多媒体能力较弱,乍一看其竞争力并不是那么强。 但是深入使用Intel Edison之后,了解到它的设计理念,就会深深被Intel Edison的工程师所折服。树莓派是一个偏向软件编程的多媒体设备,顺便很多爱好者用它做出了不少有趣的项目。而Intel Edison是一个专业的物联网开发板,虽然价格有点高,但是使用起来非常爽快,尤其得知Edison项目以及非常棒的Intel XDK IoT 开发环境都是由中国团队发起完善的,真心想说一句good job。 Wyliodrin降低了开发门槛,提供很多方便的开发功能,虽然可能会有多而不精之虞,但是总体还是很方便的,尤其是可以在外地远程开发,不需要局域网或是内网穿透。 前几日Elecfans又提醒我该结项了,才依依不舍拿出这篇拙作献丑,但是结项不代表以后就不能分享经验了。我希望自己的试用心得可以从低级到高级,学习讨论Edison的特色之处,让大家知道Edison是什么,能做什么,怎么做,也很乐意和大家交流,而不是直接掏出Intel XDK开发环境跑几个官方示例,多开心。 2016年9月11日夜,与诸君共勉。 参考及进一步阅读USB gadget设备驱动解析 格式化FAT32和FAT16区别在哪?/ FAT16 vs. FAT32 Intel Edisonで USBマウントしたボリュームを見る方法 How do I hot-swap a mass storage LUN backing file in the Linux composite USB gadget? USB2.0里面的STALL ☆Yocto Project 里关于 Mass Storage Gadget功能的说明 LUN, Logical Unit Number,逻辑单元号 / Wiki LUN
|