【EVB-335X-II试用体验】 基于Yocto的嵌入式的敏捷项目开发:以电子相册为例

2019-07-12 18:49发布

EVB 335X-II有一个800*480的屏幕,如果放在家里,那么我们可以做一个电子相册,在家里放着的时候,可以自动播放图片幻灯片。这篇博客,我们将使用开源方案以及Yocto来构建和完成这个小项目。

方案选择我们可以自己使用Qt/C++甚至Python,C来写一个直接操作Framebuffer,并针对不同size的图片进行适配和Zoom In/Out缩放处理,还需要对不同图片的加载进行判断,同时如果我们还希望在图片上面显示字的话,还需要一些叠加处理,然后我们还需要进行交互的API暴露,例如让user可以查看Next与Previous Picture; 网络支持;缩略图显示支持;网络图片支持;透明显示;放大缩小支持;EXIF信息解析与显示与叠加;只显示特定特征的图片;抗锯齿。
可以看到,本来想着是一个简单的电子相册,如果想去做好,并不容易。需要考虑的方面很多。
这里我们使用feh这个开源的方案。
feh有诸多的优点,feh使用imlib2并基于X11来显示,同时支持插件化配置,还支持网络。
其官方列出的features有:
  • Various operation modes:
    • Slideshow: Show all files in or below a directory, change slides with your keyboard or automatically after a delay
    • Thumbnail: List files as clickable thumbnails
    • List: ls-like output with image dimensions etc.
    • Multiwindow: Open all images at once
  • optional HTTP/FTP support via libcurl
  • Can be used as wallpapersetter, supports rxvt transparency
  • Filelist support
  • Lots of configurable keyboard shortcuts. Well usable without mouse
  • Custom actions (shell commands), e.g. for sorting images


以上这些features并不是feh的全部功能。大家可以man 一把或者看看doc。下面是feh的一些文档与screenshot:
http://man.finalrewind.org/1/feh/
http://feh.finalrewind.org/examples/


实现
在Yocto/Open-Embedded现有layers/recipes中feh没有加入,同时它依赖的一些包也不在里面。因此我们需要添加一些软件包。包括运行时的依赖与编译时的依赖。

依赖关系
我们在feh的官网可以看到下面这样子的prerequisite:
First, install the dependencies:
apt-get install libcurl4-openssl-dev libx11-dev libxt-dev libimlib2-dev libxinerama-dev libjpeg-progs

这个是Debian/Ubuntu准备的依赖,但是我们Yocto/Linux中很多包的名字并不对应,甚至可能就是其他的包中的sub package。对于在前面我们搭建好的Yocto环境中,我们可以去查找一下有的包。然后我们可以发现最终我们只需要:

移植libimlib2
构建好X11让feh有display
而X11在yocto中各种包都有我们可能需要的是将其config好就行了。可见yocto其实给了我们一个非常快捷的做项目的构建系统和环境。

libimlib2与feh的移植
添加依赖
我们直接在meta-bbb中添加即可。但是在添加之前,我们需要添加libimlib2的依赖,并安装到image中。因为是X11,我们直接使用core-image-x11这个image作为base来构建,我们在image的bb中添加下面这些packages:



添加imlib2 recipes
这个recipes的足够如下:
$ tree ../imlib2/
../imlib2/
├── imlib2
│   ├── copyright
│   └── imlib2-1.4.9.tar.bz2
└── imlib2_1.4.9.bb

1 directory, 3 files


其中tar bz2包可以从sourceforge下载:

其中bb文件内容如下:
DESCRIPTION = "im lib2"

RDEPENDS_${PN} = "freetype libxdmcp tiff libx11 jpeg libbz2 libxext libxcb libpng liblzma zlib libxau"

SECTION = "libs"
LICENSE = "MIT"
#PV = "1"
#PR = "r0"

SRC_URI = "
    file://imlib2-${PV}.tar.bz2
    file://copyright  
"

LIC_FILES_CHKSUM = "file://${WORKDIR}/copyright;md5=3dd6192d306f582dee7687da3d8748ab"
S = "${WORKDIR}/imlib2-${PV}"

inherit autotools pkgconfig

FILES_${PN}-dbg += "
    ${libdir}/${BPN}/loaders/.debug
    ${libdir}/${BPN}/filters/.debug
"

FILES_${PN} =  "
    ${bindir}
    ${sbindir}
    ${libexecdir}
    ${libdir}/lib*.so.*
    ${sysconfdir}
    ${sharedstatedir}
    ${localstatedir}
    /bin
    /sbin
    /lib/*.so*
    /usr/share/*
    ${libdir}/${BPN}
    ${libdir}/${BPN}/*
"


重点说明一下里面的autotools与pkgconfig,这个是因为这个libimlib2使用的是标准的autotools/autoconfig来构建编译,所以我们需要添加inhert才会正确的编译。
但是因为它的make install不标准,所以我们自己直接在FILES中redefine。同时我们也可以参考Ubuntu中的文件位置来确定我们需要install到哪:


另外如果有注释,那么需要在注释中完全用#注释掉,不要遗留反斜杠,否则会出错:




添加feh

我们在recipes-bsp中添加下面这些文件:
22:45 hexiongjun:feh $ tree
.
├── feh
│   ├── copyright
│   └── Makefile
└── feh.bb

1 directory, 3 files

其中关键的是feh.bb:
RDEPENDS_${PN} = "curl libx11 libpng libxinerama imlib2"

SECTION = "libs"
LICENSE = "MIT"

SRCREV = "${AUTOREV}"

SRC_URI = "
    git://github.com/derf/feh.git;protocol=https;branch=master
    file://copyright
"

LIC_FILES_CHKSUM = "file://${WORKDIR}/copyright;md5=3dd6192d306f582dee7687da3d8748ab"
S = "${WORKDIR}/git"

do_configure () {
}

do_compile () {
    make
}

do_install () {
    install -d ${D}
    install -d ${D}${bindir}/
    install -m 0755 ${S}/src/feh ${D}${bindir}/
    install -d ${D}/usr/share
    install -d ${D}/usr/share/${BPN}
    install -d ${D}/usr/share/${BPN}/fonts
    install -d ${D}/usr/share/${BPN}/images
    cp ${S}/share/fonts/* ${D}/usr/share/${BPN}/fonts/
    cp ${S}/share/images/* ${D}/usr/share/${BPN}/images/
}
如果出现DESCRIPTION错误的提示,那么我们再继续添加DESCRIPTION即可。


简单说明一下:
1. 指定了runtime dependence,如果不添加那么会出现如下的warning,在package的时候可能会出错,而且需要添加为FILES_${PN},否则会出现下面这个错误:

如果没有正确添加,那么也会有警告:

对于前面的imlib2而已就会出现下面这个警告:


2. 指定Source get URI
这个主要告诉fetcher如何去获取source code,以及用于Verification的文件与MD5 Checksum的值。

3. 指定如何编译与安装
这个是在install与make task指定的。
可以看到在install的时候,东西比较多,有fonts,有images,这些东西用在了EXIF以及缩略图显示中,以及broader的显示。


使用
重新构建了image之后,我们烧写到nandflash或者使用nfs,我们就可以启动了,然后我们需要为feh配置正确的配置环境。
直接运行feh可以看到下面这个错误:
root@beaglebone:~# feh -x -Z -D 3 -F /Pics
feh ERROR: Can't open X display. It *is* running, yeah?
关于feh的参数可以看man手册,需要注意的是/Pics目录中存放的是图片文件。
这个出错的原因是我们没有正确配置DISPLAY。

X11 Display的配置
我们在ps中可以看到如下的display配置与binding:


因此我们可以直接export这个value即可:
export DISPLAY=:0
然后继续运行即可正确运行:
feh -x -Z -D 3 -F /Pics/


效果图
因为无法插入video,所以拍了张图片来表示,但是实际上feh的功能特别强大,许多的功能没有演示,包括我们前面说道的那些功能。
另外我们也可以再构建一个server然后使用其他客服端来控制,甚至包括图片的传送与网络图片的显示。


总结
虽然这是一个小项目,但是各个基本的步骤都有了,且这个过程也遇到了不少问题,但是最终还是比较快捷的解决与完成了。这个是Yocto的魅力。

最后是代码: https://github.com/tonyho/imlib2
https://github.com/tonyho/feh