분류

2018년 3월 6일 화요일

texas 보드 (cortex-a8, am33x) kernel 빌딩

사용자 지정 커널 컴파일에 앞서 그간 깨닫게 된 툴 체인과 커널에 대한 정의는 이렇습니다.

1. 툴체인 (toolchain) 툴체인이란?
그동안  3개의 보드에 대해 kernel과 툴체인에 대해 작업하면서 ARM 그리고 LINUX에 대한 지식이 정말 부족했음을 깨닫습니다. toolchain은 그냥 쉽게 말해 도구 묶음입니다.
툴체인의 대략적인 구성은 이렇습니다.

텍스트 인코딩을 위한 프로그램 - libiconv
프로그램을 사용할 때 필요한 컴파일러 - gcc
디버깅 환경을 구성하는 - gdb
리눅스 용 c 라이브러리 - glibc
소수 연산을 위한 c 라이브러리 ? -  mpc
cloog-ppl, zlib, pkg-config, binutils....

toolchain.src 파일의 압축을 풀어보면 일일이 열거하고 설명하기 힘든 만큼 많은데 개념적인 것으로 확실해 진 것은 이렇습니다. windows를 설치하면 유용하게 쓰기 위한 각종 패키지를 설치하듯, linux 환경에서 유용한 도구들을 사전에 묶어 놓은 것이다. 정도로 생각하면 될 것 같습니다. 툴체인은 제조사에 따라서 지원하는 항목들이 다른 경우도 있습니다. (특정 보드에서는 busybox를 최소화 해서 명령어가 안먹는 경우도 있습니다. )

2. KERNEL이란?
커널의 경우 하드웨어에 대한 제어권을 갖고있는 LINUX 시스템 운영체제의 중추라고 생각하면 될 것 같습니다. 이렇게 생각하게 된 이유는 KERNEL의 MENUCONFIG를 확인해보면 수행할 수 있는 환경설정이 90%이상 하드웨어에 집중되어 있기 때문입니다.

하드웨어의 제조사가 달라짐에 따라 커널에 적재해야 할 드라이버 들의 종류가 달라지고, cpu의 종류가 달라지고, 여러 분류들이 달라집니다. 따라서 kernel은 각 제조사에서 배포를 하고 있습니다. 왠만하면 각 제조사의 지원 커널을 받는 것이 좋은 것 같습니다.

3. 툴체인 설치 

설치된 크로스 툴체인 목록이 있는지 확인 
$ update-alternatives --list arm-linux-gnueabihf
※update-alternatives는 여러 라이브러리 버전을 관리하는 명령입니다. 

arm-linux-gnueabihf-gcc --version

gcc 인스톨 (gcc가 원하는 버전이 설치되지 않았을 경우 ) 
$ sudo apt-get install gcc-4.7-arm-linux-gnueabihf
gcc가 여러개인 경우 update-alternatives를 설정합니다.
$ sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf /usr/bin/arm-linux-gnueabihf-gcc-4.7 473 --slave /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++-4.7


다시 설치된 arm-linux-gnueabihf 목록을 확인합니다. 
$ sudo update-alternatives --config arm-linux-gnueabihf 

저는 등록된 녀석이 하나밖에 없습니다.  
/usr/bin/arm-linux-gnueabihf-gcc-4.7.3

버전정보를 확인해봅니다. 

$ arm-linux-gnueabihf-gcc --version 


arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.7.3-11ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ubuntu 12 버전 gcc-4.7-arm-linux-gnueabihf 설치법
$ sudo gedit  /etc/apt/sources.list
업데이트 사이트 추가
deb http://www.emdebian.org/debian/ unstable main
$ sudo apt-get install emdebian-archive-keyring
$ sudo apt-get update
$ sudo apt-get install gcc-4.7-arm-linux-gnueabihf


4. 커널 소스 다운로드 
커널은 전체 다운로드를 할 경우 용량이 어마어마 하므로, 릴리즈 노트를확인하여 원하는 버전의 브렌치만 다운로드 하세요

