회사에서 일이 많지 않다 보니, 가지고 놀 보드를 찾았다. TI의 AM43 Series와 DM8127이다.
기본적인 설정과 여러가지 일을 해볼 생각인데, 아직 미지수 이다.
시간이 나면 해볼 것이고, 매번 뭘 해야 할지 그게 고민이다.
일단 기본설정과 관련부분 및 관련 부분을 제대로 설정하고 난 후 생각을 해보자.
2. AM437x Sitrara의 CPU의 기본 정보들 (remove)
AM437x Processors
AM4379 | AM4378 | AM4377 | AM4376 | |
---|---|---|---|---|
ARM Cortex-A9 MHz (Max.) | 800/1000 | 800/1000 | 800/1000 | 300/800/1000 |
Graphics Acceleration | 3D graphics | 3D graphics | ||
PRU-ICSS for slave (Programmable real-time unit and industrial communication sub-system) * | PRU-ICSS + EtherCat® slave | PRU-ICSS | PRU-ICSS + EtherCat® slave | PRU-ICSS |
Package ** | 17x17 / 0.65mm | 17x17 / 0.65mm | 17x17 / 0.65mm | 17x17 / 0.65mm |
Software and pin-for-pin compatible across devices |
* PRU-ICSS is commonly used for slave industrial communication protocols such as PROFIBUS, PROFINET®, Powerlink, Ethernet/IP™ and EnDat
** Via Channel Array technology provides 0.8mm-pitch effective layout rules
현재 TI사이트에서 제공하는 SDK는 두 종류이며, LINUX SDK와 ISDK (Industrial SDK)이며
ISDK는 산업용으로, SYSBIOS, TI-RTOS를 기반으로 구축하여 PRU를 Control 한다.
현재 주 관심사 LINUX SDK 이 부분만 일단 이 부분만 기술한다.
자세한 내용은 아래 LINK 참조
- ISDK 관련 교육 LINK
- ISDK 관련 사이트
- Getting Started Guide
http://processors.wiki.ti.com/index.php/AM437x_SYSBIOS_Industrial_SDK_Getting_Started_Guide
- Release Note
http://processors.wiki.ti.com/index.php/AM437x_SYSBIOS_Industrial_SDK_02.00.00.02_Release_Notes
- User Guide
http://processors.wiki.ti.com/index.php/AM437x_SYSBIOS_Industrial_SDK_02.00.00.02_User_Guide
3. AM437x LINUX SDK 기본정보 (remove)
A. TI-사이트 구성
LINK: Sitara ALL EZSDK-LINUX SITE
LINK: AM437x SDK-LINUX SITE
TI 사이트 가면 구성이 아래와 같이 되어 있는데, 일단 Essentials 부터 설치하고,
나머지는 부가적으로 천천히 알아가자
- SDK Essentials (필요파일)
- SDK Optional Addons
- SDK SD Card Creation
- SDK Individual Components
- SDK Arago Source Tarball
- SDK Documentation
- 버전관리
SDK Essentials 의 최신파일 1.00.00.00 인데, 이전 파일이 8.0이다. (다른점은 processor 명칭이 추가되었다.)
- SDK 필요파일
- SDK 설치후 구성
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Directory_Structure
B. LINUX SDK의 개발환경구성
AM437x의 기본 개발환경은 CCS를 LINUX BASE사용하여 HW Debugging까지 지원을 하는 것 같다.
현재 이부분은 테스트를 해봐야함. WIDNOW Version은 어떻게 사용해야하는지 그것도 테스트 해야함.
setup.sh 관련 link: http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Setup_Script |
C. How To Install SDK
- 주의사항 ( Ubuntu OS 64bit일 경우 추가 Package 설치)
- SDK 설치
1. 필요파일(ti-processor-sdk-xxx)을 Terminal or SSH 에서 실행을 하자. (터미널 실행권장)
2. 설치 후, 안에 있는 sudo setup.sh 실행 하자.
3. 각각의 PATH 와 환경설정 하자 (BOOT설정)
4. Graphics_SDK_setuplinux_hardfp_5_01_01_02.bin 설치하자. (sdk 와 es9.x 만 선택)
- SDK 설치
$ chmod +x ./ti-processor-sdk-linux-am437x-evm-01.00.00.03-Linux-x86-Install.bin $ ./ti-processor-sdk-linux-am437x-evm-01.00.00.03-Linux-x86-Install.bin //Destination Dir 설정
*LINUX SDK 설치 관련사이트 http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Installer
- Setup 설치
$ sudo apt-get install xinetd tftpd nfs-kernel-server minicom build-essential libncurses5-dev uboot-mkimage autoconf automake
$ cd Destination Dir $ ./setup.sh
- Graphics_SDK 설치
$ ./Graphics_SDK_setuplinux_hardfp_5_01_01_02.bin
// Destination Folder 변경
// 기본적으로 sdk와 es9.x 만 필요할 것 같다.
http://processors.wiki.ti.com/index.php/Graphics_SDK_Quick_installation_and_user_guide
http://processors.wiki.ti.com/index.php/SGXDbg
* setup.sh 에서 nfs 및 tftp server 를 설치 및 설정 한 후, 동작확인
EVM Link
http://www.ti.com/tool/tmdxevm437x
http://www.ti.com/lit/ug/spruhw7/spruhw7.pdf
RAM: 4-Gb (512Mb × 8) of DDR3L SDRAM (MT41K512M8RH)
NAND: MT29F4G08AB, which is a 4-Gb (512M x 8) flash memory
D. How To Build SDK
D.1 기본 빌드
관련 환경변수는 Rules.make를 확인하고, Makefile을 확인하자
make all // rebuilds all components in the SDK make linux // configures and builds the kernel make u-boot-spl // builds u-boot and u-boot-spl
D.2 환경설정 (옵션)
Linux or U-Boot를 직접 소스에가서 설정하거나, 컴파일할때,
매번 ARCH와 CROSS_COMPILE 넣기 귀찮을때 아래와 같이 설정하자.
- source 명령사용 (source ./test.sh)
vi test.sh export ARCH=armv7-a export TI_SDK_PATH=/home/jhlee/am437x export LINUX_DEVKIT_PATH=${TI_SDK_PATH}/linux-devkit export CROSS_COMPILE=${LINUX_DEVKIT_PATH}/sysroots/i686-arago-linux/usr/bin/arm-linux-gnueabihf-
- profile에 원하는 환경변수값 변경 (ubuntu)
vi ~/.profile PATH=$PATH:/home/jhlee/am437x/linux-devkit/sysroots/i686-arago-linux/usr/bin
D.3 TI 기본 START Guide
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Getting_Started_Guide
4. AM437x EVM 환경설정 (remove)
A. EVM Link
http://www.ti.com/tool/tmdxevm437x
http://www.ti.com/lit/ug/spruhw7/spruhw7.pdf
B. Serial 설정
UART0
115200 bps, 8-bit, no parity, 1 stop bit and noflow control.
login: root
C. U-BOOT 환경설정
U-BOOT의 기본 Boot모드는 mmcboot와 usbboot 이며, 이를 network boot를 변경하기 위해 아래와 같이 변경한다.
- DHCP Server 사용하지 않는다면, 아래와 같이 설정
$ setenv ipaddr '192.168.1.101' $ setenv serverip '192.168.1.100' $ setenv netmask '255.255.255.0' $ setenv rootpath '/home/jhlee/am437x/targetNFS' $ setenv netargs 'setenv bootargs console=${console} ${optargs} root=/dev/nfs nfsroot=${serverip}:${rootpath},${nfsopts} rw ip=${ipaddr}' $ setenv netboot1 'echo Booting from network ...; setenv autoload no; tftp ${loadaddr} ${bootfile}; tftp ${fdtaddr} ${fdtfile}; run netargs; bootz ${loadaddr} - ${fdtaddr}' $ setenv bootcmd 'run findfdt; run netboot1;'
http://processors.wiki.ti.com/index.php/Booting_Linux_kernel_using_U-Boot
5. LINUX-BSP 구성
UBOOT와 DTB, 그리고 추후에 Kernel 및 Filesystem을 설명하겠다.
5.1 UBOOT
처음에 MLO , SPL 새로운 용어가 나와서 뭔가 했다. UBOOT-SPL은 MLO와 동일한 존재이며,
기존의 존재하던 UBL 혹 X-Loader의 기능과 동일하다. (NAND BOOT or SD BOOT일 경우 사용)
기능은 별다른 점은 없지만, SPL 소스가 U-BOOT 안에 존재하는 것이 달라졌다.
(아직 Dvflasher의 기능을 발견하지 못했다.)
- SD Card or NAND Boot 일경우
- ROM Bootloader, Initial Program Loader (IPL) or the Primary Program Loader (PPL).
- The binary for the Secondary Program Loader (SPL) or the MLO.
- The binary for U-Boot
- U-BOOT 소스
$ cd board-support/u-boot-2014.07-g7e537bf $ ls MLO : u-boot-spl.bin 의 최종 이미지 확인 확인 cat .MLO.cmd (동일한 존재) spl : SPL 관련소스 및 Image 파일 u-boot.img : U-BOOT bin 최종 파일 확인: cat .u-boot.img.cmd xxx (중략)
http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User's_Guide
http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User's_Guide
http://www.wiki.xilinx.com/U-Boot+Secondary+Program+Loader
LD관련 (find . -name *.lds)
http://blog.naver.com/minareu/100117438339
http://www.math.utah.edu/docs/info/ld_3.html
https://turbosree.wordpress.com/2010/10/17/understanding-u-boot-source-linker-script/
https://www.linkedin.com/grp/post/821977-166593407
https://kldp.org/node/104186
5.2 DTB (Device Tree Blob)
U-BOOT에서 Device Tree라고 해서, 하드웨어 정보를 설정해서 커널에 보내주는 것이라는데,
아직 정확하게 왜 사용하는 지 이해를 못했다.
현재 AM437x는 위의 EVM 마다 dtb를 만들어 사용하고 있다.
A. 용어
- Device Tree Compiler (dtc) : 커널의 scripts/dtc 존재하며, dts를 compile하여 dtb를 만든다. dtb를 de-compile가능하다.
- Device Tree Source (dts,dtsi) : 커널의 arch/arm/boot/dts 에 존재 하며, dts를 compile 하면 dtb 결과물이 나온다.
- Device Tree Blob (dtb) : dtc 툴을 사용하여 dts의 bin 파일이며 최종 결과물이다.
- Flattened Device Tree(FDT) : fdt를 명령 실행을 해서, 관련 명령을 실행한다.
B. 기본사용법 및 구성
기본적으로 User는 DTS,DTSI 파일을 만들고, 이를 DTC를 이용하여, Compile하여 DTB 형태의 binary로 만든다.
Xilinx예제를 보니, DTS를 파일을 만들때, HSM/HSI 를 사용하는데, 이는 Xilinx에서만 사용되는 것인지 잘모르겠다.
AM437x의 U-BOOT에서는 아래와 같이 sript로 환경변수 기본구성을 하여, DTB 파일을 load 만 하고 끝인것 같은데,
이 주소를 KERNEL과 공유하는 것 같다. 아직 현재 KERNEL과 어떻게 통신하는지는 완벽히 이해하지 못했다.
C. U-BOOT에서 FDT명령
- GP: General Purpose EVM
- SK: Starter Kit
C.1 관련소스
$ cd board-support/u-boot-2014.07-g7e537bf/ $ cat include/configs/am43xx_evm.h | grep fdtfile "loadfdt=load ${devtype} ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}\0" \ "tftp ${fdtaddr} ${fdtfile}; " \ "setenv fdtfile am43x-epos-evm.dtb; fi; " \ "setenv fdtfile am437x-gp-evm.dtb; fi; " \ "setenv fdtfile am437x-sk-evm.dtb; fi; " \
* fdtfile 은 환경변수이며 , 처음에, findfdt 를 이용하여 적정한 fdtfile을 설정한 후 ,
loadfdt를 이용하여 fdtaddr에 fdtfile을 올린다.
자세한 내용은 printenv를 분석하자
http://wiki.beyondlogic.org/index.php?title=BeagleBoneBlack_Default_uBoot_Environment_Variables
http://www.crashcourse.ca/wiki/index.php/U-Boot_on_the_BBB
C.2 관련 명령어 (FDT)
U-BOOT 명령어 FDT
이 명령어는 DTB file을 Load로 올린 후, 사용이 가능하다. (TEST를 못해봄)
fdt cdfdt header fdt ls [fdt_path] fdt mknode [fdt_path/] fdt mkprop [node_path/] > fdt prop [node_path/[prop_name value_to_set]] fdt pwd fdt rm [node_path/]
https://wiki.freebsd.org/FlattenedDeviceTree#Device_tree_source_.28DTS.29
D. LINUX KERNEL
- 관련소스
$ cd board-support/linux-3.14.26-g2489c02 $ ls arch/arm/boot/dts/am4* //DTS, DTB 관련파일 am4372.dtsi am437x-gp-evm.dtb am437x-sk-evm.dtb am43x-epos-evm-hdmi.dts am43x-epos-evm.dts am437x-gp-evm-hdmi.dts am437x-gp-evm.dts am437x-sk-evm.dts am43x-epos-evm.dtb am43xx-clocks.dtsi $ ls scripts/dtc // DTC 컴파일러 dtc libfdt 중략
http://elinux.org/Device_Tree
http://omappedia.org/wiki/Device_Tree
http://www.elinux.org/images/a/ad/Arm-soc-checklist.pdf
http://processors.wiki.ti.com/index.php/Linux_Kernel_Users_Guide
http://www.wiki.xilinx.com/Build+Device+Tree+Blob
https://wiki.ubuntu.com/Kernel/Dev/ARMDeviceTrees?action=show&redirect=KernelTeam%2FARMDeviceTrees
KERNEL DOC
Documentation/devicetree
http://devicetree.org/Device_Tree_Usage
dtc [-I
[-o output-filename] [-V output_version] input_filename
vi ./arch/arm/boot/dts/Makefile (CONFIG_ARCH_OMAP2PLUS)
E. 디버깅
커널 메뉴에서 체크한 후, CONFIG_PROC_DEVICETREE , 터미널에서 cd /proc/device-tree
6. How To make SD Card image
A. create-sdcard.sh 사용
SDCard에 Image를 넣기 위해서는 bin/create-sdcard.sh을 이용을 해야 한다.
이 Tool은 Pre-built Images(이미 만들어진 Images)을 사용해서, SD카드에 이미지를 굽고, Filesystem을 만드는 Tool이다.
Image들은 MLO, UBOOT, UIMAGE가 필요하며, 그리고 설정파일 DTB파일
- 자세한 설명은 아래의 LINK를 참조
관련 Link
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_create_SD_card_script#SD_Card_Using_Default_Images
1. 문제사항
( 노트북 SD Card Reader는 virtual box에서 인식 못함, USB SD Card Reader는 Window 7에서 동작이 안됨)
2. 해결방법
생각한것이 가상디스크를 만들어, 이를 SD 카드로 속이는 것이며, 이곳에 Image를 만든 후, 이 Image를 윈도우에서 굽는방법이다.
만약 인식에 문제가 있다면, create-sdcard.sh 를 좀 수정하자, Virtual disk가 /dev를 무엇으로 사용하는 알고 그것을
create-sdcard.sh 의 check_for_sdcards 함수를 수정하면된다.
ROOTDRIVE : 현재 마운트 된 root drive를 찾는다.
PARTITION_TEST: /proc/partitions 에서 root drive를 제외하고 sd 와 mmcblk를 찾는다.
- Image 로 backup 작업
위 스크립트가 내가 준 virtual disk를 다 사용한다. (bs=실린더 사이즈 count= end )
* 주의 SD Disk용 virtual disk를 만들때 sd disk보다 작게 만들어야 한다.
$ cd /media/sf_SHARED $ sudo cat /dev/sdc > sdcard.img $ sudo dd if=/dev/sdc of=./sdcard.img
http://wiki.tiprocessors.com/index.php/How_to_Make_3_Partition_SD_Card
http://processors.wiki.ti.com/index.php/SD/MMC_format_for_OMAP3_boot
- back-up 된 image를 윈도우에서 write 하기
Win32 Disk Imager 이라는 Window 프로그램을 이용하여 SD Disk에 굽는다.
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Creating_a_SD_Card_with_Windows
B. 직접 Image 만들기
본래, Image를 만들어 loop 마운트로 하여 할려고 했으나, 매번 실패를 했다.
create-sdcard.sh 분석을 하니, 만드는 방법은 간단하다.
- sfdisk를 이용하여 2개의 partion을 만든다.
- 각각의 파티션에 vfat 과 ext3 포맷을 하고 boot 와 rootfs 이름을 정해준다.
- boot와 rootfs 디렉토리 생성 후 이를 각각 마운트한다.
- boot에 MLO와 u-boot.img만 넣는다.
- rootfs에 filesystem을 넣는다 (이곳에 이미 kernel이 포함)
Example (아래와 같이 하면 된다)
$sudo sfdisk -D -H 255 -S 63 -C 1305 /dev/sdc << EOF // -C 1305는 사이즈에 따라 변경, 아래참고 ,9,0x0C,* 10,,,- EOF $mkdir boot $mkdir rootfs $sudo mkfs.vfat -F 32 -n "boot" /dev/sdc1 $sudo mkfs.ext3 -L "rootfs" /dev/sdc2 $sudo mount -v -t vfat /dev/sdc1 boot $sudo mount -v -t ext3 /dev/sdc2 rootfs $sudo cp ~/work/ti-processor-sdk-linux-am437x-evm-01.00.00.00/board-support/prebuilt-images/MLO-am437x-evm ./boot/MLO $sudo cp ~/work/ti-processor-sdk-linux-am437x-evm-01.00.00.00/board-support/prebuilt-images/u-boot-am437x-evm.img ./boot/u-boot.img $sudo tar zxvf ~/work/ti-processor-sdk-linux-am437x-evm-01.00.00.00/filesystem/tisdk-rootfs-image-am437x-evm.tar.gz -C ./rootfs $sudo umount boot $sudo umount rootfs $rmdir boot $rmdir rootfs
sfdisk의 관련 shell script ( CYLINDERS는 Device따라 변경, 자세한 내용, create-sdcard.sh)
EOM dd if=/dev/zero of=$DRIVE bs=1024 count=1024 SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` echo DISK SIZE - $SIZE bytes CYLINDERS=`echo $SIZE/255/63/512 | bc` sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF ,9,0x0C,* 10,,,- EOF
참고로, Image를 이용한다면, fdisk의 block 정보가 unit 512이지만, 1024이다.
Image를 사용한 mount 정보 (offset을 이용한다, 안전장치로 sizelimit로 이용)
https://www.suse.com/communities/conversations/accessing-file-systems-disk-block-image-files/
http://lnx.cx/docs/vdg/output/Virtual-Disk-Operations.html
http://wiki.osdev.org/Loopback_Device#Partitioning
TIMESYS에서, create-sdcard.sh 사용 안하고 직접 다 한 예제이다.
https://linuxlink.timesys.com/docs/gsg/am437x_evm
7. PINMUX 설정
TI에서 쉽게 PINMUX를 설정이 가능하도록 지원을 하고 있다.
사용방법은 간단하며, Peripherals Add 하거나 Remove All을 하고, 세부 설정을 한다음,
우측의 Generated Files에서 최종결과물을 가져간다.
https://dev.ti.com/pinmux/app.html#/default/
8. TI에서 제공하는 관련메뉴얼
LINUX SDK MAIN HOME
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Software_Developer%E2%80%99s_Guide
SDK 처음 설치시
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Getting_Started_Guide
이빌드의 필요성, 아직 잘모르겠음.
http://processors.wiki.ti.com/index.php/Processor_SDK_Building_The_SDK
SDK 전체 소프트웨어 구조
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Software_Stack
Training
http://processors.wiki.ti.com/index.php/Sitara_Linux_Training
https://training.ti.com/sitara%E2%84%A2-arm%C2%AE-processors-boot-camp-training-series
https://training.ti.com/system/files/docs/sitara_boot_camp_01_introduction_to_the_linux_sdk.pptx
기타사항
https://e2e.ti.com/support/arm/sitara_arm/f/791/p/426731/1525183
http://www.timesys.com/embedded-linux/resources/dev-center/am437x
9. PRU-ICSS
.
The Programmable Real-Time Unit Subsystem and Industrial Communication SubSystem (PRU-ICSS)
Real-Time으로 외부 Device 혹은 작업들을 해야 할때 사용하는 것 같다.
RISC CPU를 두개를 사용하며, 이개 ARM인지 불확신하다.
좀더 봐야 할 것 같다.
A. PRU-ICSS Install
Linux SDK의 필요
http://processors.wiki.ti.com/index.php/PRU-ICSS_Getting_Started_Guide
http://software-dl.ti.com/sitara_linux/esd/PRU-SWPKG/latest/index_FDS.html
http://processors.wiki.ti.com/index.php/PRU-ICSS_Installer
B. PRU-ICSS 사용법