수정일 : 2015 년 1 월 16 일 TUNA Board Tutorial
Outline 툴체인설치및환경설정 U-Boot 빌드 Linux 커널빌드 뉴메모리에뮬레이션테스트 Android 빌드 2
툴체인설치및환경설정 3
Xilinx Toolchain 다운로드 http://www.wiki.xilinx.com/install+xilinx+tools 에서툴체인다운로드 Download 4
Xilinx Toolchain 설치 툴체인설치 5
Xilinx Toolchain 설치 6
Xilinx Toolchain 설치 7
Xilinx Toolchain 환경설정 크로스컴파일환경설정 $ export CROSS_COMPILE=arm-xilinx-linux-gnueabi- $ source /opt/xilinx/sdk/2014.4 settings64.sh 설치한 toolchain에따라경로는다를수있음 ex) Xiline ISE toolchain 사용시 $ source /opt/xilinx/14.7/ise_ds/settings32(64).sh 8
부트파일빌드 9
소스코드다운로드 Git 을이용하여소스코드다운로드 U-boot : $ git clone git://git.xilinx.com/u-boot-xlnx.git Linux Kernel : $ git clone git://git.xilinx.com/linux-xlnx.git <U-boot> <Linux Kernel> 10
U-Boot 빌드 To build U-Boot for zc702/zc706 execute: $ make zynq_zc70x_config $ make 완료 U-boot 이미지 11
U-Boot 이미지생성 mkimage command not found U-boot image will not be built $ apt-get install uboot-mkimage 12
BOOT.bin 파일생성 BOOT.bin 파일생성시필요한파일 FSBL.elf 파일 (First Step Boot Loader) $ wget http://dmclab.hanyang.ac.kr/wikidata/download/fsbl.elf system_top.bit 파일 ( 비트스트림 ) $ wget http://dmclab.hanyang.ac.kr/wikidata/download/system_top.bit u-boot.elf 파일 (u-boot) u-boot 파일의이름을 u-boot.elf 로변경 BOOT.bin 파일생성 bootimage.bif 파일생성 $ bootgen -image bootimage.bif -w on -o i BOOT.bin 13
Linux 커널빌드 14
리눅스커널이미지생성 리눅스커널 Configuration $ make ARCH=arm xilinx_zynq_defconfig $ make ARCH=arm menuconfig 리눅스커널빌드 $ make ARCH=arm UIMAGE_LOADADDR=0x8000 uimage 15
리눅스커널이미지생성 arch/arm/boot 디렉토리에 uimage 생성 16
Device Tree Blob 생성 리눅스커널 arch/arm/boot/dts 에 zynq-zc706.dts 파일이존재 메모리크기조절 Device Tree 생성 $ make ARCH=arm zynq-zc706.dtb arch/arm/boot/dts 에 zynq-zc706.dtb 파일생성 17
램디스크이미지생성 램디스크이미지다운로드 $ wget http://www.wiki.xilinx.com/file/view/arm_ramdisk.image.gz 419243558/arm_ramdisk_image.gz 램디스크이미지생성 $ mkimage -A arm -T ramdisk -C gzip -d arm_ramdisk.image.gz uramdisk.image.gz 18
부트파일복사 microsd에부팅에필요한파일들을복사 BOOT.bin uimage uramdisk.image.gz devicetree.dtb 복사가완료된 microsd 를 TUNA 보드에삽입 19
터미널설정 20
터미널장치드라이버설치 윈도우에서가상머신사용시 호스트 OS에 USB-to-UART 드라이버 (CP210x_VCP) 설치 다운로드 : http://www.silabs.com/products/mcu/pages/usbtouartbridgevcpdrivers.aspx 21
드라이버설치확인 가상머신에 USB 연결후, /dev/ttyusb0 확인 22
터미널환경설정 Minicom 환경설정 $ apt-get install minicom $ minicom s Serial port setup 23
터미널실행 저장후 minicom 실행 24
뉴메모리에뮬레이션테스트 25
TUNA 보드 Latency 조절기능 TUNA 보드 2GB의 PL-DRAM 영역에대하여 read/write latency 조절가능 메모리입출력에지연부가 read/write 각각 16단계 (0~15) 의 latency level 제공 각 latency 레벨에따른 latency 차이는 RTL 수정을통해가능 Default setting read latency offset = 50ns write latency offset =100ns RTL 은 bit-stream 파일로제공 26
TUNA Board 에서 NVRAM Latency 조절방법 Git 에서 NVRAM Latency 를조절하는소스코드다운로드 $ git clone https://github.com/esos-lab/heapo.git HEAPO_ARM_3.15 디렉토리에 latency_controller.c 확인 latency_controller 빌드 $ export CROSS_COMPILE=arm-xilinx-linux-gnueabi- $ source /opt/xilinx/sdk/2014.4/settings64.sh $ arm-xilinx-linux-gnueabi-gcc -o latency_controller latency_controller.c latency_controller 사용법 latency 실행파일을 TUNA보드에서실행 latency_controller [READ LATENCY] [WRITE LATENCY] 0~15 사이의정수값을인자로입력 사용예 ) 현재는재변경시 reboot 필요 27
memtest 모듈 : Read 및 Write Test memtest 모듈 linux kernel 모듈의모듈초기화코드에서 latency 측정 PL-DRAM영역을디바이스메모리로접근 ioremap_nocache() 를이용하여메모리매핑설정후입출력시간측정 ARM PMU(Performance Monitoring Unit) 를이용해시간측정 memtest 모듈환경설정 dts 설정에서메모리영역은 0x0 ~ 0x40000000 으로설정 memtest 모듈빌드 Makefile 의커널소스경로및크로스컴파일러경로설정후, make 로빌드 $ wget http://dmclab.hanyang.ac.kr/wikidata/download/memtest.tar $ tar xvf memtest.tar $ vi Makefile $ make 28
memtest 모듈실행 memtest 모듈실행 TUNA 보드에서 memtest.ko 모듈로드 zynq> insmod memtest.ko 테스트항목 단일 load/store 인스트럭션수행시간 : 각 10회씩수행 ldrb/strb: 1-byte load/store ldrh/strh: 2-byte load/store ldr/str: 4-byte load/store 32-byte( 캐시라인단위 ) load/store: 8 X (ldr/str) stride size 변화에따른 latency 측정 stride size: 4byte ~ 16Kbyte loop 횟수 : 1,000,000 29
HEAPO 를이용한 read latency 측정 HEAPO 뉴메모리사업단에서개발한 persistent heap layer TUNA Ported-HEAPO PL-DRAM 영역 (0x40000000~0xC0000000) 을 ZONE_NVRAM으로지정 HEAPO를이용한모든메모리할당은 PL-DRAM에할당 30
HEAPO 커널빌드 HEAPO Download git clone https://github.com/esos-lab/heapo.git ARM버전의 HEAPO 리눅스커널빌드 $ cd HEAPO/HEAPO_ARM_3.15/linux-xlnx $ make ARCH=arm UIMAGE_LOADADDR=0x8000 uimage arch/arm/boot/ 에 uimage 생성 라이브러리빌드 $ cd HEAPO/HEAPO_ARM/Library make./install.sh microsd 의커널이미지교체 31
HEAPO-based Read Latency 측정 구현 HEAPO library를이용하여구현 (HEAPO 필요 ) ARM PMU(Performance Monitoring Unit) 를이용해시간측정 다운로드 $ wget http://dmclab.hanyang.ac.kr/wikidata/download/read_test.tar.gz $ tar xvf read_test.tar.gz 빌드 $ arm-xilinx-linux-gnueabi-gcc -O0 -mtune=cortex-a9 -o Read_test static Read_test.c v7_pmu.s -L../../HEAPO/HEAPO_ARM_3.15/Library/ -lpos 실행사용 $ cd mnt $ insmod user.ko user mode pmu 활성화 $./Read_test 32
Android 빌드 33
준비 안드로이드부팅에필요한파일 BOOT.bin uimage devicetree.dtb uramdisk.image.gz init.sh $ wget http://dmclab.hanyang.ac.kr/wikidata/download/android/uramdisk.image.gz $ wget http://dmclab.hanyang.ac.kr/wikidata/download/android/init.sh root_fs.tar.gz $ wget http://dmclab.hanyang.ac.kr/wikidata/download/android/root_fs.tar.gz 34
microsd 파티션설정 Android 파티션 Boot partition: FAT32, boot files Root partition: EXT4, Android root file system Storage partition: EXT4, external storage 파티션설정 모든 microsd 파티션언마운트 fdisk 실행 (sdb가 microsd라고가정 ) $ fdisk /dev/sdb 기존파티션전부삭제 (d command) 35
Boot 파티션생성 Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p Partition number (1 4, default 1): Using default value 1 First sector (2048 15523839, default 2048): Using default value 2048 Last sector, +sectors or +size{k,m,g} (2048 15523839, default 15523839): +1G Command (m for help): t Selected partition 1 Hex code (type L to list codes): c Changed system type of partition 1 to c (W95 FAT32 (LBA)) 36
Root 파티션생성 Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): Using default response p Partition number (1 4, default 2): Using default value 2 First sector (2099200 15523839, default 2099200): Using default value 2099200 Last sector, +sectors or +size{k,m,g} (2099200 15523839, default 15523839): +4G Command (m for help): t Partition number (1 4): 2 Hex code (type L to list codes): 83 37
External Storage 파티션생성 Command (m for help): n Partition type: p primary (2 primary, 0 extended, 2 free) e extended Select (default p): Using default response p Partition number (1 4, default 3): Using default value 3 First sector (10487808 15523839, default 10487808): Using default value 10487808 Last sector, +sectors or +size{k,m,g} (10487808 15523839, default 15523839): Using default value 15523839 Command (m for help): t Partition number (1 4): 3 Hex code (type L to list codes): 83 38
파티션생성확인및저장 Command (m for help): v Partition 1: previous sectors 2099199 disagrees with total 2098565 Partition 2: previous sectors 10487807 disagrees with total 10476633 Partitions 3: cylinder 967 greater than maximum 966 Partition 3: previous sectors 15523839 disagrees with total 15521165 Remaining 2047 unallocated 512 byte sectors Command (m for help): w The partition table has been altered! Calling ioctl() to re read partition table. WARNING: Re reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) WARNING: If you have created or modified any DOS 6.x partitions, please see the fdisk manual page for additional information. Syncing disks. 39
파티션포맷 $ partprobe /dev/sdb $ mkfs.vfat F 32 n boot /dev/sdb1 $ mkfs.ext4 L root /dev/sdb2 $ mkfs.ext4 L root /dev/sdb3 40
Android 용커널빌드 소스다운 $ git clone git://git.iveia.com/xilinx2/android/kernel/zynq.git 빌드환경설정및커널빌드 $ cd zynq $ export PATH=/opt/Xilinx/14.7/ISE_DS/EDK/gnu/arm/l in/bin:$path $ export ARCH=arm $ export CROSS_COMPILE=arm xilinx linux gnueabi $ make xilinx_zynq_android_defconfig $ make uimage modules UIMAGE_LOADADDR=0x8000 41
Device Tree 수정 /arch/arm/boot/dts/zynq-zc706.dts 파일수정 qspi0: spi@e000d000 섹션에 status = disabled ; 추가... qspi0: spi@e000d000 { compatible = "xlnx,ps7 qspi 1.00.a"; status = "disabled"; reg = <0xE000D000 0x1000>; interrupts = <0 19 4>; interrupt parent = <&gic>; speed hz = <200000000>; bus num = <1>;... 42
Device Tree Blob 생성 $ scripts/dtc/dtc I dts O dtb o devicetree.dtb \ arch/arm/boot/dts/zynq zc706.dts 43
Android 소스다운 $ curl https://dl ssl.google.com/dl/googlesource/git repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo $ mkdir p ~/scm/android $ cd ~/scm/android $ repo init u git://git.iveia.com/xilinx2/android/ platform/manifest.git b zynq android 2.0 $ repo sync $ repo forall c git checkout aosp/aosp/master 44
Android Build 환경설정 패키지설치및라이브러리경로설정 $ sudo apt get install git gnupg flex bison gperf build essential \ zip curl libc6 dev libncurses5 dev:i386 x11proto core dev \ libx11 dev:i386 libreadline6 dev:i386 libgl1 mesa glx:i386 \ libgl1 mesa dev g++ multilib mingw32 tofrodos \ python markdown libxml2 utils xsltproc zlib1g dev:i386 \ libswitch perl $ sudo ln s /usr/lib/i386 linux gnu/mesa/libgl.so.1 /usr/lib/i386 linux gnu/libgl.so 45
Oracle JDK6 다운로드 http://www.oracle.com/technetwork/java/javase/downloads/javaarchive-downloads-javase6-419409.html#jdk-6u45-oth-jpr 46
JDK 설치 Oracle JDK6 설치 $ chmod +x jdk 6u45 linux * $ mkdir /usr/lib/jvm $ cp jdk 6u45 linux x64.bin /usr/lib/jvm/ $ cd /usr/lib/jvm/ $./jdk 6u45 linux x64.bin 환경설정 $ update alternatives install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.6.0_45/bin/java" 1 $ update alternatives install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.6.0_45/bin/javac" 1 $ update alternatives install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.6.0_45/bin/javaws" 1 $ update alternatives config java $ update alternatives config javac $ update alternatives config javaws 47
Android 빌드 $. build/envsetup.sh $ lunch full eng $ make j<n> 48
Makefile.zynq 생성 Makefile.zynq 을다음과같이편집 OUT_DIR:=out/target/product/generic ROOT_IMG:=root.img ROOTFS:=rootfs ROOT_DIRS=lib/modules tmp media mnt sdcard.phony: dummy $(ROOT_IMG): dummy rm rf $@ sudo rm rf $(ROOTFS) cp r $(OUT_DIR)/root $(ROOTFS) cp r $(OUT_DIR)/system $(ROOTFS) cd $(ROOTFS) && mkdir p $(ROOT_DIRS) sudo chown R root:root $(ROOTFS) sudo genext2fs d $(ROOTFS) b $$((250*1024)) m 0 N $$((64*1024)) $(ROOT_IMG) sudo chown $(shell id u):$(shell id g) $(ROOT_IMG) # Phony target forces the rootfs image file to be rebuilt on each make dummy: 49
root.img 파일생성 genext2fs 설치 $ sudo apt get install genext2fs root.img 생성 $ make f Makefile.zynq root.img 마운트및복사 $ mkdir tmp1 $ mkdir tmp2 $ sudo mount t ext4 /dev/sdb2 tmp2 $ sudo mount o loop root.img tmp $ sudo cp r tmp1/* tmp2/ 50
ramdisk 생성 ramdisk.image 다운로드 $ wget http://dmclab.hanyang.ac.kr/wikidata/download/android/ramdisk.image ramdisk.image 마운트및수정 $ sudo mount o loop ramdisk.image tmp umount 및 uramdisk.image.gz 생성 $ sudo umount tmp $ gzip ramdisk.image $ mkimage A arm T ramdisk C gzip d ramdisk.image.gz uramdisk.image.gz 51
부팅 microsd의 boot파티션에다음파일적재 BOOT.bin: 리눅스부팅에사용한것과동일 uimage: Android용 linux kernel image devicetree.dtb: 수정된 device tree 파일 uramdisk.image.gz init.sh microsd 의 android root partition 에 root file system 생성 52
Reference http://www.wiki.xilinx.com/build+kernel http://www.wiki.xilinx.com/building+android+bsp+on+zc702 http://www.wiki.xilinx.com/android+4.2.2+on+zynq+getting+started+ Guide http://www.wiki.xilinx.com/building+android+4.2.2+bsp+on+zc702 http://www.wiki.xilinx.com/build+and+modify+a+rootfs 53