http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Kernel_Release_Notes#Generic_Kernel_Release_Notes
화면을 제일 아래로 내리면 Archived 라는 녀석이 있는데 여기에서 찾으시면 됩니다.


다시 사용자 디렉터리로 이동해서 kernel을 다운로드 합니다. 
$ cd ~/ 
git clone -b processor-sdk-linux-03.02.00 --depth=1 git://git.ti.com/processor-sdk/processor-sdk-linux.git
※ kernel version 이 4.대이므로 3.x 버전의 커널을 원하시면 processor-sdk-linux-01.00.00 버전이나 processor-sdk-linux-01.00.01 버전을 사용해야 합니다. 

$ cd processor-sdk-linux/

일단 커널을 클리닝 해줍니다. 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

5. 커널 환경 설정 
애먹었던 mx6와 다르게 am335x 는 커널 화경도구를 제공합니다. (mx6는 yocto 에 있는 파일을 복제해서 사용해야 하죠.. yocto를 모르면 아무것도 안됩니다. )

defconfig 빌더에서 자신의 보드에 맞는 환경이 있는지 확인합니다. 
$ ti_config_fragments/defconfig_builder.sh -t ti_sdk_AM335x_release
Cannot find the build type or a match for ti_sdk_AM335x_release
Maybe try one of the following:
1. ti_sdk_am3x_release
2. ti_sdk_am4x_release
3. ti_sdk_dra7x_release
4. ti_sdk_omap2_release
5. ti_sdk_k2g_release
6. ti_sdk_keystone_release
7. ti_sdk_am3x_debug
8. ti_sdk_am4x_debug
9. ti_sdk_dra7x_debug
10. ti_sdk_omap2_debug

11. ti_sdk_k2g_debug
맞는 환경설정이 없다고 나옵니다. 이 경우 ti_sdk_am3x_release 를 선택하면 되겠네요
defconfig는 환경설정을 저장해놓은 파일입니다. (각 제조사별 sdk, bsd에 포함되어 있습니다.)ㅇㄷ
$ ti_config_fragments/defconfig_builder.sh -t ti_sdk_am3x_release
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ti_sdk_am3x_release_defconfig


※ 메인라인 커널 사용시
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 
omap2plus_defconfig
추가 커널설정이 필요한 경우 아래 명령을 통해 환경설정을 진행하세요
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

※ 메인라인 커널 보드에 맞는 defconfig가 없을경우 sdk 에 있는것을 복제하여 사용하시면 편리합니다.
예 : $ cp ../../texas-am335x/am335x_k_defconfig ./arch/arm/configs/am335x_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 
ti_sdk_am3x_release_defconfig


6. 소스파일 컴파일 

$ make -j3 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage 

※ -j3옵션은 코어 3개를 이용하겠다는 뜻입니다. 자신의 환경에 맞게 설정하세요 


메인라인 커널을 사용할 시에도 명령은 

make -j3 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs

※ make가 완료되면 /arch/arm/boot/dts에 디바이스 트리 파일이 생성됩니다. 이중 자신에게 맞는 dts파일을 빌드하세요 

예를들어 

$ find -name *am3*dts 명령을 통해 찾아보면 제 보드 am335 관련된 파일 목록이 이렇게 나옵니다. 
./arch/arm/boot/dts/am335x-base0033.dts
./arch/arm/boot/dts/am3517-craneboard.dts
./arch/arm/boot/dts/am335x-chiliboard.dts
./arch/arm/boot/dts/am335x-pepper.dts
./arch/arm/boot/dts/am335x-evmsk.dts
./arch/arm/boot/dts/am3517-evm.dts
./arch/arm/boot/dts/am335x-bonegreen.dts
./arch/arm/boot/dts/am335x-lxm.dts
./arch/arm/boot/dts/am335x-evm.dts
./arch/arm/boot/dts/am335x-nano.dts
./arch/arm/boot/dts/am335x-baltos-ir5221.dts
./arch/arm/boot/dts/am335x-boneblack-iot-cape.dts
./arch/arm/boot/dts/am335x-boneblack.dts
./arch/arm/boot/dts/am335x-icev2.dts
./arch/arm/boot/dts/am335x-wega-rdk.dts
./arch/arm/boot/dts/am335x-bone.dts
./arch/arm/boot/dts/am3517_mt_ventoux.dts

