[Из песочницы] Создание входа AUX магнитоле Kenwood GX806EF2 захватом шины i2c
Герой заметки — магнитола Kenwood GX806EF2 — славна тем, что устанавливалась в очень большое число экспортных японских автомобилей (взять хотя бы Subaru Forester) и не имеет ни входа AUX для подключения внешних источников звука, ни возможности воспроизвести MP3-файлы с CD-дисков (с внешних накопителей тоже). Магнитола вышла весьма утилитарной для своего времени (2004–2007 года), несмотря на CD-чейнджер на 6 CD. CD-audio, FM/AM-тюнер, и всё, но кассетоприемника, к слову, уже нет.
Но все-таки сделать её вход AUX можно без порчи внешнего вида и функциональности.Попалась мне эта магнитола вместе с автомобилем. Вмонтировав андроид-планшет 7» в будку для навигации я начал искать способы вывести звук с планшета на магнитолу, а покупать для этого новую «голову» совсем не хотелось.Выяснилось, что многие отключают внутренний CD-чейнджер и подключают серийно производимые эмуляторы с возможностью воспроизведения MP3 через USB, например так, но мне это показалось излишним вандализмом с избыточными затратами.
Передачу звука с внешнего устройства можно решить еще с помощью FM-передатчика, но качество звука с таким вариантом очень плохое и здесь так же присутствует звено с лишними затратами на FM-передатчик и на его размещение в салоне.В некоторых местах я находил упоминание про отрезание линии AM-тюнера от магнитолы и использование её остатка для внешнего звука, но это неосуществимо с конкретно этой магнитолой, во любых режимах тюнера сигналы идут по одной линии. Было решено проанализировать всю схему магнитолы на предмет «уязвимых» мест.
Склеенную схему главной платы можно посмотреть здесь. Вот интересная часть схемы:
Искомое находится рядом с аудиопроцессором TDA7406 (IC203 на схеме) от STMicroelectronics. Красным я обвел шину i2c, которая связывает главный контроллер с микросхемой IC203, синим — неиспользуемые аудиовходы MD и TAPE. Как выясняется из даташита на эту микросхему, у неё есть 4 раздельных стерео аудиовхода и 4 раздельных моно аудиовхода. Однако, используются они не все, а неиспользуемые «заглушены» конденсаторами об землю (C233-C236 тому пример).
Изучив принцип работы TDA7406, я понял, что можно попробовать вклиниться в управление ею главным контроллером и задействовать неиспользованные входы когда это необходимо. Я подпаял на линии SDA и SCL (резисторы R855, R857) провода и подключил к ним логический анализатор:
Выяснилось, что при штатном функционировании контроллер каждые полсекунды запрашивает по шине i2c статус у TDA7406. В этом запросе ничего интересного для нас нет — там статусы состояния TDA7406. Никаких команд управления в покое не встречается:
Самое интересное на шине происходит в момент переключения режимов CD/BAND и при изменении громкости. В таких случаях контроллер дает длинную посылку для регистров управления TDA7406. Эта посылка содержит настройки почти для всех доступных регистров. Вот пример посылки (её небольшая начальная часть):
Разберем это посылку:0×8C (chip address) — адрес чипа TDA7406 со сброшенным битом R/W (контроллер собирается писать в регистры).0×60 (subaddress) — адрес первого регистра, с которого начнется запись посылки и некоторые установки порядка записи (в данном случае запись будет производится с нулевого адреса, как впрочем и всегда, когда контроллер конфигурирует TDA7406: он всегда записывает конфигурацию начиная с регистра 0).0×0E (регистр 0) — конфигурация для регистра 0, то что нам надо, судя по документации: это регистр Input Selector. В нем указывается какой вход аудиомикшера сейчас должен быть выбран и какое усиление (громкость) должно быть у этого канала:
При выборе канала тюнера и при дальнейшей работе с ним (повышение/понижение громкости), контроллер отсылает в поле Sorce Selector нулевого регистра биты 110. И это очень хорошо, поскольку для того чтобы задействовать под AUX вход MD надо передать в это поле биты 010. Для справки: шина i2c имеет подтяжки к напряжению питания и всегда свободна, активный уровень на шине — ноль, т.е. управление ведется открытым коллектором (открытым стоком). В любой момент времени любую линию шины i2c можно «дернуть» к нулю без ущерба для всех устройств на этой шине.
Можно вклиниться в общение контроллера с аудиомикшером в нужный нам момент и превратить режим FM в режим MD. Единственное что требуется — точно отследить нужное время для импульса, чтобы »110» превратилось в »010». И делать это надо каждый раз, когда контроллер разговаривает с TDA7406. Вот нужный нам момент на диаграмме, в момент выделенного красным такта линии SCL надо задавить линию SDA в ноль:
Я нарисовал и изготовил небольшую платку с микроконтроллером Attiny13, с штыревыми разъемами на всех выводах для удобства программирования и дальнейшего подключения к i2c и питанию:
Нижний слой платы я намеренно сделал плоским, без выпирания штырей, чтобы можно без проблем приклеить плату на голову TDA7406.
Осталось дело за малым: припаять к плате с ATTiny13 провода питания, i2c, провода от внешнего разъема 3,5 мм («мама») и проводки на плату магнитолы в линиям MD (предварительно удалив конденсаторы С233, С234):
Прошу прощения за качество фото, был увлечен больше процессом создания, а не документированием.
Синий провод уходящий вверх на фото идет к кнопке News на передней панели магнитолы. Именно она используется для включения перехвата управления аудиомикшером. Нажатием кнопки активируем перехват, еще одним нажатием — деактивируем. Важно: после нажатия кнопки News нужно будет уменьшить или увеличить громкость, т.к. в покое, как мы помним, управление аудиомикшером не происходит, а сам по себе микроконтроллер ATTiny13 никаких посылок в шину не делает.
Программа для микроконтроллера получилась очень простой; в основном это решение задачи «в лоб», без применения прерываний. Я вернусь к программе чуть ниже.
Итак, для тех кто решит воспользоваться этим методом для создания входа AUX этой магнитоле:1. Разобрать магнитолу, запомнив типы винтов и их места.2. Добраться до основной платы и найти микросхему TDA7406.3. Изготовить и запрограммировать плату с ATTiny13 (номиналы конденсаторов С1-С3 0,1 мкФ): 4. Приклеить плату к чипу TDA7406.5. Выпаять с основной платы С233, С234. Припаять проводки от основной платы к плате ATTiny13 по схеме: Питание для ATTiny13 вблизи TDA7406 нет, т.к. TDA7406 питается от 8 В, а нам надо 5. Тянем к XP2:1 провод от вывода 8 микросхемы памяти IC803 (24C02).Провод от кнопки News (у неё два контакта, нам нужен тот, что сидит на питании, а не на земле) тянем к XP1:2 (PB3).6. Припаиваем собственно выход AUX (у меня это фабричный разъем 3,5 мм «мама» с проводом, от удлинителя наушников) к плате: XP1:5 левый канал, XP2:5 правый канал и общий провод на XP1:4. Провод от разъема заводим перед этим снаружи откуда удобнее.7. Подключаем динамики к магнитоле, проверяем.8. Пайку проводов хорошо проверяем и фиксируем провода к плате эластичным клеем типа «Момента».
Данная модификация работает у меня почти месяц без нареканий. Единственное неудобство — двухступенчатое включение и выключение AUX. Сначала кнопку нажимаем News, а затем страгиваем немного громкость. Этого можно было бы избежать, дописав программу таким образом, чтобы ATTiny сама посылала посылку конфигурации аудиомикшера в момент нажатия кнопки, но я посчитал это излишним вмешательством, усложняющим программу. Но при должном опыте работы с микроконтроллерами такую функцию приделать недолго.
Пара слов о программе. В ней не используются прерывания, а отслеживания тактов на линии SCL ведется по флагам GIFR фронтам в циклах. С каждым тактом SCL программа оценивает состояние шины SDA и если оно удовлетворяет последовательности 0×8C 0×60 0×0E, то на линии SDA в нужном месте выставляется лог.0. И так по кругу. При использовании прерываний ATTiny13 тратит много тактов на вход и обработку прерывания и не успевает за тактами; частота i2c для него высоковата: 160 кГц.
Плата в формате PCB P-CAD 2006 здесь.Прошивка для ATTiny13 в формате Intel hex здесь.