This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/processor-SDK-AM335X:内核启动挂起

Guru**** 2551110 points
Other Parts Discussed in Thread: TPS650250

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/620904/linux-processor-sdk-am335x-kernel-boot-hangs

器件型号:PROCESSOR-SDK-AM335X
主题中讨论的其他器件:TPS650250

工具/软件:Linux

大家好、

我在 AM335x 入门套件板上有一个定制电路板设计、我的定制电路板与 AM335x 入门套件有一些不同、例如:

  • SDRAM:128MB (使用 MT41J64M16)
  • RTC 使用 S35390A
  • 以太网使用 KSZ9021RN
  • PMIC 使用 TPS650250

我使用 的是 ti-processor-sdk-linux-am335x-evm-04.00.04、我可以从 SD 卡自定义 u-boot 和引导(MLO、U-boot)。

但是当我尝试自定义设备树并引导 dtb 文件和 zImage 文件时, 主板会在“正在启动内核...”处挂起,然后重新加载。

终端显示:  

U-Boot SPL 2017.01-00319-g7752743-M脏(2017年8月22日- 15:20:04)

尝试从 MMC1引导
正在读取 uboot.env

**无法从 mmc0:1读取"uboot.env"**
使用默认环境

正在读取 u-boot.img
正在读取 u-boot.img
正在读取 u-boot.img
正在读取 u-boot.img


U-Boot 2017.01-00319-g7752743-M脏(2017年8月22日- 15:20:04 +0700)

CPU:AM335X-GP 修订版2.1
型号:我的定制板
DRAM:128 mib

NAND:0 MIB
MMC:OMAP SD/MMC:0、OMAP SD/MMC:1.
正在读取 uboot.env

**无法从 mmc0:1读取"uboot.env"**
使用默认环境

未设置。 验证第一个电子保险丝 MAC
网络:
无法获取 cpsw: Addr 0的 PHY
CPsw、USB_ether
按任意键停止自动引导:0
切换到分区#0,确定
mmc0是当前器件
在器件0上找到 SD/MMC
正在读取 BOOT.SCR
**无法读取文件 boot.scr **
正在阅读 uEnv.txt
**无法读取文件 uEnv.txt **
切换到分区#0,确定
mmc0是当前器件
正在扫描 MMC 0:1...
读取/am335x-evmsk.dtb
在15ms 内读取33614字节(2.1 MIB/s)
切换到分区#0,确定
mmc0是当前器件
在器件0上找到 SD/MMC
在872ms (4.1 MIB/s)内读取3715536字节
在29ms (1.1 MIB/s)内读取33671字节
###展开的设备树 blob、88000000
使用0x88000000处的 FDT blob 进行引导
正在将设备树加载到8fff4000,结束位置8ff386... 好的

正在启动内核...

当我命令 printenv 时

=>印刷版

