Полигон для творчества за 1500 р. Ч1: Позовите Кряка

qhmo4abocqzrmnojkwokv6vfkfi.png


Приветствую вас, друзья! Не знаю как вам, а мне нравится разбирать всякие штучки, узнавать, как они работают, и применять их в своих проектах. По ходу дела начинается настоящее увлекательнейшее расследование, технический детектив.

На этот раз меня заинтересовала плата с разными микросхемами, которые могут пригодиться во многих затеях. А может из неё вообще получится удобная отладка? В любом случае, это очень интересно. Это тот самый творческий процесс, приносящий радость и заметно повышающий наши навыки и умения. А ведь они часто самое ценное, что дал проект и работа над ним.

Проведём расследование, поищем JTAG, узнаем способы и отследим разводку BGA, поработаем с ПЛИС, … и много других действительно интересных вещей. Кряк уже заинтересовался!

Как там у нас обычно? «Сломать, а потом читать инструкцию». Инструкций и документации нет, поэтому будем экспериментировать ломать! ☺

Такая плата — действительно целый испытательный полигон. Здесь можно попробовать свои силы в обратной разработке, считывании и копании прошивок, в работе с ПЛИС, микроконтроллерами, памятью и видеосигналом, и многое другое.

Это ещё и замечательный тренажёр. Ведь что не умеется, станет нашим навыком. Дорогу осилит идущий. Бонусом будет сама плата (n штук), заметно подросшее в процессе её исследования мастерство и отличное настроение! А ещё всем этим можно поделиться с сообществом.

Что ты такое?


xonsaezju8d8tgtcesqpg_pjvdk.jpeg


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

Скорее всего, такие платы тоже используются для светодиодных видеоэкранов. Подобно платам, описанным в этой статье. Только для уличных экранов, как мне кажется, больше используют платы с Ethernet, а не с HDMI.

2sowd3u8tpjbopx2itgdweqxmzi.png


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

tzcnntrbgorirtugcf6xqnhsxse.png


f1vo6knwlnpf3nxp5aeshu9dpjg.png


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

mxa-i4m91g8iwc7mxdffkqgwymq.jpeg


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

clze2y6wsjlnfts_psqra4vza_o.png


USB\VID_0483&PID_5720\00000000001B
USB\VID_0483&PID_5720&REV_0200
USB\VID_0483&PID_5720
Nova 3D HD

Посмотрим, как выглядит NovaStar nova3D HD:

31urpf0y98rt5imu4mbo6zrairy.png


Похоже, но не совсем то.

На сайте fccid.io можно найти фотографии устройств снаружи и внутри, что может дать хорошие подсказки в разных ситуациях.

Для Nova3D HD тоже есть страничка, и можно посмотреть фото плат. 

В общем, опознать плату пока не удаётся. Но она всё равно кажется интересной, поэтому покупаем несколько штук для экспериментов.

Что интересного есть на плате?


Одна из первых ступенек обратной разработки — осмотр «пациента» и поиск документации и разных полезностей для микросхем.

На плате выделяются большие микросхемы:  

  1. FPGA ALTERA Cyclone IV EP4CE15F23C8N.
  2. SDRAM: одна W9812G2IH (1M×4 BANKS×32BIT), две M12L64322A (512K x 32 Bit x 4 Banks).
  3. Микроконтроллеры NUC123LD4AN0 (ARM Cortex-M0 32-bit) и STM32F207VET6.
  4.  ADV7612 (Dual Port 225 MHz HDMI Receiver) и ADV7511 (225 MHz HDMI Transmitter).
  5. LAN8720A (i) — Small Footprint RMII 10_100 Ethernet Transceiver.
  6. Две памяти W25Q128JVSQ — Serial Flash Memory. Одна для хранения конфигурации ПЛИС, вторая рядом с STM32 для чего-то ещё.


Также есть 16 микросхем 74hc245, пара генераторов, cdcs503 Clock Buffer/Clock Multiplier, dc-dc преобразователи и разная мелочь.

Документация на детальки сложена в папочке на Гитхабе.

Ещё у нас есть 2 разъёма HDMI, 1 Ethernet и USB мини.

На плате много посадочных мест под штыревые разъёмы с приятными названиями и любезно подписанными контактами:

ry7-aew5cpdj1epewyos6dhevxq.png


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

hr8vzg5dwcxiaegcpela1rtebtk.png


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

p154gcsr9bwgg2z_-xzvaedyavk.jpeg


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

bddtumt8vw4ssvltappnkka2dqg.jpeg


ir7dal_0thxy18bgukquqngbtp8.jpeg


1hpaoab9qjgtkv3hgqp0gbggume.jpeg


Как выяснить разводку микросхемы в BGA корпусе?


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

Рассмотрим способы определения разводки на примере ПЛИС, но многие приёмы применимы и для других типов микросхем.

План действий такой:

  1. Находим, с чем соединены выводы из внешнего ряда и наиболее важные выводы из внутренних рядов.
  2. Стараемся найти JTAG, чтобы начать манипулировать микросхемой. Это первая группа наиболее важных выводов.
  3. Ищем выводы тактирования. Это вторая группа.
  4. Управляя чипом по своему усмотрению, находим остальные выводы.


