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

    xiaoxiao2025-06-24  20

    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
    转载请注明原文地址: https://ju.6miu.com/read-1300277.html
    最新回复(0)