라즈베리파이

라즈베리파이 3B/3B+/4B 에서 u-boot 및 시리얼 콘솔 사용

MT리눅스 2020. 5. 28. 21:30

라즈베리 파이에서 기본적인 입출력은 키보드와 화면 스크린을 사용하며 이에 따라 추가적인 키보드와 모니터 연결이 필요합니다.
일반적으로 임베디드 시스템에서 사용하는 입출력은 시리얼을 사용하기 때문에 라즈베리 파이에서도 u-boot 및 커널에서 시리얼 콘솔을 사용할 수 있도록 환경을 구축합니다.

아래 내용에 대해서는 실제 3B/3B+/4B에서 동작하는 것을 확인하였습니다.

 

 

부팅 순서

그림에서와 같이 stage3 bootloader에서 리눅스 커널 대신 u-boot로 대치시켜 줍니다.

www.vdoo.com/blog/setting-up-u-boot-to-harden-the-boot-process

  • power on -> bootcode.bin -> start*.elf -> kernel.img (u-boot.bin)
  • GPU 초기화 이후 CPU 초기화 거침
  • bootloader에서 리눅스 커널(kernel7.img)로 jump하는 대신에 u-boot로 점프
  • config.txt에서 다음 내용변경
  • kernel=u-boot.bin

u-boot

아래 사이트에서 기본적인 build정보 참고

dalgong2.tistory.com/2

- uboot는 32bit 또는 64bit를 빌드를 선택할 수 있는데, 64bit 커널을 사용하기 위해서 64bit를 사용하였습니다.

- rpi_3_defconfig는 시리얼 장치를 aux 포트인 miniuart를 사용합니다.
- 코로스 컴파일러는 아래 사이트에서 arm 및 aarch64 toolchain을 다운로드하였고 현재 버전은 9.2입니다.

developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads

- 64bit u-boot를 사용한다면 cpu를 64bit 모드로 변경해야 하기 때문에 다음과 같이 config.txt를 변경합니다.
  arm_64bit=1

 

 

uboot 빌드

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

cd u-boot
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- rpi_arm64_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu-

최종적으로 u-boot.bin이 생성되며 이 파일을 SD 카드에 복사합니다.

(u-boot commit:c5c657644bc35fd6b3d6e5517698721e90646b8d)

 

uboot 파라미터 설정

이 파라미터의 구성은 커널과 dtb를 네트워크로 다운로드 받은후 이것으로 부팅합니다.

그리고, 루트파일시스템은 NFS를 사용합니다.


setenv ipaddr 192.168.0.100
setenv serverip 192.168.0.13


setenv bootargs dwc_otg.lpm_enable=0 console=ttyS0,115200 8250.nr_uarts=1 root=/dev/nfs ip=192.168.0.100:192.168.0.13:::::off nfsroot=/home/dowkim/fs/arm64/rootfs,v3,tcp
(여기서 커널 시리얼 콘솔의 주요 파라미터는 console=ttyS0,115200 8250.nr_uarts=1)


tftp ${kernel_addr_r} Image
(64bit의 경우 압축 안된 이미지 사용)


tftp ${fdt_addr_r} bcm2837-rpi-3-b.dtb
(ttyS0를 사용하려면 bcm2710을 사용하면 안 됨)


booti ${kernel_addr_r} - ${fdt_addr_r}

 

 

라즈베리파이 3B/3B+/4B의 uart 출력
3B의 경우 2와 달리 uart가 bluetooth에 바로 연결이 되어 있습니다.. 이로 인해 약간 복잡한 세팅을 필요로 합니다.
세부적으로 얘기하면 3B의 경우 Full uart와 miniuart 두 가지를 사용할 수 있는데, 기본적으로 Full uart는 bluetooth에 연결되어 있습니다.
따라서, 시리얼을 사용하는 것은 Full uart나 miniuart 두가지 중 하나를 사용한다는 것입니다.

Full uart는 커널에서 ttyAMA0로 miniuart는 ttyS0로 인식하게 됩니다.
여러 가지 버전의 펌웨어와 커널을 64bit 환경에서 테스트해본 결과 ttyAMA0는 문제가 발생하여(커널에서 RX가 안됨) 최종적으로 ttyS0를 serail로 사용하는 방법을 선택했습니다.

이와 관련한 자세한 설명은 아래의 사이트를 참고합니다.
(최신 버전에서는 약간 다른 형태로 세팅을 해야 합니다)
https://arsviator.blogspot.com/2016/08/3-raspberry-pi-3-uartbluetooth-problem.html

 

 

시리얼 converter 사용


시리얼 pin은 그림과 같이 gpio14/15, groud의 3 라인을 연결화고, 변환기는 USB to serial ttl converter를 사용해야 합니다.
(기존 usb serial은 12V 이기 때문에 3.3V로 전압을 다운시켜줄 수 있는 ttl coverter를 사야 한다)
오픈마켓을 검색해 보면 PL2303 또는 cp2102 칩셋을 사용한 제품이 많이 보이는데 본인은 cp2102 칩셋을 이용한 converter를 구매했습니다.

 

 

최종적인 config.txt의 수정

enable_uart=1
arm_64bit=1
dtoverlay=pi3-miniuart-bt
kernel=u-boot.bin

 

 

u-boot 출력 화면

U-Boot 2020.07-rc1-00413-gc5c6576 (May 11 2020 - 17:46:33 +0900)

DRAM:  948 MiB
RPI 3 Model B (0xa22082)
MMC:   mmc@7e202000: 0, mmcnr@7e300000: 1
Loading Environment from FAT... OK
In:    serial
Out:   vidconsole
Err:   vidconsole
Net:   No ethernet found.
starting USB...
Bus usb@7e980000: USB DWC2
scanning bus usb@7e980000 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0
U-Boot>