恐怕我的问题可能是特定于板或 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
. . .