So, meine liebe Leserinen und Leser, sie haben es geschaft, die zweite Folge der Saga über dem Mazda MP3 Player ist da!
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.
So. Hier ist ein Blochbild der Firmware
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.
Zur Info — jetzige Firmware ist in der Lage folgende Menge zu verdauen:
- Maximale Anzahl der Dateien in einer Verzeichniss — 496
- Maximale Anzahl der Dateien auf der Disks insgesamt — 12412
- Maximale Anzahl der Playlists *.M3U — 112
- Maximale Anzahl der Dateien in einem Playlits — 3276
Also. Dateien Datenbank ist nichst anderes als einpaar der SRAM Banks mit der Information über die Plazierung der Dateine auf der Festplate.
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.
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!
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.
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.
Und das interessanteste - Anschluß an Aussenwelt - Unilink Interface Module.
Manche Lesern werden jetzt wiedersprechen, dass es keinen Unilink und vor Allem Sony im Mazda gibt! Richtig, gibt es keins davon.
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.
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.
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.
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:
- 0 — 0.5 — 0.6 Millisekunden
- 1 — 1.7 — 1.9 Millisekunden
- Ein Bit-Länge — 2.9 — 3.0 Millisekunden.
Die meisten Kommanden, die auf dem Bus zu sehen sind, sind auch dort beschreiben.
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:
- 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
- };
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.
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.
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.
Gehen wir dei durch.
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):
- MBus R: |58E|
- MBus S: |D86|
- MBus R: |780|
- MBus R: |28B|
- MBus R: |59D|
- MBus S: |DB94000000C8|
- MBus S: |DD123456000000FC05|
- MBus S: |DC40000000006|
- MBus S: |D9000040000000CD|
- MBus R: |5110127|
- MBus S: |D9501040000000C9|
- MBus S: |DC401999999FC|
- MBus S: |D940104000000015|
- MBus S: |D940104000100015|
- MBus S: |D940104000200017|
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)
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).
Dass ist die Bedeutung der Kommandos:
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.
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.
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.
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.
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.
Und weiter, mit dem Kommando 0xDC teilen wir dem HU mit der Parametern des Disks — 99 Minuten, 99 Sekunden.
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.
Die Zeit ist in dem BCD Format zu übertragen. Das heißt, dass jede Nibble hat maximalen Wert von 9, und nicht von 0xF.
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.
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
- 20090224213754_MBus_ACC_On.log — Kommandos am Einschalten des Schlüssels in die Position АСС ON.
- 20090224213841_MBus_NextTrack.log — Es wurde die Taste Weiter auf dem HU oder auf dem Lenkrad gedrückt
- 20090224213915_MBus_PrevTrack.log — Das gleiche zurück.
- 20090224213946_MBus_NextDisk.log — Nächste Disk
- 20090224214014_MBus_PrevDisk.log — Vorherige Disk
- 20090224214041_MBus_FF.log — vorwärts spulen
- 20090224214119_MBus_REW.log — rückwärts spulen
- 20090224214142_MBus_Rpt.log — Wiederholungsmodus gewält
- 20090224214210_MBus_Rpt_vsCDIn.log -Wiederholungsmodus gewähl wärend der CD abgespielt wird
- 20090224214310_MBus_Rdm_vsCDIn.log — Zufalsabspielen Modus gewählt
- 20090224214348_MBus_FF_vsCDIbn.log — vorwärts spulen wärend der CD abgespielt wird
- 20090224214431_MBus_Rew_vsCDIn.log — und zurück
- 20090224214508_MBus_CDtoExt.log — umschalten von CD zum Player (CD Taste nochmal gedrückt)
- 20090224214542_MBus_ExttoCD.log — umschalten von Plazer zum CD (CD Taste nochmal gedrückt)
"
E sgibt einige Momenten, die man wissen muss, um es zu schaffenden, dass HU uns versteht:
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.
So. Jetzt das interessanteste. Aud dem Kommando stellt man fest, in welche Richtung blättern wir die Tracks.
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.
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.
Noch eine Vortel davon ist das, dass die Anzahl der Disks ist nicht auf 6 begrenzt, und Anzahl der Tracks nicht auf 99 begrenzt.
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.
Und ein bisschen über den Repead-Modus-Knopf (das ist auch über das Modus Zufal Track).
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.
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:
- MBus R: |E940802032600010|
- MBus R: |61440008|
- MBus R: |E94080203264001C|
- MBus R: |E95080200004001E|
- MBus R: |E94080200004001D|
- MBus R: |E94080200014001E|
- MBus R: |E94080200024001F|
- MBus R: |E940802000340010|
- MBus R: |E940802000440019|
- MBus R: |61400004|
- MBus R: |E94080200040001D|
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.
Ungefähr so habe ich festgestellt, wass man machen muss, wenn den Knopf FF betätigt wird.
- MBus R: |E940102003500018|
- MBus R: |E940102003600015|
- MBus R: |6110421|
- MBus R: |E960102003600008|
- MBus R: |E960102003700007|
- MBus R: |E96010200380000A|
- MBus R: |E960102003900009|
- MBus R: |E960102004100008|
- MBus R: |E960102004200005|
- MBus R: |E960102004400003|
- MBus R: |E96010200480000F|
- MBus R: |6110126|
- MBus R: |E960102005000008|
- MBus R: |E940102005300018|
- MBus R: |E940102005400011|
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.
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.
Jetzt ist es nicht mehr dedr Fahl.
Und hier ein parr Fotos, wie das Display aussieht, wenn Line In eingeschaltet ist. Hier muss man «Ta daaaa!» sagen!:
Und dort in der Karton wohnt mein Player. Es gibt noch keine Gehäse dazu.
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!
Und wie immer, die Dateiliste:
- Player-Firmware — mazdamp3player_v_1_0.rar
- M-Bus Logs — mbuslogs.rar
- MBus Monitor Projekt — cd_bus_monitor_dongle.rar
- Die alternative Beschreibung der Kommandos auf M-Bus — mazda-3-radio-system-bus.mht
4 комментария к “Mazda MP3 Player — Zweite Folge”
Оставить комментарий или два
Пожалуйста, зарегистрируйтесь для комментирования.
10th November 2010 в 20:37
Небольшой вопрос по 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
11th November 2010 в 19:15
Я тут с коллегой посоветовался и мы думаем, что это все же дифференциальный вход/выход.
Чего с ним делать, таже не представляю. Вам надо посмотреть именно осциллографом на него. Мультиметр все импульсы просто сглаживает.
Так что — осциллограф — наше все
14th November 2010 в 10:22
Осцилографа, к сожалению, нет А логический анализатор тут не поможет?
14th November 2010 в 11:13
Теоретически — ЛогАнализатор поможет. Практически — нужно знать, сколько вольт там у сигнала логические уровни (простой вольтметр этого НЕ покажет).
Потому что, например, у мазды там логическая 1 — 12 вольт. Так что там скорее всего делитель надо сделать вам. Ну и посмотреть оба сигнала TX+ TX- относительно земли. Скорее всего на один из них будет инвертирован относительно другого.