Jump to content
Sign in to follow this  
MietasSR

Kwestia mobilnych Radeonów i modyfikacja framebuffera ATI

Recommended Posts

Okej, start ;)

Dzisiaj opiszę problem, z którym boryka się 99% posiadaczy mobilnych Radeonów serii 5xxx i (być może) 6xxx. Odkryłem sposób na pełne uruchomienie naszych kart, co najważniejsze - czynność wcale nie jest trudna, choć może tak wyglądać :)

Zaczynamy.

 

A więc, po odpaleniu systemu z GraphicsEnablerem jest czarny ekran z podświetleniem.

Dlaczego tak się dzieje?

GraphicsEnabler z Chameleona ładuje do mobilnych grafik (tyczy się to głównie serii 5xxx którą ludzie przywykli w ten sposób odpalać) framebuffer do zwykłych desktopowych układów. Skutkuje to tym, że obraz z VGA jest mirrorowany na LVDS - po podłączeniu zewnętrznego monitora pojawia się na nim obraz. W większości przypadków wystarczy zrobić injekcję EDID (o tym będzie w innym wątku) i zmienić rozdzielczość na prawidłową naszej matrycy.

Jednak takie rozwiązanie przynosi wiele problemów: bardzo często będziemy mieli na ekranie dość mocne artefakty, nie będzie działał sleep, usypianie monitora, nie będziemy też mogli w żaden sposób załadować AppleBacklightDisplay a co za tym idzie - regulację jasności z poziomu systemu możemy sobie odpuścić.

 

Prawidłowe rozwiązanie

Rozwiązanie jest tak proste, że aż śmieszne :) - dziwię się że nikt wcześniej na to nie wpadł, oraz że dochodziłem do tego prawie rok.

Potrzebujemy ATY_Init, w którym zmieniamy edytorem hex ID karty na nasze (kext przygotowany pod Radeona 5650 w załączniku). W kextcie o którym mowa jest ID 0x68C1 , czyli przygotowane pod Radeona HD 5650M. Podmieniamy je na swoje ID - uwaga, występuje 2 razy. Kolejnym krokiem który musimy wykonać jest podmiana EDID na swój - znajduje się on w pliku Info.plist, w gałęzi Radeon 4600 Series, klucz AAPL00,override-no-connect. W kextcie jest już dodany patch duallink - właściciele laptopów z rozdzielczością powyżej 1366x768 powinni się ucieszyć :)

Po takich modyfikacjach grafika nam odpali w 99% - będziemy mieli problemy z niektórymi aplikacjami, np. odtwarzaczem DVD. Aby uruchomić ją do końca - musimy zmodyfikować framebuffer.

 

 

Patch framebuffera

To już takie proste nie jest, jednak też nie jest wcale trudne. Trzeba wiedzieć co się robi - i tyle. Podejrzewam że większości z Was patch wyjdzie za pierwszym razem - czynność wcale trudna nie jest.

Co będzie potrzebne?

- narzędzia radeon_bios_decode i redsock_bios_decoder (w załączniku)

- działającego OS X

- BIOS naszej karty

 

Będę wzorował się na karcie z serii 5xxx, i będziemy modyfikować framebuffer Hoolock który ma oryginalnie 3 wejścia: 2xDisplayPort i DVI.

Tak wygląda on w oryginale:

00 04 00 00 04 06 00 00 00 01 00 00 21 03 05 01 
00 04 00 00 04 06 00 00 00 01 00 00 11 02 04 02 
04 00 00 00 14 02 00 00 00 01 00 00 02 04 01 03

 

Mała rozpiska co za co odpowiada:

00 04 00 00 - connector-type - część odpowiedzialna za rozpoznanie typu gniazda, w tym przypadku DisplayPort.

04 06 00 00 - tzw. ATY,ControlFlags - odpowiada za sterowanie pracą monitora który jest podłączony do danego portu. WAŻNE!

00 01 - features - ustawienia funkcji podłączonego monitora,

00 00 - nikt nie wie co to jest,

21 - Transmitter, wartość bardzo ważna, ustala miejsce w jakim gniazdo jest podłączone do karty,

03 - Encoder ID, podobna wartość do Transmitter (są ze sobą powiązane!),

05 - Hotplug ID, wartość która ustala kolejność kart w personalizacji - polecam liczyć od 00 po kolei przy modyfikacji,

01 - Sense ID - ostatecznie rozpoznanie podłączenia gniazda do układu, nie aż tak ważne, ale jednak.

 

Rozpiska możliwych ustawień:

connector-type

LVDS - 02 00 00 00
DVI - 04 00 00 00
VGA - 10 00 00 00
S-Video - 80 00 00 00
DisplayPort - 00 04 00 00
HDMI - 00 08 00 00

 

