Здесь приведен перевод файла документации Universal JTAG library, server and tools [1], файл UrJTAG.txt 2009-04-17 (универсальная библиотека JTAG, сервер и инструменты). Автор Kolja Waschk.
[Общая информация]
JTAG (Предоставлено Ralf Engels). Базовую информацию по JTAG можно найти в Интернет. В этой секции будет кратко описано, что Вам понадобится для работы с JTAG. Какая аппаратура нужна, как использовать JTAG, где получить нужные файлы, какие форматы файлов доступны.
JTAG (IEEE 1149.1) это последовательный интерфейс для тестирования устройств, в которых применяются микросхемы. Интерфейс JTAG был разработан, чтобы решить проблему проверки целостности соединений между микросхемами. JTAG позволяет установить выходы микросхем в известное состояние, и проверить логические уровни на входах и выходах микросхем. Вот минимальный набор сигналов, используемых JTAG:
- Последовательный вход данных (для тестируемых микросхем это TDI, для хоста TDO). - Последовательный выход данных (для тестируемых микросхем это TD0, для хоста TDI). - Тактовый сигнал (TCK, для тестируемых микросхем это вход, для хоста выход). - Сигнал управления (TMS, для тестируемых микросхем это вход, для хоста выход).
Сигнал управления TMS (вместе с сигналом тактов TCK) позволяет менять состояния проверяемого устройства - происходят переходы в так называемой машине состояний. Т. е. машина состояний полностью управляется через JTAG, в том числе можно выполнить сброс устройства. Машина состояний предоставляет управлять двумя внутренними регистрами сдвига, которые есть в каждом устройстве. Эти регистры называются регистром инструкции (instruction register, IR) и регистром данных (data register, DR). Текущая версия UrJTAG позволяет Вам установить содержимое IR и считать данные DR. Она не позволяет напрямую управлять машиной состояний (по крайней мере пока).
Физические интерфейсы. Самый простой интерфейс, который Вы можете собрать, это что-нибудь наподобие Xilinx parallel cable (который также называется DLC5). Если Ваше проверяемое устройство работает с напряжениями питания 5V или 3.3V, то тогда схема кабеля может содержать только пассивные элементы (коннекторы и провода). UrJTAG также поддерживает несколько других адаптеров интерфейса (список приведен далее).
Обычное использование JTAG - программирование данных в память flash и отладка программ (firmware) встраиваемых систем. UrJTAG поддерживает программирование разных устройств flash. Также поддерживается программирование не-flash устройств через файлы SVF. UrJTAG пока что не поддерживает отладку. Другие решения с открытым исходным кодом, как OpenOCD, позволяют отлаживать процессоры ARM с помощью отладчика gdb.
BSDL и файлы данных UrJTAG. Файл в формате BSDL описывает интерфейс JTAG для одной микросхемы IC. Он имеет синтаксис языка VHDL (является подмножеством этого языка), который описывает нужную информацию (наподобие имен выводов, длин регистров и определений команд). Файлы BSDL обычно создаются производителем микросхемы. Например, все файлы BSDL Xilinx включены в бесплатный web-pack (файлы имеют расширение *.bsd).
UrJTAG внутри себя использует другой формат файла. Таким образом, чтобы добавить новое устройство для UrJTAG, Вам нужно преобразовать эти файлы и создать структуру каталогов. Для этого в настоящий момент имеется как минимум три инструмента; тот, из них, что поставляется вместе с UrJTAG, называется "bsdl2jtag". Пожалуйста, напишите в список рассылки, если встретились с проблемами в использовании bsdl2jtag, и прикрепите к письму рабочие файлы этого проекта.
Начиная с релизов за 0.7, UrJTAG содержит подсистему BSDL, которая на лету запрашивает из файлов BSDL описания для микросхем цепочки JTAG. Утилита bsdl2jtag фактически является оберткой, которая использует эту подсистему BSDL для преобразования файла BSDL.
Файлы SVF. Файл формата SVF содержит определенное количество высокоуровневых команд для управления шиной JTAG. Например, Вы можете сдвинуть содержимое IR или DR, и даже проверить результат сдвига. Утилиты Xilinx Impact и Altera QuartusII позволят Вам записать эти файлы для программирования устройств FPGA/CPLD.
Был создан проигрыватель файлов SVF (SVF player) в соответствии с "Serial Vector Format Specification", Revision E - спецификация, выпущенная 8 марта 1999 года компанией ASSET InterTech, Полную спецификацию можно найти в документе http://www.asset-intertech.com/support/svf.pdf.
UrJTAG предоставляет утилиту "SVF player", которая может читать файлы SVF, и выполнять описанные действия на шине.
Парсер и лексер SVF имеют копирайт 2002, CDS, см. http://www-csd.ijs.si/. Он повторно был использован из проекта "Experimental Boundary Scan", см. http://ebsp.sourceforge.net/.
Файлы JAM/STAPL. Другой формат для описания действий через JTAG это STAPL, в настоящее время стандартизованный как JEDEC "JESD-71A". В сравнении с SVF он больше похож на настоящий язык программирования, позволяя делать циклы, выполнение по условию, и другое. STAPL пока что не поддерживается UrJTAG.
[UrJTAG]
UrJTAG это пакет программ, позволяющий работать с аппаратными JTAG-устройствами, т. е. с микросхемами, поддерживающими JTAG (IEEE 1149.1) и платами на основе их, через адаптер JTAG. Пакет имеет открытую и модульную архитектуру, что позволяет писать разные расширения его функционала (наподобие тестеров плат, программаторов памяти flash, и т. д.).
UrJTAG является свободным программным обеспечением, распространяемым по лицензии GNU General Public License, и Вы можете свободно изменять его и распространять его копии на условиях этой лицензии. Для UrJTAG не дается никаких гарантий. Для дополнительной информации прочитайте файл COPYING.
ПРЕДУПРЕЖДЕНИЕ: это программное обеспечение может повредить Вашу аппаратуру!
Обратная связь и контрибуции приветствуются.
Примечание: эта документация далека от стадии завершения. Автор будет рад Вашим исправлениям и замечаниям, которые можете предоставить на трекере багов или улучшений (Bugs or Enhancements tracker), который находится на сайте UrJTAG.
Самая свежая версия этой документации и исходный код UrJTAG всегда доступны на домашней страничке проекта по ссылке http://www.urjtag.org.
Мне (Kolja) нравятся короткие имена, так что при создании имени к слову "JTAG" были добавлены только 2 буквы. Префикс "Ur" на немецком языке означает "наследственный", и "Ur-Vater" означает прародитель. UrJTAG стал "прародителем", прототипом для многих других инструментов JTAG. Есть ассоциации для "Ur" как еще одним именем для зубра, он тоже животное, похожее на GNU...
Список контрибуторов поддерживается в фале THANKS, находящемся в распространяемом пакете исходного кода. Выражаю специальную благодарность Marcel Telka, кто реально "изобрел" JTAG tools и написал многое, на чем базируется UrJTAG, и благодарность Arnim Laeuger за его продолжающуюся поддержку и разработку подсистемы SVF и BSDL и драйверы FT2232.
JTAG Tools изначально были разработаны Marcel Telka как часть проекта openwince. Эта работа все еще является большой частью исходного кода. Однако последний релиз JTAG был версии 0.5.1, и вышел в 2003 году. После нескольких лет разработка полностью остановилась. Примерно несколько месяцев на списке рассылки кто-то спрашивал о продолжении, пока не была достигнута критическая точка в 2007 году. Был создан форк JTAG tools, размещенный в проекте UrJTAG на Sourceforge.
[Требования к системе]
Поддерживаемые операционные системы хоста. JTAG Tools должны работать на все Unix-like операционных системах, включая MS Windows, на которой установлен пакет Cygwin. Прекомпилированная версия, которая работает на MS Windows без Cygwin, доступна как exe-установщик Windows (urjtag-0.10.exe, который можно скачать на Sourceforge).
Требуется только для MS Windows, если Вы не используете прекомпилируемую версию UrJTAG:
- Текущая сетевая установка Cygwin net, скачанная с сайта http://cygwin.com - Пакет ioperm (часть стандартной инсталляции Cygwin net)
Может понадобиться запуск команды "ioperm -i", чтобы установить в системе драйвер IOPERM.SYS.
Если UrJTAG был скомпилирован для использования библиотеки readline, то драйвер в системе уже присутствует. Он скорее всего имеется как стандартная часть Вашего дистрибутива.
Для компиляции UrJTAG может понадобиться дополнительное программное обеспечение (Вы можете захотеть выполнить компиляцию, если, к примеру, прекомпилированная версия для текущего исходного кода пока что недоступна...). См. ниже раздел "Инсталляция".
* Amontec JTAGkey * Amontec JTAGkey-Tiny (поддерживается как кабель "JTAGkey") * KrisTech UsbScarab2 ARM JTAG http://www.kristech.eu/ * Olimex ARM-USB-JTAG * Olimex ARM-USB-TINY * OOCDLink-и (экспериментально) http://www.joernonline.de/dw/doku.php?id=projects:oocdlink:2_oocdlinks * Другие кабели USB JTAG, основанные на чипах FT2232 (экспериментально) * TinCanTools Flyswatter * Turtelizer 2 (экспериментально) http://www.ethernut.de/en/hardware/turtelizer/ * USB to JTAG Interface (экспериментально) * http://www.hs-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html * Black gnICE http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice * Xverve Signalyzer Tool (экспериментально)
Другие кабели USB:
* Altera USB-Blaster и совместимые с ним http://www.ixo.de/info/usb_jtag * Segger/IAR J-Link / Atmel SAM-ICE (экспериментально, по этому кабелю продолжается работа) * Xilinx Platform USB Cable / DLC9 (экспериментально, по этому кабелю медленно ведется работа, пока не используйте
Другие кабели:
* Technologic Systems TS-7800 SoC GPIO builtin JTAG interface
ПРИМЕЧАНИЕ: не все эти микросхемы поддерживаются в каждой возможной конфигурации, могут быть не проверенные комбинации типа микросхемы, ширины шины, и т. п.
UrJTAG использует многобайтный режим записи (multi-byte write mode), если это поддерживается определенным устройством flash. Код flash автоматически переключится к этому алгоритму, если определение геометрии устройства (Device Geometry Definition) сообщает, что более одной области памяти может быть записаны за 1 шаг (см. подробнее CFI, показанный 'detectflash'). Поскольку несколько областей памяти записываются пакетом (burst-like) с только одним опросом после операции, то общая производительность прошивки увеличивается в 5..17 раз.
Если Вы столкнулись с проблемой многобайтного режима записи, то запустите конфигурацию с опцией '--disable-flash-multi-byte' и перекомпилируйте UrJTAG, чтобы запретить этот алгоритм.
[Инсталляция прекомпилированного пакета UrJTAG для Windows]
Просто запустите скачанный UrJTAG-xxx.exe, и все исполняемые файлы и сопутствующие данные будут установлены в папку программ Windows, обычно это место наподобие C:\Program Files\UrJTAG.
Установленный пакет сразу готов поддерживать кабели JTAG, которые напрямую подключены к параллельному порту (LPT). Однако если у Вас Windows Vista, и хотите получить доступ к параллельному порту, то для этого нужно отдельно установить драйвер, который доступен на сайте http://www.highrez.co.uk/Downloads/InpOut32/.
Если Вы хотите использовать UrJTAG с кабелем JTAG, подключенным к порту USB, то должны быть установлены актуальные драйверы для этого кабеля, которые не входят в сам пакет UrJTAG. Обычно эти драйверы предлагает производитель кабеля. Например, драйверы для Altera USB-Blaster поставляются вместе с программным обеспечением Quartus. Для кабелей на основе чипов FTDI Вам понадобится INF-файл описания кабеля и файлы FTDIBUS.SYS и FTD2XX.DLL от компании FTDI (драйверы CDM). Если Ваш кабель виден в Менеджере Устройств Windows без желтого восклицательного знака предупреждения, то скорее всего UrJTAG сможет работать с этим кабелем.
И наконец, UrJTAG дополнительно требует libusb-win32, чтобы общаться с некоторыми кабелями USB, которые не основаны на микросхемах FTDI (Xilinx Platform Cable USB, Segger J-Link). Так называемый драйвер фильтра LibUSB (libusb-win32 filter driver) доступен на страничке загрузки проекта сайта Sourceforge: http://libusb-win32.sourceforge.net/#downloads.
[ПО, требуемое для компиляции UrJTAG]
Чтобы запустить autogen.sh, Вам понадобятся утилиты autoconf и automake, bison и свежий flex.
Распространяемый исходный код в tarball содержит исходный код, предварительно сгенерированный с текущей версией flex; таким образом, flex нужен только в том случае, если хотите скомпилировать код, взятый (check out) с нашего репозитория Subversion. Flex 2.5.4a, как он поставляется чаще всего с последними версиями Cygwin, не может собрать сканеры для BSDL и SVF. Сборка этих файлов требует Flex 2.5.33 или более нового. Скрипт configure сравнит доступную версию Flex на удовлетворение этих условий, и соответственно разрешит или запретить связанные функции компилируемого пакета.
Кроме того, должна быть доступна библиотека libtool и devel-версии следующих пакетов:
* gettext * readline (не обязательно, то реально упрощает интерактивное использование) * ioperm (требуется только для Cygwin)
[Библиотеки, требуемые для поддержки USB]
Для поддержки адаптера USB (включая поддержку адаптеров параллельного порта, подключенных через конвертеры USB-to-parallel), потребуется одна или большее количество дополнительных библиотек.
Многие адаптеры USB JTAG и преобразователи USB-to-parallel основаны на микросхемах компании FTDI. Для их поддержки могут использоваться либо библиотека "libftdi" от intra.net, либо "FTD2XX" от FTDI.
Для многих современных дистрибутивов Linux библиотека libftdi доступна как прекомпилированный пакет, и он может быть установлен с использованием системы управления пакетами (distribution package management system), например командой "apt-get libftdi-dev" для Debian и Ubuntu. Если этот пакет недоступен, или Вы не работаете в среде Linux, то Вы можете получить его с сайта:
http://www.intra2net.com/en/developer/libftdi/
Альтернативно Вы можете использовать библиотеку FTD2XX от производителя микросхем FTDI. Она доступна для Linux и Windows. Ниже показано, как линковать эту библиотеку в окружении Cygwin.
Все другие адаптеры USB JTAG могут поддерживаться только если установлена библиотека libusb. Можно использовать вариант libusb-win32, который работает в окружении Cygwin:
http://libusb.sourceforge.net (libusb) http://libusb-win32.sourceforge.net (libusb for Windows)
Ниже см. специфичные примечания, касающиеся использования этих библиотек в окружении Cygwin.
[Установка из исходного кода tar.gz]
Инсталляция следует стандартной схеме configure, make, make install:
tar xzvf urjtag-x.y.tar.gz
cd urjtag-x.y
./configure
make
make install
[Инсталляция из репозитория Subversion]
Это может понадобиться, если пытаетесь взять самую новую версию UrJTAG.
svn co http://urjtag.svn.sourceforge.net/svnroot/urjtag/trunk urjtag
cd urjtag/jtag
./autogen.sh
# ./configure делается через autogen.sh; запустите его, если нужно,
# со специальными опциями
make
make install
[Линковка FTD2XX.DLL в окружении Cygwin]
Перед запуском configure скачайте драйверы D2XX с сайта FTDI:
Распакуйте архив в выбранный каталог (скорее всего лучше всего использовать путь к папке без пробелов), после чего запустите с опцией "--with-ftd2xx", указывающей на этот каталог, например:
jtag is now configured for
...
Detected libftd2xx : yes
[Использование LibUSB-Win32 в окружении Cygwin]
Перед запуском configure установите драйвер фильтра LibUSB-Win32 (filter driver), скачанный с SourceForge: http://libusb-win32.sourceforge.net.
После этого укажите configure на папку, где была установлена библиотека LibUSB-Win32 (тут могут быть проблемы с путями, содержащими пробелы, что имеет место с папкой "Program Files"!):
UrJTAG может быть скомпилирован в исполняемый файл Windows с помощью компилятора MinGW (http://www.mingw.org) или Cygwin GCC с флагом компилятора "-mno-cygwin".
Достоинство MinGW по сравнению с окружением Cygwin в том, что не нужно ничего устанавливать, кроме jtag.exe (плюс используемые библиотеки наподобие FTD2XX.dll или InpOut32.DLL, которые в любом случае требуются для доступа к устройству в операционной системе Windows).
Однако из-за того, что поддержка MinGW довольно новая в UrJTAG, могут отсутствовать некоторые функции (например, поддержка readline), или программа может работать медленнее.
Из-за того, что окружение Cygwin выглядит проще в настройке, мы рекомендуем использовать Cygwin GCC с флагом "-mno-cygwin" вместо MinGW setup:
Возможна даже кросс-компиляция и сборка исполняемого кода Windows на хосте Linux:
./configure --host=i586-mingw32msvc --with-ftd2xx=/tmp/cdm-drivers --with-inpout32
make
Опция "--with-inpout32" говорит UrJTAG использовать InpOut32.DLL для доступа к параллельным портам, потому что библиотека Cygwin ioperm не доступна для MinGW. Библиотека InpOut32 имеется на сайте logix4u.net:
Можно скачать версию от highrez, обновленную для работы на Windows Vista и 64-битных версиях Windows:
http://www.highrez.co.uk/Downloads/InpOut32/
[Адаптация драйвера]
Скрипт configure разрешает все настройки по умолчанию для шины, кабеля и низкоуровневых драйверов. Если необходимо, то Вы можете включить или исключить определенные драйверы. Для списка имеющихся параметров запустите скрипт командой:
./configure --help
Это используется для опций --enable-bus, --enable-cable и --enable-lowlevel.
[Сборка подсистемы BSDL]
Как упоминалось выше, сборка лексера (BSDL lexer) требует Flex 2.5.33 или более новой версии. Если детектированная версия Flex недостаточно свежая, то скрипт configure запретит подсистему BSDL. Результат детектирования будет показан в конце вывода сообщений скрипта configure:
jtag is now configured for
...
Build BSDL subsystem : yes
Flex требуется только тогда, когда работаете с выборкой (check-out) репозитория Subversion. В этом случае Flex вызывается для трансформирования bsdl_flex.l в файл bsdl_flex.c. Когда Вы компилируете из опубликованного исходного кода, локальная версия Flex не имеет значения, поскольку сгенерированный выходной файл Flex является частью tarball. Т. е. даже если локальная версия Flex будет проверена неудачно, подсистема BSDL все равно будет разрешена, и скомпилирована их C-файлов релиза.
[Как использовать UrJTAG, быстрый старт]
Запуск программы. Подключите Ваш адаптер JTAG между PC и целевым проверяемым устройством, и включите питание устройства.
Чтобы запустить UrJTAG, введите команду "jtag" и нажмите Enter; jtag запустится и отобразит некоторую начальную информацию. Вывод должен завершиться примерно такой строкой:
WARNING: UrJTAG may damage your hardware!
Type "quit" to exit, "help" for help.
Конфигурация кабеля. Введите команду "help cable" для получения списка поддерживаемых кабелей JTAG.
Введите команду "cable", за которой идет имя кабеля и возможные дополнительные аргументы для конфигурации кабеля. Например:
jtag> cable EA253 parallel 0x378
Initializing ETC EA253 JTAG Cable on parallel port at 0x378
См. секцию по команде "cable", где даются подробности поддержки USB.
Запуск кабеля на основе чипа FT2232H. В этом примере использовалась плата FT2232H board [2]. Цоколевка сигналов платы:
Функция JTAG
FT2232H, Port A, номер вывода
TCK (выход)
16 (ADBUS0)
TDI (выход)
17 (ADBUS1)
TDO (вход)
18 (ADBUS2)
TMS (выход)
19 (ADBUS3)
Примечание: одинаково может использоваться как чип FT2232H, так и чип FT4232H, с одинаковыми командами и опциями jtag.exe, одинаковой цоколевкой подключения кабеля, и одинаковым поведением. Также можно использовать и другие аналогичные модули.
Пример сессии jtag.exe с подключением к плате FT2232H Board [2]:
VID vendor ID (hex), defaults to 0000
PID product ID (hex), defaults to 0000
DESC Some string to match in description or serial no.
DRIVER usbconn driver, either ftdi-mpsse or ftd2xx-mpsse
defaults to ftd2xx-mpsse if not specified
jtag> cable FT2232 vid=0403 pid=6010
Connected to libftd2xx driver.
Примечание: здесь в команде cable кроме типа кабеля указаны дополнительные параметры VID и PID. Это идентификаторы устройства USB FTDI, которые можно узнать, если просмотреть свойства устройства USB в диспетчере устройств.
Если к выводам JTAG (TCK, TDI, TDO, TMS) ничего не подключено, то команда detect выдаст предупреждение:
jtag> detect
Warning: TDO seems to be stuck at 1
jtag>
Если замкнуть TDI на TDO, то команда detect завершится успешно, но ничего не выведет.
Определение микросхем на цепочке JTAG. Введите "detect" в приглашении команд работающей утилиты jtag:
jtag> detect
С подключенной микросхемой Intel Вы должны увидеть вывод наподобие следующего:
Если получаете пустой вывод, или сообщение об ошибке, то возможно, что Ваш адаптер JTAG не подключен, или целевая тестируемая плата не работает, как требуется, или выключено её питание.
Выполнение команды "detect" требуется перед запуском всех других команд.
Вывод текущего состояния цепочки JTAG. Введите команду print chain:
[Как добавить микросхему, ранее не поддерживаемую UrJTAG]
Нет другого способа, как найти в Интернете BSDL-файл для Вашей микросхемы, либо составить этот файл самому. С нуля составить такой файл практически не реально, потому что современные микросхемы слишком сложные. Однако если удалось найти BSDL-файл близкого аналога микросхемы, то иногда добавить поддержку новой микросхемы довольно просто. Далее приведен процесс по шагам для добавления поддержки ATmega32A. В этом примере описана работа в среде операционной системы Windows, JTAG-адаптер на основе FT2232H Board [2] подключен к плате AVR-USB-MEGA16, на которую установлен ATmega32A [5].
1. Скачайте с сайта Atmel пакет BSDL-файлов [4].
2. С помощью кабеля из 5 проводов подключите JTAG тестируемого микроконтроллера ATmega32A к контактам разъема адаптера JTAG.
Сигнал
FT2232H Board, коннектор JP3
AVR-USB-MEGA16, коннектор U3 JTAG
GND
4 (GND)
2 или 10
TCK
6 (AD0) выход
1 вход
TDI
7 (AD1) выход
9 вход
TDO
8 (AD2) вход
3 выход
TMS
9 (AD3) выход
5 вход
Подключите адаптер JTAG к компьютеру, подайте питание на тестируемый микроконтроллер.
3. Запустите jtag.exe, выполните команду подключения к адаптеру JTAG:
jtag> cable FT2232 vid=0403 pid=6010
Connected to libftd2xx driver.
jtag>
4. Распакуйте содержимое архива в произвольную папку на диске. Главное требование - файлы BSDL (*.bsd) должны находиться в папке, путь до которой не содержит пробелов (UrJTAG пока что не поддерживает пути с пробелами, по крайней мере в команде bsdl path). Предположим, что файлы распакованы и находятся в папке c:\temp\megaAVR_BSDL.
Теперь эту папку можно добавить командой bsdl path, и UrJTAG будет просматривать её в поиске описаний микросхем, когда будет введена команда detect.
c:\Program Files\UrJTAG>dir c:\temp\megaAVR_BSDL
Том в устройстве C не имеет метки.
Серийный номер тома: 7CCB-BDB0
В этом списке файлов есть файл atmega32.bsd (выделен в списке жирным шрифтом), который, к сожалению, не подходит для ATmega32A, потому что атрибут IDCODE_REGISTER в файле не совпадает с атрибутом, который будет прочитан из микросхемы через JTAG:
jtag> bsdl path c:\temp\megaAVR_BSDL
jtag> detect
IR length: 4
Chain length: 1
Device Id: 10001001010100000010000000111111 (0x000000008950203F)
Manufacturer: Atmel
Unknown part!
chain.c(149) Part 0 without active instruction
chain.c(200) Part 0 without active instruction
chain.c(149) Part 0 without active instruction
jtag>
Сообщение "Unknown part!" говорит о том, что среди всех BSDL-файлов, которые были просмотрены, не было найдено ни одно описание микросхемы, который содержит идентификатор, совпадающий с прочитанным через JTAG (выделен жирным шрифтом). Однако это легко исправить, если изменить атрибут IDCODE_REGISTER в файле atmega32.bsd.
5. Сделайте копию файла atmega32.bsd под новым именем atmega32a.bsd.
6. Откройте файл atmega32a.bsd, найдите в нем атрибут IDCODE_REGISTER.
attribute IDCODE_REGISTER of ATmega32 : entity is
"0101" &
"1001010100000010" &
"00000011111" &
"1" ;
Этот IDCODE почти полностью совпадает с кодом, прочитанным из ATmega32A, кроме первых 4 бит (выделены). Исправьте их на 1000:
attribute IDCODE_REGISTER of ATmega32 : entity is
"1000" &
"1001010100000010" &
"00000011111" &
"1" ;
7. Теперь микроконтроллер ATmega32A будет распознаваться командой detect:
8. На макетной плате AVR-USB-MEGA16 к ножке микроконтроллера PB0 подключен светодиод. Следующие команды переведут ножку PB0 в режим выхода с лог. 1 на выходе. Светодиод загорится:
jtag> instruction EXTEST
jtag> shift IR
jtag> set signal PB(0) out 1
jtag> shift DR jtag>
Теперь выведем на ножку PB0 уровень лог. 0, светодиод погаснет:
jtag> set signal PB(0) out 0
jtag> shift DR
jtag>
[Команды JTAG]
Ниже приведен список поддерживаемых в настоящее время команд, и далее есть некоторые примеры их использования.
Отображение или установка активного регистра данных для тестируемой микросхемы.
endian
Установка/печать порядка байт (endianess) для чтения/записи двоичных файлов.
eraseflash
Стирание памяти flash по номеру блоков.
flashmem
Прошивка памяти flash данными из файла.
frequency
Установка тактовой частоты JTAG.
get
Получение значения внешнего сигнала.
help
Отобразить подсказку по командам.
include
Подключить последовательность команд из внешнего файла.
initbus
Инициализировать драйвер шины для активной микросхемы.
instruction
Поменять активную инструкцию для микросхемы, или декларировать новую инструкцию.
part
Поменять активную микросхему в текущей цепочке JTAG.
peek
Прочитать одно слово.
poke
Записать одно слово.
print
Отобразить список/статус цепочки JTAG.
quit
Выйти и прервать эту сессию.
readmem
Прочитать содержимое памяти и записать его в файл.
register
Определить новый регистр данных для микросхемы.
scan
Детектировать изменения входных выводов текущей микросхемы.
set
Установить значение внешнего сигнала.
shift
Cдвинуть регистры данных/инструкции через цепочку JTAG.
signal
Определить новый сигнал для микросхемы.
svf
Выполнить из файла команды SVF.
writemem
Записать содержимое файла в память.
Некоторые инструменты, полученные из того же самого кода openwince JTAG Tools, знают дополнительные команды, не поддерживаемые UrJTAG. См. ниже секцию "Не поддерживаемые команды", где показаны обходные методы.
[Базовые команды]
quit. Эта команда закрывает консоль jtag.
help. Без дополнительных параметров выдает обзор доступных команд. С параметром можно получить более подробную информацию по любой команде. Пример:
jtag> help cable
Большинство драйверов кабеля требуют дополнительные данные, чтобы кабель начал работать соответствующим образом. Чтобы узнать, какие опции нужно дополнительно указать для кабеля, используйте команду "cable" вместе с именем кабеля, за которым идет слово "help". Например:
jtag> cable wiggler help
include. Запуск команд из скрипта, указанного по имени файла. Файл скрипта может быть установлен вместе с UrJTAG или можно запустить файл BSDL для активной микросхемы. Префикс директории добавляется автоматически (например /usr/share/urjtag/, в зависимости от места нахождения Вашей инсталляции), за исключением имени файла, начинающегося с точки или слеша.
Например, следующая последовательность запуска конфигурирует кабель, цепочку JTAG, и загружает определения и драйвер шины для Samsung S3C4510B CPU, чтобы прочитать его память в ячейке 0x0:
Если файл содержит допустимый синтаксис BSDL, то он будет на лету преобразован в традиционные команды.
Опционально после имени файла может быть указано число X, чтобы повторить X раз выполнение последовательности команд из этого файла.
[Управление цепочкой JTAG]
cable. Устанавливает и инициализирует драйвер кабеля. Обычно это первая команда, которая должна быть выполнена в рабочей сессии. Например:
jtag> cable EA253 parallel 0x378
Initializing ETC EA253 JTAG Cable on parallel port at 0x378
Для параллельного кабеля, использующего драйвер ppdev, нужно использовать следующую команду:
jtag> cable DLC5 ppdev /dev/parport0
Если Вы получаете ошибку, то может быть, что драйвер параллельного порта ядра был скомпилирован как модуль в ядре Linux, и не был загружен автоматически. Тогда Вы должны попробовать загрузить драйвер ppdev вручную (с правами root вне этой сессии jtag):
UrJTAG теперь также поддерживает некоторые кабели USB. К сожалению, нет такого стандарта, как "JTAG over USB", поэтому поддержка ограничена только некоторыми выбранными кабелями. Для кабелей, основанных на микросхеме FT2232 компании FTDI, команда cable требует имя имеющегося кабеля, и опционально имя драйвера, идентификатор производителя USB (Vendor ID, VID) и идентификатор продукта (Product ID, PID):
Для известных кабелей UrJTAG знает VID и PID, поэтому достаточно просто ввести имя кабеля:
jtag> cable ARM-USB-OCD
Если Ваш кабель не детектируется автоматически, хотя он есть в списке поддерживаемых кабелей, то укажите вместе с командой cable идентификаторы VID и PID кабеля. У кабеля может быть другая ревизия, которая пока не добавлена в список известных и протестированных кабелей. Идентификаторы VID и PID подключенного кабеля можно узнать с помощью Диспетчера Устройств операционной системы Windows, или в Linux с помощью команды dmesg.
Как упоминалось, имя драйвера не является обязательным для команды cable. UrJTAG выберет драйвер автоматически на базе конфигурации UrJTAG. В случае, когда Ваша система предоставляет только один из драйверов libftdi или FTD2XX, будет выбран имеющийся соответствующий драйвер. Если доступны обе библиотеки, то будет выбран драйвер FTD2XX. Причина в том, что FTD2XX показывает несколько лучшую производительность, чем в прошлом показывал libftdi. Вы все еще можете принудительно выбрать libftdi с использованием соответствующего параметра.
ПРЕДУПРЕЖДЕНИЕ: при использовании драйвера FTDI нужно иметь в виду некую причуду его поведения. Он подключается случайным образом к любому известному чипу FTDI. Например, если к хосту подключено больше одного устройства FTDI, то есть шанс, что драйвер подключится не к тому устройству USB, которое нужно. Это может быть преобразователь USB-serial поставщика OEM, и Вы будете биться головой об стол, не понимая, почему не работает чтение из цепочки JTAG. Для такого случая настоятельно рекомендуется задать параметр desc=xxx для команды cable, если используется драйвер ftd2xx. Установите xxx в значение строки имени продукта, или значение дескриптора серийного номера, которое показывает нужное Вам устройство USB.
detect. Детектирует устройства в цепочке JTAG. Например:
Выполняя команду "detect", UrJTAG делает поиск по файлам в своей базе данных (обычно в папке /usr/share/urjtag) и опционально в пути поиска файлов BSDL (см. описание команды bsdl), чтобы найти совпадение для производителя, ревизии и идентификатора микросхемы (part number) для IDCODE, прочитанного из тестируемого устройства. Однако не все микросхемы идентифицируют сами себя способом, пригодным для "detect". Например, многие микросхемы с ядром процессора ARM внутри представляют IDCODE, который может быть специфичен для определенного ядра внутри чипа (например ARM7TDMI), ничего не говоря о реальном производителе микросхемы. В таком случае данные для микросхемы должны быть подключены вручную. Также см. документацию по команде "include".
print. Печатает список микросхем в цепочке, и текущую активную инструкцию для каждой микросхемы в цепочке. Более подробную информацию по шине, сигналам и инструкциям можно получить специальными опциями команды, см. "help print".
initbus. Выбирает и инициализирует шину для текущей выбранной микросхемы, например микросхема памяти на шине CPU. Это требуется для получения доступа к микросхемам, которые не подключены к цепочке JTAG, но к ним косвенно есть доступ через другие микросхемы (например, через CPU или программируемую логику FPGA).
Выполните команду "help initbus", чтобы получить список поддерживаемых типов шины. Если Вы не нашли драйвер шины для Вашей специфической аппаратуры, то может быть, уже есть EJTAG для этой системы (справедливо для большинства CPU, основанных на ядре MIPS), так что попробуйте драйвер шины "ejtag". В отличие от метода "via BSR", он выгружает некоторые инструкции для CPU, и запускает их выполнение для получения доступа к шине, что должно работать с большинством чипов, совместимых с EJTAG (имейте в виду: EJTAG это не JTAG):
jtag> initbus ejtag
Есть другая опция для поддержки новых чипов "via BSR" (через регистр пограничного сканирования), по прототипу драйвера шины ("prototype"), который можно адаптировать для поддержки Вашей микросхемы с параметрами командной строки. Для использования этого драйвер требуется только знание имен сигналов, которые представляют на шину адреса, шину данных и сигналы разрешения, и порядок нумерации линий адреса и данных.
Например предположим, что имеются следующие сигналы, именуемые в описании BSDL:
* Шина данных: D0, D1, ... D31 * Шина адреса: ADDR0, ADDR1, ... ADDR22 * Разрешение выхода (Output Enable): nOE * Разрешение записи (Write Enable): nWE * Выборка микросхемы (Chip Select): nRCS0
Здесь видно, что сигналы разрешения имеют активный уровень лог. 0 (что показано начальной буквой "n" в имени сигнала, соответствует negative). Далее мы предполагаем интересующую подключенную микросхему, некоторый чип flash, который только 16 бит шириной, даже если ширина шины данных 32 бита. С этой информацией для получения доступа к шине Вы должны использовать следующую команду (все нужно ввести в одной строке!):
Здесь драйвер шины "prototype" не может работать с системами, где адрес и данные мультиплексируются на одних и тех же выводах. Если сигналы не пронумерованы с правильном порядке или с промежутками, Вы можете обработать эту ситуацию, определив правильные имена как псевдонимы для реальных сигналов с командами наподобие "salias ADDR12 BSCGX44".
Большинство драйверов работают "via BSR", т. е. они получают прямой доступ к выводам устройства. Из-за того, что нельзя эффективно адресовать только один отдельный вывод, эффективно управляются только все сразу, и данные для всех выводов передаются через JTAG для каждого одного изменения, этот метод не самый быстрый, но обычно самый простой для реализации, поэтому иногда рассчитывают именно на него, чтобы вообще что-либо работало.
Драйвер шины "fjmem" (FPGA JTAG memory) пытается решить эту проблему, перемещая управление и наблюдение от BSR к внутреннему регистру устройства. Наверняка это возможно только на FPGA, где разработчик может сцепить дополнительную логику с цепочкой JTAG. Дизайн ядра плюс примеры для разных семейств FPGA доступны в каталоге extra/fjmem. Обратитесь к файлу README, который находится в этой папке.
Некоторые чипы вообще не позволяют получить прямой доступ к их выводам через BSR. В таком случае пишут новый драйвер шины, который задействует модуль отладки, чтобы выгрузить определенный код, чтобы обязательно получить доступ к шине.
bus. Можно инициализировать больше одной шины для микросхемы (микросхем) в цепочке. Команда "bus" позволяет выбрать активную шину для операций readmem, flashmem, и т. п.
[Команды определения микросхемы]
Следующие команды также используются в файлах данных, чтобы определить устройство (IC, микросхему) в цепочке JTAG. Не рекомендуется использовать эти команды в интерактивной сессии. Вместо этого Вы должны создать файл определения устройства (device definition file) из файла .bsd, используя один из предоставленных инструментов (или используйте новую подсистему BSDL, см. далее).
bit. Определение нового бита BSR. instruction. Смена активной инструкции для микросхемы или декларация новой инструкции. register. Определение нового регистра данных для микросхемы. signal. Определение нового сигнала для микросхемы.
[Управление TAP]
Следующие команды можно использовать напрямую для для манипуляции и отображения состояния контроллера (контроллеров) TAP и регистров в цепочке JTAG:
dr. Отображение или установка активного регистра данных для микросхемы. instruction. Смена активной инструкции для микросхемы, или декларация новой инструкции. get. Получение значения внешнего сигнала. pod. Низкоуровневый прямой доступ к сигналам POD наподобие TRST; используйте с осторожностью. scan. Детектирование изменений на выводов входов текущей микросхемы. set. Установка значения внешнего сигнала. shift. Сдвиг регистров данных/инструкции через цепочку JTAG.
[Доступ к RAM/Flash]
Эти команды можно использовать, если микросхема в цепочке имеет подключенную к ней память (или память интегрирована в эту микросхему). Перед тем, как их можно использовать, должен быть выбран и инициализирован драйвер шины (см. команду initbus).
detectflash. Определение параметров чипов flash, подключенных к микросхеме. endian. Установка/печать порядка байт (endianess) для чтения/записи двоичных файлов. eraseflash. Очистка памяти flash по номеру блоков. flashmem. Прошить память flash данными из файла. peek. Прочитать одно слово. poke. Записать одно слово. readmem. Прочитать содержимое памяти и записать его в файл. writemem. Записать содержимое файла в память.
[Высокоуровневые команды]
svf. SVF player работает с одной микросхемой в цепочке сканирования JTAG. Поэтому Вы должны заранее перевести программное обеспечение JTAG в рабочее состояние, определить кабель и обнаружить цепочку сканирования.
Плеер устанавливает новую инструкцию "SIR" и новый регистр "SDR". Они используются внутри с соответствующими командами SVF, и переназначаются новыми значениями по мере прохождения плеера по файлу. Это не рекомендуется для использования вне плеера SVF, поскольку их содержимое динамическое.
Пример сессии:
jtag> cable ppdev /dev/parport0 DLC5
Initializing Xilinx DLC5 JTAG Parallel Cable III on ppdev port /dev/parport0
jtag> detect
IR length: 5
Chain length: 1
Device Id: 10010000101000100000000010010011
Manufacturer: Xilinx
Part: XC2S300E-PQ208
Stepping: 9
Filename: /usr/local/share/jtag/xilinx/xc2s300e-pq208/xc2s300e-pq208
jtag> part < нужная микросхема в цепочке сканирования >
jtag> svf < файл SVF для выбранной микросхемы >
jtag> instruction BYPASS
jtag> shift ir
jtag> part < следующая микросхема >
jtag> svf < файл SVF для выбранной микросхемы >
jtag> instruction BYPASS
jtag> shift ir
Рекомендуется установить регистр инструкции микросхемы в состояние BYPASS, хотя большинство файлов SVF делают это в конце. Путем непосредственной установки инструкции в BYPASS вывод команды print всегда будет иметь значимую информацию.
Плеер SVF будет выдавать сообщения о проблеме в ситуациях, которые не могут быть обработаны. Эти сообщения классифицируются как предупреждения или ошибки, в зависимости от того, может ли плеер продолжить работу (тогда выдается предупреждение, warning), или не может (тогда выдается сообщение об ошибке, error). В случае, когда параметр TDO команды SDR приводит к несоответствию, плеер выдает warning и продолжает работу. Если нужно оборвать работу плеера, то укажите 'stop' в команде svf.
Отсутствие сообщений об ошибке и сообщений с предупреждениями говорит о том, что файл SVF был выполнен без проблем. Чтобы получить сообщение прогресса (сколько файла выполнено) обработки файла SVF, укажите 'progress' с командой svf.
Для плеера SVF существует несколько ограничений. Пока что плеер тестировался с файлами, которые были сгенерированы следующими инструментами:
- Xilinx ISE WebPack 6.3.02i - 9.1.02i - Altera Quartus II 4.1sp1 - 7.0
Конфигурации тестировались для следующих устройств:
- Altera EPC1C12Q240 - Altera MAX3032, EPM3032ALC44 - Altera MAX3064, EPM3064ALC44 - Altera MAX7032, EPM7032SLC44 - Altera MAX7064, EPM7064SLC44, EPM7064STC44 - Xilinx Spartan-IIE, XC2S300E-PQ208 - Xilinx Spartan-3, XC3S1000-FG456, XC3S5000-FG900
Реализация некоторых команд SVF имеет недостатки или отсутствует.
- Не поддерживаются команды HIR, HDR. + Их функциональность должна быть охвачена частью концепции UrJTAG. - Команда PIO не поддерживается. - Команда PIOMAP не поддерживается. - RUNTEST SCK не поддерживается. + Максимальные ограничения по времени не гарантируются. - TRST + параметры Z и ABSENT не поддерживаются. - Команды TIR, TDR не поддерживаются. + Их функциональность должна быть охвачена частью концепции UrJTAG.
Файлы SVF для программирования устройств на основе flash могут или не могут работать для имеющейся настройки. Это наблюдалось на устройствах Actel IGLOO, когда успех или неудача зависела от действительной скорости тактирования и от выбранного кабеля.
Опция ref_freq=< ... > команды svf позволяет подстроить вычисление команд 'RUNTEST xxx SEC'. Для этих команд плеер SVF нуждается в вычислении эквивалентного количества тактов, и по умолчанию он использует текущую тактовую частоту кабеля. Это можно переназначить опцией ref_freq, которая указывает фиксированную опорную частоту для таких вычислений.
bsdl. Команда 'bsdl' использует для настройки и тестирования нижележащей подсистемы BSDL для UrJTAG.
Каждый раз, когда команда 'detect' встречается с новой микросхемой, стартует процесс конфигурации. Это вовлекает сравнение полученного кода IDCODE с описаниями микросхем в каталоге /usr/share/urjtag, как это было описано выше. Однако перед тем, как начнется поиск подходящего описания в этой базе данных, запускается подсистема BSDL и делает поиск файла BSDL, который подходит к этому устройству. Если такой файл найден, то поиск по базе данных каталога /usr/share/urjtag пропускается. Если не найден, то последует стандартная обработка.
Чтобы сказать подсистеме BSDL, где находятся файлы BSDL, до команды 'detect' выдается команда 'bsdl path список_путей'. Элементы содержимого 'списка_путей' должны отделяться друг от друга точкой с запятой, и каждый элемент должен быть путем до каталога, где размещены файлы BSDL. Этот список сохраняется командой 'bsdl path', и используется позже, когда 'detect' вызывает подсистему BSDL.
ВАЖНОЕ ЗАМЕЧАНИЕ: подсистема BSDL применит первый файл BSDL, который пройдет парсинг без ошибок, и который содержит корректный IDCODE. Сканирование указанных директорий происходит точно в том порядке, в каком они были указаны. Однако внутри каждой директории порядок опроса файлов больше зависит от поведения Вашей файловой системы.
Дополнительная информация по команде 'bsdl':
- bsdl path < path1 >[;< path2 >[;< pathN >]] + устанавливает пути для нахождения файлов BSDL.
- bsdl test [file] + читает файл (если он указан) или все файлы, найденные через 'bsdl path' и печатает короткий статус, активная микросхема не требуется.
- bsdl dump [file] + читает файл (если он указан) или все файлы, найденные через 'bsdl path' и печатает все команды конфигурации, активная микросхема не требуется.
ПОДСКАЗКА: команда 'bsdl dump file' реализует тот же функционал, что и bsdl2jtag.
script. Хотя эта команда пока осталась, её функционал был объединен с командой include. Пожалуйста, используйте вместо команды script команду include.
setdevice. Эта команда использовалась только для поддержки процессора SHARC 21065L, у которого не было IDCODE, и поэтому он не мог корректно инициализироваться простым запуском команды "detect". Однако правильная инициализация может быть осуществлена после "detect" путем ручной загрузки правильных деклараций и драйвера шины:
jtag> include analog/sharc21065l/sharc21065l
spiflashmem. Команды "spidetectflash", "spiflashmem", "spireadflash" и "spieraseflash" существовали только в версии JTAG tools с копирайтом Intratrade Ltd., мы просто знаем о них из регистрации в сети.
Эта секция всего лишь место для информации, которая будет скоро добавлена.
[Файлы, обзор исходного кода]
doc/ документация
data/ описание микросхем (файлы данных)
include/ заголовочный файлы языка C
src/ исходный код языка C
src/bsdl подсистема BSDL
src/bus драйвер шины для разных CPU и других микросхем
src/cmd реализация команд для шелла "jtag"
src/flash алгоритмы детектирования и программирования flash
src/jim JIM, симулятор JTAG target
src/lib утилитарные функции
src/part функции для доступа к определенным микросхемам в цепочке JTAG
src/svf плеер SVF
src/tap основные функции для доступа к цепочке JTAG
[Драйверы]
* Драйверы кабеля * Драйверы соединения (Link drivers) * Драйверы TAP * Драйверы цепочки JTAG (Chain drivers) * Драйверы шины * Драйверы flash * Команды
Драйверы, специфичные для кабеля (src/tap/cable). Это драйверы, которые видит пользователь через оболочку интерпретатора команд "jtag" (command shell). Они выводятся списком в ответ на команду "help cable". Каждый драйвер предоставляет следующие функции:
* connect(), init() - инициализация * done(), cable_free(), disconnect() - очистка * set_frequency() - установка скорости бит для сдвига данных по цепочке JTAG * clock(), get_tdo(), transfer() - непосредственные действия JTAG * flush() - используется внутренне для выполнения непосредственных действий JTAG * help() - текст подсказки для отображения командной оболочкой jtag
Инициализация. После выделения структуры "cable_t" указатель на неё и дальнейшие параметры (как строки) будут переданы сначала в функцию connect() выбранного кабеля.
После этого функция init() вызывается через cable_init(). Если cable_init() вернет нулевое значение, значит все в порядке и кабель готов к использованию.
Очистка. Есть 2 функции, которые делают актуальную очистку:
* done() отвечает за перевод аппаратуры в безопасное и целостное состояние. * cable_free() тогда можно использовать для очистки наподобие освобождения выделенной по необходимости памяти, и т. п.
Обе эти функции обычно вызываются из chain_disconnect().
Дополнительный механизм позволяет делать очистку, если драйвером низкого уровня было определено отключение (например драйвером USB или драйвером параллельного потра). Для этой цели кабель предоставляет функцию disconnect():
1. Низкоуровневый драйвер (например parport) вызывает disconnect() драйвера кабеля. 2. Функция disconnect() драйвера кабеля вызывает chain_disconnect(). 3. Функция chain_disconnect() вызовет done() драйвера кабеля. 4. Затем функция chain_disconnect() вызовет cable_free() драйвера кабеля.
После возврата из chain_disconnect() к disconnect() драйвера кабеля, структура cable_t освобождается, и к ней больше нельзя осуществлять доступ.
Действия JTAG. В настоящий момент API предоставляет 5 разных функций для выполнения операций на интерфейсе JTAG на низком сигнальном уровне (используя 4 сигнала TMS, TCK, TDI и TDO).
* clock(tms,tdi,n) берет значения для выхода TMS и TDI из своих параметров, гарантируя тем самым, что действительные сигналы кабеля будут установлены соответствующим образом, и произойдет нужное количество переходов 0-1 на сигнале TCK (n раз).
* get_tdo() вернет текущее состояние входа TDO.
* set_trst(x) установит сигнал TRST, и вернет текущее значение.
* get_trst() вернет текущее значение сигнала TRST.
Для многих адаптеров JTAG почти нет задержки когда делается чередование clock() и get_tdo(). Записи и чтения происходят немедленно, и результат также доступен немедленно. Это справедливо для большинства адаптеров параллельного порта (кроме тех, которые подключены через адаптер USB-to-parallel, или док-станции USB) и ввода/вывода с привязкой к адресам памяти (memory mapped IO, например через выводы GPIO микроконтроллеров).
Но есть адаптеры, особенно на базе USB и Ethernet, которые показывают большую задержку между инициацией чтения бита и доставкой значения этого бита. Эта задержка составляет как минимум 1 миллисекунду с USB, что ограничено скоростью частотой следования передач 1 кГц. Один из путей обхода этой проблемы - передача бит, упакованных в байты и порции байт, что возможно с помощью функции transfer().
* transfer(in, out)
Функция transfer() делает серию импульсов TCK, с данными для TDI, которые читаются как байты из памяти. Эти байты автоматически передаются как поток бит. TMS устанавливается в 0 во время передачи (передач). Опционально перед тем, как каждый бит будет выдвинут из интерфейса, состояние входа TDO может быть прочитано и сохранено в памяти (поток бит упаковывается в массив байт такого же размера, как и входной массив).
Это все еще не приводит к существенному улучшению, если операция состоит из множества транзакций чтения и записи (например, повторяющиеся записи в регистры инструкции и некоторые регистры данных, затем чтения регистра данных, как это требуется для доступа к памяти). По этой причине вышеупомянутые функции также доступны в вариантах, которые не приводят к немедленной активности, но вместо этого планируют операции для последующего выполенения. В API эти функции видимы как
Эти функции не реализованы в драйвере кабеля (но сейчас они находятся в src/tap/cable.c). Драйвер кабеля просто предоставляет функцию flush() для действительного выполнения поставленной в очередь активности некоторым способом, эффективным в контексте кабельного линка, и сохранение результатов активности get_tdo() и transfer(). Вызывающий код позже может взять результаты с помощью этих функций (реализованных в cable.c):
Как пример, рассмотрим последовательность активных действий:
1. clock() 2. get_tdo() 3. clock() 4. get_tdo()
Если результат первого get_tdo() не требуется абсолютно перед вторым clock(), то эта последовательность действий может быть оптимизирована в следующую последовательность:
Следующие секции подробно объясняют механизм постановки в очередь и его ограничения.
Когда происходит сброс очереди (flush). Функция cable_flush() используется для сброса очереди (немедленного выполнения её действий) в контексте кабельного линка. Она получает один дополнительный аргумент "how_much" (какой ценой), который может быть одним из следующих значений:
* OPTIONALLY: (не обязательно) драйвер кабеля может сбросить очередь, если это выгодно, например, если очередь заполнена так, что достигнут некоторый лимит буфера для интерфейса кабеля). Может быть желательно сбросить очередь раньше, чтобы поддерживать малую длину очереди, если нет смысла в организации очереди из большого количества элементов, потому что передача в кабель все равно должна быть разделена на маленькие порции. Это использует UrJTAG немедленно после добавления элементов в очередь.
* TO_OUTPUT: (на выход) драйвер кабеля должен сбросить очередь как минимум таким образом, чтобы один вывод стал доступным в выходной очереди. Если уже что-то есть в выходной очереди, то это должно интерпретироваться подобно варианту OPTIONALLY. Это использует UrJTAG немедленно перед тем, как желательно использовать этот вывод.
* COMPLETELY: (полностью) драйвер кабеля сбрасывает всю очередь. Это UrJTAG использует немедленно перед действиями, которые обходят организацию очередей так, как вызовы обычных функций clock/get_tdo. Это также может использовать код приложения, чтобы гарантировать, что некоторые действия будут выполняться в строгом порядке во времени.
Постановка в очередь активности JTAG. Исходный код в модуле src/tap/cable.c предоставляет важные функции для доступа к двум очередям "todo" (с активностью, которая должна быть осуществлена), и "done" (с результатами):
* cable_add_queue_item * cable_get_queue_item
В модуле src/tap/cable/generic.c Вы найдете две реализации алгоритмов разбора очереди, например реализации функции flush(). Они могут использоваться в любом новом драйвере кабеля, если он сам не предоставит более продвинутый алгоритм:
* generic_flush_one_by_one() просто вызывает "классические" функции одну за другой. Производительность драйвера кабеля с использованием этой реализации будет одинаковой, независимо от того, будут ли использоваться задержанные вызовы (через очередь), или немедленные вызовы (без очереди).
* generic_flush_using_transfer() пытается оптимизировать вызовы так, что несколько clock() и get_tdo() трансформируются в вызовы transfer(). Это может дать некоторое улучшение производительности.
Эти традиционные реализации также предоставляются как шаблон для новых, реализаций специфических для определенного кабеля.
Обычные реализации. Как образец, и во многих случаях как полная реализация для новых кабелей, Вам может быть полезен код модуля src/tap/cable/generic.c, где содержаться обычные (generic) подпрограммы, подходящие для кабелей на основе параллельного порта (и также для некоторых других типов кабеля).
[Драйверы линка (Link drivers)]
Link-драйверы наподобие "parport" предоставляют базовый обмен между драйвером кабеля и реальным адаптером JTAG. Openwince JTAG tools поддерживают только линки параллельного порта с драйверами "parport". UrJTAG предоставляет поддержку для линков USB, но в ранних релизах драйверов для этого просто используется мимикрия линков параллельного порта.
Все драйверы линка предоставляют базовые функции:
* connect(), которая вызывается из функции connect() драйвера кабеля * open(), для реального подключения к устройству во время вызова функции init() драйвера кабеля * close(), чтобы отключиться от устройства во время вызова функции done() драйвера кабеля * free(), чтобы освободить все ресурсы, эта функция вызывается из функции free() драйвера кабеля
parport. В настоящий момент драйверы parport предназначены для прямого доступа к параллельному порту PC с использованием адресов I/O (direct.c), и для использования ppdev на Linux или ppi на FreeBSD.
Дополнительно есть драйверы parport "ftdi" и "ftd2xx", которые в действительности используют обмен с кабелями USB на базе чипов FTDI. Они не могут использоваться для соединения со старыми кабелями параллельного порта через адаптеры преобразования интерфейсов USB-LPT на чипах FTDI, и возможно будут скоро переписаны как драйверы "usbconn".
Все драйверы parport представляют общее API для установки и чтения сигналов.
usbconn. Драйверы usbconn предоставляют общее API для поиска устройств USB и подключения к ним. В настоящий момент есть драйверы для libusd, libftdi и FTD2XX (например, для обмена с кабелями на чипах FTDI используется libftdi и/или FTD2XX, для обмена с Cypress FX2 используется EZUSB.SYS или CyUSB.sys, и т. д.).
arniml, 18 мая 2008: устарело? В отличие от parport API, драйверы usbconn предоставляют только функции для соединения, рассоединения, и для освобождения ресурсов. Реальный обмен данными должен быть реализован нижележащими библиотечными функциями, например usb_write для libusb, или ftdi_write для libftdi. Таким образом, каждый драйвер, использующий usbconn, обычно работает только вместе с одним из определенных драйверов usbconn.
[Драйверы шины]
Драйверы шины (Bus drivers) транслируют операции чтения и записи на шине в команды и методы JTAG. Шина в этом контексте не ограничена ни шиной процессора, ни шиной памяти. Любой системный компонент, который может быть прочитан или записан может быть виден подключенным к шине. Например, внутренняя или внешняя память (RAM, ROM, Flash) и периферийные устройства, подключенные к процессору, или просто FPGA с соединениями 1:1.
Доступные драйверы шины перечислены в ответе на команду "help initbus". Каждый драйвер предоставляет следующие функции:
* bus_new() - инициализация * bus_free() - очистка * bus_printinfo() - краткое описание * bus_prepare() - подготовка * bus_area() - описание геометрии шины * bus_read_start() - инициирует чтение * bus_read_next() - доступ на чтение * bus_read_end() - завершение чтения * bus_read() - атомарное чтение * bus_write() - доступ на запись
ВАЖНО: параметры адреса для функций, перечисленных выше, всегда указывают адрес байта, независимо от актуальной ширины данных. Драйвер шины подстраивает адрес под свой собственный, если это требуется.
Создание. При вызове функции bus_new() драйвер выделяет в памяти структуру "bus_t" и выполняет все требуемые внутренние инициализации.
Инициализация. После создания структуры "bus_t" будет вызвана функция bus_init(), чтобы дать драйверу возможность инициализировать свои внутренние состояния или биты BSR, как это необходимо. Такая функциональность отделена от bus_new(), поскольку некоторые драйверы требуют повторной инициализации во время выполнения.
Очистка. Предполагается, что драйвер освобождает всю выделенную им память (включая его структуру "bus_t"). Дополнительно он должен установить устройство в состояние, которое позволит его дальнейшее нормальное функционирование.
Краткое описание. Печатает сообщение, описывающее драйвер. Эта функция вызывается командой "print" перед тем, как она выведет список областей, за которые отвечает этот драйвер шины.
Подготовка. Эта функция вызывается всякий раз, когда инициируется операция на шине. Драйвер должен выполнить требуемые шаги подготовки (preparation) так, что последующие вызовы функций bus_read_* и bus_write смогли правильно выполнить свои задачи.
Например, драйвер шины BSR переведет устройство в режим EXTEST для активации регистра пограничного сканирования (boundary scan register, BSR) на выводах устройства.
Описание геометрии шины. На определенных стадиях функция bus_area() драйвера шины вызывается другими командами, чтобы опросить геометрию шины для имеющегося адреса. Драйвер шины должен заполнить в полях структуры "bus_area_t" описание геометрии области, в которой находится указанный адрес:
* короткое текстовое описание области * начальный адрес области * длина области в байтах * ширина данных в битах
Опрос по адресу вне диапазона должен привести к значению в длине области:
UINT64_C(0x100000000)
Инициация чтения. Поскольку машина состояния JTAG определяет последовательность захват-сдвиг-обновление (capture-shift-update), она требует сдвиг адреса для чтения перед захватом читаемых данных. Таким образом, функция bus_read_start() вызывается с самым первым адресом, откуда происходит чтение. Это разрешает драйверу сдвиг адреса в устройство перед тем, как он может реально прочитать данные по этому адресу.
Доступ на чтение. Функция bus_read_next() выбирает читаемые данные из устройства, которое было адресовано предыдущим вызовом bus_read_start() или bus_read_next(). И снова, это происходит из-за последовательности capture-shift-update интерфейса JTAG:
1. захват читаемых данных из выводов устройства 2. сдвиг нового адреса 3. обновление нового адреса на выводах устройства
ВАЖНО: параметр адреса задает место расположения 'следующего' доступа на чтение. Это не адрес данных, которые были возвращены этим вызовом функции.
Завершение чтения. Функция "bus_read_end()" вызывается по окончании последовательности чтения. Например, когда команды высшего уровня определяют, что последняя порция данных будет прочитана из устройства. Здесь нет нового адреса, и предполагается, что функция драйвера вернет прочитанные данные, которые были адресованы ранее.
Атомарное чтение. Для упрощения использования драйвер шины предоставляет функцию "bus_read()", которая инкапсулирует чтения данных из одного адреса в атомарную операцию. Драйверы шины обычно строят эту функцию из вызова "bus_read_start()" и последующего "bus_read_end()".
Доступ на запись. Эта функция записывает один элемент данных по указанному адресу. Поскольку это транслируется в одну операцию JTAG (захват данных игнорируется, сдвиг и обновление адреса и данных), здесь нет разделения, как это присутствует в функциях чтения.
[Формат файла данных]
Файлы деклараций JTAG находятся в директории "data". Эти файлы содержат общую часть специфичной информации JTAG в форме, удобной для парсинга, например список команд JTAG, регистр BSR, список регистров JTAG и т. д.
Синтаксис декларации файла JTAG определен в следующих подсекциях.
Общие правила. Файл декларации JTAG это текстовый файл, который состоит из строк. Пустые строки игнорируются. Текст строки после "#" до конца строки также игнорируется, что полезно для вставки комментариев. Все другие строки значимы.
Каждая значимая строка состоит из токенов, разделенных пробелами. Пробелами могут быть символы ' ' (код 0x20) и/или символы табуляции (код 0x09).
Определение сигнала. Строка определения сигнала состоит из слова "signal", за которым идет пробел и имя сигнала (без пробелов внутри имени). Остальная часть строки должна содержать список выводов микросхемы (в списке строки в качестве разделителей также используются пробелы). Этот список в настоящий момент никак не используется в JTAG Tools. Он предназначен для использования в будущем.
[Разработка]
Планы на будущее:
- API и пакет библиотеки - Сопряжение с языками Python, Perl, ... - Доступ через TCP/IP - Новые драйверы кабелей - ...
Как получить:
* Используйте систему управления версиями Subversion * Создайте и предоставьте исправление * Используйте трекеры SourceForge
Для получения списка известных проблем в текущей версии пожалуйста проверьте трекер ошибок ("Bugs") на вебсайте UrJTAG!
Q. Эта документация неполная. Где можно получить больше информации? A. Задайте вопрос на форуме "Using UrJTAG" сайта urjtag [1].
Q. Моя flash не детектируется или не может быть запрограммирована. Что я могу с этим сделать? A. Запишите вывод ответа на команды "detect" и "detectflash", задайте вопрос на форуме, где приведите эту информацию. Если возможно, перед этим перекомпилируйте UrJTAG с опцией "--enable-jedec-exp", чтобы получить больше информации.
Q. Мой CPU/FPGA/и т. п. не детектируется. Что можно сделать? A. Сначала попробуйте получить файл описания "BSDL" чипа от производителя, и перед тем, как использовать "detect", укажите, где UrJTAG должен найти этот файл, с помощью команды "bsdl path". Во-вторых, нужно выбрать драйвер шины. Возможно, сработают "ejtag" или "prototype".
Q. Когда я ввожу команду "cable parallel 0x378 DLC5" (в рабочем окружении Cygwin), то получаю сообщение "Unknown port driver: parallel"? A. Установите пакет Cygwin ioperm, переконфигурируйте и скомпилируйте.
Q. Когда я ввожу команду "cable parallel 0x378 DLC5" (в рабочем окружении Cygwin), то получаю сообщение "Error: Cable initialization failed!". A. Установите драйвер ioperm.sys с помощью команды `ioperm -i`.
Q. Когда я запускаю autogen.sh, то получают сообщение "Can't exec "autopoint": No such file or directory" A. Вам нужны заголовки для gettext (например, пакет Debian "gettext-devel").
Q. Когда я запускаю autogen.sh, то он жалуется на отсутствие CVS. A. Самое простое решение для обхода этого сообщения - действительно установить CVS.
Q. Во время компиляции я получаю сообщение "svf_bison.y: No such file or directory" A. Вам нужен "bison".
Q. Во время компиляции я получаю сообщение "flex: can't open ... src/svf/svf_flex.l" A. Вам нужен "flex".
Q. Во время компиляции я получаю сообщение "src/svf/svf_flex.l", line 27: unrecognized %option: bison-locations". A. Вам нужна более новая версия flex. Она должна быть 2.5.31 или более свежей. К сожалению, Cygwin поставляется только с 2.5.4a. Вы можете попробовать скомпилировать и установить более новую версию flex из исходников, чтобы решить эту проблему. Распространяемый tarball исходного кода содержит код, предварительно сгенерированный с текущей версией flex, Вам нужен сам flex только для компиляции из свежих выборок SVN (SVN checkouts).
Q. Когда я запускаю "make install", то получаю ошибки "Permission denied". A. Если Вы хотите установить в системную директорию (по умолчанию установка происходит в /usr/local), то нужно запустить "make install" от имени суперпользователя, например выполните "sudo make install".
Q. Мой файл BSDL определяет шину DAT как bit_vector(15 downto 0), как я должен получить доступ к отдельным элементам? A. Синтаксис BSDL это расширение языка VHDL. Элементы массива индексируются круглыми скобками: DAT(4) выбирает индекс 4 вектора DAT. Также см. команду "print signals".
Q. Моя плата требует определенных сигналов, установленных в специальные значения, перед тем, как можно получить доступ к внешней памяти. A. Большинство (если не все) основанные на BSR драйверы шины позволяют управлять статическими конфигурациями с помощью битов BSR. Примените требуемые команды "set" перед выдачей команды "initbus ...". Эти установки сохраняются всеми связанными с шиной командами, если они не конфликтуют с сигналами, требуемыми для работы шины.
Q. Мой адаптер USB (USB pod) работает медленно. A. Адаптеры JTAG на основе USB страдают от набора внутренних проблем. Для достижения максимальной производительности рассмотрите следующее:
* Запустите UrJTAG под управлением традиционной системы linux. Cygwin и VMWare работают намного медленнее. * Подключите адаптер через высокоскоростной хаб USB для получения порта USB high speed для хоста. Даже когда адаптер является устройством full speed, все равно будет выгода из-за уменьшения времени циклов шины между хостом и хабом.
Q. jtag.exe не запускается, что делать? A. Несмотря на то, что jtag.exe скомпилирован как 32-битное приложение, он может нормально работать на любой Windows-системе начиная с Windows XP (работает даже на 64-битной Windows 10. Однако для нормального запуска jtag.exe нужно выполнение двух условий. Во-первых, в корневой папке UrJTAG (где находится jtag.exe) должна находиться 32-битный файл libusb0.dll. Во-вторых, должна быть установлена библиотека FTD2XX.dll от компании FTDI.
libusb0.dll легко взять из архива libusb-win32-bin-1.2.6.0.zip, который можно скачать с сайта sourceforge.net (ищите с помощью поисковой строки Google: libusb-win32 site:sourceforge.net). Зайдите в архив, найдите в папке архива bin\x86\ файл libusb0_x86.dll, распакуйте его и переименуйте в libusb0.dll. После этого переместите переименованный файл в папку, где находится запускаемый файл jtag.exe.
FTD2XX.dll устанавливается вместе с пакетом драйверов FTDI. Для закачки драйвера ищите в Google: FTDI drivers, скачайте файл CDM v2.12.28 WHQL Certified.zip, в нем есть все необходимые библиотеки DLL. При установки драйвера FTDI они автоматически копируются в системные папки Windows и становятся доступны. Как вариант, можно скопировать нужный библиотечный файл напрямую в каталог, где находится jtag.exe
Для проекта UrJTAG используются разные лицензии. Для большей части кода применяется GPL, за исключением некоторых include-файлов, JIM и исходного кода драйвера кабеля, где используется лицензия BSD или MIT; это указано в заголовочных файлах.
GNU Free Documentation License (FDL): см. файл fdl.txt. GNU General Public License (GPL): см. файл gpl.txt.