使用Openembedded定制嵌入式Linux镜像

2023-10-30

By Toradex秦海

1). 简介

嵌入式设备采用Embedded Linux操作系统进行开发已经越来越成为主流,但是如何将开发完成的Linux uboot/kernel配置,以及应用程序整合到Embedded Linux镜像中以便在量产的时候更方便的更新到嵌入式设备中可能是很多嵌入式开发者面临的挑战之一,而本文就以在Embedded Linux中使用比较广泛的Yocto project为例,基于Openembedded开发框架定制 Embedded Linux镜像。

本文所演示的平台来自于Toradex Colibri iMX6嵌入式平台,这个平台是基于NXP iMX6系列ARM处理器,核心为Cortex-A9。同时Toradex也提供了一个完整的Ycoto project兼容的基于Openembedded发布的Embedded Linux,这样就无需完全从头开始配置自己的layer,只需要修改添加需要的部分即可。

2. 准备

a). Colibri iMX6 ARM核心版配合Colibri Eva Board 载板,用于测试编译好的image。

b). 配置Openembedded开发环境,请参考这里说明,本文测试使用LinuxImage2.7分支环境。

c). 参考这里说明下载Linux V2.7内核和uboot源代码,用于产生相应的patch文件。

c). 本文演示的定制Embedded Linux镜像主要添加修改以下内容,下面会按照这个内容逐一说明:

./ 修改uboot默认环境变量,适配演示使用的 LVDS 液晶屏

./ 修改Linux Kernel增加一个设备驱动;同时修改Linux device tree文件,增加两个串口配置

./ 将演示Qt应用程序集成到image,并配置为开机自动启动

3). 创建定制Embedded Linux 相关配置Layer

a). 在配置下载好的OpenEmbedded环境Layer目录下,创建存放本次定制image相关文件资料的Layer – meta-toradex-custom.

b). 在meta-toradex-custom目录下创建 conf 目录,并创建Layer配置文件 layer.conf ,这个文件内容可以参考meta-toradex-nxp/conf/layer.conf 文件进行修改,主要是layer名字和优先级以及依赖部分需要注意,修改好的文件请见如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/conf/layer.conf

c). 在 conf 目录下创建 machine 目录,并创建 machine 配置文件 colibri-imx6-custom.conf , 文件内容同样参考meta-toradex-nxp/conf/machine/colibri-imx6.conf 修改,本文因没有修改device tree名字,因此没有修改次文件,内容如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/conf/machine/colibri-imx6-custom.conf

4). OpenEmbedded下Uboot修改示例

a). 因为演示使用的LVDS液晶屏分辨率为1024x768,这里将uboot显示环境变量默认值修改为对应分辨率

b). 首先进入下载的uboot源代码对 include/configs/colibri_imx6.h 文件进行修改,产生的patch文件如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-bsp/u-boot/files/colibri_imx6_uboot_custom.patch

c). 在 meta-toradex-custom layer目录下创建 recipes-bsp/u-boot目录,并对 u-boot-toradex_2016.11.bb 文件进行append,增加上面生成的patch内容,如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-bsp/u-boot/u-boot-toradex_2016.11.bbappend

5). OpenEmbedded下Linux kernel 和 device tree 修改示例

a). 对Linux kernel进行重新config,增加了如下RTL8152 USB Ethernet Adapter驱动

--------------------------------

→ Device Drivers → Network device support → USB Network Adapters

<*>   Realtek RTL8152/RTL8153 Based USB Ethernet Adapters

--------------------------------

生成的新的defconfig文件如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-kernel/linux/files/defconfig

b). 对 arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts文件进行修改,增加UART4 和 UART5 连个串口支持,关于Colibri iMX6串口详细说明请参考这里,修改后的 patch 文件0001-custom-devicetree.patch 请见如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-kernel/linux/files/0001-custom-devicetree.patch

c). 在 meta-toradex-custom layer目录下创建 recipes-kernel/linux目录,并对 linux-toradex_4.1-2.0.x.bb 文件进行append,将上面生成的 defconfig 和 0001-custom-devicetree.patch增加进去,如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-kernel/linux/linux-toradex_4.1-2.0.x.bbappend

