Przykładowe urządzenie PCI¶
Przykładowe urzadzenie służy do sprzętowego liczenia sumy kontrolnej Adler-32. Dostarczamy je jako zmodyfikowaną wersję qemu.
Sterownik do przykładowego urządzenia: adlerdev.tar.gz
QEMU¶
Do użycia przykładowego urządzenia wymagana jest zmodyfikowana wersja qemu, dostępna w wersji źródłowej.
Aby skompilować zmodyfikowaną wersję qemu, należy:
Sklonować repozytorium https://github.com/mwkmwkmwk/qemu
git checkout adlerdevUpewnić się, że są zainstalowane zależności:
ncurses,libsdl,curl, a w niektórych dystrybucjach takżencurses-dev,libsdl-dev,curl-dev(nazwy pakietów mogą się nieco różnić w zależności od dystrybucji)Uruchomić
./configurez opcjami wedle uznania (patrz./configure --help). Oficjalna binarka była kompilowana z:--target-list=x86_64-softmmu
Wykonać
makeZainstalować wykonując
make install, lub uruchomić bezpośrednio (binarka tox86_64-softmmu/qemu-system-x86_64).
Urządzenie¶
Urządzenie jest podłączane do komputera przez szynę PCI –
identyfikator producenta to 0x0666, a identyfikator urządzenia to
0x0a32.
Urządzenie ma 5 rejestrów:
BAR0 + 0x0000: INTRRejestr stanu przerwań. Przy odczycie, ma wartość 1 jeśli urządzenie zgłasza przerwanie, bądź 0, jeśli nie zgłasza. Aby odpowiedzieć na przerwanie (i spowodować, że urządzenie przestanie zgłaszać przerwanie), należy zapisać 1 do tego rejestru. Należy też zapisać 1 do tego rejestru przy starcie urządzenia (urządzenie może na starcie zgłaszać przerwanie).
BAR0 + 0x0004: INTR_ENABLERejestr włączenia przerwań, do odczytu i zapisu. Jeśli ma wartość 1, urządzeniu wolno zgłaszać przerwanie. Jeśli ma wartość 0, urządzenie nie będzie zgłaszało przerwania PCI (przerwanie wciąż będzie widoczne w rejestrze
INTR).BAR0 + 0x0008: DATA_PTRWskaźnik na dane do przetworzenia, do odczytu i zapisu. W trakcie przetwarzania danych, urządzenie będzie automatycznie zwiększało ten wskaźnik.
BAR0 + 0x000c: DATA_SIZERozmiar danych do przetworzenia, do odczytu i zapisu. Zapisanie do tego rejestru niezerowej wartośći spowoduje natychmiastowe rozpoczęcie przetwarzania danych. W trakcie przetwarzania, urzadzenie będzie automatycznie zmniejszało ten rejestr. Gdy całe dane zostaną przetworzone (i ten rejestr spadnie do zera), zostanie zgłoszone przerwanie (
INTRbędzie miał wartość 1).BAR0 + 0x0010: SUMObecna suma. Przed przetworzeniem danych, należy tu wpisać wartość początkową sumy. W miarę przetwarzania danych, urządzenie aktualizuje sumę.
Aby przetworzyć dane, należy:
upewnić się że
INTRjest wyzerowany, aINTR_ENABLEwłączonyzapisać do
SUMwartość początkową sumyzapisać do
DATA_PTRwskaźnik na danezapisać do
DATA_SIZErozmiar danychczekać na przerwanie
wyzerować przerwanie (zapisać 1 do
INTR)