참고: Freescale은 모토로라의 반도체 사업이 분사한 회사로, 얼마전에 NXP(네덜란드 필립스의 부품 사업에서 분사한 회사)로 인수/합병되었으나, 최근 다시 NXP가 Qualcomm에 인수/합병된 상태임.
Freescale i.MX6를 기반으로 하는 SBC(single board computer)는 매우 많은 편인데, 필자가 검토(?)만 했다가 가격이나 구매에 어려움이 있어 포기한 제품을 열거해 보면 다음과 같다.
a) Hummingboard-gate
b) Wandboard
c) OpenRex
d) NXP MCIMX6Q-SL SABRE Lite Development Kit
e) LeMaker Piano
...
<목차>
1. RIoT Board 소개
2. Source Build 절차 소개
3. 부팅하기(eMMC, NFS booting)
4. BuildRoot for RIoT board
5. Yocto Project for RIoT board
1. RIoT Board 소개
RIoT board를 한마디로 표현해 보기 위해, riotboard.org에 소개된 원문을 그대로 옮겨 보았다(여러가지 미사여구를 사용하여 설명하는 것 보다는 이것이 좀 더 확실해 보이기 때문임).
"The RIoTboard is an open source platform based on an ARM® Cortex®-A9 processor. The RIoTboard is an evaluation platform featuring the powerful i.MX 6Solo, a multimedia application processor with ARM Cortex-A9 core at 1 GHz from NXP Semiconductors. The platform helps evaluate the rich set of peripherals and includes a 10/100/Gb Ethernet port, HDMI v1.4, LVDS, analog headphone/microphone, uSD and SD card interface, USB, serial port, JTAG, camera interface, GPIO boot configuration interface, and expansion port."
그림 1.1 RIoT board
RIoT board 관련 자세한 사항은 아래 site(element14 & embest)를 참조하기 바란다. 아래 web page 내용으로 봐서는 Project 자체는 좀 오래된 느낌이고, 개발 community가 제대로 활성화되지 못한 느낌이다. 하지만 freescale community 및 github가 활성화되어 있는 만큼 사용하는데는 전혀 무리가 없어 보인다.
1) http://www.embest-tech.com/shop/star/riotboard.html
2) https://www.element14.com/community/community/designcenter/single-board-computers/riotboard
그림 1.2 RIoT board block diagram
그림 1.3 RIoT board top view
그림 1.4 i.MX 6Solo block diagram
참고) RIoT board & i.MX 6Solo 관련 보다 구체적인 사항은 추후 별도의 blog로 정리해 보도록 하겠다.
2. Source Build 절차 소개
이번 절에서는 manual 방식으로 toolchain, u-boot, linux kernel source를 일일이 내려 받아, 개별적으로 build하는 절차를 소개해 보고자 한다.
<Toolchain download>
$ git clone git://github.com/embest-tech/fsl-linaro-toolchain.git
=> freescale linaro toolchain을 내려 받는다.
=> 받은 위치는 ~/IoT/RIoTBoard/embest/toolchain 이 되겠다.
<U-boot & linux kernel source download>
https://www.dropbox.com/sh/7nplywnxtoabfno/AABSkTD9yNvkzPboHVR4DZzma?dl=0
=> 여기서 source code file을 직접 dowload 받는다.
=> 2 ~ 3년 전쯤에 작업이되어서 그런지, git or github으로 되어 있지 않고, 압축 파일 형태로 내려 받도록 되어 있다.
<U-boot build>
$ cd u-boot-imx/
$ vi Makefile
=> 2013.4 version 임
$ export ARM=arm
$ export CROSS_COMPILE=~/IoT/RIoTBoard/embest/toolchain/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-
$ make distclean
=> dist clean 한다(config 설정까지도 clear 시킨다).
$ make mx6solo_RIoTboard_config
=> let's see boards.cfg
$ make
=> 최종적으로 u-boot.imx 결과 파일이 생성됨.
=> u-boot.imx format은 나중에 다시 확인해 보기로 하자.
그림 2.1 u-boot build 모습
<kernel build>
$ export PATH=~/IoT/RIoTBoard/embest/u-boot-imx/tools:$PATH
=> tools/mkimage를 kernel build시 사용(uImage 생성 시)하기 위함임.
$ cd linux-imx/
$ vi Makefile
=> 3.10.17 version임
$ export ARCH=arm
$ export CROSS_COMPILE=~/IoT/RIoTBoard/embest/toolchain/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-
$ make imx_v7_defconfig
$ make menuconfig
그림 2.2 kernel menuconfig - Freescale i.MX
$ make uImage LOADADDR=0x10008000
=> arch/arm/boot/uImage 생성됨.
그림 2.3 kernel build 모습
$ make imx6solo_RIoTboard.dtb
=> arch/arm/boot/dts/imx6solo_RIoTboard.dtb 파일 생성
=> RIoT board용 dts file도 별도의 blog에서 정리하기로 하자.
3. 부팅하기(eMMC, NFS booting)
최초 보드를 개봉한 상태에서 bootloader(u-boot)의 version을 확인해 보니, 2009년도 version이다. 결과론이지만, bootloader를 교체하지 않은 상태로 NFS booting을 시도해 보았으나, kernel이 구동되지 않는 문제가 발생하였다. 아무래도 bootloader와 kernel이 궁합이 맞지 않는 듯 보인다(uImage를 생성하는 방식에 문제가 있나 ?). 따라서 NFS booting을 시도하기 전에 먼저, RIoT board에서 제공(정확히는 Freescale에서 제공)하는 Mfgtool을 이용하여, eMMC image를 2절에서 build한 내용으로 교체해 보도록 하겠다.
참고) RIoT board에는 eMMC가 기본으로 장착되어 있고, microSD & SD card를 추가할 수 있다. 물론, microSD & SD card로 부팅이 가능하도록 되어 있다.
3.1 Mfgtool을 사용하여 eMMC 이미지 교체하기
먼저 아래 site에서 Mfgtool을 내려 받는다. File의 크기가 1.0GB(실제 mfgtool의 크기가 얼마 안되지만, image용 binary가 포함되어 있어 크기가 매우 큼)이므로 download 시간이 매우 올래 걸릴 수 있으니, 주의하기 바란다.
<Ubuntu 16.04 PC>
$ uzip tools_SVN2652.zip=> 위에서 내려 받은 파일의 압축을 푼다.
$ ls -l
합계 172336
drwxrwxr-x 3 chyi chyi 4096 9월 11 2014 tools_SVN2487
drwxrwxr-x 3 chyi chyi 4096 9월 11 2014 tools_SVN2652
$ cd tools_SVN2652
=> 위의 두개 모두 사용 가능한 듯 보이나, 숫자가 큰 놈을 선택해 본다.
$ cd Mfgtools-Rel-4.1.0_130816_MX6DL_UPDATER
$ vi cfg.ini
=> name 항목의 값을 아래 그림 3.1과 같이 i.MX6SOLO-yocto-RIoTboard-eMMC로 수정한다.
=> 참고로, SD booting을 하고자 한다면, i.MX6SOLO-yocto-RIoTboard-SD를 입력해 주어야 한다.
그림 3.1 Mfgtool cfg.ini 수정
$ cd profiles/MX6DL Linux Update/OS Firmware/files
=> 이 디렉토리 아래에 2절에서 build하여 얻은 u-boot.imx, uImage, imx6solo_RIoTboard.dtb 파일 등을 복사하도록 한다.
=> 그리고, rootfs(fsl-image-fb-riotboard.tar.bz2)는 일단 zip file에 포함되어 있던 것을 그대로 사용해 보자.
$ ls -la
합계 154576
drwxrwxr-x 3 chyi chyi 4096 9월 11 2014 .
drwxrwxr-x 3 chyi chyi 4096 9월 11 2014 ..
drwxrwxr-x 2 chyi chyi 4096 9월 11 2014 android
-rw-rw-r-- 1 chyi chyi 107639993 7월 4 2014 fsl-image-fb-riotboard.tar.bz2
-rw-rw-r-- 1 chyi chyi 44359 1월 9 19:48 imx6solo_RIoTboard.dtb
-rw-rw-r-- 1 chyi chyi 38129513 10월 21 2013 imxdeb.tar.gz
-rw-rw-r-- 1 chyi chyi 159380 10월 21 2013 u-boot-mx6dl-arm2-lpddr2.bin
-rw-rw-r-- 1 chyi chyi 158764 10월 21 2013 u-boot-mx6dl-arm2.bin
-rw-rw-r-- 1 chyi chyi 184732 10월 21 2013 u-boot-mx6dl-nand.bin
-rw-rw-r-- 1 chyi chyi 171340 10월 21 2013 u-boot-mx6dl-sabreauto-nand.bin
-rw-rw-r-- 1 chyi chyi 161992 10월 21 2013 u-boot-mx6dl-sabreauto-spi-nor.bin
-rw-rw-r-- 1 chyi chyi 168388 10월 21 2013 u-boot-mx6dl-sabreauto-weimnor.bin
-rw-rw-r-- 1 chyi chyi 162280 10월 21 2013 u-boot-mx6dl-sabreauto.bin
-rw-rw-r-- 1 chyi chyi 431456 10월 21 2013 u-boot-mx6dl-sabresd.bin
-rw-rw-r-- 1 chyi chyi 160252 10월 21 2013 u-boot-mx6dl.bin
-rw-rw-r-- 1 chyi chyi 171172 10월 21 2013 u-boot-mx6solo-sabreauto-nand.bin
-rw-rw-r-- 1 chyi chyi 161808 10월 21 2013 u-boot-mx6solo-sabreauto-spi-nor.bin
-rw-rw-r-- 1 chyi chyi 168204 10월 21 2013 u-boot-mx6solo-sabreauto-weimnor.bin
-rw-rw-r-- 1 chyi chyi 162088 10월 21 2013 u-boot-mx6solo-sabreauto.bin
-rw-rw-r-- 1 chyi chyi 431272 10월 21 2013 u-boot-mx6solo-sabresd.bin
-rw-rw-r-- 1 chyi chyi 372196 1월 9 19:49 u-boot.imx
-rw-rw-r-- 1 chyi chyi 5461952 1월 9 19:47 uImage
-rw-rw-r-- 1 chyi chyi 3734820 10월 21 2013 uImage-nand
===============================================================
다시 최상위 디렉토리로 이동한 후, tools_SVN2652/ 디렉토리를 zip으로 묶어, Windows PC로 복사하도록 하자.
$ zip -r tools_SVN2652.zip ./tools_SVN2652
=> tools_SVN2652.zip 파일을 Windows PC로 복사한다.
<Windows 10 PC>
MfgTool2.exe(Windows) <-- USB cable --> RIoT board
USB cable을 이용하여 serial download가 가능하도록 하기 위해, Target board의 boot configuration switch(target board의 중앙에 위치)를 그림 3.2에서 그림 3.3과 같이 조정한다(주의: 전원을 끄고 해야 한다).
그림 3.2 boot configuration switch - eMMC booting mode(2, 5번만 OFF되어 있음)
그림 3.3 boot configuration switch 조정(serial download mode)
SVN2652.zip 파일의 압축을 풀고, MfgTool2.exe를 실행한다.
그림 3.4 MfgTool2.exe 실행
다음으로 Start 버튼을 선택하면, 그림 3.5와 같이 eMMC로 firmware image를 write하는 작업이 시작되게 될 것이다.
그림 3.5 eMMC write 작업 시작
어느 정도의 시간이 경과(대략 1분 정도)하면, eMMC writing이 완료하게 되는데, 이때는 Stop -> Exit 버튼을 차례로 선택하여 Mfgtool을 종료해 주면 된다.
그림 3.6 eMMC write 작업 종료(완료)
이제 마지막으로, 5V DC 전원을 끄고, 정상 booting을 위해 target board의 boot configuration switch를 원래(그림 3.2)대로 돌려 놓는다. 마침내, 모든 것이 완료되었다. 전원을 다시 인가해 보도록 하자. 아래 그림 3.7과 같이 kernel이 정상적으로 올려오면 성공이다.
그림 3.7 eMMC 정상 부팅 화면
그림 3.8 RIoT Board 동작 모습(5V DC, Serial cable, HDMI 연결)
3.2 NFS booting하기
자, 그럼 이제 부터는 개발시 보다 편리한 NFS booting을 시도해 보도록 하겠다.
NFS booting과 관련해서는 이미 이전 blog에서 여러 차례 소개한 바가 있으니, 아래 내용(2절)을 참고하기 바라며, 여기서는 필요한 내용만 간략히 정리하고 넘어가도록 하겠다.
<Target board>
U-Boot > setenv ethaddr 12:34:56:ab:cd:ff
=> ethernet port에 대해 MAC 주소를 지정한다.
U-Boot > setenv ipaddr 192.168.1.40
=> target board의 IP 주소를 설정한다.
U-Boot > setenv netmask 255.255.255.0
=> subnet mask를 설정한다.
U-Boot > setenv serverip 192.168.1.100
=> NFS server(Ubuntu Linux)의 IP 주소를 지정한다.
U-Boot > setenv rootpath /home/chyi/IoT/RIoTBoard/embest/rootfs
=> NFS rootfs path를 지정한다. 이 값은 /etc/exports에도 설정되어 있어야 함.
U-Boot > setenv nfsboot 'setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath}
ip=${ipaddr}:${serverip}::${netmask}::eth0:off console=ttymxc1,115200 nosmp; tftp 0x12000000 uImage; tftp 0x18000000 imx6solo_RIoTboard.dtb ; bootm 0x12000000 - 0x18000000'
=> console이 ttymxc0가 아니라, ttymxc1임에 주의
U-Boot > saveenv
=> 지금까지 변경한 내용을 저장(여기서는 eMMC 영역)한다.
U-Boot > run nfsboot
=> 이 상태에서 NFS booting을 시도해 보면, 아래 그림과 같이 정상적으로 부팅이 진행됨을 알 수 있다.
그림 3.9 NFS booting 모습
4. BuildRoot for RIoT board
RIoT board는 이미 BuildRoot에 적용되어 있다. 따라서 최신 buildroot source code를 내려 받은 후, build를 시도해 보도록 하자.
$ git clone git://git.buildroot.net/buildroot
=> 최신 buildroot source를 download한다.
$ make riotboard_defconfig
=> riotboard defconfig를 적용한다.
$ make menuconfig
그림 4.1 buildroot menuconfig
=> build를 진행한다.
<Output>
그림 4.2 buildroot build 결과물
자, 그럼 이 상태에서 NFS booting을 시도해 보도록 하자.
<Ubuntu 16.04 Host>
$ cd output/images
$ mkdir rootfs
$ sudo tar xvf ./rootfs.tar -C ./rootfs
$ vi /etc/exports
...
/home/chyi/IoT/RIoTBoard/buildroot/output/images/rootfs 192.168.1.*(rw,no_root_squash,sync,no_subtree_check)
~
$ sudo /etc/init.d/nfs-kernel-server restart
$ cp ./uImage /tftpboot
$ cp ./imx6dl-riotboard.dtb /tftpboot/imx6solo_RIoTboard.dtb
<Target board>
U-Boot > setenv rootpath /home/chyi/IoT/RIoTBoard/buildroot/output/images/rootfs
U-Boot > run nfsboot
그림 4.3 buildroot NFS booting 모습
5. Yocto Project for RIoT board
이번 절에서는 freescale's community yocto bsp web site 및 참고 문헌 [6]을 토대로, RIoT board를 위한 yocto build system을 소개해 보고자 한다.
$ cd ~/IoT/RIoTBoard
$ mkdir yocto; cd yocto
$ mkdir bin; cd bin/
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ./repo
=> freescale yocto project에서는 (특이하게도) android에서 source code를 내려 받기 위해 만든 repo를 활용하고 있다.
=> repo는 python으로 작성되어 있다.
$ chmod 755 repo
$ sudo cp repo /usr/local/bin/
$ cd ..
$ mkdir fsl-community-bsp
$ cd fsl-community-bsp/
$ repo init -u https://github.com/Freescale/fsl-community-bsp-platform -b krogoth
=> freescale의 경우는 poky version 중, 현재 krogoth(2.1 version)까지만 지원(2.2 morty는 아직 지원 안함)하고 있다.
$ repo sync
=> 앞서 dowload한 repo를 통해 yocto project code를 내려 받는다.
=> CPU의 성능을 감안하여 "repo sync -j8" 와 같이 option을 줄 수도 있다.
~/IoT/RIoTBoard/yocto/fsl-community-bsp$ ls -la
합계 52
drwxrwxr-x 6 chyi chyi 4096 12월 30 19:41 .
drwxrwxr-x 4 chyi chyi 4096 12월 30 19:10 ..
drwxrwxr-x 7 chyi chyi 4096 12월 30 19:12 .repo
-r--r--r-- 1 chyi chyi 2104 12월 30 19:12 README
-r-xr-xr-x 1 chyi chyi 7027 12월 30 19:12 setup-environment
drwxrwxr-x 10 chyi chyi 4096 1월 3 14:26 sources
~/IoT/RIoTBoard/yocto/fsl-community-bsp/sources$ ls -la
=> sources 디렉토리 내에는 그 동안 많이 보아왔던 poky & meta-fsl* 관련 내용이 보인다.
합계 40
drwxrwxr-x 10 chyi chyi 4096 1월 3 14:26 .
drwxrwxr-x 6 chyi chyi 4096 12월 30 19:41 ..
drwxrwxr-x 7 chyi chyi 4096 12월 30 19:12 Documentation
drwxrwxr-x 4 chyi chyi 4096 12월 30 19:12 base
drwxrwxr-x 20 chyi chyi 4096 12월 30 19:12 meta-fsl-arm
drwxrwxr-x 7 chyi chyi 4096 12월 30 19:12 meta-fsl-arm-extra
drwxrwxr-x 6 chyi chyi 4096 12월 30 19:12 meta-fsl-demos
drwxrwxr-x 18 chyi chyi 4096 12월 30 19:12 meta-openembedded
drwxrwxr-x 10 chyi chyi 4096 1월 3 14:26 meta-qt5
drwxrwxr-x 12 chyi chyi 4096 12월 30 19:12 poky
======================================================
$ ls -l */conf/machine
=> 여러 결과 중, riotboard 관련 machine name을 찾아 보도록 한다.
=> machine name을 찾는 이유는, freescale의 경우는 build 시 MACHINE name을 지정하고 있기 때문임(freescale 만의 독특한 방법).
..
-rw-rw-r-- 1 chyi chyi 416 12월 30 19:12 imx6dl-riotboard.conf
...
$ mkdir -p imx6dl-riotboard
$ MACHINE=imx6dl-riotboard source setup-environment imx6dl-riotboard
=> setup-environment(shell script)는 freescale에서 만든 것으로 oe-init-build-env에 대한 wrapper script에 불과함.
=> freescale의 경우는 특이하게도 EULA license를 확인하는 과정이 추가되어 있음.
Do you accept the EULA you just read? (y/n) y
EULA has been accepted.
Welcome to Freescale Community BSP
The Yocto Project has extensive documentation about OE including a
reference manual which can be found at:
http://yoctoproject.org/documentation
For more information about OpenEmbedded see their website:
http://www.openembedded.org/
You can now run 'bitbake <target>'
Common targets are:
core-image-minimal
meta-toolchain
meta-toolchain-sdk
adt-installer
meta-ide-support
Your build environment has been configured with:
MACHINE=imx6dl-riotboard
SDKMACHINE=i686
DISTRO=poky
EULA=
==============================================================
$ bitbake core-image-minimal
=> core image build를 시작한다. 역시 오래 걸림.
<Output>
5.1 RIoT board를 위한 yocto build 결과물
자, 다음 단계는 앞서 build한 결과물이 정상 동작되는지 NFS booting을 통해 확인해 볼 차례이다.
<Ubuntu 16.04 Host>
$ cd tmp/deploy/images/imx6dl-riotboard
$ mkdir rootfs
$ sudo mount -t ext4 -o loop ./core-image-minimal-imx6dl-riotboard.ext4 ./rootfs
=> ext4용 image를 rootfs 디렉토리로 mount한다. 이 디렉토리를 NFS rootfs 디렉토리로 사용할 예정임.
$ cp zImage /tftpboot/
$ cp zImage-imx6dl-riotboard.dtb /tftpboot/imx6solo_RIoTboard.dtb
=> yocto project에서는 uImage 대신 zImage를 기본으로 생성하고 있음.
<Target board>
U-Boot > setenv rootpath /home/chyi/IoT/RIoTBoard/yocto/fsl-community-bsp/imx6dl-riotboard/tmp/deploy/images/imx6dl-riotboard/rootfs
=> /etc/exports 파일도 수정해 주어야 한다.
U-Boot > setenv nfsboot 'setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}::${netmask}::eth0:off console=ttymxc1,115200 nosmp; tftp 0x12000000 zImage; tftp 0x18000000 imx6solo_RIoTboard.dtb ; bootz 0x12000000 - 0x18000000'
U-Boot > run nfsboot
5.2 RIoT board - Yocto booting 결과
RIoT board Yocto project 사용법과 관련해서는 아래 site에 보다 자세하게 설명되어 있으니, 참고해 보는 것도 좋을 듯 싶다.
이상으로 RIoT board를 간략히 소개하고, source code build & 구동 방법을 정리해 보았다.
References
1. RIoTboard-User-Manual-V2.1.pdf, riotboard.org
2. RIoTboard-Schematics-v.1.0.pdf, riotboard.org
3. Wiki-Intermediate-Flash a BSP image using MfgTool.pdf, riotboard.org
4. IMX-6Solo-Processor-Datasheet.pdf, Freescale Semiconductor, Inc.
5. IMX-6Solo-Processor-Reference-Manual.pdf, Freescale Semiconductor, Inc.
6. Embedded Linux Projects Using Yocto Project Cookbook, Alex Gonzalez, PACKT publishing.
Slowboot
감사합니다.
답글삭제같은 보드는 아니지만 정말 도움이 많이됩니다.
수고하세요.