7/04/2015

AM437x EVM 관련정보 (working-현재 수정중 추후 삭제예정임- 중요정보포함 )

1. AM43시리즈와 DM8127

회사에서 일이 많지 않다 보니, 가지고 놀 보드를 찾았다. TI의 AM43 Series와 DM8127이다.
기본적인 설정과 여러가지 일을 해볼 생각인데, 아직 미지수 이다.
시간이 나면 해볼 것이고, 매번 뭘 해야 할지 그게 고민이다.
일단 기본설정과 관련부분 및 관련 부분을 제대로 설정하고 난 후 생각을 해보자.

2. AM437x Sitrara의 CPU의 기본 정보들 (remove)

   AM437x Processors

AM4379AM4378AM4377AM4376
ARM Cortex-A9 MHz (Max.)800/1000800/1000800/1000300/800/1000
Graphics Acceleration3D graphics3D graphics
PRU-ICSS for slave
(Programmable real-time unit
and industrial communication
sub-system) *
PRU-ICSS + EtherCat® slavePRU-ICSSPRU-ICSS + EtherCat® slavePRU-ICSS
Package **17x17 / 0.65mm17x17 / 0.65mm17x17 / 0.65mm17x17 / 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
       https://training.ti.com/am437x-industrial-communications-single-chip-drive

  • ISDK 관련 사이트 
Download latest release:  http://www.ti.com/tool/sysbiossdk-ind-sitara

- 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 부터 설치하고,
나머지는 부가적으로 천천히 알아가자
  1. SDK Essentials  (필요파일)
  2. SDK Optional Addons
  3. SDK SD Card Creation
  4. SDK Individual Components 
  5. SDK Arago Source Tarball
  6. SDK Documentation

    • 버전관리 
           
                 SDK Essentials 의 최신파일 1.00.00.00 인데, 이전 파일이 8.0이다. (다른점은 processor 명칭이 추가되었다.)

    • SDK 필요파일  

                   ti-processor-sdk-linux-am437x-evm-01.00.00.00-Linux-x86-Install.bin

      • SDK 설치후 구성    

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


      B.  LINUX SDK의 개발환경구성 


      AM437x의 기본 개발환경은 CCS를 LINUX BASE사용하여 HW Debugging까지 지원을 하는 것 같다.
      현재 이부분은 테스트를 해봐야함. WIDNOW Version은 어떻게 사용해야하는지 그것도 테스트 해야함.




      Linux Host Development System.png
      setup.sh 관련 link: http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Setup_Script




      C. How To Install SDK

      • 주의사항 ( Ubuntu OS 64bit일 경우 추가 Package 설치)
             설치전 필요한 패키지들 아래의 사이트에서 각 OS에 맞게 확인하고 먼저 설치하자.
                http://processors.wiki.ti.com/index.php/Sitara_Linux_SDK_64_Bit_Ubuntu_Support

        •  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 설치
        설치전 아래 확인 Package들
        $  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 만 필요할 것 같다.


          Graphics_SDK 관련사이트 (PowerVR)
               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 일경우
          1. ROM Bootloader,  Initial Program Loader (IPL) or the Primary Program Loader (PPL). 
          2. The binary for the Secondary Program Loader (SPL) or the MLO.
          3. 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
          U-BOOT에서 FDT에 관해서 간단히 설명을 한다. 

          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 cd 
          fdt 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 ]
                  [-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.  문제사항 
            virtual box 사용 중인데  SD Card Reader 인식을 못해 제대로 작동을 못한다.
            ( 노트북 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 작업 
            처음에 fdisk의 실린더 정보를 보고, 사용하는 만큼 image를 만들려고 했으나, 이게 아무런 의미가 없어졌다.
            위 스크립트가 내가 준 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 분석을 하니, 만드는 방법은 간단하다.
            1.     sfdisk를 이용하여 2개의 partion을 만든다.  
            2.     각각의 파티션에 vfat 과 ext3 포맷을 하고 boot 와 rootfs 이름을 정해준다. 
            3.     boot와 rootfs 디렉토리 생성 후 이를 각각 마운트한다.  
            4.     boot에 MLO와 u-boot.img만 넣는다. 
            5.     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 사용법