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.

麻烦TI的工程师帮我解答一些设备树和SD卡启动过程的疑惑

Other Parts Discussed in Thread: AM5728

我们实验室现在使用AM5728这个款CPU,目前自己做了主机板,同时也买了am57xx-beagle-x15的demo板进行参考

一开始就遇到了设备树的问题,因为之前实验室用的2.x的内核,设备树这部分还没有独立出来

现在的问题是:按照官方的SD卡制作方式,做 了个启动SD卡,放在demo板上是可以正常启动的,但是放在我们自己做的主机板上则提示 没有找到合适的设备树:(SD的镜像使用的是  prebuilt-images 目录下的镜像制作的)

No matching DT out of these options:
am57xx-beagle-x15

am572x-idk

am571x-idk
Failed to mount ext2 filesystem...
spl_load_image_ext_os: ext4fs mount err - 0
Failed to mount ext2 filesystem...
spl_load_image_ext: ext4fs mount err – 0

第1个问题:为什么在demo板上可以正常启动,而在我们自己做的主机板上不可以,设备树的信息不是跟镜像一起的么,难道demo板上还存有设备树的核对信息?很是奇怪,想知道设备树在启动过程中核对信息的机制/具体过程是什么。

第2个问题

既然因为设备树起不来,我们进行了首先不使用设备树,先让uboot跑起来,编译时候用没有设备树的参数进行配置,uboot跑起来了,但是系统内核没有跑起来,提示如下:

[    1.929016] ledtrig-cpu: registered to indicate activity on CPUs                                                     
[    1.941589] omap_hwmod: mcasp3: _wait_target_ready failed: -16                                                       
[    1.947458] Unhandled fault: asynchronous external abort (0x1211) at 0x00000000                                      
[    1.947465] ------------[ cut here ]------------                                                                     
[    1.947478] WARNING: CPU: 0 PID: 6 at /home/gtbldadm/processor-sdk-linux-krogoth-build/build-CORTEX_1/arago-tmp-exte)
[    1.947483] 44000000.ocp:L3 Custom Error: MASTER MPU TARGET L4_PER2_P3 (Read): Data Access in User mode during Functs
[    1.947488] Modules linked in:                                                                                       
[    1.947494] CPU: 0 PID: 6 Comm: kworker/u4:0 Not tainted 4.4.19-gdb0b54cdad #1                                       
[    1.947497] Hardware name: Generic DRA74X (Flattened Device Tree)                                                    
[    1.947508] Workqueue: kmmcd mmc_rescan                                                                              
[    1.947512] Backtrace:

中间省略很多行

[    3.063309] [<c06630d0>] (rest_init) from [<c08d3d88>] (start_kernel+0x400/0x40c)                                    
[    3.070819]  r5:c0981000 r4:c0981040                                                                                 
[    3.074428] [<c08d3988>] (start_kernel) from [<80008090>] (0x80008090)                                               
[    3.080980]  r10:00000000 r9:412fc0f2 r8:80007000 r7:c092cb20 r6:c0913a24 r5:c0928484                                
[    3.088879]  r4:c0981214                                                                                             
[    3.091432] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b                         
[    3.091432]

搞了一周没法解决内核启动崩溃的问题(具体log见附件)

于是怀疑是不是设备树的问题,因为细看一下好象是设备树没配置好的问题,于是回到设备树,使用设备树配置文件编译uboot:

ARCH=arm am57xx_evm_defconfig

生成了一下文件:

api drivers LOG snapshot.commit u-boot.dtb

arch dts MAINTAINERS spl u-boot-dtb.bin

board examples MAKEALL System.map u-boot-dtb.img

cmd fs Makefile test u-boot.img

common include MLO TISDK-README u-boot.lds

config.mk Kbuild net tools u-boot.map

configs Kconfig post u-boot u-boot-nodtb.bin

disk lib README u-boot.bin u-boot.srec

doc Licenses scripts u-boot.cfg u-boot.sym

问题3:特别关注红色字体文件,所生成的文件需要可不可以直接考到已制作好的SD卡中,还是需要重新制作一边SD卡?

问题4:所生成的文件和  prebuilt-images 目录下的用法有什么区别,demo板上的设备树能不能直接用在我们主机板上,因为我们主机板是参照demo板做的。

希望工程师们能百忙中解答一下,谢谢。

log_nodt.docx
  • 整个Linux设备树都要移植的啊,现在U-boot可以在你们的板子上跑起来么?

  • uboot可以跑起来的,但是这个uboot是用没有设备树的参数编译后的uboot: 

    ARCH=arm am57xx_evm_nodt_defconfig

    但是使用设备树的参数编译起不来:

    ARCH=arm am57xx_evm_defconfig

    问题是 提示没有合适的设备树错误的机制是什么?

    另外官方有没有设备树移植的相关文档可以参考一下

  • 不知道你们的主板有没有e2prom

    335x系列遇到这个问题,会读取e2prom中写入的板子信息

    和uboot读取到的信息匹配,如果匹配不上就会报上面的错误

    /board/ti/am335x/board.c

    function:

    int board_fit_config_name_match(const char *name)
    335x目前是这样
  • 是的,我们的demo板上有IIC的eeprom,我们的主板上也有eeprom,但是主板上的eeprom烧写过任何的数据

    请问一下你们也是自己做主板么,是怎么把设备树等信息烧写到eeprom里面的,通过uboot么,因为uboot现在是可以起来的

    谢谢您的回复

  • 目前就看了这一个问题

    我是直接在读取eeprom的板子信息的时候,直接强制写成板子的型号,没有真正去读

    如果要写的话,uboot里面不知道是否 有接口,没有的话你们好要自己添加

    匹配到板子型号后,uboot会自己找到设备树的偏移地址,然后选择正确的设备树

    #ifdef CONFIG_SPL_LOAD_FIT
    int board_fit_config_name_match(const char *name)
    {
    	if (board_is_gp_evm() && !strcmp(name, "am335x-evm"))
    		return 0;
    	else if (board_is_bone() && !strcmp(name, "am335x-bone"))
    		return 0;
    	else if (/*board_is_bone_lt() &&*/ !strcmp(name, "am335x-boneblack"))
    		return 0;
    	else if (board_is_evm_sk() && !strcmp(name, "am335x-evmsk"))
    		return 0;
    	else if (board_is_bbg1() && !strcmp(name, "am335x-bonegreen"))
    		return 0;
    	else if (board_is_icev2() && !strcmp(name, "am335x-icev2"))
    		return 0;
    	else
    		return -1;
    }
    #endif
    例如这么修改:
    	else if (/*board_is_bone_lt() &&*/ !strcmp(name, "am335x-boneblack"))
    		return 0;
    就会选择boneblack的加载项
    
    
    别的我也没有看,我们现在也是刚开始做这个平台。
  • 嗯,大概知道了板子信息启动过程中的信息核对流程了,很感谢您的助攻