Главная » Ассемблер, Железо » Прием и передача пакетов NE2000

0

Область оперативной памяти адаптера в процессе настройки должна быть поделена на две части, как показано на рис. 9.10: буфер данных передатчика и кольцевой буфер данных приемника. С целью упрощения схемы управления адаптером встроенная оперативная память была разделена на страницы размером 256 байт. Принимаемый или передаваемый пакет все1да занимает целое количество таких страниц, причем начало пакета должно быть выровнено на начало страницы. Если в конце последней занимаемой пакетом страницы есть неиспользуемый участок, при выполнении операций с памятью он просто игнорируется (не обрабатывается). Буфер данных передатчика размещается в начальном участке области оперативной памяти и обычно занимает область размером 1,5 Кбайт (6 страниц по 256 байт), соответствующую максимальному размеру пакета данных.

Адаптер работает с кадрами Ethernet на уровне управления доступом к сети (Media Access Control, сокращенно MAC), поэтому структура пакета данных, загружаемого в память передатчика, соответствует структуре кадров Novell 802.3 и Ethernet II119]. Формат пакета данных описан в табл. 9.8.

Правила работы сети Ethernet не допускают передачи пакетов размером менее 64 байт, поэтому если размер области данных меньше 46 байт, в пакет вставляется так называемое «набивочное» поле, содержащее байты-заполнители (обычно — нули). Если размер области " данных превышает 46 байт, набивочное поле в пакет не вставляется.

Таблица 9.8. Формат пакета данных ЫЕ2000-совместимого сетевого адаптера


Смещение

Размер

Назначение поля

0

6 байт

Адрес получателя (Destination Address)

6

6 байт

Адрес отправителя (Source Address)

12

WORD

Тип пакета или размер области данных

 

 

(Type/Length)

Таблица 9.8 (продолжение)

Смещение

Размер

Назначение поля

14

п байт

Область данных (Data)

14 + п

46 – п байт

Набивочное поле (Pad)

Для записи пакета в буфер передатчика нужно загрузить номер начальной страницы буфера передатчика в Регистр начального адреса для операций внешнего доступа RSAR, а размер пакета в байтах — в Регистр счетчика байтов для операций внешнего доступа RBCR. Далее нужно произвести загрузку пакета через регистр ввода-вывода по байтам или по словам.

После того, как передаваемый пакет записан в буфер, нужно указать передатчику номер начальной страницы буфера, загрузив его в Регистр начальной страницы области передачи TPSR; размер передаваемого пакета нужно занести в Регистр счетчика передаваемых байтов TBCR. Для запуска процесса передачи пакета нужно занести значение 26h в регистр команды CR.

Прием пакетов осуществляется адаптером по мере их поступления. Принятые пакеты заносятся в буфер приемника.

Рис. 9.11. Структура кольцевого буфера данных приемника

Буфер данных приемника размещается вслед за буфером передатчика и организован в виде кольца, как показано на рис. 9.11. После инициализации адаптера регистры PSTART, BNDRY и CURR указывают на первую страницу кольцевого буфера, а регистр PSTOP указывает на страницу n + 1, которая находится за пределами буфера и за пределами оперативной памяти.

Каждый принятый пакет может занимать одну или несколько страниц по 256 байт. Если в процессе приема достигнута страница кольцевого буфера с номером п, то следующей будет использоваться страница 1.

После завершения приема пакета в регистр CURR будет записан номер первой свободной страницы. Если в процессе приема пакета происходит пересечение страницы, на которую указывает регистр BNDRY, фиксируется ошибка переполнения буфера. Регистр BNRDY указывает на страницу, содержащую начало первого непрочитанного (не переписанного из кольцевого буфера в оперативную память компьютера) пакета. Когда центральный процессор завершает операцию считывания очередного пакета из кольцевого буфера, он должен записать в регистр BNDRY значение, соответствующее началу следующего пакета, после чего занимаемая считанным пакетом область памяти считается освобожденной и доступна для записи других пакетов.

Перед началом записи пакета в кольцевой буфер контроллер сетевого адаптера заносит в буфер 4-байтную структуру-описатель пакета. Она включает в себя:

•    байт статуса (Receive Status), в который переписывается информация из регистра состояния приемника;

•    байт номера начальной страницы следующего пакета (Next Packet Pointer);

•    16-разрядное слово, содержащее общий размер пакета вместе со структурой-описателем (Receive Byte Count).

Таким образом, в буфере приемника пакет данных размещается не с начала страницы, а смещен на 4 байта, как показано на рис. 9.12.

Смещение, байт:

;—~о

Статус пакета

Указатель на следующий пакет ^

 2

Общий объем данных

 4

Принятый пакет

Рис. 9.12. Размещение принятого пакета в буфере приемника

Перед началом считывания пакета данных нужно извлечь номер начальной страницы пакета из Регистра указателя границы BNDRY, запомнить его и занести в старший байт Регистра начального адреса для операций внешнего доступа RS AR (младший байт RS AR нужно обнулить).

Прежде чем начать выполнение операции считывания пакета из кольцевого буфера, программист должен извлечь и проанализировать структуру-описатель пакета. Для считывания структуры-описателя пакета нужно загрузить значение 4 в регистр RBCR, после чего считать через Регистр ввода-вывода 4 байта или 2 слова (в зависимости от заданной разрядности шины данных). Структура-описатель пакета обрабатывается следующим образом:

