저는 베이스보드에 연결되어 Yocto Linux를 실행하는 내장형 "컴퓨터 모듈"인 TS-4900을 사용하고 있습니다. U-Boot를 사용하여 부팅합니다. 이는 백플레인 모델에 따라 부팅할 올바른 dtb 파일을 선택하고, 올바른 파일을 찾을 수 없으면 내 모듈의 "일반" 파일로 돌아갈 수 있습니다.
그러나 올바른 것을 어떻게/어디에서 결정합니까? 어떤 .dtb가 사용되는지 또는 어떤 설정을 사용해야 하는지 어떻게 알 수 있나요?
다음은 U-Boot의 시작 정보입니다.
U-Boot 2014.10-g3ac6ec3 (Jan 29 2015 - 17:20:15)
CPU: Freescale i.MX6SOLO rev1.1 at 792 MHz
Reset cause: POR
Board: TS-4900
Revision: C
Watchdog enabled
I2C: ready
DRAM: 1 GiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
SF: Detected N25Q64 with page size 256 Bytes, erase size 4 KiB, total 8 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: using phy at 7
FEC [PRIME]
Press Ctrl+C to abort autoboot in 1 second(s)
(Re)start USB...
USB0: Port not available.
USB1: USB EHCI 1.00
scanning bus 1 for devices... 2 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
No storage devices, perhaps not 'usb start'ed..?
Booting from the eMMC ...
** File not found /boot/boot.ub **
** File not found /boot/imx6dl-ts4900-13.dtb **
Booting default device tree
42507 bytes read in 196 ms (210.9 KiB/s)
118642 bytes read in 172 ms (672.9 KiB/s)
ICE40 FPGA reloaded successfully
4609784 bytes read in 337 ms (13 MiB/s)
## Booting kernel from Legacy Image at 12000000 ...
Image Name: Linux-3.10.17-1.0.0-technologic+
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4609720 Bytes = 4.4 MiB
Load Address: 10008000
Entry Point: 10008000
Verifying Checksum ... OK
## Flattened Device Tree blob at 18000000
Booting using the fdt blob at 0x18000000
EHCI failed to shut down host controller.
Loading Kernel Image ... OK
Using Device Tree in place at 18000000, end 1800d60a
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
(Kernel startup commences...)
답변1
U-Boot는 부팅 명령을 실행할 때 커널에 메모리 주소를 제공하고 장치 트리 blob에 메모리 주소를 제공합니다. 따라서 이 명령을 실행하기 전에 이러한 파일을 메모리에 로드해야 합니다. 귀하가 제공한 정보에 따르면 eMMC/SD 카드에서 두 개의 파일을 로드할 수 없는 것으로 나타났습니다.
/boot/boot.ub
/boot/imx6dl-ts4900-13.dtb
이러한 파일이 전혀 존재하지 않거나 경로가 잘못되었거나 U-Boot 로드 명령에 잘못된 장치:파티션이 제공되었을 수 있습니다. 그럼에도 불구하고 명령은 실패합니다. 이 시점에서 부트로더는 "기본" 장치 트리(아마도 부트로더 자체와 동일한 미디어에 저장되어 있음)를 로드하려고 시도하는 것으로 보입니다.
무슨 일이 일어나고 있는지 정확히 이해하려면 부트로더에서 부팅 프로세스를 중지하고 U-Boot 명령 프롬프트에 액세스해야 합니다. 여기에서 다음을 입력할 수 있습니다.
printenv
그러면 U-boot 환경 변수가 인쇄됩니다. 이러한 변수 중 다수는 다른 변수를 참조합니다. 이러한 변수 중 일부는 일반적으로 스크립트처럼 실행되므로 시작 스크립트, 커널 및 fdt 로드 스크립트 등을 볼 수 있습니다. 시작 순서를 파악하려면 다음과 같은 변수를 찾으세요.시작 명령(또는 이와 유사한 것). 이것은 일반적으로 시작 시 실행되는 것입니다. 이 시점부터 여러 변수를 통해 시작 순서를 추적해야 하지만 FDT를 메모리에 로드하는 데 load 명령이 사용되는 위치를 확인해야 합니다. 출력을 게시하려면인쇄환경, 여기서 사용된 정확한 논리를 결정할 수 있습니다.
답변2
매우 늦었지만 이 스크립트를 구현했으며 인터넷 검색 엔진을 사용하여 이 스크립트를 찾는 모든 사람을 위해 이 문제를 해결하겠습니다.
컴퓨터 모듈은 거의 모든 기성 TS 또는 맞춤형 기판에 배치할 수 있으며 사용자가 사용된 장치 트리를 조정하지 않고도 자동으로 작동할 수 있기를 바랍니다. 특정 캐리어 보드에는 8개의 입력 시프트 레지스터가 있으며 백플레인에는 고유 ID가 있습니다. TS-8550에서는 0x13입니다. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID
그래서 U-Boot에서는 bbdetect
이 시프트 레지스터에 연결된 GPIO를 읽고 $baseboardid 환경 변수를 설정하는 명령을 추가했습니다. U-Boot는 먼저 /boot/imx6${cpu}-ts4900-${baseboardid}.dtb
. 찾을 수 없으면 위치한 대체 장치 트리를 사용합니다 /boot/imx6${cpu}-ts4900.dtb
. 후자의 파일에는 모든 캐리어 보드에서 작동하는 합리적인 기본값이 있습니다. TS-8550에는 백플레인별 캐리어 보드가 필요하지 않으므로 표준 장치 트리로 돌아가 부팅을 계속합니다.
원래 질문에 답하려면,
cat /proc/device-tree/model
모든 장치 트리는 장치 트리 내에서 약간 다른 모델을 갖습니다.
예를 들어 안전한 대체는 다음과 같습니다.
- "Technologic Systems i.MX6 Quad TS-4900(기본 장치 트리)"
또는 특정 장치 트리가 있는 TS-TPC-8390 캐리어 보드:
- "기술 시스템 i.MX6 쿼드 코어 TS-4900(TS-TPC-8390)"
답변3
이 질문에 적절하게 답변되었는지 확실하지 않습니다. 이미 언급한 대로 printenv를 사용하여 기본 bootcmd를 표시합니다. 이 명령의 시작 부분을 실행하여 부팅 장치에서 데이터를 읽을 수 있지만 아직 실제로 부팅하지는 않습니다.
printenv (예: 다음을 인쇄하세요)
- bootcmd=mmc 정보
- mmc 읽기 90000000 100000 5000
- setenv fdt_high 0xffffffffffffffff;
- bootm 90000000-$(fdtcontroladdr)
- fdtcontroladdr=bffe08d0
예를 들어 내 RISCV 머신에서는 이미지가 다음과 같이 로드됩니다.
- mmc 읽기 90000000 100000 5000
- setenv fdt_high 0xffffffffffffffff
그런 다음 fdt 주소를 설정할 수 있습니다.
- fdt addr(printenv의 fdtcontroladdr 값)
그러면 다음과 같이 할 수 있습니다:
- 빠른 인쇄
안녕하세요, 플랫 디바이스 트리가 종료되었습니다.