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.

自己设计的板子,应用AM3358,TI的SDK-07.00.00.00软件包,用CCS调试,调试SPL时,出现如下问题



Start.S文件调试到如下红色标注的语句时出现错误

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_cp15
bl cpu_init_crit
#endif

bl _main

发现是spl.c中void board_init_r(gd_t *dummy1, ulong dummy2)以及void __weak board_init_f(ulong dummy)函数报错,且发现boot_device的参数值为88,不知道这部分是由于什么原因出现错误,需要修改什么地方?我硬件设置的是由UART启动,谢谢

  • boot_device的值大部分情况下是unknown,在运行到spl.c文件的board_init_r()函数如下内容时:

    switch (boot_device) {
    #ifdef CONFIG_SPL_RAM_DEVICE
    case BOOT_DEVICE_RAM:
    spl_ram_load_image();
    break;
    #endif
    #ifdef CONFIG_SPL_MMC_SUPPORT
    case BOOT_DEVICE_MMC1:
    case BOOT_DEVICE_MMC2:
    case BOOT_DEVICE_MMC2_2:
    spl_mmc_load_image();
    break;
    #endif
    #ifdef CONFIG_SPL_NAND_SUPPORT
    case BOOT_DEVICE_NAND:
    spl_nand_load_image();
    break;
    #endif
    #ifdef CONFIG_SPL_ONENAND_SUPPORT
    case BOOT_DEVICE_ONENAND:
    spl_onenand_load_image();
    break;
    #endif
    #ifdef CONFIG_SPL_NOR_SUPPORT
    case BOOT_DEVICE_NOR:
    spl_nor_load_image();
    break;
    #endif
    #ifdef CONFIG_SPL_YMODEM_SUPPORT
    case BOOT_DEVICE_UART:
    spl_ymodem_load_image();
    break;
    #endif
    #ifdef CONFIG_SPL_SPI_SUPPORT
    case BOOT_DEVICE_SPI:
    spl_spi_load_image();
    break;
    #endif
    #ifdef CONFIG_SPL_ETH_SUPPORT
    case BOOT_DEVICE_CPGMAC:
    #ifdef CONFIG_SPL_ETH_DEVICE
    spl_net_load_image(CONFIG_SPL_ETH_DEVICE);
    #else
    spl_net_load_image(NULL);
    #endif
    break;
    #endif
    #ifdef CONFIG_SPL_USBETH_SUPPORT
    case BOOT_DEVICE_USBETH:
    spl_net_load_image("usb_ether");
    break;
    #endif
    #ifdef CONFIG_SPL_USB_SUPPORT
    case BOOT_DEVICE_USB:
    spl_usb_load_image();
    break;
    #endif
    default:
    debug("SPL: Un-supported Boot Device\n");
    hang();
    }

    出错,运行到红色部分

  • 没有人遇到类似问题或知道怎么解决么?请求帮助啊

  • 这块很少有出现问题,你有修改过这里的代码吗?

    能否描述下问题的前因后果?还有你debug的方式&参考?

  • 参考/arch/arm/include/asm/arch-am33xx/spl.h文件,里面没有88的定义。

    你是不是用CCS把SPL给download进去的?并没有让ROM code找到对应的设备和代码?

    我的理解:一般来说,你会设置一个启动的序列,然后当SPL通过某种方式被加载进去了之后,即为使用了对应的启动模式。SPL可以从串口,网口,SD卡,NAND等多种方式被加载进去,这个时候就会有这种信息的传递,告诉你boot device是什么,如果使用了其他的手段加载进去,比如仿真器,等等,他是把device halt了之后,直接把代码load进去的,然后指针指向对应的地址,再开始运行。这种情况下,是不是说就会有,就会有boot device的错误问题。

    我觉得你可以通过一些测试来debug这个问题,比如用SD卡启动了后,在SPL中加打印,死循环之类的强制他停止在某处,通过log来辨识。

  • 您好,谢谢您的帮助!我硬件设置的是UART0启动方式,但是调试的时候没有由UART口连接PC机,直接用的下载器连接PC机,用CCS调试SPL,是用CCS的tool->load memory将spl.bin文件load到ARM。您的意思是不能用CCS把SPL给down进去么?请问CCS调试的时候,如何经UART口将SPL down进芯片呢?是不是连接UART口至计算机,同样是选择CCS的too->load memory就可以通过UART口将SPLdown进去了?谢谢啦

  • 连接UART接口至计算机,CCS调试SPL,程序还是用CCS->load memory下载,按步调试,程序运行到board_init_f函数的memset(__bss_start, 0, __bss_end - __bss_start);部分就一直进入死循环,

    if ( ((ulong)s & (sizeof(*sl) - 1)) == 0) {
    for (i = 0; i < sizeof(*sl); i++) {
    cl <<= 8;
    cl |= c & 0xff;
    }

    运行上面这部分时,count为210996,*sl为*sl unsigned long 1342177280 0x80A00000,cl为0,c为0,循环执行for和cl |= c & 0xff;不执行cl <<= 8;循环结束后,执行

    while (count >= sizeof(*sl)) {
    *sl++ = cl;

    循环执行以上两条语句,且count和*sl的值均为Error: identifier not found: count(或 Error: identifier not found: sl at *(sl)),并在此进入死循环,请您帮忙解决一下,是什么原因,谢谢啦