Сегментация EEPROM-памяти микросхем FTDI на примере ft232h
Компания Future Technology Devices International (FTDI) [1] выпускает широкий спектр аппаратных преобразователей интерфейсов (USB-мосты). Эти устройства позволяют соединять USB Host с устройством, не имеющим USB-интерфейса.
Одноканальные или многоканальные универсальные USB-мосты имеют один, два или четыре пользовательских порта, а их универсальность достигается за счет режима MPSSE (Multi-Protocol Synchronous Serial Engine). В режиме MPSSE эти мосты могут эмулировать работу различных последовательных протоколов [2]. Серия состоит из таких микросхем: FT2232D, FT2232С, FT232Н, FT2232H и FT4232H.
Они имеют возможность настройки VID/PID-устройства, режима использования порта, области данных производителя, пользовательской области данных, которые сохраняются в энергонезависимой памяти EEPROM. Эти микросхемы могут работать с внешней памятью AT93c46/56/66 фирмы Atmel или совместимыми с ней видами памяти.
USB-мосты компании FTDI очень часто используют в качестве универсального средства для программирования и отладки различного вида микроконтроллеров и ПЛИС.
Для того чтобы разобраться в содержимом памяти, возьмем для примера устройство, которое предлагает компания Digilent [3] на базе микросхемы FTDI. Это устройство представляет собой программатор-отладчик для микросхем ПЛИС фирмы Xilinx.
Хотелось бы также отметить, что компания Digilent позаботилась о полной совместимости своего устройства JTAG-HS2 со всеми отладочными средствами, которые предлагает Xilinx (EDK, ChipScope, Impact).
Разработчики устройства JTAG-HS2 построили его на микросхеме FT232Н. Чтобы разобраться, что к чему, рассмотрим память, считанную с устройства JTAG-HS2. Вычитать данные можно при помощи программы FT_Prog [4], предоставляемой компанией FTDI. Для удобства все данные были сведены в таблицу, различные области отмечены разным цветом:
- красный — область конфигурации;
- зеленый — область пользовательских данных;
- синий — область отметки о производителе;
- желтый — область отметки о продукте;
- оранжевый — область серийного номера устройства;
- фиолетовый — контрольная сумма.
Адрес |
Данные |
|||||||
0000: |
0100 |
0304 |
1460 |
0009 |
80FA |
0800 |
0000 |
A012 |
0008: |
B228 |
DA1A |
0000 |
0000 |
0000 |
0000 |
0000 |
5600 |
0010: |
0100 |
C792 |
6A35 |
5201 |
9030 |
4A74 |
6167 |
4873 |
0018: |
3200 |
0000 |
0000 |
0000 |
0000 |
0044 |
6967 |
696C |
0020: |
656E |
7420 |
4A54 |
4147 |
2D48 |
5332 |
0000 |
0000 |
0028: |
0000 |
0000 |
0000 |
0000 |
1100 |
0000 |
0000 |
0000 |
0030: |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0038: |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0040: |
0000 |
0000 |
0000 |
0000 |
0000 |
4800 |
0000 |
0000 |
0048: |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0050: |
1203 |
4400 |
6900 |
6700 |
6900 |
6C00 |
6500 |
6E00 |
0058: |
7400 |
2803 |
4400 |
6900 |
6700 |
6900 |
6C00 |
6500 |
0060: |
6E00 |
7400 |
2000 |
5500 |
5300 |
4200 |
2000 |
4400 |
0068: |
6500 |
7600 |
6900 |
6300 |
6500 |
1A03 |
3200 |
3100 |
0070: |
3000 |
3200 |
3400 |
3900 |
3800 |
3500 |
3400 |
3600 |
0078: |
3000 |
3600 |
0203 |
0000 |
0000 |
0000 |
0000 |
102D |
Рассмотрим, какая информация записана в каждой из областей памяти с указанием смещения в байтах относительно начала:
- 0х00; 0х01 — настройки порта(-ов) устройства (для каждого устройства индивидуальные).
- 0х02; 0х03 — Vendor ID (0x0403).
- 0х04; 0х05 — Product ID (0x6014).
- 0х06; 0х07 — тип используемой микросхемы USB-моста:
- 0х0009 — FT232H;
- 0х0008 — FT4232H;
- 0х0007 — FT2232H;
- 0х0006 — TYPE_R;
- 0х0005 — FT2232C;
- 0х0004 — TYPE_AM;
- 0х0002 — TYPE_BM.
- 0х08 — конфигурационные биты:
- бит 7: всегда 1;
- бит 6: 1/0 — устройство имеет/не имеет собственный источник питания;
- бит 5: 1/0 — устройство использует/ не использует режим дистанционного пробуждения;
- биты 4–0: всегда 0.
- 0х09 — максимальное потребление тока умноженное на 2 мА (0хFA — 500 мА).
- 0х0А — настройки микросхемы:
- биты 7–5: всегда 0;
- бит 4: 1/0 — версия USB 2.0/1.1;
- бит 3: 1/0 — использовать/не использовать строку серийного номера;
- бит 2: 1/0 — включить/выключить подтяжки к 0 в режиме остановки для более низкого потребления;
- бит 1: 1/0 — изохронный/стандартный режим обращения к выходной конечной точке;
- бит 0: 1/0 — изохронный/стандартный режим обращения к входной конечной точке.
- 0хВ; 0хC; 0xD — настройки порта(-ов) устройства (для каждого устройства индивидуальные).
- 0хЕ — смещение в байтах, по которому находится область отметки о производителе (синий).
- 0хF — длина блока области отметки о производителе (синий).
- 0х10 — смещение в байтах, по которому находится область отметки о продукте (желтый).
- 0х11 — длина блока области отметки о продукте (желтый).
- 0х12 — смещение в байтах, по которому находится область серийного номера устройства (оранжевый).
- 0х13 — длина блока области серийного номера устройства (оранжевый).
- 0х1Е — тип микросхемы EEPROM (46/56/66) (для каждого типа микросхем смещение этого поля различное).
- (0х20–0х9F) + (0хF6–0xFD) — область пользовательских данных (первая часть всегда занимает (EEPROM_Size) 128 байт) (зеленый) [4].
- (0xA0–0xB1) — область отметки о производителе (записывается в формате unicode).
- (0xB2–0xD9) — область отметки о продукте (записывается в формате unicode).
- (0xDA–0xF3) — область серийного номера устройства (записывается в формате unicode).
- 0xF4; 0xF5 — поле, указывающее на номер порта и режим PnP (если такая настройка доступна для данной микросхемы, в противном случае поле содержит нули).
- 0хFE; 0xFF — контрольная сумма, вычисляемая по алгоритму:
checksum = 0xAAAA; for (i = 0; i < eeprom_size-1; i++) { checksum = value[i]^checksum; checksum = (checksum << 1) | (checksum >> 15); } return user_area_size;
В старшем байте первого слова каждой из областей отметки о производителе, продукте и серийном номере записана длина этой области в байтах. В младшем байте этого слова записан признак наличия данных 0х03. Более подробную информацию о настройке порта(-ов) устройства или размещении поля типа микросхемы EEPROM можно найти в исходниках библиотеки [5].
Для того чтобы убедиться в полной совместимости USB-мостов внутри серии, запишем ту же информацию в двухпортовую ft2232h. Для этого возьмем модуль FT2232HQ Mini Module [6], подключим его к компьютеру и откроем при помощи программы FT_Prog.
Во вкладке USB_Config_Description в поле Max Bus Power следует поставить значение 500. Во вкладке USB_String_Description необходимо записать в полях:
- Manufacturer— Digilent;
- Product Description— Digilent USB Device;
- Serial Number— 210249854606.
Во вкладке Hardware_Specific → Port_A → Hardware нужно установить отметку напротив 245 FIFO, а в Hardware_Specific → Port_A → Driver — напротив D2XX. Все эти действия показаны на рис. 1.
После настройки нужно записать эти данные в память EEPROM (рис. 2).
Для записи пользовательской области EEPROM необходимо воспользоваться функцией FT_EE_UAWrite из библиотеки D2XX API (пример использования этой функции приведен в [5]) либо программой автора (программа автора предлагается без техподдержки.) [6], которая запишет все необходимые данные автоматически (рис. 3).
Далее необходимо отсоединить кабель USB и затем вновь подключить его к компьютеру. После чего должна начаться автоматическая настройка драйверов устройства, по окончании которой в списке устройств у вас должно появиться три устройства (рис. 4):
- USB Serial Converter A;
- USB Serial Converter B;
- составное USB-устройство.
При подключении все USB-устройства должны передавать в USB Host свои дескрипторы в ответ на специальный запрос. Стандарт USB определяет специальную группу дескрипторов, которая должна выдаваться устройством в ответ на стандартный запрос [9]. Благодаря использованию памяти EEPROM пользователь может настроить некоторые дескрипторы по своему усмотрению. Часть из них передается микросхемой FTDI в USB Host в неизменном виде (например, Vendor ID, Product ID, область серийного номера устройства (рис. 4)), а другая часть кодируется (например, версия USB 2.0/1.1 в EEPROM указывается одним битом, а в USB Host передается 0х0200/0х0110). Более детально о дескрипторах и взаимодействии с USB-устройствами можно прочитать в [9].
Поскольку за образец был взят программатор-отладчик ПЛИС Xilinx, то для проверки корректности проделанных операций нужно подключить выводы микросхемы USB-моста к выводам ПЛИС следующим образом:
- ADBUS0 — TCK;
- ADBUS1 — TDI;
- ADBUS2 — TDO;
- ADBUS3 — TMS.
В приложении impact, поставляемом в Web Edition версии ПО Xilinx, проверяем работу устройства, предварительно установив драйверы от Digilent, которые находятся в папке \…\Xilinx\14.1\ISE_DS\common\bin\nt64\digilent\install_digilent.exe. Устройство должно определиться как оригинальное JTAG-HS2 при выборе меню Output → Cable Auto Connect. Далее следует просканировать JTAG-цепочку, выбрав File → Initialize Jtag Chain, и после этого можно программировать устройства (рис. 5).
Таким образом, разработчики JTAG-HS2 для идентификации своего устройства используют не только области стандартного дескриптора (отметка о производителе, отметка о продукте, серийный номер), но и дополнительную область пользовательских данных, которая не входит ни в один из дескрипторов. После проверки всех этих областей программа, которая взаимодействует с этим программатором-отладчиком, однозначно может идентифицировать его на шине USB.
В завершение отметим, что результаты, приведенные в этой статье, отражают лишь методы исследования. Вся информация для них была собрана из общедоступных публичных интернет-ресурсов и предназначена исключительно для ознакомительных целей. Изложенные сведения могут несколько отличаться в зависимости от серии, типа и ревизии микросхем. Также предупреждаем читателей, что, как и все устройства, подключаемые к порту JTAG, предлагаемое автором устройство требует тщательной проверки. Поэтому сначала проверьте осциллографом сигналы на JTAG без их подключения к ПЛИС и только затем подключайте устройство к ПЛИС.
Выводы
FTDI предлагает практически универсальные, гибкие в настройке, простые в использовании аппаратные средства для создания USB-совместимых устройств.
Используя дополнительные ресурсы внешней памяти EEPROM, подключаемой к микросхемам от FTDI, пользователь получает возможность расширить сферу применения продукции этой компании. Разработчику предоставляется возможность изменять не только стандартные дескрипторы устройства, но и дополнительную область пользовательских данных, что позволяет однозначно идентифицировать подключаемое оборудование программой, которая выполняется со стороны USB Host.
- ftdichip.com
- Долгушин С. Аппаратные USB-мосты FTDI // Компоненты и технологии. 2010. № 4.
- http://www.digilentinc.com/Products/Detail.cfm?Prod=JTAG-HS2
- http://www.ftdichip.com/Support/Utilities/FT_Prog_v2.8.2.0.zip
- Accessing The EEPROM User Area Of FTDI Devices.
- https://github.com/ADA007/FTDI_User_Area_Writer.git
- http://www.intra2net.com/en/developer/libftdi/
- http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_FT2232H_Mini_Module.pdf
- Агуров П. В. Интерфейсы USB. Практика использования и программирования. СПб: БХВ‑Петербург, 2004.