2018년 11월 14일 수요일

PETALINUX 사용법(module, apps, init-script)

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 \
          "
2.1.2 사용자의 헤더파일을 Makefile의 추가해주어야 한다.
obj-m := cdma-drv.o
cdma-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. 사용자 디바이스 트리 추가하기

댓글 없음:

댓글 쓰기

VITIS Git + Doxygen Config

 Doxygen Configure 1. Vitis 메뉴의 Window->Preference의 C/C++ -> Editor의 Documentation tool comments 기본 설정값을 Doxygen으로 변경 설정 후 함수 바로 위에서 /...