Petalinux 2017.4 technical note
Vu Tang - 2/2019
Introdutions
Tài liệu này là tổng hợp các điểm lưu ý trong quá trình làm việc với Petalinux 2017.4. Version 2017.4 này của Xilinx là một thể hiện rõ ràng của việc ứng dụng YOCTO PROJECT trong quá trình phát triển một hệ nhúng Linux. Để hiểu rõ hơn quá trình làm việc của petalinux 2017.4, cần tìm hiểu thêm về nguyên tắc hoạt động của Yocto.
Tips
Speed up sstate checking
https://forums.xilinx.com/t5/Embedded-Linux/Checking-sstate-mirror-taking-forever/td-p/775404
- Diable sstate online in Yocto
Worknote
-
build target when use
petalinux build
is petalinux-user-image.bb. Bitbake file dir: [project dir]/project-spec/meta-plnx-generated/recipes-core/images/petalinux-user-image.bb -
based-bitbake file be used for all project is found at: [installation dir]/components/yocto/source/
-
petalinux-build -x clean/distclean
is not affect to download dir - Removing build/tmp dir need to rebuild all project (except fetching source code). This job takes a while.
petalinux-build -x distclean
will callbitbake -c cleansstate
-> what is cleansstate?-
clean
-> bitbake -c clean. what is defference btwclean
&cleansstate
-
$WORKDIR: build/tmp/work/plnx_arm-xilinx-linux-gnueabi/libsample-tar/1.0-r0
Experiences
Create and initialize a project
Quá trình khởi tạo project (1) và import hdf (2) tiến hành tương tự với petalinux 2015.4 (xem thêm ug1144 để biết về các cmd tương ứng cho từng quá trình).
├── config.project
└── project-spec
├── attributes
├── configs
│ ├── config
│ └── rootfs_config
├── hw-description
│ └── metadata
└── meta-user
├── conf
├── COPYING.MIT
├── README
├── recipes-apps
└── recipes-bsp
Kết thúc quá trình (1), project được tạo với thư mục “project-spec”. Trong đó:
- Thư mục con “configs” chứa các cấu hình của project (các cấu hình này được thay đổi bằng họ câu lệnh “petalinux-config”).
- Thư mục con “hw-description” trống.
- Thư mục con “meta-user” chứa các recipes liên quan đến user-apps và bsp. Ngoai ra thư mục này còn chứa trong ./conf các cấu hình liên quan đến Yocto cho Layer meta-user.
Kết thúc quá trình (2), cấu trúc thư mục của project biến đổi như hình vẽ dưới đây.
├── build
│ ├── cache
│ ├── conf
│ ├── config.log
│ ├── misc
│ └── tmp
├── components
│ └── plnx_workspace
├── config.project
└── project-spec
├── attributes
├── configs
├── hw-description
├── meta-plnx-generated
├── meta-user
└── yocto-layer.log
Trong đó, xuất hiện thêm một số thư mục quan trọng sau:
- Thư mục “build” là thư mục được sử dụng đế tiến hành các giai đoạn trong quá trình build project. Trong đó kết quả trung gian trong các quá trình build được lưu trữ tại “tmp”. Ngoài ra, trong các quá trình tiếp theo trong “build” sẽ xuất hiện thêm thư mục “downloads” thực hiện chức năng lưu trữ các package được thực hiện trong quá trình “do_fetch”.
- Thư mục “components” trong các phiên bản petalinux trước sẽ được sử dụng để chứa source code liên quan đến các customed-component của user. Trong phiên bản này chưa xác định được chức năng của thư mục component.
- Xuất hiện thêm Yocto layer “meta-plnx-generated” trong thư mục “project-spec”, chứa các Yocto recipes liên quan đến kernel, core, bsp.
Xem thêm Apendix A trong tài liệu ug1144 để biết thêm thông tin về Petalinux project structure.
Build a new project without Internet
Để thực hiện build, chạy lệnh “petalinux-build”.
Pre-build configuration
-
Bản chất của quá trình này là gọi đến target “petalinux-user-image” của Yocto project.
-
“Checking sstate mirror object availability” mất rất nhiều thời gian để thực hiện? -> Tiến hành tắt bỏ chức năng check này trong petalinux-config > Yocto > sstate.
-
Xuất hiện lỗi liên quan đến bitbake nếu dừng quá trình build đột ngột (ví dụ dừng bằng tổ hợp phím Ctl+C). Solution here:
- Re-init environment:
/home/user/Xilinx/Petalinux/settings.sh /home/user/Xilinx/Petalinux/components/yocto/source/aarch64/environment-setup-aarch64-xilinx-linux - Remove ./build/bitbake.lock.
- Re-init environment:
Các cấu hình của project được lưu trữ ở: project-spec/configs/config
Do_fetch - What is problem?
Trong quá trình build, petalinux sẽ thực hiện lấy các gói có sẵn trong thư mục cài đặt của petalinux, đường dẫn như sau: [Instalation Direction]/components/yocto/downloads. Ngoài ra petalinux tiến hành download từ Internet thêm các gói như:
- (1) gcc-source-linaro-6.2-linaro-6.2-r2016.11
- (2) binutils-cross-arm-linaro-2.27-r2016.10
- (3) u-boot-mkimage-native-v2016.03+gitAUTOINC+df61a74e68-r0
- (4) binutils-native-linaro-2.27-r2016.10
- ...
Nếu trong quá trình build không có kết nối Internet sẽ dẫn đến các thông báo build lỗi. Ví dụ như:
- “u-boot-mkimage-native-v2016.03+gitAUTOINC+df61a74e68-r0 do_fetch: Fetcher failure” Như vậy, bản cài đặt mặc định của petalinux không chứa đủ các gói phần mềm sử dụng cho quá trình Yocto build (?). Cần có thêm các gói sau:
- git2_git.linaro.org.toolchain.binutils-gdb.git tương ứng với (2) và (4)
- git2_git.linaro.org.toolchain.gcc.git tương ứng với (1)
Linaro - what is this?
External kernel - How to?
Boot from SD card
Về cơ bản, boot từ SD Card được thực hiện giống với hướng dẫn trong mục Zedboard. Tệp rootfs.cpio được chứa trong thư mục
Mounting SD card in booting-time
Refer PetaLinux Yocto Tips (xilinx-wiki.atlassian.net) for step-by-step instructions.
Add user custom package
Bản chất quản lý gói phần mềm trong petalinux là Yocto project. Mã nguồn của các gói phần mềm có thể được download từ các online repository hoặc lưu trữ trực tiếp trên máy local. Trong mục này sẽ lấy ví dụ về một gói phần mềm phổ biến, hay được sử dụng trong quá trình đánh giá chất lượng mạng: IPERF.
Petalinux sẽ thực hiện tải source code của iperf từ Github sau đó tiến hành cấu hình, build và tích hợp vào hệ thống.
Khi khởi tạo một ứng dụng (apps) mới, một package được tạo tại project-spec/meta-user/recipes-apps
. Cấu trúc của một recipes như sau:
vux-iperf/
├── files
│ ├── 0002-Remove-pg-from-profile_CFLAGS.patch
│ └── automake-foreign.patch
├── README
└── vux-iperf.bb
Trong ví dụ là cấu hình để build bản phần mềm iperf3. Bitbake file cho recipes này được tải tại iperf3 3.6 (layers.openembedded.org). Nội dung file iperf3_3.6.bb như sau:
SUMMARY = "Network benchmark tool"
HOMEPAGE = "http://software.es.net/iperf/"
SECTION = "console/network"
BUGTRACKER = "https://github.com/esnet/iperf/issues"
AUTHOR = "ESNET <info@es.net>, Lawrence Berkeley National Laboratory <websupport@lbl.gov>"
LICENSE = "BSD"
LIC_FILES_CHKSUM = "file://LICENSE;md5=a9a036136b748453e839c0eb8906ef2e"
DEPENDS = "openssl"
SRC_URI = "git://github.com/esnet/iperf.git \
file://automake-foreign.patch \
file://0002-Remove-pg-from-profile_CFLAGS.patch \
"
SRCREV = "88f3ad87f38762081a6d7127890ff5c3a052b06a"
S = "${WORKDIR}/git"
inherit autotools
PACKAGECONFIG[lksctp] = "ac_cv_header_netinet_sctp_h=yes,ac_cv_header_netinet_sctp_h=no,lksctp-tools"
CFLAGS += "-D_GNU_SOURCE"
EXTRA_OECONF = "--with-openssl=${RECIPE_SYSROOT}${prefix}"
BBCLASSEXTEND = "native"
Trong file vux-iperf.bb có một số khái niệm và thông tin cần lưu ý như sau.
Đường dẫn đến source code của package
Tham số SRC_URI chứa đường dẫn đến source code của pakcage. Thông qua thông tin chứa trong đường dẫn này, bitbake thực hiện nhiệm vụ do_fetch.
SRC_URI = "git://github.com/esnet/iperf.git \
file://automake-foreign.patch \
Trong ví dụ này, SRC_URI chỉ đến một git repository của esnet. Người dùng có thể truy cập trực tiếp vào repo này để xem source code. Ngoài ra SRC_URI chỉ đến một file được lưu trữ local chứa bản patch. Bản patch này có thể được tìm thấy trên openembedded.org.
Revision của source code
Tham số SRCREV chỉ cho bitbake biết được revision nào của source code cần được sử dụng để build package.
SRCREV = "88d907f7fb58bfab5d086c5da60c922e1c582c92"
Ngoài ra, SRCREV còn có thể cung cấp thêm các thông tin như sau:
- protocol: giao thức sử dụng để fetch source code (protocol=https...)
- branch: branch mong muốn fetch source code (branch=master...)
Tương ứng với mỗi revision chứa một file LICENSE đi kèm với MD5SUM.
LIC_FILES_CHKSUM = "file://LICENSE;md5=d098223e44bdd19585315ee75cd9d2d7"
Lưu ý rằng LIC_FILES có thể là LICENSE hoặc bất cứ tên khác.
petalinux-image.bbappend
Lưu trữ tại project-spec/meta-user/recipes-core/images/petalinux-image.bbappend chứa các package có thể được install vào hệ thống. Khi xóa các package trong file này sẽ ảnh hưởng đến petalinux-config -c rootfs.
Application Auto Run at Startup
Thuật ngữ: update-rc.d
, System V
Các ứng dụng được cài đặt trên Rootfs dưới dạng các binary và thông thường chỉ được khởi động khi có yêu cầu của người dùng. Trong một số trường hợp ứng dụng cần khởi động trong quá trình booting cùng hệ thống.
Ý tưởng cho phương pháp này là sử dụng Yocto class update-rc.d.bbclass
để cài đặt init script
dạng System V
vào hệ thống. update-rc.d.bbclass
sử dụng update-rc.d (a Debian utility) đề "safety install" init script vào hệ thống.
Dưới đây là recipe file của một package yêu cầu Yocto tiến hành cài đặt một init script
vào hệ thống.
SUMMARY = "Simple iiod-init application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://iiod-init \
"
S = "${WORKDIR}"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
inherit update-rc.d
INITSCRIPT_NAME = "iiod-init"
INITSCRIPT_PARAMS = "start 99 S ."
do_install() {
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${S}/iiod-init ${D}${sysconfdir}/init.d/iiod-init
}
FILES_${PN} += "${sysconfdir}/*"
Một số điểm lưu ý trong recipe:
inherit update-rc.d
: gọi đến classupdate-rc.d
.INITSCRIPT_NAME
&INITSCRIPT_PARAMS
: là các biến số cho classupdate-rc.d
. Tham khảo thêm tại update-rc.d.bbclass của Yocto ref-manual.- init script trong
recipe
này là "iiod-init" được định nghĩa tại biếnINITSCRIPT_NAME
. Gói cần cung cấp mã nguồn là scriptiiod-init
.
Init script cần được viết theo System V init
style. Về cơ bản script cần cung cấp được các phương thức: start
, stop
và restart
. Các phương thức này được sử dụng để tác động đến chương trình.