Куда подсоединены выводы микросхемы, можно найти с помощью лазающего мышонка:

  1. Берём мышонка, одеваем поводок.
  2. Запускаем зверёныша в лабиринт под корпусом.
  3. Вторым щупом тыкаем по плате и ждём, пока запищит.
  4. Помечаем место, где запищало и координаты мышонка.


Всё, связь есть!

my2z5drqnsmxt1lvoddu3qzvnzq.png


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

k0a4k425njt52s_atudeeyzonjm.jpeg


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

pdolvhk3sjtjdadopakiizn8hz0.jpeg


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

uxpzxit5emxxjixqerh499iipjc.jpeg


Пружинка удобна из-за своей тонкости и жёсткости. Выводов не видно, но считать их удобно по количеству щелчков при аккуратном проведении по выводам жёсткой проволочкой.

Конечно, это не самый удобный способ, но помогает довольно быстро найти места подключения внешнего ряда выводов BGA корпуса. Можно найти и для второго ряда. Может и дальше (не пробовал). Но с каждым следующим рядом становится труднее.

Способ удобно использовать для выборочного поиска наиболее важных вещей. Например, по распиновке из Pin planner в Квартусе видно, что по центру корпуса есть выводы тактирования.

nw--rewtlmrmu6b2mdgnjjm3fd4.png


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

JTAG, ты где?


pef6frofbumiykv39oit3fq9f6w.jpeg


Опытному глазу, вероятно, сразу видны эти выводы. Нет, это не те, которые подписаны JTAG ☺. Те относятся к STM32.

Ищем 5–6 выводов в линию или 10,12,14,20 выводов в 2 линии. В данном случае, видим 5 тестовых площадок около ПЛИС. 

cjv14ho8jce-yqxdp2fidkpwmlm.png


Лазающий мышонок помогает нам найти часть выводов JTAG, которые оказались ближе к краю — TMS, TCK:

sk3kbkrktwtsmh8g7si8cpr2ley.png


Как понять, где остальные?

С вывода RST обычно есть подтягивающий вниз резистор (Pull Down). Это нужно, чтобы поддерживать управляющий конечный автомат JTAG в состоянии сброса и не дать устройству войти в режим тестирования (вместо штатной работы) из-за какой-то помехи.

С выводов TDI, TMS подтяжка вверх (Pull Up).

Вывод TDO должен быть высокоомным выводом, без логического уровня (плавающим).
Для TCK рекомендаций нет.

Прозвонкой и лазающим диверсантом мы уже нашли TMS, TCK. Так же можно найти землю.

Остаётся определить, где TDI и TDO (TRST не обязательный). Для этого измеряем сопротивления между выводом и землёй, плюсом питания. Далее включаем питание и измеряем напряжения. По описанным признакам и имеющимся данным делаем выводы.

jse_bz8dyv_4urvchh3ojs4agio.png


Некоторые популярные распиновки JTAG можно посмотреть тут. Подробнее про определение выводов JTAG можно посмотреть в статье про извлечение прошивки гаджетов или здесь. Сперва думал, что срочно нужно обзавестись Jtagulator/Jtagenium, но получилось обойтись простым мультиметром. Хотя, устройства эти заслуживают внимания.

Для удобства выведем JTAG на гребёнку, приклеенную к плисине на соплеклей и подпишем:

jaaq6g7aetivix3gro8bx32v1l0.jpeg


uaxgwbs-msykz_fjh9kz76hij8s.jpeg


Напряжение +3,3 В нужно программатору для установки логического уровня. Ближе всего оказалась ножка памяти, с неё и возьмём напряжение.

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

zirfvmdqqvdsowkqhg6rmwyftne.png


К тому же, при измерении напряжений между выводом JTAG и землёй, затем плюсом питания было именно 3,3 В.

Как определить разводку остальных выводов микросхемы в BGA корпусе?


Снова рассмотрим на примере ПЛИС. Многие приёмы подойдут и для других типов микросхем.
Способы определения соединения остальных выводов:

  1. Генерация сигналов разной частоты.
  2. Даёшь сотни UARTов!
  3. Пограничное сканирование JTAG (сканирование межсоединений, JTAG Boundary Scan).
  4. Отпаять BGA корпус и прозвонить выводы, потом не смочь припаять обратно.
  5. Разделить плату по слоям, а затем склеить обратно.
  6. Рентген.
  7. Генерация сигнала и поиск его антенкой или, пробниками E- и H- полей (near field probes).
  8. Общение с людьми.
  9. Ваши варианты…


Увидеть проводники на внутренних слоях можно с помощью рентгена. Но нужно специальное оборудование и меры предосторожности. Также можно осторожно разделить плату по слоям, или отпаять BGA корпус и прозвонить выводы, но нужно ещё суметь его припаять обратно. Иначе придётся пожертвовать платой.

Если пофантазировать, то можно придумать ещё вариантов. Например, подавать на вывод изменяющийся сигнал и искать его маленькой антенкой или, лучше, пробниками E- и H- полей (near field probes). Вроде таких:

