BeagleBone Black에서 Falcon 모드를 활성화하려고 할 때 U-Boot 오류가 발생합니다.

BeagleBone Black에서 Falcon 모드를 활성화하려고 할 때 U-Boot 오류가 발생합니다.

BeagleBone Black에서 Falcon 모드를 활성화하는 데 문제가 있습니다. 작동 중인 U-Boot(v2019.04) 및 Linux(Debian 11.5, 커널 v5.15.65-bone-rt-r30)가 있지만 지금까지 Falcon 모드를 성공적으로 활성화하지 못했습니다. 여러 가지 오류가 발생했습니다. 첫 번째는 환경을 보호하려고 할 때입니다.

=> saveenv
Saving Environment to EXT4...
** Unable to use mmc 0:1 for saveenv **
Failed (1)

두 번째는 SPL을 내보내려고 할 때입니다. uImage 헤더를 올바르게 읽습니다.

=> spl export fdt ${loadaddr} - ${fdtaddr}
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   Linux kernel
   Created:      2022-10-26  17:38:41 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    9880064 Bytes = 9.4 MiB
   Load Address: 80008000
   Entry Point:  80008000

그러나 체크섬 오류가 발생하고 프로세스를 완료하지 못합니다.

   Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
   XIP Invalid Image ... OK
data abort

다음은 전체 U-Boot 콘솔 로그입니다.

CPU  : AM335X-GP rev 2.1
I2C:   ready
DRAM:  512 MiB
No match for driver 'omap_hsmmc'
No match for driver 'omap_hsmmc'
Some drivers were not found
Reset Source: Global external warm reset has occurred.
Reset Source: Global warm SW reset has occurred.
Reset Source: Power-on reset has occurred.
RTC 32KCLK Source: External.
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
Loading Environment from EXT4...
** Unable to use mmc 0:1 for loading the env **
Board: BeagleBone Black
<ethaddr> not set. Validating first E-fuse MAC
BeagleBone Black:
Model: BeagleBone Black Industrial:
BeagleBone Cape EEPROM: no EEPROM at address: 0x54
BeagleBone Cape EEPROM: no EEPROM at address: 0x55
BeagleBone Cape EEPROM: no EEPROM at address: 0x56
BeagleBone Cape EEPROM: no EEPROM at address: 0x57
Net:   eth0: MII MODE
cpsw, usb_ether
Press SPACE to abort autoboot in 2 seconds
=>
=> setenv args_mmc 'setenv bootargs console=${console} ${optargs} root=/dev/mmcblk0p1 ro rootfstype=${mmcrootfstype}'
=> setenv loadfdt 'mmc read ${fdtaddr} 80 180'
=> setenv loadimage 'mmc read ${loadaddr} 900 2000'
=> setenv bootcmd 'run args_mmc; run loadfdt; run loadimage; bootm ${loadaddr} - ${fdtaddr}'
=> saveenv
Saving Environment to EXT4...
** Unable to use mmc 0:1 for saveenv **
Failed (1)
=> run args_mmc
=> run loadimage

MMC read: dev # 0, block # 2304, count 8192 ... 8192 blocks read: OK
=> run loadfdt

MMC read: dev # 0, block # 128, count 384 ... 384 blocks read: OK
=> spl export fdt ${loadaddr} - ${fdtaddr}
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   Linux kernel
   Created:      2022-10-26  17:38:41 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    9880064 Bytes = 9.4 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
   XIP Invalid Image ... OK
data abort
pc : [<9ff91558>]          lr : [<9ff6d2fd>]
reloc pc : [<80838558>]    lr : [<808142fd>]
sp : 9df38b88  ip : 00000000     fp : 00000006
r10: 00000003  r9 : 9df38eb8     r8 : 9df38c6c
r7 : 00000000  r6 : 9ffc0238     r5 : 00000000  r4 : 00000000
r3 : 00000020  r2 : 00000000     r1 : 00000000  r0 : 00000000
Flags: Nzcv  IRQs off  FIQs on  Mode SVC_32
Code: f7fe2000 2800fc91 e7f4d0ed 9ff9f6a8 (4a106803)
Resetting CPU ...

resetting ...

튜토리얼을 따라하고 있어요https://embetrix.com/2017/05/07/fast-boot-linux-with-u-boot-falcon-mode/(Ubuntu 서버에서 모든 것을 컴파일하고 Debian의 BeagleBone Black에서 SD 카드에 직접 썼다는 점을 제외하면 Yocto에서 5개의 "부분" 명령이 포함된 부분을 건너뛰었습니다. 문제가 아니기를 바랍니다.) 가능합니다. 튜토리얼이나 내 환경 어딘가에 버그가 있다는 것입니다. 커널을 읽는 데 시간 초과 문제가 있거나 장치 트리 파일이 잘못되었을 수 있습니다. 작동 중인 zImage에서 uImage를 생성했는데 uImage 헤더가 올바르게 읽혀지고 있어 문제가 무엇인지 잘 모르겠습니다. 어떤 도움이라도 대단히 감사하겠습니다.

