Практический способ программной эмуляции Secure Digital хоста
SD-стандарт был разработан группой ведущих компаний — производителей электроники (Panasonic, SanDisk и Toshiba) в 1999 году [1]. Его первая версия (1.01) описывала карты памяти объемом до 2 Гбайт со скоростью передачи данных до 10 Мбайт/с. Развитием стандарта стала версия 1.10, выпущенная в октябре 2004 года, в которой был введен высокоскоростной режим (High Speed bus mode, HS), обеспечивающий обмен данными и командами по SD-шине со скоростью до 25 Мбайт/с и минимальной скоростью чтения/записи 10 Мбайт/с. В мае 2006 года появилась версия 2.0, основным отличием которой стало введение нового класса SD-карт памяти с увеличенным объемом хранимой информации — до 32 Гбайт включительно (Secure Digital High Capacity, SDHC). Текущая версия стандарта (Physical Layer Specification, version 3.01) описывает SD-карты объемом до 2 Тбайт включительно (Secure Digital eXtended Capacity, SDXC), которые обеспечивают защиту хранимой информации от несанкционированного доступа и копирования. Были введены также новые высокоскоростные режимы работы SD-шины (Ultra High Speed I bus mode), и скорость обмена увеличилась до 104 Мбайт/c. Продолжением стандарта станет разрабатываемая сейчас 4-я версия (Physical Layer Specification, version 4.0), согласно которой скорость обмена по SD-шине может достигнуть уже 312 Мбайт/с (UHS-II bus mode) [2].
Перед авторами статьи стояла задача — разработать систему на кристалле: контроллер карты памяти стандарта SDHC. В процессе выполнения этой работы одной из основных задач была проверка разрабатываемого контроллера на соответствие нормативно-технической документации — SD Physical Layer Specification [2].
Сегодня существует множество бытовых и промышленных устройств на основе SDHC-карт. Для передачи данных между SD-картой и устройством (хостом) используется стандартизированный набор команд и ответов на них. Большинство устройств с различными алгоритмами работы с картой памяти оперируют весьма ограниченным количеством последовательностей команд. (Пример такой последовательности для инициализации SDHC-контроллера изображен на рис. 1.) Поэтому, проверив работоспособность контроллера SDHC-карты памяти с каким-то набором устройств, сделать вывод об общей работоспособности контроллера нельзя, так как такая проверка не обеспечивает достаточного покрытия. Кроме того, даже используемые команды невозможно проанализировать вне их определенной последовательности.
Рис. 1. Последовательность команд при инициализации SDHC-контроллера
В рамках этой статьи предлагается решение, которое позволяет обойти вышеперечисленные недостатки: это программный эмулятор SDHC-хоста. Такой хост должен посылать любые необходимые для отладки команды, а также в режиме реального времени разбирать и отображать получаемые на них ответы. Для этого было принято решение использовать микросхему FT2232H шотландской компании Future Technology Devices International (FTDI) (рис. 2). Она отличается от своих аналогов доступностью, большим набором режимов и функций, а также подробной документацией [2]. Микросхема подключается к ЭВМ через USB-интерфейс и позволяет реализовать большое количество разнообразных интерфейсов (JTAG, I2C, SPI, UART и др.).
Рис. 2. Модуль MMusbX232H на основе микросхемы FTDI FT2232H
Наиболее подходящим режимом для реализации программного эмулятора SDHC-контроллера является MPSSE (Multi-Protocol Synchronous Serial Engine), который предоставляет гибкие средства взаимодействия синхронных последовательных устройств с портом USB [3].
Режим MPSSE позволяет программисту отправлять на устройство разные команды, управляющие 16 сигналами микросхемы. Список используемых сигналов представлен в таблице 1.
Таблица 1. Список используемых сигналов микросхемы FTDI [4]
Название контакта | Направление передачи данных |
Data Out | Out |
Data In | In |
Clock | Out |
Chip Select | Out |
GPIOL 0-3 | In/Out |
GPIOH 0-7 | In/Out |
Список выводов SD-карты приведен в таблице 2. Их фактическое расположение на SD-карте изображено на рис. 3.
Таблица 2. Список выводов SD-карты [2] и их соответствие сигналам микросхемы FTDI
Номер вывода | Назначение | Направление | Сигналы FTDI |
1 | Линия данных 3 | In/Out | GRIOH4 |
2 | Линия команд | In/Out | GRIOH0 |
3 | «Земля» | – | – |
4 | Питание | – | – |
5 | Тактовый сигнал | In | GRIOH7 |
6 | «Земля» | – | – |
7 | Линия данных 0 | In/Out | GRIOH1 |
8 | Линия данных 1 | In/Out | GRIOH2 |
9 | Линия данных 2 | In/Out | GRIOH3 |
Рис. 3. Расположение контактных площадок SD-карты [2]
Микросхема FT2232H обладает большим набором функций для управления сигналами Data In, Data Out, Chip Select и синхронизации их с контактом Clock. Однако их использование недопустимо, так как они не имеют возможности переключения направления передачи данных (In/Out). В результате для подключения SD-карты к микросхеме FTDI было принято решение использовать сигналы GPIOH. Их соответствие выводам SD-карты также отображено в таблице 2.
Рассмотрим программную реализацию эмулятора SDHC. Для отправки команды в FT2232H необходимо записать управляющую последовательность байтов с помощью функции FT_Write [6]. Для реализации SD-интерфейса были использованы всего три команды режима MPSSE:
- Команда Set Data bits High Byte [7]:
0x82
0xValue
0xDirectionЗдесь байт 0xValue содержит значения всех выводов GPIOH. Каждый из восьми битов соответствует одному выводу (0–7). Байт 0xDirection указывает, следует ли настроить соответствующий вывод GPIOH на вход (0) или на выход (1). Все настроенные на выход выводы байтом 0xValue не управляются.
- Команда Read Data bits High Byte [7]:
0x83 Эта команда считывает значения всех выводов и записывает результат во внутренний буфер устройства в виде одного байта. Вычитать это значение можно с помощью функции FT_Read [6]. Однако сразу же после команды 0x83 это сделать нельзя. Внутренний буфер устройства FTDI имеет размер 4 кбайт и, как правило, становится доступным после заполнения либо длительного простоя. Для того чтобы получить возможность считать все накопившиеся значения немедленно, следует использовать команду Send Immediate.
- Команда Send Immediate [7]:
0x87 Выполнение этой команды, в зависимости от производительности вашего компьютера, может занять некоторое время, так что для отслеживания получаемых с устройства данных рекомендуется использовать системное событие. Подключить это событие можно с помощью функции FT_SetEventNotification [6]. Оно будет срабатывать, как только для чтения станут доступны новые данные.
Для ускорения работы микросхемы с помощью функции FT_Write рекомендуется записывать сразу большое количество команд для генерации тактового сигнала, отправки данных и запроса для чтения ответов, согласно спецификации физического уровня [2].
На рис. 4 представлена программная часть эмулятора хоста SDHC.
Рис. 4. Интерфейс управляющей программы эмулятора хоста SDHC
Предложенный программный эмулятор хоста SDHC позволяет эффективно отлаживать SDHC-карты, посылая любые команды, пошагово проходить различные последовательности команд, придерживаясь спецификации тестирования [8], и получать результаты в реальном времени в удобном для восприятия виде. На базе эмулятора хоста SDHC можно составлять программы и методики тестирования SD-карт памяти, а также проводить оптимизацию алгоритмов работы внутреннего программного обеспечения контроллера карты.
Статья подготовлена сотрудниками компании ООО «НПП «Цифровые решения» в рамках выполнения государственного контракта с №16.426.11.0035 Минобрнауки РФ.
- Стешенко В., Куляс М., Руткевич А. Технология Secure Digital для карт памяти // Компоненты и технологии. 2011. № 12.
- SD Physical Layer Specification Version 4.00. SD Group, 2011.
- FTDI MPSSE Basics, Application Note. FTDI, 2010.
- FT2232H Dual High Speed USB to Multipurpose UART/FIFO IC. FTDI, 2010.
- Software Application Development D2XX Programmer’s Guide. FTDI, 2012.
- Command Processor for MPSSE and MCU Host Bus Emulation Modes, Application Note. FTDI, 2011.
- SD Physical Test Specification for Card Version 3.00. SD Group, 2010.