Zum Inhalt wechseln





Foto
* * * * * 2 Stimmen

[Guide] Anleitung patch AppleHDA

Geschrieben von MacPeet , 16 Oktober 2015 · 8.364 Aufrufe

AppleHDA patch Anleitung codec_dump Tutorial hackintosh Guide layout platforms PinConfig
[Guide] Anleitung patch AppleHDA

Einfache allgemeine Anleitung zum patchen der AppleHDA



Vorwort:
In vielen oft nur englischen Artikeln wird anhand vieler Zahlen und damit verbundener Rechnerei dieser Weg erklärt. Ich versuche es daher etwas einfacher darzustellen, so dass vielleicht auch nicht-Bit and Byte-Profis etwas näher an diese Sache herangeführt werden. Daher verwende ich im Zuge dieser Anleitung absichtlich viele Hilfsprogramme, auch wenn natürlich einiges davon auch via Terminal und HexEditor zu machen wäre.
Ferner sehe ich es nicht so gern, wenn meine mit viel Mühe erstellten Anleitungen quasi 1:1 in anderen Foren auftauchen.

Was brauchen wir dafür:
Angehängte Datei  Tool_Paket_patch_AppleHDA.zip (12,46MB)
Mal heruntergeladen: 1138




Schritt 1 - codec_dump


Wer sich damit auskennt, kann diesen Schritt übergehen.
Als erstes brauchen wir einen sogenannten Codec Dump von einem Linux-System. Dabei reicht eine Linux-Live-Boot-CD-Variante (z.B. Ubuntu) völlig aus. Wir müssen also Linux nicht auf unseren Rechner installieren. Ich werde hier auch nicht erklären, wie man eine Linux-Live erstellt, denn dazu gibt´s Anleitungen ohne Ende im Netz.

Wir booten unseren Rechner nun mit der Linux-Live, öffnen dort das Terminal und geben folgendes ein:

einfacher Weg:
cd ~/Desktop && mkdir CodecDump && for c in /proc/asound/card*/codec#*; do f="${c/\/*card/card}"; cat "$c" > CodecDump/${f//\//-}.txt; done && zip -r CodecDump.zip CodecDump
oder auch einzeln:
cat /proc/asound/card0/codec#1 > ~/Desktop/codec_dump.txt
oder
cat /proc/asound/card0/codec#0 > ~/Desktop/codec_dump.txt
oder
cat /proc/asound/card1/codec#0 > ~/Desktop/codec_dump.txt
usw.
Die erzeugten Dateien werden auf dem Schreibtisch abgelegt und nach Weg 1 erhalten wir in etwas dies:
Eingefügtes Bild
Es handelt sich dabei einmal um den Dump unseres AudioDevices, welchen wir brauchen und zusätzlich um einen Dump der Grafikkarte(HDMI).
Wir speichern uns diese Dateien auf einen Stick und können nun wieder unser OSX starten, wo wir damit weiter arbeiten.

nächste erforderliche Schritte:


- wir installieren die graphviz-2.39.20150329.0445.pkg (oder neuere Version) aus dem Tool-Paket auf unserem OSX-System
- wir kopieren den Ordner "codecgraph" aus dem Tool-Paket auf unseren Schreibtisch (Desktop)
- wir öffnen die Datei für unser Device aus unserem Linux-Dump


Eingefügtes Bild

Dort sehen wir schon einmal, wir haben hier z.B. ein ALC888.
Die CodecAdresse ist 0 (meist 0 oder 2, brauchen wir später)
Die Zeile "AFG Function Id: 0x1 (unsol 1)" löschen wir, weil diese beim Wandeln Probleme macht und speichern die Datei ab.
Diese Datei hier im Beispiel "card0-codec#0.txt" benennen wir nun um in "codec_dump.txt" und kopieren diese in den Ordner "codecgraph", welcher ja nun auf dem Desktop liegt.