ATY,ControlFlags (wartości wybieramy doświadczalnie)

LVDS: 40 00 00 00 / 00 01 00 00
DVI: 14 00 00 00 / 14 02 00 00
VGA: 10 00 00 00
S-Video: 02 00 00 00
DisplayPort: 04 02 00 00 / 04 06 00 00
HDMI: 00 02 00 00

 

features (tyczy się głównie laptopów, w przypadku desktopów polecam zostawić 00) (wartości się sumują!)

ekran wbudowany: 0x01
używa podświetlenia: 0x08

przy laptopach używa się 09 01 , przy desktopach - 00 01.

 

Resztę wartości musimy ustawić zgodnie ze swoją kartą graficzną.

 

Teraz część praktyczna. Wrzucamy BIOS naszej karty, radeon_bios_decode i redsock_bios_decoder do jednego katalogu. Uruchamiamy terminal, przechodzimy do tego katalogu, i wydajemy polecenia:

chmod +x *decode*
./radeon_bios_decode < nazwa_pliku_z_biosem > radeon.txt
./redsock_bios_decoder < nazwa_pliku_z_biosem > redsock.txt

 

Po tym, w danym katalogu pojawią się 2 pliki: radeon.txt i redsock.txt. Przykładowa zawartość obu (na podst. mojej karty):

radeon.txt:

ATOM BIOS Rom: 
SubsystemVendorID: 0x1025 SubsystemID: 0x036d 
IOBaseAddress: 0x3000 
Filename: BR37698.001 
BIOS Bootup Message: 
Acer JV52_CP PARK XT DDR3 64Mx16/128Mx16 512MB/1GB 

PCI ID: 1002:68e0 
Connector at index 0 
Type [@offset 45254]: LVDS (7) 
Encoder [@offset 45258]: INTERNAL_UNIPHY (0x1e) 
i2cid [@offset 45328]: 0x96, OSX senseid: 0x7 
Connector at index 1 
Type [@offset 45264]: HDMI-A (11) 
Encoder [@offset 45268]: INTERNAL_UNIPHY1 (0x20) 
i2cid [@offset 45351]: 0x90, OSX senseid: 0x1 
Connector at index 2 
Type [@offset 45274]: VGA (1) 
Encoder [@offset 45278]: INTERNAL_KLDSCP_DAC1 (0x15) 
i2cid [@offset 45378]: 0x93, OSX senseid: 0x4

 

najważniejsze dla nas z tego pliku są wartości: 0x7, 0x1 i 0x4. Zapisujemy sobie je gdzieś, przy okazji odnotowując którego portu się tyczą (u mnie odpowiednio LVDS, HDMI i VGA).

 

redsock.txt:

BR37698.001 : 

Acer JV52_CP PARK XT DDR3 64Mx16/128Mx16 512MB/1GB 

Subsystem Vendor ID: 1025 
Subsystem ID: 36d 
Object Header Structure Size: 199 
Connector Object Table Offset: 34 
Router Object Table Offset: 0 
Encoder Object Table Offset: 99 
Display Path Table Offset: 12 
Connector Object Id [14] which is [LVDS] 
encoder obj id [0x1e] which is [iNTERNAL_UNIPHY (osx txmit 0x10 [duallink 0x0] enc 0x0)] linkb: false 
Connector Object Id [12] which is [HDMI_TYPE_A] 
encoder obj id [0x20] which is [iNTERNAL_UNIPHY1 (osx txmit 0x11 [duallink 0x1] enc 0x2)] linkb: false 
Connector Object Id [5] which is [VGA] 
encoder obj id [0x15] which is [iNTERNAL_KLDSCP_DAC1 (osx txmit 0x00 enc 0x10?)] linkb: false

 

z tego pliku najważniejsze są wartości txmit i enc, oczywiście zapisujemy je odnotowując do jakiego portu należą, przykład:

LVDS: txmit 0x10, enc 0x0
HDMI: txmit 0x11, enc 0x2
VGA: txmit 0x00, enc 0x10

 

Sumujemy dane zebrane z obu plików, co daje nam (przykład):

LVDS: txmit 0x10, enc 0x0, senseid 0x7
HDMI: txmit 0x11, enc 0x2, senseid 0x1
VGA: txmit 0x00, enc 0x10, senseid 0x4

 

Mając te dane, mamy już prawie kompletną personalizację :)

txmit to pole Transmitter (0x10 = 10), enc to Encoder ID (0x0 = 00), senseid to Sense ID (0x7 = 07).

 

Przykładowa zmodyfikowana personalizacja:

02 00 00 00 40 00 00 00 09 01 00 00 10 00 00 07 
00 08 00 00 00 02 00 00 00 01 00 00 11 02 01 01 
10 00 00 00 10 00 00 00 00 01 00 00 00 10 02 04

 

Kto będzie chciał rozczyta sobie z tego przykładu jak powinna wyglądać personalizacja, i w sumie do tego dążyłem.

 

Kiedy będziemy już mieli zmodyfikowaną personalizację, po prostu podmieniamy hexedytorem oryginalne wartości na nasze zmodyfikowane (zamieniając oczywiście całymi ciągami). Mój przykład tyczy się framebuffera Hoolock, który jest wykorzystywany do kart serii 5xxx, czyli modyfikujemy kexta ATI5000Controller.

 

 

Po zapisaniu obu kextów wrzucamy je do /S/L/E, naprawiamy uprawnienia, usuwamy cache, wyłączamy GraphicsEnablera (jeśli był włączony) i restartujemy system. Po restarcie powinniśmy ujrzeć pięknie działającą grafikę, z QE/CI i wszystkimi innymi dobrodziejstwami typu sleep etc.

 

UWAGA!

Po modyfikacji framebuffera, musimy również zmienić w ATY_Init odniesienia z ATY,RadeonFramebuffer (podstawowy framebuffer który jednak nie daje pełni możliwości) na ATY,nazwa_fb_który_modyfikujemy.

 

Wyciąganie personalizacji z kextów

 

Potrzebne rzeczy:

- Xcode

- skrypt ati-personality.pl autorstwa bcc9

 

Polecam skrypt przenieść do katalogu domowego.

 

Odpalamy terminal, po czym: (zakładam że skrypt jest w katalogu domowym)

chmod +x ati-personality.pl
./ati-personality.pl > personality.txt

 

W pliku personality.txt znajdziemy wszystkie personalizacje jakie znajdują się w kextach systemowych.

 

Skrypt w załączniku.

 

Wiedza którą posiadam pochodzi z:

- świetnego tematu na insanelymac, z rozpiską funkcji framebuffera ATI, autorstwa @mucha:

http://www.insanelymac.com/forum/topic/252061-mobility-radeon-hd-4650full-resolution-with-qe-ci-working-on-internal-lvds-screen/

- tematu @bcc9 również na insanelymac, w którym po raz pierwszy został poruszony temat modyfikacji framebuffera i w którym znajduje się skrypt radeon_bios_decode oraz ati_personality.pl (który pozwala wyciągać personalizacje z kextów), polecam dla rozwinięcia wiedzy, świetna lektura:

http://www.insanelymac.com/forum/topic/249642-editing-custom-personalities-for-ati-radeon-hd45xxx/

- na pomysł z injekcją EDID przez AAPL00,override-no-connect wpadłem dzięki Cloverowi - brawa dla @Slice za chęci i stworzenie tego świetnego bootloadera.

 

Powodzenia w wykonywaniu własnych modyfikacji! :)

 

[ Komentarz dodany przez: 314TeR: 2013-01-05, 18:46 ]

Polecam też zapoznać się z tym tutorialem:

http://rampagedev.wordpress.com/2012/12/12/editing-atiamd-framebuffer-personalities/

Jest w nim zawarte parę dodatkowych informacji, które uzupełniają powyższy poradnik.

narzedzia.zip

ATY_Init.kext.zip

ati-personality.pl.zip

Share this post


Link to post
Share on other sites

Dziękuję za pochwałę. :)

Powiem jeszcze tylko tyle: będę dopisywał rzeczy których zapomniałem (a na pewno są takie, taki już jestem, zapominam). Wydaje mi się że napisałem to w miarę przejrzyście i każdy wyczyta sobie z tego to, co najważniejsze.

W razie jakichkolwiek pytań pisać tutaj, postaram się w miarę moich możliwości i wiedzy na nie odpowiedzieć. :)

Aktualnie potwierdzone przypadki działania to:

- eMachines E730G (ta sama karta jest w Acer Aspire 5740G/5742G), Radeon 5470, rozdzielczość natywna 1366x768

- Sony Vaio VPCEC3M1E, Radeon 5650, rozdzielczość natywna 1600x900 (epic win! ;) ).

Share this post


Link to post
Share on other sites

Z tym, że do wyciągnięcia personalizacji z kextów potrzebne jest Xcode, a dokładniej narzędzie które się w nim znajduje - otool... jednak faktycznie, przydałby się opis wykonania tego kiedy już Xcode jest - się dopisze.

Share this post


Link to post
Share on other sites
314TeR, ja to mogę wyciągnąć z Info.plist ATY_Init... jednak wydaje mi się że lepszym rozwiązaniem jest te ATY_Init.

