7/06/2015

Sitara (AM437x/AM335x) Linux SDK 설치후 환경설정 및 BUILD

1. How To build Linux SDK

기본 Makefile 아래와 같으며, Makefile과 Rules.make를 확인하면 환경변수와 모듈 Make방법을 알수있다.

  http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Getting_Started_Guide

1.1 Makefile 수정  

  • 설정이유 

처음에는 잘 빌드가 되지만, Kernel과 U-BOOT를 Config를 수정한다고 하면, 
Main Makefile에서 빌드를 하면 원래 초기 설정값으로만 된다. 

물론 이를 하기전에 TI에서 권고한 setup.sh를 이용하여 설정을 기본으로 해 놓아야 겠다.

  • AM335x Rule.make
$ cd ~/am335x/ti-processor-sdk-linux-am335x-evm-03.02.00.05
$ vi Rules.make  // 아래 설정 비교 및 수정 

#platform
PLATFORM=am335x-evm

#defconfig
DEFCONFIG=tisdk_am335x-evm_defconfig

#Architecture
ARCH=armv7-a

#u-boot machine
UBOOT_MACHINE=am335x_evm_config

#Points to the root of the TI SDK
export TI_SDK_PATH=/home/jhlee/am335x/ti-processor-sdk-linux-am335x-evm-03.02.00.05

#root of the target file system for installing applications
DESTDIR=/home/jhlee/am335x/ti-processor-sdk-linux-am335x-evm-03.02.00.05/targetNFS

#Points to the root of the Linux libraries and headers matching the
#demo file system.
export LINUX_DEVKIT_PATH=$(TI_SDK_PATH)/linux-devkit

#Cross compiler prefix
export CROSS_COMPILE=$(LINUX_DEVKIT_PATH)/sysroots/x86_64-arago-linux/usr/bin/arm-linux-gnueabihf-

#Default CC value to be used when cross compiling.  This is so that the
#GNU Make default of "cc" is not used to point to the host compiler
export CC=$(CROSS_COMPILE)gcc

#Location of environment-setup file
export ENV_SETUP=$(LINUX_DEVKIT_PATH)/environment-setup

#The directory that points to the SDK kernel source tree
LINUXKERNEL_INSTALL_DIR=$(TI_SDK_PATH)/board-support/linux-4.4.32+gitAUTOINC+adde2ca9f8-gadde2ca9f8

CFLAGS= -march=armv7-a -marm -mfpu=neon  -mfloat-abi=hard

#Strip modules when installing to conserve disk space
INSTALL_MOD_STRIP=1

SDK_PATH_TARGET=$(TI_SDK_PATH)/linux-devkit/sysroots/armv7ahf-neon-linux-gnueabi/

# Set EXEC_DIR to install example binaries
EXEC_DIR=/home/jhlee/am335x/ti-processor-sdk-linux-am335x-evm-03.02.00.05/targetNFS/home/root/am335x-evm

MAKE_JOBS=1



  • U-BOOT or KERNEL의 설정을 변경시 아래와 같이 변경 
최초 빌드후 아래와 같이 설정한다.

$ vi Makefile  //본인이 원하는 곳만 수정해서 쓰자 
# Kernel build targets
linux: linux-dtbs
        @echo =================================
        @echo     Building the Linux Kernel
        @echo =================================
