2016-08-19 38 views
7

Próbuję zrozumieć część userland na Raspberry Pi graficznego kodu sterownika z https://github.com/raspberrypi/userlandwewnętrznego działania z Raspberry Pi sterownika graficznego przestrzeni użytkownika (nie firmware lub część jądra)

mojego zrozumienia tak daleko jest: - firmware blob działa na GPU i oferuje interfejs podobny do OpenGL, który na niższych poziomach opiera się na komunikacie (tablicy bajtów) przechodzącym nad jednym z wielu 28-bitowych słów FIFO o nazwie VCHIQ (inne kolejki VCHIQ są nieistotne dla grafika) - w części procesora połączenia OpenGL są przekształcane w komunikaty dla GPU. Dostęp do obiektu niskiego poziomu (kolejki komunikatów lub VCHIQ - nie znalazłem jeszcze tej części w kodzie) wymaga modułu jądra Linux, ale nie ma tam logiki wysokiego poziomu. - część GPU jest zamknięta, ale to jest w porządku dla moich celów. Częścią procesora (ARM) jest, AFAIK, otwarty

Moim ostatecznym celem jest uzyskanie komunikacji z procesorem GPU pracującym na gołym metalu (bez Linuksa), ale z zamkniętym blobem oprogramowania wbudowanego. Jako pierwszy cel chcę zrozumieć, jak połączenie OpenGL jest faktycznie przekazywane do GPU. Coś poza tym nie jest częścią tego pytania.

Jednak utknąłem w znalezieniu właściwego kodu dla tego. Wywołania OpenGL używają RPC_CALL *, a z kolei RPC_DO, który wywołuje khronos_server_lock_func_table(). Jednak tej funkcji brakuje w kodzie i ku mojemu zaskoczeniu nie mogłem znaleźć nic przydatnego w Google.

Moje pytania: - czy nadal używam procesora ARM, czy też przeprowadziłem się do obszaru GPU, nie zauważając? Jeśli to drugie, to gdzie przekroczyłem tę linię? - Zakładając, że wciąż jestem po stronie procesora - gdzie jest kod dla tej funkcji? Czy jest w ogóle otwarty, czy też mamy tu zamknięte części po stronie procesora? Wszystkie źródła w sieci zdają się wskazywać, że kod procesora jest w 100% otwarty. - w którym momencie implementacja funkcji C OpenGL rzeczywiście wysyła komunikat do GPU? W pewnym momencie oczekuję wywołania funkcji jądra, która reprezentuje VCHIQ w pewnym momencie, prawdopodobnie zaimplementowana jako plik urządzenia.

Odpowiedz

1

Nie do końca rozumiem, w jaki sposób zamierzasz uzyskać dostęp do GPU bez korzystania z Linuksa, a ja nie jestem zaznajomiony z technikami, ale jakiś czas temu wkopałem się w GPU dla mojego prywatnego projektu, więc Powiem ci to, co wiem.

GPU to VideoCore IV, a jego dokumentacja jest dostępna pod numerem Broadcom's website.

Również na the Raspberry Pi Wiki widać na obrazku po lewej, że VCHIQ jest w sterowniku jądra, więc możesz szukać szczegółów implementacji w kodzie źródłowym jądra.

Może to może być również pomocne: VideoCore IV Programmer's Manual. Informacje o dokumencie:

To niezależny projekt dokumentacji oparty na połączeniu analizy statycznej z próbą i błędem na rzeczywistym sprzęcie. Ta praca jest w 100% niezależna i nie jest usankcjonowana ani powiązana z Broadcom lub jego agentami. Żadne dokumenty ani materiały Broadcom nie były używane poza publicznie dostępnymi.

Jeśli chodzi o samo oprogramowanie, The Khronos Group zapewnia implementację OpenGL ES i OpenVG, ale nie jest to open source. Możesz pobrać dokumentację ze swojej strony internetowej, ale wątpię, czy znajdziesz coś na tak niskim poziomie.

Mam nadzieję, że to pomaga.

+0

AFAIK, implementacja OpenGL funkcjonuje wewnątrz kodu oprogramowania układowego GPU, którego nie jestem zainteresowany. Ale gdzie dokładnie przebiega granica pomiędzy CPU i GPU? Czy khronos_server_lock_func_table() jest częścią kodu CPU lub GPU? –

+0

Dwa dokumenty, z którymi się łączyłeś, wydają się opisywać sprzęt GPU, co jest interesujące samo w sobie i przydatne, gdybym miał napisać własną wymianę oprogramowania GPU. Ale niestety nie znalazłem tam nic, jak rozmawiać z istniejącym oprogramowaniem. –

+0

Przeszukałem kod jądra i nie zawiera on khronos_server_lock_func_table(). Nie jestem tym zaskoczony, ponieważ i tak nie można wywoływać funkcji w kodzie jądra z przestrzeni użytkownika. Kod jądra wydaje się implementować interfejs poziomu komunikatów. Pozostają zatem pytania: W jaki sposób połączenia OpenGL są tłumaczone na wiadomości? Gdzie są zdefiniowane typy wiadomości? –