Jump to content
    

Lattice Crosslink + mipi

Добрый день уважаемые форумчане!

Есть желание реализовать mipi-мультиплексор для подключения нескольких цифровых камер к какому-нибудь SoC.

В качестве пробного SoC взял плату Luckfox Pico Max на Rockchip RV1106 с родным для нее сенсором SC3336. Звезд с неба эта парочка не хватает, но вроде покрывает нужды. Приятность заключается в том, что проц в корпусе QFN и поэтому можно сделать свою плату без лишних усложнений, а так же RAM уже на борту в составе самого SoC. Buildroot для платы есть в доступе и, что интересно, даже собирается и работает. Выглядит все так, что вполне реально допилить под свои нужды. Сенсор передает данные в формате RAW10 по 3 линиям (1 клок и 2 данных) со скоростью где-то от 500 до 600МБ/с. Штатно это все работает более или менее терпимо (по временному лагу), картинку по rtsp выводит.

В качестве же мультиплексора присмотрел Crosslink от Lattice. Есть плата Crosslink LIF-MD600 Master Link Board с переходниками под камеры Raspberry. Конечно же шлейф SC3336 не подходит от слова совсем, поэтому был изготовлен соответствующий переходник. Переходник рабочий, проверено на SoC. И... И на этом мои успехи заканчиваются - софтовое ядро мне запустить так и не удалось. 

Предыстория есть, теперь технические подробности:

- система: Ubuntu 24.04 LTS

- IDE: Lattice Diamond 3.14

- FPGA: LIF-MD6000-CSFBGA81

- Плата: Crosslink LIF-MD6000 Master Link Board rev.B

 

Теперь о том, что не получилось. Если в вкратце, то получилось только поморгать светодиодом, затактированным через PLL😅

При этом я пытался завести штатный пример 1 to N MIPI CSI-2/DSI Duplicator. Не получилось. Впечатления такие, будто ядро молчит - сигналы вроде приходят на линии, выглядят нормально, но байтового клока и сигнала готовности данных из ядра нет. То же самое при попытке сделать дизайн с нуля - пробовал и mipi rx, который уже с парсером, и mipi dphy, который просто десериализует данные - результат такой же, будто сигнал и вовсе никуда не приходит и никуда не попадает.

Так же мне не удалось запустить симуляцию ядра. После настройки ядра создается пачка файлов, в т.ч. обертки и тестбенчи. Так вот, родная Questa отказывается их запускать. Ошибка при валидации теста тривиальная - сигналы в тесте используются раньше, чем они объявлены в файле. Ну хорошо, это странно, но легко исправляется (но, как можно догадаться, после каждой перегенерации сбрасывается). Но и это еще не все. После этого Questa не находит другие компоненты, например PUR, MIPI и т.д., хотя они вроде присутствуют в библиотеке (во всяком случае строки с их названиями точно есть) и все равно отказывается запускать тест.

С Reveal Inserter меня так же ожидал отлуп. Оказалось, что crosslink не имеет встроенного jtag и все, что можно, это синтезировать его из ресурсов самой ПЛИС. Ну хорошо, пускай так. После синтеза отладочного ядра в пространство пользователя выбрасываются 4 сигнала - JTAG_TMS, TCK, TDO, TDI. И... И я не могу назначить по крайней мере 2 из 4 сигналов ни на какие свободные ножки - IDE отказывается их роутить. А почему? А потому. Не могу, говорит, и все. Ни в банк 1, хотя он пустой и никакие другие ножки из него я не использую, ни в банк 0 на свободные выводы.

 

Ну а теперь, собственно, вопрос.

Кто-то имел дело с этим замечательным семейством и сталкивался ли с подобными проблемами? Был ли опыт использования именно софтовой реализации ip-ядер для получения сигнала MIPI?

Share this post


Link to post
Share on other sites

Могу сказать лишь одно: я разрабатывал плату, которая один CSI раздваивала в два на этом LIF-MD, и это работало. Софтово, насколько я знаю, никто там MIPI не реализовывал, т.к. в этом не было нужды - MIPI там IP-блоками, из него, вроде как, тупо параллельная шина внутри, дальше обрабатывай как хочешь.

Share this post


Link to post
Share on other sites

