• 전체강좌

    uboot 소스 코드를 빌드해서 올려보자.(feat. Raspberry pi 4)

    twitter facebook

    안녕하세요? 착한이입니다.


    Raspberry Pi 4는 Rasbian 운영체제를 지원합니다.

    이 Rasbian을 사용하지 않고 본 강좌에서는 스터디 목적으로

    직접 최신 uboot를 빌드해서 올려 보고자 합니다.


    1. uboot 빌드 개발 환경 구축하기


    uboot를 빌드하기 위해서는 Linux의 Host 시스템이 필요하며, ARM64용 Cross Compiler 가 필요합니다.

    본 강좌에서는 Ubuntu 20.04 운영체제를 사용 하였으며,

    Cross Compiler 는 ARM64용을 사용 하였습니다.

    Raspberry Pi 4에는 ARM64 CPU가 장착되어 있습니다.


    1-1. Ubuntu 20.04 버전 설치


    PC에 Ubuntu 20.04 버전을 설치합니다. uboot 뿐만 아니라 Linux 를 빌드하기 위해서는

    가능하면 좋은 사양의 PC가 필요합니다.

    가상 머신보다는 빌드 전용 PC를 추천 드립니다.

    Ubuntu 20.04 버전은 다음 사이트에서 다운로드 가능합니다.

    https://releases.ubuntu.com/20.04/


    1-2 Cross Compiler 설치


    Ubuntu 설치가 완료되었다면, Cross Compiler를 설치해야 합니다.

    ARM64용 Cross Compiler는 다음 사이트에서 다운로드할 수 있습니다.

    압축을 해제하고 경로를 설정해 주면 설치는 완료됩니다.

    https://developer.arm.com/downloads/-/gnu-a


    본 강좌에서는 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 버전을 사용합니다.

    Raspberry Pi 4는 64bit ARM CPU를 장착하고 있으므로 ARM64 Cross Compiler가 필요합니다.

    강좌에서는 ~/Study/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 폴더에

    Cross compiler를 저장해 두었으며, 본인이 원하는 경로로 변경 가능합니다.


    터미널 창에서 다음 명령어를 실행하여 Cross Compiler 의 경로를 설정합니다.


    export CROSS_COMPILE=~/Study/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-


    위 명령어는 Cross Compiler를 사용할 때마다 실행해 주면 됩니다.

    Ubuntu의 OS에 path를 추가해도 되지만 다른 Cross compiler와 충돌이 발생할 수 있으니 주의하시길 바랍니다.


    1-3 필수 패키지 설치


    uboot와 kernel을 빌드하기 위해서는 필수 패키지를 설치해야 합니다.

    다음 명령어를 실행하여 필수 패키지를 설치합니다. 인터넷에 연결되어 있어야 합니다.


    sudo apt-get update

    sudo apt-get install gawk git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm rsync curl zstd lz4


    이제 uboot 빌드 개발 환경 구축은 완성하였습니다.

    uboot 소스 코드를 다운로드 해 보겠습니다.


    2. uboot 소스 코드 다운로드 하기


    Raspberry pi 4용 uboot 소스 코드는 다양합니다.

    본 강좌에서는 최신 uboot 소스 코드를 다운로드해서 사용합니다.

    Ubuntu 에서 터미널을 실행하고 다음 명령어를 입력합니다.


    git clone git://git.denx.de/u-boot.git


    명령어를 실행하면 u-boot 폴더가 생성되고 소스 코드가 다운로드 됩니다.

    u-boot 폴더로 이동해서 소스 코드를 하나씩 분석해 보셔도 많은 도움이 될 것입니다.


    3. uboot 빌드하기


    uboot 소스 코드를 다운 받았다면 터미널창에서 uboot 소스 코드 폴더로 이동합니다.

    강좌에서는 ~/Study/u-boot 폴더에 소스 코드가 저장되어 있습니다.

    다음 명령어를 실행하여, Cross compiler 경로를 설정합니다.

    강좌에서는 ~/Study/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 폴더에

    Cross compiler를 저장해 두었습니다.

    본인의 경로에 맞게 수정해서 적용해 주시면 됩니다.


    export ARCH=arm64

    export CROSS_COMPILE=~/Study/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-


    다음 명령어로 uboot를 Raspberry pi 4 용으로 설정하고 빌드할 수 있습니다.


    make rpi_4_defconfig

    make -j4


    여기서 -j4는 CPU Core 수를 의미합니다. Quad Core의 경우 -j4를 하면 되고

    본인 PC의 CPU Core 수를 지정하면 됩니다.

    uboot 빌드 시간은 PC 사양에 따라 차이가 있을 수 있으나 긴 편은 아닙니다.

    빌드가 완료되면, u-boot 폴더에 u-boot.bin 파일이 생성됩니다.


    4. Raspberry Pi 4에서 uboot 실행하기


    빌드된 uboot를 microsSD카드에 설치해서 Raspberry pi 4에서 실행하기 위해서는 다음의 과정이 필요합니다.


    4-1. microSD 카드 파티션 나누기


    Raspberry pi 4에서 uboot를 실행하려면, microSD 카드에 파티션을 생성하고 포멧해야 합니다.

    Raspberry pi 4는 microSD 카드 슬롯을 지원하며, uboot 실행 테스트를 위해서는

    최소 1GB 이상의 microSD 카드가 필요합니다.

    microSD 카드를 ubuntu PC에 연결합니다.

    터미널 창에서 다음 명령어로 microSD 카드를 확인합니다.


    dmesg


    보통 /dev/sdb와 같은 형식으로 인식이 됩니다.

    강좌에서는 /dev/sda 이지만 본인 PC에서 인식된 경로를 적용하시면 됩니다.

    다음과 같이 fdisk 를 이용하여 파티션을 생성하고 포멧해 줍니다.

    <주의> microSD 카드의 모든 데이터는 삭제됩니다.


    sudo fdisk /dev/sda


    fdisk가 실행되고 명령어 입력 모드가 실행됩니다.

    를 입력하여 기존 파티션을 삭제합니다.

    여러 개의 파티션이 있었다면 반복해서 d 를 입력해서 파티션을 하나씩 삭제합니다.


    모든 파티션이 삭제 된 후,

    를 입력하여 microsd 카드 정보를 확인합니다.

    파티션 정보가 없는 것을 확인할 수 있습니다.

    강좌에서는 16GB 제품을 사용하고 있으므로 다음과 같이 표시됩니다.


    Disk /dev/sda: 14.77 GiB, 15836643328 bytes, 30930944 sectors

    Disk model: SD Card Reader

    Units: sectors of 1 * 512 = 512 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disklabel type: dos

    Disk identifier: 0x523c5451


    를 입력하여 파티션 정보를 저장합니다.


    이제 새로운 파티션을 추가해 보겠습니다.

    n 을 입력하고 파티션 타입을 선택합니다.

    p 를 입력하여 primary로 선택합니다.

    Partition number 는 1로 합니다.

    First sector는 2048로 입력합니다.

    Last sector는 +1G 로 입력합니다.

    이렇게 하면 1GB의 파티션이 생성됩니다.

    파티션 크기는 uboot와 kernel 이미지 크기보다 여유롭게 설정하면 됩니다.


    두번째 파티션을 생성하기 위해

    n 을 입력하고

    p 를 입력합니다.

    Partition number 는 2로 합니다.

    First sector와 Last sector는 기본 값(default)으로 설정합니다.


    2개의 파티션이 추가 되었으며, 첫 번째 파티션의 형태를 변경합니다.

    t 를 입력하고, Hex code 에서 b 를 입력하여 파티션의 형태를 "W95 FAT32" 로 변경합니다.


    p 를 입력하여 microSD 카드의 정보와 파티션 정보를 확인합니다.

    예제에서는 다음의 정보가 표시됩니다.

    Disk /dev/sda: 14.77 GiB, 15836643328 bytes, 30930944 sectors

    Disk model: SD Card Reader

    Units: sectors of 1 * 512 = 512 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disklabel type: dos

    Disk identifier: 0x523c5451

    Device Boot Start End Sectors Size Id Type

    /dev/sda1 2048 2099199 2097152 1G b W95 FAT32

    /dev/sda2 2099200 30930943 28831744 13.8G 83 Linux


    를 입력하여, 파티션 정보를 저장하고 fdisk를 종료합니다.


    다음 명령어로 파티션을 포멧합니다.

    첫번째 파티션은 FAT32 형식으로 포멧하고 boot 라는 이름을 설정합니다.

    강좌에서의 /dev/sda1 은 microSD 카드의 경로이므로 본인의 경로로 변경해야 합니다.

    두번째 파티션은 ext4 형식으로 포멧하고 root라는 이름을 설정합니다.

    <주의> microSD 카드 경로 주의하세요.


    sudo mkfs.vfat -F 32 -n boot /dev/sda1

    sudo mkfs.ext4 -L root /dev/sda2


    이제 microSD 카드의 파티션 설정은 완료 되었습니다.


    4-2. Raspberry pi 4 UART 연결하기


    uboot 실행 시, UART로 디버깅 로그를 보려면

    Raspberry pi 4의 UART 확장 핀을 USB2Serial을 이용해서 PC와 연결해야 합니다.

    다음의 정보를 참고하여 연결해 주면 됩니다.


    Raspberry pi 4의 8번 - TX

    Raspberry pi 4의 10번 - RX

    Raspberry pi 4의 14번 - GND


    PC에서 UART 포트를 확인한 후, Putty 와 같은 Serial 프로그램으로 디버깅 로그를 확인할 수 있습니다.


    4-3. uboot 설치하기


    빌드된 uboot를 파티션이 나눠진 microSD 에 설치해야 합니다.

    Raspberry Pi 4에 내장된 부트로더는 microSD 카드의 커널 이미지를 로딩하게 되어 있습니다.

    여기서는 uboot를 로딩해야 하므로, 설정 파일(config.txt)의 내용을 수정해야 합니다.

    그리고 Raspberry Pi 4 용 펌웨어 파일도 필요로 합니다.

    다음 사이트에서 펌웨어 파일을 다운로드 합니다.


    https://github.com/raspberrypi/firmware


    펌웨어에서 boot 폴더의 다음 파일을 microSD 카드의 boot 파티션에 복사합니다.


    bootcode.bin

    start4.elf

    bcm2711-rpi-4-b.dtb


    그리고 빌드된 uboot 이미지 파일( u-boot.bin ) 도 boot 파티션으로 복사합니다.

    u-boot.bin


    텍스트 편집기로 config.txt 파일을 생성하고

    다음 내용을 입력합니다.

    enable_uart=1

    arm_64bit=1

    kernel=u-boot.bin


    config.txt 파일도 boot 파티션으로 복사합니다.

    여기까지 했다면, boot 파티션에는 다음의 파일들이 보일 것입니다.


    bootcode.bin

    start4.elf

    u-boot.bin

    bcm2711-rpi-4-b.dtb

    config.txt


    4-4. uboot 실행하기


    microSD 카드를 Raspberry pi 4의 슬롯에 장착하고 전원을 연결합니다.

    PC에서 Serial로 uboot가 부팅되는 것을 확인할 수 있습니다.

    다음 그림과 같이 uboot shell에서 uboot 명령어도 실행할 수 있습니다.




    여기까지 최신 uboot를 빌드해서 Raspberry Pi 4에 올려서 실행시켜 보았습니다.

    uboot 소스 코드가 공개되어 있으므로, 분석하시면서 다양한 기능을 테스트 해 보실 수 있습니다.

    Raspberry Pi 4로 uboot 스터디 하시는데 도움이 되었으면 합니다.

    그럼 다음 강좌에서 뵙겠습니다.


    --------------------------------------------------------

    유튜브 채널 방문과 구독 신청 부탁 드립니다.

    http://www.youtube.com/c/WeAreDev