![image](https://habrastorage.org/files/d05/d54/36c/d05d5436c08c43778543a69757002ef7.jpg)
Герой заметки — магнитола Kenwood GX806EF2 — славна тем, что устанавливалась в очень большое число экспортных японских автомобилей (взять хотя бы Subaru Forester) и не имеет ни входа AUX для подключения внешних источников звука, ни возможности воспроизвести MP3-файлы с CD-дисков (с внешних накопителей тоже). Магнитола вышла весьма утилитарной для своего времени (2004-2007 года), несмотря на CD-чейнджер на 6 CD. CD-audio, FM/AM-тюнер, и всё, но кассетоприемника, к слову, уже нет.
Но все-таки сделать ей вход AUX можно без порчи внешнего вида и функциональности.
Попалась мне эта магнитола вместе с автомобилем. Вмонтировав андроид-планшет 7" в будку для навигации я начал искать способы вывести звук с планшета на магнитолу, а покупать для этого новую «голову» совсем не хотелось.
Выяснилось, что многие отключают внутренний CD-чейнджер и подключают серийно производимые эмуляторы с возможностью воспроизведения MP3 через USB, например так, но мне это показалось излишним вандализмом с избыточными затратами.
Передачу звука с внешнего устройства можно решить еще с помощью FM-передатчика, но качество звука с таким вариантом очень плохое и здесь так же присутствует звено с лишними затратами на FM-передатчик и на его размещение в салоне.
В некоторых местах я находил упоминание про отрезание линии AM-тюнера от магнитолы и использование её остатка для внешнего звука, но это неосуществимо с конкретно этой магнитолой, в любых режимах тюнера сигналы идут по одной линии. Было решено проанализировать всю схему магнитолы на предмет «уязвимых» мест.
Склеенную схему главной платы можно посмотреть здесь. Вот интересная часть схемы:
![image](https://habrastorage.org/files/d88/396/a76/d88396a76dcd474297420161693846ff.jpg)
Искомое находится рядом с аудиопроцессором TDA7406 (IC203 на схеме) от STMicroelectronics. Красным я обвел шину i2c, которая связывает главный контроллер с микросхемой IC203, синим — неиспользуемые аудиовходы MD и TAPE. Как выясняется из даташита на эту микросхему, у неё есть 4 раздельных стерео аудиовхода и 4 раздельных моно аудиовхода. Однако, используются они не все, а неиспользуемые «заглушены» конденсаторами об землю (C233-C236 тому пример).
Изучив принцип работы TDA7406, я понял, что можно попробовать вклиниться в управление главным контроллером и задействовать неиспользованные звуковые входы когда это необходимо. Я подпаял на линии SDA и SCL (резисторы R855, R857) провода и подключил к ним логический анализатор:
![image](https://habrastorage.org/files/a8f/3b2/875/a8f3b2875a894061a8158f73f6994913.jpg)
Выяснилось, что при штатном функционировании контроллер каждые полсекунды запрашивает по шине i2c статус у TDA7406. В этом запросе ничего интересного для нас нет — там флаги состояния TDA7406. Никаких команд управления в покое не встречается:
![image](https://habrastorage.org/files/c9a/417/e39/c9a417e39ebe4385bcd276c968c02637.png)
![image](https://habrastorage.org/files/81d/80e/c79/81d80ec79f5d43a48eea8933b617ae65.png)
Самое интересное на шине происходит в момент переключения режимов CD/BAND и при изменении громкости. В таких случаях контроллер дает длинную посылку для регистров управления TDA7406. Эта посылка содержит настройки почти для всех доступных регистров. Вот пример посылки (её небольшая начальная часть):
![image](https://habrastorage.org/files/edf/7cb/368/edf7cb368e714fab94f8c670fa2c934b.png)
Разберем это посылку:
0x8C (chip address) — адрес чипа TDA7406 со сброшенным битом R/W (контроллер собирается писать в регистры).
0x60 (subaddress) — адрес первого регистра, с которого начнется запись посылки и некоторые установки порядка записи (в данном случае запись будет производится с нулевого адреса, как впрочем и всегда, когда контроллер конфигурирует TDA7406: он всегда записывает конфигурацию начиная с регистра 0).
0x0E (регистр 0) — конфигурация для регистра 0, то что нам надо, судя по документации: это регистр Input Selector. В нем указывается какой вход аудиомикшера сейчас должен быть выбран и какое усиление (громкость) должно быть у этого канала:
![image](https://habrastorage.org/files/b4a/1a2/823/b4a1a28232404aab858483826432cddd.png)
При выборе канала тюнера и при дальнейшей работе с ним (повышение/понижение громкости), контроллер отсылает в поле Source Selector нулевого регистра биты 110. И это очень хорошо, поскольку для того чтобы задействовать под AUX вход MD надо передать в это поле биты 010. Для справки: шина i2c имеет подтяжки к напряжению питания и всегда свободна, а активный уровень на шине — ноль, т.е. управление ведется открытым коллектором (открытым стоком). В любой момент времени любую линию шины i2c можно «дернуть» к нулю без ущерба для всех устройств на этой шине.
Можно вклиниться в общение контроллера с аудиомикшером в нужный нам момент и превратить режим FM в режим MD. Единственное что требуется — точно отследить нужное время для импульса, чтобы «110» превратилось в «010». И делать это надо каждый раз, когда контроллер разговаривает с TDA7406. Вот нужный нам момент на диаграмме, в момент выделенного красным такта линии SCL надо задавить линию SDA в ноль:
![image](https://habrastorage.org/files/730/a8b/9fb/730a8b9fb9e2445e8c13c28caeb69983.png)
Я нарисовал и изготовил небольшую платку с микроконтроллером Attiny13, с штыревыми разъемами на всех выводах для удобства программирования и дальнейшего подключения к i2c и питанию:
![image](https://habrastorage.org/files/dad/69a/247/dad69a2472cb44a58931e9c0f44147c7.jpg)
Нижний слой платы я намеренно сделал плоским, без выпирания штырей, чтобы можно без проблем приклеить плату на голову TDA7406.
![image](https://habrastorage.org/files/3ed/dcd/df0/3eddcddf0ba343398afb0d67283bb7f2.jpg)
Осталось дело за малым: припаять к плате с ATTiny13 провода питания, i2c, провода от внешнего разъема 3,5 мм («мама») и проводки на плату магнитолы к линиям MD (предварительно удалив конденсаторы С233, С234):
![image](https://habrastorage.org/files/7d3/120/493/7d3120493ccc40948db5c40cecdfdd6f.jpg)
Прошу прощения за качество фото, был увлечен больше процессом создания, а не документированием.
Синий провод уходящий вверх на фото идет к кнопке News на передней панели магнитолы. Именно она используется для включения перехвата управления аудиомикшером. Нажатием кнопки активируем перехват, еще одним нажатием — деактивируем. Важно: после нажатия кнопки News нужно будет уменьшить или увеличить громкость, т.к. в покое, как мы помним, управление аудиомикшером не происходит, а сам по себе микроконтроллер ATTiny13 никаких посылок в шину не делает.
Программа для микроконтроллера получилась очень простой; в основном это решение задачи «в лоб», без применения прерываний. Я вернусь к программе чуть ниже.
Итак, для тех кто решит воспользоваться этим методом для создания входа AUX этой магнитоле:
1. Разобрать магнитолу, запомнив типы винтов и их места.
2. Добраться до основной платы и найти микросхему TDA7406.
3. Изготовить и запрограммировать плату с ATTiny13 (номиналы конденсаторов С1-С3 0,1 мкФ):
![image](https://habrastorage.org/files/f01/d2e/e85/f01d2ee85a094da8a6e4543fff94ca1c.png)
4. Приклеить плату к чипу TDA7406.
5. Выпаять с основной платы С233, С234. Припаять проводки от основной платы к плате ATTiny13 по схеме:
![image](https://habrastorage.org/files/004/a19/f7f/004a19f7fdde48ec84186afb86305ebd.png)
Питание для ATTiny13 вблизи TDA7406 нет, т.к. TDA7406 питается от 8 В, а нам надо 5. Тянем к XP2:1 провод от вывода 8 микросхемы памяти IC803 (24C02), корпус SO-8, см. фото выше.
Провод от кнопки News (у неё два контакта, нам нужен тот, что сидит на питании, а не на земле) тянем к XP1:2 (PB3).
6. Припаиваем собственно выход AUX (у меня это фабричный разъем 3,5мм «мама» с проводом, от удлинителя наушников) к плате: XP1:5 левый канал, XP2:5 правый канал и общий провод на XP1:4. Провод от разъема заводим перед этим снаружи откуда удобнее.
7. Подключаем динамики к магнитоле, проверяем.
8. Пайку проводов хорошо проверяем и фиксируем провода к плате эластичным клеем типа «Момента».
Данная модификация работает у меня почти месяц без нареканий. Единственное неудобство — двухступенчатое включение и выключение AUX. Сначала кнопку нажимаем News, а затем страгиваем немного громкость. Этого можно было бы избежать, дописав программу таким образом, чтобы ATTiny сама отправляла конфигурацию регистрам аудиомикшера в момент нажатия кнопки, но я посчитал это излишним вмешательством, усложняющим программу. Но при должном опыте работы с микроконтроллерами такую функцию приделать недолго.
Пара слов о программе. В ней не используются прерывания, а отслеживание тактов (фронтов) на линии SCL ведется по флагам GIFR в циклах. С каждым тактом SCL программа оценивает состояние шины SDA и если оно удовлетворяет последовательности 0x8C 0x60 0x0E, то на линии SDA в нужном месте выставляется лог.0. И так по кругу. При использовании прерываний ATTiny13 тратит много тактов на вход и обработку прерывания и не успевает за тактами; частота i2c для него высоковата: 160 кГц.
Плата в формате PCB P-CAD 2006 здесь.
Прошивка для ATTiny13 в формате Intel hex здесь.
UPD: по просьбе пользователей добавляю информацию о «фьюзах».
Из производства ATTniy13 приходит с запрограммированным битом CKDIV8 в Fuse Low Byte. Его надо снять, записав бит 1 в его поле. К примеру, если у ATTiny13 значение Fuse Low Byte с завода равно 0x6A, то его надо сделать равным 0x7A. Тем самым мы делаем тактовую частоту максимальной (9,6 Мгц); с другой тактовой частотой программа не будет работать должным образом.