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_STATUSwłą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.