arch = ARM
args_mmc=run finduid;setenv bootargs console=${console}${optargets}root=PARTUUID =${uuid}rw rootfstype=${mmcrootfstype}
波特率=115200
电路板=AM335x
Board_name=A335X_SK
Board_rev=1000
boot_a_script=load ${devtype}${devnum}:${distro_bootpart}${scriptaddr}${prefix}${script};source ${scriptaddr}
boot_efi_binary=load ${devtype}${devnum}:${distro_bootpart}${kernel_addr_r}efi/boot/bootarm.EFI;如果 fdt addr ${fdt_addr_r};则 bootefi ${kernel_addr_r}${fdt_dr_addr_r};bootdr}${dr};bootedr}${dr}
boot_extlinux=sysboot ${devtype}${devnum}:${distro_bootpart}任何${scriptaddr}${prefix}extlinux/extlinux.conf
BOOT_FDT=尝试
BOOT_FIT = 0
BOOT_NET_USB_START=USB 启动
boot_nars=//boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_targets=mmc0 legacy_mmc0 mmc1 legacy_mmc1 nand0 PXE DHCP
bootcmd=if test ${boot_fit}-eq 1;然后运行 update_to _fit;fi;运行 findfdt;运行 init_console;运行 envboot;运行 distro bootcmd
bootcmd_dhcp=run boot_net_us_start;如果 DHCP ${scriptaddr}${boot_script_dhcp};则源${scriptaddr};fi;setenv efi_fdtarchfile ${dtatr};if test -z "${dtdt file}"-a -n ${soc ver";${dtv_env_env_env_boardr}${tbt}${tv_enpv_env_env_envr}${tbt};tv_env_adr}${tv_enpv_env_env_env_env_env_env_envr}${tv_env_adr}${tbt f tv_env_env_adr}${tbt f tv_env_env_env_env_env_envr}${tv_env_env_env_env_env_env_env_ else bootefi ${kernel_addr_r}${fdtcontrolladdr};fi;setenv bootp_VCI ${efi_old_vci};setenv bootp_arch ${vci_old_arch};setenv efi_fdtfile;setenv efi_old_arch;setenv efi_old_arch;
bootcmd_legacy_mmc0=setenv mmcdev 0;setenv bootpart 0:2;运行 mmcboot
bootcmd_legacy_mmc1=setenv mmcdev 1;setenv bootpart 1:2;运行 mmcboot
bootcmd_mmc0=setenv devnum 0;运行 MMC_boot
bootcmd_mmc1=setenv devnum 1;运行 MMC_boot
bootcmd_nand=运行 nandboot
bootcmd_PXE=运行 boot_net_usb_start;DHCP;如果 PXE 获得;然后是 PXE 引导;fi
bootcount=2
BOOTDELAY=2
bootdir=/boot
bootenvfile=uEnv.txt
BootFile=zImage
BOOTM_SIZE=0x10000000
bootpart=0:2
bootscript=echo 正在从 MMC${mmcdev}...;源${loadaddr}运行的 bootscript
console=ttyO0、115200n8
CPU=armv7
DFU_alt_INFO_eMMC=rawemmc RAW 0 3751936
dfu_alt_info_mmc=boot part 0 1;rootfs part 0 2;mlo fat 0 1;ml.raw 0x100 0x100;u-boot.img.raw 0x300 0x400;spl-os-args.raw 0x80 0x80;spl-os-image.fat raw 0x900;spl-os-os-gfat 1;fat 0 uEnv.txt
dfu_alt_info_nand=SPL 零件0 1;SPL.Backup1零件0 2;SPL.Backup2零件0 3;SPL.Backup3零件0 4;u-boot 零件0 5;u-boot-spl-OS 零件0 6;内核零件0 8;rootfs 零件0 9
dfu_alt_info_ram=内核 ram 0x80200000 0x4000000;fdt ram 0x80f80000 0x80000;ramdisk ram 0x81000000 0x4000000
distro_bootcmd=用于${boot_targets}中的目标;请运行 bootcmd_${target};完成
EFI_dtb_nefins=//dtb//dtb/current
envboot=MMC dev ${mmcdev};如果 MMC 重新扫描;然后回显在器件${mmcdev}上找到的 SD/MMC;如果运行 loadbootscript;然后运行 bootscript;否则运行 loadbootenv;然后从${bootenvfile}回显已加载的 env;运行 importbootenv;fi;if test -n $uuccmd;然后运行 envenvcmd;envive...
eth1addr=04:A3:16:fb:D5:BD
ethact=cpsw
ethaddr=04:A3:16:fb:D5:bb
FDT_addr_r=0x88000000
fdtaddr=0x88000000
fdtcontrolladdr=85f28818
fdtfile=AM335x-evmsk.dtb
findfdt=if test $board_name = A335BONE;then setenv fdtfile AM335x-bon.dtb;fi;if test $board_name = A335BNLT;then setenv fdtfile AM335x-bonebold.dtb;fi;if tests $board_name = A335bnlbtb;then 文件 AM335btbtb;tbv_env_env_env_dtb;tb 如果 TEST $board_name = A335_ICE;那么 setenv fdtfile AM335x-icev2.dtb;fi;如果 TEST $fdtfile = undefined;则回显警告:无法确定要使用的设备树;fi;
finduuid=part uuid MMC ${bootpart}uuid
fit_bootfile=fitImage
fit_loadaddr=0x87000000
importbootenv=echo 从 MMC${mmcdev}导入环境...;env 导入-t ${loadaddr}${filesize}
init_console=if test $board_name = a335_ice;然后 setenv 控制台 ttyO3、115200n8;否则 setenv 控制台 ttyO0、115200n8;fi;
kernel_addr_r=0x82000000
load_efi_dtb=load ${devtype}${devnum}:${distro_bootpart}${fDT_addr_r}${prefix}${efi_fdtfile}
loadaddr=0x82000000
loadbootenv=fatload MMC ${mmcdev}${loadaddr}${bootenvfile}
loadbootscript=load MMC ${mmcdev}${loadaddr}boot.scr
loadfdt=load ${devtype}${bootpart}${fdtaddr}${bootdir}/${fdtfile}
loadfit=run args_mmc;bootm ${loadaddr}#${fdtfile};
loadimage=load ${devtype}${bootpart}${loadaddr}${bootdir}/${bootfile}
loadramdisk=load MMC ${mmcdev}${rdaddr}ramdisk.gz
MMC_BOOT=if MMC dev ${devnum};然后 setenv devtype MMC;运行 scan_dev_for_boot_part;fi
mmcboot=MMC dev ${mmcdev};setenv devnum ${mmcdev};setenv devtype MMC;如果 MMC 重新扫描;然后回显在器件${mmcdev}上找到的 SD/MMC;如果运行 loadimage;然后测试${boot_fit}-eq 1;然后运行 loadfit;否则运行 mmcovados;fi;fi;
mmcdev=0
mmclosados=run args_mmc;如果测试${boot_FDT}= yes ||测试${boot_FDT}=试用;如果运行 loadfdt;则 bootz ${loadaddr}-${fdtaddr};否则测试${boot_FDT}=试用;然后 bootz;否则、回显警告:无法加载 bootz;否则;fi;
mmcrootfstype=ext4 rootwait
mtdds=nand0=nand.0
mtdparts=mtdparts=nand.0:128k (NAND.SPL)、128k (NAND.NANT.Backup1)、128k (NAND.NANT.Backup2)、128k (NAND.NANT.Backup3)、256k (NAND.u-boot-OS)、SPL (NAND.U-boot)、128k (NAND-Boot)、128m (NAND-Boot)、8m (NAND-1m (NAND-Boot)、ENU.v-v-boot)、128k (v-v-v-back1)、/v-kernel.enu.enu.enu.1
nandargs=setenv bootargs console=${console}${optargets}root=${nandroot}rootfstypy=${nandrootfstype}
nandboot=echo Booting from nand ...;运行 nandargs;nand read ${fdtaddr}nand.u-boot-spl-OS;nand read ${loadaddr}NAND.kernel;bootz ${loadaddr}-${fdtaddr}
nandroot=ubi0:rootfs rw ubi.mtd=NAND.file-system、2048
nandrootfstype=ubifs rootwait=1
netargs=setenv bootargs console=${console}${optargets}root=/dev/nfs nfsroot=${serverip}:${rootpath}、${nfsopts}RW IP=DHCP
netboot=echo Booting from network...;setenv autoload no;dhcp;run netloadimage;run netloadfdt; 运行 netargs;bootz ${loadaddr}-${fdtaddr}
netloadfdt=tftp ${fdtaddr}${fdtfile}
netloadimage=tftp ${loadaddr}${bootfile}
nfsopts=nolock
partitions=uuid_disk=${uid_gppt_disk};name=rootfs、start=2MiB、size=-、uid=${uid_gppt_rootfs}
pxefile_addr_r=0x80100000
ramargs=setenv bootargs console=${console}${optargets}root=${ramroot}rootfstypy=${ramrootfstype}
ramboot=echo 从 ramdisk 引导...;运行 ramargs;bootz ${loadaddr}${rdaddr}${fdtaddr}
ramdisk_addr_r=0x88080000
ramroot=/dev/ram0 rw
ramrootfstype=ext2
读数地址= 0x88080000
rootpath=/export/rootfs
scan_dev_for_boot=echo 扫描${devtype}${devnum}:${distro_bootpart}...;用于${boot_drefix}中的前缀;运行 scan_dev_for_extlinux;运行 scan_dev_for_scripts;完成;运行 scan_dev_for_EFI;
scan_dev_for_boot_part=part list ${devtype}${devnum}-bootable devplist;env 存在 devplist || setenv devplist 1;对于${devplist}中的 DISTR_BOOTpart;如果 fstype ${devtype}${devfi}:${distro_bootpart}、则执行;然后针对 boot_bootn_bootnum 执行
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile};如果测试-z "${fdtfile}"-a -n "${soc}";然后设置 env efi_fdtfile ${soc}-${boardver}${dtv 文件前缀;fi_bootstro}${pedtb};如果已找到 EFI 文件、则为${prefix_dipot_boot_bootstart;${prefix ${prefix}/emi 文件${prefix:/edex}${prefix;/fue_bootstepi 文件${prefix;}ped/emi 文件:${ped/emi 文件;prefix 文件${prefixed/ed/ed/ed/emi 文件: fi; setenv efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype}${devnum}:${distro_bootpart}${prefix}extlinux/extlinux.conf;然后回显找到${prefix}extlinux/extlinux.conf;运行 boot_extlinux;回显脚本失败:继续...;fi
scan_dev_for_scripts=用于${boot_scripts}中的脚本;如果测试-e ${devtype}${devnum}:${distro_bootpart}${prefix}${script}、则执行;然后回显找到的 U-Boot 脚本${prefix}${prefix}${prefix}${prefix};运行 boot_a_script;回显脚本失败:继续...;完成
脚本地址=0x80000000
SoC=am33xx
args=setenv bootargs console=${console}${optargets}root=${spiroot}spifstypy=${rootrootfstype}
spiboot=echo Booting from SPI ...;运行 spiargs;SF 探测器${spibusno}:0;SF 读取${loadaddr}${spisrcadr}${spiimgsize};bootz ${loadaddr}
spibusno=0
spiimgsize=0x362000
spiroot=/dev/mtdblock4 rw
rootspifstype=jffs2.
spisrcaddr=0xe0000
static_ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off
stderr=串行@44e09000
stdin =串行@44e09000
stdout=串行@44e09000
update_TO_fit=setenv loadaddr ${fit_loadaddr};setenv 引导文件${fit_bootfile}
USB_boot=USB start;如果 USB dev ${devnum};则 setenv devtype USB;运行 scan_dev_for_boot_part;fi
USBnet_devaddr=04:A3:16:fb:D5:bb
供应商= TI
ver = U-Boot 2017.01-00319-g7752743-sm脏(2017年8月22日- 15:20:04 +0700)

环境大小:9110/131068字节

有人能帮我吗、我真的需要你们的帮助、谢谢你们。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Biser 先生
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Nguyen、

    请参阅以下主题:
    e2e.ti.com/.../609626
    e2e.ti.com/.../2231166

    此致、
    Kemal
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Kemal、感谢您的回复。
    我了解问题属于器件树、
    但是您可以告诉我内核检查 dtb 文件中的函数、因为我想设置断点(使用 printk()...) 要调试此问题、谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kemal、
    我尝试调试内核代码、内核挂起在(/driver/of/fdt.c)中的:__unflaten_device_tree ()函数中、您能给我解释一下这个问题吗?谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /**
    * unflaten_device_tree -从 flat blob 创建 device_node 的树
    *
    展开由固件传递的设备树,创建
    struct device_node 的*树。 它还填充
    节点的"name"和"type"*指针、以便
    可以使用正常的器件树行走函数*。
    //
    void __init unflatten_device_tree (void)
    {
    __unflatten_device_tree (initial_boot_params、NULL、&for_root、
    earn_init_dt_alloc_memory_arch、false);
    
    /*获取指向“/选定”和“/别名”节点的指针,以便在任何地方使用*/
    of _alias_scan (earn_init_dt_alloc_memory_arch);
    } 

    我建议您创建一个具有少量节点的设备树、然后逐个添加其他节点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kemal、
    进入函数__unflaten_device_tree ()内核挂起在函数:PR_DEBUG ("Un展 设备树:\n");

    PR_DEBUG ("取消合并设备树:\n");
    PR_DEBUG ("magic:%08x\n"、FDT_magic (blob));
    PR_DEBUG ("大小:%08x\n"、FDT_totalsize (blob));
    PR_DEBUG ("版本:%08x\n"、FDT_VERSION (blob));

    这意味着内核无法获得 dtb 标头(magic、totalsize、version、...),但在 u-boot 命令中,我可以获得它

    => FDT addr 88000000
    => FDT 接头
    魔术:0xd00dfeed
    总大小:0x8387 (33671)
    OFF_dt 结构:0x38
    OFF_dt_string:0x7c84
    OFF_mem_rsvmap:0x28
    版本:17.
    LAST_COMP_VERSION:16.
    BOOT_CPUID _ PHY:0x0
    size_dt_strings:0x703
    size_dt_struct:0x7c4c
    数字 mem_RSV:0x0

    我的主板使用128MB SDRAM、您认为问题出在哪里?