1. 커널 소스(드라이버 소스파일)수정
PetaLinux을 빌드한 후 생성된 이미지는 <plnx-proj-root>/image/linux에 있으며, 커널 소스는 <plnx-proj-root>/build/tmp/work-shared/plnx_aarch64 폴더 아래 있다.
1.1 커널소스를 수정하고 싶으면 나같은 경우 xilinx git에서 커널 소스를 다운받은 후 petalinux-config 에서 Linux Components Selection---> linux-kernel (linux-xlnx)---> ext-local-src 를 선택 한다.
1.2 ext-local-src를 선택하게 되면 하위 External linux-kernel local source settings---> 항목이 생기고 여기에 들어가서 xilinx git에서 받은 커널 소스(압축을 푼)위치를 적어주면 된다.
1.3 이후 커널 코드 수정후 petalinux-build -c kernel 하게되면 변경된 코드로 이미지를 만들어준다.
2. 사용자 모듈 만들기
2.1 기본적인 명령은 아래와 같다.
$ petalinux-create -t modules --name <user-module-name> --enable
$ petalinux-create -t modules --name cdma-driver --enable 명령을 실행하게 되면 <plnx-proj-root>/project-spec/meta-user/recipes-modules/cdma-driver/files에 Makefile과 cdma-driver.c파일이 생성된다.
cdma-driver.c파일의 소스코드를 수정후에 사용하면 된다.
2.1.1 사용자가 추가된 파일이 있을경우 bb파일의 생성한 파일의 리스트업해줘야 한다.
cdma-driver.bb file 수정
SRC_URI = "file://Makefile \
file://cdma-driver.c \
file://cdma.c \
file://include/cdma.h \
file://COPYING \
"
file://cdma-driver.c \
file://cdma.c \
file://include/cdma.h \
file://COPYING \
"
2.1.2 사용자의 헤더파일을 Makefile의 추가해주어야 한다.
obj-m := cdma-drv.ocdma-drv-objs := cdma-driver.o cdma.o
SRC := $(shell pwd)
#ccflags-y := -I$(src)/include
all:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC) ccflags-y+=-I$(src)/include
modules_install:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
clean:
2.2 빌드하기
디버깅을 위한 빌드 아티펙트를 사용하기 위해 project-spec / meta-user / conf / petalinuxbsp.conf에 다음 행을 추가해준다.
RM_WORK_EXCLUDE + = "cdma-driver"
$ petalinux-build -c cdma-driver
한번 빌드 후 코드 수정을 하고 다시 빌드하기 위해서는 아래 절차를 따라야 한다.
$ petalinux-build -c cdma-driver -x do_clean
$ petalinux-build -c cdma-driver
2.3 컴파일 완료된 모듈 위치
<plnx-proj-root>/build/tmp/work/plnx_aarch64-xilinx-linux/cdma-driver/1.0-r0/sysroot-destdir/lib/modules/4.9.0/extra
2.4 컴파일시 아래와 같은 오류가 나면 모듈이름으로 대문자가 포함되어서이다.
ERROR: petalinux-user-image-1.0-r0 do_rootfs: intrChecker not found in the feeds (plnx_aarch64 aarch64 noarch any all) in /home/pcw1029/projects/RCS/petalinux/zcu102/build/tmp/deploy/rpm.
ERROR: petalinux-user-image-1.0-r0 do_rootfs: This is often caused by an empty package declared in a recipe's PACKAGES variable. (Empty packages are not constructed unless ALLOW_EMPTY_<pkg> = '1' is used.)
ERROR: petalinux-user-image-1.0-r0 do_rootfs: Function failed: do_rootfs
ERROR: Logfile of failure stored in: /home/pcw1029/projects/RCS/petalinux/zcu102/build/tmp/work/plnx_aarch64-xilinx-linux/petalinux-user-image/1.0-r0/temp/log.do_rootfs.19016
ERROR: Task (/home/pcw1029/projects/RCS/petalinux/zcu102/project-spec/meta-plnx-generated/recipes-core/images/petalinux-user-image.bb:do_rootfs) failed with exit code '1'
3. 사용자 Application 만들기
3.1 기본적인 명령은 아래와 같다.
$petalinux-create -t apps [--template TYPE] --name <user-application-name> --enable
$ petalinux-create -t apps --name bramMem --enable
명령을 실해하게 되면 <plnx-proj-root>/project-spec/meta-user/recipes-apps/bramMem/files/위치에 폴더와, 기본적으로 Makefile 과 bramMem.c파일이 생성된다.
c파일에는 hello world를 출력하는 구문만 있다. 이 코드를 수정해서 사용하면 된다.
3.2 생성한 파일 빌드하기
$ petalinux-build -c bramMem
한번 빌드 후 코드 수정을 하고 다시 빌드하기 위해서는 아래 절차를 따라야 한다.
$ petalinux-build -c bramMem -x do_clean
$ petalinux-build -c bramMem
$ petalinux-build -c bramMem -x do_install
3.3 컴파일 완료된 바이너리 위치
<plnx-proj-root>/build/tmp/work/aarch64-xilinx-linux/bramMem/1.0-r0/
bramMem 파일을 tftp를 이용하여 타켓보드에 올려서 테스트하면 된다.
3.4 application auto run at startup
3.4.1. 부팅시 자동으로 어플리케이션을 실행하는
4. INIT script만들기
*주의 : 스크립트 이름은 반드시 소문자로 해야한다. 대문자인 경우 /etc/rc5.d/ 위치로 복사가 이루워지지 않는다.
4.1 기본적인 명령은 아래와 같다.
$petalinux-create -t apps --name rf-ctrl-app-init --enable --template install
명령이 실행되면 <plnx-proj-root>/project-spec/meta-user/recipes-apps/rf-ctrl-app-init폴더에 rf-ctrl-app-init.bb 파일과 files폴더가 생성된다.
4.1.1 rf-ctrl-app-init.bb 파일 수정
#
# This file is the rfCtrlApp-init recipe.
#
SUMMARY = "Simple rf-ctrl-app-init application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://rf-ctrl-app-init \
"
S = "${WORKDIR}"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
inherit update-rc.d
INITSCRIPT_NAME = "rf-ctrl-app-init"
INITSCRIPT_PARAMS = "start 30 5 ."
do_install() {
# install -d ${D}/${bindir}
# install -m 0755 ${S}/rf-ctrl-app-init ${D}/${bindir}
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${S}/rf-ctrl-app-init ${D}${sysconfdir}/init.d/rf-ctrl-app-init
}
FILES_${PN} += "${sysconfdir}/*"
4.1.2 files/rf-ctrl-app-init 파일 수정
#!/bin/sh
PIDFILE_RFCTRLAPP=/var/run/rfCtrlApp.PIDFILE_RFCTRLAPP
DAEMON_RFCTRLAPP=/usr/bin/rfCtrlApp
start()
{
echo "Starting rfCtrlApp"
start-stop-daemon -S --make-pidfile --pidfile $PIDFILE_RFCTRLAPP -o --background -x $DAEMON_RFCTRLAPP
}
stop()
{
echo "Stoping rfCtrlApp"
start-stop-daemon -K -x $DAEMON_RFCTRLAPP -p $PIDFILE_RFCTRLAPP
rm -f $PIDFILE_RFCTRLAPP
}
restart()
{
stop
start
}
[ -e $DAEMON ] || exit 1
case "$1" in
start)
start; ;;
stop)
stop; ;;
restart)
restart; ;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
5. 사용자 디바이스 트리 추가하기