svxssdgfqtcfgd-f9bi2jwxhlgy.jpeg


Но такой способ кажется более долгим (ведь сигналы нужно подавать по одиночке в момент времени) и требует дополнительного оборудования. Хотя, хорошие пробники можно сделать недорого своими руками.

Самым простым видится способ с частотами. Идея такая: берём тактовый сигнал с генератора, делим частоту на 2, подаём на вывод, делим на 2, подаём на вывод… Потом пробегаем с щупом осциллографа по плате и находим, где выскочила частота.

Если бы на плате не оказалось источника тактового сигнала или не удалось бы найти вывод, к которому он подключен, то можно было бы попробовать подать свой тактовый сигнал на уже найденный вывод ПЛИС.

Интересный и забавный вариант — повесить UART передатчик на каждый вывод ПЛИС и передавать строку с именем вывода (например, А5, W22, P7, AA15…). Можно попробовать реализовать UART как кольцевой регистр сдвига, передающий нужную строку, например АА15, разделённую на байты с добавлением старт и стоп битов.

Или использовать JTAG сканирование межсоединений. Но вариант с частотами мне кажется удобнее и намного проще.

Здесь у меня были опасения, что можно сжечь вывод микросхемы или плиски, если на них будут разные логические уровни. Измеряя напряжения на некоторых выводах, неожиданно заметил, что напряжение вывода уплывает на сотни милливольт, если коснуться его пальцем (нечаянно коснулся щупа). Это напомнило про плавающие выводы в третьем состоянии. Позже внимательно изучил даташиты на микросхемы и в некоторых было написано, что при включении или после сброса выводы как раз в третьем состоянии.

Ещё один интересный и увлекательный способ — общение с людьми. Такую плату купил не я один. Нашёл эту информацию в отзывах о товаре на Авито и из общения с продавцом. Через отзывы попытался найти контакты покупателей, надеясь хотя бы на небольшое сообщество вокруг платы. Людей было не много и далеко не всем удалось написать, так как контакты указаны не были, а продавец помочь связаться не захотел.

Среди успешных попыток, было обращение к человеку, который, видимо, занимается каким-то ремонтом и купил плату в качестве донора. Ему понадобился HDMI приёмник, и он его отпаял. Чтобы посмотреть, есть ли какие-то дорожки под микросхемой (или какая-то полезная информация), я попросил фото.

vndeqknbbd1zholp5y7dbyeb_7w.png


Очевидно, плату ему не жалко. И я предложил ему отпаять ПЛИС в 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. Самый безопасный вариант — входы в третьем состоянии.

zcq7_aocadkwur6nw5yaspmioig.png


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

6ilqfkveezmsk0wathrdzwu8abq.png


Прошивать будем дешёвой копией программатора USB Blaster.

l1p4nhynkov7srsdybyniibaum8.jpeg


Перед прошивкой ПЛИС по JTAG не забываем сбросить внука, чтобы не мешал негодник…

vxmcreqgba1awsybtoqfrmnp0tw.jpeg


Знакомьтесь, это внук — микроконтроллер NUC123LD4AN0, который загружает прошивку для ПЛИС из памяти (W25Q128JV, serial flash).

z0ftwiwbdyuqsbn7p0nekjnquuq.jpeg


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

uik0lwjhbi3s3xzjwvjrsihg2wy.jpeg


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

szrjyivmeufi5cgngw3wgxrkrh0.jpeg


Если перемычку убрать, то огоньки снова мигают ☺.
Прошиваем. Есть сигнал! Ура!)

Поиск выводов генерацией частот


Частоты получим из тактового сигнала 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), чтобы получить больше частот и охватить больше выводов. Но и так достаточно удобно.

Код установки 22-ух счётчиков.
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


При поиске, где вылезла частота, приходится много считать номер вывода. Простые наклейки с нумерацией значительно ускоряют это дело:

x7gn_dbcjdheq-zet9kti3vugjs.jpeg


owojakoaoflf0k4ehhcbje2yqnc.jpeg


Ну что, поиграем в «Морской бой» (мимо, попал, ранил, убил)?

b9bh-udrbb7544koixn3qxycjbc.png


Постепенно топим все корабли заполняем карту выводов ПЛИС:

add7xs0zjyk4qwlyikm0icmow38.png


Ориентироваться удобно на распиновку из PinPlanner в Квартусе:

omepgpvqw6x57eszc4e01_lqxyq.png


В итоге получается что-то такое:

uvt-sbdgzt_6hiz0qk_r4a1awt0.png


Карта выводов сделана в Экселе. Там же удобно собирать и другую информацию. Например, вот распиновка разъёмов PBD2–80 по бокам платы:

78esvwtlng7huci0zkvjp-wfhhi.png


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

t5q-cebfqea0yldmt2dzdffvlba.jpeg


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

gqvftolr_ynaucctsiq6omj6zpo.jpeg



Возможно, захочется почитать и это:

Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале


b5pjofdoxth14ro-rjsrn7sbmiy.png

© Habrahabr.ru