- PVSM.RU - https://www.pvsm.ru -

Приветствую вас, друзья! Не знаю как вам, а мне нравится разбирать всякие штучки, узнавать, как они работают, и применять их в своих проектах. По ходу дела начинается настоящее увлекательнейшее расследование, технический детектив.
На этот раз меня заинтересовала плата с разными микросхемами, которые могут пригодиться во многих затеях. А может из неё вообще получится удобная отладка? В любом случае, это очень интересно. Это тот самый творческий процесс, приносящий радость и заметно повышающий наши навыки и умения. А ведь они часто самое ценное, что дал проект и работа над ним.
Проведём расследование, поищем JTAG, узнаем способы и отследим разводку BGA, поработаем с ПЛИС, … и много других действительно интересных вещей. Кряк уже заинтересовался!
Как там у нас обычно? «Сломать, а потом читать инструкцию». Инструкций и документации нет, поэтому будем экспериментировать ломать! ☺
Такая плата – действительно целый испытательный полигон. Здесь можно попробовать свои силы в обратной разработке, считывании и копании прошивок, в работе с ПЛИС, микроконтроллерами, памятью и видеосигналом, и многое другое.
Это ещё и замечательный тренажёр. Ведь что не умеется, станет нашим навыком. Дорогу осилит идущий. Бонусом будет сама плата (n штук), заметно подросшее в процессе её исследования мастерство и отличное настроение! А ещё всем этим можно поделиться с сообществом.

Честно говоря, мне не удалось найти много полезной информации по плате SX100 у Novastar, что несколько странно. Гугление надписей на плате не дало каких-то результатов. Я писал в интернет-магазины, продающие подобное оборудование; людям, занимающимся ремонтом или какой-то ещё деятельностью, связанной с подобными платами; куда-то ещё. Но никто мне не дал или не захотел дать ответа. Плату я нашёл на барахолке. Продавец так же не признался, откуда плата.

Поэтому, наша плата могла использоваться внутри помещений. Или как сменный модуль видеопроцессоров [1], вроде таких:


Конкретно этот видеопроцессор несколько отличается, но есть масса других моделей. Расположение разъёмов бывает очень похожим на то, что есть на нашей плате.
А есть и платы [2] интерфейсов для видеопроцессоров.
Надпись на штрих-коде снизу платы MFAB08215X0450000437. По надписям ничего внятного не нашлось. Рядом, видимо, дата производства.

Если подключить USB, то плата определяется так:

USBVID_0483&PID_57200000000001B
USBVID_0483&PID_5720&REV_0200
USBVID_0483&PID_5720
Nova 3D HD
Посмотрим, как выглядит NovaStar nova3D HD [3]:

Похоже, но не совсем то.
На сайте fccid.io [4] можно найти фотографии устройств снаружи и внутри, что может дать хорошие подсказки в разных ситуациях.
Для Nova3D HD [5] тоже есть страничка, и можно посмотреть фото плат [6].
В общем, опознать плату пока не удаётся. Но она всё равно кажется интересной, поэтому покупаем несколько штук для экспериментов.
Одна из первых ступенек обратной разработки – осмотр «пациента» и поиск документации и разных полезностей для микросхем.
На плате выделяются большие микросхемы:
Также есть 16 микросхем 74hc245, пара генераторов, cdcs503 Clock Buffer/Clock Multiplier, dc-dc преобразователи и разная мелочь.
Документация на детальки сложена в папочке [7] на Гитхабе.
Ещё у нас есть 2 разъёма HDMI, 1 Ethernet и USB мини.
На плате много посадочных мест под штыревые разъёмы с приятными названиями и любезно подписанными контактами:

Для удобства можно сразу припаять гребёнки:

Контакты для программирования микроконтроллера и памяти выведены на разъём, что очень удобно. По распиновке микросхем прослеживаем контакты:

Не лишним будет узнать, какие на плате присутствуют питающие напряжения. Плата питается от 5В, которые затем понижаются до 3.3В, 2.5В, 1.8В и 1.2В.



С выводными корпусами нет проблем: все выводы торчат наружу. А вот под корпуса с матрицей шариков подлезть не получается. И платы обычно не двух-, а многослойные. В этом и заключается сложность.
Рассмотрим способы определения разводки на примере ПЛИС, но многие приёмы применимы и для других типов микросхем.
План действий такой:
Куда подсоединены выводы микросхемы, можно найти с помощью лазающего мышонка:
Всё, связь есть!

Мышонок?! Где мышонок?!

«Лазающий мышонок» – это растянутая пружинка или другой удобный жёсткий проводок,

зажатый в любой подходящий «поводок»:

