29 мая 2015

Создание входа AUX магнитоле Kenwood GX806EF2 захватом шины i2c

Звук
Из песочницы
image

Герой заметки — магнитола 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

Искомое находится рядом с аудиопроцессором TDA7406 (IC203 на схеме) от STMicroelectronics. Красным я обвел шину i2c, которая связывает главный контроллер с микросхемой IC203, синим — неиспользуемые аудиовходы MD и TAPE. Как выясняется из даташита на эту микросхему, у неё есть 4 раздельных стерео аудиовхода и 4 раздельных моно аудиовхода. Однако, используются они не все, а неиспользуемые «заглушены» конденсаторами об землю (C233-C236 тому пример).

Изучив принцип работы TDA7406, я понял, что можно попробовать вклиниться в управление главным контроллером и задействовать неиспользованные звуковые входы когда это необходимо. Я подпаял на линии SDA и SCL (резисторы R855, R857) провода и подключил к ним логический анализатор:

image

Выяснилось, что при штатном функционировании контроллер каждые полсекунды запрашивает по шине i2c статус у TDA7406. В этом запросе ничего интересного для нас нет — там флаги состояния TDA7406. Никаких команд управления в покое не встречается:

image
image

Самое интересное на шине происходит в момент переключения режимов CD/BAND и при изменении громкости. В таких случаях контроллер дает длинную посылку для регистров управления TDA7406. Эта посылка содержит настройки почти для всех доступных регистров. Вот пример посылки (её небольшая начальная часть):

image

Разберем это посылку:
0x8C (chip address) — адрес чипа TDA7406 со сброшенным битом R/W (контроллер собирается писать в регистры).
0x60 (subaddress) — адрес первого регистра, с которого начнется запись посылки и некоторые установки порядка записи (в данном случае запись будет производится с нулевого адреса, как впрочем и всегда, когда контроллер конфигурирует TDA7406: он всегда записывает конфигурацию начиная с регистра 0).
0x0E (регистр 0) — конфигурация для регистра 0, то что нам надо, судя по документации: это регистр Input Selector. В нем указывается какой вход аудиомикшера сейчас должен быть выбран и какое усиление (громкость) должно быть у этого канала:

image

При выборе канала тюнера и при дальнейшей работе с ним (повышение/понижение громкости), контроллер отсылает в поле Source Selector нулевого регистра биты 110. И это очень хорошо, поскольку для того чтобы задействовать под AUX вход MD надо передать в это поле биты 010. Для справки: шина i2c имеет подтяжки к напряжению питания и всегда свободна, а активный уровень на шине — ноль, т.е. управление ведется открытым коллектором (открытым стоком). В любой момент времени любую линию шины i2c можно «дернуть» к нулю без ущерба для всех устройств на этой шине.

Можно вклиниться в общение контроллера с аудиомикшером в нужный нам момент и превратить режим FM в режим MD. Единственное что требуется — точно отследить нужное время для импульса, чтобы «110» превратилось в «010». И делать это надо каждый раз, когда контроллер разговаривает с TDA7406. Вот нужный нам момент на диаграмме, в момент выделенного красным такта линии SCL надо задавить линию SDA в ноль:

image

Я нарисовал и изготовил небольшую платку с микроконтроллером Attiny13, с штыревыми разъемами на всех выводах для удобства программирования и дальнейшего подключения к i2c и питанию:

image

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

image

Осталось дело за малым: припаять к плате с ATTiny13 провода питания, i2c, провода от внешнего разъема 3,5 мм («мама») и проводки на плату магнитолы к линиям MD (предварительно удалив конденсаторы С233, С234):

image
Прошу прощения за качество фото, был увлечен больше процессом создания, а не документированием.

Синий провод уходящий вверх на фото идет к кнопке News на передней панели магнитолы. Именно она используется для включения перехвата управления аудиомикшером. Нажатием кнопки активируем перехват, еще одним нажатием — деактивируем. Важно: после нажатия кнопки News нужно будет уменьшить или увеличить громкость, т.к. в покое, как мы помним, управление аудиомикшером не происходит, а сам по себе микроконтроллер ATTiny13 никаких посылок в шину не делает.

Программа для микроконтроллера получилась очень простой; в основном это решение задачи «в лоб», без применения прерываний. Я вернусь к программе чуть ниже.

Итак, для тех кто решит воспользоваться этим методом для создания входа AUX этой магнитоле:
1. Разобрать магнитолу, запомнив типы винтов и их места.
2. Добраться до основной платы и найти микросхему TDA7406.
3. Изготовить и запрограммировать плату с ATTiny13 (номиналы конденсаторов С1-С3 0,1 мкФ):
image
4. Приклеить плату к чипу TDA7406.
5. Выпаять с основной платы С233, С234. Припаять проводки от основной платы к плате ATTiny13 по схеме:
image
Питание для 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 Мгц); с другой тактовой частотой программа не будет работать должным образом.
Теги:attiny13i2cAUX
Хабы: Звук
+45
56,2k 128
Комментарии 14
Лучшие публикации за сутки