편집: 아래 제안된 대로 더 이상 EXT4 파일 시스템을 사용하지 않도록 구성을 변경했습니다. 이제 내 환경 변수가 저장되었습니다. 정말 좋습니다! 불행하게도 커널 체크섬 문제가 여전히 존재합니다. 현재 U-Boot 로그는 다음과 같습니다.

U-Boot SPL 2022.04 (Nov 03 2022 - 11:40:28 -0400)
Trying to boot from MMC2


U-Boot 2022.04 (Nov 03 2022 - 11:40:28 -0400)

CPU : AM335X-GP rev 2.1
Model: TI AM335x BeagleBone Black
DRAM: 512 MiB
Reset Source: Power-on reset has occurred.
RTC 32KCLK Source: External.
Core: 150 devices, 14 uclasses, devicetree: separate
WDT: Started wdt@44e35000 with servicing (60s timeout)
MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment

Board: BeagleBone Black
<ethaddr> not set. Validating first E-fuse MAC
BeagleBone Black:
Model: BeagleBone Black Industrial:
BeagleBone Cape EEPROM: no EEPROM at address: 0x54
BeagleBone Cape EEPROM: no EEPROM at address: 0x55
BeagleBone Cape EEPROM: no EEPROM at address: 0x56
BeagleBone Cape EEPROM: no EEPROM at address: 0x57
Net: Could not get PHY for ethernet@4a100000: addr 0
eth2: ethernet@4a100000, eth3: usb_ether
Press SPACE to abort autoboot in 0 seconds
=> setenv args_mmc 'setenv bootargs console=${console} ${optargs} root=/dev/mmcblk0p1 ro rootfstype=${mmcrootfstype}'
=> setenv loadfdt 'mmc read ${fdtaddr} 80 180'
=> setenv loadimage 'mmc read ${loadaddr} 900 2000'
=> setenv bootcmd 'run args_mmc; run loadfdt; run loadimage; bootm ${loadaddr} - ${fdtaddr}'
=> saveenv
Saving Environment to MMC... Writing to redundant MMC(0)... OK
=> run args_mmc
=> run loadimage

MMC read: dev # 0, block # 2304, count 8192 ... 8192 blocks read: OK
=> run loadfdt

MMC read: dev # 0, block # 128, count 384 ... 384 blocks read: OK
=> spl export fdt ${loadaddr} - ${fdtaddr}
## Booting kernel from Legacy Image at 82000000 ...
Image Name: Linux kernel
Created: 2022-10-26 17:38:41 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 9880064 Bytes = 9.4 MiB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
XIP Invalid Image
data abort
pc : [<9ffa9fe8>] lr : [<9ff6bfa9>]
reloc pc : [<80843fe8>] lr : [<80805fa9>]
sp : 9df30e08 ip : 00000000 fp : 00000020
r10: 00000003 r9 : 9df45eb0 r8 : 9df30f04
r7 : 00000000 r6 : 9ffe3b1c r5 : 00000000 r4 : 00000000
r3 : edfe0dd0 r2 : 00000003 r1 : 00000000 r0 : 00000000
Flags: nzCv IRQs off FIQs on Mode SVC_32 (T)
Code: bfef 0000 b510 4b24 (6801) 4602
Resetting CPU ...

resetting ...

답변1

  1. SD 카드의 블록 크기는 얼마입니까? 512바이트는 확실히 너무 작습니다. 1kByte에서도 로드한 8192 블록은 9.4MiB 커널 이미지에 맞을 만큼 크지 않으므로 부분적으로 로드된 이미지에는 잘못된 CRC가 있습니다. 예를 들어 블록 크기가 512바이트인 경우 약 setenv loadimage 'mmc read ${loadaddr} 900 4C00'.
  2. root=/dev/mmcblk0p1이 문제를 해결하면 파일 시스템이 없는 파티션을 루트 파일 시스템으로 사용하는 명령줄에서 다음 문제가 발생합니다.

ext4가 튜토리얼에 적합하다면 ext4를 사용하는 것이 더 나을 수도 있습니다. 원시 파티션을 사용하는 것이 더 빠르지만 추가적인 함정이 많이 있습니다.

답변2

이 U-Boot 명령에 4.19MB를 읽는 오류가 있는 것으로 나타났습니다.

setenv loadimage 'mmc read ${loadaddr} 900 2000'

내 이미지는 9.65MB이므로(따라서 튜토리얼에서 사용된 이미지보다 훨씬 큽니다) 다음과 같아야 합니다.

setenv loadimage 'mmc read ${loadaddr} 900 8000'

16.8MB로 커널을 위한 충분한 공간입니다. 이제 팔콘 모드가 활성화되었습니다. 당신의 도움을 주셔서 감사합니다!

관련 정보