1 час назад, Arlleex сказал:

Могу сказать лишь одно: я разрабатывал плату, которая один CSI раздваивала в два на этом LIF-MD, и это работало. Софтово, насколько я знаю, никто там MIPI не реализовывал, т.к. в этом не было нужды - MIPI там IP-блоками, из него, вроде как, тупо параллельная шина внутри, дальше обрабатывай как хочешь.

Да, я и имею ввиду реализацию MIPI через родные IP-блоки. Под софтовой реализацией я имею ввиду вариант использования родного IP-блока в варианте Soft DPHY, когда большая часть ядра реализуется через обычную логику. В любом случае, если Вы раздваивали один вход на 2 выхода, то как минимум одно из 3х ядер должно было быть реализовано в варианте Soft DPHY, т.к. аппаратных блоков у схемы всего 2. И у Вас все работало без проблем.

Сейчас интереса ради попробовал загнать поток в ядро с опцией Hard DPHY. Правильность поток проверить нечем, т.к. jtag так и не победил, а второй платы-переходника RPi AP Link Biard под рукой нет, чтобы вывести сигнал на приемный SoC, но во всяком случае есть rx_clk и rx_capture_en, сигнализирующий о готовности десериализованных данных, чего я не смог добиться в софтовом варианте. При этом проект тот же самый, сигналы все те же, за исключением сигнала сброса, который есть только в реализации Hard, различие только в галочке Soft/Hard в настройках ядра. Ну и распиновка, понятно. В случае с Hard задана производителем, в случае Soft я сам указываю пары.  

Share this post


Link to post
Share on other sites

Так.

После успешного запуска hard-версии решил еще раз зайти на soft-версию. И получилось. А дело было в том, что, по каким-то неведомым мне причинам, тактовый генератор на плате запитан от напряжения VCCIO2 (оно же идет на BANK2). Сам же генератор питает вход в BANK0, который намертво прибит к 3.3, ибо там флеш и SPI-программатор. Я как раз использовал коннектор RX1, который подключен к банку 2. На плате имеются перемычки для установки уровней питания для банков 1 и 2. И варианта, когда ты удовлетворяешь и уровням MIPI, и используешь бортовой генератор нет. В общем я перекинул вход камеры на коннектор RX2, который подключен к банку 1, банку 1 дал 1.2В, банку 2 3.3В и все заработало.

Хотел уже поругаться на инженеров Lattice, но заглянул на всякий случай в документы на плату последней ревизии. Там один из бортовых генераторов отвязали от VCCIO2 и перевели напрямую на 3.3В. Исправили. И на том спасибо.

Share this post


Link to post
Share on other sites

JTAG у меня работал в Bank 1, питание банка было 2.5в. ПЛИС - LIF-MD6000-6JMG80I. Делал мост subLVDS -> MIPI CSI-2. 

 BLOCK JTAGPATHS ;
 LOCATE COMP "JTAG_TCK" SITE "E1" ;
 LOCATE COMP "JTAG_TDO" SITE "F1" ;
 LOCATE COMP "JTAG_TDI" SITE "F2" ;
 LOCATE COMP "JTAG_TMS" SITE "E2" ;

Так было в .LPF   

Share this post


Link to post
Share on other sites

В 02.12.2025 в 16:02, alxkon сказал:

JTAG у меня работал в Bank 1, питание банка было 2.5в. ПЛИС - LIF-MD6000-6JMG80I. Делал мост subLVDS -> MIPI CSI-2. 

 BLOCK JTAGPATHS ;
 LOCATE COMP "JTAG_TCK" SITE "E1" ;
 LOCATE COMP "JTAG_TDO" SITE "F1" ;
 LOCATE COMP "JTAG_TDI" SITE "F2" ;
 LOCATE COMP "JTAG_TMS" SITE "E2" ;

Так было в .LPF   

А вот мне не дает размещать JTAG, если в проекте где-то есть Soft-MIPI. JTAG требует 2.5В-3.3В, а MIPI 1.2, причем на оба банка даже если используется под MIPI только один. Получается, что отлаживать MIPI можно только если используются Hard-блоки. Моргание светодиодиками и дрыганье ножками это, конечно, хорошо, но хотелось бы видеть весь протокол, вместе с данными.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...