Nie jestem przekonany, nie wiemy co i jak wstrzykuje sama binarka... Zrób zrzut darwindumperem i porównaj to co masz w dumpie z tym co masz w pliście...

Share this post


Link to post
Share on other sites
Dziękuję za pochwałę. :)

Powiem jeszcze tylko tyle: będę dopisywał rzeczy których zapomniałem (a na pewno są takie, taki już jestem, zapominam). Wydaje mi się że napisałem to w miarę przejrzyście i każdy wyczyta sobie z tego to, co najważniejsze.

W razie jakichkolwiek pytań pisać tutaj, postaram się w miarę moich możliwości i wiedzy na nie odpowiedzieć. :)

Aktualnie potwierdzone przypadki działania to:

- eMachines E730G (ta sama karta jest w Acer Aspire 5740G/5742G), Radeon 5470, rozdzielczość natywna 1366x768

- Sony Vaio VPCEC3M1E, Radeon 5650, rozdzielczość natywna 1600x900 (epic win! ;) ).

 

Ja ze swojej strony potwierdzę co wyżej kolega napisał, z jego pomocą około tygodnia temu udało mi się odpalić na moim VPCEC3M1E 5650m z 1600x900 z działającymi external złączami, czego poprzednio w żaden inny sposób nie udało mi się uruchomić.

 

Dzięki!

Share this post


Link to post
Share on other sites

Zadziała na HD4330, spróbuj najpierw wystartować za pomocą GraphicsEnablera z parametrem ATIConfig=Shrike, jeśli nie zadziała to modyfikujesz ATI4600Controller i framebuffer Shrike.

Część o wyciąganiu personalizacji jest w trakcie tworzenia... proszę uzbroić się w cierpliwość.

 

EDIT: Okej, wyciąganie personalizacji jest opisane w pierwszym poście. Teraz jest już chyba wszystko co trzeba :)

Share this post


Link to post
Share on other sites

Super opis, ale ja nie umie sobie z tym poradzić, mam sony vaio vpcec2m1e, więc powinno chodzić, coś robię zle, w związku z tym mam prośbę czy ktoś mógłby podesłać mi kexty do radeon 5650m, który jest w moim Vaio.

Pozdrawiam

Share this post


Link to post
Share on other sites

Wrzuc do systemu ATY_Init z zalacznika z pierwszego postu. Oczywiscie musisz zmienic EDID w kextcie! Na Sony nie jestes w stanie prawidlowo zmodyfikowac framebuffera, musisz zadowolic sie "proteza".

 

PS. Przepraszam za brak polskich znakow, ale pisze z klawiatury ktora nie ma prawego Alt :(

Share this post


Link to post
Share on other sites

Dzięki, udało mi się uruchomić ale bez QE/CI, nie wiem w którym miejscu podmienić EDID, chyba już jestem za stary na takie zabawy :)

 

To i tak wielkie osiągnięcie, od dwóch lat walczyłem co jakiś czas aby uruchomić tę kartę.

Share this post


Link to post
Share on other sites
Kolejnym krokiem który musimy wykonać jest podmiana EDID na swój - znajduje się on w pliku Info.plist, w gałęzi Radeon 4600 Series, klucz AAPL00,override-no-connect.

 

Jesteś pewien, że wyłączyłeś GraphicsEnablera i włączasz system w normalnym trybie (tzn. bez -x)? Bo QE/CI po podgraniu tego ATY_Init powinno zatrybić.

Share this post


Link to post
Share on other sites
Kolejnym krokiem który musimy wykonać jest podmiana EDID na swój - znajduje się on w pliku Info.plist, w gałęzi Radeon 4600 Series, klucz AAPL00,override-no-connect.

 

Jesteś pewien, że wyłączyłeś GraphicsEnablera i włączasz system w normalnym trybie (tzn. bez -x)? Bo QE/CI po podgraniu tego ATY_Init powinno zatrybić.

 

Tak, mam na pewno wyłączony, ale nie wiem jaki mam swój EDID :oops:

NIe wiem czy chodzi o 0x68c1?

Share this post


Link to post
Share on other sites
EDID to 128-bitowy identyfikator ekranu. Musisz go wyciągnąć pod Windowsem.

 

A czy można to zrobić pod OS X lub Linuksem?

 

Bo rozumiem, że do instalacji karty trzeba:

1. Wgrać ATY_Init(co jeśli tam już jest ID karty? W sensie, że jest tam wiele ID w tym ID mojej, nadal muszę zmieniać w tych dwóch miejscach?), wcześniej jeszcze w Info.plist tegoż pliku zmienić EDID

2. Edytować framebuffer

3. Ponownie edytować ATY_Init

 

i koniec?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.