Web 51 - Packet Driver RTL8019AS |
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 Address MAC Adresa příjemce 6 bytů Source Address MAC Adresa odesílatele 6 bytů Length Délka paketu 2 byty DATA Data min. 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..FFh WORD konfigurační data z EEPROM 9346 4000h..45FFh BYTE buffer pro vysílání 4600h..5FFFh BYTE kruhový 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_STARTPG 46h (4600h) adresa první stránky EN0_STOPPG 60h (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 = 5EhZpracujeme-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 = 48hA jak vypadá počáteční nastavení ? Obvykle používané je:
EN0_BOUNDARY 46h (4600h) adresa první stránky EN1_CURPAG 47h (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 waitbusZa 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 longpauseNemá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 regObvod 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 ENDPORTDATAPokud 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_dataNastaví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 RingVynulujeme 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 InterruptNastaví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+5Multicast 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 resetInicializujeme 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 resetNastavíme standartní režim vysílače.
PORTDATA EN0_TXCR, 0 ;TX configuration reg = Normal OperationNastaví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 broadcastsVynulujeme případné přerušení
PORTDATA EN0_ISR, -1 ;Clear the pending Interrupt /* sichr */ ENDPORTDATANakonec 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 RETPacket 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ý.
POPIS Web51 | NOVINKY | FAQ | OBJEDNÁVKA | DOWNLOAD |
(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz Final applications of the Web51 : www.HWgroup.cz |