Пружинка удобна из-за своей тонкости и жёсткости. Выводов не видно, но считать их удобно по количеству щелчков при аккуратном проведении по выводам жёсткой проволочкой.
Конечно, это не самый удобный способ, но помогает довольно быстро найти места подключения внешнего ряда выводов BGA корпуса. Можно найти и для второго ряда. Может и дальше (не пробовал). Но с каждым следующим рядом становится труднее.
Способ удобно использовать для выборочного поиска наиболее важных вещей. Например, по распиновке из Pin planner в Квартусе видно, что по центру корпуса есть выводы тактирования.

Дорожка от генератора (на фото выше) заходит под корпус ПЛИС как раз по центру. Логично, что она идёт к одному из этих четырёх выводов. Описанным выше способом удалось точно определить нужный вывод. Он оказался во втором ряду.

Опытному глазу, вероятно, сразу видны эти выводы. Нет, это не те, которые подписаны 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 можно посмотреть тут [8]. Подробнее про определение выводов JTAG можно посмотреть в статье [9] про извлечение прошивки гаджетов или здесь [10]. Сперва думал, что срочно нужно обзавестись Jtagulator/Jtagenium, но получилось обойтись простым мультиметром. Хотя, устройства эти заслуживают внимания.
Для удобства выведем JTAG на гребёнку, приклеенную к плисине на соплеклей и подпишем:


Напряжение +3,3 В нужно программатору для установки логического уровня. Ближе всего оказалась ножка памяти, с неё и возьмём напряжение.
Почему именно 3,3 В? Выводы JTAG подключены к IOBank_1. К этому же банку подключается часть выводов памяти, которая питается от 3,3 В.

К тому же, при измерении напряжений между выводом JTAG и землёй, затем плюсом питания было именно 3,3 В.
Снова рассмотрим на примере ПЛИС. Многие приёмы подойдут и для других типов микросхем.
Способы определения соединения остальных выводов:
Увидеть проводники на внутренних слоях можно с помощью рентгена [11]. Но нужно специальное оборудование и меры предосторожности. Также можно осторожно разделить плату по слоям, или отпаять BGA корпус и прозвонить выводы, но нужно ещё суметь его припаять обратно. Иначе придётся пожертвовать платой.
Если пофантазировать, то можно придумать ещё вариантов. Например, подавать на вывод изменяющийся сигнал и искать его маленькой антенкой или, лучше, пробниками E- и H- полей (near field probes). Вроде таких:

Но такой способ кажется более долгим (ведь сигналы нужно подавать по одиночке в момент времени) и требует дополнительного оборудования. Хотя, хорошие пробники можно сделать недорого своими руками [12].
Самым простым видится способ с частотами. Идея такая: берём тактовый сигнал с генератора, делим частоту на 2, подаём на вывод, делим на 2, подаём на вывод… Потом пробегаем с щупом осциллографа по плате и находим, где выскочила частота.
Если бы на плате не оказалось источника тактового сигнала или не удалось бы найти вывод, к которому он подключен, то можно было бы попробовать подать свой тактовый сигнал на уже найденный вывод ПЛИС.
Интересный и забавный вариант – повесить UART передатчик на каждый вывод ПЛИС и передавать строку с именем вывода (например, А5, W22, P7, AA15…). Можно попробовать реализовать UART как кольцевой регистр сдвига, передающий нужную строку, например АА15, разделённую на байты с добавлением старт и стоп битов.
Или использовать JTAG сканирование межсоединений. Но вариант с частотами мне кажется удобнее и намного проще.
Здесь у меня были опасения, что можно сжечь вывод микросхемы или плиски, если на них будут разные логические уровни. Измеряя напряжения на некоторых выводах, неожиданно заметил, что напряжение вывода уплывает на сотни милливольт, если коснуться его пальцем (нечаянно коснулся щупа). Это напомнило про плавающие выводы в третьем состоянии. Позже внимательно изучил даташиты на микросхемы и в некоторых было написано, что при включении или после сброса выводы как раз в третьем состоянии.
Ещё один интересный и увлекательный способ – общение с людьми. Такую плату купил не я один. Нашёл эту информацию в отзывах о товаре на Авито и из общения с продавцом. Через отзывы попытался найти контакты покупателей, надеясь хотя бы на небольшое сообщество вокруг платы. Людей было не много и далеко не всем удалось написать, так как контакты указаны не были, а продавец помочь связаться не захотел.
Среди успешных попыток, было обращение к человеку, который, видимо, занимается каким-то ремонтом и купил плату в качестве донора. Ему понадобился HDMI приёмник, и он его отпаял. Чтобы посмотреть, есть ли какие-то дорожки под микросхемой (или какая-то полезная информация), я попросил фото.

