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-processor-sdk-linux-am335x-evm-03.02.00.05编译后u-boot无法启动的问题

Other Parts Discussed in Thread: AM3352

大家好,我最近刚着手使用AM3352开发自己的设备,下载的SDK包版本为ti-processor-sdk-linux-am335x-evm-03.02.00.05,我将u-boot编译完成后把MLO和u-boot.img文件下载到SD卡拿到板子运行后发现就打印了几个CCCC字符,然后就停住了!但是我使用01.00版本的u-boot就可以正常运行,最起码能够打印uboot的版本等信息,为什么03.02版本就不行呢?是需要什么特殊配置么?

我使用了下面两种编译方式:

1、在ti-processor-sdk-linux-am335x-evm-03.02.00.05执行make u-boot_clean、make u-boot

2、在u-boot目录执行:make CROSS_COMPILE=arm-linux-gnueabihf- O=am335x_evm am335x_evm_config all

然而都不能运行,请问问题出在哪里?

我看下面这两位工程师(www.deyisupport.com/.../357475.aspxe2e.ti.com/.../1974457)都遇到了同样的问题,但是在论坛里没看到最终解决方案

  • 说明一下:sdk包自带的prebuild下的MLO和u-boot也同样无法运行,但是老版本的就运行正常
  • 我的就是从这个版本编译的,加了一些调试信息,你下载后解压,里面有MLO和u-boot.img,把他们放在你的SD卡的boot分区,看一下会有什么打印出来

  • 谢谢Eggsy Pang !你的镜像我下载后可以启动并有打印信息输出,输出如下:但是为什么我自己编译的就没反应呢?就连SDK包自带的prebuild下面的MLO和u-boot.img也不能运行!编译的时候需要先进行什么配置或者修改么?

    CONFIG_BAUDRATE: 1c200

    U-Boot SPL 2016.05-00118-gabc6b2a-dirty (Mar 07 2017 - 02:25:03)
    void s_init(void)
     DEFAULT_UART_BASE in 0x44e09000
    reading uart1 rx address = 0x00000037
    reading uart1 tx address = 0x00000037
    gd in 40303880  CONFIG_SYS_INIT_SP_ADDR in 0x4030ff20
    rtc32k_enable();
    reading core clksel address = 0x0003e817
    reading MPU clksel address = 0x0003e817
    reading DDR clksel address = 0x00000000
    reading Per clksel address = 0x0403c017
    CONFIG_BAUDRATE: 1c200

    U-Boot SPL 2016.05-00118-gabc6b2a-dirty (Mar 07 2017 - 02:25:03)
    CONFIG_SYS_INIT_SP_ADDR in 0x4030ff20
    ,gd in 4030fa40  CONFIG_SYS_INIT_SP_ADDR in 0x4030ff20
    CONFIG_BAUDRATE: 1c200

    U-Boot SPL 2016.05-00118-gabc6b2a-dirty (Mar 07 2017 - 02:25:03)
    core frequency :50
     eeprom test
     No ready ,TI_DEAD_EEPROM_MAGIC is 0xadead12c
    Could not get board ID.
    reading core clksel address = 0x00003217
    reading MPU clksel address = 0x00012c17
    reading DDR clksel address = 0x00010a17
    reading Per clksel address = 0x0403c017
     eeprom test
     No ready ,TI_DEAD_EEPROM_MAGIC is 0xadead12c
    Could not get board ID.

  • 我的连U-Boot SPL 2016.05-00118-gabc6b2a-dirty (Mar 07 2017 - 02:25:03)这一步都没跑到

  • 不用什么配置,

    No ready ,TI_DEAD_EEPROM_MAGIC is 0xadead12c
    Could not get board ID.

    从打印信息可以看到你的板子EEPROM有问题,不知道你的板子是否有EEPROM,MLO 和uboot是根据EEPROM读出板子内容来初始化板子的外设,时钟PLL DDR的,如果没有EEPROM要修改代码:

    在uboot下board/ti/am335x/board.c 找到read_eeprom这个函数,获取你的板子信息

  • 我的板子没有EEPROM,这个问题我倒是知道怎么解决,但是现在关键的问题是我的MLO放进去之后没有任何打印信息,连U-Boot版本相关的信息U-Boot SPL 2014.07-gfb6ab76 (Jul 06 2015 - 16:00:22))这句话都没打印,看样子就是串口初始化都没初始化起来,我自己在里面加了点打印信息也打印不出来,或者根本就没执行到打印U-Boot版本这个地方!!!

    我用ti-processor-sdk-linux-am335x-evm-01.00.00.03-Linux-x86-Install.bin安装后可以打印“U-Boot SPL 2014.07-gfb6ab76 (Jul 06 2015 - 16:00:22)”,如下:

    U-Boot SPL 2014.07-gfb6ab76 (Jul 06 2015 - 16:00:22)
    Incorrect magic number (0xffffffff) in EEPROM
    Could not get board ID.
    Incorrect magic number (0xffffffff) in EEPROM
    Could not get board ID.
    Unknown board, cannot configure pinmux.### ERROR ### Please RESET the board ###

  • 而且只有ti-processor-sdk-linux-am335x-evm-01.00.00.03-Linux-x86-Install在32位Ubuntu下安装后prebuid下的镜像可以运行,试了ti-processor-sdk-linux-am335x-evm-02.00.00.00-Linux-x86-Install、ti-processor-sdk-linux-am335x-evm-03.00.00.04-Linux-x86-Install在64位Ubuntu下安装后也都不行!!!

  • 我上传的MLO和Uboot就是从ti-processor-sdk-linux-am335x-evm-03.00.00.04-Linux-x86-Install编译的啊,只不过我自己加了一点调试信息,改了一些代码,很早初始化Uart,所以MLO很早就可以打印信息

  • 我知道你的问题所在了,我帮你跟踪一下代码,在这个版本代码中,因为read_eeprom这个函数执行前,uart使能函数preloader_console_init()在后,所以板子还到达不了打印这个信息的时候就已经挂在eeprom了,你可以看下源码就发现了

  • OK了!多谢!

    新版本中把board/ti/am335x/board.c 里面read_eeprom这个函数去掉了,换成了do_board_detect,而相关函数是在comm/board_detect.c里实现!

  • 是的,没错,这样应该可以boot起来了

  • 你好,我的是卡在这里了

    CONFIG_BAUDRATE: 1c200

    U-Boot SPL 2016.05-00118-gabc6b2a-dirty (Mar 07 2017 - 02:25:03)
    void s_init(void)
    DEFAULT_UART_BASE in 0x44e09000
    reading uart1 rx address = 0x00000037
    reading uart1 tx address = 0x00000037
    gd in 40303880 CONFIG_SYS_INIT_SP_ADDR in 0x4030ff20
    rtc32k_enable();
    reading core clksel address = 0x0003e818
    reading MPU clksel address = 0x0003e818
    reading DDR clksel address = 0x00000000
    reading Per clksel address = 0x0403c018
    CONFIG_BAUDRATE: 1c200

    U-Boot SPL 2016.05-00118-gabc6b2a-dirty (Mar 07 2017 - 02:25:03)
    CONFIG_SYS_INIT_SP_ADDR in 0x4030ff20
    ,gd in 4030fa40 CONFIG_SYS_INIT_SP_ADDR in 0x4030ff20
    CONFIG_BAUDRATE: 1c200

    U-Boot SPL 2016.05-00118-gabc6b2a-dirty (Mar 07 2017 - 02:25:03)
    core frequency :50
    eeprom test
    No ready ,TI_DEAD_EEPROM_MAGIC is 0xadead12c
    reading core clksel address = 0x00003217
    reading MPU clksel address = 0x00012c17
    reading DDR clksel address = 0x00010a17
    reading Per clksel address = 0x0403c017
    eeprom test
    No ready ,TI_DEAD_EEPROM_MAGIC is 0xadead12c

  • 问题跟楼上一样,

    从打印信息可以看到你的板子EEPROM有问题,不知道你的板子是否有EEPROM,MLO 和uboot是根据EEPROM读出板子内容来初始化板子的外设,时钟PLL DDR的,如果没有EEPROM要修改代码:

    在uboot下board/ti/am335x/board.c 找到read_eeprom这个函数,获取你的板子信息

  • 你好,我现在用这个版本的uboot

    u-boot-2016.05+gitAUTOINC+6c5519b6fc-g6c5519b6fc

    编译出来的mlo uboot.img放到sd卡后,发现没有任何打印信息,是不是uart的初始化没有完成?

  • 你好,你最后是怎么改的让串口有打印信息的呢?我遇到了同样的问题

  • 把下面的函数里面的内容注释掉(board/ti/am335x/board.c)

    void do_board_detect(void)
    {
    enable_i2c0_pin_mux();

    i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);

    if (ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR))
    printf("ti_i2c_eeprom_init failed\n");
    }

  • 怎么我改了还是没有输出

    void do_board_detect(void)
    {
    ///enable_i2c0_pin_mux();
    ///i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);

    ///if (ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR))
    ///printf("ti_i2c_eeprom_init failed\n");

    }

    我是在ti-processor-sdk-linux-am335x-evm-03.02.00.05目录下

    make u-boot_clean

    make u-boot

    然后sd卡里面仅有MLO 和u-boot.img

  • 在board.h里面还有好多ti_board_is_xxx的函数,这些函数也会操作eeprom,你把这边也屏蔽掉直接return false;,在你需要的那个板件类型函数返回true,如果全返回false的话在mux.c里就没法初始化pin,你试试

  • 可以了,打印信息如下:

    U-Boot SPL 2016.05 (Apr 12 2017 - 09:58:54)
    Trying to boot from MMC1
    ** First descriptor is NOT a primary desc on 0:1 **
    ** Partition 1 not valid on device 0 **
    spl_register_fat_device: fat register err - -1
    ** Partition 1 not valid on device 0 **
    spl_register_fat_device: fat register err - -1
    spl_load_image_fat: error reading image u-boot.img, err - -1
    spl: no partition table found
    spl: no partition table found
    SPL: failed to boot from all boot devices
    ### ERROR ### Please RESET the board ###

  • U-Boot SPL 2016.05-00118-gabc6b2a-dirty 打印出版本后面打印出 dirty 什么情况 是不是内核被污染了 还是内核没配置好

  • 你好,我也遇到同样的问题,能否分享一下如何修改的。am335x-evm-linux-sdk-src-03.02.00.05  ti-processor-sdk-linux-am335x-evm-03.03.00.04 这两个版本都不行。 0.2版本的没有什么问题。

  • 我的已经跑起来,可以加qq讨论 1833630366

  • 首先将board.c的do_board_detect函数内容注释掉
    void do_board_detect(void)
    {
     //enable_i2c0_pin_mux();
     //i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
     //if (ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR))
     // printf("ti_i2c_eeprom_init failed\n");
    }
    然后再将board.h里的board_is_xxx这类的函数全部返回false,只留下你想要的那个返回true,如下:
    static inline int board_is_bone(void)
    {
     //return board_ti_is("A335BONE");
    return false;
    }
    static inline int board_is_evm_sk(void)
    {
     //return board_ti_is("A335X_SK");
    return true;
    }
    这样就最起码能够打印信息了!
  • 我按照这个方式做了,在版本ti-processor-sdk-linux-am335x-evm-03.03.00.04上,还是不行,没有任何反应。

  • 你好,请问你这个是怎么解决的 ?

    我也遇到你这个问题了,在线等

  • 首先将board.c的do_board_detect函数内容注释掉
    void do_board_detect(void)
    {
     //enable_i2c0_pin_mux();
     //i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
     //if (ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR))
     // printf("ti_i2c_eeprom_init failed\n");
    }
    然后再将board.h里的board_is_xxx这类的函数全部返回false,只留下你想要的那个返回true,如下:
    static inline int board_is_bone(void)
    {
     //return board_ti_is("A335BONE");
    return false;
    }
    static inline int board_is_evm_sk(void)
    {
     //return board_ti_is("A335X_SK");
    return true;
    }
    这样就最起码能够打印信息了!如果你板子上没有eeprom存储板件类型这些信息的话在do_board_detect会卡住
  • 你好,我在用最新的sdk也遇到类似的问题,但是修改eeprom后还是一样没有任何输出,能帮忙看下吗?
    AdMECK *
    iCFQBGDK
    ? w ^
    H + XB [%由+ SgZVWeZ.bGX + X + PH \ + X2 + ZUiP} UW,6PJMA +
    _Kc?@ + U @ \ IX&BX6XMIU5 [ iY\ R * IY +PXbX`Y XMiU5![ iY\ R * + Y +PX`XbY SV
    -X + \ bPG $ SC [_I
    Q + gSR * + Y + PX + [`P。 | dMECK *] E [aO(JeP B\ + X +%X6ĖgY_Ⅳ.ySU+G1 AR 5!Q iP + gSR * + Y + PX`X)bP <cR 5!GK !Q + gSR * + Y + PXbX)BP +Q } SBVWIVR * + Y + PX`XbXX + iU5HICDQBG dK W
    HJX @@ [%`YTS gZVW eZbG XhX + Ph \ + X2 + AdME [-I +] E [aO(JEP b\ + X +%X6D5IP _XQBPdME [SI +] E [aO(JeP。 \\ + X +%X4AdMECK *
    ICdQbG dK

    W H+X b[%BY&TS EZVW eZ.bG !X + X TP + \ + X +Q + P
    + YE] + [ee-_ -+ + e_ +
    N- _eady,TI_DEAD_EEPROM_MAGIC i_ 0 | adead12c
    _eadi + g c-_e c ++ _ e + add_e__ = 0 | 00003217
    _eadi + g MPU c ++ _ e + add_e__ = 0 | 00012c17
    _eadi + g DDR c ++ _ e + add_e__ = 0 | 00010a17
    _eadi + g Pe_ c ++ _ e + add_e__ = 0 | 0403c017
    ee -_- + + e_ +
    N- eady,TI_DEAD_EEPROM_MAGIC i_ 0 | adead12c