tag 标签: Ycoto

相关博文
  • 热度 1
    2021-6-21 15:18
    559 次阅读|
    1 个评论
    ​ By Toradex胡珊逢 开机动画普遍存在于消费类电子设备,特别是手机和平板。嵌入式 Linux 系统除了显示开机 logo 外,同样也可以实现开机动画。本文将在 Colibri iMX8X 计算机模块上介绍如何添加自定义的开机动画。 嵌入式设备从上电开机,会经历系统初始化、驱动加载、运行应用,最终在屏幕上显示应用界面。这个过程取决于嵌入式系自身的复杂程度和应用程序,通常可以从几秒到几十秒不等。而期间显示开机进度条或者开机动画能够提升设备的使用体验。文件接下会演示如何使用 PSplash 实现进度条显示,EasySplash 实现内容更加丰富的开机动画。 PSplash 这是一个非常精简的工具,极少的第三方软件依赖,首次发布于 2006 年。同时它能够非常容易地集成到 Yocto Project 中,事实上在 Toradex 默认的 Yocto Project 环境 中已经包含了相应的 recipe。用户只要在 local.conf 中添加 IMAGE_INSTALL_append = " psplash" 即看到默认的开机进度条。但正由于其精简的特定,任何的修改包括背景图片、颜色都需要通过直接更改头文件,甚至是源代码来完成。在 Yocto Project中这就需要编写相应的补丁文件。对于简单的图片更改,这会是更加耗时的操作。因此我们接下来使用 Yocto Project 生成的 SDK 直接编译 PSplash。 首先下载PSplash 源码。 ​ 准备一张和显示屏像素一致的背景图片,格式为 jpg。以及合适尺寸的进度条图片,同样也是 jpg 格式。这里我们使用 7寸 RGB 并口 LCD 显示屏,像素为 800x480。背景图片和进度条图片分别为 toradex.jpg 和 bar.jpg。将图片放在 PSplash 源码目录中。 然后使用psplash 自带的 make-image-header.sh 将图片转换为头文件。 ​ 此时会生成 bar.jpg-img.h 和 toradex.jpg-img.h 两个文件。为了编译方便,分别将其重命名为 psplash-bar-img.h 和 psplash-poky-img.h,否则需要修改 psplash.c 包含新生成的头文件。 psplash-config.h 和 psplash-colors.h 两个文件中可以修改显示效果和颜色。例如在 psplash-config.h 中我们使用全屏显示。 ​ 在 psplash-colors.h 中将默认背景颜色设置为黑色,和上面背景图片的色彩一致。进度条则为蓝色。 ​ 配置修改完成后,使用 SDK 进行编译。 ​ Linux Reference Minimal V5.3.0 BSP 的 Colibri iMX8X,路径为 /usr/bin/。同时在 /lib/systemd/system 创建下面两个 systemd service 文件,用于 psplash 自启动。 psplash-start.service ​ psplash-systemd.service ​ 然后执行 ​ 为了不在屏幕上显示启动日志信息,还需要在 u-boot 中配置以下参数。 ​ 重启后可以看到屏幕上显示的进度条。 ​ EasySplash Linux Multimedia BSP v5.3.0 。 首先下载 EasySplash 源码。 ​ 编译 EasySplash。 ​ 编译完成后将 bin 目录中的 easysplash 和 easysplashctl 可执行二进制文件复制到 Colibri iMX8X 的 /sbin/ 中,easysplash-quit.service 和 easysplash-start.service 复制到 /lib/systemd/system 中。 接下来准备需要显示的开机动画文件。 EasySplash 会从 zip 压缩包读取动画播放控制文件和 PNG 图片,zip 压缩包中的内容如下: ​ desc.txt 是动画播放控制文件,part1 和 part2 是两个文件夹,用于存放 PNG 图片。desc.txt 的内容如下,这里用于举例说明。 ​ 第一行分辨表示显示屏幕宽 800 像素,高 480 像素,以 20 fps 速度显示图片。第二行,p:播放模式,需要完整显示所有的内容后才停止,1:循环次数,0:该参数是遗留变量,不再被使用,part1:PNG 图片存放的位置。用户可以更具需要添加多行来显示其他内容。该文件的详细说明可以参考源码中 doc/Animation-Structure.md。 PNG 图片可以通过 ffmpeg 工具从视频文件获取。这里我们采用 EasySplash 自己的 ossystem-demo 中的 mp4 作为演示。 ​ 将生成的文件压缩为 bootanimation.zip,复制到 Colibri iMX8X 的 /home/root/ 目录。 ​ 修改 /lib/systemd/system 中 easysplash-start.service 文件,ExecStart 中修改 easysplash 实际存放的路径,同时添加 bootanimation.zip 所在的位置。 ​ easysplash-quit.service 也是一样。 ​ 然后执行 ​ 为了不在屏幕上显示启动日志信息,还需要在 u-boot 中配置以下参数。 ​ 重启后可以看到开机动画。 ​ 总结 上面介绍了在不改变 BSP 本身结构和应用程序的情况下添加开机进度条或者开机动画,所以这些工具都是用户应用而运行的。为了更早地显示开机动画,也有采用其他方式加载,例如 Torizon ,它使用 initial ram disk,在其中运行 plymouth 显示开机动画, 并且可以非常方便地对其进行替换 。由于 initial ram disk 是在正式的 rootfs 前运行,这是一个非常精简的文件系统,从而能很早完成加载并示画面。Toradex Linux BSP 尚未采用该方式。另外对于需要快速启动的嵌入式设备,开机动画的运行不可避免会占用一部分系统资源,从而影响到主要应用的加载和运行。 ​
  • 热度 2
    2021-4-23 15:18
    1008 次阅读|
    1 个评论
    By Toradex 秦海 1). 简介 基于类似 NXP iMX8 这样性能强劲的 ARM 平台处理器,越来越多的工业智能 / 机器人应用比如 AGV/AMR 产品控制器在 ARM 平台上面实现,在这个过程中不可避免的就涉及到将机器人应用开发框架移植到 ARM 平台来运行,因此本文就着重示例基于 Ycoto Project/Openembedded 环境,将 ROS ( Robot Operating System )编译集成到嵌入式 Linux 中运行。 ROS 是一种为机器人应用设计的分布式处理框架,集成了大量相关库和工具,目的是为了提高机器人应用开发时代码复用率 , 目前 ROS 已经发展到 ROS2 ,这里就演示将 ROS2 最新版本 Foxy 集成到 iMX8 Linux BSP 中。 本文的演示的平台来自于 Toradex Apalis iMX8 ARM 嵌入式平台,这是一个基于 NXP iMX8QM ARM 处理器,支持 Cortex-A72+A53 和 Coretex-M4 架构的计算机模块平台。 2). 准备 a). Apalis iMX8QM 4GB WB IT ARM 核心版配合 Ioxra 载板 ,连接调试串口 UART1 (载板 X22 )到开发主机方便调试。 3). Apalis iMX8 Ycoto Linux 集成 ROS2 编译环境配置和部署 a). Apalis iMX8 Ycoto Linux 通过 Ycoto/Openembedded 框架编译,具体的配置方法请参考 这里 ,首先下载好针对 Apalis iMX8 适用的基于 Ycoto Dunfeil 版本的 BSP 5.x.y 编译环境。 ---------------------------------- $ repo init -u https://git.toradex.com/toradex-manifest.git -b dunfell-5.x.y -m tdxref/default.xml $ repo sync ---------------------------------- b). 下载 meta-ros 和 meta-python2 layer 到上面下载好的 ycoto 环境 ---------------------------------- $ cd …/oe-core/layers/ ### fetch meta-ros layer $ git clone -b dunfell https://github.com/ros/meta-ros.git ### fetch meta-phthon2 layer $ git clone -b dunfell https://github.com/YoeDistro/meta-python2.git ---------------------------------- c). 配置编译环境,添加编译 ROS2 Foxy 版本需要的相关 layer ,由于目前 ycoto 编译 ROS 还无法支持图形界面相关,因此也要在编译环境中将相关的 package 排除出去。 ./ 添加环境变量 ---------------------------------- ### generate init env $ cd …/oe-core/ $ source export ### add new env $ export ROS_OE_RELEASE_SERIES="dunfell" ### make new env valid with bitbake $ export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE ROS_OE_RELEASE_SERIES" ---------------------------------- ./ 修改 build/conf/bblayers.conf 文件 ---------------------------------- ${TOPDIR}/../layers/meta-freescale-distro \ ${TOPDIR}/../layers/meta-toradex-demos \ ${TOPDIR}/../layers/meta-qt5 \ + ${TOPDIR}/../layers/meta-python2 \ + ${TOPDIR}/../layers/meta-ros/meta-ros2-foxy \ + ${TOPDIR}/../layers/meta-ros/meta-ros2 \ + ${TOPDIR}/../layers/meta-ros/meta-ros-common \ + ${TOPDIR}/../layers/meta-ros/meta-ros-backports-gatesgarth \ \ \ ${TOPDIR}/../layers/meta-toradex-distro \ ---------------------------------- ./ 修改 build/conf/local.conf 文件 ---------------------------------- ### modify machine setting to apalis imx8 MACHINE ?= "apalis-imx8" ### add ros-core only or ros-world packagegroup for all ros2-foxy packages IMAGE_INSTALL_append = " packagegroup-ros-world" ### blacklist below packages which currently not supported in ycoto compilation ### detailed impact package refer to \ /layers/meta-ros/meta-ros2-foxy/conf/ros-distro/include/foxy/ros-distro-recipe-blacklist.inc and \ layers/meta-ros/meta-ros2-foxy/recipes-core/packagegroups/packagegroup-ros-world-foxy.bb files ROS_WORLD_SKIP_GROUPS = " opengl qt5 qt5-widgets pyqt5 qt-gui-cpp x11 ffmpeg webots-python-modules java libomp connext gazebo coinor-libipopt gurumdds ignition doosan-robot2 clang launch pugixml lanelet2-traffic-rules mongodb kobuki-ftdi ros1" ### define package graphviz version PREFERRED_VERSION_graphviz = "2.40.1%" ### accept freescale EULA license ACCEPT_FSL_EULA = "1" ---------------------------------- ./ 修改 layers/meta-ros/meta-ros2-foxy/recipes-bbappends/osqp-vendor/osqp-vendor_0.0.2-1.bbappend 文件修复当前版本中的 bug ---------------------------------- -SRCREV_osqp = "c536acf012d071eed3529e0147afdd419348362a" +SRCREV_osqp = "36ad83aed022e714c2fda1f13138443150435994" SRCREV_qdldl = "12d56ee6b9494efee1da1e1dc6e7ac9c226f9ccf" ---------------------------------- d). 编译 image 和 SDK ------------------------------- # compile Reference-Minimal image $ bitbake bitbake tdx-reference-minimal-image # compile Reference-Multimedia image $ bitbake bitbake tdx-reference-multimedia-image # compile SDK bitbake tdx-reference-multimedia-image -c populate_sdk ------------------------------- e). Ycoto Linux image 部署 参考 这里 通过 Toradex Easy installer 将上面编译好的 image 更新部署到模块,目前最新季度发布版本为 Ycoto Linux V5.2 ,这里使用 Reference-Minimal BSP image 进行测试 4). ROS2 Foxy 测试 a). 修改 ROS 初始化相关脚本权限,增加执行权限 ------------------------------- root@apalis-imx8:~# chmod +x /etc/profile.d/ros/* root@apalis-imx8:~# ls -al /etc/profile.d/ros/setup.sh -rwxr-xr-x 1 root root 4372 Mar 9 2018 /etc/profile.d/ros/setup.sh ------------------------------- b). 通过下面命令进行 ROS2 Foxy 简单测试 ------------------------------- ### check network connection root@apalis-imx8:~# ping lge.com ### source setup script to export env root@apalis-imx8:~# source /usr/bin/ros_setup.sh ### ros topic print root@apalis-imx8:~# ros2 topic list /parameter_events /rosout ### ros interface print root@apalis-imx8:~# ros2 interface list -m …… ### test root@apalis-imx8:~# (sleep 5; ros2 topic pub /chatter std_msgs/String "data: Hello world") & 826 root@apalis-imx8:~# ros2 topic echo /chatter publisher: beginning loop publishing #1: std_msgs.msg.String(data='Hello world') publishing #2: std_msgs.msg.String(data='Hello world') publishing #3: std_msgs.msg.String(data='Hello world') publishing #4: std_msgs.msg.String(data='Hello world') data: Hello world --- publishing #5: std_msgs.msg.String(data='Hello world') data: Hello world …… ------------------------------- 5). 总结 本文基于 NXP iMX8 嵌入式平台演示了通过 Ycoto Project/Openembedded 框架将 ROS2 Foxy 集成到嵌入式 Linux BSP 中,目前 meta-ros layer 除了 Foxy ,还支持 ROS1 melodic , ROS1 noetic , ROS2 dashing , ROS2 eloquent ,其他 ROS 版本可以自行根据所需要的 layer 不同而适应修改后编译。 参考文献 https://github.com/ros/meta-ros/wiki/OpenEmbedded-Build-Instructions https://developer.toradex.cn/knowledge-base/board-support-package/openembedded-core
  • 热度 2
    2021-4-22 15:06
    680 次阅读|
    1 个评论
    By Toradex胡珊逢 Visual Studio Code在软件开发领域具有十分广泛的应用,其支持多种编程语言,丰富的插件极大得提高了开发效率,同时这也是一个非常开放的平台。本文接下来将介绍如何在Visual Studio Code中使用Yocto Project生成的Linux SDK,并针对Arm处理器进行C/C++应用交叉编译和调试。 首先使用 Yocto Project生成SDK ,我们这里以Apalis iMX8上的minimal console image为例,其对应的SDK为tdx-xwayland-glibc-x86_64-Reference-Minimal-Image-aarch64-apalis-imx8-toolchain-5.2.0.sh。直接运行该文件,将其安装到Linux电脑上,例如/home/ben/Toradex/LinuxDevelop/LinuxSDK/v5/arm64路径下。 然后参考 这里的说明 在Linux电脑上安装Visual Studio Code。在Extension中安装一些常用的插件,如C/C++,C++ Intellisense,Makefile Creator等。 Visual Studio Code并不像Visual Studio,后者集成了完整的代码编辑、编译和调试工具,Visual Studio Code则提供了相应的框架,根据具体使用的编程语言和用户习惯来实现对应的步骤或者任务。当然也有很多公司、组织或者个人提供现成的插件,这简化了配置任务。目前Visual Studio Code还没有现成的插件可以直接使用Yocto Project生成的Linux SDK,因此我们通过直接配置JSON文件,制定相应的编译和调试步骤。 vscode-tdxlinux 是配置好的例程,接下来我们将对其中配置进行说明,以及介绍使用方法。 下载上面的例程后,在文件夹中会有下面文件。 hello.c是一个演示代码,Makefile是编译规则文件,.vscode文件夹中四个json文件即用于配置Visual Studio Code。 c_cpp_properties.json env中包含一些自定义的变量,例如SDK版本,开发板名字,以及SDK根目录。可以用$符号对其引用,例如${env.sdkroot}引用SDK根目录。 configurations中是Visual Studio Code规定的一些设置。includePath包含项目编译用的头文件所在目录,这里包括SDK中文件系统里和gcc本身的头文件。browse是浏览头文件时可以查找的目录,常用于VS Code编写代码时用Go To Definition打开对应文件。defines预定义一些宏,__linux__:指定目标系统为Linux,__aarch64__:目标处理器为64bit Arm。intelliSenseMode将IntelliSense Mode映射到对应的平台和处理器构架,Apalis iMX8是64位处理器,所以这里选择linux-gcc-arm64。这里的配置还可以通过ctl+shift+p组合键盘选择UI方式来配置。 settings.json 这里定了一些变量,其他文件可以通过${config:var}来引用,例如${config:tdxlinuxsdk.sdkroot}。 tasks.json 这里配置了编译相关的任务。 env配置GCC编译工具,编译参数等,这部分内容来自SDK的environment-setup-aarch64-tdx-linux文件。 Run Build Task调用相关任务。 launch.json 这里配置调试方法。 嵌入式Linux通过使用gdb调试C/C++应用。在configurations中MIMode为gdb,miDebuggerPath为gdb所在目录,这是SDK中包含的软件。 customLaunchSetupCommands是gdb具体执行步骤。首先使用gdb的target remote extend-remote连接IP为192.168.20.91的目标设备即Apalis iMX8,端口为1234。第二步remote put将本地编译好的hello二进制文件上传到Apalis iMX8。最后在main函数处设置一个断点。通过上面设置,点击VS Code中的debug即可进入调试。上面的每个步骤同样可以根据项目或者用户习惯调整。下面我们将演示从编译到调试的流程。 按组合键ctrl+shift+b选择TdxLinux SDK Make. 编译完成后可以通过file命令查看hello程序的格式属性,ARM aarch64格式。 查看Apalis iMX8的IP地址。192.168.20.97也是launch.json中设置的IP。 在Apalis iMX8上运行gbdserver程序,侦听端口为1234。 在hello.c程序的printf函数设置一个断点。 点击VS Code中的调试按键。 点击step over进行单步调试。 在Apalis iMX8调试串口中可以看到执行结果。 总结 上面是VS Code交叉编译和调试的简单介绍,提供了Eclipse之外的另一种开发环境。用户可以重新调整配置文件,并配合其他插件如Makefile Creator实现个性化的IDE。 ​
  • 热度 8
    2021-3-2 12:11
    1113 次阅读|
    0 个评论
    By Toradex 胡珊逢 SELinux 是 Security-Enhanced Linux 的简称,它是为 Linux 提供安全子系统的内核模块。其主要作用是控制进程对资源的访问,在基于用户权限的 DAC 之外对进程提供更加精细的强制访问控制( MAC )。在常见的 Linux 发行版中 SELinux 功能可以通过安装相应的软件来开启,但在嵌入式 Linux 设备上往往需要重新生成 BSP 。本文接下来将介绍如何使用 Yocto 为 Apalis iMX8 计算机模块生成支持 SELinux 的 BSP 。 Yocto 编译环境搭建可以参考 这里 。如果无法直接下载 repo 文件,也可以使用国内 镜像 。配置完成后,下载用于编译 SELinux 的 meta-selinux layer 。 Linux BSP 5.x 使用 dunfell 分支,用 git 命令下载相同版本的 meta-selinux 。 ---------------------------------- $ cd layers $ git clone -b dunfell git://git.yoctoproject.org/meta-selinux ---------------------------------- 在 conf/local.conf 文件的结尾添加以下内容。 ---------------------------------- DISTRO_FEATURES_append = " xattrs pam selinux" PREFERRED_PROVIDER_virtual/refpolicy ?= "refpolicy-minimum" IMAGE_INSTALL_append = " packagegroup-core-full-cmdline packagegroup-core-selinux" ---------------------------------- Toradex 提供精简地 minimal console 和包含 Qt5 和 gstreamer 等的 multimedia 两种参考镜像,配置文件位于 layers/meta-toradex-demos/recipes-images/images 目录。根据需要,在 tdx-reference-minimal-image.bb 或者 tdx-reference-multimedia-image.bb 的 inherit 后面添加 selinux-image 。 ---------------------------------- $ vi tdx-reference-minimal-image.bb inherit core-image selinux-image SUMMARY = "Toradex Embedded Linux Reference Minimal Image" DESCRIPTION = "Minimal image without graphical interface that just boots" $ vi tdx-reference-multimedia-image.bb require tdx-reference-minimal-image.bb SUMMARY = "Toradex Embedded Linux Reference Multimedia Image" DESCRIPTION = "Image for BSP verification with QT and multimedia features" inherit populate_sdk_qt5 selinux-image ---------------------------------- 默认的 Linux 内核配置是没有添加 SELinux 支持,因此在生成 BSP 之前做相应的修改。 ---------------------------------- $ MACHINE=apalis-imx8 bitbake -c menuconfig virtual/kernel ---------------------------------- 在“ General setup “ 和 ” Security options “ 中开启以下功能。 ---------------------------------- CONFIG_AUDIT=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 CONFIG_DEFAULT_SECURITY_SELINUX=y ---------------------------------- 最后编译所需的镜像,这里使用 minimal console 镜像。 ---------------------------------- $ MACHINE=apalis-imx8 bitbake tdx-reference-minimal-image ---------------------------------- 生成的 BSP 使用 Toradex Easy Installer 安装到 Apalis iMX8 计算机模块上。 开机启动后将 SELinux 配置为 permissive 模式,由于没有配置任何策略,采用默认的 enforcing 模式会阻止进程对相关资源文件的访问,从而影响启动。所以在配置相应策略前, permissive 模式仅记录进程的操作但不进行阻止。 ---------------------------------- root@apalis-imx8:~# vi /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX= permissive root@apalis-imx8:~# sync ---------------------------------- 保存配置后重启。在调试串口中按空格进入 U-Boot 命令模式,运行下面命令。 ---------------------------------- Apalis iMX8 # setenv defargs security=selinux selinux=1 Apalis iMX8 # saveenv Apalis iMX8 # reset ---------------------------------- 重启后可以看到 SELinux 相关日志,完成首次初始化后系统会自动重启。 ---------------------------------- SELinux: Initializing. SELinux: Permission watch in class filesystem not defined in policy. SELinux: Permission watch in class file not defined in policy. SELinux: Permission watch_mount in class file not defined in policy. SELinux: Permission watch_sb in class file not defined in policy. SELinux: Permission watch_with_perm in class file not defined in policy. SELinux: Permission watch_reads in class file not defined in policy. SELinux: Permission watch in class dir not defined in policy. SELinux: Permission watch_mount in class dir not defined in policy. ---------------------------------- 进入系统后查看 SELinux 运行状态。 ---------------------------------- root@apalis-imx8:~# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: minimum Current mode: permissive Mode from config file: permissive Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31 ---------------------------------- 至此用户可以根据项目需要创建对应的安全策略,并修改 /etc/selinux/config 使其生效。 总结 SELinux 为系统提供更加完善的访问控制,通过制定合适的安全策略,使系统更加安全、可靠地运行。
广告