#        $(MAKE) -C $(LINUXKERNEL_INSTALL_DIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) $(DEFCONFIG)                       // Kernel config 설정 
        $(MAKE) -j $(MAKE_JOBS) -C $(LINUXKERNEL_INSTALL_DIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) zImage
        $(MAKE) -j $(MAKE_JOBS) -C $(LINUXKERNEL_INSTALL_DIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules

linux_install: linux-dtbs_install
        @echo ===================================
        @echo     Installing the Linux Kernel
        @echo ===================================
        @if [ ! -d $(DESTDIR) ] ; then \
                echo "The extracted target filesystem directory doesn't exist."; \
                echo "Please run setup.sh in the SDK's root directory and then try again."; \
                exit 1; \
        fi
        install -d $(DESTDIR)/boot
        install $(LINUXKERNEL_INSTALL_DIR)/arch/arm/boot/zImage $(DESTDIR)/boot
        install $(LINUXKERNEL_INSTALL_DIR)/vmlinux $(DESTDIR)/boot
        install $(LINUXKERNEL_INSTALL_DIR)/System.map $(DESTDIR)/boot
        $(MAKE) -C $(LINUXKERNEL_INSTALL_DIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) INSTALL_MOD_PATH=$(DESTDIR) INSTALL_MOD_STRIP=$(INSTALL_MOD_STRIP) modules_install
.....

linux-dtbs_install:
        @echo =======================================
        @echo     Installing the Linux Kernel DTBs
        @echo =======================================
        @if [ ! -d $(DESTDIR) ] ; then \
                echo "The extracted target filesystem directory doesn't exist."; \
                echo "Please run setup.sh in the SDK's root directory and then try again."; \
                exit 1; \
        fi
        install -d $(DESTDIR)/boot
        @cp -f $(LINUXKERNEL_INSTALL_DIR)/arch/arm/boot/dts/*.dtb $(DESTDIR)/boot/

# Kernel DTB build targets
linux-dtbs:
        @echo =====================================
        @echo     Building the Linux Kernel DTBs
        @echo =====================================
#        $(MAKE) -C $(LINUXKERNEL_INSTALL_DIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) $(DEFCONFIG)                                   // Kernel config 설정  
        $(MAKE) -j $(MAKE_JOBS) -C $(LINUXKERNEL_INSTALL_DIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) am335x-evm.dtb am335x-evmsk.dtb am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb am335x-icev2.dtb am335x-boneblack-iot-cape.dtb

# u-boot build targets
u-boot-spl: u-boot
u-boot-spl_clean: u-boot_clean
u-boot-spl_install: u-boot_install

u-boot: linux-dtbs
        @echo ===================================
        @echo    Building U-boot
        @echo ===================================
#       $(MAKE) -j $(MAKE_JOBS) -C $(TI_SDK_PATH)/board-support/u-boot-* CROSS_COMPILE=$(CROSS_COMPILE) $(UBOOT_MACHINE)                   // uboot config 설정 
        $(MAKE) -j $(MAKE_JOBS) -C $(TI_SDK_PATH)/board-support/u-boot-* CROSS_COMPILE=$(CROSS_COMPILE) DTC=$(LINUXKERNEL_INSTALL_DIR)/scripts/dtc/dtc

....


  • backup board-support 
$ cd board-support
$ mkdir backup 
$ cp -a u-boot-* backup/
$ cp -a linux-* backup/
$ cp -a prebuilt-images backup/

  • change linux config
$ cd board-support/linux*
$ make ARCH=arm menuconfig // 설정변경 
$ cd ../..
$ make linux
$ sudo make linux_install 

  • change u-boot config
$ cd board-support/u-boot*
$ make ARCH=arm menuconfig // 설정변경 
$ cd ../..
$ make u-boot-spl


위와 같이 설정 한 후 board-support에서 직접 설정을 하고 빌드를 하자.

2. How To Build SDK 

  http://processors.wiki.ti.com/index.php/AM335x_Starter_Kit


2.1 기본 빌드 

$ make all         // rebuilds all components in the SDK 전체 모듈 빌드 , example-applications, modules, 
$ make linux       // configures and builds the kernel     KERNEL만 빌드  
$ make linux_install // kernel 과 module , dtb 를  filesystem 에 저장 
$ make u-boot-spl  // builds u-boot and u-boot-spl         Boot Loader 빌드 , 내가 설정한  config는 적용되지가 않는다.(주의) 
 

위와 같이 빌드를 하면 board-support 의 uboot 및 kernel 빌드된 것을 기본설정으로 확인가능하다.

Makefile 파일을 보면, u-boot-spl은 u-boot을 포함을하고, MLO을 생성을 하고,
linux-dtbs (device tree) 관련부분도 설정을 하지만, UBOOT_MACHINE으로 매번보드를 설정하기에, 여기서 빌드를 하면, Config 수정된것이 적용이 되지 않는다.

** 적용하고 싶다면, UBOOT_MACHINE 부분을 막거나, 직접 빌드하자.


2.2 How To make SD Disk Image

현재 SD Image를 만들기 위해서 Virtual Box의 SD Disk 용  VDI를 추가하여 넣는다.
가장 일반적인 방법이며, 사용하기도 쉽다.

  • Virtual Box SD DISK-VDI 추가 및 관리 
  http://ahyuo79.blogspot.com/2013/12/virtual-box-ubuntu-1204.html
  SD-DISK VDI방식으로 하는것이 편하여, 아래와 같이 Image로 함.

  • SD DISK VDI에 SD-Boot Image 만들기 
아래의 링크를 참조하지만, script가 보니, 계속 진화중이다.
본인도 처음 이 Version 이었지만, 도중 변경이 되어 script 의 제시하는 내용을 자세히 보자.
  http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_create_SD_card_script

  SD script Q&A
  https://e2e.ti.com/support/embedded/linux/f/354/t/221602


$ sudo /bin/create-sdcard.sh

//1. /dev/sdx  device 선택  ( size를 보면 대충 짐작이 갈것이다)

#  major   minor    size   name 
1:   8       16   31457280 sdb
2:   8       32   31457280 sdc
3:   8       48    4194304 sdd  **
Enter Device Number or n to exit: 

//2. 이 기반으로 Partitions을 만들며, 2개로 진행하면 쉽게 Image를 만든다. 

//2-1 Partion 2개 선택시 아래와 같이 진행된다.  pre-built 만듦 (board-support/prebuilt-images 에서 찾아 만들게 됨)
################################################################################

 Choose file path to install from

 1 ) Install pre-built images from SDK
 2 ) Enter in custom boot and rootfs file paths

################################################################################
  
//2-2. Partition 3개로 했을 경우 아래와 같이 파일을 찾으며, 이거 기준으로 각각 Partition 별로 만든다. 
Enter path where SD card tarballs were downloaded : 
- boot_partition.tar.gz
- rootfs_partition.tar.gz
- start_here_partition.tar.gz
 


// 진행사항은 아래의 링크를 참조 


  • /dev/sdx에 만들어진 것을 Image로 추출 
아래와 같이 /dev/sdx image를 추출을 한다 본인의 /dev/sdx를 변경

$ cd /media/sf_SHARED
$ sudo cat /dev/sdc > sdcard.img  or  $ sudo dd if=/dev/sdc of=./sdcard.img

  Image를 가지고 Window에서 Win32DiskImager.exe 로 Write 하기


  • Win32DiskImager.exe 사용법
  http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Creating_a_SD_Card_with_Windows



2.3 AM335x

현재 사용중은 EVM-SK이며, Start Kit 이지만, 배포된 SDK는 보통 EVM기준으로 배포하는 것 같다.

아래와 같이 지원이 되며, Linux 도 다시 들어가면, 또 나누어진다.

  • Linux : 현재 확인중     
  • Android : 지원되는 것을 확인하였다. 
  • StarterWare: No-OS version 이라고 하며, free package라는데, 아직 사용해보지 못했다.

  http://processors.wiki.ti.com/index.php/AM335x_Starter_Kit

  StarterWare 인경우 위와 다르게 Flashing 하는 것 같다.
  http://processors.wiki.ti.com/index.php/AM335X_StarterWare_Booting_And_Flashing

아래 Version Linux SDK를 설치 할 경우이며, 기본사항들을 살펴보자.
  • prebuilt-Images 확인 
  1. MLO-am335x-evm :  MLO인 경우 EVM으로 구성됨 현재 TI가 AM335x를 기본 EVM은 2가지 Type
  2. u-boot-am335x-evm: 역시 위와 동일
  3. zImage-am335x-evm: 기본 EVM이며, dtb 파일을 포함하고 있을 것이며, 압축되어있다.
$ cd ~/am335x/ti-processor-sdk-linux-am335x-evm-03.02.00.05
$ cd board-support
$ cd prebuilt-images
$ ls
MLO-am335x-evm   am335x-boneblack-iot-cape.dtb  am335x-bonegreen.dtb  am335x-evmsk.dtb  u-boot-am335x-evm.img      zImage-am335x-evm.bin
am335x-bone.dtb  am335x-boneblack.dtb           am335x-evm.dtb        am335x-icev2.dtb  u-boot-spl.bin-am335x-evm


  • MLO 설정 확인 및 U-Boot 설정확인
이미 상위에서 make all로 전체 빌드를 한 상황이며, 설정만 확인하자.

$ cd ~/am335x/ti-processor-sdk-linux-am335x-evm-03.02.00.05
$ cd board-support/u-boot*
$ ls include/configs   // board-config 지원확인
$ vi .config           // 현재 설정된 board board config 확인  
$ make ARCH=arm menuconfig 


  http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User's_Guide
  http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User's_Guide