linux内核移植imx8,NXP iMX8 Ubuntu 系统移植及 ROS 应用
By Toradex 胡珊逢
1).簡介
NXP iMX8?是NXP近期發布的基于Cortex-A72、Cortex-A53等性能非常強大的的ARM處理器,?默認?BSP?是基于?Yocto?工程編譯,這是一個精簡的產品級?Linux BSP。但是對于習慣?Ubuntu?環境的用戶,特別是?ROS?用戶,Yocto?的操作會顯得相對復雜。因此本文就采用Toradex基于NXP iMX8 SoC的ARM核心板模塊Apalis iMX8介紹如何制作一個?Ubuntu BSP,并演示如何使用?ROS。
2). Ubuntu BSP定制
一個完整的?Ubuntu BSP?包括?u-boot、Linux kernel?和?Ubuntu rootfs。為了能夠受益于?Toradex?的開發成果,我們將使用?Toradex?官方?Linux V3.0b4 BSP?中的u-boot、Linux kernel,rootfs?則仍然采用?ubuntu-base-18.04.4-base-arm64。編譯方法來自?NXP?論壇。當然,我們會使用?Toradex?的Yocto編譯環境。
首先從上面鏈接下載?ubuntu-base-18.04.4-base-arm64.tar.gz,然后解壓。
---------------------------------------
$ mkdir ~/ubuntu-rootfs
$ sudo tar vxf ubuntu-base-18.04.4-base-arm64.tar.gz -C ubuntu-rootfs
---------------------------------------
復制該腳本文件,創建?ch-mount.sh。
---------------------------------------
$ sudo chmod a+x ./ch-mount.sh
---------------------------------------
上面下載的是一個基礎的?Ubuntu-base?文件系統,缺失了很多常用的工具,需要我們進行安裝。為此在電腦上安裝?qemu-user-static?軟件仿真?arm64?運行環境。
---------------------------------------
$ sudo apt install qemu-user-static
---------------------------------------
掛載?Ubuntu-base?文件系統,然后可以直接在arm64?環境中操作。
---------------------------------------
$ sudo ./ch-mount.sh -m ubuntu-rootfs/
---------------------------------------
添加?DNS?服務器,例如8.8.8.8,或者其他可用的DNS?服務器?IP。
---------------------------------------
# echo nameserver 8.8.8.8 > /etc/resolv.conf
---------------------------------------
安裝相關軟件,當然你也可以把其他軟件添加進來。
---------------------------------------
# apt install language-pack-en-base sudo ssh net-tools \
network-manager iputils-ping rsyslog \
bash-completion htop resolvconf dialog \
vim nano v4l-utils alsa-utils git gcc \
less resolvconf autoconf autopoint libtool \
bison flex gtk-doc-tools glib-2.0 \
libglib2.0-dev libpango1.0-dev libatk1.0-dev kmod pciutils -y
---------------------------------------
創建用戶和設置密碼,這里用戶名為?ubuntu
---------------------------------------
# useradd -s '/bin/bash' -m -G adm,sudo ubuntu
# passwd ubuntu
# passwd root
# echo 'apalis-imx8' > /etc/hostname
---------------------------------------
至此基本的?Ubuntu?已經配置完畢。
---------------------------------------
# exit
$ sudo ./ch-mount.sh -u ubuntu-rootfs/
---------------------------------------
接下來需要按照上面的鏈接搭建?Yocto?編譯環境,生成適用于?Apalis iMX8的?GPU?驅動和?weston?軟件。將?build/conf/local.conf?文件中INHERIT += "rm_work"?屬性注釋掉,因為我們需要其中一些軟件包編譯后的二進制文件,用于構建?Ubuntu BSP。然后成功編譯適用于?Apalis iMX8的?console-tdx-image。
---------------------------------------
# Delete the the souIMX8rce/object/binary files once a package is built to preserve disk space
# INHERIT += "rm_work"
---------------------------------------
如果你已經在之前成功編譯過?console-tdx-image?但是沒有刪除INHERIT += "rm_work"?屬性,那需要重新編譯下面幾個軟件包
---------------------------------------
$ bitbake -c cleanall libdrm && bitbake libdrm
$ bitbake imx-gpu-viv && bitbake -c cleanall imx-gpu-viv
$ bitbake -c cleanall imx-dpu-g2d && bitbake imx-dpu-g2d
$ bitbake -c cleanall wayland && bitbake wayland
$ bitbake -c cleanall wayland-protocols && bitbake wayland-protocols
$ bitbake -c cleanall weston && bitbake weston
& bitbake -c cleanall weston-init && bitbake weston-init
& bitbake -c cleanall libinput && bitbake libinput
---------------------------------------
刪除?Ubuntu-base?中原有的?drm、egl、wayland?文件。
---------------------------------------
$ sudo rm -rf ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libdrm*
$ sudo rm -rf ubuntu-rootfs/usr/lib/aarch64-linux-gnu/mesa-egl/*
$ sudo rm -rf ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libglapi.so.0*
$ sudo rm -rf /usr/lib/aarch64-linux-gnu/libwayland-*
---------------------------------------
我們在?“~/V30/“?目錄下編譯?Yocto?環境,同樣?ubuntu-rootfs?也位于?“~/“目錄中。根據你的實際情況調整路徑,然后復制相關文件。
---------------------------------------
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/libdrm/2.4.91.imx-r0/image$ sudo cp -Ppra usr ~/ubuntu-rootfs/
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/imx-gpu-viv/1_6.2.4.p4.8-aarch64-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/imx-dpu-g2d/1.7.6-r0/image$? sudo cp -Ppra ./* ~/ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/wayland/1.16.0-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/wayland-protocols/1.16.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/weston/5.0.0.imx-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/libinput/1.11.3-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/libxkbcommon/0.8.2-r0/images$ sudo cp -Ppra ./* ~/ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/mtdev/1.1.5-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/libevdev/1.5.9-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /
---------------------------------------
如果需要?Gstreamer?也可以添加進來
---------------------------------------
$ bitbake -c cleanall gstreamer1.0-plugins-base && bitbake gstreamer1.0-plugins-base
$ bitbake -c cleanall gstreamer1.0-plugins-good && bitbake gstreamer1.0-plugins-good
$ bitbake -c cleanall gstreamer1.0-plugins-bad && bitbake gstreamer1.0-plugins-bad
$ bitbake -c cleanall imx-gst1.0-plugin && bitbake imx-gst1.0-plugin
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/gstreamer1.0/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/gstreamer1.0-plugins-base/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/gstreamer1.0-plugins-good/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/gstreamer1.0-plugins-bad/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /
oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/imx-gst1.0-plugin/4.5.2-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /
---------------------------------------
下載?Toradex Linux V3.0b4 BSP后解壓。
---------------------------------------
$ cd ~/
$ tar vxf 107503-apalis-imx8_console-image-tezi.tar
$ cd Apalis-iMX8_Console-Image-Tezi_3.0b4.254/
$ sudo tar vxf Console-Image-apalis-imx8.tar.xz -C ~/console-rootfs
---------------------------------------
復制相關文件
---------------------------------------
oe-user@oe-v30-build:~ $ cd ~/
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/lib/firmware/vpu ubuntu-rootfs/lib/firmware/
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/lib/firmware/mrvl ubuntu-rootfs/lib/firmware/
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/lib/modules ubuntu-rootfs/lib/
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service ubuntu-rootfs/etc/systemd/system/getty.target.wants/
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/etc/fstab ubuntu-rootfs/etc/
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/usr/share/X11/xkb ubuntu-rootfs/usr/share/X11/
oe-user@oe-v30-build:~ $ sudo rm ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libjpeg.so*
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/usr/lib/libjpeg.so* ubuntu-rootfs/usr/lib/aarch64-linux-gnu/
oe-user@oe-v30-build:~ $ sudo rm ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libcairo.so*
oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/usr/lib/libcairo.so.2* ubuntu-rootfs/usr/lib/aarch64-linux-gnu/
--------------------------------------
到此,集成顯示功能的基本?Ubuntu rootfs?已經構建完畢。如你看到的,我們采用了?weston?和?wayland?顯示框架,而不是傳統的?Xorg。所以這里的?Ubuntu?也并不是我們在電腦上看到的?Gnome?桌面環境。
最后我們將?ubuntu-rootfs?重新打包成支持?Toradex Easy Installer?燒寫的格式。
---------------------------------------
oe-user@oe-v30-build:~ $ cd ~/
oe-user@oe-v30-build:~ $ sudo tar cJfv ubuntu_18.04.4_rootfs.tar.xz -C ubuntu-rootfs .
oe-user@oe-v30-build:~ $ mv ubuntu_18.04.4_rootfs.tar.xz Apalis-iMX8_Console-Image-Tezi_3.0b4.254/
oe-user@oe-v30-build:~ $ mv Apalis-iMX8_Console-Image-Tezi_3.0b4.254 Apalis_iMX8_3.0b4.254_ubuntu18.04
oe-user@oe-v30-build:~ $ cd Apalis_iMX8_3.0b4.254_ubuntu18.04
oe-user@oe-v30-build:~ $ rm Console-Image-apalis-imx8.tar.xz
---------------------------------------
修改image.json?文件
---------------------------------------
{
"config_format": 2,
"autoinstall": false,
"name": "Ubuntu 18.04 based on Toradex Linux 3.0b4.254",
"description": "Ubuntu 18.04 Weston",
"version": "Ubuntu_18.04_3.0b4.254",
"release_date": "2020-04-21",
……
{
"partition_size_nominal": 512,
"want_maximised": true,
"content": {
"label": "RFS",
"filesystem_type": "ext4",
"mkfs_options": "-E nodiscard",
"filename": "ubuntu_18.04.4_rootfs.tar.xz",
"uncompressed_size":?1232.53125
}
}
---------------------------------------
現在你可以將?Apalis_iMX8_3.0b4.254_ubuntu18.04?復制到?SD?或者?U?盤通過?Toradex Easy Installer?安裝。如果你想直接在?Apalis iMX8模塊上測試?Ubuntu?也可以從這里下載我們已經制作好的安裝文件。
安裝完畢后在調試串口使用?ubuntu?用戶登錄,密碼為之前您所設置的。我們提供的?Ubuntu?測試?BSP?里,密碼為ubuntu.
開啟以太網并設置DNS?服務器IP。
---------------------------------------
ubuntu@apalis-imx8:~$ sudo ifconfig eth0 up
ubuntu@apalis-imx8:~$ sudo dhclient eth0
ubuntu@apalis-imx8:~$ sudo vi /etc/resolv.conf
---------------------------------------
啟動?weston?。
---------------------------------------
ubuntu@apalis-imx8:~$ export XDG_RUNTIME_DIR=/run/user/1000
ubuntu@apalis-imx8:~$ sudo -E weston --tty=1 &
ubuntu@apalis-imx8:~$ weston-flower
---------------------------------------
3). ROS測試
在?Ubuntu?系統里你可以十分方便地安裝?ROS?程序,具體可以參考下面說明。
---------------------------------------
ubuntu@apalis-imx8:~$ sudo apt install lsb-core
ubuntu@apalis-imx8:~$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
ubuntu@apalis-imx8:~$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
ubuntu@apalis-imx8:~$ sudo apt update
ubuntu@apalis-imx8:~$ sudo apt install ros-melodic-desktop
---------------------------------------
在三個?SSH?終端分別運行下面命令,模擬ROS?節點之間相互通信。
---------------------------------------
// Terminal 1
ubuntu@apalis-imx8:~$ source /opt/ros/melodic/setup.sh
ubuntu@apalis-imx8:~$ roscore
// Terminal 2
ubuntu@apalis-imx8:~$ source /opt/ros/melodic/setup.sh
ubuntu@apalis-imx8:~$ rosrun roscpp_tutorials talker
// Terminal 3
ubuntu@apalis-imx8:~$ source /opt/ros/melodic/setup.sh
ubuntu@apalis-imx8:~$ rosrun roscpp_tutorials listener
---------------------------------------
4).總結
Ubuntu系統由于其豐富的軟件源,用戶可以很便捷地安裝所需軟件,加速測試、開發流程。為此本文結合NXP資料介紹在Apalis iMX8上移植Ubuntu的方法以及ROS的簡單應用。由于驅動限制,iMX8并不支持Xorg,因此ROS默認的圖形界面工具將無法直接使用,如rqt等。另外需要說明的是,本文僅用于技術討論,使用期間如遇到問題,需用戶自行解決。
總結
以上是生活随笔為你收集整理的linux内核移植imx8,NXP iMX8 Ubuntu 系统移植及 ROS 应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: verilog仿真——$test$plu
- 下一篇: ALSA声卡12_从零编写之添加音量控制