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.

[参考译文] AM5716:UBoot:在 SDRAM 初始化之前读取 GPIO 引脚(board_EARLY_INIT_f)

Guru**** 2550430 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1103382/am5716-uboot-reading-gpio-pins-before-sdram-init-board_early_init_f

器件型号:AM5716

大家好:

我们有一个基于 AM57XX 系列的平台。 组4个 GPIO 引脚(全部位于 GPIO1上)已保留用于电路板修订版(它们可以通过10k 电阻连接到高电平或低电平)。 在初始化 SDRAM 之前、我需要读取这些引脚、以分配正确的 DRAM 时序配置和大小。 计划在初始化过程的早期读取它们一次、将位移入静态 int (或 enum 值)、并使其可用于初始化函数的其余部分。 AFAIK、我需要读取以下函数中的值来根据 ID 引脚切换 RAM 配置:

SPL
EMIF_GET_DMM_regs ()
EMIF_GET_REG_Dump ()
EMIF_GET_ext_phy_Ctrl_const_regs ()

完全 uboot
DRAM_INIT_Banksize()

这是我为读取引脚而编写的函数。 我是从 board_earne_init_f()调用它:

#ifndef _BOARD_ID_H_
#define _BOARD_ID_H_

typedef enum JUNO_BOARD_ID {
    ...
} juno_board_id;

#define BOARD_ID_PIN_3	GPIO_TO_PIN(1, X)
#define BOARD_ID_PIN_2  GPIO_TO_PIN(1, X)
#define BOARD_ID_PIN_1	GPIO_TO_PIN(1, X)
#define BOARD_ID_PIN_0	GPIO_TO_PIN(1, X)

static inline juno_board_id get_board_id()
{
    static juno_board_id board_id = INVALID;

    if (board_id != INVALID) return board_id;

    if (gpio_request(BOARD_ID_PIN_3, "board_id_pin_3") != 0) return INVALID;
    printf("%s: gpio 3 requested\n", __func__);
    if (gpio_request(BOARD_ID_PIN_2, "board_id_pin_2") != 0) return INVALID;
    printf("%s: gpio 2 requested\n", __func__);
    if (gpio_request(BOARD_ID_PIN_1, "board_id_pin_1") != 0) return INVALID;
    printf("%s: gpio 1 requested\n", __func__);
    if (gpio_request(BOARD_ID_PIN_0, "board_id_pin_0") != 0) return INVALID;

    printf("%s: gpios requested\n", __func__);

    if (gpio_direction_input(BOARD_ID_PIN_3) != 0) return INVALID;
    printf("%s: gpio 3 direction set\n", __func__);
    if (gpio_direction_input(BOARD_ID_PIN_2) != 0) return INVALID;
    printf("%s: gpio 2 direction set\n", __func__);
    if (gpio_direction_input(BOARD_ID_PIN_1) != 0) return INVALID;
    printf("%s: gpio 1 direction set\n", __func__);
    if (gpio_direction_input(BOARD_ID_PIN_0) != 0) return INVALID;

    printf("%s: gpios set to input\n", __func__);

    board_id = (juno_board_id)
        gpio_get_value(BOARD_ID_PIN_3) << 3 |
        gpio_get_value(BOARD_ID_PIN_2) << 2 |
        gpio_get_value(BOARD_ID_PIN_1) << 1 |
        gpio_get_value(BOARD_ID_PIN_0);

    return board_id;
}

#endif

问题是 当调用 board_earn_init_f()时(我不认为),我无法使用 PUes()或 printf(),因此调试有点困难。
当我 从 DRAM_init_Banksize()调用 get_board_id()时,我会得到一个垃圾值。 当我从 board_init()调用它时,我会得到正确的值。

我使用的板级代码是 PHYTEC AM572X RDK 板级代码的细微修改版本:
board/phytec/am572x_phycore_RDK/board.c

如果有任何帮助,我们将不胜感激。

谢谢。
-Erik Bolton

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

    您好、Erick、

    对长时间拖延答复表示歉意。
    此问题是否仍然存在? 如果是、您能否突出显示问题的当前状态?


    此致、
    Parth