Wir geben nun nacheinander folgende Befehle im Terminal ein:
cd ~/Desktop/codecgraph
./codecgraph codec_dump.txt
chmod +x ./convert_hex_to_dec.rb
./convert_hex_to_dec.rb codec_dump.txt.svg > ~/Desktop/codecgraph/codec_dump_dec.txt.svg
./convert_hex_to_dec.rb codec_dump.txt > ~/Desktop/codecgraph/codec_dump_dec.txt
./Verbit codec_dump.txt> verbs.txt
Nun haben wir im Ordner "codecgraph" neue Dateien, wie "codec_dump_dec.txt", "codec_dump_dec.txt.svg" und "verbs.txt" liegen, die wir später brauchen.


Schritt 2 - Der Binary-Patch


Wer sich damit auskennt, kann diesen Schritt übergehen. Grundsätzlich kann man auch eine bereits gepatchte AppleHDA nehmen, wenn sie zum ALC und zur OSX-Version passt und sich den Binary-Patch ebenfalls sparen.

Für alle anderen geht´s hier weiter. Der allererste Schritt sollte immer sein, die originale AppleHDA zu sichern. Wir kopieren uns also diese aus S/L/E irgendwohin, aber bitte nicht auf den Schreibtisch. Nun kann es losgehen.

Wir benutzen wie eingangs schon erwähnt absichtlich ein Tool dafür, speziell "HDA Wizard 2.0" aus dem Tool-Paket. Das Tool kann auch noch viel mehr, jedoch wollen wir ja Schritt für Schritt lernen.

Eingefügtes Bild

Unser im Beispiel ALC888 stellt sich aus DeviceID und VendorID nun so dar: 088810EC
Unter Yosemite und auch El Capitan ist es die Device-Adresse 198B11D4 (evtl. kann es auch die 198411D4 sein) die wir mit unserer Device-Adresse ersetzen müssen. Warum dies so ist soll uns an dieser Stelle nicht weiter jucken. Ferner wird es manchmal nötig andere Devices abzudrehen (auf 00000000), in unserem Beispiel 088410EC, 088510EC und unter EL Capitan auch 198311D4 und unter Sierra auch 198A11D4. Im folgenden sehen wir, dass die Zahlen dort verdreht sind. Warum im Binary-Bereich ein sogenannter Byte-Flip nötig ist braucht uns aber hier jetzt auch nicht jucken, Hauptsache Ihr macht es richtig. Nun geben wir die folgenden Zeilen nacheinander im "HDA Wizard 2.0" so wie auf dem Bild ein und drücken jeweils auf Patch. Immer nur eine der Zeilen und warten bis die App fertig ist. Einen evtl. Hinweis auf einen Neustart können wir ignorieren.
's|\x8b\x19\xd4\x11|\x88\x08\xec\x10|g'

optional:
's|\x84\x08\xec\x10|\x00\x00\x00\x00|g'
's|\x85\x08\xec\x10|\x00\x00\x00\x00|g'
für El Capitan zusätzlich
's|\x83\x19\xd4\x11|\x00\x00\x00\x00|g'
für macOS 10.12 zusätzlich
's|\x8A\x19\xd4\x11|\x00\x00\x00\x00|g'
Die 8319d411, die in Capitan gebraucht wird kann bei Sierra wieder entfallen, bzw. wird dort nicht mehr gebraucht.

Bis hierhin alles verstanden? Alles geklappt? Prima

Ok, der Binary-Patch ist nun fertig und wir kopieren uns die halbfertige AppleHDA.kext aus S/L/E auf unseren Schreibtisch.

Anmerkung: Dies war natürlich nur ein Beispiel anhand des ALC888, jedoch ist es mit anderen Chipsätzen oft genauso zu behandeln. Manchmal sind auch andere Werte abzudrehen, oder sogar keine der im Beispiel angegebenen. Alle weiteren Fragen dazu können wir aber im root86 AppleHDA patch Thread klären.
Natürlich können Fortgeschrittene es auch via Terminal oder via HexEditor (Find/Replace) machen.

Schritt 3 - Die PinConfig


Nun nehmen wir uns die Datei "verbs.txt" aus unserem CodecDump vor und holen uns die Verbs die wir brauchen.

Eingefügtes Bild

