嵌入式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情況
如下圖片
還有一起啟動過程的視頻如下:
http://v.youku.com/v_show/id_XMzE3MDY4NDkyNA==.html
9).?總結
本文只是簡單演示了利用?OpenEmbedded?可以非常方便的生成定制化?Embedded Linux,另外配合git,還可以很好的實現不同版本的管理。但是?OpenEmbedded?架構本身也是比較復雜的,要想靈活使用還需要對其做一些深入的學習才能得心應手。
總結
以上是生活随笔為你收集整理的嵌入式linux镜像,使用Openembedded定制嵌入式Linux镜像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言建立动态链表ppt,C语言链表讲解
- 下一篇: python能做什么效果_python对