Хост-контроллер мобильного хранилища. Состояние включения/выключения питания игнорируется при чтении с SD-карты

Боюсь, мой вопрос может быть связан с платой или SoC. В любом случае, я надеюсь, что у кого-то есть опыт в этом.

SoC: RK3308 (плата: ROCK Pi S). Я читал с SD-карты в среде «голого железа»: AArch64 EL3, DDR инициализирован, MMU/GIC отключен.

Чтение блока с SD-карты. Я предположил, что BootROM сделает за меня всю инициализацию, а SD-карта будет готова к использованию, когда мой код получит управление. Это. Я могу успешно читать с карты - FIFO заполняется. Мой вопрос заключается в следующем:

Техническое справочное руководство по RK3308, часть 2, глава 3 описывает хост-контроллер Mobile Storage.

SDMMC_PWREN Регистр включения питания

Бит [0]: power_enable. Кнопка включения/выключения карты. После включения питания микропрограмма должна дождаться времени разгона регулятора/переключателя, прежде чем пытаться инициализировать карту.

1'b0: питание выключено 1'b1: питание включено

Битовые значения выводятся на порт card_power_en

Также,

SDMMC_CMD Регистр команд

Бит [15] send_initialization

1'b0: не отправлять последовательность инициализации (80 тактов из 1) перед отправкой этой команды

1'b1: отправить последовательность инициализации перед отправкой этой команды. После включения питания необходимо отправить 80 тактов на карту для инициализации, прежде чем отправлять какие-либо команды на карту. Бит должен быть установлен при отправке первой команды на карту, чтобы контроллер инициализировал часы перед отправкой команды на карту. Этот бит не следует устанавливать ни для одного из режимов загрузки (альтернативного или обязательного).

Проблема в том, что мой код получает контроль над кодом BootROM, SDMMC_PWREN[0] = 0 (отключение питания). Но чтение с карты проходит успешно. Я попытался установить SDMMC_PWREN[0] = 1, я также попытался установить SDMMC_CMD[15] = 1 для 80-тактовой последовательности инициализации перед первой командой после включения питания. Все это, кажется, не имеет никакого эффекта. Во всех случаях чтение с карты (CMD17) проходит успешно. Однако последовательность CMD0/CMD8 завершается с ошибкой 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
        . . .

person Alexander Zhak    schedule 10.03.2021    source источник
comment
Когда я задал этот вопрос (stackoverflow.com/questions/57667059 /), я делал это на этой дерьмовой плате разработчика RK3308. И проблема заключалась в том, что вам нужно отключить питание в регистрах, чтобы включить питание карты. Логика питания была инвертирована схемой.   -  person user3124812    schedule 11.03.2021