Das farblich gekennzeichnete brauchen wir und dann erhalten wir diese Zahlenketten:
Eingefügtes Bild
In unserem Beispiel nehmen wir die Zeichenkette der Modifizierten Verbs und fügen diese oben im "PinConfigurator" aus dem Tool-Paket ein.
Dann drücken wir auf "Parse data". Das weitere Vorgehen sollte das Bild erklären.

Eingefügtes Bild
In unserem Fall wissen wir nun schon mehr:

Inputs
18 ist das interne Mic
24 ist das externe Mic
26 ist LineIn

Outputs
20 sind die Kopfhörer
23 sind die internen Lautsprecher
30 ist SPDIF Out

und wir haben nun folgende PinConfig erhalten:
01471c10 01471d10 01471e21 01471f01 01871c30 01871d10 01871ea1 01871f01 01271c40 01271d00 01271ea3 01271f90 01771c50 01771d00 01771e13 01771f90 01a71c60 01a71d10 01a71e81 01a71f01 01e71c70 01e71d10 01e71e45 01e71f01

Manche Rechner verwenden EAPD (external amplifier power down) zur Aktivierung des Anschlusses. Dies können wir der "codec_dump_dec.txt" entnehmen. EAPD kann entweder auf den Speakern oder auf dem Headphone liegen. In unserem Fall hat Headphone EAPD 2 und wir fügen folgendes zu unserer PinConfig an:
01470C02 (CodecAdresse 0, Node in Hex 14, hier nun 70 statt der 71 bei den anderen Zahlenreihen, C und 02 für EAPD=2)

Endergebnis unserer PinConfig:
01471c10 01471d10 01471e21 01471f01 01470C02 01871c30 01871d10 01871ea1 01871f01 01271c40 01271d00 01271ea3 01271f90 01771c50 01771d00 01771e13 01771f90 01a71c60 01a71d10 01a71e81 01a71f01 01e71c70 01e71d10 01e71e45 01e71f01


Mit dem kleinen Tool "HexDecBin" aus dem Tool-Paket können wir unser Device in eine Dezimalzahl wandeln, die wir im weiteren Verlauf brauchen.
Eingefügtes Bild
Somit haben wir den Dezimalwert 283904136

Nun gehen wir nach AppleHDA.kext/Contents/PlugIns/AppleHDAHardwareConfigDriver.kext/Contents und öffnen die dortige "Info.plist".

Eingefügtes Bild

So sollte es dann fertig aussehen:

Eingefügtes Bild
Den Eintrag 0 behalten wir, die anderen können gelöscht werden. Sie können auch bleiben, aber es sollte darin keine LayoutID sein, die wir benutzen.
Nun richten wir es in etwas so ein wie oben auf dem Bild.
Bei ConfigID tragen wir unseren umgerechneten Dezimalwert 283904136 ein.
Bei ConfigData geben wir die ganze Zeichenkette vom Endergebnis der PinConfig ein, welche wir ja eben erzeugt haben.
FuncGroup steht immer auf 1
Bei LayoutID tragen wir 1 ein, welche wir später ja für den Inject verwenden wollen.
Wenn alles fertig ist noch abspeichern und das Thema PinConfig ist erst einmal durch.

Nur zum Vergleich hier die Anschlüsse einiger Desktop-Rechner. Hierbei liegen z.B. die Mic´s natürlich nicht intern an, sondern an Front und Back. In der Regel haben wir aber oft zumindest 4 Anschlüsse (Mic, LineIn, LineOut und Headphone).

Beispiel 1
Eingefügtes Bild

Beispiel 2
Eingefügtes Bild

Schritt 4 - layout(xx).xml.zlib und Platforms.xml.zlib auf den Schreibtisch holen


In unserem Fall kopieren wir nun aus unserer AppleHDA.kext/Contents/Resources die Datei layout1.xml.zlib (weil wir in diesem Fall LayoutID=1 verwenden wollen) und die Datei Platforms.xml.zlib und legen diese ebenfalls auf dem Schreibtisch ab. Mit den zlib´s können wir nicht arbeiten, daher müssen wir diese erst konvertieren. Dazu starten wir "HDA Wizard 1.6" aus unserem Tool-Paket, klicken dort auf "Convert" und ziehen beide Dateien nacheinander auf diese App.

Eingefügtes Bild

Nun siehts auf unserem Schreibtisch so aus:
Eingefügtes Bild
Für die fortgeschritten Junkies gehts auch so:
cd ~/desktop
perl zlib.pl inflate layout1.xml.zlib> layout1.xml (Unzip)
perl zlib.pl deflate layout1.xml> layout1.xml.zlib (compress)

perl zlib.pl inflate Platforms.xml.zlib> Platforms.xml (Unzip)
perl zlib.pl deflate Platforms.xml> Platforms.xml.zlib (compress)

Schritt 5 - layout(xx).xml


Beispiel "Layout.xml", entweder die auf dem Schreibtisch bearbeiten, oder diese hier verwenden/anpassen für Eure Zwecke:
Angehängte Datei  layout1.xml (12,31K)
Mal heruntergeladen: 428


Eingefügtes Bild

Viele layout´s in gepatchten HDA´s sehen in etwa so aus wie auf dem Bild, mit teilweise noch weiteren Einträgen, bzw. sollten in etwa so aussehen. Hier alles zu erklären würde aber für den Anfang zu weit führen. Es ist immer ganz gut, wenn man sich die Layout-Dateien aus fertig gepatchten HDA´s ansieht und vergleicht. Das Wissen darüber kommt von ganz allein, je mehr man sich damit beschäftigt. Wollt Ihr mit einer anderen LayoutID arbeiten, dann benennt die Datei einfach um, z.B. in layout12.xml
Bearbeiten können wir die Datei z.B. mit dem PlistEditPro

Wichtig für uns ist hier erst einmal nur:

- bei CodecID tragen wir wieder unser Device in Dezimalwert ein, also 283904136
- bei PathMapID nehmen wir in unserem Fall 888 (Hier könnte auch eine andere Fantasiezahl stehen. Wichtig ist nur, dass sie später in der Plattform.xml gleich ist)
- Speichern, fertig


Hinweis: gewisse Dinge sind nur durch Test´s zu klären. Für einige Chipsätze, bzw. Rechner, z.B. bei vielen Laptop´s von HP ist es notwendig die Werte bei MuteGPIO auf 0 zu setzen, da Ihr sonst nicht alle Geräte des AudioChip´s zum Laufen bekommt.


Schritt 6 - Platforms.xml


Beispiel "Platforms.xml", entweder die auf dem Schreibtisch bearbeiten, oder diese hier anpassen für Eure Zwecke:
Angehängte Datei  Platforms.xml (43,26K)
Mal heruntergeladen: 495

Bis jetzt wissen wir bereits:

Inputs
18 ist das interne Mic
24 ist das externe Mic
26 ist LineIn

Outputs
20 sind die Kopfhörer
23 sind die internen Lautsprecher
30 ist SPDIF Out

Nun müssen wir noch die Nodes-Ketten herausfinden. Dafür nehmen wir uns die Textdatei "codec_dump_dec.txt" und die Datei "codec_dump_dec.txt.svg" vor. Letztere können wir z.B. im Browser öffnen.

In der Textdatei suchen wir nun unseren Node 20 für unseren Kopfhörer (HP) und sehen in dem Abschnitt unten den Node 12. Dann scrollen wir hoch zu Node 12 und sehen dort den Node 2. Das gleiche sehen wir auch in der svg-Datei (siehe Beispielbilder).
HP hat bei uns also 20-12-2
Gleiches machen wir mit unseren Speakern Node 23 und SPDIF Node30 und wir finden 23-15-5 und 30-6.

Also unsere Outputs haben:
20-12-2
23-15-5
30-6

Angehängtes Bild Angehängtes Bild Angehängtes Bild

Nun noch die Inputs. Bei den Inputs ist es oft etwas schwerer, da es in der Textdatei teilweise nicht so offensichtlich ist. Daher schaue ich auch in die svg-Datei.

Angehängtes Bild

Angehängtes Bild

Die Inputs werden immer in umgekehrter Reihenfolge in die "Platforms.xml" eingetragen. Somit erhalten wir:
8-35-24
9-34-18
8-35-26

Nun tragen wir es in die "Platforms.xml" ein. Nehmt die Bilder zur Hilfe!

Inputs: Angehängtes Bild

