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 adlerdev
Upewnić 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ć
./configure
z opcjami wedle uznania (patrz./configure --help
). Oficjalna binarka była kompilowana z:--target-list=x86_64-softmmu
Wykonać
make
Zainstalować 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: INTR
Rejestr 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_ENABLE
Rejestr 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_PTR
Wskaź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_SIZE
Rozmiar 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 (
INTR
będzie miał wartość 1).BAR0 + 0x0010: SUM
Obecna 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
INTR
jest wyzerowany, aINTR_ENABLE
włączonyzapisać do
SUM
wartość początkową sumyzapisać do
DATA_PTR
wskaźnik na danezapisać do
DATA_SIZE
rozmiar danychczekać na przerwanie
wyzerować przerwanie (zapisać 1 do
INTR
)