然后再创建 files 目录,将defconfig 和 0001-custom-devicetree.patch 两个文件复制进去。

另外,关于如何生成kernel patch,也可以参考下面文章:

https://www.toradex.cn/blog/patching-kernel-in-openembedded

6). OpenEmbedded下部署Qt应用示例

a). 本文所使用的Qt 应用demo说明请参考下面文章:

http://blog.sina.com.cn/s/blog_d733e5170102wyay.html

b). 配置Qt开机自启动需要下面两个文件

./ Qt 程序执行脚本,这里使用linuxfb进行显示

https://github.com/simonqin09/QtGPIOProject/blob/master/qtdemo.sh

./ Systemd 启动配置 .service文件

https://github.com/simonqin09/QtGPIOProject/blob/master/qtdemo_launch.service

c). 在 meta-toradex-custom layer目录下创建 recipes-qt/qtdemo目录,并创建如下 qtdemo_0.1.bb 文件用于从Qt 应用的git地址下载应用并编译部署

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-qt/qtdemo/qtdemo_0.1.bb

关于这个bb文件的详细说明,可以参考下面文档:

https://www.toradex.cn/blog/building-custom-embedded-linux-distributions

7). OpenEmbedded下设置自定义image镜像编译

a). 在 meta-toradex-custom layer目录下创建 recipes-images/images目录,将下面三个文件从 meta-toradex-demos/recipes-images/images 复制过来

--------------------------------

angstrom-qt5-x11-image.bb

tdx-extra.inc

tdx-image-fstype.inc

--------------------------------

Angstrom-qt5-x11-image.bb 文件就是生成image的bb文件,可以不做修改,也可以根据需要添加修改package设定,本文修改了angstrom-qt5-x11-image.bb文件,将默认需要编译的Qt demo smarthome 程序去掉了,如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-images/images/angstrom-qt5-x11-image.bb

b). 在images目录下继续创建 files/colibri-imx6-custom 目录,将 update.sh 文件从 meta-toradex-demos/recipes-images/images/files/colibri-imx6 复制过来。然后因为 machine 名字变为colibri-imx6-custom 了,因此要对应修改,修改内容如下:

https://github.com/simonqin09/openembedded_demo/blob/master/meta-toradex-custom/recipes-images/images/update.sh.patch

c). 在colibri-imx6-custom目录下继续创建 imx_flash 目录,将 meta-toradex-demos/recipes-images/images/files/colibri-imx6/files/imx_flash目录下的文件复制过来。

d). 在colibri-imx6-custom目录下继续创建 colibri-imx6-custom_bin 目录,将meta-toradex-demos/recipes-images/images/files/colibri-imx6/files/colibri-imx6_bin目录下的所有文件复制过来。

e). 至此,meta-toradex-custom layer 的所有修改都已经完成,下面我们进入 OpenEmbedded编译环境下 build/conf 目录, 对下面两个文件进行修改:

./ bblayers.conf – 增加了meta-toradex-custom layer进来,如下:

https://github.com/simonqin09/openembedded_demo/blob/master/bblayers.conf

./ local.conf – 将默认的machine 修改为colibri-imx6-custom, 同时增加了一些包如 tslib 和 linuxfb,如下:

https://github.com/simonqin09/openembedded_demo/blob/master/local.conf

f). 在 build目录下执行下面命令进行编译,编译成功后,可以在deploy/images/colibri-imx6-custom 目录下找到编译好的 image 压缩包。

--------------------------------

$ bitbake –k angstrom-qt5-x11-image

--------------------------------

8). 在Colibri imx6模块上面更新image并测试

a). 将上述生成好的image文件colibri-imx6-custom_Qt5-X11-Image_2.7b3-xxxxxxxx.tar.bz2 按照这里的说明更新到 Colibri iMX6 模块上面去。

b). QT GPIO 应用使用的管脚为SODIMM PIN 127,这里在 Colibri Evaluation Board 上面将 X10 SODIMM 127 和 X21 LED1 相连,用于测试GPIO电平情况。

