Решил получить звук для дополнительного усилителя в китайском кроссовере.
В моём случае это Evolute i-Space (Dongfeng Landian E5), но подобный алгоритм применим, в принципе, для большинства автомобилей с шиной A2B.
Вся проблема оказалась в звуковом транспорте между головным устройством и штатным усилителем. Транспорт идёт в цифре, и взять чистый аудио звук негде для обычных усилителей. А для использования усилителей с цифровым входом — надо сначала понять, что за цифровая шина используется. Другие владельцы уже прозвонили до меня контакты и получили примерно такую картину:

Интерес вызвали четыре неопознанных контакта в одной из 20-контактных колодок: с номерами пар 5/15 и 6/16.
В первый очередь необходимо было определить:
являются ли 5/15 цифровой шиной управления;
являются ли 6/16 цифровым аудиоинтерфейсом;
можно ли по физической форме сигнала определить тип этих интерфейсов.
Для измерений я использовал двухканальный портативный осциллограф FNIRSI 2C53T. Его полоса составляет 50 МГц, максимальная частота дискретизации — 250 MSa/s. Этого достаточно для уверенного наблюдения CAN и для анализа временной структуры A2B, хотя полоса уже находится примерно на границе возможностей прибора для точного воспроизведения отдельных фронтов 49-Мбит/с A2B.
Сначала произвёл исследование контактов 5 и 15:
Сначала каждый контакт измерялся отдельно относительно массы автомобиля. На контакте 5 наблюдались редкие прямоугольные переходы с длительными спокойными участками. Контакт 15 демонстрировал практически такое же поведение.Уже на этом этапе стало ясно, что 5 и 15 сильно отличаются от 6 и 16: на них отсутствовал плотный высокочастотный поток, характерный для цифровой аудиошины.Для проверки гипотезы о дифференциальной паре были задействованы оба канала осциллографа:На двух проводах наблюдались события, которые:
начинались практически одновременно;
заканчивались практически одновременно;
имели противоположное направление изменения напряжения;
повторялись даже при выключенном головном устройстве.

При развёртке 1 µs/div на некоторых пойманных участках минимальные устойчивые интервалы занимали приблизительно два деления. Это даёт: 2 деления × 1 µs/div ≈ 2 µsЕсли 2 µs соответствует одному битовому интервалу 1 / 2 µs = 500 кбит/сТаким образом, измерения хорошо согласуются с классическим CAN примерно на 500 кбит/с(для справки, при 500 кбит/с длительность одного бита действительно составляет 2000 нс).
У высокоскоростного CAN физический уровень построен на двух проводах CAN_H и CAN_L.В recessive-состоянии обе линии находятся примерно около 2,5 В. В dominant-состоянии CAN_H поднимается примерно к 3,5 В, а CAN_L опускается примерно к 1,5 В. Именно противоположное движение двух линий является одним из наиболее характерных признаков CAN.
Измеренный мною сигнал на 5/15 соответствует именно этой логике:
два синхронных сигнала;
противоположные по полярности изменения;
длительные доминантные/recessive участки;
сравнительно низкая скорость по сравнению с линиями 6/16.
Отсюда вывод: Контакты 5 и 15 образуют дифференциальную CAN-пару.
Далее начал исследование контактов 6 и 16:
При измерении контакта 6 относительно кузовной массы появилась очень быстрая цифровая активность.При развёртке 10 ns/div удавалось различать отдельные высокочастотные колебания. В различных пойманных участках FNIRSI показывал частоты порядка нескольких мегагерц, однако эти автоматические значения не могли считаться реальной скоростью шины: прибор измерял повторяемость отдельных элементов формы сигнала. Главное наблюдение заключалось в том, что на контакте 6 присутствовали короткие высокочастотные пакеты, разделённые спокойными интервалами.

Это уже было существенно менее похоже на обычный S/PDIF. (а я надеялся что это будет S/PDIF)На обоих каналах наблюдались высокочастотные пакеты, которые:
появлялись в одни и те же моменты времени;
исчезали одновременно;
имели сходную временную структуру;
выглядели зеркальными/противофазными.
Это характерно для дифференциальной высокоскоростной шины.
Одной дифференциальности для точного определения шины недостаточно. Решающим стало исследование временной структуры пакетов.При развёртке H = 5 µs/div стало видно, что характерные группы передачи периодически повторяются.Расстояние между одинаковыми участками составляло приблизительно 4,1–4,2 деленияПри 5 µs/div: 4,17 × 5 µs ≈ 20,85 µsТо есть период получился приблизительно 20,8 µs. А обратная величина 1/20,833 µs ≈ 48 000 Гц. То есть 48 кГц.
Далее поиск в интернете навёл меня на совпадение со структурой аудио шины A2B. В A2B обмен организован суперкадрами. Analog Devices указывает, что частота суперкадров совпадает с частотой аудиосинхронизации — обычно 44,1 или 48 кГц. Для 48 кГц T=1/48 000=20,833 µsИменно такой период был получен на осциллограмме 6/16.Каждый суперкадр A2B содержит 1024 бит. При 48 кГц: 48 000 × 1024 = 49 152 000 бит/с. То есть 49,152 Мбит/с.Официальная документация Analog Devices приводит именно это значение.
Таким образом ориентировочная схема казалось выглядит следующим образом:

Перед усилителем аудиосигнал, по всей видимости, приходит в цифровом виде по A2B, а отдельная CAN-пара занимается автомобильным управлением.После A2B штатный усилитель уже (пока ориентировочно):
принимает цифровой поток;
выполняет DSP-обработку;
разделяет сигнал на необходимые каналы;
выполняет эквализацию;
формирует сигналы для отдельных динамиков;
усиливает их.

Казалось бы, оставалось подключиться к двум проводам и получить цифровой звук, однако именно здесь начались основные технические трудности.
Первая проблема — в самом принципе работы A2B. В отличие от привычного S/PDIF, который можно относительно просто подключить к цифровому аудиопроцессору, A2B представляет собой синхронизированную сеть с главным и подчинёнными устройствами. Головное устройство автомобиля управляет обнаружением узлов, их конфигурацией и распределением аудиоканалов. Поэтому подключение дополнительного A2B-приёмника к существующей линии вовсе не означает, что он начнёт получать звук. Неизвестное устройство может просто не пройти процедуру инициализации, а вмешательство в топологию сети способно нарушить работу штатного усилителя.
Вторая проблема — ограничение штатных средств прослушивания A2B. Я выяснил, что у трансиверов Analog Devices существует специальный режим Bus Monitor, позволяющий наблюдать за обменом. Однако для выдачи непосредственно аудиоданных через интерфейс I²S/TDM главный узел должен разрешить мониторинг установкой бита ENDSNIFF. Включает ли такое разрешение головное устройство i-Space, мне неизвестно. Следовательно, даже покупка специализированной отладочной платы AD2428 не гарантировала получение аудиопотока. Причём цена доступных плат составляла около 12 тысяч рублей — довольно значительная сумма за эксперимент с неопределённым результатом.
Третья трудность — отсутствие готовых совместимых решений. На рынке существуют автомобильные интерфейсы SoundMagus, GoldHorn и другие устройства, способные преобразовывать A2B в обычные цифровые аудиоформаты. Однако они ориентированы на определённые модели автомобилей и их штатные конфигурации. При этом в списке этих устройств поддержки Landian E5 нет. И даже если бы GoldHorn поддерживал i-Space, то цена усилителя в 259 тысяч оттолкнёт большинство потребителей. Если обобщить, то купить готовую коробочку A2B → Toslink и просто подключить её к штатному усилителю нет возможности.
Четвёртая проблема — сложность самостоятельного декодирования физического сигнала. На контактах 6/16 я наблюдал высокоскоростную дифференциальную передачу с периодом повторения структуры около 20,8 мкс на предполагаемой скорости A2B 49,152 Мбит/с. Однако это не готовые PCM-отсчёты. Для их восстановления необходимо преобразовать электрические сигналы в последовательность битов, восстановить тактирование, разобраться с Manchester-кодированием, найти границы суперкадров и определить расположение отдельных аудиослотов. Часть структуры A2B описана в документации Analog Devices, но подробности физического кодирования раскрыты не полностью. Обычные Raspberry Pi и ESP32 не являются надёжным решением для непосредственного захвата такого высокоскоростного потока.
Пятая трудность — безопасное подключение к работающей автомобильной сети. Я принципиально отказался от вскрытия штатного усилителя: автомобиль новый, находится на гарантии, а сам усилитель расположен под сиденьем и потенциально может иметь герметизированную электронику. Требовалось получить сигнал снаружи, не разрезая штатные провода и не изменяя работу аудиосистемы. При этом A2B является высокоскоростной линией, чувствительной к дополнительной нагрузке, паразитной ёмкости и длинным ответвлениям. Даже подключение обычного приёмника с низкоомным согласованием могло изменить электрические характеристики линии. Поэтому передо мной возникла отдельная задача создания высокоомного пассивного ответвления, которое позволило бы наблюдать за передачей, практически не влияя на неё.
Шестая проблема заключалась в отсутствии подходящего оборудования для записи сигнала. Мой FNIRSI 2C53T позволил увидеть характер передачи и определить периодичность, но его ограниченная глубина памяти и отсутствие удобного экспорта длительной последовательности сырых отсчётов не позволяли записать «эфир» A2B для последующего программного анализа. Покупать дорогой специализированный логический анализатор ради однократного исследования было нерационально, особенно с учётом того, что затем понадобилось бы отдельное устройство для преобразования A2B в PCM.
В результате я пришёл к следующей задаче: создать собственное компактное устройство, которое на первом этапе будет пассивно записывать необработанный цифровой поток A2B, а после изучения его структуры сможет в реальном времени декодировать аудиоданные и преобразовывать их в S/PDIF/Toslink. При этом оно должно было сохранять работу штатного усилителя, не требовать регистрации в автомобильной сети и не зависеть от разрешения ENDSNIFF. Именно эти требования привели меня к выбору FPGA как аппаратной основы.
FPGA — программируемая логическая матрица, способная обрабатывать цифровые сигналы на аппаратном уровне. В отличие от обычного микроконтроллера, FPGA позволяет создавать собственные параллельные цифровые схемы, работающие на высоких частотах. На первом этапе такая схема могла бы просто регистрировать состояния входного сигнала с точной временной привязкой и сохранять их в оперативную память. После изучения структуры A2B её можно было бы перепрограммировать для восстановления тактирования, декодирования кадров, извлечения PCM-каналов и формирования цифрового аудиовыхода.
Я рассмотрел несколько доступных китайских отладочных плат и остановились на продукции Sipeed. Основными кандидатами стали Tang Nano 20K и Tang Primer 20K. Обе построены на FPGA Gowin примерно одного класса, однако существенно отличаются объёмом внешней памяти. Nano располагает 8 МБ SDRAM, тогда как Primer оснащается 1 Гбит DDR3, то есть 128 МБ. Для моей задачи эта разница оказалась определяющей. Я хотел записывать не отдельные короткие импульсы, а достаточно продолжительные участки реального A2B-трафика, чтобы позднее искать повторяющиеся последовательности, границы суперкадров и расположение аудиоканалов.
Предварительный расчёт показал, что при частоте дискретизации 200 миллионов отсчётов в секунду и упаковке восьми однобитных отсчётов в один байт поток записи будет составлять 25 МБ/с. Следовательно, 128 МиБ DDR3 теоретически позволяют накопить около 5,37 секунды непрерывного сигнала, тогда как 8 МиБ Nano хватило бы приблизительно на треть секунды. При частоте суперкадров A2B 48 кГц пятсекундная запись могла бы содержать более 250 тысяч суперкадров. Это уже весьма солидный материал для последующего анализа.
В пользу Tang Primer 20K говорило и наличие готовой платы расширения Dock. Она предоставляла разъёмы GPIO и PMOD, интерфейс USB 2.0 High-Speed, Ethernet, средства программирования FPGA и другие периферийные возможности. Кроме того, для Primer 20K уже существовали открытые примеры работы с DDR3 и USB, что позволяло не разрабатывать всю инфраструктуру регистратора с нуля. На AliExpress удалось найти комплект Tang Primer 20K Core + Dock стоимостью около 5555 рублей. На фоне специализированной A2B-платы за 12 тысяч рублей это выглядело значительно привлекательнее. В результате я заказал это устройство и через три недели оно ко мне приехало.

Однако выбор FPGA решил только половину аппаратной задачи. Сама Tang Primer 20K не является готовым приёмником автомобильного A2B-сигнала. Её цифровые входы рассчитаны на определённые электрические уровни, тогда как на проводах A2B передаётся низкоамплитудный высокоскоростной дифференциальный сигнал, потенциально наложенный на постоянное напряжение. Просто соединить контакты 6/16 с выводами FPGA было нельзя: необходимо было обеспечить допустимое синфазное напряжение, правильное смещение, защиту входов и минимальную нагрузку штатной линии. При этом я принципиально не хотел создавать длинное ответвление, которое могло бы ухудшить качество связи между головным устройством и усилителем.
Первым кандидатом для преобразования электрического сигнала стал высокоскоростной компаратор Texas Instruments TLV3601 с типичной задержкой переключения порядка 2,5 нс. Но его нигде не смог найти в продаже. Поэтому пришёл к альтернативе — специализированный высокоскоростной LVDS-приёмник SN65LVDS2DBVR. Он рассчитаны на дифференциальные потоки до 400 Мбит/с, работает от питания 3,3 В и не содержат встроенного низкоомного терминатора. Последнее было принципиально важно для пассивного подключения к A2B. Дополнительно выяснилось, что сама FPGA Tang Primer 20K поддерживает дифференциальные LVDS-входы. Таким образом, появилась возможность обойтись вообще без внешнего компаратора, используя встроенные аппаратные ресурсы FPGA.
Далее приобрёл такой LVDS-приёмник и укомплектовал дополнительным конденсатором:

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

По фотографии заводской коричневой 20-контактной колодки удалось подобрать соответствующее семейство разъёмов Molex 34729, а также найти на AliExpress ответные штыревые корпуса и готовые варианты с обжатыми проводами. Это открывало возможность выполнить подключение без разрезания штатной проводки.

Таким образомсформировалась окончательная концепция исследовательского стенда: съёмный переходник Molex → высокоомный дифференциальный вход → Tang Primer 20K → DDR3 → выгрузка бинарного дампа на компьютер. Изначально я даже не собирался декодировать A2B непосредственно в FPGA. Гораздо важнее было получить достоверную цифровую запись «эфира» с контактов 6/16, которую можно сохранить, передать на компьютер и многократно исследовать разными программными алгоритмами. Лишь после успешного восстановления PCM планировал перенести декодер в FPGA и добавить выход S/PDIF/Toslink.
Далее понадобилось лишь собрать временную схему на коленке (для тестов).Подключение пассивное, через переходник в разрыв жгута. Терминатор не ставлю: шина уже согласована своими узлами. Каждая линия идёт на дифференциальный приёмник SN65LVDS34 через последовательный резистор 100 Ом (R1, R2: развязывает шину от отвода) и последовательный конденсатор 220 пФ (C1, C2: отсекает постоянную составляющую линий, около 3.7–4.1 В). После конденсатора стоит резистор 1 кОм на землю (R3, R4): он держит вход приёмника около 0 В, внутри его синфазного диапазона −4…+5 В. Пин 16 заведён на вход 1A, пин 6 — на 1B. LVDS-приёмник питается от 3.3 В разъёма PMOD3 Tang Primer 20K, у вывода питания стоит блокировочный конденсатор 0.1 мкФ (C3). Выход 1Y через резистор 100 Ом (R5: гасит звон на проводе) идёт на ногу B11 ПЛИС. ПЛИС пишет сырые выборки входа с частотой 199.8 МГц в DDR3 и отдаёт их по USB на ноутбук для расшифровки.



Приёмник подключил параллельно паре 6/16 через переходник в разрыв жгута у штатного усилителя, ничего не разрезая. Порядок присоединения: ноутбук только от батареи; первой — масса на кузов; прошивка загружается в оперативную память ПЛИС; питание приёмника; последним — резистор на входную ногу ПЛИС.
ПЛИС работает как очень быстрый «магнитофон»: 200 миллионов раз в секунду она смотрит, что сейчас на линии, ноль или единица, и складывает это в свою память DDR3. Расшифровкой на этом этапе она не занимается, просто пишет «как есть». Больше всего за раз помещается 128 МиБ, примерно 5.4 секунды жизни шины, а быстрая запись на 8 МиБ длится треть секунды. Потом ноутбук забирает запись по USB. Рядом с каждым файлом скрипт сохраняет описание: время, размер, контрольную сумму и пометку, что в этот момент играло.
Что я подавали на ГУ, чтобы было что искать. Подготовил флешку с тестовыми звуками по минуте:
тишина;
тон 1 кГц только в левом канале;
тон 1.75 кГц только в правом;
оба тона сразу.
Эквалайзер и эффекты выключил, громкость зафиксировал на 15%. Записи делал строго по порядку: включал трек, ждал 2–3 секунды, запускал запись. Последнюю повторил тише, чтобы увидеть, меняется ли что-то с громкостью.
Сразу после записи скрипт считал число переключений сигнала. Если шина A2B живая, на каждый кадр (1/48 000 секунды) должно приходиться около 280 переключений, и столько и получалось. Так прямо в машине было видно, что запись нормальная и можно двигаться дальше.
Дальше дома начиналось самое интересное. Из сырых нулей и единиц нужно было:
найти моменты переключений и по ним восстановить ритм шины, длительность одного бита около 20 нс;
превратить переключения в биты: шина использует манчестерский код, где 0 и 1 различаются тем, есть ли переход в середине бита;
найти начало каждого пакета по одинаковой метке-синхрослову и разрезать поток на кадры;
снять перемешивание: данные на шине скремблированы, и правило перемешивания пришлось вычислить;
-
вытащить из пакетов слоты, то есть 24-битные отсчёты, и сложить их в звук.
(этим у меня занималась нейронка)
Получившийся сигнал из каждого слота я проверял по спектру: есть ли в нём 1 кГц, 1.75 кГц, меняется ли он между тишиной, тонами и громкостью.
В результате сканирования выяснилось, что кадры идут друг за другом, 48 000 раз в секунду. В каждом кадре два коротких пакета, всё остальное время линия молчит. Один кадр длиной 20.8 мкс крупно. Пакет А занимает 64 бита (около 1.3 мкс), пакет Б — 114 бит (около 2.3 мкс). Вместе это примерно шестая часть кадра.Что внутри пакетов:
Пакет А служебный: синхрослово, счётчик кадров, управление, адрес, данные, контрольная сумма. Звука в нём нет.
Пакет Б: такое же начало плюс два слота по 24 бита с битом проверки.

Однако в перехваченных пакетах не было включённой на ГУ музыке. Для диагностики я поставил музыку на паузу, включил запись и стал говорить и хлопать в ладоши у потолочной консоли. После расшифровки двух слотов из пакета Б получился звук, в котором отчётливо слышны голос и хлопки, а тестовых тонов там как не было, так и нет. Стало ясно, что пара 6/16 вовсе не шина от головного устройства к усилителю. Это отдельный участок той же шины A2B, который идёт от штатного усилителя дальше по цепочке к микрофонному модулю. Пакет А — служебная команда, которую передают по цепочке дальше, а пакет Б — ответ микрофонного модуля с двумя каналами микрофонов.
Микрофоны используются для громкой связи и голосового помощника. Когда вы говорите по телефону или отдаёте команду ГУ, голос снимается этими микрофонами и по шине A2B уходит в головное устройство (через усилитель). Два микрофона вместо одного позволяют отделять голос водителя от шума салона и музыки и подавлять эхо от динамиков. Кроме того, такая схема годится для функций, которые на A2B обычно и делают: подстройки громкости под шум в салоне, активного шумоподавления и переговорной связи между рядами.
Таким образом я оказался в тупике… Единственные контакты A2B оказались линией от микрофона к усилителю. И тогда я снова обратился к распиновке усилителя. И меня заинтересовали контакты, подписанные как "+5 вольт", которые были зафиксированы на контактах 7/17. Прежде чем подключаться, я осциллографом проверил напряжения на паре 7/17. На пине 7 постоянно держалось +8.6 В, на пине 17 — почти ноль. Это фантомное питание: по той же паре, что и данные, головное устройство питает узлы шины. Раз так, пара идёт от ГУ, а подключаться к ней можно только через развязывающие конденсаторы (которые у меня уже смонтированы в схеме подключения). Подключился тем же входным каскадом, что и к 6/16: 100 Ом + 220 пФ на каждую линию, 1 кОм на землю после конденсатора. Пин 17 завёл на вход 1A приёмника, пин 7 — на 1B. Конденсаторы взяли на себя постоянные +8.6 В, приёмник увидел только сам сигнал.
Первая запись и сравнение с 6/16. Сразу стало видно, что это другая шина. Переключений сигнала на кадр было около 1000 против 280 на 6/16, а линия была занята большую часть кадра. В каждом кадре по-прежнему два пакета, но теперь длинные:
от ГУ к усилителю: служебная часть и 16 слотов по 25 бит;
обратно: служебная часть и 6 слотов.
С помощью нейронки я разобрал скремблер: данные перемешаны генератором псевдослучайной последовательности, и его начальное значение меняется по счётчику кадров 0–1–2–3. Для слотов к усилителю добавляется ещё постоянная маска. После снятия перемешивания в слотах 1 и 2 появились мои тестовые аудиозаписи: 1 кГц в левом канале, 1.75 кГц в правом. Слоты 3–16 содержали нули.
Далее проверил на музыке. Длинную запись музыки сравнил с исходным MP3. Звук из шины совпал с файлом без изменения уровня, тестовые тона −6 дБ пришли ровно −6.0 dBFS. Значит, ГУ отдаёт звук 24 бит / 48 кГц ещё до регулятора громкости, «как в файле». То есть любой исходник (будь то flac или mp3 или wav) ГУ преобразует в 24 бит / 48 кГц.
Далее провёл тесты по громкости. Плавно повернул громкость с 15% до 21%:
служебные пакеты не изменились;
музыка в слотах 1–2 осталась прежнего уровня;
выросли (примерно на 5.6 дБ) слоты 3–6 обратного потока, в которых усилитель возвращает обработанную копию звучащего;
в слотах 1–2 обратного потока оказались уже знакомые микрофоны.
Вывод: громкость к звуку в шине ещё не применена, её применяет штатный усилитель получая информацию по CAN-шине. Скорее всего поэтому GoldHorn не делает свои усилители для A2B, потому что громкость надо брать по CAN, а это та ещё задачка. (видимо в лисянах, танках и зикрах громкость звука идёт по A2B).
Структура кадра на шине 7/17
Шина работает кадрами: 48 000 кадров в секунду, каждый длится 20.8 мкс и вмещает 1024 бита. В каждом кадре по очереди передаются два пакета.Пакет от ГУ к усилителю (downstream) длиной 474 бита занимает первые 9.6 мкс кадра. Он состоит из трёх частей:
заголовок, 64 бита: синхрослово, счётчик кадров и служебные поля;
16 слотов по 25 бит: 24-битный звуковой отсчёт и бит проверки;
короткий хвост, 10 бит.
Используются пять слотов:
Слот | Что идёт
1 и 2 музыка, левый и правый канал
4 навигация и голосовой помощник (моно)
5 мелодия входящего вызова (моно)
6 телефонный разговор (моно, телефонное качество)
Слот 3 и слоты 7–16 во всех моих записях были пустыми (не используются в Dongfeng). Весь звук идёт до регулятора громкости, «как в файле»: громкость, эквалайзер и пространственные эффекты применяет уже усилитель на основании команд по CAN (сигналы эквалайзера, пространственных эффектов не передаются через A2B по результатам сканирования). Ответ усилителя (upstream) — 224 бита, вдвое короче. Он начинается примерно через 13 мкс от начала кадра и устроен так же: заголовок 64 бита, 6 слотов и хвост.
Слот | Что идёт
1 и 2 микрофоны в салоне
3 копия того, что усилитель подаёт на динамики: смесь L+R
4 и 6 такая же копия, правый канал
5 такая же копия, левый канал
Копии идут уже с учётом громкости и эквалайзера, поэтому по ним можно узнать текущую громкость.
Все биты на шине перемешаны скремблером по известному правилу, и перед чтением слотов их нужно «распутать».