./arch/arm/boot/dts/am335x-sl50.dts
이중 -evm으로 명명 되어진 녀석이 범용 evm 이고 
boneblack 는 비글본 이라는 리눅스 버전용입니다. 

$ make -j3 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x-evm.dtb

※ uImage가 필요할 경우 아래 명령을 수행하세요 
$ make -j3 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage LOADADDR=0x82000000
uImage 를 만들려면 uboot-mkimage 툴이 필요합니다. 
$ sudo apt-get install uboot-mkimage
※ ubuntu 14.04 64bit 버전에서 uboot-mkimage가 설치되지 않습니다. 따라서 다음 명령으로 대체됩니다. 
$ sudo apt-get install u-boot-tools


7. 커널과 모듈을 컴파일
make -j3 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

빌드된 결과 파일들은 arch/arm/boot 에 이렇게 들어있습니다. 
$ ls arch/arm/boot/

bootp  compressed  dts  Image  install.sh  Makefile  zImage
커널을 빌드할때 모듈을 같이 빌드하는 것이 좋습니다. 그렇지 않을 경우 커널 모듈이 로드되지 않거나 중간에 멈추는 현상이 발생합니다.

6. 커널 설치하기
이제 커널 이미지 및 장치 트리 바이너리 설치 단계 입니다. 아직 커널 소스 디렉토리에 계시쥬? 우선 커널 이미지를 적재할 sd카드를 연결한 후 마운트 시켜줍니다.
우선 디렉토리를 생성합니다. 
$ mkdir -pv /media/boot
$ mkdir -pv /media/rootfs
※ -pv옵션은 경로에 해당하는 디렉토리 모두 생성하라는 명령입니다. 

다음은 디스크를 마운트해줍니다. 
$ sudo mount /dev/sdb1 /media/boot/
$ sudo mount /dev/sdb2 /media/rootfs/
※ /dev/sdb1 은 boot파티션입니다. 파티션 확인 며령은 $ sudo fdisk -l입니다.
커널 이미지를 복사해줍니다.
$ sudo cp arch/arm/boot/zImage  /media/boot
$ sudo cp arch/arm/boot/dts/
am335x-evm.dtb /media/boot 
※ uImage가 있을때 
$ sudo cp arch/arm/boot/uImage  /media/boot

다음은 커널 모듈을 설치해줍니다.
$ sudo make ARCH=arm INSTALL_MOD_PATH=/media/rootfs modules_install


$ sync

sd카드의 uImage 를 통해 부팅하기 
tftp boot을 이용하기 위해서는 먼저 환경설정이 필요합니다. Yocto NFS & TFTP boot  문서 한글화 를 참조하세요
우선 booting 시 2초내 키를 눌러 u-boot 인터페이스로 접속합니다.
SD카드에서 uImage 읽기 및 실행  
fat32 형식의 파티션에 파일이 있어야 합니다. (boot 파티션)
U-Boot # mmc rescan
U-Boot # fatls mmc 0


sdcard에서 커널 부팅하기 
U-Boot# mmc rescan 
U-Boot# fatload mmc 0 0x82000000 uImage 
U-Boot# bootm 0x82000000

이 작업까지 수행해 본 결과 ti에서 제공하는 processor-sdk-linx 의 linux-03.02.00이 커널버전이 아님을 확인했습니다.
http://processors.wiki.ti.com/index.php/Processor_SDK_Linux_Kernel_Release_Notes를 확인해야 제대로 된 커널 버전을 확인할 수 있습니다. 지원을 오랜기간 해오다 보니 문서 관리상의 문제가 좀 있어 보입니다.



댓글 없음:

댓글 쓰기