Outputs: Angehängtes Bild

Im Beispiel sehen wir, dass z.B. die Werte für Kopfhörer und interne Lautsprecher in einer Obergruppe eingetragen sind. Dies nennen wir Switch-Mode, d.h. es ist später immer nur ein Anschluss aktiv und unser OSX erkennt, wenn wir den Kopfhörer einstecken. Man könnte dies auch auf zwei Obergruppen verteilen, dann müsste man die Anschlüsse später manuell schalten. Bei einigen Desktops muss man es so machen, wenn z.B. LineOut hinten und Kopfhörer vorn gesteckt sind klappt die Automatik oft nicht. Bei den Inputs ist dies auch so, wie wir ja sehen können.

oft sieht es aber wenigstens so aus im Switch-Mode:

Obergruppe 0
0 Die Nodes des ersten Inputs (0,1 und 2)
1 Die Nodes des zweiten Inputs (0,1 und 2)
Obergruppe 1
0 Die Nodes des ersten Outputs (0,1 und 2)
1 Die Nodes des zweiten Outputs (0,1 und 2)


im Manual-Mode dann so:

Obergruppe 0
0 Die Nodes des ersten Inputs (0,1 und 2)
Obergruppe 1
0 Die Nodes des zweiten Inputs (0,1 und 2)
Obergruppe 2
0 Die Nodes des ersten Outputs (0,1 und 2)
Obergruppe 3
0 Die Nodes des zweiten Outputs (0,1 und 2)

Anmerkung:
In der Regel hat so eine Kette immer 3 Werte nach dem Muster: Node 20 (Pin Complex) -> 12 (​Audio Selector/Mixer) -> 2 (Audio Output Node)
Manchmal sind es aber auch nur 2 Werte wie z.B. bei SPDIF, wo die Werte sehr oft 30-6 sind.
Manchmal ist es aber auch so, dass die Kette aus mehr als 3 Werten besteht, z.B. 4 oder gar 5, was man nur durch Testen herausfinden kann, wenn ein Anschluss nicht angesprochen wird.


Schritt 7 - Der Abschluss


Wir konvertieren unsere layout1.xml und Platforms.xml wieder zurück zu layout1.xml.zlib und Platforms.xml.zlib nach dem Verfahren siehe Schritt 4.
Beide zlib-Dateien legen wir nun zurück nach AppleHDA.kext/Contents/Resources und überschreiben die dort vorhandenen Originale.

Unsere nun fertige AppleHDA auf dem Schreibtisch installieren wir nun z.B. mittels Kext Utility (oder vergleichbare Tools) nach S/L/E, erneuern den Cache, z.B. mit:
sudo kextcache -prelinked-kernel
Falls noch nicht passiert: Wir erweitern unsere DSDT mit folgendem Eintrag unter "Device PCI0" für unseren Inject mit LayoutID 1.
Device (HDEF)
{
Name (_ADR, 0x001B0000)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x08)
{
"built-in",
Buffer (One)
{
0x00
},
"layout-id",
Buffer (0x04)
{
0x01, 0x00, 0x00, 0x00
},
"PinConfigurations",
Buffer (Zero) {},
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}
Nun machen wir ggf. zwei Neustarts (kann auch schon nach einem funktionieren) und schauen was für Devices bei den AudioEinstellungen gehen.
Wenn´s nicht geklappt hat sind vielleicht noch kleine Änderungen an der PinConfig, bzw. bei den Nodes nötig.

Schlusswort:
Bei gängigen Chipsätzen ist es oft recht leicht bis zur fertigen AppleHDA zu gelangen, jedoch bei manch exotischen Rechnern, bzw. Boards, kann man nur mit viel Geduld und vielen Tests zum Ziel kommen. An einer meiner Lösungen habe ich gut 14 Tage gesessen mit gefühlten 1000 Neustarts. Also nicht gleich aufgeben, wenn´s nicht auf Anhieb klappt.

good luck

Weitere Hilfe dann hier: #1

:rootie:

Angehängte Grafiken

  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild
  • Angehängtes Bild





Dezember 2019

S M D M D F S
12345 6 7
891011121314
15161718192021
22232425262728
293031