SW 개발

nxp Layerscape yocto 빌드 및 sd boot

. . . 2022. 9. 16. 15:53
반응형

nxp layerscape 빌드 및 sd card boot 관련하여 정리한다.

  • nxp ls1028a 관련해서 빌드 및 sd card boot 삽질했던 내용의 일부를 정리.
  • 보안과 관련한 사항들, datasheet 내용들은 되도록 적지 않는다.
  • 인터넷에서 검색이 가능한 내용들로만 작성한다.

1 layerscape yocto build

매뉴얼을 보면 NXP layerscape chip (LS1012A LS1021A LS1028A LS1043A LS1046A LS1088A LS2088A LX2160A MPC8548 P1010 P1020 P2020 P2041 P3041 P4080 P5040 T1024 T1042 T2080 T4240) 계열은 아무래도 동일한 개발 빌드환경을 공유하는것으로 보인다.

  • layerscape 는 LSDK 를 제공한다.
  • LSDK 는 flex-builder 라는 자체 빌드시스템을 이용한다.
    • LSDK 를 통한 flex-builder 빌드는 Layerscape Software Development Kit User Guide 문서를 참고하면 된다.

내용을 보다보면 flex-builder 로 충분히 개발이 가능하겠지만 필자는 기존부터 사용해오던 yocto 개발이 편하다보니 yocto 로 개발하는발하는 방법을 소개한다.

1.1 yocto user guide

yocto 용 guide 는 LSDKYOCTOUG 문서를 따로 구하여 참고한다.

1.2 repo clone

각 칩셋마다 지원되는 yocto 버젼이 있으니 해당 버젼에 맞게 yocto version 을 받아 빌드하면 하면된다.

지원되는 yocto version

repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b dunfell
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b zeus
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b warrior
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b thud
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b sumo

repo sync 이후에 LSDKYOCTOUG 문서에 따라서 yocto 빌드를 진행한다.

2 yocto build image

layerscape yocto 에서 빌드된 결과물은 sd boot image 가 없다.

  • 부팅용 이미지가 따로 생성되지 않기때문에, flex-installer 를 통한 sd card 쓰기도 할수없다.
  • sd boot image 를 따로 만들어야한다.

2.1 sd card boot - bootloader (uboot)

yocto 의 wic 명령어로 sd card 용 부팅이미지를 만들 수 있다.

sd card 부팅을위해서 각 칩셋의 데이터시트를 확인하여 부트로더,커널이미지등이 sdcard 의 어느 부분에 들어가야하는지 확인한다.

QorIQ memory layout 부분을 살펴보면 다음과 같다.

위의 표에서 부팅에 필요한부분 만 추려려서 정리해보면 다음과같다.

  • RCW + PBL + BL2 (이하 BL2)
    • sdcard block : 0x8
    • build result file : atf/bl2_sd.pbl
  • FIP image + uboot (이하 BL3)
    • sdcard block : 0x800
    • build result file : atf/fip_uboot.pbl

BL2 / BL3 는 yocto 빌드하면 자동으로 생성해준다.(atf/bl2_sd.pbl, atf/fip_uboot.pbl)

위의 내용대로 부팅가능한 이미지를 만들기위한 wks 는 다음과같다.

# bl2 boot setctor = 0x8 
#  -> 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams="file=atf/bl2_sd.pbl" --align 4 --no-table

# bl2 boot setctor = 0x800
#  -> 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams="file=atf/fip_uboot.bin" --align 1024 --no-table

해당 wks 를 작성후 wic create wks/sd-img.wks -o img.bin -e fsl-image-networking 명령어를 입력하여 image 를 만든다.

  • wic 명령어 간략설명 : yocto-sd-image-만들기
  • 사실 wks 를 이용해 안만들고 dd 로 만들어도 된지만 추후 rootfs 까지 만들어야하기때문에 wks 로 만드는게 편하다.
  • -e fsl-image-networking 부분은 만드려는 이미지 레시피에 따라서 적절히 수정한다.)

참고로, 위의 wks는 다음의 dd 명령어와 같다

dd if=atf/bl2_sd.pbl of=test/test.bin bs=512 seek=8
dd if=atf/fip_uboot.bin of=test/test.bin bs=512 seek=2048

...

위에서 생성된 이미지파일을 sdcard 에 밀어넣고 부팅이 되면 부트로더 까지 구동은 성공이다.

참고로, atf 이미지는 따로 래시피로 분리 되어있다. uboot 수정한다고 해도 atf 이미지는 새로 생성되지 않는다. uboot 수정시 atf용 이미지는 bitbake -c do_clean atf && bitbake atf 명령어로 새로 빌드해주면된다.

2.2 sd card boot - kernel

QorIQ memory layout 부분의 linux kernel block 은 0x8000 이다.

  • 해당 kernel block 부분은 굳이 지키지 않아도된다. 하지만, 기본적으로 제공되는 uboot 소스코드에서 kernel loading address 가 0x8000 으로 이미 설정되어있기때문에 해당 부분을 지키는게 좋다.
  • yocto build 후에 완료된 커널 이미지는 fitImage 이다.

fitImage0x8000 번지에 넣는다. 부트로더와 함께 kernel 까지 넣는 wks 파일은 다음과 같다.

# bl2 boot setctor = 0x8 
#  -> 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams="file=atf/bl2_sd.pbl" --align 4 --no-table

# bl2 boot setctor = 0x800
#  -> 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams="file=atf/fip_uboot.bin" --align 1024 --no-table


# kernel fit image = 0x8000
#  -> 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams="file=fitImage" --align 16384 --no-table

해당 wks 를 작성후 wic create wks/sd-img.wks -o img.bin -e fsl-image-networking 명령어를 입력하여 image 를 만든다.

  • wic 명령어 간략설명 : yocto-sd-image-만들기
  • 사실 wks 를 이용해 안만들고 dd 로 만들어도 된지만 추후 rootfs 까지 만들어야하기때문에 wks 로 만드는게 편하다.
  • -e fsl-image-networking 부분은 만드려는 이미지 레시피에 따라서 적절히 수정한다.)

2.2.1 커널 부팅을 위한 수정

커널까지 sd card 에 넣은후 부팅해보면... Could not find configuration node 에러가 발생하면서 부팅이 되지 않는다.

부팅이 되지 않는 이유는 커널의 fit image 의 configure 설정과 uboot 에서 bootm 명령어 설정이 맞지 않아서 이다.

layerscape yocto build uboot 의 코드는 부팅을 위해서 bootm $load_addr#$board 와같이 되어있는데.. 생성된 kernel fit image 는 해당 confgiure 가 없다. 참고로 이미 default config 가 설정되어 있으므로 부트로더에서 다음과같이 수정한다.

setenv bootm '$load_addr'
savee

위대로 수정할경우 커널까지 부팅은 될것이다. (rootfs mount 하다가 에러가 발생할것이다.)

2.3 2.2 sd card boot - rootfs

wks 를 이용하여 다음과 같이 rootfs 까지 포함하여 만들자.

# bl2 boot setctor = 0x8 
#  -> 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams="file=atf/bl2_sd.pbl" --align 4 --no-table

# bl2 boot setctor = 0x800
#  -> 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams="file=atf/fip_uboot.bin" --align 1024 --no-table


# kernel fit image = 0x8000
#  -> 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams="file=fitImage" --align 16384 --no-table

# empty filesystem start 0x20000
#  -> 0x20000 * 512 / 1024 = 65536kb 
# mmcblk0p1
part --fstype=ext4 --align 65536 --fixed-size 32M

# filesystem start = 0x20000 (+ 32M = 32768)
#  -> 0x20000 * 512 / 1024 = 65536kb + 32768 = 98304
# mmcblk0p2
part --source rootfs  --fstype ext4 --align 98304 --fixed-size 3G

해당 wks 를 작성후 wic create wks/sd-img.wks -o img.bin -e fsl-image-networking 명령어를 입력하여 image 를 만든다.

  • wic 명령어 간략설명 : yocto-sd-image-만들기
  • 사실 wks 를 이용해 안만들고 dd 로 만들어도 된지만 추후 rootfs 까지 만들어야하기때문에 wks 로 만드는게 편하다.
  • -e fsl-image-networking 부분은 만드려는 이미지 레시피에 따라서 적절히 수정한다.)
  • user 파티션은 총 2개를 만든다.
    • p1 : 32M 의 빈 파티션
    • p2 : 실제 rootfs 가 들어갈 파티션 -> bootargs 를 mmcblk0p2 로 설정

위와같이 만든 이미지를 sd card 에 밀어넣고 부팅을 시킨다.

rootfs 인식을 위해서 uboot 에서의 환경변수는 다음과 같이 수정한다.

setenv bootargs root=/dev/mmcblk0p2 rw
savee

이후 부팅하면, rootfs 까지 인식완료된다.

3 요약

위에서 설명한 내용을 요약정리한다.

3.1 uboot 수정포인트

yocto 로 빌드한 커널, rootfs 를 인식시키기위해서는 uboot 에서 다음의 내용을 수정한다.

uboot/include/configs 폴더내에서 보드의 설정파일에서 다음의 uboot 환경변수를 수정 혹은 추가한다.

# 추가사항
bootargs root=/dev/mmcblk0p2 rw
# 수정사항 : bootm $load_addr$board 부분을 다음으로 수정
bootm $load_addr
# 수정사항 : SD_BOOTCOMMAND 을 run sd_bootcmd; 으로 변경
define SD_BOOTCOMMAND run sd_bootcmd;
bootm 

include/configs/ls1028ardb.h

3.2 sd image 만들기

다음의 wks 작성후 sd card 이미지 만듬

# bl2 boot setctor = 0x8 
#  -> 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams="file=atf/bl2_sd.pbl" --align 4 --no-table

# bl2 boot setctor = 0x800
#  -> 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams="file=atf/fip_uboot.bin" --align 1024 --no-table


# kernel fit image = 0x8000
#  -> 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams="file=fitImage" --align 16384 --no-table

# empty filesystem start 0x20000
#  -> 0x20000 * 512 / 1024 = 65536kb 
# mmcblk0p1
part --fstype=ext4 --align 65536 --fixed-size 32M

# filesystem start = 0x20000 (+ 32M = 32768)
#  -> 0x20000 * 512 / 1024 = 65536kb + 32768 = 98304
# mmcblk0p2
part --source rootfs  --fstype ext4 --align 98304 --fixed-size 3G

wic create wks/sd-img.wks -o img.bin -e fsl-image-networking

3.3 sd card write & booting

만든 sd image를 https://www.balena.io/etcher/ 를 통해서 sd card write 후에 부팅...

...

4 잡담..

  1. 아직 layerscape yocto build 에서 sd card boot 용 이미지가 왜 생성안되는지 잘 모르겠음 ㅠㅠ
  2. 나름 쉽게 풀어쓴다고 썼지만 다른사람에게 도움이 될지는 의문.
  3. 나중에 혹시 비슷한 삽질을 할까봐... 정리차원에서 작성

...

반응형