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. 사용자 디바이스 트리 추가하기

2018년 11월 7일 수요일

PETALINUX 설치 및 설정

우선 PetaLinux설치를 위해 필요한 파일들을 Xilinx에서 다운 받는다.
보드는 ZCU102를 사용하기 때문에 설정에 필요한 xilinx-zcu102-v2017.3-final.bsp 파일과 설치를 위한 petalinux-v2017.3-final-installer.run 파일이 필요하다.
OS : Ubuntu 16.04  (petalinux v2017은 ubuntu16.04이상에서 지원 안함)
Free HDD : 100G 이상
MEM : 4G 
Core 개수 : 4개이상 을 권장한다.

1.  UG1144문서에 따르면 설치를 위해서 필요한 패키지 무지 많다. 따라서 PetaLinux 설치를 위해 필요한 모든 패키지 들은 설치해줘야 한다. 
정학히 어떤 패키지가 설치되어 있고 어떤 패키지들이 추가로 필요한지 확인하는 방법은 무식하게 ./petalinux-v2017.3-final-installer.run 를 실행해 보면 알수있다.
나같은 경우 아래 리스트가 추가적으로 필요하다고 알려주고 있다.
- gawk
- xvfb-run
- chrpath
- socat
- autoconf
- libtool
- git
- gawk
- texinfo
- zlib1g-dev
- gcc-multilib
- libsdl1.2-dev
- libglib2.0-dev
- zlib
- ncurses
- openssl
- zlib1g:i386

2. 추가 설치가 필요한 패키지 설치 - sudo apt-get install를 이용해 아래와 같이 추가 설치해 준다.
$ sudo sudo apt-get install python
$ sudo apt-get install tofrodos iproute2 gawk gcc git make net-tools libncurses5-dev zlib1g-dev libssl-dev flex libselinux1 wget diffstat chrpath
$ sudo apt-get install socat xterm autoconf libtool texinfo zlib1g-dev gcc-multilib build-essential libsdl1.2-dev libglib2.0-dev
$ sudo apt-get install xvfb
$ sudo apt-get install zlib1g:i386

3. 파일 다운로드를 위해 tftpd도 함께 설치하고 아래와 같이 설정한다. 
$ sudo apt-get install xinetd tftp tftpd
$ sudo vi /etc/xinetd.d/tftp
service tftp
{
    socket_type     = dgram
    protocol        = udp
    wait            = yes
    user            = root
    server          = /usr/sbin/in.tftpd
    server_args     = -s /tftpboot
    disable         = no
    per_source      = 11
    cps             = 100 2
    flags           = IPv4
}

4. tftpd에서 사용될 폴더를 만들고 설정을 적용하기 위해 아래 명령을 수행한다.
$ sudo mkdir /tftpboot
$ sudo chmod 777 /tftpboot
$ sudo /etc/init.d/xinetd restart

5. 위와같이 수행했을때 문제는 딱히  발생하지 않았다. 이제 ./petalinux-v2017.3-final-installer.run를 다시 실행한다.
$ ./petalinux-v2017.3-final-installer.run /opt/xilinx/petalinux_2017_03
$ source /opt/xilinx/petalinux_2016_04/settings.sh

6. zcu102보드의 설정을 맞추가 위해 아래와 같이 실행한다.
$ petalinux-create -t project -s ./xilinx-zcu102-zu9-es2-rev1.0-v2016.4-final1.bsp
실행이 완료되면 현재 폴더에 xilinx-zcu102-2017.3폴더가 생성된다.
주의할점은 bsp파일의 버전과 petalinux 버전이 동일한게 좋게 아니면 petalinux에서 해당 bsp파일이 지원되는가 확인해 봐야 한다.

특정 프로젝트 명을 가지고 싶으면 -n옵션을 사용하면 된다.
petalinux-create -t project -n [프로젝트이름] --template zynq


$ petalinux-create -t project -n myZynq --template zynq

7. Build를 해보겠다.
$ petalinux-build
빌드가 끝나면 build, images 폴더가 생성되고 images폴더에 사용할 이미지들이 무지 많다. 

VITIS Git + Doxygen Config

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