사용자:Senouis/오드로이드 고 어드밴스 리눅스 개발

큰숲백과, 나무를 보지 말고 큰 숲을 보라.

이 문서는 하드커널 사의 오드로이드 고 어드밴스 블랙 에디션(ODROID Go Advance Black Edition)에 커스텀 리눅스를 만들어 설치하는 레이어를 구성하려고 시도했던 삽질들(?)의 모음이다.

2024년 1월 ~ 2024년 4월

초기 기획

  • Yocto 같은 툴체인을 사용하도록 meta-odroidgoa를 만든다.
  • LG webOS OSE 1.10.1(build tag 91)을 포팅하는 것을 최종 목표로 삼는다.
    • 2.X부터 최소 램 요구 사항이 4GB 이상이기 때문에, 그런 제약이 덜한 1.x 버전을 포팅해야 함
  • webOSE 공식 빌드 스크립트를 사용하여 2주간 컴팡리
    • 사용한 컴퓨터는 초기에는 RYZEN 5700G(8코어 16스레드) + 64GB RAM 환경으로 하여 작업 속도가 빨랐으나, 가족에게 빌려줄 일이 생겨 RYZEN 5 3550H(4코어 8스레드) + 16GB RAM 환경으로 내려와 작업하면서 개별 빌드 시간이 길어짐
  • JeffyCN의 meta-rockchip 레이어를 결합

결과: 실패

가장 중요한 실패 요인은 U-boot 버전과 Linux 커널 버전이 아예 맞지 않았다는 점이다. 하드커널 사의 오드로이드 고 어드밴스에 대한 공식적인 리눅스 커널 지원 버전은 4.4로, 아무리 세팅을 바꿔보아도 webOS는 물론이고 kirkstone 버전 yocto가 아예 지원하지 않는다. yocto 버전마다 사용 가능한 커널 버전이 있다는 특징을 깨달은 이후, 공식 버전이 아닌 커뮤니티 개발 버전을 탐색하기 시작했다. 또한 내장된 U-boot도 rockchip 사가 한 차례 커스텀한 2017.09 버전에 하드커널 사의 커스텀이 추가로 들어가 있기 때문에, 하드커널 사의 GitHub 리포지토리로 빌드한 U-boot가 아닌, 공식 U-boot 빌드로는 부팅이 되지 않는다. 하지만 Yocto는 공식 U-boot를 사용하며 이 상태로 부팅이 되는 방법이 있다. 최신 U-Boot를 사용하되, SPI 리커버리 기능을 직접 이식하거나 제작하기 전까지 본체 뒷면의 SPI 부팅 우회 버튼을 누르면서 부팅하는 방식으로 테스트한다.

그리고...Rockchip 사에서 만든 자사 SoC용 리눅스 커널을 meta-rockchip 레이어에서 가져오는데, 이게 안드로이드의 커널 빌드 환경에 최적화되어 있어서 전용 빌드 환경을 갖추고 전용 빌드 스크립트를 실행해야 한다. yocto의 기본 빌드 실행 기능인 oe-runmake가 작동하는 방식처럼 단순히 make defconfig -> make all 한다고 작동이 되지 않는다.

여러 모로 봤을 때 yocto 세팅을 하려면 다음 요구사항이 필요하다.

  • 공식 지원이 없으므로, 커뮤니티 기여로 메인라인 커널에 디바이스 트리와 빌드 세팅이 구성된 커널 리포지토리를 찾아야 한다.
  • U-boot는 최신 U-boot를 먼저 사용한 후 하드커널 사가 공개한 2017.09 커스텀 버전 소스 코드의 기능을 이식한다.
  • webOS부터 포팅하려고 하지 말고, poky부터 포팅하자.

대안: meta-odroid

한편, 오드로이드 시리즈에 대한 직접적인 yocto layer가 존재한다. 처음에는 kirkstone 브랜치에 오드로이드 고 어드밴스 세팅은 물론이고, SoC 제조사인 락칩 사의 제품에 대한 설정 자체가 없었기 때문에 관심이 금방 식었으나, 마스터 브랜치에 rk3568 관련 세팅이 추가되면서 rk3326으로 변경 후 백포팅하는 것이 가능할 수도 있겠다는 생각에 다시 활용하기로 하였다.

2024년 4월 ~ 2024년 6월

메인라인 커널 컴파일

  • Travor Woerner가 만드는 다른 meta-rockchip 레이어를 시도함
    • 메인라인 5.10에서 부팅에 필요한 일부 요소만 백포트함

결과: 부팅만 성공

  • UART로 부팅이 되는 것을 확인함
  • 문제는 그 직후 결과물을 날려먹음(...)

2024년 7월: Yocto 외의 다른 대안(Buildroot) 고려

  • 장비의 내장 와이파이 칩과 SPI 플래시가 고장났으며, SD카드로 부팅하는 오프라인 개발만 가정해야 하는 상황이다. 이미 해당 디바이스는 단종된 상태라 장기적인 개발이 어렵다고 판단하여, 남은 시간 동안 다음과 같은 안전장치를 생각했다.
    • qemu를 활용해야 한다. 에뮬레이션 테스트 없이 바로 실장하였을 때 부품에 잘못된 전압이나 데이터가 들어갈 가능성을 생각하지 못했다. 전압 실수는 몰라도 데이터 오염으로 인한 벽돌 문제는 예방할 수 있을 것 같다.
    • 바꿀 장비는 오드로이드 고 울트라로 결정하였다. 다만 오드로이드 고 어드밴스의 사용이 불가능한 것은 아니라, 당장 개발은 어드밴스로 지속할 예정이다.
    • Yocto Layer 제작에 실패할 경우 Buildroot로 전향하여 좀 더 편안한 세팅을 사용할 것이다. yocto에서 바꿔야 할 기본값 세팅이 지금보다 훨씬 많은 것 같아, 컴파일할 패키지 통제가 쉬운 Buildroot가 더 나을 것 같다(하드 용량을 더 적게 잡아 먹는 건 덤이다)

결과

  • Yocto Layer에 대한 커스텀을 추가로 할 수 있을 것 같아, Yocto는 당분간 계속 만질 것이다. 그러나 Yocto의 또 다른 단점인 매우 큰 빌드 결과물 크기(최소 50GB, 보통 100GB에 가까움) 때문에, 선택적 요소를 제외한 빌드를 만들어야 한다.

2024년 10월: OGA BE Tizen 포팅으로 변경하여 재도전

  • 타이젠 포팅으로 변경
  • Hyper-V에서 작업 예정
    • Hyper-V 관리자가 제공하는 우분트 22.04는 하드디스크를 강제로 12GB(...)로 설정하는 문제가 있다. 이곳을 참조하여 하드디스크 크기를 수백 GB 수준으로 늘리자.
  • 개발 환경 설치
    • review.tizen.org에 SSH 접속할 때 오류가 나는 경우 다음과 같이 대처한다.
      • no matching host key type found. Their offer: ssh-rsa 에러는 ~/.ssh/config에 'HostKeyAlgorithms +ssh-rsa'를 추가한다.
      • Permission Denied (publickey) 오류가 뜨고, -vvv 옵션을 주고 접속할 경우 'no mutual signature algorithm' 오류가 뜨는 경우 ~/.ssh/config에 'PubkeyAcceptedKeyTypes +ssh-rsa'를 추가한다.
  • U-Boot와 커널 빌드
    • 기기 제조사인 하드커널의 OGA BE용 U-boot 컴파일 가이드커널 컴파일 가이드를 따른다.
      • U-boot 컴파일 결과인 3개의 이미지와 리눅스 커널 컴파일 결과물인 zImage 및 dtb 파일이 있어야 한다.
    • multiple definition of yylloc 에러가 make 도중 발생하면, gcc 9 및 그 이하 버전을 사용해야 한다.
      • 에러 발생시 먼저 make distclean으로 상위 버전 gcc가 컴파일한 것을 지운다.
      • Ubuntu의 경우 gcc-9, g++-9 설치 후 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 900 & sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 900를 시행한다. 이러면 유일한 대안 gcc로 gcc 버전 9가 선택되므로, yylloc 중복 정의 오류가 사라진다.
    • ARM용 리눅스 커널은 aarch32면 zImage, aarch64 타깃이면 Image가 나온다.
  • Build manifest
    • Base Manifest : 링크
    • SCM인 repo의 설정 조정 필요: base/standard를 .repo/manifest 안에 수동으로 생성
      • repo sync 후 .repo 안의 .gbs.conf에 있는 URL들이 잘못되어 있을 수 있다. 여기에서 적절한 snapshot URL을 찾아 바꿔야 한다.

Raspberry Pi Zero 2 W 추가(예정)