Разработка и отладка UEFI-драйверов на Intel Galileo, часть 3: начинаем аппаратную отладку

  • Tutorial

Здравствуйте, уважаемые читатели Хабра.
После небольшого перерыва я продолжаю публикацию моих заметок (первая, вторая) о разработке и отладке компонентов UEFI на открытой аппаратной платформе Intel Galileo. В третьей части речь пойдет от подключении JTAG-отладчика на базе FT2232H к Galileo и о настройке отладочного окружения для нее.

Вступление и отказ от ответственности

По уже сложившейся традиции, следует упомянуть, что все нижеуказанные сведения вы используете на свой страх и риск, автор не несет ответственности за возможные потери работоспособности платы, времени, настроения и/или веры в человечество. Всё описанное почерпнуто из открытых источников, список которых приведен в конце этой статьи, и эта публикация не может считаться нарушением NDA с моей стороны.

Отправная точка

На данный момент я предполагаю, что у вас уже есть плата Intel Galileo, для которой вы собрали прошивку и образ Yocto Linux и можете сделать это снова в любой момент. Останавливаться еще раз на сборке ПО для Galileo я в этой части статьи не буду — прочтите прошлую часть, если нужно.
Также подразумевается наличие у вас отладчика, совместимого с OpenOCD, лучше всего — на базе чипов серии FTDI FTxx32H, т.к. именно такие используются инженерами Intel для написания и тестирования отладочных средств для Galileo. Не могу гарантировать, что другие отладчики будут ли не будут работать — не проверял. В этой статье в качестве отладчика я буду использовать breakout-плату на FT2232H, которая от «взрослых» отладчиков на том же чипе отличается только отсутствием красивого корпуса и микросхемы сдвига логических уровней, для отладки на Galileo не нужной.

Железная часть

С железной частью все довольно просто — нужно лишь правильно соединить контакты разъема JTAG на Galileo с нужными выводами FT2232H.
Выводы у чипов серии FTxx32H обозначены маркировкой xyBUSz, где вместо x — обозначение канала (A, B, C или D), вместо y — обозначение первого (D) или второго (C ) набора выводов каждого канала, а вместо z — номер вывода (0-7 для первого и 0-9 для второго набора выводов).
Для работы с JTAG подключение нужно проводить по следующей схеме:
xDBUS0 <-> TCK
xDBUS1 <-> TDI
xDBUS2 <-> TDO
xDBUS3 <-> TMS
TRST можно подключить к любому свободному выводу того же канала, в моем случае это xCBUS0, вы можете использовать любой другой, но в конфигурацию OpenOCD придется внести соответствующее изменение.

Программная часть

Достаем Intel System Studio
А вот здесь все немного более сложно, особенно для пользователей Windows, у которых нет возможности выполнить sudo apt-get install openocd и через 10 секунд начать писать конфигурацию для своего отладчика. Ребята из Intel об этом знают, поэтому и включили OpenOCD и GDB в дистрибутив Intel System Studio 2015 Beta, скачать который можно отсюда после регистрации. В нем же имеется Intel System Debugger, выступающий в роли GUI к GDB и предназначенный для тех, кто пока еще не постиг Дао настолько, чтобы работать с ним напрямую из консоли. Ваш покорный слуга уже встал на этот Путь, но он труден, а соблазн использовать GUI велик, ведь Intel даже поддержку отладки UEFI добавили не так давно. В результате я таки поддался, предлагаю поддаться и вам.
После регистрации, загрузки и установки ISS необходимо предпринять несколько дополнительных действий: написать конфигурацию для своего отладчика (по умолчанию имеются конфигурации только для TinCanTools FLYSWATTER2 и Olimex ARM-USB-OCD-H), подключить отладочные символы, чтобы можно было отлаживать код на C, а не на ассемблере. В Windows также потребуется установить драйвер libusbK для выбранного канала отладчика вместо стандартного драйвера FTDI, чтобы OpenOCD смог его найти. Приступим.

Пишем конфигурацию для OpenOCD
Настройка OpenOCD состоит обычно из двух частей: написания конфигурации отладчика и отлаживаемой платы. От второго добрые разработчики Intel нас избавили, а первое будем делать по аналогии. Перейтите в директорию, в которую вы установили System Studio, а оттуда — в debugger\openocd\scripts\interface\ftdi, и скопируйте файл olimex-arm-usb-ocd-h.cfg, назвав копию debugger.cfg. Откройте полученный файл в любимом редакторе и удалите строки ftdi_device_desc, ftdi_layout_signal nSRST, ftdi_layout_signal LED, в строке ftdi_vid_pid измените VID и PID отладчика на ваши значения. Если вы используете каналы B, C или D, добавьте строку ftdi_channel 1, ftdi_channel 2 или ftdi_channel 3 соответственно. Сохраните изменения и конфигурация для вашего отладчика готова.
Если вы хотите узнать, что означают магические числа в строке ftdi_layout_init, настроить дополнительные сигналы или перенести TRST с xCBUS0 на другой вывод — добро пожаловать в документацию.
Готовый вариант debugger.cfg для breakout-платы на FT2232H
interface ftdi
ftdi_vid_pid 0x0403 0x6010
ftdi_channel 0
ftdi_layout_init 0x0c08 0x0f1b
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400

Устанавливаем драйвер libusbK
Пользователи Linux могут смело пропускать этот шаг, т.к. у них нужный драйвер уже установлен. Ползователям же Windows необходимо установить вышеупомянутый драйвер вместо стандартного. Сделать это можно несколькими способами, самым простым из которых является, на мой взгляд, использование утилиты Zadig. Скачиваем и запускаем последнюю версию, ставим галочку List All Devices в меню Options, выбираем свое устройство из списка, выбираем в качестве драйвера libusbK и нажимаем кнопку Replace Driver.
Если все сделано верно — выглядеть окно программы будет примерно так:


Проверяем работу OpenOCD
Теперь необходимо проверить, что отладчик подключен верно и OpenOCD может использовать его для доступа к Galileo по JTAG. Для этого необходмо запустить openocd, указав в качестве параметров конфигурационные файлы для отладчика (debugger.cfg, созданный на первом шаге) и для платы (входит в поставку ISS). Для этого нужно запустить командную строку от администратора, сменить текущую директорию на debugger\openocd\bin, и оттуда выполнить команду
openocd -f ..\scripts\intefrace\ftdi\debugger.h -f ..\scripts\board\quark_x10xx_board.cfg
Если вы все сделали верно, команда выведет приблизительно следующее:
Info : clock speed 4000 kHz
Info : JTAG tap: quark_x10xx.cltap tap/device found: 0x0e681013 (mfg: 0x009, part: 0xe681, ver: 0x0) enabling core tap
Info : JTAG tap: quark_x10xx.cpu enabled
Если же у вас вместо этого только
Error: libusb_open() failed with LIBUSB_ERROR_NOT_SUPPORTED
значит что-то не так либо с драйвером, либо с конфигурацией отладчика.

Достаем отладочные символы
Если сборка прошивки для Galileo, описанная в предыдущей части, происходила в вашей основной системе — можете этот шаг пропустить. У меня же она происходила в виртуальной машине, поэтому для source-based отладки необходимо достать из нее исходный код прошивки и файлы с отладочной информацией.
Скопируйте директорию Quark_EDKII_vX.Y.Z из вашего домашнего каталога в ВМ на рабочий стол основной ОС, запустите Intel Debugger при скриптом xdb_remote (в Windows ссылка на него есть в меню Start->ISS->Debugger Startup->Quark SoC), откройте окно Options->Source Directories..., создайте на первой вкладке правило замены старого пути до скопированной директории на новый, в моем случае это "\home\congatec\Galileo" -> «C:\Users\Nikolaj\Desktop», а на второй вкладке добавьте эту же директорию в список Source Directories. Оба этих действия помогут отладчику самостоятельно найти исходный код отлаживаемых модулей.

Подключаемся к Galileo
Запустите OpenOCD и Intel Debugger, как описано выше, нажмите Reset на Galileo, а затем кнопку Connect в окне отладчика. Если в окне Assembler появился листинг того модуля, на котором произошла остановка при подключении отладчика — отлично, можно приступать к аппаратной отладке. Чтобы проверить, нет ли ошибки на предыдущем шаге, выполните остановку в DXE-фазе (3-5 секунд после перезагрузки платы) и введите команды efi «setsuffix .debug» и efi loadthis в поле с приглашением xdb>. Если все было сделано верно, то отладочные символы будут успешно загружены, а отладчик перейдет из вкладки Assembler в редактор исходного кода. Если в ответ на loadthis вы получаете сообщение «System Table Not Found» — попробуйте остановить исполнение чуть позже или чуть раньше.

Заключение и планы

В следующей части статьи мы напишем простой DXE-драйвер, наладим быструю сборку прошивки с ним и попробуем отладить его, используя как подготовленный в этой статье Intel Debugger, так и другие отладочные средства. Спасибо за внимание, до встречи в следующей части.
P.S. Уважаемый НЛО, может быть теперь ты сможешь добавить профильный хаб UEFI? Было бы очень здорово.

Литература

Interfacing FTDI USB Hi-Speed Devices to a JTAG TAP | FTDI Application Note
Debug Adapter Configuration | OpenOCD Documentation
Source Level Debug using OpenOCD/GDB/Eclipse on Intel Quark SoC X1000 | Intel Application Note
  • +18
  • 8,9k
  • 5
Поделиться публикацией

Похожие публикации

Комментарии 5

    0
    Intel System Studio 2015… спасибо, надо взять на заметку.
      0
      Можно обойтись и без нее, но я пока не настолько знаком с GDB, чтобы отлаживать прошивку прямо в нем. Добавлю также, что аппаратая отладка UEFI — новая тема для меня, т.к. покупать дорогущую Debug probe для каждого семейства процессоров фирме не улыбается, поэтому весь наш production-код отлаживается по старинке — через отладочные сообщения и макросы вроде ASSERT_EFI_ERROR. Этих средств достаточно для отладки PEI и DXE-драйверов, для которых имеются исходники, ядро SEC уже и так отлажено до нас, а всякие BLOB'ы пусть отлаживают их авторы. Также можно использовать Intel UDK Debugger Tool (UDT), но он требует наличия драйвера DebugAgent в прошивке, или его аналог от вендоров платформы, например, AMI DebugRX для Aptio, но решение Intel бесплатно, а отладочные средства AMI — удовольствие недешевое.
      0
      Вопрос:
      Это полноценный JTAG получается? Особенно интересует возможность трассировки?
      Если да, то есть ли возможность так же отлаживать старшие версии процессоров x86, в частности интересует Atom и i3?
        +1
        Полноценный вполне, трассировка, register watch, edit and continue и все остальное на месте.
        Для отладки Atom и Core нужно устройство ITP, вроде такого:
        image
        Стоят такие штуки около 3 тысячи долларов, и требуют наличия разъема XDP на отладочной плате (т.е. нужна CRB, а не обычная плата, еще 600 долларов) и лицензионного Intel JTAG Debugger (еще 2000). В итоге получается сумма, неподъемная даже для очень заинтереснованных энтузиастов, а тут почти то же самое, но за копейки.
          0
          Хотел в embedded разработке попробовать Intel Atom (Galileo слабоват всё-таки), вот решался вопрос с отладкой. Оказывается не всё так просто с JTAG для Atom. Спасибо.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое