大家好:
我们有一个基于 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