•    байт статуса позволяет определить, насколько успешно выполнена операция приема пакета и были ли обнаружены какие-либо ошибки в процессе сбоя. Обрабатывать байт статуса программисту требуется только в том случае, если разрешен прием пакетов с ошибками;

•    байт номера начальной страницы следующего пакета следует запомнить и после завершения считывания пакета переписать его значение в регистр границы BNDRY;

•    из общего размера пакета нужно вычесть размер описателя (4 байта), после чего запомнить размер пакета в оперативной памяти компьютера и загрузить его в Регистр счетчика байтов для операций внешнего доступа RBCR (перед началом выполнения операции считывания пакета).

Далее выполняется операция считывания полученного пакета через Регистр ввода-вывода. Количество операций считывания при использовании побайтной передачи равно значению размера пакета, а при передаче 16-разрядными словами — размеру пакета, деленному на 2.

В кольцевом буфере, вообще говоря, может находиться одновременно несколько пакетов данных. Признаком того, что из буфера прочитаны все пакеты и можно прекратить процесс считывания, является совпадение значений в регистрах CURR и BNDRY. Листинг 9.1 содержит набор процедур общего назначения, предназначенных для работы с N Е2000- с о в м е с п i м ы ми сетевыми адаптерами:

•    процедура SearchEthernetContr предназначена для поиска адаптера Ethernet на шине PCI при помощи функций PCI BIOS;

•    процедура InitializeAdapter выполняет инициализацию регистров адаптера;

•    процедура PCtoNIC предназначена для копирования блока данных из оперативной памяти компьютера во встроенную намять сетевого адаптера;

•    процедура NICtoPC предназначена для копирования блока данных из памяти сетевого адаптера компьютера в оперативную память компьютера;

•    процедура SendPacket использует процедуру PCtoNIC для загрузки пакета в буфер передатчика, а затем запускает процесс передачи;

•    процедура GetPacket использует процедуру NICtoPC для считывания принятого пакета из кольцевого буфера;

•    процедура SetEthernertAddress копирует физический адрес из ПЗУ в регистры физического адреса адаптера;

Листинг 9.1. Набор процедур для работы с МЕ2000-совместимыми адаптерами Ethernet по шине PCI

: СМЕЩЕНИЕ РЕГИСТРОВ АДАПТЕРА ОТ БАЗОВОГО АДРЕСА

; Регистры страницы О PAGESTARTequ Olh ;запись

PAGESTOPequ 02h ;запись

BOUNDARYequ 03h ;запись

TRANSMITSTATUSequ 04h ;чтение

TRANSMITPAGEequ 04h .-запись

TRANSMITBYTECOUNTO equ 05h :запись INTERRUPTSTATUS equ 07h ;чтение и запись REMOTESTARTADDRESSO equ 08h :запись REMOTEBYTECOUNTO equ OAh ;запись RECEIVESTATUSequ OCh ;чтение

RECEIVECONFIGURATION equ OCh ;запись TRANSMITCONFIGURATION equ ODh ;запись DATACONFIGURATION equ OEh ;запись INTERRUPTMASKequ OFh :запись

; Регистры страницы 1

CURRENTequ 07h ;чтение и запись

; СМЕЩЕНИЕ ПОРТА ВВОДА-ВЫВОДА

I0P0RTequ 10h ;чтение и запись

; ПАРАМЕТРЫ ДЛЯ НАСТРОЙКИ РЕГИСТРОВ УПРАВЛЕНИЯ

; Параметры настройки регистра управления форматом : данных VDCR equ 49h

; Параметры настройки регистра управления приемником

V  RCR equ ICh

; Параметры настройки регистра управления передатчиком

V  TCR equ О

; Параметры настройки регистра маскирования прерываний

Листинг 9.1 (продолжение)

; (прерывания запрещены) VIMR equ О

; СТРАНИЧНЫЕ ГРАНИЦЫ БУФЕРОВ В ПАМЯТИ АДАПТЕРА

; Адрес буфера передачи (буфер занимает 6 страниц : по 256 байт и его общий объем составляет 1536 байт) TRANSMITBUFFER equ 40h

; Адрес начальной страницы кольцевого буфера приема PSTARTequ 46h

; Верхняя граница кольцевого буфера приема PSTOPequ BOh

DATASEG

; СООБЩЕНИЯ ОБ ОШИБКАХ

NoPCI

DB 12,24."Система не поддерживает PCI BIOS",О NoEth

DB 12,10,"NE2000-совместимый адаптер Ethernet "

DB "на шине PCI не обнаружен",О BadRg

DB 12,28."Неверный номер регистра",О NoPack

DB 12,25,"В кольцевом буфере нет пакета".О

; ПАРАМЕТРЫ АДАПТЕРА, СВЯЗАННЫЕ С ШИНОЙ PCI

; Координаты сетевой карты на шине PCI EthBusNumber

DB ? ;номер шины EthDeviceNumber

DB ? ;номер устройства и номер функции

; Идентификаторы устройства PCI EthVendorlD DW ? идентификатор изготовителя EthDevicelD DW ? идентификатор устройства : Адрес блока регистров адаптера Ethernet EthBaseAddr DW ? : Номер используемого прерывания IRQ EthlntLine

DB ?

; ПЕРЕМЕННЫЕ И МАССИВЫ

; Начальная страница принимаемого пакета PackStartPage

DB ?

; Размер принятого пакета в байтах RecPackSize DW ?

; Количество подлежащих считыванию байтов RemBytesDW ?

; Буфер для хранения физического адреса PhisicalAddress

DB 32 DUP(?) : Буфер для формирования передаваемого пакета DataOutBuffer

DB 6*256 DUP(?) : Буфер для сохранения принятого пакета DatalnBuffer

DB 6*256 DUP(?) ENDS

CODESEG

;* НАЙТИ НА ШИНЕ PCI СЕТЕВОЙ АДАПТЕР ETHERNET * ;*И ОПРЕДЕЛИТЬ ЕГО ПАРАМЕТРЫ*

;* Процедура не имеет входных параметров.*

;* В случае успешного завершения операции поиска*

;* параметры адаптера сохраняются в глобальных*

;* переменных EthBusNumber. EthDeviceNumber,*

;* EthVendorlD, EthDevicelD, EthBaseAddr и*

;* EthlntLine.*

;****************************ЛЛЛЛЛЛАЛАЛ**ЛЛ*ЛЛ*А*А*

PROC SearchEthernetContr near pushad

; Проверить наличие PCI BIOS

mov AX.OBlOlh int lAh

jc

@@PCIВIOSNot Found cmp EDX,20494350h jne PePCIBIDSNotFound

; Найти адаптер Ethernet по коду класса

mov AX,0B103h

mov ECX,020000h

mov SI ,0 int lAh

jne

@@ReadPCIRegisters .-устройство найдено

; Адаптер Ethernet не найден

MFatalError NoEth

; Устройство обнаружено, его координаты на шине PCI

; находятся в регистре ВХ

@@ReadPCIRegi sters: : Запомнить координаты адаптера

mov [EthBusNumber],ВН

mov [EthDeviceNumber],BL : Получить идентификатор изготовителя

mov AX,0B109h ;читать слово

mov DI.0 ;смещение слова int lAh

jc PPBadRegisterNumber

mov [EthVendorlD],CX

; Получить идентификатор устройства

mov AX,0B109h ;читать слово

mov DI.2 :смещение слова int lAh

jc P@BadRegisterNumber

mov [EthDevicelD],CX

; Получить базовый адрес блока регистров

; адаптера Ethernet

mov AX.OBlOAh :читать двойное слово

mov Dl.lOh ;смещение слова int lAh

jc

@@BadRegisterNumber

; Обнулить 5 младших бит and CX.OFFEOh

: Сохранить только младшее слово адреса

Листинг 9.1 (продолжение)

mov [EthBaseAddr].СХ : Получить номер используемого устройством

; прерывания IRQ

mov AX,0B108h :читать байт

mov DI,3Ch смещение байта int lAh

jc

@@BadRegisterNumber

mov [EthlntLine],CL popad ret

; Обработка ошибок

@@PCIBIOSNotFound:

; He поддерживается PCI BIOS MFatalError NoPCI

@@BadRegisterNumber:

: Неверный номер регистра MFatalError BadRg ENDP SearchEthernetContr

;* ИНИЦИАЛИЗАЦИЯ NE2000-СОВМЕСТИМОГО АДАПТЕРА * ;* Буфер передачи размещается в диапазоне 4000h-45FFh. * ;* буфер приема – в диапазоне 4600h-7FFFh.*

;* Входные параметры:*

;* EthBaseAddr – базовый адрес блока регистров.*l

PROC InitializeAdapter near push AX push DX

: Приостановить работу адаптера и установить нулевую

; регистровую страницу

mov DX,[EthBaseAddr]

mov AL,21h out DX.AL

: Инициализировать регистр управления форматом данных

mov DX.[EthBaseAddr]

add DX.DATACONFIGURATION

mov AL,V_DCR out DX.AL

; Обнулить регистр счетчика байтов для внешнего доступа

mov DX,[EthBaseAddr]

add DX,REMOTEBYTECOUNTO xor AL.AL

out DX.AL ;младший байт

inc DX

out DX.AL :старший байт : Настроить регистр управления приемником

mov DX,[EthBaseAddr]

add DX.RECEIVECONFIGURATION

mov AL,V_RCR out DX.AL

; Задать начальную страницу буфера передачи

mov DX,[EthBaseAddr]

add DX.TRANSMITPAGE ;transmit page start

mov AL.TRANSMITBUFFER out DX.AL : Временно перейти в режим самотестирования

mov DX.[EthBaseAddr]

add DX.TRANSMITCON FIGURATION

mov AL.02 out DX.AL

; Задать начальную страницу и текущую границу : кольцевого буфера

mov DX.[EthBaseAddr]

add DX,PAGESTART

mov AL.PSTART out DX.AL

add DX.2 out ‘ DX.AL

; Задать конечную страницу кольцевого буфера

mov DX,[EthBaseAddr]

add DX,PAGESTOP

mov AL.PSTOP out DX.AL

; Перейти на регистровую страницу 1

mov DX,[EthBaseAddr]

mov AL,61h out DX.AL : Задать номер текущей страницы кольцевого буфера

mov DX.[EthBaseAddr]

add DX,CURRENT

mov AL.PSTART out DX.AL

; Перейти на регистровую страницу 0 и активизировать : адаптер

mov DX,[EthBaseAddr]

mov AL,22h out DX.AL : Сбросить все признаки прерываний

mov DX.[EthBaseAddr]

add DX,INTERRUPTSTATUS

mov AL.OFFh out DX.AL

; Настроить регистр маскирования прерываний

mov DX.[EthBaseAddr]

add DX,INTERRUPTMASK

mov AL.VIMR out DX.AL

; Настроить регистр управления передатчиком

Листинг 9.1(продолжение)

mov DX,[EthBaseAddr]

add DX.TRANSMITCONFIGURATION

mov AL,V_TCR

out DX.AL

pop DX

pop AX

ret

ENDP InitializeAdapter

;*ПЕРЕДАТЬ ПАКЕТ ДАННЫХ*

;* Входные параметры:*

;* СХ – общее количество байтов в пакете (включая * ;* заголовок);*

;* DS:SI – указатель на область памяти, в которой * ;*размещен передаваемый пакет;*

;* EthBaseAddr – базовый адрес блока регистров. *

PROC SendPacket near pusha

; Цикл ожидания готовности передатчика e@Wait:

mov DX,[EthBaseAddr] in AL.DX

cmp AL,26h ;передатчик занят?

je e@Wait

cli;запретить прерывания

push СХ сохранить количество байтов

; Загрузить пакет данных в память адаптера

mov АН,TRANSMITBUFFER xor AL.AL call PCtoNIC : Задать передатчику номер начальной страницы

mov DX,[EthBaseAddr]

add DX.TRANSMITPAGE

mov AL.TRANSMITBUFFER out DX.AL pop CX

; Загрузить регистр счетчика передаваемых байтов

mov DX.[EthBaseAddr]

add DX.TRANSMITBYTECOUNTO

mov AL.CL ;младший байт out DX.AL

inc DX

mov AL.CH ;старший байт out DX.AL

; Начать передачу пакета

mov DX,[EthBaseAddr]

mov AL,26h out DX.AL sti;разрешить прерывания

рора

ret

ENDP SendPacket

;* ПЕРЕПИСАТЬ ПЕРЕДАВАЕМЫЙ ПАКЕТ ИЗ ПАМЯТИ * ;* КОМПЬЮТЕРА В ПАМЯТЬ СЕТЕВОГО АДАПТЕРА * ;* Входные паранетры:*

;* АХ – нонер страницы буфера адаптера, с которой * ;* начинается запись пакета;*

;* СХ – общее количество байтов в пакете (включая * ;* заголовок):*

;* DS:SI – указатель на область паняти, в которой * ;*размещен передаваемый пакет;*

;* EthBaseAddr – базовый адрес блока регистров. *

PROC PCtoNIC near

push AX сохранить номер страницы : Округлить количество байтов пакета до четного числа

inc СХ and CX.OFFFEh

; Загрузить счетчик байтов

mov DX.[EthBaseAddr]

add DX,REMOTEBYTECOUNTO

mov AL.CL ;младший байт out DX.AL

inc DX

mov AL.CH старший байт out DX.AL

pop AX восстановить номер страницы

; Загрузить номер страницы буфера

mov DX.[EthBaseAddr]

add DX,REMOTESTARTADDRESSO out DX.AL :младший байт

inc DX

mov AL.AH

out DX.AL старший байт : Подать команду загрузки данных в память адаптера

mov DX.[EthBaseAddr]

mov AL.12h out DX,AL

; Цикл записи данных по словам

mov DX.[EthBaseAddr]

add DX.IOPORT ;порт ввода-вывода shr CX.l ;разделить на 2 e@WritingWord: lodsw

out DX.AX loop PGWritingWord

Листинг 9.1 (продолжение)

: Настроить DX на регистр статуса прерывания

mov DX.CEthBaseAddr]

add DX.INTERRUPTSTATUS

; Ожидать завершения внутренней передани данных

mov СХ.О

@@CheckDMA:

in AL.DX

test AL,40h ;цикл DMA завершен? jnz

@@End loop ©acheckDMA

@@End:

: Сбросить признак прерывания DMA в регистре статуса

; прерывания

mov AL,40h out DX.AL clc ret

ENDP PCtoNIC

;* ПЕРЕДАТЬ ПРИНЯТЫЙ ПАКЕТ ИЗ ПАМЯТИ АДАПТЕРА * ;*В ОПЕРАТИВНУЮ ПАМЯТЬ КОМПЬЮТЕРА*

;* Входные параметры:*

;* АХ – номер страницы буфера адаптера, с которой * ;* начинается считывание пакета:*

;* СХ – общее количество байтов в пакете (включая * ;* заголовок);*

;* ES:DI – указатель на область памяти, в которую * ;*должен быть записан принятый пакет; *

;* EthBaseAddr • базовый адрес блока регистров. *

PROC NICtoPC near

push AX сохранить номер страницы : Сделать значение счетчика четным

inc СХ and СХ.OFFFEh : Загрузить счетчик байтов

mov DX.CEthBaseAddr]

add DX.REMOTEBYTECOUNTO

mov AL.CL

out DX.AL ;младший байт

inc DX

mov AL.CH

out DX.AL ;старший байт pop AX ;восстановить номер страницы : Загрузить номер страницы буфера

mov DX.CEthBaseAddr]

add DX,REMOTESTARTADDRESSO

out DX.AL ;младший байт

inc DX

mov AL.AH

out DX.AL ;старший байт

; Подать команду считывания данных из памяти адаптера

mov DX,[EthBaseAddr]

mov AL.OAh out DX.AL

; Цикл чтения данных по словам

mov DX,[EthBaseAddr]

add DX.IOPORT ;порт ввода-вывода shr CX.l ;разделить на 2

@@ReadingWord:

in AX.DX stosw

loop

@@ReadingWord : Настроить DX на регистр статуса прерывания

mov DX.[EthBaseAddr]

add DX,INTERRUPTSTATUS

; Ожидать завершения внутренней передачи данных

mov CX,0

@@CheckDMA:

in AL.DX

test AL,40h ;цикл DMA завершен? jnz

@@End loop (PGCheckDMA

; Сбросить признак прерывания DMA в регистре статуса

; прерывания

@@End:

mov AL,40h out DX.AL ret

ENDP NICtoPC

;* ПРИНЯТЬ ПАКЕТ ИЗ КОЛЬЦЕВОГО БУФЕРА * ;* Входные параметры:*

;* EthBaseAddr – базовый адрес блока регистров. * ;* Выходные параметры:*

PROC GetPacket near pusha

push ES

; Проверить наличие сигнала приема пакета

mov DX,[EthBaseAddr]

add DX,INTERRUPTSTATUS in AL.DX

test AL.Olh;получен пакет?

jz

@@Err

; Сбросить сигнал приема пакета

mov AL.Olh

Листинг 9.1 (продолжение)

out DX.AL : Создать указатель на буфер для приема пакета

mov AX.DS

mov ES.AX

mov DI.offset DatalnBuffer

; Определить начальную страницу пакета

mov DX,[EthBaseAddr]

add DX.BOUNDARY in AL.DX

mov [PackStartPage],AL

mov AH.AL xor AL.AL : Принять первый 25б-байтный блок данных

mov СХ,256 call NICtoPC

; Вычислить полный размер пакета

mov CX,[word ptr DataInBuffer+2]

mov [RecPackSize],CX :запомнить размер

mov [RemBytes].CX : Цикл чтения 256-байтных страниц

@@GetPack:

: Вычислить следующую страницу

inc [PackStartPage] cmp [PackStartPage],PSTOP :конец буфера? jb

@@ReadNextPage

mov [PackStartPage],PSTART

@@ReadNextPage:

cmp [RemBytes],256 jbe

@@EndOfPack sub [RemBytes],256

; Принять очередной блок данных

mov АН.[PackStartPage] xor AL.AL

mov CX,256 call NICtoPC jmp

@@GetPack

@@EndOfPack:

mov DX.[EthBaseAddr]

add DX,BOUNDARY

mov AL,[PackStartPage]

out DX.AL

pop ES

popa

ret

; Обработка ошибок

@@Err: MFatalError NoPack ENDP GetPacket

;* УСТАНОВИТЬ ФИЗИЧЕСКИЙ АДРЕС И ГРУППОВОЙ АДРЕС * ;* Входные паранетры:*

;* EthBaseAddr – базовый адрес блока регистров. *

PROC SetEthernertAddress near pusha

; Установить регистровую страницу О

movDX,[EthBaseAddr]

movAL,21h

outDX.AL

: Полунить данные о физическои адресе адаптера из ПЗУ

pushES

movAX.DS

movES.AX

movDI.offset phisicalAddress

movCX.32

movAX,0

callNICtoPC

popES : Установить регистровую страницу 1

movDX,[EthBaseAddr]

movAL.61h

outDX.AL

; Загрузить физический адрес

movDX.[EthBaseAddr]

incDX

movAL.[PhisicalAddress]

outDX.AL

incDX

movAL,[PhisicalAddress+2]

outDX.AL

incDX

movAL,[PhisicalAddress+4]

outDX.AL

incDX

movAL,[PhisicalAddress+6]

outDX.AL

incDX

movAL,[PhisicalAddress+8]

outDX.AL

incDX

movAL,[PhisicalAddress+10]

outDX.AL ,

; Загрузить групповой адрес

movAL.OFFh

movDX.[EthBaseAddr]

addDX,08h

outDX.AL

incDX

Листинг 9.1 (продолжение)

out DX.AL

inc DX out DX.AL

inc DX out DX.AL

inc DX out DX.AL

inc DX out DX.AL

inc DX out DX.AL

inc DX out DX.AL popa ret

ENDP SetEthernertAddress ENDS

Листинг 9.2 содержит программу TestEthernetContr, предназначенную для поиска NE2000-coBMecTHMoro адаптера Ethernet по шине PCI. Программа использует процедуру поиска SearchEthernetContr из листинга 9.1 для поиска адаптера, а также универсальные процедуры ввода-вывода из листинга 1.2 для отображения параметров найденного устройства на экране монитора.

Листинг 9.2. Поиск ЫЕ2000-совместимого адаптера Ethernet по шине PCI и считывание его параметров

IDEAL

Р386

LOCALS

MODEL MEDIUM

; Подключить файл нненонических обозначений

; кодов управляющих клавиш и цветовых кодов

Include "listl_03.inc" : Подключить файл накросов

Include "listl_04.inc"

DATASEG

; Текстовые сообщения TxtO

DB LIGHTCYAN.0,18

DB "ПОИСК АДАПТЕРА ETHERNET ПРИ ПОМОЩИ PCI BIOS".О Txtl

DB 2,26,"Параметры адаптера Ethernet",О

DB 4,28,"Номер шины:",О

DB 5,22,"Номер устройства:",О

DB 6,25,"Номер функции:",О

DB 7.12,"Идентификатор изготовителя:",О

DB 8,14,"Идентификатор устройства:",О

DB 9.8,"Базовый адрес набора регистров:",О

DB 10,8,"Номер используемого прерывания:",0 AnyK

DB YELLOW.24.29,"Нажмите любую клавишу",0 ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS

CODESEG

;***************************** ;* Основной модуль программы *

.* A A A A A A ****** A A A A A ***********

PROC TestEthernetContr

mov AX.DGROUP

mov DS.AX

mov [CS:Mai nDataSeg],AX

; Установить текстовый режим и очистить экран

mov АХ.З int 10h

: Скрыть курсор – убрать за нижнюю границу экрана

mov [ScreenStri ng].25

mov [ScreenColumn],0 call SetCursorPosition : Вывести заголовок

MShowColorString TxtO

; Установить зеленый цвет символов и черный фон

mov [TextColorAndBackground],LIGHTGREEN

; Найти адаптер Ethernet

call SearchEthernetContr : Проверить тип адаптера

cmp [EthDevieelD],8029h ;RTL8029AS

je

@@ShowParameters cmp [EthDevieelD],0926h ;VT86C926 jne

@@AdapterNotFound

@@ShowParameters: : Вывести заголовки полей MShowText 8.Txtl

; Установить желтый цвет символов и черный фон

mov [TextColorAndBackground].YELLOW

; Вывести полученные данные на экран

MShowHexByte 4.40.[EthBusNumber]

mov BL,[EthDevi ceNumber] shr BL,3 MShowHexByte 5.40.BL

mov BL,[EthDevi ceNumber] and BL,111b MShowHexByte 6.40.BL MShowHexWord 7,40.[EthVendorlD] MShowHexWord B,40,[EthDevicelD]

Листинг 9.2(продолжение)

MShowHexWord 9.40.[EthBaseAddr] MShowHexByte 10.40.[EthIntUne] : Ожидать нажатия любой клавиши MShowColorString AnyK cal1 GetChar

; Переустановить текстовый режин и очистить экран

mov АХ.З int 10h

; Выход в DOS

mov АН,4Ch int 21h

; Обработка ошибок PffiadRegisterNumber:

MFatalError BadRg ;неверный нонер регистра

@@AdapterNotFound:

MFatalError NoEth ;адаптер Ethernet не найден ENOP TestEthernetContr ENDS

: Подключить процедуры ввода данных и вывода на экран

; в текстовом режиме

Include "listl_02.inc"

; Подключить процедуры для обслуживания работы : контроллера Ethernet

Include "list9_01.inc"

END

Любой сетевой адаптер может быть настроен на режим прослушивания сети. В режиме прослушивания осуществляется прием не только тех пакетов, которые предназначены данному конкретному адаптеру, но и всех остальных пакетов, передаваемых по сегменту сети, к которому подсоединен адаптер.

Листинг 9.3 содержит программу WaitAnyPacket, которая перехватывает один из передаваемых по сети пакетов (первый попавшийся) и отображает его содержимое на экране монитора в коде ASCII. Программа использует процедуры для работы с КЕ2000-совместимым адаптером из листинга 9.1, а также универсальные процедуры вво- да-вывода из листинга 1.2 и процедуры перевода десятичных чисел из листинга 2.5.

Листинг 9.3. Программа, иллюстрирующая работу адаптера в режиме прослушивания сети

IDEAL

Р386

LOCALS

MODEL MEDIUM

; Подключить файл мнемонических обозначений

; кодов управляющих клавиш и цветовых кодов

Include "listl_03.inc"

; Подключить файл макросов

Include "listl_04.inc"

DATASEG

: Текстовые сообщения

TxtO

DB LIGHTCYAN.О,25,"ПРИЕМ ПАКЕТА ИЗ СЕТИ ETHERNET",О Txtl

DB 2,0."Размер пакета, байт:".О

DB 3,0."Адрес получателя:",0

DB 4,0,"Адрес отправителя:",0

DB 5,0,"Поле L/T:".0

DB 6.0."Поле данных:".0

DB 24.35,"Идите …".О AnyK

DB YELLOW,24.29."Нажмите любую клавишу",0 ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS

CODESEG

;* Основной модуль программы * ;*****************************

PROC WaitAnyPacket

mov AX.DGROUP

mov DS.AX

mov [CS:MainDataSeg],AX : Установить текстовый режим и очистить экран

mov АХ.З int 10h

; Скрыть курсор • убрать за нижнюю границу экрана

mov [ScreenString],25

mov [ScreenColumn],0 call SetCursorPosition

; Найти контроллер Ethernet

call SearchEthernetContr : Проверить тип адаптера

cmp [EthDeviceID].8029h ;RTL8029AS .

je

@@lnitAdapter cmp [EthDevicelD],0926h ;VTB6C926 jne

@@AdapterNotFound

@@InitAdapter:

; Инициализировать сетевой контроллер

call InitializeAdapter

; Вывести текст

Листинг 9.3(продолжение) MShowColorString TxtO

mov [TextColorAndBackground],LIGHTGREEN MShowText 6,Txtl

mov [TextColorAndBackground],YELLOW : Загрузить физический адрес и групповой адрес

call SetEthernertAddress : Активизировать адаптер

mov AL,22h

mov DX,[EthBaseAddr] out DX.AL

; Ожидать сигнал о поступлении пакета

@@WaitPacket:

mov DX.[EthBaseAddr]

add DX.INTERRUPTSTATUS in AL.DX

test AL.Olh ;получен пакет? jz

@@WaitPacket

; Принять пакет

call GetPacket

; Остановить работу адаптера

mov AL,21h

mov DX.[EthBaseAddr] out DX.AL

; Отобразить пакет на экране

call ShowPacket : Ожидать нажатия клавиши

MShowColorString AnyK call GetChar

; Переустановить текстовый режии и очистить экран

mov АХ.З int 10h

; Выход в DOS

mov AH,4Ch int 21h

; Обработка ошибок P@BadRegi sterNumber:

MFatalError BadRg

@@AdapterNotFound:

MFatalError NoEth ENDP WaitAnyPacket

• ******************************* AAA ***************

;* ВЫВЕСТИ НА ЭКРАН ПРИНЯТЫЙ ПАКЕТА В КОДЕ ASCII *

;**********************АААААА******А**************

PROC ShowPacket NEAR pusha

push ES

: Отобразить параметры принятого пакета на экране

: Общий разнер принятого пакета в байтах MShowDecWord 2.21.<[word ptr DataInBuffer+2]>

; Адрес получателя

MShowHexByte 3,19,<[DataInBuffer+9]> MShowHexByte 3,21,<[DataInBuffer+8]> MShowHexByte 3,23.<[DataInBuffer+7]> MShowHexByte 3.25.<[DataInBuffer+6]> MShowHexByte 3.27,<[DatalnBuffer+5]> MShowHexByte 3,29,<[DataInBuffer+4]>

; Адрес отправителя MShowHexByte 4,19,<[DataInBuffer+15]> MShowHexByte 4.21.<[DataInBuffer+14]> MShowHexByte 4,23.<[DataInBuffer+13]> MShowHexByte 4,25,<[DataInBuffer+12]> MShowHexByte 4,27,<[DataInBuffer+ll]> MShowHexByte 4,29,<[DataInBuffer+10]>

; Разнер поля данных или тип пакета MShowHexWord 5,10,<[word ptr DataInBuffer+16]> : Установить начало области вывода данных

mov AX,0B800h

mov ES.AX

mov DI.7*160 eld

; Задать для синволов светло-голубой цвет и синий фон

mov АН.LIGHTCYAN+BLUE*16

; Отобразить содержимое поля данных в коде ASCII

mov SI.offset DatalnBuffer

add SI.18 ;адрес поля данных

mov CX,[RecPackSize] sub СХД8 :размер поля данных в байтах

@@OutNextChar: lodsb stosw

loop

@@OutNextChar

pop ES

popa

ret

ENDP ShowPacket ENDS

: Подключить процедуры ввода данных и вывода на экран

; в текстовом режиме

Include "listl_02.inc"

: Подключить процедуры перевода десятичных чисел

Include "list2_05.inc"

; Подключить процедуры для обслуживания работы

; контроллера Ethernet

Include "list9_01.inc"

END

Работа сети Ethernet начинается с установления контакта между узлами сети. Первоначально все узлы находятся в режиме прослушивания.

Процесс установления контакта между узлами сети Ethernet начинается с обмена физическими адресами. Адаптер, который первым захватил линию передачи, отправляет свой физический адрес в широковещательном режиме всем остальным узлам сегмента сети и переходит в режим приема; далее процесс повторяется, пока все адаптеры поочередно не сообщат свои физические адреса. Получив адреса всех узлов сегмента, компьютеры могут затем взаимодействовать между собой, используя эти адреса.

Листинг 9.4 содержит программу TransferTestPacket, которая производит передачу тестового пакета в широковещательном режиме. Блок данных пакета имеет размер 256 байт и содержит числа от 0 до 255. Программа использует процедуры для работы с NE2000-coBMe- стимым адаптером из листинга 9.1, а также универсальные процедуры ввода-вывода из листинга 1.2 и процедуры перевода десятичных чисел из листинга 2.5.

Программа передачи тестового пакета ориентирована на совместное использование с программой прослушивания сети из листинга 9.3. Соедините два компьютера между собой и на одном из них запустите программу прослушивания, а затем запустите программу передачи тестового пакета на другом. После передачи пакета программа прослушивания должна показать физический адрес адаптера, передавшего пакет.

ПРИМЕЧАНИЕ

В том случае, если в сеть соединено больше двух компьютеров, на время выполнения эксперимента желательно выключить питание компьютеров, не участвующих в эксперименте.

Листинг 9.4. Программа, передающая тестовый пакет данных

IDEAL

Р386

LOCALS

MODEL MEDIUM

; Подключить файл мнемонических обозначений

; кодов управляющих клавиш и цветовых кодов

Include "listl_03.inc" : Подключить файл макросов

Include "listl_04.inc"

DATASEG

; Текстовые сообщения TxtO

DB LIGHTCYAN,0,20

DB "ФОРМИРОВАНИЕ И ПЕРЕДАЧА ТЕСТОВОГО ПАКЕТА",0

DB LIGHTCYAN,1,16,"ПРИ ПОМОЩИ NE2000-COBMECTHMOrO "

DB "АДАПТЕРА ETHERNET",О

DB LIGHTGREEN,12,27,"Передача пакета завершена",О AnyK

DB YELLOW,24,29,"Нажните любую клавишу".О ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS

CODESEG

;* Основной модуль программы *

PROC TransferTestPacket

mov AX.DGROUP

mov DS.AX

mov [CS:MainDataSeg].AX

; Установить текстовый режим и очистить экран

mov АХ.З int 10h

; Скрыть курсор • убрать за нижнюю границу экрана

mov [ScreenStri ng],25

mov [ScreenColumn],0 call SetCursorPosition

; Найти адаптер Ethernet

cal1 SearchEthernetContr

; Проверить тип адаптера

cmp [EthDeviceID],8029h ;RTL8029AS

je

@@InitAdapter cmp [EthDeviceID],0926h ;VT86C926 jne

@@AdapterNotFound

@@InitAdapter:

; Инициализировать сетевой адаптер call Initial izeAdapter

; Загрузить физический адрес и групповой адрес

call SetEthernertAddress•

; Активизировать адаптер

mov AL,22h

mov DX,[EthBaseAddr] out DX.AL : Передать тестовый пакет

cal1 SendTestPack : Остановить работу адаптера

mov AL,21h

mov DX,[EthBaseAddr]

Листинг 9.4 (продолжение)

out DX.AL

; Вывести текстовое сообщение о завершении передачи MShowColorText 3,TxtO MShowColorString AnyK call GetChar

; Переустановить текстовый режин и очистить экран

mov АХ,3 int 10h

; Выход в DOS

mov AH,4Ch int 21h

; Обработка ошибок

@@BadRegi sterNumber:

MFatalError BadRg

@@AdapterNotFound:

MFatalError NoEth ENDP TransferTestPacket

;* СФОРМИРОВАТЬ И ПЕРЕДАТЬ ТЕСТОВЫЙ ПАКЕТ ДАННЫХ * ;* Входные параметры:*

;* AL – код символа-заполнителя.*

PROC SendTestPack near pusha

; Сформировать заголовок пакета данных

; Адрес получателя (групповой)

mov [word ptr DataOutBuffer],OFFFFh

mov [word ptr DataOutBuffer+2],OFFFFh

mov [word ptr DataDutBuffer+4],OFFFFh

; Адрес отправителя

mov AL.[PhisicalAddress]

mov [DataOutBuffer+6].AL

mov AL.[PhisicalAddress+2]

mov [DataOutBuffer+7].AL

mov AL,[PhisicalAddress+4]

mov [DataOutBuffer+8],AL

mov AL.[PhisicalAddress+6]

mov [DataOutBuffer+9].AL

mov AL,[PhisicalAddress+8]

mov [DataOutBuffer+lO],AL

mov AL.[PhisicalAddress+10]

mov [DataOutBuffer+ll],AL

; Размер пакета в байтах

mov [word ptr DataOutBuffer+123,25fe

; Создать тестовый блок данных, заполнив его

; последовательностью чисел от 0 до 255

mov СХ.256 xor AL.AL

mov BX,offset DataOutBuffer+14

@@NextByte:

mov [BX],AL

inc AL

inc BX loop

@@NextByte

; Загрузить пакет в панять адаптера

mov SI.offset DataOutBuffer

mov CX,14+256 cal1 SendPacket : Цикл ожидания завершения передачи пакета

@@Wait:

mov DX,[EthBaseAddr] in AL.DX

cmp AL,26h ;передатчик занят?

je

@@Wa-it

popa

ret

ENDP SendTestPack ENDS

; Подключить процедуры ввода данных и вывода на экран : в текстовой режине

Include "listl_02.mc"

: Подключить процедуры для обслуживания работы : адаптера Ethernet

Include "list9_01.inc"

END

Соединение на основе коаксиального кабеля очень чувствительно к качеству заземления компьютеров (нарушение заземления одного системного блока может привести к повреждению всех адаптеров в сегменте сети), поэтому при проведении экспериментов с сетевыми адаптерами желательно использовать соединение на основе UTP-кабеля с витыми парами проводов.

СОВЕТ

Для соединения в сеть двух компьютеров напрямую, без использования концентратора, можно использовать так называемый перекрестный кабель (crossover cable) с двумя витыми парами проводов [17]. Контакты разъемов RJ-45 соединяются следующим образом: 1 -3 и 2-6 (первая витая пара), 3-1 и 6-2 (вторая витая пара).

•      Команда EAh (Set Stream Mode) переключает мышь в потоковый режим: передача пакетов данных будет происходить при каждом изменении состояния устройства.

•Команда EBh (Read Data) вызывает (сразу по ее получении мышью) выдачу пакета данных об изменении координат и состоянии кнопок (данные передаются даже в том случае, если координаты устройства и состояние кнопок не изменялись).

•     Команда ECh (Reset Wrap Mode) отключает эхо-режим, то есть служит для отмены команды EDh.

* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ PS/2 *

Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 59h;

•           в BX — значение 0.

Функция возвращает в регистрах следующие значения:

•           в АХ — расширенный код ошибки (см. табл. 6.1.);

По запросу Get Descriptor хаб передает хосту дескриптор, тип которого указан в запросе.

Запрос Set Descriptor позволяет дополнить существующий (или добавить новый) дескриптор устройства, конфигурации или строки. Запрос имеет следующие параметры:

•       bmRequestType = 00000000b;

•       wVal ue — тип дескриптора и индекс дескриптора;

•       wlndex — ноль или идентификатор языка;

•      wLength — размер дескриптора в байтах.

В процессе выполнения запроса Set Descriptor хост передает периферийному устройству дескриптор, тип которого определяется параметрами запроса.

По запросу Get Configuration устройство выдает код своей текущей конфигурации. Запрос имеет следующие параметры:

•       bmRequestType = 10000000b;

Принтеры, имеющие несколько конфигураций, интерфейсов или несколько альтернативных установок для интерфейса, могут выдавать отдельную строку-идентификатор для каждого из возможных вариантов настройки.

Запрос Get Port Status позволяет получить содержимое регистра состояния принтера. Запрос имеет следующие параметры:

•       bmRequestType = 10100001b;

•       bRequest = 1;

•wValue = 0;

•       wlndex — индекс интерфейса;

•       wLength =1.

 

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии