Fun Electronic

Электронные поделки, программирование микроконтроллеров, и прочая белиберда|Electronic Basteleien, Mikrokontroller Programmierung und anderes Quatsch

RSS
people

Mazda MP3 Player — Продолжение 2|Mazda MP3 Player — Zweite Folge

[lang_ru]Ну что же, дорогие мои читатели. Вот вы и дождались продолжение нашего сериала о плеере  для Автомобиля Mazda.[/lang_ru]

[lang_de]So, meine liebe Leserinen und Leser, sie haben es geschaft, die zweite Folge der Saga über dem Mazda MP3 Player ist da![/lang_de]

[lang_ru]Продолжим мы описанием прошивки для плейера и успеем еще послушать краткое описание протокола M-Bus, точнее того, что я смог найти в интернете, а так же того, чего сам видел на своей магнитоле.[/lang_ru]

[lang_de]Weiter geht es mit der Beschreibung der Firmware für Player, und wir werden noch kurze Anleitung in das M-Bus Protokol hören, genauer gesage, dass was ich selber im Internet gefunden habe, und noch das, was ich selber auf meinem Autoradio gesehn habe. [/lang_de]

[lang_ru]И так, структура прошивки:[/lang_ru]

[lang_de]So. Hier ist ein Blochbild der Firmware [/lang_de]

Блоксхема прошивки

[lang_ru]При старте прошивки происходит обычная процедура инициализации всего микроконтроллера и сканирование дисков, что бы заполнить базу данных файлов информацией о том, где файлы находятся, их стартовые кластера и смещения в них, для быстрого доступа к файлам. Так же происходит поиск плейлистов в корневых папках дисков — это будут наши «диски» для Магнитолы.[/lang_ru]

[lang_de]Nach dem Einschalten werd der normale Initializationsprozess gestartet, und auch das Skannen der Festplatte und Flashkarte, um die Datei — Datenbank mit der Information auffühlen, wo genau die Dateien auf der Festplate liegen, die Nummern des Startklasters der Datei, Offsets in denen, also alles, was man benötigt um einen schnellen Zugriff auf Dateien zu gewärleisten. Also werd es nach den Playlists in Root-Verzeichniss gesucht. Die M3U Dateien (Playlists) werden dann unsede «Disks» für das Mazda Radio. [/lang_de]

Инициализация плеера и сканирование дисков

[lang_ru]Для справки — прошивка на текущий момент  может переварить следующие «большие количества»:[/lang_ru]

[lang_de]Zur Info — jetzige Firmware ist in der Lage folgende Menge zu verdauen: [/lang_de]

  • [lang_ru]Максимальное число файлов в одной папке — 496[/lang_ru]
  • [lang_de]Maximale Anzahl der Dateien in einer Verzeichniss — 496[/lang_de]
  • [lang_ru]Максимальное количество файлов на всех дисках вообще — 12412[/lang_ru]
  • [lang_de]Maximale Anzahl der Dateien auf der Disks insgesamt — 12412[/lang_de]
  • [lang_ru]Максимальное количество плейлистов *.M3U — 112[/lang_ru]
  • [lang_de]Maximale Anzahl der Playlists *.M3U — 112[/lang_de]
  • [lang_ru]Максимальное количество файлов в одном плейлисте — 3276[/lang_ru]
  • [lang_de]Maximale Anzahl der Dateien in einem Playlits — 3276[/lang_de]

[lang_ru]Так вот.  База данных файлов это несколько банков памяти с информацией о расположении файлов на дисках.[/lang_ru]

[lang_de]Also. Dateien Datenbank ist nichst anderes als einpaar der SRAM Banks mit der Information über die Plazierung der Dateine auf der Festplate. [/lang_de]

[lang_ru]Files Manager — это своего рода Интерфейс пользователя (HMI, MMI, GUI и т.д.). Т.е. наш плейер может не только в связке с автомагнитолой работать, но и как самостоятельный плеер, дайте только питание.[/lang_ru]

[lang_de]Files Manager — ist sogenante Mensh Maschine Interface (MMI, HMI, GUI u.s.w.). Das heisst, dass unser Player kann nicht nur mit dem Autoradio zusammen arbeiten, aber auch als selbstständiges Player. an braucht nur Strom dafür.[/lang_de]

[lang_ru]Естественно, менеджер файлов общается с модулем Button Driver, что бы знать, чего хочет от него пользователь, и общается так же с базой файлов, потому как на то он и менеджер файлов, показывать то ему надо что-то.[/lang_ru]

[lang_de]Natürlich, kommuniziert der Files Manager mit dem Modul Button Driver, damit wir wissen, was der Benutzer von uns will. Und auch kommuniziert er mit der Dateien Datenbank, weil das ein Files Manager ist, er muss irgendwas zeigen!  [/lang_de]

[lang_ru]Так же с базой общается и другой модуль, Player Control. Этот модуль определяет, какой файл играть следующим, в зависимости от того, проигрывается сейчас какая-то папка, или же список всех файлов, или какой то плейлист. После определения того, какой файл играть, берет, значит, этот контроллер этот самый файл и скармливает его другому модулю - MP3 Playback Control.[/lang_ru]

[lang_de]Also kommuniziert  mit der Datenbank anderes Modul — Player Control. Dieses Modul definiert, welche Datei als nächstes zu spielen, abchängig davon ob jetzt eine Verzeichnis gespielt wird, oder die Liste aller Dateien, oder isrgen eine Playliste. Nach dem das Modul definier hat, was als nächstes zu spielen, nimmt es die Datei und futtert damit ein anderes Modul — MP3 Playback Control. [/lang_de]

[lang_ru]Это  само сердце проигрывателя, т.е. он проигрывает какой-то конкретный файл. Управляется он через наш контроллер, а информацию о проигрывании дает как контроллеру, так и еще одному GUI — Player Frontend. Это окошко с кнопочками пауза, стоп, назад и вперед, регулятором громкости, ну и и с самой информацией о том, какой плейлист играет, какой файл, какой порядковый номер на рукаве, ой, по порядку, т.е. Заслушался я, прям, Цоя.[/lang_ru]

[lang_de]Dass ist das Herz des Players, das ein bestimmtes Datei abspielt. es wird über unserem Player Control Modul controliert, und die Information über gerade gespielte Datei gibt es sowie dem Player Control Modul, als auch GUI — Player Fronten. Das ist das Fensterhen mit der Tasten Pause, Stop, Zurück, Vorne, Lautstärke, und auch mit der Information über der abspielenden Datei, der Play Liste, der Nummer der Datei. [/lang_de]

[lang_ru]Ну и замое интересное — подключение к внешнему миру — Unilink Interface Module.[/lang_ru]

[lang_de]Und das interessanteste  - Anschluß an Aussenwelt - Unilink Interface Module. [/lang_de]

[lang_ru]Но многие сейчас возразят, что мол, в Мазде же нету Unilink'а, тем более Sony, и будут правы! Нету там этого.[/lang_ru]

[lang_de]Manche Lesern werden jetzt wiedersprechen, dass es keinen Unilink und vor Allem Sony im Mazda gibt! Richtig, gibt es keins davon.[/lang_de]

[lang_ru]Но если вы внимательно читали предыдущие статейки на эту тему, то наверное заметили, что я там говорил, что этот плеер написан на основе уще существующей моей разработки для автомагнитолы Sony c протоколом Unilink.[/lang_ru]

[lang_de]Wenn Sie meine vorige Artikeln über den Player gelesen haben, können Sie sicherlich erinnern, dass ich den Player auf der Basis von einen schon existierenden Player gebaut, der mit dem Unilink Protokol Treiber ausgeschtattet ist.[/lang_de]

[lang_ru]Так вот, я, что бы не разбирать на запчасти работающую систему, и побыстрее запустить плеер, просто надстроил модуль M-Bus над Unilink'ом. И, надо сказать, довольно таки неплохо получилось, и с минимальными доработками можно этот же плейер запустить и на магнитоле Sony. Надо только подключить Unilink модуль, о котором я расскажу как нибудь в следующий раз.[/lang_ru]

[lang_de]Und ich wollte nicht gut funktionierende System auseinanderbauen, und wollte den Player so schnell wie möglich zum Laufen bekommen. Dafür habe ich nur noch ein M-Bus Modul auf den Unilink Modul gesetzt. Ich muss sagen, diese Schema funktioniert recht gut. Und noch eine Vorteil — mit minimum der Anpassungen kann man den Player auch mit Sony Autoradio betreiebn. Mann mus nur Hardware Unilink Modul anschliessen. Darüber ezähle ich in menen anderen Artiklen.[/lang_de]

[lang_ru]И так, основные модули разглядели — начнем углубляться. И углубляться мы будем в протокол M-Bus. Потому как в самой прошивке опять же ничего особенного, много строчек кода и все.[/lang_ru]

[lang_de]So. Wir haben die meisten Module angecshaut. Fangen wir an uns zu vertiefen. Und verteifen werden wir in das M-Bus Protokol. Weil in der Firmware gibt es nicht viel Interessantes, nur viele Codezeile und das ist alles. [/lang_de]

[lang_ru]Значит так. На вот этом сайте — http://mazda.davidoshea.homelinux.net/radio/ есть, в принципе, вся основная информация об электрических и временных параметрах шины. Данные передаются последовательно по одному проводу. Напряжение на шине от 0 до 5 вольт. Нули и единицы кодируются длинной «нулевого» импульса.[/lang_ru]

[lang_de]Alos. Auf der Seite - http://mazda.davidoshea.homelinux.net/radio/ gibt es, im Prinzip, alle Information über elektrischen und zeitlichen Parametern des Busses. Die Daten werden seriell über eine Leitung übertragen. Die Spannung auf dem Bus liegt zwischen 0 und 5 Volt. Logik 0 und 1 sind mit der Länge der Impulse kodiert: [/lang_de]

  • [lang_ru]0 — 0.5 — 0.6 милисекунд[/lang_ru]
  • [lang_de]0 — 0.5 — 0.6 Millisekunden[/lang_de]
  • [lang_ru]1 — 1.7 — 1.9 милисекунд[/lang_ru]
  • [lang_de]1 — 1.7 — 1.9 Millisekunden[/lang_de]
  • [lang_ru]Длина одного бита — 2.9 — 3.0 милисекунды.[/lang_ru]
  • [lang_de]Ein Bit-Länge — 2.9 — 3.0 Millisekunden. [/lang_de]

[lang_ru] Там же описаны основные команды и параметры команд, которые бегают по шине.[/lang_ru]

[lang_de]Die meisten Kommanden, die auf dem Bus zu sehen sind, sind auch dort beschreiben.[/lang_de]

[lang_ru]В исходниках прошивки в файле MBus.c и MBus.h можно тоже найти куски кода, из которых можно выдрать информацию о том, какая команда и для чего служит. Но более полная информация пришла ко мне от уже упоминавшегося участника форума Mazda 3 с ником Slider. А именно — исходники проекта MBus Monitor. В этом проекте есть файл MBusProtocol.cpp, в котором есть вот такой вот кусок кода:[/lang_ru]

[lang_de]In der Sourcecode der Firmware, in der Dateien  MBus.c und MBus.h kann man die Teile finden, aus deren man die Information über einzelne Kommanden rauskratzen kann. Aber die größte Teil der Info habe ich von einem Mann bekommen, über den habe ich schon mal erzählt. Slider aus Mazda 3 Forum. Genau gesagtz ist die Info in der Sorcodes des Projektes MBus Monitor. In dem Projekt gibt es die Datei MBusProtocol.cpp, in der es solche Teil gibt:[/lang_de]

[codesyntax lang="c" lines_start="26" container="div" title="MBus Command Table" ]

static const tEntry aCodetable[] =
{
 { rPing, "58", "Ping" },
 { cPingOK, "D8", "Ping OK" },
 { cAck, "DF0000f", "Ack/Wait" }, // f0=0|1|6|7|9
 { cPreparing,  "D9 1t ti im ms sf f0 f", "Preparing" }, //f0=0:normal, f0=4:repeat one, f0=8:repeat all
 { cStopped,    "D92ttiimmssff0f", "Stopped" }, //f1=0:normal, f1=2:mix, f1=8:scan
 { cPaused,     "D93ttiimmssff0f", "Paused" }, // f3=1: play mode, f3=2:paused mode, f3|=8: stopped
 { cPlaying,    "D94ttiimmssff0f", "Playing" },
 { cSpinup,     "D95ttiimmssff0f", "Spinup" },
 { cForwarding, "D96ttiimmssff0f", "FF" },
 { cReversing,  "D97ttiimmssff0f", "FR" },
 { rPlay,    "51101", "Play" },
 { rPause,   "51102", "Pause" },
 { rStop,    "51140", "Stop" },
 { rScnStop, "51150", "ScanStop" },
 { rPlayFF,  "51105", "Play FF start" },
 { rPlayFR,  "51109", "Play FR start" },
 { rPauseFF, "51106", "Pause FF start" },
 { rPauseFR, "5110A", "Pause FR start" },
 { rResume,  "51181", "Play from current pos." },
 { rResumeP, "51182", "Pause from current pos." },
//	{ rNextMix, "5130A314", "next random" },
//	{ rPrevMix, "5130B314", "previous random" },
 { rSelect,  "513dttff", "Select" }, // f0=1:playing, f0=2:paused, f1=4:random
 { rRepeatOff, "51400000", "Repeat Off" },
 { rRepeatOne, "51440000", "Repeat One" },
 { rRepeatAll, "51480000", "Repeat All" },
 { rScan,      "51408000", "Scan" },
 { rMix,       "51402000", "Mix" },
 { cPwrUp, "DA0000000000", "some powerup?" },
 { cLastInfo,  "DB0dttfff0f", "last played" }, // f0=0:done, f0=1:busy, f0=8:eject, //f1=4: repeat1, f1=8:repeat all, f2=2:mix
 { cChanging4, "DB8d00fff0f", "Changing Phase 4" },
 { cChanging,  "DB9dttfff0f", "Changing" },
 { cNoMagzn,   "DBAd00f00ff", "No Magazin" },
 { cChanging2, "DBBd00fff0f", "Changing Phase 2" },
 { cChanging3, "DBCd00fff0f", "Changing Phase 3" },
 { cChanging1, "DBDd00fff0f", "Changing Phase 1" },
 { cStatus, "DCd01ttmmssf", "Disk Status" },
 { cStat1, "DD000fffff", "some status?" },
 { cStat2, "DE0000000", "some more status?" },
 // also seen:
 // 11191
};

[/codesyntax]

[lang_ru]Эта таблица используется в программе для составления и посылки команд магнитоле. Нас же интересует не сам процесс посылки — о нем я расскажу чуть позже, а именно сами команды. В таблице они немного «закодированы», и в программе потом происходит их парсинг, и подставновка нужных параметров в замен латинских буков нижнего регистра.[/lang_ru]

[lang_de]Diese Tabelle wird in dem Programm benutzt, um die Kommanden für den Head Unit zu gestalten. Und wir sind nur dafür interessiert, wie die Komanden selber aussehen. In der Tabelle sind die ein bisschen kodiert, und in dem Programm werden geparst, um die richtige Parametern statt der kleinen  Buchstaben zu setzten.[/lang_de]

[lang_ru]Автор был настолько любезен, что оставил комментарии с описанием основных параметров. От себя лишь добавлю, что тут команды приведены без последнего полбайта с проверочной суммой, потому как ее надо считать для каждого конкретного случая.[/lang_ru]

[lang_de]Der Autor war so nett und hat die Kommentaren hinterlassen, was jeder Parameter bedeutet. Man muss sagen, dass die Komanden hier ohne den letzten Byte dargestellt sind, den CRC-Byte. [/lang_de]

[lang_ru]Ок. Основные команды у нас есть. Теперь бы поглядеть, что происходит на самом деле на шине! Для таких особо любопытных читателей я снял логи с шины с помощью своего плеера и привожу их здесь.[/lang_ru]

[lang_de]So. Die meisten Kommanden haben wir. Jetzt wäre es hicht schlecht zu sehen, was auf dem Bus geschieht. Mit der Hilfe meines Players habe ich die Logs aufgezeichnet. [/lang_de]

[lang_ru]Разберемся с ними.[/lang_ru]

[lang_de]Gehen wir dei durch. [/lang_de]

[lang_ru]Первым делом мы включаем магнитолу с помощью поворота ключа зажигания в положение ACC ON, и на шине происходит следующее (строки, начинающиеся с «MBus R» — это то, что плеер получает по шине, а те, что начинаются с «MBus S» — это то, что мы шлем сами на шину) :[/lang_ru]

[lang_de]Als Erstes, wird den Head Unit eingeschaltet mid dem Drehen des Schlüssels in die Position ACC ON, und auf dem Bus kann man folgende Kommandos sehen (Zeilen, die mit «MBus R» anfangen, bedeuten vom Player empfangene Daten. «MBus S» bedeutet vom Player gesendene Daten): [/lang_de]

  1. MBus R: |58E|
  2. MBus S: |D86|
  3. MBus R: |780|
  4. MBus R: |28B|
  5. MBus R: |59D|
  6. MBus S: |DB94000000C8|
  7. MBus S: |DD123456000000FC05|
  8. MBus S: |DC40000000006|
  9. MBus S: |D9000040000000CD|
  10. MBus R: |5110127|
  11. MBus S: |D9501040000000C9|
  12. MBus S: |DC401999999FC|
  13. MBus S: |D940104000000015|
  14. MBus S: |D940104000100015|
  15. MBus S: |D940104000200017|

[lang_ru]«Голова» шлет всем пинг. Но он адресный. т.е. в первом полубайте стоит адрес получателя. Адрес нашего плеера 0×5. Адрес «головы» — 0xD. Итак, получив команду 0×58, мы отсылаем ответ 0xD8. Последний полубайт — это CRC (Строки 1 и 2). [/lang_ru]

[lang_de]Den HU sendet an allen den Ping. Das Kommando ist adressierbar, in den ersten Nibble ist die Adresse des Empfängers zu sehen. Unseres Players Adresse ist 0×5. HU´s Adresse ist 0xD. So, wenn wir das Kommando 0×58 bekommen haben, senden wir die Antwort 0xD8. Das letzte Nibble ist CRC-Byte (Zeilen 1 und 2)[/lang_de]

[lang_ru]Затем, если наш ответ на пинг был правильно понят «головой», то она нам когда нибудь пришлет команду Wake Up — 0×59. На что мы ей отвечаем набором из команд 0xDB94000000C, 0xDD123456000000FC0,  0xDC4000000000, 0xD9000040000000C (строки 5,6,7,8,9).[/lang_ru]

[lang_de]Danach, falls unsere Antwort von HU richtig erkannt wurde, werden wir einige Zeit später ein Kommando Wake Up — 0×59 bekommen. Darauf antworten wir mit der folgenden Kommandos 0xDB94000000C, 0xDD123456000000FC0,  0xDC4000000000, 0xD9000040000000C (Zeilen 5,6,7,8,9). [/lang_de]

[lang_ru]Смотрим, что они означают:[/lang_ru]

[lang_de]Dass ist die Bedeutung der Kommandos: [/lang_de]

[lang_ru]Команда 0xDB9, если смотреть на листинг таблицы команд вверху, означает Changing. Но как по мне, то мне так кажется — что это команда готовности. Потому как CD Changer, который встроенный в машину, тоже шлет такие команды, когда его играть попросят. И команда эта означает, что мы готовы играть диск с номером n, в нашем случае 4.[/lang_ru]

[lang_de]Das Kommando 0xDB9, laut der Tabelle aus dem oben genanten Programm,  bedeutet Changing. Aber ich bin der Meinung, dass das Komando die Bereitschaft zeigt. Weil der eingebaute CD Changer das gleiche Kommando sendet, wenn der zu Abspielen aufgefordet wird. Und das Kommando sagt dem HU, dass wir bereit sind, den Disk mit der Nummer n abzuspielen. In diesem Fall ist die Disknummer 4. [/lang_de]

[lang_ru]Далее, в команде 0xDD мы говорим, какие диски у нас есть (Строка 7). 123456 означает, что все диски на месте. По идее, эти цифры говорят «голове», какие диски вставлены в магазин, что бы зажечь соответсвтующий значек на дисплее. Я не пробовал выключить какой нибудь. Если кто попробует, отпишитесь в комментах. Я сам как нибудь тоже попробую.[/lang_ru]

[lang_de]Weiter, in dem Kommando 0xDD sagen wir dem HU, welche Disks haben wir (Zeile 7). 123456 bedeutet, dass alle Disks auf ihren Plätzten sind. Ich denke, dass diese Nummern zeigen dem HU, welche Disks in der Kassete des CD Changers vorhanden sind, damit der HU entsprechende Zeichen auf dem Display ansteuern kann. Ich habe noch nicht probiert die auszuschalten. Wenn jemand das machen wird, es wähere super, dass er dan in den Kommentaren darüber Info hinterlässt.[/lang_de]

[lang_ru]Следующая команда 0xDC (Строка 8). Этой командой именно в этом месте мы говорим голове, что есть такой диск, но мы его пока что не играем, и как подтверждение этого факта шлем команду 0xD9 (Строка 9) в которой указан только номер диска 4.[/lang_ru]

[lang_de]Das nächste Kommando ist 0xDC (Zeile 8). Mit dem Kommando in diesem Platzt sagen wir dem HU, dass es solche Disk gibt, aber wir spielen den noch nicht ab. Und als Beweis dafür, senden wir das Kommando 0xD9 (Zeile 9), in dem nur Disknummer 4 steht.[/lang_de]

[lang_ru]После всех этих команд, если они посланы в правильной последовательности и с правильными промежутками времени, мы должны, по идее, получить от «головы» команду Play — 0×511012 (строка 10).[/lang_ru]

[lang_de]Und wenn diese Kommandos wurde richtig gesendet (mit richtigen Verzögerungen, in der richtigen Reihenfolge), mussen wir von dem HU ein Kommando Play — 0×511012 (Zeile 10) bekommen. [/lang_de]

[lang_ru]Как только мы ее получили — говорим голове, что мы «раскручиваемся», командой SpinUp — 0xD95aabb (строка 11), где aa — номер дорожки bb — номер диска.[/lang_ru]

[lang_de]Sobald wir das Kommando  Play bekommen haben, «sagen» wir dem HU, dass wir «CD» aufdrehen mit dem Kommando SpinUp — 0xD95aabb (Zeile 11), wo aa — Tracknummer ist.[/lang_de]

[lang_ru]Далее посредством команды 0xDC сообщаем параметры диска. В данном случае я говорю «голове», что у меня диск с номером 4 имеет номер первой дорожки, равный 1, последней — 99. Продолжительность диска — 99 минут 99 секунд.[/lang_ru]

[lang_de]Und weiter, mit dem Kommando 0xDC teilen wir dem HU mit der Parametern des Disks — 99 Minuten, 99 Sekunden.[/lang_de]

[lang_ru]И далее, раз в секунду, выдаю команду статуса 0xD94 с номером дорожки 1, номером диска 4, и временем проигрывания.[/lang_ru]

[lang_de]Und weter jede Sekunde geben wir Kommando  0xD94 aus mit der Nummer des Tracks 1, der Nummer des Disks 4, und mit der abgelaufenen Zeit.[/lang_de]

[lang_ru]Все номера записаны в формате BCD, это означает, что, например в полубайтах времени, один полубайт может принимать максимальное значение — 9, а не 0xF, как мы привыкли.[/lang_ru]

[lang_de]Die Zeit ist in dem BCD Format zu übertragen. Das heißt, dass jede Nibble hat maximalen Wert von 9, und nicht von 0xF.[/lang_de]

[lang_ru]Вот такие вот дела.[/lang_ru]

[lang_ru]Пару слов о задержках. Между командами желательно делать задержки около 15-20 милисекунд. После приема команды от головы, которая требует ответа, необходимо так же выдержать те же 15-20 милисекунд перед ответом.[/lang_ru]

[lang_de]Ein paar Zeilen über die Zeitverzögerungen. Zwischen der Kommando wäre en sinvoll die Verzögerungen von ca 15-20 Millisekunden machen. Nach dem Empfang des Kommando vom HU, das die Antwort braucht, muss man auch eine Verzögerung für die selbe 15-20 Millisekunden zu setzen.[/lang_de]

[lang_ru]Ну и тут вот архивчик с логами с моего плеера. По названиям файлов, в принципе, понятно, когда и как они делались:[/lang_ru]

[lang_de]Und hier ist der Archiv mit der Logs von meinem Player. von der Namen der Dateien kann man sehen, was für ein Log ist drinn [/lang_de]

  1. [lang_ru]20090224213754_MBus_ACC_On.log — Последовательность команд после перевода ключа зажигания в АСС ON.[/lang_ru]
  2. [lang_de]20090224213754_MBus_ACC_On.log — Kommandos am Einschalten des Schlüssels in die Position АСС ON.  [/lang_de]
  3. [lang_ru]20090224213841_MBus_NextTrack.log —  Нажата кнопка — Следующая дорожка на магнитоле или на руле.[/lang_ru]
  4. [lang_de]20090224213841_MBus_NextTrack.log — Es wurde die Taste Weiter auf dem HU oder auf dem Lenkrad gedrückt[/lang_de]
  5. [lang_ru]20090224213915_MBus_PrevTrack.log — Соответственно — Предыдущая дорожка.[/lang_ru]
  6. [lang_de]20090224213915_MBus_PrevTrack.log — Das gleiche zurück.[/lang_de]
  7. [lang_ru]20090224213946_MBus_NextDisk.log — Следующий диск[/lang_ru]
  8. [lang_de]20090224213946_MBus_NextDisk.log — Nächste Disk[/lang_de]
  9. [lang_ru]20090224214014_MBus_PrevDisk.log — Предыдущий диск[/lang_ru]
  10. [lang_de]20090224214014_MBus_PrevDisk.log — Vorherige Disk[/lang_de]
  11. [lang_ru]20090224214041_MBus_FF.log — Нажата кнопка перемотки вперед[/lang_ru]
  12. [lang_de]20090224214041_MBus_FF.log —  vorwärts spulen[/lang_de]
  13. [lang_ru]20090224214119_MBus_REW.log — Перемотка назад[/lang_ru]
  14. [lang_de]20090224214119_MBus_REW.log — rückwärts spulen[/lang_de]
  15. [lang_ru]20090224214142_MBus_Rpt.log — Выбор режима повтора дорожки[/lang_ru]
  16. [lang_de]20090224214142_MBus_Rpt.log — Wiederholungsmodus gewält[/lang_de]
  17. [lang_ru]20090224214210_MBus_Rpt_vsCDIn.log — Кнопка режима повтора во время проигрывания CD.[/lang_ru]
  18. [lang_de]20090224214210_MBus_Rpt_vsCDIn.log -Wiederholungsmodus gewähl wärend der CD abgespielt wird[/lang_de]
  19. [lang_ru]20090224214310_MBus_Rdm_vsCDIn.log — Кнопка выбора режима Случайной дорожки во время проигрывания CD.[/lang_ru]
  20. [lang_de]20090224214310_MBus_Rdm_vsCDIn.log — Zufalsabspielen Modus gewählt[/lang_de]
  21. [lang_ru]20090224214348_MBus_FF_vsCDIbn.log — Кнопка перемотки вперед  во время проигрывания CD.[/lang_ru]
  22. [lang_de]20090224214348_MBus_FF_vsCDIbn.log — vorwärts spulen wärend der CD abgespielt wird[/lang_de]
  23. [lang_ru]20090224214431_MBus_Rew_vsCDIn.log — и, соответственно, назад.[/lang_ru]
  24. [lang_de]20090224214431_MBus_Rew_vsCDIn.log — und zurück[/lang_de]
  25. [lang_ru]20090224214508_MBus_CDtoExt.log —  процес смены от проигрывания дисков к проигрыванию плеера, т.е. нажали кнопку CD еще раз.[/lang_ru]
  26. [lang_de]20090224214508_MBus_CDtoExt.log —  umschalten von CD zum Player (CD Taste nochmal gedrückt)[/lang_de]
  27. [lang_ru]20090224214542_MBus_ExttoCD.log —  процес смены от проигрывания плеера к проигрыванию диска, т.е. нажали кнопку CD еще раз.[/lang_ru]
  28. [lang_de]20090224214542_MBus_ExttoCD.log —  umschalten von Plazer zum CD (CD Taste nochmal gedrückt)[/lang_de]

[lang_ru]Опишу некоторые моменты, точнее некоторые грабли, которые могут встретиться на пути покорения "головы[/lang_ru]"

[lang_de]E sgibt einige Momenten, die man wissen muss, um es zu schaffenden, dass HU uns versteht: [/lang_de]

[lang_ru]И так —  если «голова» не поймет команду 0xDC, то клавиши смены дорожки не будут работать. Почему так? Для начала рассмотрим команду смены дорожки. В приниципе смена дорожки или диска запрашивается одной командой 0x513abb1, в которой указывается номер диска a, или номер дорожки bb, которые играть надо. Узнать, что именно запросили, довольно просто. Поскольку у нас все диски и дорожки нумеруются от 1, то то, что менять не надо, будет равно 0. И если «голова» не знает параметров диска, т.е. не была принята по какой то причине команда 0xDC, то при нажатии кнопок смены дорожки никаких команд слаться не будет.[/lang_ru]

[lang_de]Wenn HU das Kommando 0xDC nicht versteht, die  Track-wechel-Tasten werden nicht funktionieren. warum ist es so? als erstes schauen wir das Kommando genauer an. Das Track wechel wird mit dem Kommando 0x513abb1 aufgefordet, wo a — Disknummer, und bb — Track nummer, was gespillt werden soll. Erkennen, was genau zu spilen aufgefordet, ist leicht. Alle Disks und Tracks sind von 1 numeriert, und das, was man nicht ändern muss, ist gleich 0 in dem Kommando. Und wenn HU weißt nicht, wie viel Tracks gibt es auf dem gerade abspielenen Disk (das Kommando 0xDC wurde falsch übertragen), wir der HU das Kommando nicht schiecken.[/lang_de]

[lang_ru]Вот. Теперь самое интересное. Куда менять — определяем по номеру того, что нас просят сыграть. Т.е. в команде будет указан конкретный номер диска или дорожки.[/lang_ru]

[lang_de]So. Jetzt das interessanteste. Aud dem Kommando stellt man fest, in welche Richtung blättern wir die Tracks. [/lang_de]

[lang_ru]Отсюда можно догадаться, что количество дисков ограничено 9-ю, а количество дорожек — 99-ю. Как быть? Ведь я в начале статьи писал количество плейлистов, которые у нас вытупают в качестве дисков для головы, там было что то около 112! Я особо долго не думал, и сделал просто — делю номер текущего плейлиста на максимальное количество дисков, которые переваривает голова, и прибавляю остаток — так получаем номер диска, который надо подсветить. То же самое делаю с номером файла, так как у нас намного больше файлов, чем 99.[/lang_ru]

[lang_de]Und wenn wir das Kommando genauer anschauen, werden wir feststellen, dass maximale Anzahl der Tracks mit 99 begrenzt ist, und Disks — 9 . Am Anfang der Artikel habe ich die maximale mögliche Anzahl der Disks gescrieben — 112!  Der Trick dabei ist, dass ich die Nummer des gerade spielendes Disks Teile durch 6 — so bekomme ich die Disknummer, der wir an den HU reporten. Dasselbe wird mit der Nummer des Tracks gemacht, weil wir viel mehr MP3-Dateien haben, als 99.[/lang_de]

[lang_ru]Преимущества такого метода заключаются в том, что голова «думает», что мы играем какой то из дисков, А мы можем точно сказать, о каком номере думает «голова», и соответственно, когда прийдет команда на смену диска или дорожки, мы точно можем сказать, немного посчитав на калькуляторе, куда нам листать диски/дорожки, вперед или назад.[/lang_ru]

[lang_de]Vorteile von der Methode sind die, dass HU denkt, dass wir einen bestimten Disk abspielen, und wir können genau sagen welches Disk ist es, und an welcher Nummer denkt HU, dadurch wir könen genau sagen wohin zu blättern, wenn wir das Kommando Track Wechsel bekommen. [/lang_de]

[lang_ru]Еще одно преимущество такого метода перед многим известными  приставками XCarLink and Co. в том, что мы не ограничены 6ю дисками и не ограничены 99 файлами.[/lang_ru]

[lang_de]Noch eine Vortel davon  ist das, dass die Anzahl der Disks ist nicht auf 6 begrenzt, und Anzahl der Tracks nicht auf 99 begrenzt. [/lang_de]

[lang_ru]Есть, правда, один недостаток. Глядя на дисплей от магнитолы нельзя точно сказать, какой именно «диск» (читай, плейлист) играет, и какая именно дорожка в нем. Для этого можно будет глянуть на дисплей плеера — на него я вывожу название плейлиста, номер и название файла во время проигрывания.[/lang_ru]

[lang_de]Es gibt aber eine Nachteil. Wenn man das Display anschaut, kann man nicht genau feststellen, welcher Track oder welcher Disk gerade gespielt wird. Dafur gibt es aber das Display auf dem Player selbst, wo ich die Information zeige.[/lang_de]

[lang_ru]Немного про кнопку режима повтора проигрывания ( к кнопке режима Случайной дорожки это тоже относится).[/lang_ru]

[lang_de]Und ein bisschen über den Repead-Modus-Knopf (das ist auch über das Modus Zufal Track). [/lang_de]

[lang_ru]Когда я записывал логи, я сначала записал реакцию этой кнопки в момент, когда играл плеер. У меня пока нету никакой обработки этой кнопки, и после нажатия ее, «голова» выдала ее три раза с интервалом в 3 секунды. Я уже заметил, что если «голове» что то не нравится, она повторяет последнюю команду три раза.[/lang_ru]

[lang_de]Wenn ich den Datenstrom aud dem Bus gelogt, ich habe zuerst die Reacktion auf den Knopf aufgezeichnet, wenn mein Player aktiv war. Ich habe keine Bearbeitung für den Knopf, und das HU hat das Kommando 3 Mal wiederholt. Ich habe schon mal bemerkt, dass wenn dem HU irgendwass nicht gefählt, wiederholt das HU das letzte Kommando 3 mal.[/lang_de]

[lang_ru]Так было и тут: я записал нажатие этой кнопки в момент проигрывания CD, и увидел, что голова ожидала от меня изменения флага в команде статуса:[/lang_ru]

[lang_de]Genau so war es hier — ich habe die Reaktion auf denKnofp afgezeichnet, auch wenn CD abgespielt wurde, und habe gesehen, was das HU von mir erfartet hat: [/lang_de]

  1. MBus R: |E940802032600010|
  2. MBus R: |61440008|
  3. MBus R: |E94080203264001C|
  4. MBus R: |E95080200004001E|
  5. MBus R: |E94080200004001D|
  6. MBus R: |E94080200014001E|
  7. MBus R: |E94080200024001F|
  8. MBus R: |E940802000340010|
  9. MBus R: |E940802000440019|
  10. MBus R: |61400004|
  11. MBus R: |E94080200040001D|

[lang_ru]Как вы видите из полубайтов времени (выделены жирным), песенка была уже почти спета, но тут мы нажали кнопку Repeat, и она пошла с начала, но уже один бит (подчеркнут) выдавался не так как раньше. Повторное нажатие привело к тому, что бит был сброшен. Вот именно этого бита и ожидала от моего плеера «голова», и я теперь знаю, что мне надо делать![/lang_ru]

[lang_de]Als Sie sehen können, das Lied war schon fast zu Ende, aber wir haben  den Knopf Repeat gedruckt, und das Lied wurde von Anfang an abgespielt, aber ein Bit (untergestriechen) wurde geändert. Wenn man den Knopf zweites Mal betätight wird, wird das Bit gelöscht. Genau auf dem Bit hat HU von mir gewartet. Und jetzt weiss ich, was ich tun muss. [/lang_de]

[lang_ru]Примерно так же я определил, что делать при нажатии кнопки перемотки вперед.[/lang_ru]

[lang_de]Ungefähr so habe ich festgestellt, wass man machen muss, wenn den Knopf FF betätigt wird. [/lang_de]

  1. MBus R: |E940102003500018|
  2. MBus R: |E940102003600015|
  3. MBus R: |6110421|
  4. MBus R: |E960102003600008|
  5. MBus R: |E960102003700007|
  6. MBus R: |E96010200380000A|
  7. MBus R: |E960102003900009|
  8. MBus R: |E960102004100008|
  9. MBus R: |E960102004200005|
  10. MBus R: |E960102004400003|
  11. MBus R: |E96010200480000F|
  12. MBus R: |6110126|
  13. MBus R: |E960102005000008|
  14. MBus R: |E940102005300018|
  15. MBus R: |E940102005400011|

[lang_ru]В данном случае клавиша перемотки была нажата и удерживалась некоторое время. Момент нажатия виден в строке 3. А отпустил я ее в строке 12. Между этими событиями от CD проигрывателя к голове шла команда 0xE96 и статус с быстро меняющимся временем.[/lang_ru]

[lang_de]In dem Fahl wurde den Knopf betätigt und gedruckt gehalten einiger Zeit. Moment der Betätigung sieht man in der Zeile 3. Losgelassen wurde den Knpf in Zeile 12. Dazwieschen hat CD Speiler das Kommando 0xE96 geschickt mit sehr schnell geänderter Zeiten.[/lang_de]

[lang_ru]Процесс смены проигрывателя, т.е. если играл CD и была нажата кнопка CD, то будет включен чейнджер, в нашем случае наш плеер, и на оборот можно посмотреть в логах.[/lang_ru]

[lang_ru]Еще одно замечание. Если какие то команды шлются не в свое время, или с большой задержкой, то «голова» постоянно норовит отключить аудио вход. Когда я разбирался с задержками, я еще не знал, что их надо слать именно через 15, максимум 20 мс. И слал их примерно через 100 мс, так «голова» не понимала мою команду конфигурации диска, и отключала кнопки перемотки дорожек. Я все думал, в чем же дело и решил попробовать послать эту команду два раза подряд. Так вот — это «голове» категорически не нравилось и она, сначала включив аудиовход, тут же его выключала, но потом, видя, что вроде процесс шел нормально, включала снова.[/lang_ru]

[lang_de]Noch eine Bemerkung. Wenn irgend ein Kommando nich in richtige Zeitpunkt oder nicht in richtige Reienfolge gesendet wird, wird HU ständig Audio Line In abschalten. Wenn ich die Verzeugerungen getunet hatte, wusste ich noch nicht, dass die Kommandos mit der Zeitverzögerung von 15 Millisekunden senden muss. Und habe die in 100 Millisekunden erst geschickt. Dadurch hat HU mein Kommando CD Konfiguration nicht verstanden, und hat die Möglichkeit des Blättern der Tracks abgeschaltet. Ich hatte versucht das Kommando 2 Mal hinter einander zu schiecken. Das hat HU überhaupt nicht gefahlen, und das HU hat den Line In abgeschaltet, aber einige sekunden später sah, dass alles scheint gut zu sein, schaltete den Line In wieder ein.[/lang_de]

[lang_ru]Но сейчас такого уже не наблюдается.[/lang_ru]

[lang_de]Jetzt ist es nicht mehr dedr Fahl. [/lang_de]

[lang_ru]Ну и для затравки пара фоток того, как выглядит дисплей с включенным входом от чейнджера. Здесть надо сказать «Та Даааа!»:[/lang_ru]

[lang_de]Und hier ein parr Fotos, wie das Display aussieht, wenn Line In eingeschaltet ist. Hier muss man «Ta daaaa!» sagen!: [/lang_de]

Аудиовход Чейнджера активирован!

Аудиовход Чейнджера активирован!

[lang_ru]А вон там вон в коробочке живет мой плеер. Корпуса пока что нету.[/lang_ru]

[lang_de]Und dort in der Karton wohnt mein Player. Es gibt noch keine Gehäse dazu. [/lang_de]

Плеер в коробочке

Плеер в процессе

[lang_ru]Где то в статье я обещался рассказать про то, каким образом мы в программе посылаем команды, и каким — принимаем. Об этом в следующий раз, а то тут довольно много текста получилось. Немного терпения![/lang_ru]

[lang_de]Irgendwo in der Atickel habe ich versprochen über den Sende- und Empfangsprozess zu erzählen. Darüber ist in weiteren Folgen, weil hier ist schon zu viel Text geworden. Ein bischen Gedult! [/lang_de]

[lang_ru]Напоследок список файлов, описанных в статье:[/lang_ru]

[lang_de]Und wie immer, die Dateiliste: [/lang_de]

4 комментария to “Mazda MP3 Player — Продолжение 2|Mazda MP3 Player — Zweite Folge”

  1. kindrat Says:

    Небольшой вопрос по M-BUS'у. Решил себе спаять переходник с M-BUS на iPhone для цивика (там родная магнитола Alpine с M-BUS). M-BUS по идее однопроводной, но в разъеме чейнджера два контакта — Tx+ Tx- . По идее, тот что минус должен быть землей, но он с землей не связан. Если мерить мультиметром, то при подаче питания на магнитолу на Тх+ и Тх- по 2 вольта относительно земли, если подать еще 12 вольт на контакт «АСС» в разъеме чейнджера, то на Тх+ Тх- по 4 с мелочью вольта. Пробовал подсоединять к ком-порту (подключал Тх- на землю, Тх+ на UART ардуины) — тишина, даже мусора никакого не ловится... Куда копать чтоб оживить выход чейнджера?

    Сейчас вот думаю купить мегу 128-ю, спаять логический анализатор и им поглядеть.

    P.S. Распиновка магнитолы s15.radikal.ru/i189/1005/25/c8581e926d06.gif

  2. MasterAlexei Says:

    Я тут с коллегой посоветовался и мы думаем, что это все же дифференциальный вход/выход.

    Чего с ним делать, таже не представляю. Вам надо посмотреть именно осциллографом на него. Мультиметр все импульсы просто сглаживает.

    Так что — осциллограф — наше все 🙂

  3. kindrat Says:

    Осцилографа, к сожалению, нет 🙁 А логический анализатор тут не поможет?

  4. MasterAlexei Says:

    Теоретически — ЛогАнализатор поможет. Практически — нужно знать, сколько вольт там у сигнала логические уровни (простой вольтметр этого НЕ покажет).

    Потому что, например, у мазды там логическая 1 — 12 вольт. Так что там скорее всего делитель надо сделать вам. Ну и посмотреть оба сигнала TX+ TX- относительно земли. Скорее всего на один из них будет инвертирован относительно другого.

Leave a Reply

You must be logged in to post a comment.