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.

am335x BOOT_DEVICE不正确的原因



两块板子,BOOT_DEVICE 都是不正确的,一块的rom_params是0x4030CFD8,对应的BOOT_DEVICE是0x58,另外一块rom_params是0x40301ecc,对应的BOOT_DEVICE是0xb2,这是参数都不对,是什么原因导致的?

  • 跟下代码,BOOT_DEVICE这个值是怎么得到的呢?是通过control module的sysboot值得到的吗?

    你说的两个都不对,那么正确的应该是啥,应该会有个switch分支来辨识走哪个启动方式吧?

    如果这里走错了,是读进来的boot_device值就错了,还是在某个逻辑判断的地方就错了?

  • 1.boot_device是由boot-common.c里的rom_params确定的

    void save_omap_boot_params(void)
    {
        u32 rom_params = *((u32 *)OMAP_SRAM_SCRATCH_BOOT_PARAMS);
        u8 boot_device;
        u32 dev_desc, dev_data;

        if ((rom_params <  NON_SECURE_SRAM_START) ||
            (rom_params > NON_SECURE_SRAM_END))
            return;

    gd->arch.omap_boot_params.omap_bootdevice = boot_device =
                       *((u8 *)(rom_params + BOOT_DEVICE_OFFSET));

    ~~~~~~~~

    2.确实是有个SWITCH分支来辨别走哪个启动方式的,是读进来的值就是错的。

    在spl.h中对BOOT_DEVICE的值进行了定义

    #if defined(CONFIG_TI816X)
    #define BOOT_DEVICE_XIP        2
    #define BOOT_DEVICE_NAND    3
    #define BOOT_DEVICE_MMC1    6
    #define BOOT_DEVICE_MMC2    5
    #define BOOT_DEVICE_UART    0x43
    #elif defined(CONFIG_AM43XX)
    #define BOOT_DEVICE_NOR        1
    #define BOOT_DEVICE_NAND    5
    #define BOOT_DEVICE_MMC1    7
    #define BOOT_DEVICE_MMC2    8
    #define BOOT_DEVICE_SPI        10
    #define BOOT_DEVICE_USB     13
    #define BOOT_DEVICE_UART    65
    #define BOOT_DEVICE_USBETH    69
    #define BOOT_DEVICE_CPGMAC    71
    #else
    #define BOOT_DEVICE_XIP           2
    #define BOOT_DEVICE_NAND    5
    #if defined(CONFIG_AM33XX)
    #define BOOT_DEVICE_MMC1    8
    #define BOOT_DEVICE_MMC2    9    /* eMMC or daughter card */
    #elif defined(CONFIG_TI814X)
    #define BOOT_DEVICE_MMC1    9
    #define BOOT_DEVICE_MMC2    8    /* ROM only supports 2nd instance */
    #endif
    #define BOOT_DEVICE_SPI        11
    #define BOOT_DEVICE_UART    65
    #define BOOT_DEVICE_USBETH    68
    #define BOOT_DEVICE_CPGMAC    70
    #endif
    #define BOOT_DEVICE_MMC2_2      0xFF

    #if defined(CONFIG_AM33XX)
    #define MMC_BOOT_DEVICES_START BOOT_DEVICE_MMC1
    #define MMC_BOOT_DEVICES_END   BOOT_DEVICE_MMC2
    #elif defined(CONFIG_AM43XX)
    #define MMC_BOOT_DEVICES_START BOOT_DEVICE_MMC1
    #ifdef CONFIG_SPL_USB_SUPPORT
    #define MMC_BOOT_DEVICES_END   BOOT_DEVICE_USB
    #else
    #define MMC_BOOT_DEVICES_END   BOOT_DEVICE_MMC2
    #endif
    #elif defined(CONFIG_TI81XX)
    #define MMC_BOOT_DEVICES_START    BOOT_DEVICE_MMC2
    #define MMC_BOOT_DEVICES_END    BOOT_DEVICE_MMC1
    #endif
    #endif

    switch函数在spl.c中

    boot_device = spl_boot_device();
        debug("boot device - %d\n", boot_device);
        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:
                    puts("hello");
            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
    #ifdef CONFIG_SPL_SATA_SUPPORT
        case BOOT_DEVICE_SATA:
            spl_sata_load_image();
            break;
    #endif
        default:
            debug("SPL: Un-supported Boot Device\n");
                    hang();   
        }

  • 首先问下,您板子的sysboot是怎么设置的?板子上都支持什么启动介质?

  • 这个值,是根据你启动的时候加载image的方式,来确认读取的分支。参考AM335x的TRM手册,26.1.10.2 Execution。

    你这目前是不是通过CCS或者IAR的方式load进去运行的?

  • sysboot设置为0100 0010  1001 0111,支持NANDFLASH和SD卡启动

  • 是的,通过CCS 加载进去的

  • 如果是这样的话,我认为是可以理解的,因为你目前是通过中断的方式进去的,而非通过rom code走完启动辨识的流程,引导启动的。所以你并没有成功的从列表中的某一种方式来正常启动,因此boot device的值没有被设置成功。

    于此不一样的是,你可以尝试任一种启动介质,比如SD卡,NAND,或者是串口也可以,而非JTAG这种debug的方式load进去,而是让rom code正常的通过启动介质成功,启动,这样你的boot device的值就会得到一个正确的值。

  • 如果是Bootrom不能成功的从sysboot设定的启动顺序从启动介质上加载u-boot程序,那么也请先检查下sysboot上的电平,1是不是对应的3.3V