嵌入式linux镜像,使用Openembedded定制嵌入式Linux镜像

关键词:ARM,Linux,Openembedded

作者:ByToradex秦海

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

1). 简介

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

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

2). 准备

a). ColibriiMX6 ARM核心版配合ColibriEva 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 修改,本文因没有修改devicetree名字,因此没有修改次文件,内容如下:

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-customlayer目录下创建 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 USBEthernet Adapter驱动

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

→ Device Drivers → Network device support → USB NetworkAdapters

  Realtek RTL8152/RTL8153 Based USBEthernet 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-customlayer目录下创建 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-customlayer目录下创建 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-customlayer目录下创建 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 目录,将 u pdate.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-customlayer 的所有修改都已经完成,下面我们进入 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=RGB666video=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情况

如下图片

6c60d617fe19c00e9b908b735a78601c.png

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

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

9). 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pythonhtml生成word_python如何实现word批量转HTML

今天我们说一下使用python将word内容转换成html文件。下面一起来看一下。准备工作使用python类库PyDocX,安装方法(使用pip进行安装),命令如下:类库介绍python-docx是用于创建和更新Microsoft Word(.docx)文件的Python库。它可以针对word做很多…

linux安装 中文乱码怎么解决方法,Linux安装GBK/GB2312程序显示乱码的五种解决方法...

不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,接下来是小编为大家收集的Linux安装GBK/GB2312程序显示乱码的五种解决方法,希望能帮到大家。Linux…

关于python序列类型的通用操作符_Python—语法基础(3) 序列类型及操作

序列类型:一维元素向量,元素类型可以不同,通过下标访问序列的特定元素,字符串类型、元组类型、列表类型属于序列类型序列类型通用操作符:x in s         如果x是序列s的元素,返回True,否…

linux 设备驱动总结,linux设备驱动归纳总结(三):3面向对象思想和lseek

linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现一、结构体structfile和struct inode在之前写的函数,全部是定义了一些零散的全局变量。有没有办法整合成到一个结构体当中?这样的话,看起来和用起来都比较方便。接…

idea junit 测试看不到控制台报错信息_高手都这么给 Spring MVC 做单元测试!

本章节主要讲解以下两部分内容:1、Mock 测试简介2、测试用例演示一、Mock 测试简介1、什么是 mock 测试在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个「虚拟的对象」来创建以便测试的测试方法,就是 「mock 测试」在…

windows查询每个线程占用的内存_C#多线程

一、基本概念1、进程首先打开任务管理器,查看当前运行的进程:从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所…

linux 录屏软件 按键,linux下常用的截图、录屏工具

linux下常用的截图、录屏工具(2010-01-05 10:47:21)由于和老公一起做一个百度俱乐部的小项目,在编写测试文档时要使用截图、录屏的小工具,于是展开搜索什么工具比较好使。录屏:在linux下常用的录屏工具有5种,可以baidu或者google下…

python x_PythonX

而且你的onTouch里面逻辑也有问题,正确写法:public FloatingView (Context context){super(context);mContext context.getApplicationContext();LayoutInflater mLayoutInflater LayoutInflater.from(context);mView mLayoutInflater.inflate(R.layo…

linux把root用户删了,linux root用户没法删除文件

linux文件有用户或用户组权限,即可对文件进行任何操作。但是除了所有者权限,部分文件系统的文件还有扩展属性。拥有超级权限的用户可以使用chattr的权限增加文件扩展属性,这项指令可改变存放在ext2、ext3、ext4、xfs、ubifs、reiserfs、jfs等…

实体类blob类型_Mysql的数据类型和JPA的实体类

​MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。数值类型Int,4字节,(-2147483648,2147483647), (0,4294967295)BIGINT,8 字节,(-9223372036854775808,92…

linux操作系统中查看网络信息的命令,Linux查看系统信息命令盘点

Linux查看系统信息命令盘点在Linux系统上有很多操作都是用命令完成的,下面跟yjbys小编一起来看看最新的系统命令吧,希望对大家有所帮助!1.查看系统内核uname -auname -rfile /sbin/init--通过file命令判断系统中的文件时32位还是64位的--64位CPU系统架构…

python git切换分支_git命令之切换分支

Git一般有很多分支,我们clone到本地的一般都是master分支,如何进行分支的切换呢?那么下面带大家简单的看看如何通过命令来切换:1、查看远程仓库及本地的所有分支命令:git branch -aqinjiaxi:~$ git branch -a* masterr…

Linux作者批评英特尔指令集,英特尔回应 Linus Torvalds 对 AVX512 的批评

英特尔回应 Linus Torvalds 对 AVX512 的批评Linux 作者上个月抨击了英特尔的 AVX512 指令集. 他还希望该指令集能早日成为历史. Torvalds 不是唯一一位批评 AVX512 的人.对于这些批评, 英特尔首席架构师 Raja Koduri 回应称社区喜欢 AVX512, 因为它能带来巨大的性能提升. 他说…

python升级版本命令_如何在python中安装和配置kivy库

kivy是python的UI开发工具包,主要关注用户界面显示效果,可以在Android、IOS、Linux、OS X和Windows上运行。如果python开发中使用kivy,需要安装和配置相关文件和依赖模块。1、在电脑左下角打开开始菜单,输入cmd打开终端窗口在电脑…

linux系统如何安装bt5,BT5硬盘安装(多系统linux + win + BT5)

BT5硬盘安装(多系统linux win BT5)实际上,Win BT5的安装不是很困难,但据我所知我也有两种: 1如官方说明中所述,工具unetbootin,运行unetbootin,在“ CD映像”中,选择BT5的ISO,在“类型”中选…

android主板读取vga线数据_智锐通掘金新基建上新系列之3.5quot; 与ATX工业主板图鉴...

4月份,工信部正式公布了《工业互联网体系架构(版本2.0)》!5G、大数据、人工智能、区块链、边缘计算等新技术加速融入并不断拓宽工业互联网的内涵与赋能潜力。新一代信息技术为驱动的数字浪潮正在深刻重塑经济社会各个领域的当前,智锐通科技聚…

c语言检查字符数组不为空,【C语言】检查输入是否为空,如为空,程序退出

检查用户输入是否为空行,如果输入为空,程序将退出;如不为空,屏幕打印输入的字符串。#include char input[257], *ptr;int main(void){puts("Enter text a line at a time, then pressenter.");puts("Enter a blank…

零基础也能看懂python_零基础也能看懂的Python下载网易云音乐爬虫

PythonSelenium(配置方法参照:Selenium配置)Chrome浏览器(其它的也可以,需要进行相应的修改)解析以前抓取过网易云网页的朋友可能都清楚网易云有反爬虫策略的,post时要对部分信息的参数完成加密函数的模拟。为了方便,入门新手也可…

Python 爬虫之下载视频(五)

爬取第三方网站视频 文章目录 爬取第三方网站视频前言一、基本情况二、基本思路三、代码编写四、注意事项(ffmpeg)总结 前言 国内主流的视频平台有点难。。。就暂且记录一些三方视频平台的爬取吧。比如下面这个: 一、基本情况 这次爬取的方…

c语言程序中的if-else语句,C语言if else语句

C语言中,使用if和else关键字对条件进行判断。请先看下面的代码:#include int main(){ int age; printf("请输入你的年龄:"); scanf("%d", &age); if(age>18){ printf("恭喜,你…