Blackfin Removable Storage Interface |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Контроллер интерфейса для извлекаемых носителей данных (removable storage interface, RSI) работает как интерфейс хоста для подключения к нему карт MMC (multimedia card), карт памяти SD (secure digital) и карт SDIO (secure digital input/output). Вот список основных особенностей контроллера RSI. • Поддерживаются карты MMC (извлекаемая или встроенная), SD или SDIO с соответствующими протоколами шины. Контроллеры RSI имеются не во всех моделях процессоров линейки Blackfin, они есть только в ... Таблица 24-1. Спецификации RSI.
Для обеспечения операций с картами существует специальный набор регистров контроллера RSI. Для получения подробной информации по каждому регистру см. описание соответствующих врезках ниже. Общая информация о регистрах приведена в таблице 24-17. Таблица 24-3: Список прерываний RSI ADSP-BF60x.
Таблица 24-4: ADSP-BF60x RSI Trigger List Trigger Masters.
Таблица 24-5: ADSP-BF60x RSI Trigger List Trigger Slaves. Рисунок ниже показывает функциональные блоки RSI. Рис. 24-1. Блок-диаграмма RSI. [Архитектурные концепции RSI] В последующих секциях описываются функции и возможности контроллера RSI и поддерживаемые им протоколы MMC, SD, SDIO. Подробную информацию по параметрам времени и требованиям протоколов обращайтесь к даташиту на соответствующий процессор и следующим спецификациям стандарта на карты памяти: • MMCA System Specification Обмен данными происходит между главной (master, или хост) и подчиненной (slave) конфигурациями, где контроллер RSI выступает как master, и карта работает как устройство slave. RSI обменивается с устройством по протоколу шины, основанном на сообщениях, когда хост посылает последовательно команды с помощью сигнала RSI_CMD. Некоторые команды требуют, чтобы карта предоставила в ответ для хоста некоторые данные. Этот ответ также последовательно посылается через сигнал RSI_CMD. Передачи данных, как в карту, так и из карты, осуществляются через сигналы данных. Количество линий данных для передачи данных можно конфигурировать в 1, 4 или 8, с использованием ножек RSI_D0, RSI_D3..RSI_D0 или RSI_D7..RSI_D0 соответственно. Все передачи через ножку RSI_CMD и ножки RSI_D7..RSI_D0 синхронны с сигналом на ножке RSI_CLK. Коды циклической проверки (Cyclic redundancy codes, CRC, или как обычно называют эти коды - контрольная сумма) используются для защиты от ошибок передач команд, ответов на команду и данных. Код CRC7 генерируется для каждой отправляемой хостом команды, и для почти каждого ответа, возвращаемого картой через сигнал RSI_CMD. Код CRC16 используется на сигналах RSI_D7..RSI_D0, чтобы защитить передачи блока данных. В конфигурациях шины 4 и 8 бит CRC16 вычисляется для каждого отдельного сигнала данных. Описание сигналов. RSI это 10-выводный интерфейс, в котором 1 вывод используется для тактирования, 1 вывод для передачи команд и 8 выводов для данных. Таблица 24-6 показывает основное функциональное описание различных сигналов RSI. Таблица 24-6. Общее описание сигналов RSI.
Примечание (1): хотя ранние ревизии стандарта MMC позволяли подключать несколько карт MMC к одному интерфейсу RSI, строго рекомендуется подключать только одно подчиненное устройство к одному имеющемуся интерфейсу хоста RSI. Этой спецификацией устройства в действительности не будут распознаваться несколько подчиненных устройств, использующих общую шину для сигнала команды и сигналов данных. Таблица 24-7 описывает функциональность сигналов для протокола MMC, и таблица 24-8 описывает функциональность сигналов для протоколов SD и SDIO. Таблица 24-7. Описания сигналов RSI MMC.
Таблица 24-8. Описания сигналов RSI SD и SDIO.
Конфигурация тактирования. RSI это быстрое, синхронное периферийное устройство с программируемой частотой тактирования, которая предоставляется через сигнал RSI_CLK. Интерфейс между RSI и внутренними шинами работает с частотой SCLK (частота системной шины процессора Blackfin). Обмен между доменом тактов, который предоставляется внешне от RSI на сигнале RSI_CLK, и доступом RSI к внутренним шинам осуществляется с использованием синхронизаторов модуля RSI. Частота RSI_CLK конфигурируется 8-битным полем RSI_CTL.CLKDIV и битом RSI_CTL.BYPASS регистра RSI_CTL. Если RSI_CTL.BYPASS установлен, то тактовая частота подается на сигнал RSI_CLK и генерируется она непосредственно от частоты SCLK. Если RSI_CTL.BYPASS очищен, то логика делителя тактовой частоту предоставляет частоту RSI_CLK как показано ниже, где RSI_CTL.CLKDIV это 8-битная величина в диапазоне 0..255. RSI_CLK = SCLK / 2*(RSI_CTL.CLKDIV+1) Выход RSI_CLK разрешается или запрещается битом RSI_CTL.CLKEN, и реализована функция сохранения энергии путем установки RSI_CTL.PWRSAVE, что запрещает выход RSI_CLK, когда нет передач через интерфейс RSI. Конфигурация интерфейса. RSI поддерживает несколько типов карт, работающих с различными протоколами. Разные типы карт могут потребовать незначительные изменения в конфигурации интерфейса. Сигнал команды на картах MMC работает в 2 разных режимах, в зависимости от рабочего режима карты. В время режима идентификации карты сигнал команды работает в конфигурации с открытым стоком. Когда карта входит в режим передачи данных, этот сигнал переходит в режим двухтактного выхода. Примечание: внутренний верхний нагрузочный резистор (pull-up) на сигнале RSI_CMD предназначен только для того, чтобы удержать сигнал от плавания в неопределенном состоянии. Внутренний pull-up резистор не достаточен во время фазы идентификации карты, когда сигнал MMC-карты RSI_CMD работает в режиме открытого коллектора. Если требуется поддержка устройств MMC, то нужен внешний pull-up резистор, подключенный к сигналу RSI_CMD согласно стандарту JEDEC. Используемая ширина шины для передач данных конфигурируется на 1, 4 или 8 бит полем RSI_CTL.BUSWID. Для предотвращения помех и плавания уровней сигналов, когда карта не установлена, или когда все драйвера карты переходят в отключенное (высокоимпедансное) состояние, могут быть разрешены различные pull-up и pull-down конфигурации резисторов на сигналах RSI_D0..RSI_D7. Регистр RSI_CFG предоставляет следующие опции. • Разрешить или запретить pull-up резистор на сигнале RSI_D3. Детектирование карты. RSI позволяет для программы определять, когда карта установлена в его слот. Есть несколько способов, как выполнить детектирование наличия карты. • Использовать 3 сигнала данных. Карты SD и SDIO используют внутренний pull-up резистор на линии RSI_D3 как сигнал детектирования карты, чтобы показать хосту, что в слоте присутствует карта. Чтобы использовать RSI_D3 для детектирования карты, к нему должен быть подключен внешний pull-down резистор (подтягивающий логический уровень к GND), чтобы на выводе был низкий логический уровень, когда карта не установлена. Когда карта устанавливается в слот, на сигналах RSI_D3 и RSI_STAT0 будет определено нарастание логического уровня. Установится бит SDCARD (генерирующий прерывание, если это разрешено). Как только карта была корректно идентифицирована, прерывание RSI_STAT0.SDCARD должно быть очищено и запрещено. Также запрещается pull-up резистор в карте SD выдачей команды SET_CLR_CARD_DETECT. Когда используется сигнал RSI_D3 для детектирования карты с внешним pull-down резистором, не разрешайте внутренний pull-up резистор (бит RSI_CFG.DAT3PUP = 0). • Использование контактов сокета SD/MMC и прерывания от вывода GPIO. Рекомендуемый метод детектирования карты - использовать специальные механические контакты, доступные на большинстве сокетов карт. Сокеты, поддерживающие эту возможность, замыкают на GND специальный сигнал, когда карта установлена. На этот сигнал должен быть подключен внешний pull-up резистор любого подходящего номинала (порядка 10..100 кОм), и полученный сигнал подан на любую ножку GPIO процессора, который мог бы опросить изменение её состояния либо по прерыванию от GPIO, либо опросом. Должны быть предприняты специальные меры по подавлению дребезга механических контактов (программные и аппаратные). Это наиболее надежный и эффективный метод определения установки и извлечения карты, потому что у некторых карт MMC может быть не реализована функция детектирования pull-up резистором на сигнале RSI_D3. Как только карта была определена, логический уровень для генерации прерывания может быть проинвертирован, чтобы определить извлечение карты. • Использование программного опроса (polling). Программа периодически опрашивает слот с использованием команд идентификации карты для поддерживаемых типов карт. Как только карта установлена, в она ответ на команду отправит допустимый ответ обратно к хосту. Когда карта извлечена, произойдет таймаут в ожидании ответа на команду (ответ на команду не придет). На рисунке 24-2 показаны упомянутые выше схемы, необходимые для детектирования карты. Рис. 24-2. Интерфейс сокета RSI. RSI требует 2 внутренних сигналов тактов, которые напрямую генерируются из SCLK. Один из этих тактовых сигналов подается на делитель частоты, и после него получается тактовая частота RSI_CLK. Чтобы RSI мог функционировать, эти тактовые частоты должны быть разрешены установкой бита RSI_CFG.CLKSEN. Очистка этого бита запретит работу RSI, независимо от какой-либо конфигурации тактирования RSI. Сигнал RSI_CLK может быть разрешен или запрещен с использованием бита RSI_CTL.CLKEN. Могут быть реализованы дополнительные опции для экономии потребляемой мощности путем установки бита RSI_CTL.PWRSAVE, который запретит выход RSI_CLK, когда через интерфейс RSI не осуществляются передачи. Эти конфигурации показаны в таблице 24-9. Таблица 24-9. Конфигурации экономии энергии RSI (RSI Power Saving).
Примечание (1): поле PWRON в регистре RSI_CFG должно быть установлено в 0x3. Если PWRON очищен, то такты не будут выводиться. [Интерфейс RSI типа команда - ответ] RSI посылает команды в карту и принимает ответы от карты с использованием сигнала RSI_CMD. Команда для отправки в карту выдается записью регистра RSI_CMD. Этот регистр содержит 6-разрядный код команды. Поле IDX содержит индекс команды для отправки в карту. Индекс команды предоставляет поддержку до 64 команд - от 0 (CMD0) до 63 (CMD63). Некоторые команды требуют аргумента, который должен быть отправлен вместе с командой, такие как адрес для транзакции чтения. Аргумент всегда отправляется с командой, и в зоне ответственности карты будет либо игнорировать, либо использовать поле аргумента, основываясь на принятой команде. Аргумент, отправленный с командой, предоставляется в регистре RSI_ARG. Все команды передаются, защищенные 7-разрядным кодом проверки (cyclic redundancy check, CRC), который часто называют контрольной суммой CRC7. Это позволяет определять наличие в передаче ошибок, и повторно передать команду, если ошибка произошла. Все команды, отправляемые в карту, составлены из 48 бит, как показано в таблице ниже. Таблица 24-10. Формат команды RSI для карты.
Регистр команд RSI_CMD также предоставляет конфигурационную информацию о том, нужно ли дожидаться ответа от карты, и о типе этого ответа. RSI может быть сконфигурирован с использованием битовых полей RSI_CMD.RSP и RSI_CMD.LRSP для ожидания ответа карты (response), типы короткого или длинного ответа показаны в следующих таблицах. Таблица 24-11. Формат короткого ответа для RSI RSI Short Response.
Таблица 24-12. Формат длинного ответа для RSI (RSI Long Response).
Примечания к таблицам 24-11 и 24-12: (1) В ответах, которые не содержат индекс команды, поле бит проверки содержит значение 111111b. Как и команды, все ответы (response) посылаются через сигнал RSI_CMD. В ответе всегда стартовый бит равен 0, за которым идет бит передачи 0. Этим показывается, что передача происходит от карты к контроллеру RSI. В отличие от команд, которые выдает контроллер RSI, не все ответы защищены контрольной суммой CRC7. Относительно того, защищен ли CRC7 какой-то ответ на команду, см. соответствующую спецификацию [2] для получения подробной информации по форматам ответов для определенного устройства карты. Когда принят короткий ответ, он разбивается на части контроллером RSI. 32-битное поле, содержащее биты [39:8], сохраняется в регистре RSI_RESP0, где бит 39 ответа соответствует биту 31 регистра RSI_RESP0, и бит 8 ответа биту 0 регистра RSI_RESP0. Биты [45:40] ответа сохраняются в регистре RSI_RESP_CMD. Для длинного ответа его биты [127:1] сохраняются в регистрах RSI_RESP0, RSI_RESP1, RSI_RESP2 и RSI_RESP3. Бит 31 RSI_RESP0 содержат самый старший бит (MSB бит 127 ответа), и бит 0 RSI_RESP3 cсодержит бит 1 ответа. Бит 31 регистра RSI_RESP3 всегда равен 0. Следующий рисунок показывает путь команды в машине состояний RSI. Чтобы машина состояний стала активной, RSI должен быть разрешен битом RSI_CTL.CLKEN. Запрет тактирования RSI приведет к возврату машины состояний в ожидание (IDLE state). Рис. 24-3. Ветка обработки команды машины состояний RSI. Обработка команды в машине состояний отвечает за установку и очистку определенного количества флагов статуса в регистре RSI_XFRSTAT. Следующая таблица перечисляет флаги статуса (status flags) и флаги исключения (exception flags), на которые влияет путь команды в машине состояний. Таблица 24-13. Флаги статуса ветки обработки команд машины состояний RSI.
Путь команды работает в полудуплексном режиме, так что команды и ответы на них не могут происходить одновременно. Либо передается команда карте, либо передается ответ от карты (по-другому и не может быть, потому что передачи команд и ответов используется единственная двунаправленная линия RSI_CMD). Если машина состояний не находится в состоянии SEND, выход RSI_CMD контроллера находится в третьем (отключенном) состоянии с высоким сопротивлением. На следующем рисунке описывается типичная процедура передачи команды и ответа на неё, сигнал RSI_CMD оцифровывается картой и хостом по фронту нарастания сигнала RSI_CLK. Рис. 24-4. Передача команды контроллером RSI. Следующие секции описывают пути алгоритма обработки команд RSI. IDLE State. Машина состояний остается в состоянии IDLE, когда она не активна, и машина выйдет из состояния IDLE, когда программой будет установлен бит RSI_CMD.EN. Произойдет переход в состояние PEND, если бит RSI_CMD.PNDEN установлен, иначе будет переход в состояние SEND. Машина состояний остается в состоянии IDLE как минимум 8 тактов RSI_CLK, когда машина возвращается в состояние IDLE из другого состояния, и когда возврат был не по причине запрета RSI или сброса. В течение этого интервала 8 тактов RSI_CLK контроллер RSI продолжает выдавать сигнал RSI_CLK, даже если установлен бит RSI_CTL.PWRSAVE. Это позволяет карте завершить текущую операцию. Когда машина разрешается снова, она покинет состояние IDLE только после передачи 8 тактов RSI_CLK. PEND State. RSI входит в состояние PEND, если установлен бит RSI_CMD.PNDEN. Машина состояний остается в состоянии PEND, пока не будет оповещена от субблока пути данных о том, что передача была завершена. Это показывается установкой флага RSI_XFRSTAT.DATEND, когда декремент счетчика RSI_DATA_CNT достиг нуля. Этот режим позволяет автоматическую передачу команды STOP_TRANSMISSION после чтения или записи требуемого количества данных в транзакциях потоков данных. Функция RSI_CMD.PNDEN недоступна для передач, основанных на блоках, и не может автоматически выдавать команду STOP_TRANSMISSION для операций MULTIPLE_BLOCK_READ или MULTIPLE_BLOCK_WRITE (многоблочные передачи). SEND State. Во время состояния SEND, контролер RSI устанавливает флаг RSI_XFRSTAT.CMDACT чтобы показать, что происходит передача. Поведение машины состояний после отправки команды зависит от того, ожидается ли ответ на команду от карты. Если ответ не ожидается, то RSI очищает флаг RSI_XFRSTAT.CMDACT и устанавливает флаг RSI_XFRSTAT.CMDSENT, чтобы показать, что была завершена операция без получения ответа от карты. Затем происходит переход в состояние IDLE. Если от карты ожидается ответ, то RSI входит в состояние WAIT. WAIT State. В состоянии WAIT контроллер RSI ожидает прием ответа (response) через сигнал RSI_CMD. При входе в это состояние запускается внутренний таймер. Если ответ не был принят за 64 такта RSI_CLK, установится флаг RSI_XFRSTAT.CMDTO, и очистится флаг RSI_XFRSTAT.CMDACT. Машина состояний войдет в состояние IDLE, ожидая следующего действия. Когда ответ отправляется обратно от карты, он показывается нулем в стартовом бите на сигнале RSI_CMD, и это переводит RSI в состояние RECEIVE, и в этом состоянии происходит прием 48-битного или 136-битного ответа карты (response). Состояние WAIT также может определять прерывания карты. Это опциональное функция (работа которой разрешается установкой бита RSI_CMD.IEN), относящаяся только к картам MMC. Когда этот бит установлен, таймер таймаута, который обычно стартует при входе в состояние WAIT, запрещен. RSI остается в этом состоянии, пока не будет детектировано прерывание карты. Карты, которые реализуют эту функцию, могут иметь отложенный ответ, который срабатывает по внутреннему событию карты. Как только это событие произошло, карта посылает ответ. Тогда RSI детектирует start-бит ответа и переходит в состояние RECEIVE. RECEIVE State. В состоянии RECEIVE контроллер RSI читает ответ от карты на сигнале RSI_CMD. Если ответ (короткий или длинный) передает проверочный код CRC, то очищается флаг RSI_XFRSTAT.CMDACT и устанавливается флаг RSI_XFRSTAT.RESPEND. Если проверка CRC показала ошибку, то установится флаг RSI_XFRSTAT.CMDCRCFAIL. В любом случае машина состояний после приема перейдет в состояние IDLE. Ветка генерации CRC команды. Генератор CRC команды вычисляет 7-битную контрольную сумму CRC для всех 40 бит, предшествующих коду CRC для 48-битных команд и 48-битных ответов. Проверяемые биты включают start-бит, флаг передатчика, индекс команды и аргумент команды (или статус карты). 7-битная контрольная сумма CRC вычисляется для первых 120 бит поля содержимого регистра длинного формата ответа. Обратите внимание, что start-бит, бит передатчика и 6 бит проверки не используются в вычислении CRC для длинного ответа. Контрольная сумма CRC команды и ответа это 7-битное значение, которое вычисляется по следующему алгоритму. CRC[6:0] = Остаток (x7 * M(x))/G(x) Здесь G(x) = x7 + x3 + 1 Для длинного ответа: M(x) = x39 * (start-бит) + ... + x0 * (последний бит перед CRC) Для короткого ответа: M(x) = x19 * (start-бит) + ... + x0 * (последний бит перед CRC) [Интерфейс данных RSI] Данные передаются в RSI и из RSI через сигналы шины данных RSI_D0..RSI_D7. Ширина шины данных RSI конфигурируется полем бит RSI_CTL.BUSWID. По умолчанию это 1-битный режим шины, когда данные передаются через сигнал RSI_D0. 4-битный режим или 8-битный режим можно разрешить после соответствующего конфигурирования карты для 4-битного или 8-битного режима работы. Машина состояний ветки данных RSI работает на частоте RSI_CLK. Эта машина покидает состояние IDLE, когда установлен бит RSI_DATA_CTL.DATEN, что разрешает передачу данных. Состояние, в которое машина переходит при выходе из состояния IDLE, определяется битом RSI_DATA_CTL.DATDIR. Путь алгоритма обработки данных машины состояний показан на рисунке ниже. Рис. 24-5. Машина состояний распространения данных RSI. Флаги статуса пути данных показаны в следующей таблице. Таблица 24-14. Флаги RSI_STATUS.
Передача данных в карту. Алгоритм передачи состоит из состояний WAIT_S, SEND и BUSY. Регистры RSI_BLKSZ, RSI_DATA_LEN и RSI_DATA_TMR должны быть сконфигурированы перед разрешением машины состояний пути данных с помощью регистра RSI_DATA_CTL. При выходе из состояния IDLE и входе в состояние WAIT_S контроллер RSI устанавливает флаг RSI_XFRSTAT.TXACT и копирует содержимое регистра RSI_DATA_LEN в регистр RSI_DATA_CNT. Поведение состояния SEND зависит от того, какой режим передачи сконфигурирован. • Stream transfer mode - если RSI был сконфигурирован для потокового режима передачи, то он посылает данные в карту, пока не обнулится счетчик RSI_DATA_CNT, и в этот момент установится флаг RSI_XFRSTAT.DATEND, и машина вернется в состояние IDLE. Дополнительно переход RSI_DATA_CNT в 0 активирует машину пути обработки команды, если она в настоящий момент находится в состоянии PEND. Если в любой момент потока передачи FIFO передачи становится пустым, и данные недоступны в FIFO в момент, когда должна быть следующая передача, установится флаг RSI_XFRSTAT.TXUNDR перед возвратом в состояние IDLE. • Block transfer mode - в этом режиме передаются RSI_BLKSZ байт, как это указано записью в регистр RSI_DATA_CTL. Каждый передаваемый байт также декрементирует счетчик RSI_DATA_CNT. По завершении передачи блока RSI прикладывает генерируемую внутри себя контрольную сумму CRC16 и end-бит к данным, передаваемым через сигналы RSI_D0..RSI_D7. После этого RSI ожидает от карты токена ответа через сигнал RSI_D0, который покажет, были ли корректно приняты данные картой, или нет. Если токен ответа CRC карты показывает, что данные были корректно приняты картой, то перед переходом машины в состояние BUSY установится флаг RSI_XFRSTAT.DATBLKEND. Если данные не были корректно приняты картой, то перед входом в состояние IDLE установится флаг RSI_XFRSTAT.DATCRCFAIL. Когда декремент счетчика RSI_DATA_CNT достигнет 0, установится флаг RSI_XFRSTAT.DATEND. Если общее количество байт, переданных для текущего блока данных, когда RSI_DATA_CNT достиг 0, и переданное количество байт не равно RSI_BLKSZ, передача остановится, и установится флаг RSI_XFRSTAT.DATCRCFAIL. Ветка алгоритма обработки данных вернется в состояние IDLE. Если в любой момент передачи блока FIFO передачи оказывается пустым, когда должна произойти следующая передача, то перед возвратом в состояние IDLE установится флаг RSI_XFRSTAT.TXUNDR. Во время состояния BUSY контроллер RSI постоянно отслеживает уровень сигнала RSI_D0, который показывает логическим нулем, что карта находится в состоянии занятости. Когда было детектировано состояние лог. 1 на RSI_D0, то карта больше не занята, и машина состояний вернется в состояние WAIT_S. Тогда машина вернется либо в состояние IDLE, если все данные были отправлены, или в состояние SEND, чтобы началась передача другого блока. На входе в состояние BUSY контроллер RSI начинает декрементировать значение таймаута, указанного в регистре RSI_DATA_TMR. Если счетчик таймаута RSI обнулился до того, как сигнал RSI_D0 перешел в лог. 1, то контроллер RSI установит флаг RSI_XFRSTAT.DATTO и вернется в состояние IDLE. Прием данных от карты. Алгоритм приема состоит из состояний WAIT_R и RECEIVE. Должны быть сконфигурированы регистры RSI_BLKSZ, RSI_DATA_LEN и RSI_DATA_TMR перед разрешением машины состояний с помощью регистра RSI_DATA_CTL. При выходе из состояния IDLE и входе в состояние WAIT_R контроллер RSI установит флаг RSI_XFRSTAT.RXACT и скопирует RSI_DATA_LEN в RSI_DATA_CNT. Поведение состояния RECEIVE зависит от режима передачи. Как только алгоритм обработки приема вошел в состояние WAIT_R после разрешения транзакции приема, контроллер RSI начитает декрементировать значение таймаута, предоставленное в регистре RSI_DATA_TMR. Если RSI был сконфигурирован для 1-битной шины данных, то установится флаг RSI_XFRSTAT.DATTO, если start-бит не был детектирован на сигнале RSI_D0 до того, как счетчик обнулился таймаута. Машина состояний вернется в состояние IDLE. Если RSI был сконфигурирован для 4-битной шины данных, и start-бит не был детектирован на всех четырех сигналах RSI_D0..RSI_D3 перед обнулением счетчика таймаута, то установится флаг RSI_XFRSTAT.DATTO. Машина состояния вернется в состояние IDLE. Если start-бит был детектирован на некоторых, но не всех, сигналах RSI_D0..RSI_D3 на одном и том же такте выборки, то установится флаг RSI_XFRSTAT.SBITERR, и машина состояний вернется в состояние IDLE. При корректном детектировании start-бита машина состояний переходит в состояние RECEIVE. Поведение состояния RECEIVE отличается для поточной передачи и блочной передачи. • Stream transfer mode - для потоковой передачи принятые данные упаковываются в байты и записываются в FIFO данных. Данные постоянно принимаются и записываются в FIFO данных, пока декремент счетчика RSI_DATA_CNT не достигнет нуля. Когда счетчик достигнет нуля, оставшиеся данные в регистре сдвига запишутся в FIFO, установится флаг RSI_XFRSTAT.DATEND, и машина состояний перейдет в состояние WAIT_R. Когда было определено, что FIFO приема пуст, установится флаг RSI_XFRSTAT.RXFIFOZERO, и машина перейдет в состояние IDLE. Если FIFO данных становится заполненным, и данные не были выбраны (прочитаны) из него до того, как в FIFO запишется следующий байт, то установится флаг RSI_XFRSTAT.RXOVER. Тогда машина состояний вместо WAIT_R перейдет в состояние IDLE. • Block transfer mode - в режиме блочной передачи принятые данные упаковываются в байты и записываются в FIFO данных. Когда принято RSI_BLKSZ байт, RSI читает биты CRC16. Если принятая CRC совпадает с вычисленной внутри CRC, то установится флаг RSI_XFRSTAT.DATBLKEND и состояние перейдет в WAIT_R. Если счетчик RSI_DATA_CNT истек на выравнивании по концу блока RSI_BLKSZ, установятся флаги RSI_XFRSTAT.DATEND и RSI_XFRSTAT.DATBLKEND, и машина состояний перейдет в WAIT_R. Когда было определено, что FIFO приема пуст, установится флаг RSI_XFRSTAT.RXFIFOZERO, и состояние перейдет в IDLE. Если счетчик RSI_DATA_CNT обнулился до конца блока RSI_BLKSZ, то установится флаг RSI_XFRSTAT.DATCRCFAIL. Состояние перейдет в IDLE. Вычисление CRC данных. Генератор CRC данных вычисляет 16-битную контрольную сумму для всех бит, отправленных или принятых для имеющейся транзакции блока (передачи данных на основе потока недоступны). Для 1-битной конфигурации шины CRC16 вычисляется для всех данных, отправленных через сигнал RSI_D0. Для 4-битной шины данных CRC16 вычисляется для каждого сигнала RSI_D0..RSI_D3. Контрольная сумма данных это 16-битное значение, вычисляемое следующим образом. CRC[15:0] = Остаток (x16 * M(x))/G(x) Здесь: G(x) = x16 + x12 + x5 + 1 [RSI Data FIFO] FIFO данных имеет буфер данных 32-битной ширины и глубины из 16 слов. Он работает с логикой передачи и приема. Конфигурация FIFO зависит от состояния флагов RSI_XFRSTAT.TXACT и RSI_XFRSTAT.RXACT. Если установлен флаг RSI_XFRSTAT.TXACT, то FIFO работает как FIFO передачи, предоставляя данные для RSI при передаче в карту. Если установлен флаг RSI_XFRSTAT.RXACT, то FIFO работает как FIFO приема, где RSI записывает в него данные, принятые от карты. Если ни один из этих флагов не установлен, то работа FIFO запрещена. Когда запрещена работа FIFO передачи, все флаги статуса передачи сбрасываются, и сбрасываются в 0 все указатели чтения и записи. RSI выставляет флаг RSI_XFRSTAT.TXACT при старте передачи данных. Во время передачи данных логика передачи поддерживает флаги статуса FIFO передачи так, как показано в следующей таблице. Таблица 24-15. Флаги статуса RSI Transmit FIFO.
Когда запрещена работа FIFO приема, все флаги статуса приема сбрасываются, и указатели приема и передачи сбрасываются в 0. Контроллер RSI выставляет флаг RXACT при старте транзакции чтения данных. Во время передачи данных логика приема поддерживает флаги статуса FIFO приема так, как показано в следующей таблице. Таблица 24-16. Флаги статуса RSI Receive FIFO.
[Определение занятости/готовности карты (Busy/Ready)] Некоторые команды, наподобие CMD6, могут выставлять сигнал занятости переводом сигнала данных RSI_D0 signal в лог. 0 через 2 такта после завершения end-бита команды. Установка RSI_CMD.CHKBUSY конфигурирует RSI проверят наличие сигнала занятости. Обратите внимание, что сигналы RSI_D1..RSI_D3 управляются картой, хотя их состояние не имеет значение. Если бит RSI_CMD.CHKBUSY разрешен определенной командой, то на третьем такте после end-бита команды сигнал RSI_D0 проверяется, чтобы определить, находится ли он в лог. 0. Если RSI_D0 в лог. 0, то установится бит RSI_STAT0.BUSYMODE. Когда сигнал RSI_D0 переходит в лог. 1, установится бит RSI_STAT0.CARDRDY (этот бит типа W1C, т. е. чтобы его очистить, нужно записать в него единицу), очистится бит RSI_STAT0.BUSYMODE, и генерируется прерывание готовности карта (ready interrupt). Если RSI_D0 не переходит в лог. 0 на третьем такте после end-бита, то считается, что карта не занята. Бит RSI_STAT0.BUSYMODE регистра статуса состояния исключения RSI не установится, генерируется прерывание готовности карты, и установится бит RSI_STAT0.CARDRDY. Если бит RSI_CMD.CHKBUSY не разрешен, сигнал RSI_D0 не проверяется на условие занятости. Бит RSI_STAT0.BUSYMODE также обновляется во время операции записи, если сигнал RSI_D0 притягивается к лог. 0, когда карта программирует данные на свой носитель. В этом случае бит RSI_STAT0.CARDRDY не обновляется и прерывание готовности карты не генерируется. Диаграммы времени занятости (busy timing) карты показаны на следующем рисунке. Рис. 24-6. Работа индикации занятости карты (Card Busy). [Поддержка SDIO] Две дополнительные функции RSI реализуют функциональность SDIO. • Поддержка аппаратного прерывания через вывод RSI_D0. Устройства SDIO могут иметь несколько источников прерывания, которые могут быть привязаны к одной линии прерывания. Это прерывание является чувствительным к уровню (не к перепаду), позволяя нескольким функциям генерировать прерывание одновременно. Таким образом, запрос на прерывание будет постоянно выставлен, пока все источники, которые сгенерировали прерывание, не будут определены и очищены контроллером RSI. Все источники прерываний могут быть найдены путем опроса устройства SDIO. Эти прерывания очищаются операциями, уникальными для каждой функции. Устройство SDIO отправляет запрос на прерывание контроллеру RSI, вставляя сигнал RSI_D1 в лог. 0. Состояние прерывания показывает бит RSI_STAT0.SDIOINT. Этот статус может быть сконфигурирован битом RSI_IMSK0.SDIOINT, чтобы сгенерировать прерывание процессора. Когда RSI сконфигурирован для 1-битной шины, прерывание, генерируемое SDIO, не имеет ограничений по времени, потому что RSI_D1 работает как отдельный сигнал, выделенный исключительно под сигнал прерывания IRQ. RSI должен быть сконфигурирован с использованием битов RSI_CFG.DATPUP, которые разрешают верхние нагрузочные резисторы pull-up на всех сигналах RSI_D0..RSI_D7. Когда RSI определил лог. 0 на сигнале RSI_D1, RSI выставляет флаг RSI_STAT0.SDIOINT. Этот флаг выставляется, пока сигнал RSI_D1 не вернется снова в состояние лог. 1. Когда RSI сконфигурирован для 4-битной шины данных, сигнал RSI_D1 используется совместно между сигналом IRQ и сигналом RSI_D1. В этой конфигурации источник прерывания распознается контроллером RSI только в определенный период прерывания. [Режимы работы RSI] Следующие секции описывают функционал контроллера RSI в различных режимах работы. Card Identification Mode. Когда устройство (карта) подключена к RSI, впервые на устройство подано питание, устройство было определено хостом или сброшено, устройство должно быть сначала идентифицировано и инициализировано хостом. Программа определяет, совместимо ли устройство с контролером RSI, и реализовано программными драйверами. Эта фаза работы с картой общеизвестна как режим идентификации карты (card identification mode). Когда устройство находится в режиме идентификации карты, от хоста может понадобиться выполнить следующие действия. • Сброс устройства Весь обмен информацией между хостом и картой во время фазы идентификации карты происходят через сигнал RSI_CMD. Максимальная тактовая частота во время фазы идентификации обычно намного ниже, чем максимальная тактовая частота карты в рабочем режиме карты. Data Transfer Mode. Карта войдет в состояние приостановки (stand-by), известное как режим передачи данных (data transfer mode), когда ей будет назначен адрес RCA. Передачи данных могут происходить только когда устройство вошло в data transfer mode. Как только устройство перешло в data transfer mode, коммуникации осуществляются через RSI_CMD и RSI_D0..RSI_D7. Карта далее опрашивается для определения выбранной ширины шины данных, максимальной тактовой частоты и емкости памяти устройства. В этом месте ширину шины можно поменять, и можно увеличить тактовую частоту шины. Данные могут быть записаны в устройство или прочитаны из него с использованием следующих 2 методов. • Потоковые чтения и записи. Потоковые передачи дают постоянный поток данных, пока RSI не остановит передачу специальной командой. Для операций поточного чтения и записи устройством могут быть представлены дополнительные ограничения на максимальную рабочую частоту. Потоковые операции записи могут также иметь ограничения, зависящие от границ записываемого блока. • Блочные чтения и записи. Передачи, основанные на блоке приведут к тому, что произойдет передача блока заранее сконфигурированного размера. Размер блока зависит от устройства (карты SD), и он может быть получен чтением регистров устройства во время процедуры детектирования устройства. Передача данных между контроллером RSI и внутренней памятью процессора может быть выполнена двумя способами, описанными ниже. DMA Data Transfer. Контроллеру RSI назначен выделенный канал DMA. Этот канал DMA может быть сконфигурирован либо для передачи, либо для приема данных из FIFO данных RSI / в FIFO данных RSI. При этом перенос данных будет совершаться без участия ядра процессора. Core Data Transfer. Если канал RSI DMA запрещен, то FIFO передачи/приема может быть записан или прочитан ядром процессора через регистр RSI_FIFO, отображенный на адресное пространство памяти процессора (memory-mapped register, MMR). Чтобы избежать переполнения (overflow) или недогрузки (underflow) FIFO, ядро должно обращаться к регистрам FIFO одним из двух следующих способов. 1. Демаскирование прерываний опустошения FIFO передачи (RSI_XFR_IMSK0.TXFIFOZERO, RSI_XFR_IMSK1.TXFIFOZERO) или заполнения FIFO приема (RSI_XFR_IMSK0.RXFIFOFULL, RSI_XFR_IMSK1.RXFIFOFULL). В обработчике прерывания слово данных посылается в FIFO передачи или принятое слово вычитывается из FIFO приема. Boot Mode. Карты мультимедиа (MultiMedia Cards, MMC) основанные на спецификациях MMCA version 4.3 или более поздних, поддерживают специальный режим, известный как режим загрузки (boot mode). В этом режиме хост MMC может читать данные загрузки из подчиненного устройства MMC, удерживая сигнал RSI_CMD в состоянии лог. 0 после включения питания карты (power-on), или отправкой команды CMD0 с аргументом 0xFFFFFFFA (опционально для подчиненного устройства), перед выдачей команды CMD1. Данные могут быть прочитаны либо из выделенной области загрузки (dedicated boot area), или из области данных пользователя (user area). Normal Boot Mode. Перед разрешением обычного режима загрузки (normal boot mode) должны быть сконфигурированы биты счетчика времени загрузки (RSI_BOOT_TCNTR.SETUP и RSI_BOOT_TCNTR.HOLD) и бит типа режима загрузки (RSI_CFG.MMCBMODE=0). Иначе RSI будет использовать значения по умолчанию в 74 и 56 тактов RSI_CLK. Регистр RSI_DATA_TMR программируется, чтобы он работал как регистр таймаута загрузки данных (boot data timeout register). Если бит подтверждения загрузки (RSI_CFG.BACKEN) установлен, то также должен быть сконфигурирован регистр таймаута подтверждения загрузки (boot acknowledge timeout register, RSI_BACK_TOUT). Рис. 24-7. Диаграммы времени Normal Boot Mode. Когда аппаратура RSI разрешена для работы в normal boot mode путем установки бита RSI_CFG.MMCBEN, в одном цикле выполняются следующие задачи. 1. Сигнал RSI_CMD притягивается к лог. 0. Когда декремент счетчика boot setup дойдет до нуля, будет сгенерировано прерывание истечения времени настройки загрузки (boot setup time expire), и установится бит RSI_STAT0.BSETUPEXP. Это прерывание показывает, что карта вошла в состояние загрузки (boot state). Очистка этого бита также очистит и эту линию прерывания. Примечание: все биты регистра RSI_STAT0 имеют тип W1C (write-1-to-clear, т. е. для сброса бита нужно записать в него единицу). Если установлен бит подтверждения загрузки (RSI_CFG.BACKEN), то RSI переходит в состояние загрузки и ожидает подтверждения, которое должно вернуть подчиненное устройство в интервале времени, запрограммированном в регистре счетчика подтверждения загрузки (RSI_BACK_TOUT). Если подтверждение не было принято перед тем, как счетчик достигнет этой величины, будет сгенерировано прерывания таймута подтверждения загрузки, и установится бит таймаута подтверждения загрузки (RSI_STAT0.BACKTO). Если подтверждение было принято, но его значение не 010, то также сработает прерывание подтверждения загрузки (RSI_STAT0.BACKTO), и установится бит приема ошибочного подтверждения загрузки (RSI_STAT0.BACKBAD). В обоих этих случаях RSI войдет в состояние IDLE. Ядро должно прервать работу загрузки переводом сигнала RSI_CMD в лог. 1, что делается записью 0 в бит разрешения загрузки MMC (MMC boot enable bit, RSI_CFG.MMCBEN). Теперь начнет декрементироваться регистр счетчика удержания загрузки (boot hold counter, RSI_BOOT_TCNTR). Когда этот счетчик достигнет 0, сгенерируется прерывание истечения времени удержания загрузки (boot hold time expired interrupt), и установится бит RSI_STAT0.BHOLDEXP. RSI может теперь начать обычное функционирование, не связанное с загрузкой (хотя работа загрузки завершится неудачно). Когда передача данных разрешена записью в регистр RSI_DATA_CTL, если было принято подтверждение до того, как достиг нуля счетчик RSI_BACK_TOUT, RSI войдет в состояние WAIT_R, и будет ожидать start-бита данных. Когда передача данных разрешена записью в регистр RSI_DATA_CTL, если очищен бит RSI_CFG.BACKEN, то не будет ожидаться подтверждение, и RSI войдет в состояние WAIT_R. Подчиненное устройство начинает передавать данные загрузки до того, как дойдет до нуля значение регистра счетчика таймаута загрузки (boot data timeout counter register, RSI_DATA_TMR). Если этот счетчик дойдет до 0, когда машина состояния все еще в состоянии WAIT_R, то сгенерируется прерывание таймаута данных загрузки (boot data timeout interrupt), и установится соответствующий бит RSI_STAT0.BDATTO. После тайматуа RSI войдет в состояние IDLE. Когда все данные загрузки были приняты, ядро может записать 0 в бит RSI_CFG.MMCBEN, чтобы прерывать работу режима загрузки. Регистр счетчика удержания загрузки (boot hold counter RSI_BOOT_TCNTR) теперь начнет декрементироваться, и когда он достигнет нуля, сработает прерывание истечения времени удержания загрузки (boot hold time expired interrupt), и установится бит RSI_STAT0.BHOLDEXP. RSI может теперь начать обычное функционирование, не связанное с загрузкой (хотя работа загрузки завершится неудачно). Подчиненное теперь готово для работы CMD1. Хост должен начать обычную последовательность инициализации MMC отправкой команды CMD1. Alternate Boot Mode. Перед разрешением альтернативного режима загрузки (alternate boot mode), программируются биты счетчика тайминга загрузки (RSI_BOOT_TCNTR.SETUP и RSI_BOOT_TCNTR.HOLD) и бит типа режима загрузки (RSI_CFG.MMCBMODE=1). Иначе RSI будет использовать значения по умолчанию 74 и 56 тактов RSI_CLK. Программируется регистр RSI_DATA_TMR, чтобы он работал как регистр таймаута данных загрузки. Если установлен бит RSI_CFG.BACKEN, то программируется регистр таймаута подтверждения загрузки (RSI_BACK_TOUT). Рис. 24-8. Диаграммы времени Alternate Boot Mode. Примечание: все биты регистра RSI_STAT0 типа W1C (write-1-to-clear, т. е. чтобы очистить определенный бит, нужно записать в него единицу). Когда аппаратура RSI разрешена для alternate boot mode установкой бита MMC boot enable (RSI_CFG.MMCBEN=0), начнет декрементироваться счетчик настройки загрузки (boot setup counter, RSI_BOOT_TCNTR). Когда этот счетчик достигнет нуля, сгенерируется прерывание истечения времени настройки загрузки (boot setup time expired interrupt), и установится бит RSI_STAT0.BSETUPEXP. После получения прерывания boot setup time expired interrupt, посылается команда CMD0 с аргументом 0xFFFFFFFA к подчиненному устройству (карте MMC), чтобы начать операцию загрузки (boot). Когда последний бит CMD0 пройдет по сигналу CMD, начнут инкрементироваться (начиная с 0) регистр счетчика таймаута подтверждения загрузки (boot acknowledge timeout counter register, RSI_BACK_TOUT) и регистр счетчика таймаута данных загрузки (boot data timeout counter register, RSI_DATA_TMR). Если установлен бит подтверждения загрузки (boot acknowledge bit RSI_CFG.BACKEN), то RSI войдет в состояние загрузки и будет ожидать подтверждения от подчиненного устройства (карты) в интервале времени, запрограммированном в регистре счетчика таймаута подтверждения (RSI_BACK_TOUT). Если подтверждение не было получено до истечения этого счетчика, генерируется прерывание таймаута подтверждения загрузки, и установится бит таймаута подтверждения (boot acknowledge timeout bit RSI_STAT0.BACKTO). Если подтверждение было принято, но его значение не 010, то генерируется прерывание получения поврежденного подтверждения, и установится соответствующий бит (boot ack received is corrupted, RSI_STAT0.BACKBAD). В обоих этих случаях RSI вернется обратно в состояние IDLE. Ядро процессора может прервать операцию загрузки, если сначала очистит бит RSI_CFG.MMCBEN, и затем отправит команду CMD0. В этот момент начнет декрементироваться регистр счетчика удержания загрузки (boot hold counter register, RSI_BOOT_TCNTR). Когда этот счетчик дойдет до нуля, будет сгенерировано прерывание boot hold time expired, и установится бит RSI_STAT0.BHOLDEXP. RSI может теперь начать обычное функционирование, не связанное с загрузкой (хотя работа загрузки завершится неудачно). Если подтверждение было принято перед истечением счетчика RSI_BACK_TOUT, то RSI войдет в состояние WAIT_R, как только передача данных будет разрешена записью в регистр RSI_DATA_CTL, и RSI будет ожидать start-бита данных. Если бит RSI_CFG.BACKEN установлен в 0, то подтверждение не ожидается, и RSI войдет в состояние WAIT_R, как только передача данных разрешена записью в регистр RSI_DATA_CTL. Подчиненное устройство начнет отправлять данные загрузки до того, как достигнет нуля RSI_DATA_TMR. Если этот счетчик истечет, но машина состояний все еще находится в состоянии WAIT_R (т. е. данные все еще не поступают), то сгенерируется прерывание boot data timeout, и установится флаг RSI_STAT0.BDATTO. После таймаута RSI перейдет в состояние IDLE. Когда будут приняты все данные загрузки, ядро прервет операцию загрузки очисткой бита RSI_CFG.MMCBEN и отправкой команды CMD0, и счетчик RSI_BOOT_TCNTR начнет декрементироваться. Как только этот счетчик дойдет до нуля, сгенерируется прерывание boot hold time expired, и установится бит RSI_STAT0.BHOLDEXP. RSI может теперь работать в обычном режиме (не относящемся к режиму загрузки), даже если загрузка потерпела неудачу. Подчиненное устройство (карта MMC) готово теперь начать операцию CMD1, и хост должен инициировать нормальную процедуру инициализации карты MMC отправкой команды CMD1. Примечание: если загрузка вдруг была прервана по любой причине, то процедура загрузки не может быть повторно возобновлена сначала без передергивания питания (отключения и включения) карты MMC. Sleep Mode. Карты MultiMedia (MMC), основанные на спецификации MMCA version 4.3 или более поздней, поддерживают режим сна (sleep mode). Карта может быть переключена между состоянием сна и состоянием приостановки (standby) с использованием команды SLEEP/WAKEUP (CMD5). В состоянии сна потребление энергии устройства памяти минимально. Команда SLEEP используется для инициирования перехода состояния от standby в состояние sleep. Устройство памяти покажет занятость на фазе перехода путем перевода сигнала RSI_D0 в лог. 0. Состояние сна достигнуто, когда устройство памяти (карта) перестало притягивать к лог. 0 сигнал RSI_D0 (уровень RSI_D0 перешел в лог. 1). Команда WAKEUP используется для инициации перехода состояния из сна в standby. Устройство памяти показывает свою занятость в фазе перехода путем перевода сигнала RSI_D0 в лог. 0. Состояние standby достигнуто, когда устройство памяти перестало притягивать к лог. 0 сигнал RSI_D0 (уровень RSI_D0 перешел в лог. 1). Рис. 24-9. Работа сна и пробуждения. Когда карта находится в состоянии standby, то она может перейти в режим сна, если ей отправить команду CMD5 с аргументом, где установлен в лог. 1 бит 15. Счетчик RSI_SLP_WKUP_TOUT начнет декрементироваться при прохождении end-бита этой команды. Теперь аппаратура RSI ждет фронта нарастания уровня на сигнале RSI_D0. Если этот перепад от 0 к 1 не был детектирован на RSI_D0 до истечения счетчика, то сгенерируется прерывание walk-up timer expired, и установится соответствующий бит RSI_STAT0.SLPWKPTOUT. Если фронт нарастания уровня появился на выводе RSI_D0 до истечения счетчика RSI_SLP_WKUP_TOUT, то сгенерируется прерывание вхождения карты в режим сна (card entered sleep state interrupt) и установятся биты RSI_STAT0.SLPDONE и RSI_STAT0.SLPMODE. Это покажет, что карта успешно вошла в состояние сна (sleep state). Бит RSI_STAT0.SLPDONE имеет тип W1C (очищается записью в него единицы), в то время как бит RSI_STAT0.SLPMODE имеет тип (read-only), т. е. RSI_STAT0.SLPMODE нельзя никак очистить независимо от режима сна карты. В этот момент можно полностью снять питание с карты. Когда нужно снова возобновить работу карты, на нее должно быть подано питание. Удостоверьтесь, что установился достаточный уровень напряжения питания перед инициацией перехода карты (отправкой команды WAKEUP) из режима сна в режим standby. Когда выдана команда WAKEUP отправкой CMD5 с аргументом, где бит 15 сброшен в 0, начнет декрементироваться счетчик RSI_SLP_WKUP_TOUT. Если нарастание уровня сигнала RSI_D0 не было определено перед истечением счетчика, то сгенерируется прерывание sleep walk-up timer expired, и установится соответствующий бит RSI_STAT0.SLPWKPTOUT. Если был детектирован фронт нарастания на выводе RSI_D0 до истечения счетчика, то сгенерируется прерывание card entered standby state, установится соответствующий бит RSI_STAT0.WKPDONE, и очистится регистр RSI_STAT0.SLPMODE. Это показывает, что карта успешно вошла в состояние standby, и теперь можно возобновить нормальную работу карты. Команда SLEEP распознается только если карта находится в состоянии standby, и команда WAKEUP распознается, только когда карта в состоянии сна. [Управление событиями RSI (Event Control)] Сигналы прерывания RSI. У RSI есть сигналы прерывания, которые подключены к системному контроллеру событий (System Event Controller, SEC). Для дополнительной информации см. секцию "ADSP-BF60x Interrupt List" в главе, посвященной System Event Controller (SEC). Сигналы статуса (RSI Status) и ошибки (RSI Error). У аппаратного блока RSI есть 22 индивидуальных бита состояния (status-биты) в регистре RSI_XFRSTAT, которые можно сконфигурировать для генерации прерывания. Эти status-биты могут быть привязаны к двум прерываниям, RSI_INT0 или RSI_INT1. Это дает большую гибкость в конфигурировании системы. Чтобы генерировать прерывание на RSI_INT0, это прерывание должно быть разрешено установкой соответствующего бита в регистре RSI_XFR_IMSK0. Прерывания, которые нужно генерировать на RSI_INT1, разрешаются установкой соответствующего бита регистра RSI_XFR_IMSK1. В дополнение к регистру RSI_XFRSTAT, каждый из флагов регистра RSI_STAT0 также может генерировать прерывание. Прерывания для флагов RSI_STAT0 разрешаются установкой соответствующего бита в регистре RSI_IMSK0. Эти прерывания отправляются к контролеру SEC только через прерывание RSI_INT0. [Модель программирования RSI] В этой секции будет описана модель программирования RSI для разных режимов работы RSI. Следующие секции описывают идентификацию карт SD и MMC. Идентификация карты SD. Используйте следующую процедуру для идентификации карты SD. 1. Выдайте команду IDLE для карты с использованием регистра RSI_CMD. 2. Выдайте команду SEND_IF через регистр RSI_CMD, с предоставлением напряжения питания хоста (host supply voltage, т. е. напряжение, которое хост подает на карту) и маски проверки (check pattern) через регистр RSI_ARG. • Если был принят допустимый ответ с совместимым диапазоном напряжения питания и совпавшей маской проверки, то карта совместима с версией стандарта SD 2.00 или более поздним. Результат шага: команда ожидает ответа (response) типа R7. 3. Выдайте команду RSI_SEND_OP_COND через регистр RSI_CMD с предоставлением поддерживаемого окна напряжений и информацией, поддерживает ли хост карты повышенной емкости (high capacity, SDHC), с использованием регистра RSI_ARG. • Если карта остается в состоянии занятости (busy), или не был принят допустимый ответ в течение 1 секунды, то нужно отказаться от работы с этой картой. Результат шага: RSI ожидает ответ R3 на эту команду. RSI может отказаться от работы с картой, если у неё несовместимый с хостом диапазон напряжения питания. 4. Если хост поддерживает режим карт повышенной емкости (high-capacity card, SDHC), то проверяется, содержит ли ответ в регистре RSI_RESP0 установленный бит статуса емкости карты (card capacity status, CCS). • Если бит CCS установлен, то это карта повышенной емкости (SDHC), соответствующая стандарту SD версии 2.00 или более позднему, и нужно перейти к шагу 5. a. Выдайте команду RSI_SEND_OP_COND через регистр RSI_CMD, предоставив поддерживаемый диапазон напряжений и бит поддержки карт повышенной емкости (бит HCS), установленный в 0, с использованием регистра RSI_ARG. Результат шага: RSI ожидает ответ R3 на эту команду, и после получения ответа следует отказаться от работы с картой, если карта показала несовместимый диапазон напряжения питания. b. Если карта ответила с состоянием занятости, то команда RSI_SEND_OP_CMD отправляется повторно до тех пор, пока карта не покажет состояние готовности. Результат шага: карта должна пройти идентификацию в течение 1 секунды. Если по истечению этого времени карта все еще находится в состоянии занятости, или от неё не поступил допустимый ответ, то следует отказаться от работы с этой картой. Как только ответ карты показал, что карта находится в готовности, то тип карты идентифицирован как карта памяти стандартной емкости SD Version 1.x. 5. Выдать команду ALL_SEND_CID. Результат шага: на эту команду ожидается ответ типа R2. В нем будет содержаться 128-битный регистр идентификации карты (card identification, CID), и карта перейдет в состояние готовности из режима идентификации. 6. Выдать команду SEND_RELATIVE_ADDR. Результат шага: ожидается ответ R6. В нем ответе карта пришлет свой новый относительный адрес (relative card address, RCA) который нужно использовать для выбора карты в будущих передачах данных. Конечный результат: карта переходит в режим standby, завершив тем самым процедуру идентификации. Процедура идентификации карты MMC. Используйте следующую процедуру для идентификации MultiMedia Card (MMC). 1. Выдайте карте команду IDLE с помощью регистра RSI_CMD. 2. Выдайте карте команду SEND_OP_COND с помощью регистра RSI_CMD, предоставив в ней окно напряжения питания, с которым хост совместим, и с режимом доступа, который хост поддерживает (адресация данных байтом или сектором), используя регистр RSI_ARG. Результат шага: RSI ожидает ответ типа R3. Это позволит хосту отказаться от работы с картой, если она несовместима с напряжением питания, или если режим доступа (тип адресации данных карты) не поддерживается программным обеспечением хоста. Если карта в ответе покажет, что она находится в состоянии занятости (busy), то этот шаг следует повторить, пока карта не придет в состояние готовности (ready), или следует после определенного количества попыток отказаться от работы с этой картой. 3. Выдайте команду ALL_SEND_CID с использованием регистра RSI_CMD. Результат шага: RSI ожидает ответ R2 на эту команду. В нем карта пришлет свой 128-битный регистр идентификации карты (card identification, CID) и карта перейдет из состояния готовности (ready) в режим идентификации. 4. Выдайте команду SET_RELATIVE_ADDR, предоставив в ней 16-битный относительный адрес карты (relative card address, RCA) с использованием регистра RSI_ARG. Этот адрес должен быть назначен карте. Результат шага: на эту команду ожидается ответ типа R1. Он покажет, что карте назначен предоставленный адрес RCA, который должен будет использоваться в будущих передачах данных между хостом и картой. Конечный результат: карта перейдет в режим standby, завершив процедуру идентификации. [Передача данных] Следующая секция описывает, как запрограммировать аппаратуру RSI для различных сценариев передач данных, когда происходит работа в обоих режимах - с помощью DMA и с помощью доступа со стороны ядра процессора. Одиночная запись блока (Single Block Write). Операции записи блока обычно составляют из 512 байт на блок. Если было определено, что карта поддерживает другие длины блока, или размер блока по умолчанию, который показывает регистр CID, не равен 512, то длина блока RSI должна быть сконфигурирована соответствующим образом. Длина блока карты и длина блока RSI должны быть всегда сконфигурированы на одинаковый размер. Длина блока RSI конфигурируется через регистр RSI_BLKSZ. ПРЕДОСТЕРЕЖЕНИЕ: важно знать, когда разрешена машина состояний ветки алгоритма поддержки данных (data path state machine), когда данные записаны в регистр FIFO для передачи в карту. Транзакции записи требуют, чтобы данные были записаны после того, как был получен ответ на команду WRITE_BLOCK. Если машина состояний data была разрешена перед отправкой команды WRITE_BLOCK, то данные не должны записываться в FIFO передачи, пока не будет получен ответ от карты, что показывается битом RSI_XFRSTAT.RESPEND. Если не придерживаться этой процедуры, то это приведет к нарушению параметров диаграмм времени записи в карту и в результате произойдет ошибка CRC данных. Ниже показана процедура для выполнения записи одного блока с применением чисто программного управления потоком данных (без использования DMA). 1. Запишите RCA карты в старшие 16 бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, и сконфигурируйте машину состояний команды на ожидание короткого ответа от карты путем установки бита RSI_CMD.RSP и очистки бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите, когда установится бит RSI_XFRSTAT.RESPEND, после чего выполните операцию W1C с битом RSI_XFRSTAT_CLR.RESPEND для сброса этого бита. 4. Используйте регистр RSI_RESP0, чтобы убедиться, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок. 5. Сконфигурируйте количество передаваемых байт в регистре RSI_DATA_LEN. Обычно это 512 байт для одного блока данных. 6. Запишите подходящее значение таймаута для операции записи в регистр RSI_DATA_TMR. 7. Запишите начальный адрес места назначения данных на карте в регистр RSI_ARG. Дополнительная информация: этот адрес должен быть выровнен по 512-байтной границе, если не разрешен не выровненный доступ к памяти, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 8. Запишите команду WRITE_BLOCK в регистр RSI_CMD, конфигурируя машину состояний команд ожидать короткий ответ путем установки бита RSI_CMD.RSP и очистки бита RSI_CMD.LRSP. Результат шага: от карты придет тип ответа R1. 9. Ожидайте окончания ответа на команду, что будет показывать установка бита RSI_XFRSTAT.RESPEND. Когда это было определено, сбросьте этот бит операцией W1C с битом RSI_XFRSTAT_CLR.RESPEND. 10. Сконфигурируйте регистр RSI_BLKSZ значением 512 для установки блока размером 512 байт. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 11. Установите бит RSI_DATA_CTL.DATEN, чтобы разрешить работу машины состояний данных (data path state machine). 12. Запишите данные в регистр RSI_FIFO, пока FIFO не заполнится, что покажет бит RSI_XFRSTAT.TXFIFOFULL. a. Продолжайте записывать данные, пока FIFO показывает, что он еще не заполнен. Опционально программы могут записывать данные порциями по восемь 32-битных слов, пока бит RSI_XFRSTAT.TXFIFOSTAT=1 (буфер передачи FIFO наполовину пуст). 13. Ждите ответа от карты токеном CRC, что будет показано установкой бита RSI_XFRSTAT.DATBLKEND. Дополнительная информация: бит RSI_XFRSTAT.DATEND также будет установлен в этот момент, если регистр RSI_DATA_LEN на шаге 5 был сконфигурирован для 512 байт. 14. Выполните операцию W1C для битов RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND, чтобы сбросить биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND. Ниже показана процедура для выполнения записи одного блока с применением аппаратного управления потоком данных аппаратуры DMA. 1. Запишите RCA карты в старшие 16-бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, конфигурируя машину состояния команд на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите установки бита RSI_XFRSTAT.RESPEND, после чего сбросьте его записью W1C бита RSI_XFRSTAT_CLR.RESPEND. 4. Убедитесь, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок путем проверки ответа, который содержится в регистре RSI_RESP0. 5. Сконфигурируйте присвоение канала DMA контроллеру RSI. a. Сконфигурируйте регистр DMA_ADDRSTART адресом первого байта данных, который должен быть записан на карту. 6. Как только канал DMA сконфигурирован и разрешен, запишите количество передаваемых байт в регистр RSI_DATA_LEN. Дополнительная информация: это значение будет равно 512 байт для одного блока. 7. Запишите подходящее значение таймаута для операции записи в регистр RSI_DATA_TMR. 8. Запишите адрес места назначения данных на карте в регистр RSI_ARG. Дополнительная информация: этот адрес должен быть выровнен по 512-байтной границе, если не разрешен не выровненный доступ к памяти, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 9. Запишите команду WRITE_BLOCK в регистр RSI_CMD, конфигурируя машину состояния команды на ожидание короткого ответа путем установки бита RSI_CMD.RSP и очистки бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. 10. Ожидайте индикации прохождения end-бита ответа на команду, что будет показано лог. 1 в бите RSI_XFRSTAT.RESPEND, и очистите его операцией W1C для бита RSI_XFRSTAT_CLR.RESPEND. 11. Сконфигурируйте регистр RSI_BLKSZ значением 512 для блока из 512 байт. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 12. Установите биты RSI_DATA_CTL.DATEN=1 (разрешить ветку data алгоритма машины состояний) и RSI_DATA_CTL.DMAEN=1 (разрешить DMA). 13. Ждите ответа карты токеном CRC что будет показано установкой в 1 бита RSI_XFRSTAT.DATBLKEND. Дополнительная информация: бит RSI_XFRSTAT.DATEND также будет в этом месте установлен, если на шаге 5 регистр RSI_DATA_LEN был установлен значением 512 байт. 14. Выполните операцию W1C над битами RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND, чтобы очистить биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND. Также очистите бит DMA_STAT.IRQDONE, если это применимо. Одиночное чтение блока (Single Block Read). Операции чтения блока обычно состоят из 512 байт данных на блок. Если было определено, что карта поддерживает другие размеры блоков, или длина блока по умолчанию, указанная в регистре CID, не равна 512, то длина блока контроллера RSI должна быть сконфигурирована соответственно. Длина блока карты и длина блока RSI должны всегда быть сконфигурированы одинаково. Длина блока RSI конфигурируется в регистре RSI_BLKSZ. Примечание: для передач данных от карты в RSI важно знать, когда машина состояний данных разрешена, и когда читать данные из FIFO приема. Причина этого в том, что транзакции чтения могут произойти по сигналам RSI_D0..RSI_D7 до того, как придет ответ на команду. Таким образом, машина состояний ветки данных и контроллер DMA (если DMA используется) должны быть разрешены одним из следующих способов: • Перед выдачей команды, которая запускает чтение данных пакета. Примечание: если для чтения FIFO приема используется ядро процессора, то рекомендуется не зависеть от флага окончания ответа на команду (RSI_XFRSTAT.RESPEND), чтобы определить конец ответа на команду. Причина в том, что данные могут подаваться на сигналы RSI_D0..RSI_D7 через 2 такта после прохождения последнего бита команды. Как минимум 48 дополнительных тактов RSI_CLK передаются до того, как будет принят ответ на команду, и в течение этого времени буфер приема может потенциально получить 24 байта данных по 4-битной шине, и будет достигнуто состояние наполовину заполненного буфера. Программное обеспечение должно гарантировать, что буфер приема не заполнится перед тем, как данные будут прочитаны из FIFO приема. Используйте следующую процедуру для выполнения чтения одного блока, используя чисто программное управление потоком данных. 1. Запишите RCA карты в верхние 16-бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, конфигурируя машину состояния команд на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите установки бита RSI_XFRSTAT.RESPEND, после чего сбросьте его записью W1C бита RSI_XFRSTAT_CLR.RESPEND. 4. Убедитесь, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок путем проверки ответа, который содержится в регистре RSI_RESP0. 5. Сконфигурируйте количество передаваемых байт в регистре RSI_DATA_LEN. Обычно это 512 байт для одного блока данных. 6. Запишите подходящее значение таймаута для операции чтения в регистр RSI_DATA_TMR. 7. Запишите адрес данных на карте, откуда должны быть прочитаны данные, в регистр RSI_ARG. Дополнительная информация: этот адрес должен быть выровнен по 512-байтной границе, если не разрешен не выровненный доступ к памяти, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 8. Сконфигурируйте в регистре RSI_DATA_CTL значение поля RSI_BLKSZ, которое устанавливается в значение 512 для 512-байтного блока данных. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 9. Установите бит RSI_DATA_CTL.DATEN, чтобы разрешить ветку алгоритма данных машины состояний, и бит RSI_DATA_CTL.DATDIR для конфигурирования направления данных от карты к контроллеру. 10. Запишите команду READ_SINGLE_BLOCK в регистр RSI_CMD, конфигурируя ветку алгоритма команды машины состояний на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP bit. Результат шага: от карты придет ответ типа R1. Примечание: чтобы удовлетворить ограничениям диаграмм времени, относящимся к операциям чтения блока, не ждите установки бита RSI_XFRSTAT.RESPEND — сразу переходите к следующему шагу. Это потому, что карта может отправить данные до того, как может быть завершен ответ через сигнал RSI_CMD, переходя немедленно к шагу 11 чтобы гарантировать, что не произойдет переполнение FIFO приема. 11. Опрашивайте бит RSI_XFRSTAT.RXFIFORDY или бит RSI_XFRSTAT.RXFIFOZERO, который покажет доступность принимаемых данных в FIFO, или покажет, что буфер приема FIFO пуст. Как только в буфере приема FIFO появятся данные, читайте их оттуда через регистр RSI_FIFO, пока не будут прочитаны все 512 байт. 12. Как только все байты будут прочитаны, ждите бита RSI_XFRSTAT.DATBLKEND, который покажет, что данные были корректно приняты, и прошли проверку на корректность CRC. Может быть также установлен бит RSI_XFRSTAT.DATEND, в зависимости от значения, записанного в регистр RSI_DATA_LEN. 13. Операцией W1C с битами RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND очистите биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND. Используйте следующую процедуру для выполнения чтения одного блока, используя аппаратное управление потоком данных аппаратуры DMA. 1. Запишите RCA карты в верхние 16-бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, конфигурируя машину состояния команд на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите установки бита RSI_XFRSTAT.RESPEND, после чего сбросьте его записью W1C бита RSI_XFRSTAT_CLR.RESPEND. 4. Убедитесь, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок путем проверки ответа, который содержится в регистре RSI_RESP0. 5. Сконфигурируйте канал DMA, присвоенный контроллеру RSI. a. Сконфигурируйте регистр DMA_ADDRSTART адресом первого байта, где должны быть сохранены принятые данные. 6. Запишите количество байт для передачи в регистр RSI_DATA_LEN. Дополнительная информация: это будет 512 байт для одного блока. 7. Запишите подходящее значение таймаута операции чтения в регистр RSI_DATA_TMR. 8. Запишите адрес данных на карте, откуда должны быть прочитаны данные, в регистр RSI_ARG. Дополнительная информация: этот адрес должен быть выровнен по 512-байтной границе, если не разрешен не выровненный доступ к памяти, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 9. Сконфигурируйте поле RSI_BLKSZ регистра RSI_DATA_CTL значением 512 для 512-байтного блока. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 10. Установите RSI_DATA_CTL.DATEN=1 (разрешить ветку данных машины состояний), RSI_DATA_CTL.DATDIR=1 (направление передачи от карты в контроллер) и RSI_DATA_CTL.DMAEN=1 (разрешить DMA). 11. Запишите команду READ_SINGLE_BLOCK в регистр RSI_CMD, конфигурируя машину состояний ожидать короткий ответ установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 12. Опрашивайте бит RSI_XFRSTAT.RESPEND, когда он установится в 1, чтобы определить момент прихода ответа на команду. После этого выполните операцию W1C над битом RSI_XFRSTAT_CLR.RESPEND, чтобы сбросить бит RSI_XFRSTAT.RESPEND. Дополнительная информация: в отличие от операции чтения с использованием доступа ядром процессора (без DMA), здесь можно безопасно выполнить этот шаг. Контроллер DMA (который был разрешен на шаге 5) гарантирует, что любые данные будут приняты корректно, отправленные в приемный буфер FIFO перед установкой бита сигнала получения end-бита ответа на команду. 13. Ждите флага окончания блока данных, который покажет, что данные были приняты корректно и прошли проверку на правильность CRC. Также может быть установлен флаг окончания данных, в зависимости от значения, которое было записано в регистр RSI_DATA_LEN. 14. Выполните операцию W1C над битами RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND, чтобы очистить биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND. Также очистите бит DMA_STAT.IRQDONE, если это применимо. Множественная запись блоков (Multiple Block Write). Операции записи блоков обычно состоят из 512 байт на блок. Если было определено, что карта поддерживает другие длины блоков, или длина блока по умолчанию, указанная в регистре CID, не равна 512, длина блока RSI должна быть сконфигурирована соответственно. Длина блока карты и длина блока RSI должны быть всегда сконфигурированы на одинаковый размер. Длина блока RSI конфигурируется в регистре RSI_BLKSZ. Ниже приведен процесс по шагам для выполнения последовательной записи нескольких блоков под управлением процессора (без применения DMA). 1. Запишите RCA карты в верхние 16-бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, конфигурируя машину состояния команд на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите установки бита RSI_XFRSTAT.RESPEND, после чего сбросьте его записью W1C бита RSI_XFRSTAT_CLR.RESPEND. 4. Убедитесь, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок путем проверки ответа, который содержится в регистре RSI_RESP0. 5. Сконфигурируйте количество передаваемых байт в регистре RSI_DATA_LEN. Например, нужно поместить в этот регистр число 4096, если нужно записать 8 блоков по 512 байт. 6. Запишите подходящее значение таймаута для операции записи в регистр RSI_DATA_TMR. 7. Запишите адрес назначения данных на карте в регистр RSI_ARG. Дополнительная информация: этот адрес должен быть выровнен по 512-байтной границе, если не разрешен не выровненный доступ к памяти, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 8. Запишите команду WRITE_MULTIPLE_BLOCK в регистр RSI_CMD, конфигурируя ветку команды машины состояний ожидать короткий ответ на команду установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. 9. Ожидайте индикации прохождения end-бита ответа на команду, что будет показано лог. 1 в бите RSI_XFRSTAT.RESPEND, и очистите его операцией W1C для бита RSI_XFRSTAT_CLR.RESPEND. 10. Сконфигурируйте поле RSI_BLKSZ регистра RSI_DATA_CTL значением 512 для 512-байтного блока. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 11. Установите бит RSI_DATA_CTL.DATEN, чтобы разрешить ветку данных машины состояний. 12. Запишите данные в регистр RSI_FIFO, пока он не станет заполненным, что будет показано битом RSI_XFRSTAT.TXFIFOFULL. a. Продолжайте записывать данные в FIFO, пока он еще не заполнен. Опционально программа может записывать данные порциями по восемь 32-битных слов, пока не установится бит RSI_XFRSTAT.TXFIFOSTAT (он показывает, что FIFO заполнен наполовину). 13. Ждите от карты подтверждения токеном CRC, что будет показано установкой бита RSI_XFRSTAT.DATBLKEND. 14. Выполните операцию W1C над битом RSI_XFRSTAT_CLR.DATBLKEND, чтобы очистить бит RSI_XFRSTAT.DATBLKEND. 15. Повторяйте шаги 11..13 для нужного количества передаваемых блоков, или пока не будет установлен бит RSI_XFRSTAT.DATEND. 16. Запишите RSI_CMD регистр командой STOP_TRANSMISSION, конфигурируя ветку команд машины состояний ожидать короткий ответ установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: карта пришлет ответ типа R1. 17. Выполните операцию W1C над битами RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND, чтобы очистить биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND. Ниже показана процедура для выполнения записи нескольких блоков с применением аппаратного управления потоком данных аппаратуры DMA. 1. Запишите RCA карты в верхние 16-бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, конфигурируя машину состояния команд на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите установки бита RSI_XFRSTAT.RESPEND, после чего сбросьте его записью W1C бита RSI_XFRSTAT_CLR.RESPEND. 4. Убедитесь, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок путем проверки ответа, который содержится в регистре RSI_RESP0. 5. Сконфигурируйте канал DMA, присвоенный контроллеру RSI. a. Сконфигурируйте регистр DMA_ADDRSTART адресом первого байта, где должны находиться записываемые на карту данные. 6. Как только канал DMA был сконфигурирован и разрешен, запишите количество байт для передачи в регистр RSI_DATA_LEN. Дополнительная информация: например, запишите 4096 для записи 8 блоков по 512 байт. 7. Запишите подходящее значение таймаута для операции записи в регистр RSI_DATA_TMR. 8. Запишите начальный адрес места назначения данных на карте в регистр RSI_ARG. Дополнительная информация: этот адрес должен быть выровнен по 512-байтной границе, если не разрешен не выровненный доступ к памяти, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 9. Запишите команду WRITE_MULTIPLE_BLOCK в регистр RSI_CMD, конфигурируя ветку команды машины состояний ожидать короткий ответ на команду установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. 10. Ожидайте индикации прохождения end-бита ответа на команду, что будет показано лог. 1 в бите RSI_XFRSTAT.RESPEND, и очистите его операцией W1C для бита RSI_XFRSTAT_CLR.RESPEND. 11. Сконфигурируйте поле RSI_BLKSZ регистра RSI_DATA_CTL значением 512 для 512-байтного блока. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 12. Установите RSI_DATA_CTL.DATEN=1 (разрешить ветку данных машины состояний), и RSI_DATA_CTL.DMAEN=1 (разрешить DMA). 13. Опросите установку бита RSI_XFRSTAT.DATEND, или альтернативно опросите каждую установку бита RSI_XFRSTAT.DATBLKEND, что должно быть при успешном завершении передачи каждого блока. Дополнительная информация: для передачи 4096 байт бит RSI_XFRSTAT.DATBLKEND установится 8 раз, и он должен очищаться после детектирования установки с помощью W1C записи бита RSI_XFRSTAT_CLR.DATBLKEND. 14. Запишите в регистр RSI_CMD команду STOP_TRANSMISSION, конфигурируя ветку команды машины состояний на ожидание короткого ответа путем установки бита RSI_CMD.RSP и очистки бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. 15. Выполните операцию W1C над битами RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND, чтобы очистить биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND bits. Также очистите бит DMA_STAT.IRQDONE, если это допустимо. Множественное чтение блоков (Multiple Block Read). Операции чтения блоков обычно состоят из 512 байт на блок. Если было определено, что карта поддерживает другие длины блоков, или длина блока по умолчанию, указанная в регистре CID, не равна 512, длина блока RSI должна быть сконфигурирована соответственно. Длина блока карты и длина блока RSI должны быть всегда сконфигурированы на одинаковый размер. Длина блока RSI конфигурируется в регистре RSI_BLKSZ. Ниже приведен процесс последовательного чтения нескольких блоков без использования DMA. 1. Запишите RCA карты в верхние 16-бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, конфигурируя машину состояния команд на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите установки бита RSI_XFRSTAT.RESPEND, после чего сбросьте его записью W1C бита RSI_XFRSTAT_CLR.RESPEND. 4. Убедитесь, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок путем проверки ответа, который содержится в регистре RSI_RESP0. 5. Запишите количество передаваемых байт в регистр RSI_DATA_LEN. Это будет 512 байт на один блок. 6. Запишите подходящее значение таймаута операции чтения в регистр RSI_DATA_TMR. 7. Запишите адрес места читаемых данных на карте в регистр RSI_ARG. Дополнительная информация: этот адрес должен быть выровнен по 512-байтной границе, если не разрешен не выровненный доступ к памяти, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 8. Сконфигурируйте поле RSI_BLKSZ регистра RSI_DATA_CTL значением 512 для 512-байтного блока. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 9. Установите бит RSI_DATA_CTL.DATEN, чтобы разрешить ветку данных машины состояний, и бит RSI_DATA_CTL.DATDIR для конфигурирования направления передачи данных от карты к контроллеру RSI. 10. Запишите команду READ_MULTIPLE_BLOCK в регистр RSI_CMD, конфигурируя ветку команды машины состояний на ожидание короткого ответа путем установки бита RSI_CMD.RSP и очистки бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. Примечание: чтобы удовлетворить некоторым ограничениям диаграмм времени операции чтения блока, не ждите установки бита RSI_XFRSTAT.RESPEND - сразу переходите к следующему шагу. Это потому, что карта может начать посылать данные перед завершением отсылки ответа на команду через сигнал RSI_CMD, и немедленное выполнение шага 11 гарантирует, что не произойдет переполнение приемного FIFO. 11. Опрашивайте бит RSI_XFRSTAT.RXFIFORDY или бит RSI_XFRSTAT.RXFIFOZERO, что покажет доступность или отсутствие данных в FIFO приема. Пока FIFO не пуст, читайте данные из регистра RSI_FIFO, пока не будут прочитаны все 512 байт. 12. Как только блок был прочитан, ждите установки бита RSI_XFRSTAT.DATBLKEND. Установка бита покажет, что данные были корректно приняты и прошли проверку CRC. Сбросьте бит RSI_XFRSTAT.DATBLKEND операцией W1C над битом RSI_XFRSTAT_CLR.DATBLKEND. 13. Повторите шаги 11 и 12, пока требуемое количество блоков не будет прочитано, или пока не установится бит RSI_XFRSTAT.DATEND. 14. Запишите в регистр RSI_CMD команду STOP_TRANSMISSION, конфигурируя ветку команд машины состояний на ожидание короткого ответа путем установки бита RSI_CMD.RSP и сброса бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. 15. Выполните операцию W1C над битами RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND, чтобы очистить биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND. Ниже приведена процедура для выполнения чтения нескольких блоков с применением аппаратного управления потоком данных аппаратуры DMA. 1. Запишите RCA карты в верхние 16-бит регистра RSI_ARG. 2. Запишите в регистр RSI_CMD команду SELECT/DESELECT_CARD, конфигурируя машину состояния команд на ожидание короткого ответа установкой бита RSI_CMD.RSP и очисткой бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1b. 3. Ждите установки бита RSI_XFRSTAT.RESPEND, после чего сбросьте его записью W1C бита RSI_XFRSTAT_CLR.RESPEND. 4. Убедитесь, что устройство (карта) не находится в состоянии занятости (busy), и что не было ошибок путем проверки ответа, который содержится в регистре RSI_RESP0. 5. Сконфигурируйте канал DMA, присвоенный контроллеру RSI. a. Запишите в регистр DMA_ADDRSTART адрес первого байта буфера, куда должны быть сохранены данные карты. 6. Запишите количество передаваемых байт в регистр RSI_DATA_LEN. К примеру это значение будет 4096 для 8 блоков по 512 байт. 7. Запишите подходящее значение таймаута для операции чтения в регистр RSI_DATA_TMR. 8. Запишите адрес места расположения читаемых данных на карте в регистр RSI_ARG. Дополнительная информация: адрес должен быть выровнен на 512-байтную границу, если не был разрешен не выровненный доступ, и эта карта не карта повышенной емкости (не SDHC), или не карта MMC с адресацией данных секторами. 9. Сконфигурируйте поле RSI_BLKSZ регистра RSI_DATA_CTL значением 512 для 512-байтного блока. Дополнительная информация: все другие поля регистра RSI_DATA_CTL должны быть обнулены. 10. Установите RSI_DATA_CTL.DATEN=1 (разрешить ветку данных машины состояний), RSI_DATA_CTL.DATDIR=1 (направление данных от карты к контроллеру RSI) и RSI_DATA_CTL.DMAEN=1 (разрешить DMA). 11. Запишите команду READ_MULTIPLE_BLOCK в регистр RSI_CMD, конфигурируя ветку команд машины состояний на ожидание короткого ответа путем установки бита RSI_CMD.RSP и сброса бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. Примечание: в отличие от доступа под управлением ядра процессора, здесь безопасно опрашивать индикацию окончания ответа битом RSI_XFRSTAT.RESPEND и делать его сброс операцией W1C над битом RSI_XFRSTAT_CLR.RESPEND. Контроллер DMA гарантирует, что любые данные, отправленные в FIFO приема перед установкой флага RSI_XFRSTAT.RESPEND, буду приняты корректно. 12. Опрашивайте бит RSI_XFRSTAT.DATEND или альтернативно опрашивайте каждую установку бита RSI_XFRSTAT.DATBLKEND по успешному завершению передачи каждого блока. Для 4096-байтной передачи бит RSI_XFRSTAT.DATBLKEND установится 8 раз, и должен быть очищен после детектирования установки операцией W1C над битом RSI_XFRSTAT_CLR.DATBLKEND. 13. Запишите в регистр RSI_CMD команду STOP_TRANSMISSION, конфигурируя ветку команд машины состояний на ожидание короткого ответа путем установки бита RSI_CMD.RSP и сброса бита RSI_CMD.LRSP. Результат шага: от карты придет ответ типа R1. 14. Выполните операцию W1C над битами RSI_XFRSTAT_CLR.DATBLKEND и RSI_XFRSTAT_CLR.DATEND, чтобы очистить биты RSI_XFRSTAT.DATBLKEND и RSI_XFRSTAT.DATEND. Также очистите бит DMA_STAT.IRQDONE, если это применимо. [Концепции программирования RSI] В этой секции предоставлены подробности, касающиеся некоторых специальных условий программирования, которые следует соблюдать для эффективного использования модуля RSI. Запрет проверки CRC. Некоторые карты памяти, такие как eMMC и SDIO (и другие), не отправляют статус CRC для некоторых команд. В ранних версиях процессоров Blackfin контроллер RSI определял, что от карты идут stuff-биты на месте CRC, и генерировал прерывание ошибки CRC. Чтобы запретить проверку CRC, установите бит RSI_CMD.CRCDIS. Прерывание окончания данных (Data End Interrupt). В старых версиях контроллера RSI прерывание окончания данных (когда установился бит RSI_XFRSTAT.DATEND) генерируется, когда счетчик данных (Data Counter) достигает 00 (регистр RSI_DATA_TMR). В новых версиях RSI это прерывание откладывается в операциях записи данных, если карта показывает состояние занятости (busy condition) притягиванием сигнала RSI_D0 к лог. 0. Это прерывание теперь генерируется один раз, когда сигнал RSI_D0 переходит в лог. 1. Различные полезные советы по программированию RSI • Бит PORTx_FER для RSI_CLK должен быть установлен перед разрешением вывода RSI_D3. [Описание регистров RSI процессора ADSP-BF60x] Removable Storage Interface (RSI) содержит следующие регистры. Таблица 24-17. Список регистров ADSP-BF60x RSI.
Режим доступа к битам регистров. Ниже приведены врезки с подробным описанием каждого регистра и каждого поля бит, которое в нем находится. Поля сведены в таблицу, где первый столбец "Биты (доступ)" показывает номера битов поля и способ, с которым можно работать с этими битами (доступ). Доступ обозначается следующим образом: R/W биты (или бит) доступны на чтение и запись. R/NW биты (или бит) доступны только на чтение. Лог. 0 или лог. 1 появляется в битах автоматически, в зависимости от текущего состояния контроллера RSI, либо очищаются специальной операцией W1C над битами другого регистра, либо это вообще константа. R/W1C бит доступен для чтения, но на запись он доступен только для специальной функции - запись лог. 1, чтобы очистить бит (write-1-clear, сокращенно W1C). Соответствующий (по номеру) бит очищается в другом регистре - регистре флагов. R/W1A бит доступен для чтения, и на запись доступна функция write-1-action (W1A), т. е. при записи в бит лог. 1 запускается какое-то действие. Регистр RSI_CTL предоставляет управление над выводом RSI_CLK (вывод тактирования RSI). Сигнал RSI_CLK может управляться напрямую от сигнала системной шины SCLK, если разрешить RSI_CTL.BYPASS; иначе частота RSI_CLK определяется из текущей частоты SCLK и содержимого поля RSI_CTL.CLKDIV в соответствии со следующей формулой: RSI_CLK = (SCLK) / (2 x (CLKDIV +1)) Чтобы экономить на потребляемой мощности от источника питания, сигнал RSI_CLK можно запретить без запрета всего интерфейса RSI, с помощью использования бита RSI_CTL.CLKEN; дополнительно когда установлен бит RSI_CTL.PWRSAVE, сигнал RSI_CLK генерируется только когда RSI выполняет передачу данных либо в карту, либо из неё. В дополнение к функции управления тактовой частотой, ширина шины данных интерфейса RSI также управляется этим регистром, так как от типа устройства может зависеть, как следует работать с устройством (картой. Параметры карты определяются в момент её подключения и идентификации). К этому регистру добавлены биты [13:15], они показывают тип карты, подключенной к RSI. Поле RSI_CTL.CARDTYPE может быть инициализировано программно, чтобы показать тип идентифицированного устройства. Поскольку некоторое количество используемых команд - таких как Sleep (сон), Wakeup (пробуждение) - используют информацию RSI_CTL.CARDTYPE, это поле требуется программировать до того, как в устройство будут посылаться команды Sleep или Wakeup. Рис. 24-10. Битовые поля регистра RSI_CTL. Таблица 24-18. Описание битовых полей регистра RSI_CTL.
Регистр RSI_ARG содержит 32-битный аргумент, который посылается через вывод RSI_CMD как часть сообщения, содержащего команду. Если команда карты требует аргумента, этот аргумент должен быть сначала загружен в регистр RSI_ARG до разрешения команды в регистре RSI_CMD. Более подробно про команды и ответы RSI см. функциональное описание RSI. Рис. 24-11. Регистр RSI_ARG. Таблица 24-19. Содержимое регистра RSI_ARG.
Регистр команд RSI_CMD управляет веткой команд машины состояний RSI. Поле RSI_CMD.IDX содержит индекс команды, которая выдается через RSI как часть командного сообщения для карты. Если команда требует ответа на неё (response), то это показывается битом RSI_CMD.RSP. Длина ответа (длинный или короткий) выбирается битом RSI_CMD.LRSP. Ветка алгоритма команды машины состояний становится активной, когда установлен бит RSI_CMD.EN, и становится запрещенной, когда этот бит очищается. Примечание: после записи данных данные не могут быть записаны в этот регистр в течение 3 периодов SYSCLK плюс 2 периода BCLK periods. Не требуется вручную очищать бит RSI_CMD.EN после завершения последовательности выполнения команды. Ветка команды машины состояний автоматически завершится после того, как операция будет закончена. Рис. 24-12. Поля регистра RSI_CMD. Таблица 24-20. Описание полей регистра RSI_CMD.
Регистр RSI_RESP_CMD содержит поле индекса последнего принятого ответа от карты (response). Если ответ на команду не содержит поле индекса команды (так бывает в случае длинного ответа, long response), то содержимое регистра RSI_RESP_CMD обычно должно игнорироваться. В этой ситуации регистр обычно содержит значение 0x3F, которое равно значению зарезервированного поля ответа. Рис. 24-13. Поля регистра RSI_RESP_CMD. Таблица 24-21: Описание полей регистра RSI_RESP_CMD.
Регистры ответа (RSI_RESP0, RSI_RESP1, RSI_RESP2, RSI_RESP3) содержат информацию пакета response, полученную обратно от карты в ответ на выданное карте сообщение команды. Принятый ответ (response) может быть длиной 32 или 127 бит, в зависимости от типа ответа - короткий или длинный. Самый старший бит ответа приходит от карты первым, и он находится в бите 31 регистра RSI_RESP0. Бит 0 регистра RSI_RESP3 всегда равен 0. Таблица ниже показывает два примера ответов (короткий и длинный).
Обратите внимание, что биты 31:1 длинного ответа сохраняются в битах 30:0 регистра RSI_RESP3. Бит 31 регистра RSI_RESP3 не используется и всегда равен 0. Рис. 24-14. Регистр RSI_RESP0. Таблица 24-22. Описание полей регистра RSI_RESP0.
Регистры ответа карты (RSI_RESP0, RSI_RESP1, RSI_RESP2, RSI_RESP3) содержат информацию ответа (response), полученную обратно от карты после получения картой сообщения с определенной командой. Для дополнительной информации см. описание регистра RSI_RESP0. Рис. 24-15. Регистр RSI_RESP1. Таблица 24-23. Содержимое регистра RSI_RESP1.
Регистры ответа карты (RSI_RESP0, RSI_RESP1, RSI_RESP2, RSI_RESP3) содержат информацию ответа (response), полученную обратно от карты после получения картой сообщения с определенной командой. Для дополнительной информации см. описание регистра RSI_RESP0. Рис. 24-16. Регистр RSI_RESP2. Таблица 24-24. Содержимое регистра RSI_RESP2.
Регистры ответа карты (RSI_RESP0, RSI_RESP1, RSI_RESP2, RSI_RESP3) содержат информацию ответа (response), полученную обратно от карты после получения картой сообщения с определенной командой. Для дополнительной информации см. описание регистра RSI_RESP0. Рис. 24-17. Регистр RSI_RESP3. Таблица 24-25. Содержимое регистра RSI_RESP3.
Регистр RSI_DATA_TMR содержит 32-битное значение периода таймаута данных (указанного в тактах RSI_CLK). Внутренний счетчик загружает значение из этого регистра, и начинает декрементироваться, когда ветка данных машины состояния входит в состояния WAIT_R или BUSY. Если счетчик дошел до 0, в то время как машина состояний все еще находится в одном из этих двух состояний, установится флаг RSI_XFRSTAT.DATTO. Регистры RSI_DATA_TMR и RSI_DATA_LEN оба должны быть записаны перед запуском передачи данных с помощью регистра RSI_DATA_CTL. Рис. 24-18. Регистр RSI_DATA_TMR. Таблица 24-26. Содержимое регистра RSI_DATA_TMR.
Регистр RSI_DATA_LEN содержит 16-битное значение для количества байт данных, которые должны быть переданы перед установкой флага RSI_XFRSTAT.DATEND. Значение, загруженное в этот регистр, копируется в регистр RSI_DATA_CNT, когда ветка данных машины состояний разрешена, и запустила передачу. Рис. 24-19. Регистр RSI_DATA_LEN. Таблица 24-27. Содержимое регистра RSI_DATA_LEN.
Регистр RSI_DATA_CTL предоставляет широкое управление веткой данных алгоритма машины состояния. Передача данных начинается, когда будет установлен в лог. 1 бит RSI_DATA_CTL.DATEN. В зависимости от бита RSI_DATA_CTL.DATDIR ветка данных машины состояния переходит в состояние WAIT_S или WAIT_R. Не требуется очищать бит RSI_DATA_CTL.DATEN после передачи данных. Имейте в виду, что после записи данных данные не могут быть записаны в этот регистр в течение 3 периодов SYSCLK плюс 2 периода BCLK. Рис. 24-20. Поля регистра RSI_DATA_CTL. Таблица 24-28: Описание полей регистра RSI_DATA_CTL.
Регистр RSI_DATA_CNT загружается из регистра RSI_DATA_LEN, когда ветка данных машина состояний разрешена, и перешла из состояния IDLE в состояние WAIT_S или WAIT_R. По мере передачи данных счетчик начинает декрементироваться; при достижении счетчиком нуля машина состояний переходит обратно в состояние IDLE, и устанавливается флаг RSI_XFRSTAT.DATEND. Рис. 24-21. Регистр RSI_DATA_CNT. Таблица 24-29. Содержимое регистра RSI_DATA_CNT.
Регистр RSI_XFRSTAT содержит статические и динамические флаги, которые показывают состояние (статус) контроллера RSI. Статические флаги (биты [10:0]) остаются установленными и их требуется очищать записью в регистр RSI_XFRSTAT_CLR. Динамические флаги (биты [21:11]) меняют свое состояние в зависимости от состояния нижележащей логики контроллера. Логика FIFO передачи и приема управляет битами [21:12], и это управление меняется в зависимости от состояния FIFO и зависимости от того, как в настоящий момент разрешена работа FIFO - для передачи или для приема. Рис. 24-22: Поля регистра RSI_XFRSTAT. Таблица 24-30. Описание полей регистра RSI_XFRSTAT.
Регистр RSI_XFRSTAT_CLR используется для очистки статических флагов регистра RSI_XFRSTAT. Запись лог. 1 в любой из этих битов очистят соответствующий флаг в регистре RSI_XFRSTAT. Рис. 24-23. Поля регистра RSI_XFRSTAT_CLR. Таблица 24-31. Описание полей регистра RSI_XFRSTAT_CLR.
Регистры маски прерывания (RSI_XFR_IMSK0 и RSI_XFR_IMSK1) определяют, какие статические и динамические флаги регистра RSI_XFRSTAT генерируют запрос на прерывание с использованием прерываний RSI. Прерывание RSI разрешается установкой в лог. 1 соответствующего бита в регистре маски прерывания. Прерывания, разрешенные в регистре RSI_XFR_IMSK0, генерируют прерывание с использованием сигнала RSI_INT0 контроллера RSI, и прерывания, разрешенные регистром RSI_XFR_IMSK1, генерируют прерывание с использованием сигнала the RSI_INT1 контроллера RSI. Рис. 24-24. Поля регистра RSI_XFR_IMSK0. Таблица 24-32. Описание полей регистра RSI_XFR_IMSK0.
Регистры маски прерывания (RSI_XFR_IMSK0 и RSI_XFR_IMSK1) определяют, какие статические и динамические флаги регистра RSI_XFRSTAT генерируют запрос на прерывание с использованием прерываний RSI. Прерывание RSI разрешается установкой в лог. 1 соответствующего бита в регистре маски прерывания. Прерывания, разрешенные в регистре RSI_XFR_IMSK0, генерируют прерывание с использованием сигнала RSI_INT0 контроллера RSI, и прерывания, разрешенные регистром RSI_XFR_IMSK1, генерируют прерывание с использованием сигнала the RSI_INT1 контроллера RSI. Рис. 24-25. Поля регистра RSI_XFR_IMSK1. Таблица 24-33. Описание полей регистра RSI_XFR_IMSK1.
Регистр RSI_FIFO_CNT содержит значение, показывающее количество 32-битных слов, которые все еще нужно прочитать из FIFO или записать в FIFO. RSI_FIFO_CNT загружается из регистра RSI_DATA_LEN, когда устанавливается бит RSI_DATA_CTL.DATEN. Если длина данных не выровнена на границу слова (количество байт не делится нацело на 4), то остаток байт (от 1 до 3) интерпретируется как слово. Рис. 24-26. Регистр RSI_FIFO_CNT. Таблица 24-34. Содержимое регистра RSI_FIFO_CNT.
Регистр RSI_BOOT_TCNTR выбирает счетчик циклов для формирования интервалов времени сигналов режимов normal boot и alternate boot. Когда истекают счетчики RSI_BOOT_TCNTR.HOLD и RSI_BOOT_TCNTR.SETUP, контроллер RSI установит биты RSI_STAT0.BSETUPEXP и RSI_STAT0.BHOLDEXP, что может вызвать соответствующие прерывания (если они разрешены/демаскированы в регистре RSI_IMSK0). Рис. 24-27. Поля регистра RSI_BOOT_TCNTR. Таблица 24-35. Описание полей регистра RSI_BOOT_TCNTR.
Когда бит RSI_CFG.BACKEN равен 1, значение регистра RSI_BACK_TOUT используется для вычисления интервала таймаута подтверждения загрузки (boot acknowledge timeout). Подтверждение это сигнал ACK от подчиненного устройства (карты). Контроллер RSI инкрементирует счетчик (начиная счет с 0) от тактов RSI_CLK, когда ожидается подтверждение. Когда этот счетчик достигает значения таймаута, RSI установит бит RSI_STAT0.BACKTO, что может вызвать соответствующее прерывание (если это разрешено/демаскировано в регистре RSI_IMSK0). Когда бит RSI_CFG.BACKEN равен 0, то содержимое регистра RSI_BACK_TOUT не используется. Значение для программирования в регистр RSI_BACK_TOUT вычисляется по следующей формуле: Boot Acknowledge timeout = (абсолютное время в секундах) * (частота RSI_CLK) = ((абсолютное время в секундах) * SCLK) / (2(RSI_CTL.CLKDIV + 1)) Здесь поле RSI_CTL.CLKDIV содержит значение, на которое SCLK делится для генерации частоты RSI_CLK (такты RSI, которые подаются на карту и используются внутри контроллера). В режиме bypass (когда делитель тактов запрещен), формула будет следующей: Boot Acknowledge timeout = (абсолютное время в секундах) * SCLK Рис. 24-28: Регистр RSI_BACK_TOUT. Таблица 24-36. Содержимое регистра RSI_BACK_TOUT.
Регистр RSI_SLP_WKUP_TOUT определяет максимальное значение таймаута для переходов состояния от Standby в Sleep и из Sleep в Standby. Это значение загружается в счетчик Sleep/Wakeup Counter, когда отправлена команда Sleep или Wakeup. Когда этот счетчик достигает нуля, RSI установит бит RSI_STAT0.SLPWKPTOUT, что может вызвать соответствующее прерывание (если это разрешено/демаскировано в регистре RSI_IMSK0). Формула для вычисления максимального таймаута следующая: Sleep Wakeup Timeout = (абсолютное время в секундах) * (RSI_CLK frequency) = ((абсолютное время в секундах) * SCLK) / (2(RSI_CTL.CLKDIV + 1)) Здесь поле RSI_CTL.CLKDIV содержит значение, на которое SCLK делится для генерации частоты RSI_CLK (такты RSI, которые подаются на карту и используются внутри контроллера). В режиме bypass (когда делитель тактов запрещен), формула будет следующей: Sleep Wakeup Timeout = (абсолютное время в секундах) * SCLK Рис. 24-29. Регистр RSI_SLP_WKUP_TOUT. Таблица 24-37. Содержимое регистра RSI_SLP_WKUP_TOUT.
В регистре RSI_BLKSZ содержится размер каждого блока данных в байтах. Должны программироваться только разрешенные размеры блоков. Рис. 24-30: Регистр RSI_BLKSZ. Таблица 24-38. Содержимое регистра RSI_BLKSZ.
Регистр RSI_FIFO предоставляет доступ к FIFO приема и передачи глубиной в 16 ячеек. К этому регистру осуществляется доступ как к 32-битному слову. Таким образом, FIFO может содержать в себе максимум 16*4 = 64 байта данных. Рис. 24-31. Регистр RSI_FIFO. Таблица 24-39. Содержимое регистра RSI_FIFO.
Регистр RSI_STAT0 содержит биты статуса исключения для карт SDIO и логики детектирования карты. Этот регистр также содержит биты статуса исключения для режима Boot, Sleep и Card Busy. Эти биты статуса исключения используются для генерации запроса прерывания через сигнал RSI_INT0 путем разрешения (демаскирования) соответствующего прерывания исключения в регистре RSI_IMSK0. Все биты в этом регистре очищаются по принципу W1C (write-1-to-clear). Рис. 24-32. Поля регистра RSI_STAT0. Таблица 24-40. Описание полей регистра RSI_STAT0.
Биты маски прерываний в регистре RSI_IMSK0 определяют, какие флаги регистра RSI_STAT0 будут генерировать запрос прерывания с помощью сигнала прерывания RSI_INT0. Регистр RSI_IMSK0 содержит биты маски для битов статуса RSI_STAT0. Запись лог. 1 в бит регистра RSI_IMSK0 разрешает прерывание для соответствующего бита в регистре RSI_STAT0. Рис. 24-33. Поля регистра RSI_IMSK0. Таблица 24-41. Описание полей регистра RSI_IMSK0.
Управляющие биты регистра RSI_CFG разрешают и запрещают определенные узлы контроллера RSI. Бит RSI_CFG.CLKSEN должен быть установлен, чтобы разрешить работу RSI. Если используются внешний pull-down резистор для детектирования карты на сигнале RSI_D3, то бит RSI_CFG.DAT3PUP не должен быть установлен. Резисторы pull-up и pull-down на сигналах RSI_D0..RSI_D7 (но не RSI_D3) становятся активными, когда соответствующие выводы GPIO сконфигурированы для функционала RSI мультиплексирования функций выводов. Например, если разрешена только 4-битная шина данных в мультиплексировании выводов процессора, установка бита RSI_CFG.DATPUP разрешает только pull-up резисторы на сигналах, которые сконфигурированы для использования контроллером RSI. Регистр RSI_CFG также предоставляет дополнительную функциональность для поддержки карт SDIO. Чтобы разрешить 4-битный режим SDIO, в дополнение к установки ширины шины 4-бита в поле RSI_CTL.BUSWID, нужно установить RSI_CFG.SD4EN. Бит RSI_CFG.MWINEN, когда он установлен, разрешает детектировать прерывания SDIO вне указанного окна в 1 такт, и он устанавливается, когда требуется поддержка прерывания во время транзакций многоблочного чтения из SDIO. RSI может также быть сброшен битом RSI_CFG.RST. Запись в этот бит (лог. 1?) сбросит модуль RSI, и вернет все его регистры в их значения по умолчанию. Рис. 24-34. Поля регистра RSI_CFG. Таблица 24-42. Описание полей регистра RSI_CFG.
Регистр RSI_RD_WAIT содержит бит RSI_RD_WAIT.REQUEST, который, когда установлен, выдает запрос ожидания чтения (read wait request) в карту SDIO. После того, как программное обеспечение станет готово возобновить передачу данных, этот бит должен быть очищен. Эта функциональность относится к обоим режимам ширины шины SDIO, 1-битной шине и 4-битной. Рис. 24-35. Регистр RSI_RD_WAIT. Таблица 24-43. Содержимое регистра RSI_RD_WAIT.
Регистры RSI_PIDx (RSI_PID0, RSI_PID1, RSI_PID2, RSI_PID3, RSI_PID4, RSI_PID5, RSI_PID6 и RSI_PID7) содержат фиксированное значение при сбросе, и они используются для идентификации ревизии периферийного устройства RSI. Всего имеется четыре 32-битных регистров идентификации, в которых используются только 8 младших бит. Содержимое этих 4 регистров следующее:
Регистры идентификации RSI работают только на чтение. Значение их бит группируется в одно 32-битное слово - RSIPID [3:0] со значением 0x00041180. Рис. 24-36. Регистр RSI_PID0. Таблица 24-44. Содержимое регистра RSI_PID0.
Всего имеется четыре 32-битных регистра идентификации, у каждого из них используется только младшие 8 бит. Подробнее см. описание регистра RSI_PID0. Рис. 24-37. Регистр RSI_PID1. Таблица 24-45. Содержимое регистра RSI_PID1.
Всего имеется четыре 32-битных регистра идентификации, у каждого из них используется только младшие 8 бит. Подробнее см. описание регистра RSI_PID0. Рис. 24-38. Регистр RSI_PID2. Таблица 24-46. Содержимое регистра RSI_PID2.
Всего имеется четыре 32-битных регистра идентификации, у каждого из них используется только младшие 8 бит. Подробнее см. описание регистра RSI_PID0. Рис. 24-39. Регистр RSI_PID3. Таблица 24-47. Содержимое регистра RSI_PID3.
[Ссылки] 1. blackfin_hwr_bf60x_rev0.5.pdf - Removable Storage Interface (RSI). ADSP-BF60x Blackfin® Processor Hardware Reference, Preliminary Revision 0.5, February 2013 site:analog.com. |