.. _adlerdev: ========================== 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: :download:`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: 1. Sklonować repozytorium https://github.com/mwkmwkmwk/qemu 2. ``git checkout adlerdev`` 3. Upewnić się, że są zainstalowane zależności: ``ncurses``, ``libsdl``, ``curl``, a w niektórych dystrybucjach także ``ncurses-dev``, ``libsdl-dev``, ``curl-dev`` (nazwy pakietów mogą się nieco różnić w zależności od dystrybucji) 4. Uruchomić ``./configure`` z opcjami wedle uznania (patrz ``./configure --help``). Oficjalna binarka była kompilowana z:: --target-list=x86_64-softmmu 5. Wykonać ``make`` 6. Zainstalować wykonując ``make install``, lub uruchomić bezpośrednio (binarka to ``x86_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, a ``INTR_ENABLE`` włączony - zapisać do ``SUM`` wartość początkową sumy - zapisać do ``DATA_PTR`` wskaźnik na dane - zapisać do ``DATA_SIZE`` rozmiar danych - czekać na przerwanie - wyzerować przerwanie (zapisać 1 do ``INTR``)