微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于Yocto的嵌入式的敏捷项目开发:以电子相册为例

基于Yocto的嵌入式的敏捷项目开发:以电子相册为例

时间:10-02 整理:3721RD 点击:

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:
这个是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的足够如下:

  1. $ tree ../imlib2/
  2. ../imlib2/
  3. ├── imlib2
  4. │   ├── copyright
  5. │   └── imlib2-1.4.9.tar.bz2
  6. └── imlib2_1.4.9.bb

  7. 1 directory, 3 files

复制代码


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


其中bb文件内容如下:

  1. DESCRIPTION = "im lib2"

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

  3. SECTION = "libs"
  4. LICENSE = "MIT"
  5. #PV = "1"
  6. #PR = "r0"

  7. SRC_URI = " \
  8.     file://imlib2-${PV}.tar.bz2 \
  9.     file://copyright  \
  10. "

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

  13. inherit autotools pkgconfig

  14. FILES_${PN}-dbg += " \
  15.     ${libdir}/${BPN}/loaders/.debug \
  16.     ${libdir}/${BPN}/filters/.debug \
  17. "

  18. FILES_${PN} =  " \
  19.     ${bindir} \
  20.     ${sbindir} \
  21.     ${libexecdir} \
  22.     ${libdir}/lib*.so.* \
  23.     ${sysconfdir} \
  24.     ${sharedstatedir} \
  25.     ${localstatedir} \
  26.     /bin \
  27.     /sbin \
  28.     /lib/*.so* \
  29.     /usr/share/* \
  30.     ${libdir}/${BPN} \
  31.     ${libdir}/${BPN}/* \
  32. "

复制代码


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


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



添加feh
我们在recipes-bsp中添加下面这些文件:

  1. 22:45 hexiongjun:feh $ tree
  2. .
  3. ├── feh
  4. │   ├── copyright
  5. │   └── Makefile
  6. └── feh.bb

  7. 1 directory, 3 files

复制代码


其中关键的是feh.bb:

  1. RDEPENDS_${PN} = "curl libx11 libpng libxinerama imlib2"

  2. SECTION = "libs"
  3. LICENSE = "MIT"

  4. SRCREV = "${AUTOREV}"

  5. SRC_URI = " \
  6.     git://github.com/derf/feh.git;protocol=https;branch=master \
  7.     file://copyright \
  8. "

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

  11. do_configure () {
  12. }

  13. do_compile () {
  14.     make
  15. }

  16. do_install () {
  17.     install -d ${D}
  18.     install -d ${D}${bindir}/
  19.     install -m 0755 ${S}/src/feh ${D}${bindir}/
  20.     install -d ${D}/usr/share
  21.     install -d ${D}/usr/share/${BPN}
  22.     install -d ${D}/usr/share/${BPN}/fonts
  23.     install -d ${D}/usr/share/${BPN}/images
  24.     cp ${S}/share/fonts/* ${D}/usr/share/${BPN}/fonts/
  25.     cp ${S}/share/images/* ${D}/usr/share/${BPN}/images/
  26. }

复制代码

如果出现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可以看到下面这个错误:

  1. root@beaglebone:~# feh -x -Z -D 3 -F /Pics
  2. feh ERROR: Can't open X display. It *is* running, yeah?

复制代码

关于feh的参数可以看man手册,需要注意的是/Pics目录中存放的是图片文件。
这个出错的原因是我们没有正确配置DISPLAY。
X11 Display的配置
我们在ps中可以看到如下的display配置与binding:


因此我们可以直接export这个value即可:

  1. export DISPLAY=:0

复制代码

然后继续运行即可正确运行:

  1. feh -x -Z -D 3 -F /Pics/

复制代码


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


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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top