Хост-контроллер мобильного хранилища. Состояние включения/выключения питания игнорируется при чтении с 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
. . .