c). image 更新好后,我们可以逐项去测试上面每一个配置

./ uboot

如下可见默认环境变量的修改已经生效

--------------------------------

# env default –a

# printenv

vidargs=video=mxcfb0:dev=lcd,1024x768M@60,if=RGB666 video=mxcfb1:off fbmem=8M

--------------------------------

./ kernel config 修改

如下可见kernel增加的驱动也已经编译进去了

--------------------------------

root@colibri-imx6-custom:~# zcat /proc/config.gz |grep RTL8152                 

CONFIG_USB_RTL8152=y

--------------------------------

./ device tree 修改

如下可见,除了默认的ttymxc0-2设备,还多了ttymxc3和ttymxc4

--------------------------------

root@colibri-imx6-custom:~# ls /dev/ttymxc*                                    

/dev/ttymxc0  /dev/ttymxc1  /dev/ttymxc2  /dev/ttymxc3  /dev/ttymxc4

--------------------------------

./ Qt 程序自启动以及控制GPIO情况

如下图片

image001.png

还有一起启动过程的视频如下:

http://v.youku.com/v_show/id_XMzE3MDY4NDkyNA==.html

9). 总结

本文只是简单演示了利用 OpenEmbedded 可以非常方便的生成定制化 Embedded Linux,另外配合git,还可以很好的实现不同版本的管理。但是 OpenEmbedded 架构本身也是比较复杂的,要想灵活使用还需要对其做一些深入的学习才能得心应手。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Openembedded定制嵌入式Linux镜像 的相关文章

  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • SVN 不断提示我输入密码并拒绝缓存我的凭据

    环境 Eclipse Indigo Ubuntu 11 04 Subclipse 1 6 SVN 客户端 Subclipse RabbitVCS 我通过 svn ssh 连接 我的网址如下所示 svn ssh 我的名字 我的域名 路径 我可
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • Laravel 内存问题?

    各位 我在 DO 服务器上遇到这样的问题 我已经尝试了一切 整个网站在使用 Homestead 的 Linux 服务器上 100 正常工作 但上传后 它只能工作一次 在重新加载或刷新页面后会多次下降 我尝试增加 apache 服务器的内存
  • 如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

    我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目 在构建整个解决方案时 它会构建附加了 SOVERSION 的 Bullet 输出库 并创建一个不带版本的符号链接 对于我的特定场景 我不喜欢这种行为 并且我不想编
  • _dl_runtime_resolve -- 共享对象何时加载到内存中?

    我们有一个对性能要求很高的消息处理系统 最近我们注意到第一条消息比后续消息花费的时间要长很多倍 当它通过我们的系统时 会发生大量转换和消息增强 其中大部分是通过外部库完成的 我刚刚描述了这个问题 使用 callgrind 将仅一条消息的 运
  • 为什么 RHEL 上的 bash 中 `read -t` 没有超时?

    Why read t在 RHEL5 或 RHEL6 上从管道读取时不会超时 这是我的示例 在从管道读取数据时 我的 RHEL 盒子不会超时 tail f logfile log grep something read t 3 variabl
  • 在哪里可以找到所有 C 标准库的源代码?

    我正在寻找所有 C 标准库的完整源代码 也就是说 我正在寻找 stdio h stdlib h string h math h 等的源代码 我想看看它们是如何创建的 我认为这取决于不同的平台 但 Linux 或 Windows 都会受到欢迎
  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • C/C++ with GCC:静态地将资源文件添加到可执行文件/库

    有人知道如何使用 GCC 将任何资源文件静态编译为可执行文件或共享库文件吗 例如 我想添加永远不会改变的图像文件 如果它们改变了 我无论如何都必须替换该文件 并且不希望它们位于文件系统中 如果这是可能的 我认为这是因为 Visual C f
  • CMake:使用其他平台的生成器。如何?

    如何使用 CMake 在 Linux 上生成 Visual Studio 项目文件 你不能 您必须在 Windows 上运行 CMake 才能为 Visual Studio 生成
  • 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

    该程序是在 Linux 上用 C 语言开发的客户端服务器套接字应用程序 每个客户端都连接到一个远程服务器并将其自身记录为在线 在任何给定时间点很可能有多个客户端在线 所有客户端都尝试连接到服务器以将自己记录为在线 忙碌 空闲等 那么服务器如
  • Tk 初始化失败:无显示名称且无 $DISPLAY 环境变量

    我试图从 Ubuntu 终端调用 Centos 服务器上的工具 我收到以下错误 Tk 初始化失败 没有显示名称 也没有 DISPLAY 环境变量 请帮我解决这个问题 提前致谢 连接到你的 CentOS 机器ssh Y其中 每man ssh
  • mod_perl 无法看到 /tmp 中的文件

    我有一些 mod perl 代码试图访问 tmp 下的文件 但它抛出 没有这样的文件或目录 错误 我在代码中添加了一个 ls al tmp 来查看 Perl 在目录中看到的内容 它只给了我 和 drwxrwxrwt 2 root root
  • 在linux中使用setcap [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 要将 cap net raw 功能添加到 例如 bin ping 我们使用以下命令 setcap cap net raw ep bin ping ep
  • 如何更改Linux服务器中的MySQL表名不区分大小写?

    我正在开发一个旧网站 该网站曾经托管在 Apple 服务器上 当它迁移到新的 Linux 服务器时 它停止工作 我很确定这是因为 php 脚本中使用的所有 MySQL 查询对于表名都有不同的大小写组合 我不知道为什么原始开发人员在创建表名或
  • 查找当前打开的文件句柄数(不是 lsof )

    在 NIX系统上 有没有办法找出当前正在运行的进程中有多少个打开的文件句柄 我正在从正在运行的进程中寻找在 C 中使用的 API 或公式 在某些系统上 见下文 您可以在 proc pid fd 中对它们进行计数 如果不属于其中之一 请参阅下
  • 使用 xargs 时如何获取退出代码(并行)

    我制作了一个用于启动并行 rsync 进程的脚本 bin bash LIST 1 DEST DIR 2 RSYNC OPTS 3 echo rsyncing From SRC DIR To DEST DIR RSYNC OPTS RSYNC
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一

随机推荐

  • kaggle免费GPU,google人机认证

    45条消息 GOOGLE 人机验证 RECAPTCHA 无法显示解决方案 转 散着步的码农的博客 CSDN博客x 许多小伙伴想找免费GPU kaggle确实是个非常不错的选择 本人亲测 配合抖音明日科技还是什么博主和这个博客 可以轻松解决
  • 【IT之路】Docker拉取镜像查看版本

    Docker拉取镜像查看版本 需要在docker hub查看 地址如下 https hub docker com 进入之后 在页面左上角搜索框搜索 以CentOS为例
  • 【测试详解】关于java定时器的常见问题,例如无法取消,被延期执行等

    定时器Timer Timer timer new Timer true 将定时器设置为守护线程 daemon 即当用户线程都已经执行完毕退出以后 jvm就会结束守护进程 不管守护进程是否还有任务 程序退出 定时器任务TimerTask 可以
  • C语言的原子操作

    gcc支持如下原子操作 if GCC VERSION gt 40100 内存访问栅 define barrier sync synchronize 原子获取 define AO GET ptr typeof ptr volatile val
  • 一篇文章告诉你:如何参加成都IT培训拿高薪?

    转行IT开发 这是很多人在工作迷茫时的想法 很多小伙伴被程序员的高薪所以吸引 盲目的学习计算机编程 结果大多都半途而废 甚至开始怀疑自己的智商 造成这种原因主要是盲目跟风 没有制定可行的计算机编程学习计划和学习目标 零基础如何学习IT编程
  • C#使用AutoFac实现IOC依赖注入

    1 配置web cofig配置文件修改执行javascript
  • 安装homeblew与python3替换_Allione_新浪博客

    1 Homebrew是一款Mac OS平台下的软件包管理工具 拥有安装 卸载 更新 查看 搜索等很多实用的功能 简单的一条指令 就可以实现包管理 而不用你关心各种依赖和文件路径的情况 十分方便快捷 使用 Homebrew 安装 Apple
  • JS数组方法

    1 at 方法接收一个整数值并返回该索引的项目 允许正数和负数 负整数从数组中的最后一个项目开始倒数 1 js的数组不存在数组越界 访问越界直接返回 undefined 2 可以填写负数值 入参 string int 整数 负数 返回值 数
  • 计算机配置 凭据分配,win7怎样添加凭据?-win7添加凭证的方法 - 河东软件园

    最近有用户向小编反映 称在使用远程访问桌面时 系统提示 您的凭据不工作 并且在启用 允许分配保存的凭据用于仅 NTLM服务器身份验证 策略后依旧不管用 其实之前小编也分享过如何解决系统提示 您的凭据不工作 的问题 但是该用户发现依然无法解决
  • Prometheus浅析

    1 Prometheus是什么 Prometheus 下文称Prom 是由 SoundCloud 开源监控告警解决方案 与Kubernetes同属CNCF 它已经成为炙手可热的Kubernetes生态圈中的核心监控系统 越来越多的项目 如K
  • STM32标准库函数之 TIM1定时器产生PWM波

    函数功能 定时器1通道1 4产生PWM波 函数参数 无 函数返回值 无 函数描述 无 void Dingshiqi1 PWM Init void TIM TimeBaseInitTypeDef TIM TimeBaseInitStruct
  • 快速解决Android编译报错 : Manifest merger failed with multiple errors, see logs

    编译项目的时候 遇到Android Manifest合并失败的情况就挺头疼的 Manifest merger failed with multiple errors see logs 直接运行项目 看不出来问题 以前都是通过 gradlew
  • 因果系列文章(4)——拨开混杂的迷雾

    本节沿袭上一节的内容 继续学习混杂 阻断 前门 后门路径等概念 混杂 抽烟的人容易导致肺癌 抽烟的人也容易出现黄手指 因为抽烟这个 共因 黄手指 和 肺癌 产生了关联 我们不难发现 手指黄的人很多都容易患肺癌 但是我们不能说 黄手指会导致肺
  • flowable实战(十五):关于流程设计器: bpmn.js与vue的整合

    一 前言 由于flowable本身带的Moder风格实在与前端页面风格不一样 同时由于Modeler采用Angular js写的 改造起来相对有一定的难度 所以打算换成bpmn js当成流程设计器 二 与vue的整合 1 安装以下包进开发环
  • nlp-生成任务-语言模型

    如果您正在google的colab中打开这个notebook 您可能需要安装Transformers和 Datasets库 将以下命令取消注释即可安装 pip install datasets transformers i https py
  • git的配置和上传github

    首先 通过url Git Downloads 在以下界面下载git并安装 接着 配置git以及基本操作 1 配置用户名称和邮箱地址 必要条件 这样仓库才能分别不同的上传者 在windows桌面上右键 显示更多选项 点击bash here 打
  • CMOS图像传感器——TDI CIS(2)

    在之前的文章 CMOS图像传感器 TDI CIS tdi相机的工作原理 沧海一升的博客 CSDN博客时间延迟积分 Time Delay Integration TDI 技术是一种特殊的成像模式https blog csdn net qq 2
  • Mysql分表准则

    author skate time 2013 05 14 Mysql分表准则 在大量使用mysql时 数据量大 高访问时 为了提高性能需要分表处理 简介下mysql分表的标准 后续会继续补充 环境 业务类型 OLTP 硬件 cpu 8cpu
  • 如何基于 WebComponents 封装 UI 组件库

    前言 作为一名前端攻城狮 相信大家也都在关注着前端的一些新技术 近些年来前端组件化开发已为常态 我们经常把重用性高的模块抽离成一个个的组件 来达到复用的目的 这样减少了我们的维护成本 提高了开发的效率 但是都有一个缺点离不开框架本身 因为我
  • 使用Openembedded定制嵌入式Linux镜像

    By Toradex秦海 1 简介 嵌入式设备采用Embedded Linux操作系统进行开发已经越来越成为主流 但是如何将开发完成的Linux uboot kernel配置 以及应用程序整合到Embedded Linux镜像中以便在量产的