微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

移动存储主机控制器从 SD 卡读取时忽略电源开/关状态

如何解决移动存储主机控制器从 SD 卡读取时忽略电源开/关状态

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

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

从 SD 卡读取块。我认为,BootROM 将为我完成所有初始化,并且当我的代码获得控制权时,SD 卡就可以使用了。这是。我可以成功地从卡中读取 - FIFO 已满。我的问题如下:

RK3308 Technical Reference Manual Part 2,第 3 章介绍了移动存储主机控制器。

SDMMC_PWren 电源使能寄存器

位 [0]:power_enable。 卡的电源开关。 一旦打开电源,固件应等待 尝试初始化卡之前的调节器/开关斜升时间。

1'b0:断电 1'b1:开机

比特值输出到 card_power_en 端口

还有,

SDMMC_CMD 命令寄存器

位 [15] 发送初始化

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

1'b1:发送此命令前发送初始化序列 上电后,必须向卡发送80个时钟进行初始化 在向卡发送任何命令之前。位应该被设置,而 向卡发送第一个命令,以便控制器初始化 发送命令到卡之前的时钟。这一点不应该 设置为任一启动模式(交替或强制)

问题是当我的代码从 BootROM 代码获得控制权时,SDMMC_PWren[0] = 0(断电)。但是从卡中读取是成功的。我尝试设置 SDMMC_PWren[0] = 1,我还尝试在上电后的第一个命令之前为 80 时钟初始化序列设置 SDMMC_CMD[15] = 1。这一切似乎都没有任何效果。在所有情况下从卡中读取(CMD17)都是成功的。但是,如果我在设置 response timed out 后尝试发出这些命令,CMD0/CMD8 序列将失败并显示 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,.device_absent
        adr x0,.msg__present
        bl .serial__send_string

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。