Очевидно, плату ему не жалко. И я предложил ему отпаять ПЛИС в BGA корпусе и прозвонить контакты. Работы вроде не очень много, но он не захотел. Это к лучшему, иначе выяснение разводки было бы не таким интересным и этой статьи могло бы не быть.
А ведь мог и согласиться. Поэтому такой способ тоже имеет место.
Тогда же я написал ещё одному покупателю (передаю привет!), с которым завязалось интересное общение, не прекращающееся до сих пор. Вот такие бывают приятные сюрпризы!
Конфигурацию для ПЛИС напишем в среде Quartus Prime v20.1 Standard Edition. Эта версия поддерживает семейство Cyclone IV. Использовать будем язык Verilog. Материалов для начала изучения языка много. Может пригодиться, например, этот [13] или такой [14].
Как создать и настроить проект, назначить выводы, сделать компиляцию и другие важные настройки, можно найти в статье [15] на замечательном сайте Марсоход. Выражаем его автору благодарность за труды!
Проверим, правильно ли мы нашли выводы 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 [16], который загружает прошивку для ПЛИС из памяти (W25Q128JV, serial flash).

Как сбросить внука? Первая мысль – прижать вывод сброса Reset к земле. На всякий случай проверяем в даташите. Да, есть такое, так и сделаем. Оказалось, что вывод reset выведен на гребёнку рядом с выводом земли, что очень удобно, так как можно просто надеть перемычку:

Обычно при подаче питания начинают мигать установленные на плате светодиоды.
Сброс помог, светодиодики больше не мигают. Спалили…

Если перемычку убрать, то огоньки снова мигают ☺.
Прошиваем. Есть сигнал! Ура!)
Частоты получим из тактового сигнала 25 МГц с помощью счётчиков-делителей на 2 [17].
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 счётчиков [18]. Сделаем 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 по бокам платы:

Файл целиком можно посмотреть здесь [19].
Эй, ты куда?! А как же выводы?

Ну всё не получишь колбасы!… Пора заканчивать ☺. Продолжение следует…

Автор:
Kopcheniy
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/390514
Ссылки в тексте:
[1] видеопроцессоров: https://p10.ru/category/kontrollery-i-haby-videoprocessor-dlja-svetodiodnogo-jekrana/
[2] платы: https://p10.ru/catalogsearch/result/?q=NOVASTAR+%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D1%8B
[3] NovaStar nova3D HD: https://guidessimo.com/document/814032/novastar-nova3d-hd-operation-user-s-manual-24.html
[4] fccid.io: https://fccid.io/
[5] Nova3D HD: https://fccid.io/2AG8JNOVA3DHD
[6] фото плат: https://fccid.io/2AG8JNOVA3DHD/Internal-Photos/Int-Photos-2916836
[7] в папочке: https://github.com/johngoodboy/SX100-board/tree/main/%D0%94%D0%B0%D1%82%D0%B0%D1%88%D0%B8%D1%82%D1%8B
[8] тут: http://www.jtagtest.com/pinouts/
[9] статье: https://tech-geek.ru/dump-firmware-access-control-console/
[10] здесь: https://www.youtube.com/watch?v=_FSM_10JXsM&list=PLoFdAHrZtKkhcd9k8ZcR4th8Q8PNOx7iU&index=3
[11] с помощью рентгена: https://russianelectronics.ru/reengineering/
[12] своими руками: https://eax.me/diy-near-field-probes/
[13] этот: http://www.neurofox.ru/files/veriloglessons.pdf
[14] такой: https://www.ece.ucdavis.edu/~bbaas/281/notes/Handout12.verilog2.pdf
[15] в статье: https://marsohod.org/11-blog/78-newproject
[16] NUC123LD4AN0: https://www.nuvoton.com/products/microcontrollers/arm-cortex-m0-mcus/nuc120-122-123-220-usb-series/nuc123ld4an0/
[17] счётчиков-делителей на 2: https://github.com/johngoodboy/SX100-board/blob/main/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D1%87%D0%B0%D1%81%D1%82%D0%BE%D1%82/clk_div_2.v
[18] Установим n счётчиков: https://github.com/johngoodboy/SX100-board/blob/main/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D1%87%D0%B0%D1%81%D1%82%D0%BE%D1%82/top_clk_div_2.v
[19] здесь: https://github.com/johngoodboy/SX100-board/blob/main/SX100%20%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.xlsx
[20] Источник: https://habr.com/ru/companies/timeweb/articles/797065/?utm_source=habrahabr&utm_medium=rss&utm_campaign=797065
Нажмите здесь для печати.