Urządzenie ZSONet¶
Urządzenie¶
Urządzenie jest podłączane do komputera przez szynę PCI –
identyfikator producenta to 0x0250
, a identyfikator urządzenia to
0x250e
.
Urządzenie nie posiada własnej pamięci i operuje na buforach w głównej pamięci komputera przez bezpośredni dostęp do pamięci (DMA).
Urządzeniem steruje się przez rejestry wejścia/wyjścia zmapowane do pamięci (MMIO). Ten obszar MMIO jest pierwszym i jedynym obszarem BAR używanym przez urządzenie (BAR0). Urządzenie wykorzystuje również jedną linię przerwania PCI.
Obszar MMIO ma wielkość 256 B, ale tylko niektóre bajty z tego zakresu są używane na rejestry. Wszystkie udokumentowane rejestry są w formacie little-endian i powinny być używane tylko przez wyrównane odczyty i zapisy o rozmiarze odpowiadającym rozmiarowi rejestru.
Wysyłanie ramek¶
Urządzenie używa 4 buforów DMA do wysyłania ramek. Bufory są używane na zasadzie round robin — należy używać
kolejno buforów 0, 1, 2, 3, 0, 1, 2, 3… Adres i-tego bufora należy umieścić w rejestrze
TX_BUF_i
podczas przygotowywania urządzenia. Aby zlecić wysłanie ramki za pomocą i-tego bufora
należy umieścić jego zawartość w buforze, a następnie zapisać rozmiar ramki na górne 16 bitów (bity 16-31)
rejestru TX_STATUS_i
.
Po zleceniu wysłania ramki danego bufora można użyć ponownie dopiero gdy urządzenie zakończy wysyłanie.
Urządzenie sygnalizuje wysłanie ramki poprzez ustawienie bitu TX_FINISHED
w odpowiednim rejestrze
TX_STATUS_i
oraz podniesienie przerwania TX_OK
.
Odbieranie ramek¶
Do odbierania ramek urządzenie używa jednego bufora DMA na zasadzie bufora cyklicznego. Adres tego bufora
należy umieścić w rejestrze RX_BUF
, a jego rozmiar w rejestrze RX_BUF_SIZE
. Po odebraniu ramki
urządzenie umieszcza w buforze 4-bajtowy własny nagłówek, właściwą ramkę oraz 4-bajtową sumę kontrolną (FCS).
Następnie urządzenie podnosi przerwanie RX_OK
. Nagłówek jest w formacie little-endian i znajduje się
w nim rozmiar ramki (wliczając FCS).
Czytanie z bufora należy rozpocząć od offsetu 0. Należy informować urządzenie o pozycji, na której zakończyło się
odczytywanie ostatniej ramki poprzez rejestr RX_BUF_READ_OFFSET
. Poprzez bit RX_HAS_DATA
rejestru RX_STATUS
można dowiedzieć się, czy na tej pozycji znajduje się ramka.
Może się zdarzyć, że urządzenie odbierze ramkę, ale w buforze nie będzie na nią miejsca. Takie ramki zostaną porzucone,
a ich liczbę urządzenie udostępnia w rejestrze RX_MISSED
.
Rejestry sterujące¶
Urządzenie używa następujących rejestrów:
MAC_0
–MAC_5
(8 bitów, do odczytu)Kolejne bajty adresu MAC urządzenia.
TX_STATUS_0
–TX_STATUS_3
(32 bity, do odczytu/zapisu)Rejestry służące do zlecania urządzeniu wysłania pakietu oraz sprawdzania, czy wysyłanie zostało zakończone.
TX_BUF_0
–TX_BUF_3
(32 bity, do zapisu)Adresy buforów DMA używanych do wysyłania pakietów.
RX_BUF
(32 bity, do zapisu)Adres bufora DMA używanego do odbierania pakietów.
RX_BUF_SIZE
(32 bity, do zapisu)Rozmiar bufora używanego do odbierania pakietów.
RX_BUF_READ_OFFSET
(32 bity, do zapisu)Pozycja w buforze, na której sterownik zakończył odczytywanie ostatniej ramki.
RX_BUF_WRITE_OFFSET
(32 bity, do odczytu)Pozycja w buforze, na której urządzenie zakończyło zapisywanie ostatniej ramki (może być wykorzystany do debugowania).
RX_STATUS
(32 bity, do odczytu)Rejestr służący do sprawdzania, czy w buforze znajdują się ramki do odczytania.
RX_MISSED
(32 bity, do odczytu/zapisu)Liczba ramek porzuconych z powodu przepełnienia bufora. Zapisanie dowolnej wartości powoduje wyzerowanie rejestru.
INTR_MASK
(32 bity, do odczytu/zapisu)Rejestr włączania przerwań. Ma takie same bity jak
INTR_STATUS
. 1 oznacza przerwanie włączone, a 0 — przerwanie wyłączone. Przy resecie maszyny, rejestr zostaje ustawiony na 0, blokując możliwość zgłaszania przerwania PCI przez urządzenie do momentu załadowania sterownika.INTR_STATUS
(32 bity, do odczytu/zapisu)Aktywne przerwania. Każde przerwanie ma odpowiadający mu bit w tym rejestrze. Odczyt rejestru zwraca 1 dla aktywnych przerwań, a 0 dla nieaktywnych. Zapis spowoduje wyzerowanie (ustawienie na nieaktywne) wszystkich przerwań, dla których został zapisany bit 1.
ENABLED
(32 bity, do zapisu)Włączanie i wyłączanie przetwarzania ramek przez urządzenie. Zapisanie niezerowej wartości włącza przetwarzanie, a zapisanie zera wyłącza je i resetuje stan urządzenia.
Uruchomienie urządzenia¶
Poprawna procedura uruchamiania urządzenia jest następująca (użycie dowolnej innej procedury spowoduje utratę gwarancji i brak możliwości zwrotu urządzenia):
przygotować bufory
wyzerować
INTR_STATUS
włączyć używane przez nas przerwania w
INTR_MASK
,włączyć urządzenie w
ENABLED
.
Żeby wyłączyć urządzenie, wystarczy zapisać 0 do ENABLED
oraz INTR_MASK
.