지난 글에서 교차개발환경 준비하고
부트로더, 커널 소스를 옮겨놨으니 이걸로 빌드를 하자
mywork 디렉토리에서 bootloader.tar.gz를 풀고 들어가면 이런식으로 나온다.
부트로더로 U-boot를 쓰는데
이전 글에 환경변수로 ARCH, CROSS_COMPILE 등록했고
U-Boot 빌드 과정은 이렇다고한다.
1. 부트로더 초기화
- make clean
- make distclean : 기존의 오브젝트와 설정들을 삭제하고, 초기상태로 만듬
2. 설정
- make menuconfig : Kconfig들을 참조해 설정 정보들이 GUI 화면으로 나오고 설정한 결과가 .config로 나온다.
- make Kconfig
- make defconfig : 타겟 플랫폼에 맞게 빌드하려면 설정할게 많다보니 아키텍처에 맞게 미리 설정해둔거
3. 컴파일
- make
다 이전에 임베디드 자료 정리하면서 한두번 본내용이지만 다잊었다.
부트로더 설정 정리
각 모듈별 설정이 kconfig
전체 부트로더 설정은 menuconfig
-> 각 Kconfig들을 참조하여 make menuconfig 한 결과가 .config
기본값으로 설정된 설정 파일이 defconfig(default configuration)
make하면 .config를 참고해 autoconf.h가 생성
defconfig로 .config 만들기
bootloader/configs에 hybus_embedq6_defconfig가 있는데
이걸 make 해주면 .config가 나온다.
make로 컴파일 하면 쭉 진행된다.
빌드가 끝나면
현 디렉토리에 u-boot 관련 바이너리들이 만들어졌다.
여기서 필요한건 u-boot-dtb.imx로 부트로더와 커널 연결역활로 유부트가 커널에 전달할 플랫폼정보를 담았다고한다.
make 전 디렉토리 내 리스트
커널 빌드
지금 사용할 임베디드 보드에 맞는 부트로더를 준비했으니
이제 커널을 빌드할 차례 압축을 풀고 설정하자
빌드하기전에 이번에도 커널 설정
1. 커널 초기화
- make clean
- make distclean
2. 커널 설정
- make menuconfig
- make Kconfig
- make defconfig
3. 컴파일
설정 내용이야 부트로더 때랑 똑같으니
아까처럼
distclean 한후
defconfig를 메이크 해주자.
빠른 빌드를 위해 -j4 옵션을 주고 메이크
조금 시간이 걸리긴 하지만
다끝나면 arch/arm/boot에 zImage가 생겼다.
커널 디바이스 트리
이게 뭔진 잘 모르겠지만 외부 확장 장치가 다양하니 설정도 복잡해서,
각 디바이스들의 모든 정보를 바이너리로 저장하고 부팅 시
이를 읽어와 하드웨어 초기화에 필요한 정보들을 파싱하는데 쓰는 거라 한다.
이 디바이스 트리 dtb(Device Tree Blob/Binary) 파일은
DTS(Device Tree Script/Source) 파일이 DTSI(Device Tree Source Include)를 참조, 디바이스 트리 컴파일러 DTC로 만든다고한다.
디바이스 트리 관련 파일로 바이너리는 .dtb, 소스는 .dts, 소스 인클루드는 .dtsi
이 임베디드 보드의 디바이스 트리는
현경로의 dts 폴더에 있다.
지금까지 부트로더와 커널을 빌드했는데
원래 BSP에서 친절하게 리눅스 시스템 이미지 설치에 필요한 부트로더, 커널, 파일시스템을 모아서 제공하고 있었다.
부트로더 u-boot-dtb.imx
커널 zImage, imx6q-sabresd-ldo.dtb
파일시스템 filesystem.tar.bz2
이것들을 OTG 포트로 플래쉬할수 있도록
AP 개발업체인 NXP에서 MFGTools를 만들었는데 이걸 쓰면된다고한다.
근데 bsp 에 포함된 mfgtool이 실행이 안된다.
ModuleID[2] LevelID[1]: Error: Can't find the specified list(SDCard-Android) in the xml file
ModuleID[2] LevelID[1]: Parse ucl script failed, error code: 12
읽어보면 xml파일에서 SDCard-Android 리스트가 없다고 하는데
구글링해보니 이 list 머씨기가 ucl2.xml(프로파일즈/리눅스/OS펌웨어)에 있다고한다.
https://community.nxp.com/t5/i-MX-Processors/i-MX6ULL-mfgTool-error-12/m-p/806124
이 파일이 뭐하는건진 잘 모르겠지만 리눅스, 안드로이드로 쓰는지에 따라 설정하는 내용같은데
에러 로그에서 나온 SDCard-Android는 없고 H-EMbed-TKU 뭐시기가 안드로이드, 리눅스, 리눅스-WOFS 3개 뿐이더라.
뭐가 뭔지 모르겠지만 리눅스 커널을 쓸거니
H-EMbed-TKU-SD-Linux로 리스트 설정(cfg.ini)해서 실행해보면
이번엔 디바이스트리 imx를 여는데 에러가떳다
DLL version: 2.6.2
Friday, September 16, 2022 18:50:19 Start new logging
ModuleID[2] LevelID[1]: Push command--file C:\Users\jdo\Desktop\04.MFGTools\Profiles\Linux\OS Firmware\files\Linux\u-boot-dtb.imx failed to open.errcode is 2
ModuleID[2] LevelID[1]: Parse ucl script failed, error code: 4
해당경로를 보니 텅비어있어서그런거같고,
아까 준비된 파일을 옮겨서 다시실행하면
이번엔 z이미지가 없다고 안된다.
DLL version: 2.6.2
Friday, September 16, 2022 18:52:08 Start new logging
ModuleID[2] LevelID[1]: Push command--file C:\Users\jdo\Desktop\04.MFGTools\Profiles\Linux\OS Firmware\files\Linux\zImage failed to open.errcode is 2
ModuleID[2] LevelID[1]: Parse ucl script failed, error code: 4
옮기고 실행하면
또안되니 그냥 아까 파일 4개 다옮기고다시실행하면
DLL version: 2.6.2
Friday, September 16, 2022 18:52:45 Start new logging
ModuleID[2] LevelID[1]: Push command--file C:\Users\jdo\Desktop\04.MFGTools\Profiles\Linux\OS Firmware\files\Linux\imx6q-sabresd-ldo.dtb failed to open.errcode is 2
ModuleID[2] LevelID[1]: Parse ucl script failed, error code: 4
이제서야 실행된다.
헤매고 나서야 알았는데
이 위치에 옮기라고 책에 나와있었다.
USB-OTG와 전원 케이블 연결하고..
잘안보이지만 SD카드가 이미꽂혀있다.
개발 보드 커널 설치
- 부트 모드로 부트 ROM에 접근해 이미지 플래쉬.
- 부드모드 진입 : BOOT MODE 버튼 누른 채 파워 온
하면 인식한다.
중간에 갑자기 no device connected 떠서 놀랐는데 기다리니 쭉진행한다.
부팅 설정하기
이 보드는 SD 장치와 eMMC 를 제공하는데 SD에 리눅스를, emmc서 안드로이드를 부팅하는거같고
중간에 있는 스위치로 boot config를 설정하면 sd로 부팅할지, emmc로 부팅할지 설정하는거라고한다.
리눅스, 안드로이드 부팅시 이렇게 설정한다.
좀 걸리긴 했는데 Done
'컴퓨터과학 > 임베디드' 카테고리의 다른 글
임베디드실습 - 1. 개발환경 구축 (0) | 2022.09.16 |
---|---|
아두이노회로만들기 - 7. I2C, UART, SPI (0) | 2022.09.15 |
아두이노회로만들기 - 6. 통신과 적외선 센서, 라인트레이서 만들기 (0) | 2022.09.08 |
조금씩 임베디드 - 11. 임베디드 정리자료 (0) | 2022.08.31 |
아두이노회로만들기 - 5. L298N DC 모터드라이버 (0) | 2022.08.25 |