В результате получается следующая топология компонентов по цифровой аудиошине

Подытожив можно выделить, что 7/17 это основная шина A2B от головного устройства к усилителю. В ней лежит чистый цифровой звук нужного качества, который можно снять пассивно и передать на свой усилитель.
Открытыми остались два вопроса: как снять звук в реальном времени, а не записью, и откуда брать громкость.
Для первого вопроса я уже заказал FPGA Tand Nano 20k, который будет в реальном времени декодировать A2B и передавать в Toslink, а с громкостью есть два пути:
просканировать пакеты CAN и перехватить команды увеличения и уменьшения громкости (для этого дополнительное железо не нужно. текущий LVDS-приёмник имеет 2 свободных канала, на которые можно спокойно завести CAN-сигналы через резисторы 100 Ом и настроить логику обработки;
анализировать обратный поток A2B от усилителя к ГУ (более изящное решение).
Громкость в шине не передаётся: головное устройство отдаёт звук «как в файле», а громкость применяет сам штатный усилитель. Зато усилитель в обратном потоке постоянно возвращает копию того, что он реально подаёт на динамики, уже с громкостью. Значит, у нас на руках одновременно и исходный звук, и то, что из него получилось. Стоит сравнить их — во сколько раз копия тише оригинала, — и это и есть текущая громкость.
Чтобы сравнение было точным, один раз делается калибровка. Проигрываем через ГУ розовый шум и запоминаем, как усилитель «окрашивает» звук на пути к выходу: задержку и тембр. Дальше ПЛИС каждую миллисекунду сверяет копию с оригиналом, отдельно для музыки, навигации, мелодии вызова и телефона, и плавно подстраивает свою громкость под штатную. Когда источник молчит, его громкость просто запоминается до следующего звука. Данный механизм я уже опробовал и реализовал в своей тестовой сборке. В проверке на записях оценка совпадала со штатной громкостью с точностью до полудецибела, а это точнее одного щелчка регулятора ГУ. Работает это при одном условии: звуковые настройки ГУ (поле, эффекты, эквалайзер) оставлены как при калибровке. Если их поменять, калибровку нужно повторить.
kryak
Лютая работа. Огромнейший респект.
А Не изучали саму плату блока ГУ? Возможно, так было бы проще определить протокол или вообще его изменить прошивкой.