Разработка и отладка UEFI-драйверов на Intel Galileo, часть 3: начинаем аппаратную отладку
Здравствуйте, уважаемые читатели Хабра.После небольшого перерыва я продолжаю публикацию моих заметок (первая, вторая) о разработке и отладке компонентов 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 0×0403 0×6010 ftdi_channel 0 ftdi_layout_init 0×0c08 0×0f1b ftdi_layout_signal nTRST -data 0×0100 -noe 0×0400 Устанавливаем драйвер 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: 0×0e681013 (mfg: 0×009, part: 0xe681, ver: 0×0) 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 NoteDebug Adapter Configuration | OpenOCD DocumentationSource Level Debug using OpenOCD/GDB/Eclipse on Intel® Quark™ SoC X1000 | Intel Application Note