Web 51 - Packet Driver RTL8019AS

Web 51 - Skript mac2hex.pl a ip2hex.pl  software.html  Web 51 - Packet Driver RTL8019AS Vysilani paketu - part 2

část 1 - inicializace driveru

Obvod RTL8019AS v sobě obsahuje vše potřebné pro příjem a vysílání paketů dle standartu Ethernet. Přijaté pakety, či paket(y) připravené k vysílání jsou uloženy v paměti čipu. Tato paměť je navenek přístupná pouze pomocí DMA kanálu. Celý čip je ovládán přes čtyři banky registrů. Číslo registru je možno zadávat přímo, pomocí adresových vývodů A0..A4. Pro řízení a čtení stavu čipu je použito prvních 16 registrů 0..15, další osmice 16..23 reprezentuje ve skutečnosti pouze jediný datový registr sloužící ke komunikaci s DMA. Zbývající osmice 24..31 je rovněž ve skutečnosti jediným registrem a slouží k programovému resetu čipu. Jednotlivé banky registrů není možno adresovat přímo, ale pouze pomocí 2 bankovacích bitů v registru 0, který je přístupný ve všech čtyřech bankách registrů.
Jak vlastně vypadá ethernet paket vysílaný, či přijímaný obvodem RTL8019? Každý paket se skládá celkem ze 60 až 1514 bytů.

Destination AddressMAC Adresa příjemce6 bytů
Source AddressMAC Adresa odesílatele6 bytů
LengthDélka paketu2 byty
DATADatamin. 46 / max. 1500 bytů

Této struktuře paketu je podřízena i struktura registrů celého obvodu. V jednotlivých registrech obvodu, je možno nastavit, jak adresu příjemce (registry EN1_PHYS), tak adresu odesílatele (registry EN1_MULT). Toto nastavení je určeno k filtraci přijímaných paketů ukládaných do paměti obvodu. Obvyklé nastavení je takové, že obvod přijímá pakety s adresou příjemce rovnou MAC adrese čipu a s libovolnou adresou odesílatele. Pro vysílání je nutno nastavit délku vysílaného paketu do registrů EN0_RCNTLO (méně významný byte) a EN0_RCNTHI (více významný byte).

Přístup do paměti adaptéru je, jak již bylo uvedeno, možný pouze přes DMA kanály. Obvyklá organizace paměti(*) a z ní vyplývající počáteční nastavení DMA registrů je následující:

00h..FFhWORDkonfigurační data z EEPROM 9346
4000h..45FFhBYTEbuffer pro vysílání
4600h..5FFFhBYTEkruhový přijímací buffer

Celá paměť je z hlediska přístupu rozdělana na jednotlivé stránky o velikosti 256 byte. Je-li paket menší než je násobek 256, je zarovnán na celou stránku. Přijímací část paměti je organizována jako kruhový buffer. Činnost kruhového bufferu řídí celkem 4 registry. První dvojice registrů, EN0_STARTPG a EN0_STOPPG, reprezentuje hranice tohoto kruhového bufferu. Vyjdeme-li z obvyklé organizace paměti, bude jejich nastavení následující:

EN0_STARTPG46h (4600h)adresa první stránky
EN0_STOPPG60h (6000h)adresa poslední stránky + 1

Do tohoto bufferu ukazuje dvojice ukazatelů, reprezentovaných registry EN0_BOUNDARY a EN1_CURPAG. První z nich, EN0_BOUNDARY, je registrem chránícím data nepřečtená z kruhového bufferu. Přijímač nesmí ukládat data do paměti nad tuto hranici. Při přečtení dat z obvodu je proto nutno jeho obsah nastavit vždy na adresu stránky o jednu menší než je adresa nepřečtených dat. Druhý z nich, EN1_CURPAG je registrem, určujícím kam se budou zapisovat příjímaná data. Označíme-li obsazené místo v paměti "číslem" paketu a volné např. znakem -, může situace vypadat například takto:

   46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
    -  -  -  -  -  -  -  -  -  -  -  -  -  1  1  1  2  2  2  3  3  4  4  4  -  -
   EN0_BOUNDARY = 52h   EN1_CURPAG = 5Eh

Zpracujeme-li např. tři přijaté pakety a mezitím dva další přijmeme bude situace následující:

   46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
    5  6  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  4  4  4  5  5
   EN0_BOUNDARY = 5Ah   EN1_CURPAG = 48h

A jak vypadá počáteční nastavení ? Obvykle používané je:

EN0_BOUNDARY46h (4600h)adresa první stránky
EN1_CURPAG47h (4700h)adresa druhé stránky

Registr EN1_CURPAG se musí inicializovat na hodnotu o jedničku vyšší, než je nastavení registru EN0_BOUNDARY z důvodů ochrany stránky. Stránka nastavená v EN0_BOUNDARY je stránkou mezní a při jejím dosažení obvod přerušuje přenos do paměti (chybné nastavení EN1_CURPAG = EN0_BOUNDARY je uvedeno např. i v AN-874 od NS). S těmito výchozími znalostmi lze dojít k následujícímu fragmentu kódu:

;*************************************************************
;** Reset and init card
;**

Vygenerujeme puls na vstupu RSTDRV (Reset) obvodu RTL8019AS.

network_init:
        SETB    RESETBIT        ;Reset ISA bus
        ACALL   waitbus
        CLR     RESETBIT        ;End of Reset ISA bus
        ACALL   waitbus

Za HW resetem následuje softwarový reset RTL8019AS, vyvolaný sekvencí čtení s následujícím zápisem na adresu resetovacího registru RTL čipu.

        ISAIN   EN_RESET        ;Reset Port (for all pages)
        ACALL   longpause
        ISAOUTA EN_RESET        ;Reset Port (for all pages)

Do čipu je následně pošleme příkaz stop a počkáme dobu nutnou k dokončení případného vysílání (i když má to po HW resetu smysl ?, nicméně takhle je to idioten sichr).

        ISAOUT  EN_CMD, #EN_PAGE0+EN_NODMA+EN_STOP
                                ;Remote DMA, Stop and reset the chip
        ACALL   longpause

Nemáme požadavek na DMA, délku pro DMA přenos nastavíme na nulu.

        BEGINPORTDATA
        PORTDATA        EN0_RCNTHI,0    ;MSB Remote byte count reg
        PORTDATA        EN0_RCNTLO,0    ;LSB Remote byte count reg

Obvod přepneme do monitorovacího a smyčkového módu, kdy nepřijímá data z linky a umožňuje diagnostiku. Nastavíme přenos po bytech.

        PORTDATA        EN0_RXCR, ENRXCR_MON    ;RX configuration reg
                                        ;Monitor mode (no packets rcvd)
        PORTDATA        EN0_TXCR, ENTXCR_LOOP   ;TX configuration reg
                                        ;set internal loopback mode
        PORTDATA        EN0_DCFG, ENDCFG_FT10+ENDCFG_BMS+ENDCFG_WTS
                                        ;fifo treshold, Normal operation,
                                        ;word/byte transfer mode selection
        ENDPORTDATA

Pokud je k obvodu připojena EEPROM pamět 9346, tak z ní přečteme MAC adresu adaptéru. Tato adresa je uložena ve "stínové" RAM od adresy 0h a lze ji přečíst standartním postupem pomocí DMA. Nicméně se nebere v úvahu bytový režim a z této oblasti jsou datové byty zdvojovány a při čtení je nutno proto zpracovat pouze každý druhý byte.

        ACALL   get_board_data

Nastavíme výchozí parametry kruhového bufferu.

        BEGINPORTDATA
        PORTDATA        EN_CMD, EN_PAGE0+EN_NODMA ;Remote DMA
        PORTDATA        EN0_STARTPG, RX_START_PG ;Starting page of ring buffer
                                        ;First page of RX Ring
        PORTDATA        EN0_BOUNDARY, RX_START_PG ;Boundary page of ring buffer
        PORTDATA        EN0_STOPPG,NE_STOP_PG   ;Ending page +1 of ring buffer
                                        ;End Page = Last page + 1 of RX Ring

Vynulujeme případné přerušení, nastavení masky je spíše symbolické, použité zapojení nepoužívá přerušení a proto jej pro zviditelnění zakážeme.

        PORTDATA        EN0_ISR, -1     ;Interrupt status reg
        PORTDATA        EN0_IMR, 0      ;Interrupt mask reg = Disable All Interrupt

Nastavíme do registrů vlastní MAC adresu.

        PORTDATA        EN_CMD, EN_PAGE1+EN_NODMA ;Page 1, Remote DMA
        PORTDATA        EN1_PHYS+portind+0,my_ether+0;This board's physical enet addr
        PORTDATA        EN1_PHYS+portind+1,my_ether+1
        PORTDATA        EN1_PHYS+portind+2,my_ether+2
        PORTDATA        EN1_PHYS+portind+3,my_ether+3
        PORTDATA        EN1_PHYS+portind+4,my_ether+4
        PORTDATA        EN1_PHYS+portind+5,my_ether+5

Multicast registry v sobě obsahují 64 bitů, povolujících 64 skupin skupin multicast adres. Jednotlivé skupiny multicast adres jsou určeny pomocí CRC generátoru. Z vypočteného CRC MAC adresy příjemce je nejvyšších šest bitů použito jako index do bitové tabulky, uložené ve výše uvedených registrech. Jedničkový bit na dané pozici udává, že se případný multicast přijme. Nicméně příjem multicast paketů musí být povolen v kongfiguračním registru přijímače. Implicitně nastavíme povolení všech skupin multicast adres.

        PORTDATA        EN_CMD, EN_PAGE1+EN_NODMA+EN_STOP ;Page 1,
                                        ;Remote DMA, Stop and reset the chip
        PORTDATA        EN1_MULT+0,0FFh ;Multicast filter mask array (8 bytes)
        PORTDATA        EN1_MULT+1,0FFh
        PORTDATA        EN1_MULT+2,0FFh
        PORTDATA        EN1_MULT+3,0FFh
        PORTDATA        EN1_MULT+4,0FFh
        PORTDATA        EN1_MULT+5,0FFh
        PORTDATA        EN1_MULT+6,0FFh
        PORTDATA        EN1_MULT+7,0FFh
        PORTDATA        EN_CMD, EN_PAGE0+EN_NODMA+EN_START
                                        ;Remote DMA, Start the chip, clear reset

Inicializujeme ukazatel, odkud se začnou ukládat přijaté pakety.

        PORTDATA        EN_CMD, EN_PAGE1+EN_NODMA+EN_STOP ;Page 1,
                                        ;Remote DMA, Stop and reset the chip
        PORTDATA        EN1_CURPAG, RX_CURR_PG  ;Current memory page = RX_CURR_PG
        PORTDATA        EN_CMD, EN_PAGE0+EN_NODMA+EN_START
                                        ;Remote DMA, Start the chip, clear reset

Nastavíme standartní režim vysílače.

        PORTDATA        EN0_TXCR, 0     ;TX configuration reg = Normal Operation

Nastavíme standartní režim přijímače, nepřijímají se chybné pakety, jsou povoleny broadcasty, nejsou povoleny multicasty.

        PORTDATA        EN0_RXCR, ENRXCR_BCST   ;RX configuration reg =
                                        ; Accept broadcasts

Vynulujeme případné přerušení

        PORTDATA        EN0_ISR, -1     ;Clear the pending Interrupt /* sichr */
        ENDPORTDATA

Nakonec nastavíme vnitřní proměné paket driveru, na stejnou hodnotu jako ukazatel, odkud se budou ukládat přijaté pakety.

        MOV     next_packet,#RX_CURR_PG
        RET
Dil 2Packet Driver RTL8019AS, část 2

(*) Od verze 1.13 používá Web 51 mírně modifikovanou strukturu paměti, podporující více vysílacích bufferů. Některé detaily v článku uvedeného driveru jsou v současné době pozměněny, nicméně princip činnosti je stejný.





Sponzored by LPhard Ltd. Graphics by GIMP Created by EasyPad

(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz

Final applications of the Web51 : www.HWgroup.cz
Web 51 - Skript mac2hex.pl a ip2hex.pl  Obsah  Web 51 - Packet Driver RTL8019AS Vysilani paketu - part 2