Carpe diem

raspberry pi firmware download in WSL 본문

SBC 보드/yocto

raspberry pi firmware download in WSL

soons13 2023. 1. 22. 11:35

bitbake를 완료한 후, 펌웨어 이미지를 SD카드에 써야한다.

주로 리눅스에서는 dd커맨드를 사용하는데, meta-raspberrypi 공식문서와 MS공식문서에서는

bmap-tool이라는 것을 사용한다.

https://meta-raspberrypi.readthedocs.io/en/latest/readme.html

https://learn.microsoft.com/ko-kr/azure/iot-hub-device-update/device-update-raspberry-pi

https://www.codeinsideout.com/blog/yocto/raspberry-pi/#build-and-run

 

dd command 등 bmap tool이든 둘 다 USB 장치를 인식해야하는데, 인식이 되지 않는 문제가 있다.

그래서 우선, WSL에서 우선 USB 장치를 인식시키는 방법을 알아보자.

 

WSL에서 USB인식을 지원하는 방법이 아래 MS 공식 문서 에 설명되어 있다.

https://learn.microsoft.com/ko-kr/windows/wsl/connect-usb

 

usbipd-win이라는 오픈소스 프로그램을 설치하고 몇몇 명령을 실행해준다.

usbipd는 usb장치만 연결해줄뿐...

lsusb로는 usb장치가 인식이 되기는 한다.

하지만 저장장치를 블록디바이스로 마운트해주지 않는다...

 

그래서 아래의 공식 문서를 봤으나 되지 않는다..

https://learn.microsoft.com/en-us/windows/wsl/wsl2-mount-disk

 

아래의 우분투 커뮤니티 QnA를 보변, SD카드는 지원되지 않는다고 한다..

https://askubuntu.com/questions/1415310/is-it-possible-to-flash-an-sd-card-with-wsl-ubuntu

 

WSL2 커널은 USB/IP를 지원하지만 대부분의 USB 장치 자체에 대한 드라이버는 포함하지 않습니다. 예를 들어 WSL2 커널 구성 을 보면 MMC(SD 카드) 지원이 포함되어 있지 않음을 알 수 있습니다.

작동한다고 보장할 수는 없지만 최소한 MMC를 지원하는 커널을 컴파일해야 하고 SD 카드 리더 자체의 실제 드라이버도 컴파일해야 합니다.

일반적인 Ubuntu(또는 다른 배포판) 커널에서는 모든 공통 하드웨어 장치를 커널 모듈로 사용할 수 있지만 WSL의 커널은 더 간소화되었습니다.

 

해볼 수 있는 것은..

  • Windows11으로 업데이트 해본다.(이것 역시 안될 가능성이 큼...)
  • 만들어진 이미지를 다른 리눅스 머신에서 write한다..ㅋㅋㅋ
    동작 중인 라즈베리파이에 sd카드를 빼면 안되니,
    다른 SD카드를 꽂은 USB허브를 라즈베리파이에 꽂고 write해도 될듯...

아오...

아직은 WSL 기능이 완벽하게 지원되지 않는듯하다..

 

1. sdcard에 빌드된 image를 복사한다.
아래의 wsl디렉토리의 core-image-base-raspberrypi3-64-xxx.rootfs.wic.bz2파일을\\wsl.localhost\Ubuntu\home\rpi\model3_B\pokey\build\tmp\deploy\raspberrypi3-64\core-image-base-raspberrypi3-64-20230128034249.rootfs.wic.bz2
sdcard에 복사한다.


2. raspberry pi에 image를 복사, dd command로 sdcard에 firmware를 굽는다.
raspberry pi에 usb를 꽂고 lsblk커맨드 입력해서 mount된 디바이스 확인한다.

/dev/sda1이 sdcard로 인식된다.

pi@raspberrypi:~$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 14.5G  0 disk
 - sda1       8:1    1        0 part
mmcblk0     179:0    0 14.7G  0 disk
tqmmcblk0p1 179:1    0  256M  0 part /boot
mqmmcblk0p2 179:2    0 14.5G  0 part /
pi@raspberrypi:~$

sdcard를 mount, 빌드했던 image를 복사, 압축을 풀고 dd  명령으로 sdcard에 이미지를 굽는다.

$ sudo mkdir -p /mnt/sdcard
$ sudo mount -t vfat /dev/sda1 /mnt/sdcard
$ cp /mnt/sdcard/core-image-base-raspberrypi3-64-xxx.rootfs.wic.bz2 ./
$ bzip2 -d -f core-image-base-raspberrypi3-64-xxx.rootfs.wic.bz2
$ sudo dd bs=4M if=core-image-base-raspberrypi3-64-xxx.rootfs.wic of=/dev/sda
$ sync

 

 

그대로 raspberry pi에 sdcard를 꽂고 부팅하면,

bluetooth 로그가 출력되면서 UART로그가 깨져서 출력된다.

bluetooth가 uart0을 사용하는 듯하다.

PC에 sdcard를 꽂고 boot디렉토리의 config.txt에 아래 라인을 추가한다.

dtoverlay=disable-bt

cmdline.txt도 수정해준다.(uart baudrate 수정)

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait    

 

3. raspberry pi 부팅

sdcard를 다시 빼고 raspberrypi에 꽂고 부팅

부팅로그는 나오지 않으나 10초정도(부팅) 기다리면 login 입력창이 나타난다.

root를 입력하면 로그인된다.

부팅로그가 안나오는건 좀더 확인해보자...