Tuesday, August 12, 2014

ARM Linux Porting Guide (imx6q cortex-a9)

Welcome document

For ARM Platform

(Freescale i.MX6 Quad SABRE SD)

1. 목표

Freescale i.MX6 Quad SABRE SD 보드 (ARMv7a) 에 리눅스 우분투를 포팅하여 부팅을 시킨다.

2. 필요한 패키지

2.1. ‘ncurses’ package for console like GUI

$ sudo apt-get install libncurses5 libncurses5-dev

2.2. u-boot-tools for ‘mkimage’

$ sudo apt-get install u-boot-tools

2.3. minicom

$ sudo apt-get install minicom

2.4. Librasry or tool for 32bit in 64bit development environment

$ sudo apt-get install libc6-dev-i386 lib32z1 lib32ncurses5 lib32bz2-1.0

2.5. Cross Compiler (Toolchain)

$ wget -c https://www.dropbox.com/s/wuo9f2i2lde6hpl/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz

3. Bootloader 빌드

필요한 패키지들을 다운받은 뒤에 bootloader 의 소스폴더인 u-boot-2009.08로 들어가서 다음과같은 명령어를 차례로 입력하면 빌드가 된다.

$ make ARCH=arm CROSS_COMPILE=arm-linux- O=../u-boot_object mx6q_sabresd_config

$ make ARCH=arm CROSS_COMPILE=arm-linux- O=../u-boot_object

4. Linux kernel 빌드

리눅스 커널 소스 폴더인 linux-3.0.35 폴더내부에 들어가서 다음과 같은 명령어를 차예로 입력한다.
(도중에 찾을수없는 파일있다고 에러뜨면 직접 소스폴더에서 찾아서 오브젝트 폴더로 옴기면 해결된다.)

$ make ARCH=arm CROSS_COMPILE=arm-linux- O=../linux_kernel_object imx6_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux- O=../linux_kernel_object
$ make uImage ARCH=arm CROSS_COMPILE=arm-linux- O=../linux_kernel_object

5. SD card 세팅

SD card를 리더기를 통해서 USB로 컴퓨터에 연결한뒤에 mount가 되어있으면 umount를 시켜주고
다음을 진행한다.

$ sudo fdisk /dev/sdb
Command (m for help): d 
Selected partition 1 
Command (m for help): n 
Partition type: 
p primary (0 primary, 0 extended, 4 free) 
e extended 
Select (default p): p 
Partition number (1-4, default 1): 1 
First sector (2048-7744511, default 2048): 20480
Last sector, +sectors or +size{K,M,G} (16384-7744511, default 7744511): 
Using default value 7744511 
Command (m for help): w 
The partition table has been altered! 
Calling ioctl() to re-read partition table. 
Syncing disks.

`$ sudo mkfs.ext4 /dev/sdb1`

$ cd <the path to folder containing u-boot.bin>
$ sudo dd if=u-boot-mx6q-sabresd.bin of=/dev/sdb bs=512 seek=2 skip=2 conv=fsync

$ cd <Linux kernel Build folder>/arch/arm/boot/
$ sudo dd if=uImage of=/dev/sdb bs=512 seek=2048 conv=fsync

6. Minicom 세팅

Mirco USB 케이블이 필요한데 그것을 보드와 PC에 연결하고 다음과같이 설정을 하면된다.

$ sudo minicom -s

# Select menu ‘Serial port setup’
# Modify ‘A -    Serial Device’  such as ‘/dev/ttyUSB0’
# Modify ‘F - Hardware Flow Control’ such as ‘No’
# So, the result is.. 

    +-----------------------------------------------------------------------+ 
    | A -    Serial Device      : /dev/ttyUSB0                              | 
    | B - Lockfile Location     : /var/lock                                 | 
    | C -   Callin Program      :                                           | 
    | D -  Callout Program      :                                           | 
    | E -    Bps/Par/Bits       : 115200 8N1                                | 
    | F - Hardware Flow Control : No                                        | 
    | G - Software Flow Control : No                                        | 

$ sudo minicom 

# After running minicom , connect your board to PC by your microUSBcable.
# And then, power on your board.

7. U-Boot 설정

mirco USB 케이블도 연결하고 Minicom을 실행한 뒤 보드 전원버튼을 누르면 부트로더까지는 부팅이 완료된다 그때 엔터를 쳐서 다음과같이 부트로더 프롬프트로 접근하여 부트로더 환경변수 설정을 해준다.

MX6Q SABRESD U-Boot > setenv loadaddr 0x10800000

MX6Q SABRESD U-Boot > setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'

MX6Q SABRESD U-Boot > setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk1p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'

MX6Q SABRESD U-Boot > setenv bootcmd_mmc 'run bootargs_base bootargs_mmc;mmc dev 2;mmc read ${loadaddr} 0x800 0x4400;bootm'

MX6Q SABRESD U-Boot > setenv bootcmd 'run bootcmd_mmc'

MX6Q SABRESD U-Boot > saveenv
MX6Q SABRESD U-Boot > run bootcmd

8. 마무리

마지막 run bootcmd 명령어를 부트로더 프롬프트에서 입력하거나 환경변수가 저장된 상태에서 재부팅을 하게 되면 정상적으로 부팅이 완료된다.

No comments:

Post a Comment