0

恐怕我的问题可能是特定于板或 SoC 的。无论如何,我希望有人有这方面的经验。

SoC:RK3308(板:ROCK Pi S)。我在裸机环境中从 SD 卡读取:AArch64 EL3,DDR 已初始化,MMU/GIC 已禁用。

从 SD 卡中读取一个块。我假设,当我的代码获得控制权时,BootROM 将为我完成所有初始化,并且 SD 卡将准备好使用。这是。我可以成功地从卡中读取数据——FIFO 被填满。我的问题如下:

RK3308 技术参考手册第 2 部分第 3 章介绍了移动存储主机控制器。

SDMMC_PWREN 电源使能寄存器

位 [0]:power_enable。卡的电源开/关开关。打开电源后,固件应等待稳压器/开关启动时间,然后再尝试初始化卡。

1'b0:关机 1'b1:开机

位值输出到 card_power_en 端口

还,

SDMMC_CMD 命令寄存器

位 [15] 发送初始化

1'b0:在发送此命令之前不发送初始化序列(1 的 80 个时钟)

1'b1:发送此命令前先发送初始化序列 上电后,必须先向卡发送80 个时钟进行初始化,然后再向卡发送任何命令。在向卡发送第一个命令时应设置该位,以便控制器在向卡发送命令之前初始化时钟。不应为任何一种引导模式(备用或强制)设置此位

问题是当我的代码从 BootROM 代码中获得控制权时SDMMC_PWREN[0] = 0(断电)。但是从卡中读取是成功的。我尝试了设置SDMMC_PWREN[0] = 1,我还尝试SDMMC_CMD[15] = 1在上电后的第一个命令之前设置 80 时钟初始化序列。这一切似乎都没有任何效果。在所有情况下,从卡 (CMD17) 读取都是成功的。但是,response timed out如果我在设置power_enable=1.

当我的代码获得控制权时注册值:

SDMMC_CTRL    0x00000000
SDMMC_PWREN   0x00000000
SDMMC_CLKDIV  0x00000000
SDMMC_CLKSRC  0x00000000
SDMMC_CLKENA  0x00000001
SDMMC_TMOUT   0xFFFFFF40
SDMMC_CTYPE   0x00000001
SDMMC_BLKSIZ  0x00000200
SDMMC_BYTCNT  0x00000200
SDMMC_INTMASK 0x00000000
SDMMC_CMDARG  0x00001040
SDMMC_CMD     0x20002351
SDMMC_RESP0   0x00000000
SDMMC_RESP1   0x2023BC16
SDMMC_RESP2   0x53443030
SDMMC_RESP3   0x9C534F55
SDMMC_MINTSTS 0x00000000
SDMMC_RINTSTS 0x0000000C
SDMMC_STATUS  0x03000101
SDMMC_FIFOTH  0x307F0080
SDMMC_CDETECT 0x00000000
SDMMC_WRTPRT  0x00000000
SDMMC_TCBCNT  0x00000000
SDMMC_TBBCNT  0x00000000
SDMMC_DEBNCE  0x00FFFFFF
SDMMC_HCON    0x04C434C1
SDMMC_UHS_REG 0x00000000
SDMMC_RSTN    0x00000001

我不明白SDMMC_PWREN注册的实际目的以及如何/何时使用它。任何细节将不胜感激。

我的测试代码很简单:

        . . .
.probe_device:

        str x30, [sp, -16]!
        bl .serial__send_string
        ldr w11, [x2, SDMMC_CDETECT]
        tbnz w11, 0, .device_absent
        adr x0, .msg__present
        bl .serial__send_string

        ldr w10, [x2, SDMMC_CMD]      ; BootROM leaves SDMMC_CMD register
        orr w10, w10, 1 shl 31        ; pre-filled for CMD17, so I just
        str wzr, [x2, SDMMC_CMDARG]   ; change block address to 0
        str w10, [x2, SDMMC_CMD]      ; to read from the first block
        ldr w11, [x2, SDMMC_RINTSTS]
        tbz w11, 2, $ - 4             ; wait until command completed
        . . .
4

0 回答 0