基于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的足够如下:
- $ 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/
- }
简单说明一下:
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?
这个出错的原因是我们没有正确配置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