Skip to content

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 call bitbake -c cleansstate -> what is cleansstate?
  • clean -> bitbake -c clean. what is defference btw clean & 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.

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 /image/linux/ sẵn sàng cho quá trình đưa lên thẻ nhớ.

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"

http://cgit.openembedded.org/meta-openembedded/tree/meta-oe/recipes-benchmark/iperf3/iperf3_3.6.bb?h=master

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 class update-rc.d.
  • INITSCRIPT_NAME & INITSCRIPT_PARAMS: là các biến số cho class update-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ến INITSCRIPT_NAME. Gói cần cung cấp mã nguồn là script iiod-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, stoprestart. Các phương thức này được sử dụng để tác động đến chương trình.

Back to top