Приветствую вас, друзья! Не знаю как вам, а мне нравится разбирать всякие штучки, узнавать, как они работают, и применять их в своих проектах. По ходу дела начинается настоящее увлекательнейшее расследование, технический детектив.
На этот раз меня заинтересовала плата с разными микросхемами, которые могут пригодиться во многих затеях. А может из неё вообще получится удобная отладка? В любом случае, это очень интересно. Это тот самый творческий процесс, приносящий радость и заметно повышающий наши навыки и умения. А ведь они часто самое ценное, что дал проект и работа над ним.
Проведём расследование, поищем JTAG, узнаем способы и отследим разводку BGA, поработаем с ПЛИС, … и много других действительно интересных вещей. Кряк уже заинтересовался!
Как там у нас обычно? «Сломать, а потом читать инструкцию». Инструкций и документации нет, поэтому будем экспериментировать ломать! ☺
Такая плата – действительно целый испытательный полигон. Здесь можно попробовать свои силы в обратной разработке, считывании и копании прошивок, в работе с ПЛИС, микроконтроллерами, памятью и видеосигналом, и многое другое.
Это ещё и замечательный тренажёр. Ведь что не умеется, станет нашим навыком. Дорогу осилит идущий. Бонусом будет сама плата (n штук), заметно подросшее в процессе её исследования мастерство и отличное настроение! А ещё всем этим можно поделиться с сообществом.
❯ Что ты такое?
Честно говоря, мне не удалось найти много полезной информации по плате SX100 у Novastar, что несколько странно. Гугление надписей на плате не дало каких-то результатов. Я писал в интернет-магазины, продающие подобное оборудование; людям, занимающимся ремонтом или какой-то ещё деятельностью, связанной с подобными платами; куда-то ещё. Но никто мне не дал или не захотел дать ответа. Плату я нашёл на барахолке. Продавец так же не признался, откуда плата.
Поэтому, наша плата могла использоваться внутри помещений. Или как сменный модуль видеопроцессоров, вроде таких:
Конкретно этот видеопроцессор несколько отличается, но есть масса других моделей. Расположение разъёмов бывает очень похожим на то, что есть на нашей плате.
А есть и платы интерфейсов для видеопроцессоров.
Надпись на штрих-коде снизу платы MFAB08215X0450000437. По надписям ничего внятного не нашлось. Рядом, видимо, дата производства.
Если подключить USB, то плата определяется так:
USBVID_0483&PID_57200000000001B
USBVID_0483&PID_5720&REV_0200
USBVID_0483&PID_5720
Nova 3D HD
Посмотрим, как выглядит NovaStar nova3D HD:
Похоже, но не совсем то.
На сайте fccid.io можно найти фотографии устройств снаружи и внутри, что может дать хорошие подсказки в разных ситуациях.
Для Nova3D HD тоже есть страничка, и можно посмотреть фото плат.
В общем, опознать плату пока не удаётся. Но она всё равно кажется интересной, поэтому покупаем несколько штук для экспериментов.
❯ Что интересного есть на плате?
Одна из первых ступенек обратной разработки – осмотр «пациента» и поиск документации и разных полезностей для микросхем.
На плате выделяются большие микросхемы:
- FPGA ALTERA Cyclone IV EP4CE15F23C8N.
- SDRAM: одна W9812G2IH (1M×4 BANKS×32BIT), две M12L64322A (512K x 32 Bit x 4 Banks).
- Микроконтроллеры NUC123LD4AN0 (ARM Cortex-M0 32-bit) и STM32F207VET6.
- ADV7612 (Dual Port 225 MHz HDMI Receiver) и ADV7511 (225 MHz HDMI Transmitter).
- LAN8720A(i) – Small Footprint RMII 10_100 Ethernet Transceiver.
- Две памяти W25Q128JVSQ – Serial Flash Memory. Одна для хранения конфигурации ПЛИС, вторая рядом с STM32 для чего-то ещё.
Также есть 16 микросхем 74hc245, пара генераторов, cdcs503 Clock Buffer/Clock Multiplier, dc-dc преобразователи и разная мелочь.
Документация на детальки сложена в папочке на Гитхабе.
Ещё у нас есть 2 разъёма HDMI, 1 Ethernet и USB мини.
На плате много посадочных мест под штыревые разъёмы с приятными названиями и любезно подписанными контактами:
Для удобства можно сразу припаять гребёнки:
Контакты для программирования микроконтроллера и памяти выведены на разъём, что очень удобно. По распиновке микросхем прослеживаем контакты:
Не лишним будет узнать, какие на плате присутствуют питающие напряжения. Плата питается от 5В, которые затем понижаются до 3.3В, 2.5В, 1.8В и 1.2В.
❯ Как выяснить разводку микросхемы в BGA корпусе?
С выводными корпусами нет проблем: все выводы торчат наружу. А вот под корпуса с матрицей шариков подлезть не получается. И платы обычно не двух-, а многослойные. В этом и заключается сложность.
Рассмотрим способы определения разводки на примере ПЛИС, но многие приёмы применимы и для других типов микросхем.
План действий такой:
- Находим, с чем соединены выводы из внешнего ряда и наиболее важные выводы из внутренних рядов.
- Стараемся найти JTAG, чтобы начать манипулировать микросхемой. Это первая группа наиболее важных выводов.
- Ищем выводы тактирования. Это вторая группа.
- Управляя чипом по своему усмотрению, находим остальные выводы.
Куда подсоединены выводы микросхемы, можно найти с помощью лазающего мышонка:
- Берём мышонка, надеваем поводок.
- Запускаем зверёныша в лабиринт под корпусом.
- Вторым щупом тыкаем по плате и ждём, пока запищит.
- Помечаем место, где запищало и координаты мышонка.
Всё, связь есть!
Мышонок?! Где мышонок?!
«Лазающий мышонок» – это растянутая пружинка или другой удобный жёсткий проводок,
зажатый в любой подходящий «поводок»:
Пружинка удобна из-за своей тонкости и жёсткости. Выводов не видно, но считать их удобно по количеству щелчков при аккуратном проведении по выводам жёсткой проволочкой.
Конечно, это не самый удобный способ, но помогает довольно быстро найти места подключения внешнего ряда выводов BGA корпуса. Можно найти и для второго ряда. Может и дальше (не пробовал). Но с каждым следующим рядом становится труднее.
Способ удобно использовать для выборочного поиска наиболее важных вещей. Например, по распиновке из Pin planner в Квартусе видно, что по центру корпуса есть выводы тактирования.
Дорожка от генератора (на фото выше) заходит под корпус ПЛИС как раз по центру. Логично, что она идёт к одному из этих четырёх выводов. Описанным выше способом удалось точно определить нужный вывод. Он оказался во втором ряду.
❯ JTAG, ты где?
Опытному глазу, вероятно, сразу видны эти выводы. Нет, это не те, которые подписаны JTAG ☺. Те относятся к STM32.
Ищем 5-6 выводов в линию или 10,12,14,20 выводов в 2 линии. В данном случае, видим 5 тестовых площадок около ПЛИС.
Лазающий мышонок помогает нам найти часть выводов JTAG, которые оказались ближе к краю – TMS, TCK:
Как понять, где остальные?
С вывода RST обычно есть подтягивающий вниз резистор (Pull Down). Это нужно, чтобы поддерживать управляющий конечный автомат JTAG в состоянии сброса и не дать устройству войти в режим тестирования (вместо штатной работы) из-за какой-то помехи.
С выводов TDI, TMS подтяжка вверх (Pull Up).
Вывод TDO должен быть высокоомным выводом, без логического уровня (плавающим).
Для TCK рекомендаций нет.
Прозвонкой и лазающим диверсантом мы уже нашли TMS, TCK. Так же можно найти землю.
Остаётся определить, где TDI и TDO (TRST не обязательный). Для этого измеряем сопротивления между выводом и землёй, плюсом питания. Далее включаем питание и измеряем напряжения. По описанным признакам и имеющимся данным делаем выводы.
Некоторые популярные распиновки JTAG можно посмотреть тут. Подробнее про определение выводов JTAG можно посмотреть в статье про извлечение прошивки гаджетов или здесь. Сперва думал, что срочно нужно обзавестись Jtagulator/Jtagenium, но получилось обойтись простым мультиметром. Хотя, устройства эти заслуживают внимания.
Для удобства выведем JTAG на гребёнку, приклеенную к плисине на соплеклей и подпишем:
Напряжение +3,3 В нужно программатору для установки логического уровня. Ближе всего оказалась ножка памяти, с неё и возьмём напряжение.
Почему именно 3,3 В? Выводы JTAG подключены к IOBank_1. К этому же банку подключается часть выводов памяти, которая питается от 3,3 В.
К тому же, при измерении напряжений между выводом JTAG и землёй, затем плюсом питания было именно 3,3 В.
❯ Как определить разводку остальных выводов микросхемы в BGA корпусе?
Снова рассмотрим на примере ПЛИС. Многие приёмы подойдут и для других типов микросхем.
Способы определения соединения остальных выводов:
- Генерация сигналов разной частоты.
- Даёшь сотни UARTов!
- Пограничное сканирование JTAG (сканирование межсоединений, JTAG Boundary Scan).
- Отпаять BGA корпус и прозвонить выводы, потом
не смочьприпаять обратно. - Разделить плату по слоям,
а затем склеить обратно. - Рентген.
- Генерация сигнала и поиск его антенкой или, пробниками E- и H- полей (near field probes).
- Общение с людьми.
- Ваши варианты…
Увидеть проводники на внутренних слоях можно с помощью рентгена. Но нужно специальное оборудование и меры предосторожности. Также можно осторожно разделить плату по слоям, или отпаять BGA корпус и прозвонить выводы, но нужно ещё суметь его припаять обратно. Иначе придётся пожертвовать платой.
Если пофантазировать, то можно придумать ещё вариантов. Например, подавать на вывод изменяющийся сигнал и искать его маленькой антенкой или, лучше, пробниками E- и H- полей (near field probes). Вроде таких:
Но такой способ кажется более долгим (ведь сигналы нужно подавать по одиночке в момент времени) и требует дополнительного оборудования. Хотя, хорошие пробники можно сделать недорого своими руками.
Самым простым видится способ с частотами. Идея такая: берём тактовый сигнал с генератора, делим частоту на 2, подаём на вывод, делим на 2, подаём на вывод… Потом пробегаем с щупом осциллографа по плате и находим, где выскочила частота.
Если бы на плате не оказалось источника тактового сигнала или не удалось бы найти вывод, к которому он подключен, то можно было бы попробовать подать свой тактовый сигнал на уже найденный вывод ПЛИС.
Интересный и забавный вариант – повесить UART передатчик на каждый вывод ПЛИС и передавать строку с именем вывода (например, А5, W22, P7, AA15…). Можно попробовать реализовать UART как кольцевой регистр сдвига, передающий нужную строку, например АА15, разделённую на байты с добавлением старт и стоп битов.
Или использовать JTAG сканирование межсоединений. Но вариант с частотами мне кажется удобнее и намного проще.
Здесь у меня были опасения, что можно сжечь вывод микросхемы или плиски, если на них будут разные логические уровни. Измеряя напряжения на некоторых выводах, неожиданно заметил, что напряжение вывода уплывает на сотни милливольт, если коснуться его пальцем (нечаянно коснулся щупа). Это напомнило про плавающие выводы в третьем состоянии. Позже внимательно изучил даташиты на микросхемы и в некоторых было написано, что при включении или после сброса выводы как раз в третьем состоянии.
Ещё один интересный и увлекательный способ – общение с людьми. Такую плату купил не я один. Нашёл эту информацию в отзывах о товаре на Авито и из общения с продавцом. Через отзывы попытался найти контакты покупателей, надеясь хотя бы на небольшое сообщество вокруг платы. Людей было не много и далеко не всем удалось написать, так как контакты указаны не были, а продавец помочь связаться не захотел.
Среди успешных попыток, было обращение к человеку, который, видимо, занимается каким-то ремонтом и купил плату в качестве донора. Ему понадобился HDMI приёмник, и он его отпаял. Чтобы посмотреть, есть ли какие-то дорожки под микросхемой (или какая-то полезная информация), я попросил фото.
Очевидно, плату ему не жалко. И я предложил ему отпаять ПЛИС в BGA корпусе и прозвонить контакты. Работы вроде не очень много, но он не захотел. Это к лучшему, иначе выяснение разводки было бы не таким интересным и этой статьи могло бы не быть.
А ведь мог и согласиться. Поэтому такой способ тоже имеет место.
Тогда же я написал ещё одному покупателю (передаю привет!), с которым завязалось интересное общение, не прекращающееся до сих пор. Вот такие бывают приятные сюрпризы!
❯ Пишем прошивку для ПЛИС
Конфигурацию для ПЛИС напишем в среде Quartus Prime v20.1 Standard Edition. Эта версия поддерживает семейство Cyclone IV. Использовать будем язык Verilog. Материалов для начала изучения языка много. Может пригодиться, например, этот или такой.
Как создать и настроить проект, назначить выводы, сделать компиляцию и другие важные настройки, можно найти в статье на замечательном сайте Марсоход. Выражаем его автору благодарность за труды!
Проверим, правильно ли мы нашли выводы JTAG и вход тактового сигнала:
module SX100_test
(
input in,
output out
);
assign out = in;
endmodule
Сигнал с тактового входа (25 МГц) просто передаётся на найденный мышонком выход, где его уже поджидает щуп осциллографа.
Важный момент – выбрать состояние неиспользуемых выводов ПЛИС.
Выбираем пункт меню Assignments/Device –> Device and Pin Options –> Unused Pins. Самый безопасный вариант – входы в третьем состоянии.
Выбираем нужный стандарт по умолчанию, чтобы потом не выставлять его для каждого вывода.
Прошивать будем дешёвой копией программатора USB Blaster.
Перед прошивкой ПЛИС по JTAG не забываем сбросить внука, чтобы не мешал негодник…
Знакомьтесь, это внук – микроконтроллер NUC123LD4AN0, который загружает прошивку для ПЛИС из памяти (W25Q128JV, serial flash).
Как сбросить внука? Первая мысль – прижать вывод сброса Reset к земле. На всякий случай проверяем в даташите. Да, есть такое, так и сделаем. Оказалось, что вывод reset выведен на гребёнку рядом с выводом земли, что очень удобно, так как можно просто надеть перемычку:
Обычно при подаче питания начинают мигать установленные на плате светодиоды.
Сброс помог, светодиодики больше не мигают. Спалили…
Если перемычку убрать, то огоньки снова мигают ☺.
Прошиваем. Есть сигнал! Ура!)
❯ Поиск выводов генерацией частот
Частоты получим из тактового сигнала 25 МГц с помощью счётчиков-делителей на 2.
module clk_div_2
(
input clk_in,
output clk_out
);
reg cnt=1'b0;
always @(posedge clk_in)
begin
cnt <= cnt+1'b1;
end
assign clk_out = cnt;
endmodule
Установим n счётчиков. Сделаем 22 шт, так как при малых частотах их не очень удобно наблюдать осциллографом и можно нечаянно пропустить вывод с частотой. Меньшая частота получилась 5,9 Гц. Можно было бы поделить тактовый сигнал и на другие числа (а не на 2), чтобы получить больше частот и охватить больше выводов. Но и так достаточно удобно.
module top_clk_div_2
(
input CLK_IN,
output [21:0]CLK_OUT//Шина 22-ух выходов поделенной частоты
);
clk_div_2 clk_div_2_0(//Первый счётчик-делитель на 2
.clk_in(CLK_IN),
.clk_out(CLK_OUT[0])
);
//Далее создаём ещё 21 экземпляр счётчиков
genvar y;//Счётчик для цикла
generate
for(y = 1; y < 22; y = y + 1 )
begin : clk_div_2_generation
//имя экземпляра не имеет значения в дальнейшем
clk_div_2 clk_div_2_insts
(
.clk_in(CLK_OUT[y-1]),//На вход подаём выход с прошлого делителя
.clk_out(CLK_OUT[y]) //
);
end
endgenerate
endmodule
При поиске, где вылезла частота, приходится много считать номер вывода. Простые наклейки с нумерацией значительно ускоряют это дело:
Ну что, поиграем в «Морской бой» (мимо, попал, ранил, убил)?
Постепенно топим все корабли заполняем карту выводов ПЛИС:
Ориентироваться удобно на распиновку из PinPlanner в Квартусе:
В итоге получается что-то такое:
Карта выводов сделана в Экселе. Там же удобно собирать и другую информацию. Например, вот распиновка разъёмов PBD2-80 по бокам платы:
Файл целиком можно посмотреть здесь.
Эй, ты куда?! А как же выводы?
Ну всё не получишь колбасы!… Пора заканчивать ☺. Продолжение следует…
Автор:
Kopcheniy