tag 标签: yocto

相关帖子
相关博文
  • 2025-5-28 12:00
    0 个评论
    B y Toradex 胡珊逢 简介 在 上一篇文章 中我们已经介绍如何使用 meta-toradex-security layer 创建一个单独的分区。接下来我们将说明,如何在该分区上使用加密功能,读写性能测试,如果你还感兴趣,最后部分内容将阐述分区加密背后的原理。技术实现细节隐藏在 meta-toradex-security 的 recipes 里面,用户能够仅使用几行简单的配置即可开启分区加密。 Yocot Project 配置 和之前的文章一样,首先需要搭建 Yocto Project 编译环境。这里我们将以 Verdin iMX8MP 为例进行介绍。在 local.conf 的结尾添加下面两行配置即可。 INHERIT += "tdx-tezi-data-partition tdx-encrypted" TDX_ENC_STORAGE_LOCATION = "/dev/mmcblk2p3" tdx-encrypted 被添加后,所编译的镜像中就能够使用分区加密。'TDX_ENC_STORAGE_LOCATION' 用于配置需要加密的分区。在 Verdin iMX8MP 上 eMMC 会被挂载到 /dev/mmcblk2 下面,mmcblk2p3 是需要新创建的第三个分区。'TDX_ENC_STORAGE_LOCATION' 也可以设置为 /dev/sda1 或者 /dev/mmcblk0p1,分别对应外部的 U 盘、SD 卡等。 为了提供加密的安全性和效率,meta-toradex-security 可以利用加密运算单元,例如 iMX8M Plus SoC 上的 CAAM(Cryptographic Accelerator and Assurance Module)模块。当然也支持外部的 TPM,例如在 Verdin AM62 上由于没有 SoC 内置的加密运算单元,meta-toradex-security 则能够使用底板上的 TPM,如 Mallow 底板。对于使用 TPM 的模块,local.conf 中还需要添加 TDX_ENC_KEY_BACKEND = "tpm"。 然后使用 bitbake 命令编译镜像即可。 bitbake tdx-reference-minimal- image 当安装完系统并重启后,可以看到 /dev/mapper/encdata,这就是 /dev/mmcblk2p3 分区 DATA 对应的加密设备,它被挂载到 /run/encdata 目录下。在 local.conf 文件中 TDX_ENC_STORAGE_MOUNTPOINT 参数可以用来更改挂载路径。 ~# mount -l/dev/mapper/encdata on /run/encdata type ext4 (rw,relatime) Linux 的文件系统 RFS 使用非加密分区,我们将分别往加密的 /run/encdata 和非加密的 /home/root 目录下写入和读取 1GB 的文件,对比加密操作对读写文件的影响。 #write fio --name= test --filename=testfile.tmp --size=1G --bs=256k --iodepth=64 \ --readwrite =write --direct= 1 --ioengine=libaio --gtod_reduce= 1 # read fio --name= test --filename=testfile.tmp --size=1G --bs=256k --iodepth=64 \ --readwrite =read --direct= 1 --ioengine=libaio --gtod_reduce= 1 测试结果如下: /run/encdata /home/root 写入 1GB 文件 32.8MB/s 61.9MB/s 读取 1GB 文件 32.6MB/s 314MB/s 实现原理 如前面介绍,借助 meta-toradex-security 开启和使用加密分区是非常简单的,对于应用程序来讲,底层的加密是透明的。如果你还对实现原理感兴趣,请继续阅读下面的内容。 i.MX8 SoC 上有一个 CAAM 模块可以用于密钥生成、加密和解密运算。通常用户不会直接调用 CAAM API 进行相关操作。为了更好地保护密钥,我们使用 Linux 的一个内核功能 Trusted Keys 。Trusted Keys 能够在内核空间中生成和维护一个密钥,而在用户空间中则是该密钥的加密文件(encrypted blobs),用户空间中无法直接访问到密钥。密钥的加密和解密是在 CAAM 上完成,而 CAAM 就是 Trusted Keys 的 Trust Source。对于没有 CAAM 作为 Trust Source 的平台,例如 Verdin AM62,我们还可以使用外部的 TPM,甚至是 TEE (Trusted Execution Environment)。这些在 meta-toradex-security 中均得到支持。 另外一个内核功能 dm-crypt 实现了透明的分区加密。dm-crypt 会使用一个密钥用于加密需要写入到 /run/encdata 目录下文件。该密钥可以存储在文件系统分区 RFS 的一个目录下,默认配为 / var /local/ private /.keys/tdx-enc-key.blob 。如果 RFS 是只读文件系统,tdx-enc-key.blob 也可以直接存放在 eMMC 上。但 tdx-enc- key .blob 并是直接用于加密和解密的密钥。如前面提到的,密钥的维护是由 Trusted Keys 实现。 在 CAAM 中首先生成一个密钥 encryption key,该密钥不会离开 CAAM。该密钥通过同样位于 CAAM 的 Test key 或者 OTPMK Key 加密后,交给位于 kernel space 的 Trust Keys 维护。Trust Keys 为 dm-crypt 映射一个密钥,并存放在 / var /local/ private /.keys/tdx-enc-key.blob 。当位于 user space 的应用程序需要读写 /run/encdata 的文件时,dm-crypt 将 tdx-enc- key .blob 提交给 Trusted Keys。Trusted Keys 在 kernel space 中找到对应的密钥,然后将该密钥交给 CAAM。在 CAAM 中可以使用 Test key 或者 OTPMK Key 解密出 encryption key。并在 CAAM 中使用 encryption key 完成加密或者解密数据。这个过程中 Test key/OTPMK Key 和 encryption key 始终不会离开 CAAM,并且加密和解密操作也均在 CAAM 中进行。由于 / var /local/ private /.keys/tdx-enc-key.blob 并不是直接用于加密和解密的密钥。因此,即使该密钥泄漏,也不会导致原来位于 /run/encdata 的数据被破解。 对于使用 CAAM 的模块,例如 Verdin iMX8MM、Verdin iMX8MP、Apalis iMX8QM 等,如果没有开启 Secure Boot 功能,如前面提到,CAAM 会使用预制的 Test key 来加密密钥,这是不安全的,也不推荐在生产环境中使用。开启 Secure Boot 功能后,CAAM 则使用 OTPMK Key 来加密密钥。这是一个 256bit 随机生产的密钥,在 fuse 设备的时候烧录到 CAAM 中。因此该密钥必须妥善保管。 总结 借助 meta-toradex-security,用户能够轻松而安全地使用加密分区,保护数据和应用。更多来自 meta-toradex-security 实用功能,我们将在后续文章介绍,敬请关注。
  • 热度 1
    2025-3-6 12:00
    271 次阅读|
    0 个评论
    B y Toradex 秦海 1). 简介 基于 ARM 平台 Yocto Linux BSP 开发嵌入式设备,开发完成后需要生成用于量产的 Yocto Linux BSP 镜像,本文就基于 Toradex Yocto Linux BSP 镜像进行量产定制做流程说明。 2. 准备 a). Toradex Yocto Linux BSP 提供预编译好的基于 Downstream/Mainline Linux Kernel 版本的 Minimal 或者 Multimedia 镜像供客户测试开发,具体可以从下面地址下载。 https://developer.toradex.cn/software/toradex-embedded-software/toradex-download-links-torizon-linux-bsp-wince-and-partner-demos/#toradex-embedded-linux---yocto-project-reference-images b ). Toradex ARM 核心板 产品出厂预装 Toradex Easy Installer 工具软件,便于进行量产安装,因此对应使用的 Yocto Linux BSP 镜像也是适用于通过 Toradex Easy Installer 安装的镜像,具体关于 Toradex Easy Installer 的更详细介绍请见如下。 https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-overview/ c). 如果熟悉 Yocto Project 编译环境,可以参考如下文章通过 Yocto Project 来定制编译用于量产的 BSP 镜像,本文不做赘述。 https://www.toradex.cn/blog/tong-guo-ycoto-project-ding-zhi-qian-ru-shi-ycoto-linux-jing-xiang 3). 定制流程 a). 本文以适用于 Verdin i.MX8M Plus 的 Yocto Linux Mutimedia BSP Reference Image 镜像为例进行示例,其他平台和版本的 BSP 方法思路都一致。 b). 从 这里 下载针对 Verdin i.MX8M Plus 的 Yocto Linux Mutimedia BSP Reference Image V7.x 版本,并解压后包含文件如下。 ------------------------------- $ tar xvf Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3.tar $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ tree -L 1 . ├── image.json ├── imx-boot ├── LA_OPT_NXP_SW.html ├── marketing.tar ├── prepare.sh ├── Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz ├── Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz ├── toradexlinux.png ├── u-boot-initial-env-sd └── wrapup.sh 0 directories, 10 files ------------------------------- c). image.json 是 BSP 镜像配置文件, Toradex Easy Installer 软件就是通过读取这个文件来进行 BSP 镜像更新的 ./ image.json 配置文件详细说明请见如下文章,不同的硬件平台具体的文件会有不同,尤其是底层 bootloader 相关的 binary 文件。本文只将和定制量产镜像相关的参数着重说明。 https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-configuration-files ./ “ autoinstall ” 参数定义了是否自动安装 BSP 镜像 ------------------------------- false - 不自动安装 (default) true - 自动安装 ------------------------------- ./ “u_boot_env” 参数定义了 U-Boot 启动动态加载的环境变量参数,可以将自定义的 U-Boot 环境变量参数更新到这个文件,刷写 BSP 镜像后启动即可以生效。 ------------------------------- u-boot-initial-env-sd (default) ------------------------------- ./ “ prepare_script ” 参数定义了 Toradex Easy Installer 工具进行分区和烧写镜像操作前需要进行的操作 ------------------------------- prepare.sh (default) ------------------------------- ./ “wrapup_script” 参数定义了 Toradex Easy Installer 工具完成分区和烧写镜像操作后需要进行的操作 ------------------------------- wrapup.sh (default) ------------------------------- ./ “blockdevs” 参数下面就定义了实际需要烧写的镜像以及分区,当然也可以参考上述配置文件说明定制添加自己需要的分区或者只读文件系统等。 // 通常首先是一个 FAT32 分区,用于烧写包括 Linux Kernel Image/Device-Tree Binary/Device-Tree Overlay Binary 等启动文件, ” filename ” 参数定义了写入的文件压缩包, "uncompressed_size" 定义了要写入文件未压缩前的大小 (MB) 。如果定制镜像过程中修改了压缩包文件的名字和文件大小就需要修改对应修改这两个参数。 ------------------------------- "label": "BOOT", "filesystem_type": "FAT", "mkfs_options": "", " filename ": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz", " uncompressed_size ": 8.671875 ------------------------------- // 然后是一个 EXT4 分区,用于烧写 Linux Rootfs 文件系统文件, ” filename ” 参数定义了写入的文件压缩包, "uncompressed_size" 定义了要写入文件未压缩前的大小 (MB) 。如果定制镜像过程中修改了 Rootfs 文件系统压缩包文件的名字和文件大小就需要修改对应修改这两个参数。 ------------------------------- "label": "RFS", "filesystem_type": "ext4", "mkfs_options": "-E nodiscard", " filename ": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz", " uncompressed_size ": 1272.7109375 ------------------------------- // 最后是 Raw 分区,用于烧写包括 Bootloader Binary 等在内的底层引导固件文件,文件可能是一个文件或者多个文件,根据不同的硬件平台不一致。 ” filename ” 参数定义了写入的 Binary 固件文件,比如 Verdin i.MX8MP 平台对应的是 imx-boot 文件就是一个包含 ATF/DDR Firmware/SPL/U-Boot 等的 Boot Container ,而比如 Verdin AM62 平台则每个固件都是分开的单独文件。 ------------------------------- "filesystem_type": "raw", "rawfiles": ------------------------------- d). “ imx-boot ” 如章节 (c) 说明是 Verdin i.MX8MP 平台对应的 Boot Container 文件,如果需要修改底层 Bootloader ,可以参考如下文章修改编译生成新的 “ imx-boot ” 文件后替换 BSP Image 镜像里面的文件。 https://developer.toradex.cn/linux-bsp/os-development/build-u-boot-and-linux-kernel-from-source-code/build-u-boot/ e). “prepare.sh” 如章节 (c) 说明是烧写镜像前需要进行的操作,通常不需要修改。 f). “ wrapup .sh” 如章节 (c) 说明是烧写镜像后进行的操作,如果使能了 “ autoinstall ” 自动安装可以增加如下内容在完成自动安装后自动重启。 ------------------------------- reboot -f exit 0 ------------------------------- g). “Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz” 压缩包文件如章节 (c) 说明是 FAT32 启动分区文件,请注意不同 Yocto Linux BSP 版本命名方式可能略有不同。 ./ 解压后内容如下 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ mkdir bootfs $ tar Jxf Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz -C bootfs/ $ cd bootfs $ tree -L 1 . ├── boot.scr ├── Image.gz ├── imx8mp-verdin-nonwifi-dahlia.dtb ├── imx8mp-verdin-nonwifi-dev.dtb ├── imx8mp-verdin-nonwifi-ivy.dtb ├── imx8mp-verdin-nonwifi-mallow.dtb ├── imx8mp-verdin-nonwifi-yavia.dtb ├── imx8mp-verdin-wifi-dahlia.dtb ├── imx8mp-verdin-wifi-dev.dtb ├── imx8mp-verdin-wifi-ivy.dtb ├── imx8mp-verdin-wifi-mallow.dtb ├── imx8mp-verdin-wifi-yavia.dtb ├── overlays └── overlays.txt 1 directory, 13 files ------------------------------- ./ “ boot.scr ” 文件是 Linux U-Boot Distroboot 配置文件,如果定制 BSP 镜像涉及 Linux Kernel 启动参数相关配置,可以参考 这里 修改并重新生成这个文件后替换原有文件。 ./ 其他文件都是包含 Linux Kernel Image / Device-Tree Binary / Device-Tree Overlay Binary 等文件,如果定制 BSP 涉及了相关修改可以在这里替换原有文件。 ./ 修改完成所有要修改的文件后,可以通过如下命令重新压缩,如果命名不变则无需修改 image.json 文件,否则就要对应修改。 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/bootfs/ $ tar Jcf ../Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz * $ cd .. $ rm -rf bootfs/ ------------------------------- h). “Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz” 压缩包文件如章节 (c) 说明是 EXT4 Linux Rootfs 文件系统分区文件,请注意不同 Yocto Linux BSP 版本命名方式可能略有不同。 ./ 解压后内容如下 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ mkdir rootfs $ sudo tar Jxf Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz -C rootfs/ $ cd rootfs $ tree -L 1 . ├── bin - usr/bin ├── boot ├── dev ├── etc ├── home ├── lib - usr/lib ├── media - run/media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin - usr/sbin ├── srv ├── sys ├── tmp ├── unit_tests ├── usr └── var 18 directories, 1 file ------------------------------- ./ 在这里可以进行 Linux Rootfs 相关的修改适配,比如部署应用程序以及相关运行库,配置应用程序开机自启动等,下面是几个简单示例。 ------------------------------- ### modify below default autorun systemd service file to make customized application autorun ### rootfs/lib/systemd/system/wayland-app-launch.service ... ExecStart=/usr/share/cinematicexperience-1.0/Qt5_CinematicExperience --fullscreen ... ### modify below splash picture to adapt customized splash after enabling plymouth in Yocto project ### rootfs/usr/share/plymouth/themes/spinner/watermark.png ### modify weston configuration file if needed, below for example to hide weston normal shell ### rootfs/ etc/xdg/weston/weston.ini ... shell=kiosk-shell.so ... ------------------------------- ./ 修改完成所有要修改的文件后,可以通过如下命令重新压缩,如果命名和大概文件大小不变则无需修改 image.json 文件,否则就要对应修改。 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/rootfs/ $ sudo tar Jcf ../Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz * $ cd .. $ sudo rm -rf rootfs/ ------------------------------- i). “u-boot-initial-env-sd” 如章节 (c) 说明是 U-Boot 环境变量配置文件,可以将定制需要的环境变量修改或者添加在这个文件。比如这里示例添加为了显示 Plymouth Splash 以及关闭 log 输出的环境变量定义。 ------------------------------- tdxargs = quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3’ bootdelay = 0 ------------------------------- j). 定制完成后将完整 BSP image 文件复制到 U 盘或者 SD 卡,通过模块 Toradex Easy Installer 工具安装到模块进行量产即可。 4 ). 总结 本文 基于 Toradex i.MX8MP ARM 处理器平台示例了 Yocto Linux 量产 BSP 镜像定制流程,其他平台定制思路都是基本一致的。
  • 热度 22
    2016-5-16 11:09
    2536 次阅读|
    0 个评论
    By Toradex 秦海 随着ARM平台处理能力的日益强大,越来越多的工业智能/机器人应用在ARM平台上面实现,在这个过程中不可避免的就涉及到将机器人应用开发框架移植到ARM平台来运行,因此本文就着重示例基于Openembedded环境,将ROS(Robot Operating System)编译集成到嵌入式Linux中运行。 ROS是一种为机器人应用设计的分布式处理框架,集成了大量相关库和工具,目的是为了提高机器人应用开发时代码复用率。目前ROS发布版本官方只支持Ubuntu Linux等安装,但由于在Openembedded框架下维护了meta-ros layer,使得我们可以将ROS集成到同样基于Openembedded框架的嵌入式Linux中运行。 本文所使用硬件为Toradex Colibri T20 基于nVidia Tegra2的ARM核心板配合Colibri 开发板,软件即为Toradex官方发布的基于Openembedded框架的Yocto Project兼容Linux系统。 1). 编译配置roscore a). 下载配置基本的Openembedded环境 详细的关于Toradex Openembeded配置说明请见这里,如下下载配置Opembedded 和Toradex Linux release V2.5相关meta layer数据 --------------------- $ mkdir oe-core $ cd oe-core $ repo init -u http://git.toradex.com/toradex-bsp-platform.git -b LinuxImageV2.5 $ repo sync --------------------- b). 下载meta-ros layer --------------------- $ cd oe-core/stuff $ git clone https://github.com/bmwcarit/meta-ros.git //默认head为ROS indigo,如需hydro请继续如下操作 //cd meta-ros git checkout v0.2 cd .. --------------------- c). 修改配置文件 ./ 生成相关配置文件 --------------------- $ cd oe-core $ . export --------------------- ./ 修改oe-core/build/conf/bblayers.conf --------------------- BASELAYERS ?= " \ ...... + ${TOPDIR}/../stuff/meta-ros \ " --------------------- ./ 修改oe-core/build/conf/local.conf文件 --------------------- MACHINE ?= "colibri-t20" //设备配置为colibri-t20,这里也可以改为其他产品型号 ...... + IMAGE_INSTALL_append = "roslaunch" //安装roscore --------------------- d). 编译image --------------------- bitbake -k angstrom-lxde-image --------------------- e). 部署image 编译成功后,在oe-core/build/out-glibc/deploy/colibri-t20/images目录下找到生成的image Colibri_T20_LinuxImageV2.5_xxxxxxxx.tar.bz2,然后按照这里的方法更新到Colibri T20模块上面。 f). 启动roscore环境 ./ 配置环境变量 --------------------- export ROS_ROOT=/opt/ros/ indigo export PATH=$PATH:/opt/ros/ indigo/bin export LD_LIBRARY_PATH=/opt/ros/ indigo/lib export PYTHONPATH=/opt/ros/ indigo/lib/python2.7/site-packages export ROS_MASTER_URI=http://localhost:11311 export export ROS_HOSTNAME=localhost export CMAKE_PREFIX_PATH=/opt/ros/ indigo touch /opt/ros/ indigo/.catkin --------------------- ./ 启动roscore --------------------- roscore --------------------- 2). 编译配置ros-world a). 重新修改oe-core/build/conf/local.conf文件 --------------------- ...... IMAGE_INSTALL_append = "packagegroup-ros-world"" //安装roscore 以及完整的相关package --------------------- b). 编译部署 方法和上面roscore一致,由于meta-ros问题编译前请修改oe-core /stuff/meta-ros/recipes-ros/geometry-experimental/geometry-experimental.inc --------------------- SRC_URI = "063484906d1c2f1a4ee961680e43b559" SRC_URI = "011b77bc33afea927bab2707ddda585df8de5f1fc6e387081f6bf1ea12d2323b" --------------------- 第一次编译可能会遇到一些错误,请编译退出后做如下修改 ./ oe-core_v25_ros/build/out-glibc/work/armv7at2hf-vfp-angstrom-linux-gnueabi/ 目录下面 修改所有 tf2/0.5.12-r0/geometry-0.5.12/ 和 tf2-xxx/0.5.12-r0/geometr-0.5.12/ 目录名均修改为geometry_experimental-0.5.12 ./ 修改oe-core_v25_ros/build/out-glibc/work/armv7at2hf-vfp-angstrom-linux-gnueabi/pluginlib/1.10.1-r0/build/CMakeFiles/plugin_tool.dir/link.txt --------------------- ……/arm-angstrom-linux-gnueabi-g++ -pthread –mfpu=vfpv3-d16 …… //编译器添加” –pthread”参数 --------------------- c). 后续生成部署image则和roscore一致。 3). 总结 本文着重展示了在基于Openembedded框架的嵌入式Linux上面编译运行ROC core以及相关组件的方法,具体关于ROC的使用请参考其官方网站和网上相关资料。
  • 热度 21
    2016-5-16 11:08
    1691 次阅读|
    0 个评论
    By Toradex 秦海 随着ARM平台处理能力的日益强大,越来越多的工业智能/机器人应用在ARM平台上面实现,在这个过程中不可避免的就涉及到将机器人应用开发框架移植到ARM平台来运行,因此本文就着重示例基于 Openembedded 环境,将ROS(Robot Operating System)编译集成到嵌入式Linux中运行。 ROS 是一种为机器人应用设计的分布式处理框架,集成了大量相关库和工具,目的是为了提高机器人应用开发时代码复用率。目前ROS发布版本官方只支持Ubuntu Linux等安装,但由于在Openembedded框架下维护了meta-ros layer,使得我们可以将ROS集成到同样基于Openembedded框架的嵌入式Linux中运行。 本文所使用硬件为Toradex  Colibri T20  基于nVidia Tegra2的ARM核心板配合 Colibri 开发板 ,软件即为Toradex官方发布的基于Openembedded框架的 Yocto Project 兼容 Linux 系统。 1).  编译配置 roscore a).  下载配置基本的Openembedded 环境 详细的关于Toradex Openembeded配置说明请见 这里 ,如下下载配置Opembedded 和Toradex Linux release V2.5相关meta layer数据 --------------------- $ mkdir oe-core $ cd oe-core $ repo init -u http://git.toradex.com/toradex-bsp-platform.git -b LinuxImageV2.5 $ repo sync --------------------- b).  下载meta-ros layer --------------------- $ cd oe-core/stuff $ git clone  https://github.com/bmwcarit/meta-ros.git //默认head为ROS indigo,如需hydro请继续如下操作 //cd meta-ros git checkout v0.2 cd .. --------------------- c).  修改配置文件 ./ 生成相关配置文件 --------------------- $ cd oe-core $ . export --------------------- ./ 修改oe-core/build/conf/bblayers.conf --------------------- BASELAYERS ?= " \ ...... + ${TOPDIR}/../stuff/meta-ros \ " --------------------- ./ 修改oe-core/build/conf/local.conf文件 --------------------- MACHINE ?= "colibri-t20"        //设备配置为colibri-t20,这里也可以改为其他产品型号 ...... + IMAGE_INSTALL_append = "roslaunch"   //安装roscore --------------------- d).  编译image --------------------- bitbake -k angstrom-lxde-image --------------------- e).  部署image 编译成功后,在oe-core/build/out-glibc/deploy/colibri-t20/images目录下找到生成的image Colibri_T20_LinuxImageV2.5_xxxxxxxx.tar.bz2,然后按照这里的方法更新到Colibri T20模块上面。 f).  启动roscore 环境 ./ 配置环境变量 --------------------- export ROS_ROOT=/opt/ros/ indigo export PATH=$PATH:/opt/ros/ indigo/bin export LD_LIBRARY_PATH=/opt/ros/ indigo/lib export PYTHONPATH=/opt/ros/ indigo/lib/python2.7/site-packages export ROS_MASTER_URI=http://localhost:11311 export export ROS_HOSTNAME=localhost export CMAKE_PREFIX_PATH=/opt/ros/ indigo touch /opt/ros/ indigo/.catkin --------------------- ./ 启动roscore --------------------- roscore ---------------------   2).  编译配置 ros-world a).  重新修改oe-core/build/conf/local.conf 文件 --------------------- ...... IMAGE_INSTALL_append = "packagegroup-ros-world""   //安装roscore 以及完整的相关package --------------------- b).  编译部署 方法和上面roscore一致,由于meta-ros问题编译前请修改oe-core /stuff/meta-ros/recipes-ros/geometry-experimental/geometry-experimental.inc --------------------- SRC_URI = "063484906d1c2f1a4ee961680e43b559" SRC_URI = "011b77bc33afea927bab2707ddda585df8de5f1fc6e387081f6bf1ea12d2323b" --------------------- 第一次编译可能会遇到一些错误,请编译退出后做如下修改 ./ oe-core_v25_ros/build/out-glibc/work/armv7at2hf-vfp-angstrom-linux-gnueabi/ 目录下面 修改所有 tf2/0.5.12-r0/geometry-0.5.12/  和 tf2-xxx/0.5.12-r0/geometr-0.5.12/ 目录名均修改为geometry_experimental-0.5.12 ./ 修改oe-core_v25_ros/build/out-glibc/work/armv7at2hf-vfp-angstrom-linux-gnueabi/pluginlib/1.10.1-r0/build/CMakeFiles/plugin_tool.dir/link.txt --------------------- ……/arm-angstrom-linux-gnueabi-g++ -pthread –mfpu=vfpv3-d16 ……  //编译器添加” –pthread”参数 --------------------- c).  后续生成部署image 则和roscore 一致。   3).  总结 本文着重展示了在基于Openembedded框架的嵌入式Linux上面编译运行ROC core以及相关组件的方法,具体关于ROC的使用请参考其官方网站和网上相关资料。
  • 热度 29
    2016-4-12 14:45
    1507 次阅读|
    0 个评论
    简介 随着工业发展,嵌入式设备接入网络的需求日益增多,在没有有线或者无线以太网的环境下,直接通过3G/4G Modem连接运营商网络来接入互联网不失为一个好方法,本文就着重介绍基于ARM平台的嵌入式设备在Embedded Linux下使用3G/4G Modem的方法。 目前市面上的3G/4G modem和主机的连接方式主要有串口、USB和mini-PCIE,串口模块比较传统且使用比较简单,而mini-PCIE在工业设备中目前应用还不广泛,因此本文使用USB 3G/4G modem来进行演示。 硬件准备 嵌入式平台基于 Toradex Colibri i.MX6 工业产品级ARM核心板搭配Colibri开发载板,Embedded Linux采用Toradex官方发布兼容Yocto Project 的 Linux  V2.5版本。 3G Modem使用华为 E303s WCDMA Modem,支持中国联通的3G网络 Linux Kernel 准备 关于Linux kernel源代码下载及基本编译更新操作请参考 这里 ,本文不再赘述,只简单列出操作如下: a). 下载Linux kernel源代码 b). 下载安装Toolchain,并link到 “ ~/gcc-linaro “ 目录 $ wget http://releases.linaro.org/14.11/components/toolchain/binaries/arm-linux-gnueabihf/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz $ tar xvf gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz $ ln -s gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf gcc-linaro   c). 设置环境变量 $ export ARCH=arm $ export PATH=~/gcc-linaro/bin/:$PATH $ export CROSS_COMPILE=arm-linux-gnueabihf-   d). 配置 $ make colibri_imx6_defconfig $ make menuconfig      //添加下面列出功能 -------------------- Network device support  ---        *   PPP (point-to-point protocol) support        *     PPP BSD-Compress compression         *     PPP Deflate compression             PPP filtering        *     PPP MPPE compression (encryption)             PPP multilink support        *     PPP over Ethernet        *     PPP support for async serial ports        *     PPP support for sync tty ports   USB support  ---        *     USB Modem (CDC ACM) support   USB support  ---     *   USB Serial Converter support  ---               *   USB driver for GSM and CDMA modems --------------------   e). 重新编译kernel image $ make -j3 uImage LOADADDR=10008000 21 | tee build.log   f). 升级目标板 根据本章节开始提供的 参考 升级目标板到新的kernel image 相关软件准备 1). PPP Toradex image默认已经安装,如果其他ARM平台image也是基于Yocto/OpenEmbedded环境编译,可以在local.conf文件中添加如下选项后编译 ----------------- IMAGE_INSTALL_append = " ppp" ----------------- 2). usb-modesiwtch-2.3.0 a). 需要libusb-1.0.x,先从 这里 下载源文件并解压 b). 使用上一章节配置的ToolChain如下设置交叉编译libusb $ sudo CC="/home/xxx/gcc-linaro/bin/arm-linux-gnueabihf-gcc" CXX="/home/xxx/gcc-linaro/bin/arm-linux-gnueabihf-g++" ./configure --host=arm-linux-gnueabihf --prefix=/home/xxx/gcc-linaro --disable-udev $ make $ make install c). 从 这里 下载usb-modesiwtch并解压 d). 如下修改usb-modesiwtch 目录下Makefile ---------------- CC          = ~/gcc-linaro/bin/arm-linux-gnueabihf-gcc CFLAGS      += -Wall -I/home/xxx/gcc-linaro/include -L/home/xxx/gcc-linaro/lib ---------------- e).交叉编译usb-modesiwtch $ make f). 从这里下载 usb-modeswitch-data ,和上面步骤编译出的usb-modesiwtch可执行文件一起上传到目标板 配置 Modem 连接网络 目前比较新的3G/4G都支持Ethernet模式和Fallback模式,而老一些的模块只支持Fallback模式,请根据所需模块情况自行参考下面操作。 1). Ethernet 模式 a). 将E303s 3G Modem连接目标板,由于Modem上包含为了给Windows系统提供驱动而部署的存储分区,Linux默认将设备识别成USB Mass Storage设备 root@colibri-imx6:/home# lsusb Bus 001 Device 004: ID 12d1:1f01 Huawei Technologies Co., Ltd. E353/E3131 (Mass storage mode) …… b). 如下修改usb-modeswitch-data-20160112/usb_modeswitch.d目录下的12d1:1f01文件 ----------------------- # Huawei E303s Ethernet Mode DefaultVendor=0x12d1 DefaultProduct=0x1f01 TargetVendor=0x12d1 TargetProduct=0x14db MessageEndPoint = "0x01" MessageContent="55534243123456780000000000000a11062000000000000100000000000000" ------------------------ c). 使用usb-modeswitch工具将modem设置为Ethernet mode root@colibri-imx6:/home# ./usb_modeswitch -c 12d1:1f01 …… root@colibri-imx6:/home# usb 1-1.1: USB disconnect, device number 4 usb 1-1.1: new high-speed USB device number 6 using ci_hdrc cdc_ether 1-1.1:1.0 eth1: register 'cdc_ether' at usb-ci_hdrc.0-1.1, CDC Ethernet Device, 58:2c:80:13:92:63   lsusb查看 root@colibri-imx6:/home# lsusb Bus 001 Device 005: ID 12d1:14db Huawei Technologies Co., Ltd. E353/E3131 …… d). 查看网络,出现eth1,正确获取ip并连接到网络,下面就可以用使用以太网同样方法使用网络了 root@colibri-imx6:/home# ifconfig …… eth1      Link encap:Ethernet  HWaddr 58:2C:80:13:92:63            inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0           inet6 addr: fe80::5a2c:80ff:fe13:9263/64 Scope:Link           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1           RX packets:37 errors:0 dropped:0 overruns:0 frame:0           TX packets:69 errors:0 dropped:0 overruns:0 carrier:0           collisions:0 txqueuelen:1000           RX bytes:6899 (6.7 KiB)  TX bytes:10381 (10.1 KiB) …… e). 验证网络连接 root@colibri-imx6:/home# ping www.baidu.com PING www.baidu.com (61.135.169.121): 56 data bytes 64 bytes from 61.135.169.121: seq=0 ttl=51 time=88.261 ms 64 bytes from 61.135.169.121: seq=1 ttl=51 time=77.998 ms 64 bytes from 61.135.169.121: seq=2 ttl=51 time=68.410 ms 64 bytes from 61.135.169.121: seq=3 ttl=51 time=68.242 ms 64 bytes from 61.135.169.121: seq=4 ttl=51 time=68.166 ms 2). Fallback 模式 有一些较老型号的2G/3G Modem只支持这个模式,无需再用usb-modeswitch转换,可以直接参考下面转换后的操作部分。 a). 如下修改usb-modeswitch-data-20160112/usb_modeswitch.d目录下的12d1:1f01文件 ----------------------- # Huawei E303s Fallback Mode DefaultVendor=0x12d1 DefaultProduct=0x1f01 TargetVendor=0x12d1 TargetProduct=0x1001 MessageEndPoint = "0x01" MessageContent="55534243123456780000000000000011063000000100010000000000000000" NoDriverLoading=0 ------------------------ b). 使用usb-modeswitch工具将modem设置为Fallback mode root@colibri-imx6:/home# ./usb_modeswitch -c 12d1\:1f01 …… root@colibri-imx6:/home# usb 1-1.1: new high-speed USB device number 8 using ci_hdrc option 1-1.1:1.0: GSM modem (1-port) converter detected usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB0 option 1-1.1:1.1: GSM modem (1-port) converter detected usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB1 option 1-1.1:1.2: GSM modem (1-port) converter detected usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB   lsusb 查看 root@colibri-imx6:/home# lsusb Bus 001 Device 008: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem …… c). 测试连接 root@colibri-imx6:/home# ls -l /dev/ttyUSB* crw-rw----    1 root     dialout   188,   0 Apr 11 09:49 /dev/ttyUSB0 crw-rw----    1 root     dialout   188,   1 Apr 11 09:49 /dev/ttyUSB1 crw-rw----    1 root     dialout   188,   2 Apr 11 09:49 /dev/ttyUSB2   root@colibri-imx6:/home# minicom -D /dev/ttyUSB0 ------------------ Welcome to minicom 2.7 OPTIONS: I18n Compiled on Nov  3 2015, 04:06:26. Port /dev/ttyUSB0, 09:53:44 Press CTRL-A Z for help on special keys   AT OK -------------------- d). 编写ppp连接配置文件wcdma, wcdma-chat-connect和wcdma-chat-disconnect root@colibri-imx6:/etc/ppp/peers# vi wcdma ----------------- nodetach lock /dev/ttyUSB0 115200 user "card" password "card" crtscts #hide-password show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect' disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-disconnect' ----------------------   root@colibri-imx6:/etc/ppp/peers# vi wcdma-chat-connect -------------------- ABORT "BUSY" ABORT "NO CARRIER" ABORT "NO DIALTONE" ABORT "ERROR" ABORT "NO ANSWER" TIMEOUT 120 "" AT OK \rATZ OK \rAT+CGDCONT=1,"IP","3gnet",,0,0 OK-AT-OK ATDT*99# CONNECT \d\c --------------------------   root@colibri-imx6:/etc/ppp/peers# vi wcdma-chat-disconnect ----------------------- ABORT "ERROR" ABORT "NO DIALTONE" SAY "\NSending break to the modem\n" ""\k" ""+++ATH" SAY "\nGood bay\n" --------------------------- e). 连接网络 root@colibri-imx6:/etc/ppp/peers# pppd call wcdma …… ATDT*99#^M^M CONNECT  -- got it   send (\d) Serial connection established. Using interface ppp0 Connect: ppp0 -- /dev/ttyUSB0 CHAP authentication succeeded: Welcome!! CHAP authentication succeeded Could not determine remote IP address: defaulting to 10.64.64.64 local  IP address 10.91.228.253 remote IP address 10.64.64.64 primary   DNS address 221.12.1.227 secondary DNS address 221.12.33.227   查看网络状态 root@colibri-imx6:/etc/ppp/peers# ifconfig …… ppp0      Link encap:Point-to-Point Protocol            inet addr:10.23.107.61  P-t-P:10.64.64.64  Mask:255.255.255.255           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1           RX packets:6 errors:0 dropped:0 overruns:0 frame:0           TX packets:6 errors:0 dropped:0 overruns:0 carrier:0           collisions:0 txqueuelen:3           RX bytes:84 (84.0 B)  TX bytes:102 (102.0 B) f). 测试网络 root@colibri-imx6:/etc/ppp/peers# echo nameserver 221.12.1.227 /etc/resolv.conf                 //设置DNS服务器 root@colibri-imx6:/etc/ppp/peers# ping www.baidu.com PING www.baidu.com (61.135.169.121): 56 data bytes 64 bytes from 61.135.169.121: seq=0 ttl=52 time=218.477 ms 64 bytes from 61.135.169.121: seq=1 ttl=52 time=68.066 ms 64 bytes from 61.135.169.121: seq=2 ttl=52 time=107.773 ms 64 bytes from 61.135.169.121: seq=3 ttl=52 time=77.604 ms 64 bytes from 61.135.169.121: seq=4 ttl=52 time=77.339 ms   总结 根据上述两种模式的测试结果,第一种Ethernet mode相对速度要更稳定一些,因此对于支持两种模式的modem更建议采用Ethernet mode;另外串口modem使用配置也可以参考Fallback mode。本文虽以E303s为例,但其他3G/4G Modem的配置也是类似,只是需要确定对应模式的Vendor ID,Product ID和Message。 参考文档 https://www.toradex.cn/zh_cn/computer-on-modules/colibri-arm-family/nxp-freescale-imx6 https://www.toradex.cn/zh_cn/products/carrier-board/colibri-evaluation-carrier-board http://developer.toradex.com/software/linux/linux-software http://www.draisberghof.de/usb_modeswitch/ http://www.cnblogs.com/ziqiuqiandao/archive/2013/06/06/3120972.html
相关资源