Главная » Ассемблер, Железо » Дескриптор строки USB

0

Дескриптор строки (UNICODE String Descriptor) содержит текст в формате UNICODE. Строка не ограничивается нулем: длина строки вычисляется путем вычитания 2 из размера дескриптора. Структура Дескриптора строки показана в табл. 8.8.

Таблица 8.8. Структура Дескриптора строки

Смещение

Мнемоника

Размер

Описание

0

bLength

BYTE

Размер данного дескриптора

 

 

 

в байтах (N + 2)

1

bDescriptorType

BYTE

Тип дескриптора (STRING)

2

bString

N байт

Строка символов UNICODE

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

Устройство может поддерживать несколько различных языков, поэтому при запросе дескриптора строки нужно задавать 16-разрядный идентификатор языка (LANGID).

Строковый индекс 0 для всех языков соответствует дескриптору строки, содержащей массив 16-разрядных идентификаторов всех поддерживаемых устройством языков. Массив идентификаторов не ограничен нулем: размер массива в байтах вычисляется путем вычитания 2 из размера дескриптора. Структура массива следующая: байт 0 содержит размер дескриптора в байтах (число идентификаторов + 2), байт 1 описывает тип дескриптора (STRING), далее следуют 16-разрядные идентификаторы языка.

Примеры использования стандартных дескрипторов приведены в листингах 8.1 и 8.2. Листинг 8.1 содержит набор процедур общего назначения, предназначенных для работы с устройствами USB:

•     процедура Fi nclUSBControl 1 ег предназначена для выполнения последовательного поиска хост-контроллеров USB на шине PCI при помощи функций PCI BIOS (в случае обнаружения очередного контроллера процедура запоминает его параметры и возвращает управление вызывающей программе);

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

•    процедура Initial izeDescriptors формирует основные структуры данных хост-контроллера USB;

•    процедура StatusIN_Transaction предназначена для считывания дескрипторов состояния устройства;

•    процедура Setup_Transacti on предназначена для установки параметров устройства (в первую очередь — номера устройства на шине USB);

•    процедура Enumerati п использует процедуру Setup_Transacti on для присвоения устройству порядкового номера;

•    процедура GetConfigurationDescnptor использует процедуру Status IN_Transacti on для получения от устройства стандартного дескриптора конфигурации.

Листинг 8.1. Процедуры для работы с устройствами USB DATASEG

; Признак успешного завершения поиска

SearchResult

DB О

: Индекс хост-контроллера

USB_HostIndex DW О

: ПАРАМЕТРЫ КОНТРОЛЛЕРА USB

; Координаты устройства PCI

USB_BusNum

DB ? :номер шины

USB_DevNum

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

; Идентификаторы устройства PCI

USBVendorlD DW ? идентификатор изготовителя

USBDevicelD DW ? идентификатор устройства

; Адрес блока регистров контроллера PCI USB

USB_BaseAddr DW ?

; Номер используемого прерывания IRQ

USBIntLine

DB ?

; Сообщения об ошибках

BadRg

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

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

DB 12,2В,"Контроллер USB не найден",О NoDev

DB 12,26,"Устройство USB не обнаружено",О TmOut

DB 12,21,"Превышен допустимый интервал ожидания",О BfErr

DB 12,28,"Буфер данных переполнен",О DsErr

DB 12.25,"Список дескрипторов переполнен",О

; ПАРАМЕТРЫ УСТРОЙСТВА : Номер используемого устройством порта USB USB_PortNum

DB ?

; Адрес регистра состояния используемого порта USB_PortReg DW О

; Тип устройства:

; 0 – полноскоростное, 1 – низкоскоростное USB DeviceJype

DB О

; Номер устройства на шине USB USBDevi ce_Nuuiber

DB О

; Номер конечной точки USB Enpoi ntNumber

DB О

: ПРЕОБРАЗОВАННЫЕ ЗНАЧЕНИЯ ПАРАМЕТРОВ УСТРОЙСТВА

; Сдвинутый влево на 7 разрядов номер функции ShFuncNum DD ?

; Сдвинутый влево на 15 разрядов номер конечной точки ShEndpNum DD ?

; Сдвинутый влево на 26 разрядов тип устройства ShDevType DD ?

; Сдвинутый влево на 21 размер пакета ShPackSize DD ?

; ФИЗИЧЕСКИЕ АДРЕСА СТРУКТУР ДАННЫХ USB

; Линейный адрес заголовка списка дескрипторов AddrQHDD ?

; Линейный адрес массива дескрипторов передачи Addr_TD_Array DD ?

; Линейный адрес дескриптора команды AddrCommandDescr DD ?

; Линейный адрес буфера данных AddrDataDescr DD ? : ПАРАМЕТРЫ ТРАНЗАКЦИЙ : Нонер кадра в момент начала транзакции StartFrame DW ? : Состояние триггера данных DataTrigger DD ?

; Объем данных в передаваеиои иассиве

BULK_DataSize DW О

; БУФЕР ДАННЫХ

DataBuffer

DB 4096 DUP(?)

ENDS

CODESEG

;* НАЙТИ ХОСТ-КОНТРОЛЛЕР USB И ОПРЕДЕЛИТЬ*

;*ETD ОСНОВНЫЕ ПАРАМЕТРЫ*

;* Подпрограииа выполняет поиск хост-контроллеров*

;* USB, подключенных к шине PCI.*

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

;* USB Hostlndex – индекс хост-контроллера.*

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

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

;* переиенных USB_BusNum, USB_DevNum, USB_VendorID,*

;* USB DevicelD, USB_BaseAddr и USB IntLine.*

.AAAAAAAAAAAAAA

PROC FindUSBController near pushad

; Найти первый USB-контроллер по коду класса

mov AX,0B103h

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

mov ЕСХ,0С0300Н

mov SI, [USBHostlndex] int lAh

jne

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

; Выход: контроллер USB не найден

mov [SearchResu1t],l popad ret

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

@@ReadPCIRegisters:

; Запомнить координаты контроллера

mov [USBBusNum]. ВН

mov [USB_DevNum],BL

; Получить идентификатор изготовителя

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

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

jc

@@BadRegisterNumber

mov [USBVendorlD] ,CX : Получить идентификатор устройства

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

mov DI,2 ;смещение слова int lAh

jc P@BadRegisterNumber

mov [USBDevicelD].CX : Получить базовый адрес блока регистров контроллера USB

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

mov DI,20h ;смещение слова int lAh

jc

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

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

mov [USB_BaseAddr].CX : Получить номер используемого устройством : прерывания IRQ

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

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

jc PffiadRegi sterNumber

mov [USB_IntLine].CL

; Выход: контроллер найден, увеличить значение индекса

inc [USB_HostIndex] popad ret

; ОБРАБОТКА DUIMBDK

; Неверный номер регистра PPBadRegi sterNumber:

MFatalError BadRg

ENDP FindUSBController

;’* ЗАДЕРЖКА НА ОДИН ТИК СИСТЕМНОГО ТАЙМЕРА *

PROC Wait05s near

pushES

pushEAX

movAX,0

movES.AX

movEAX,[ES:046Ch]

incEAX

@@Wait: cmpEAX,[ES:046Ch]

jae<a@wait

popEAX

popES ret

ENDP Wait05s

;* ИНИЦИАЛИЗИРОВАТЬ ДЕСКРИПТОРЫ USB *

PROC InitializeDeascriptors near pushad

; Очистить 1 Мбайт памяти

mov EBX.FrameListBaseAddr

mov ECX.100000h/4 xor EAX,EAX

@@ClearMemory:

mov [GS:EBX],EAX

add EBX.4 dec ECX jnz

@@ClearMemory

; ПОДГОТОВИТЬ СТРУКТУРЫ ДАННЫХ ДЛЯ РАБОТЫ С USB

; Вычислить линейный адрес буфера данных xor ЕАХ, ЕАХ xor ЕВХ,ЕВХ

mov AX.DS shl ЕАХ,4

mov ВХ,offset DataBuffer

add EAX,ЕВХ

mov [Addr_DataDescr],EAX

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

xor ЕАХ,ЕАХ

mov AX.USBDESCR

shl ЕАХ,4

mov EDX,ЕАХ ;запомнить адрес сегмента

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

Листинг 8.1 (продолжение) xor ЕВХ.ЕВХ

mov ВХ, off set QH_Descnptor

add EAX.EBX

mov [AddrQH],EAX

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

mov ЕАХ.EDX

mov ВХ,offset TD_Array

add EAX,EBX

mov [Addr_TD_Array],EAX

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

mov EBX.FrameListBaseAddr

mov ЕАХ,[AddrQH]

or  EAX.10b; T = 0. Q = 1

mov СХД024

@@ActlvateNextFrame:

mov [GS:EBX],EAX

add EBX,4

loop

@@ActivateNextFrame

popad

ret

ENDP InitializeDeascnptors

;*ЗАПРОСИТЬ ИНФОРМАЦИЮ ОБ УСТРОЙСТВЕ USB *

;* Передаваемые параметры:*

;* SI – смещение дескриптора команды в сегменте данных.*

PROC StatusIN_Transaction near pushad

; Запомнить в DX объем передаваемых данных

mov DX,[SI+6] : Вычислить линейный адрес данных дескриптора команды xor ЕАХ,ЕАХ

mov AX.DS shl ЕАХ, 4 and ESI,OFFFFh

add EAX,ESI

mov [AddrCommandDescr], EAX : Загрузить в ESI указатель на массив дескрипторов

mov ESI,[Addr_TD_Array]

; Сформировать дескриптор команды : Указатель на следующий TD

mov ЕАХ, ESI

add ЕАХ.32

mov [GS:ESI],EAX : Слово управления

mov ЕАХ,[ShDevType] ;тип устройства or EAX,00800000h ;признак активности

mov [GS:ESI+4],EAX

: Маркер

movЕАХ,[ShFuncNum] ;номер функции

orEAX,00E0002Dh ;передать 8 байт

mov[GS:ESI+8],EAX

; Указатель на дескриптор команды

movЕАХ, [AddrCommandDescr]

mov[GS:ESI+12],EAX

xorEAX,EAX

mov[GS:ESI+16].EAX

mov[GS:ESI+20],EAX

mov[GS:ESI+24],EAX

mov[GS:ESI+28],EAX

addESI,32

; Вычислить количество 8-байтных блоков

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

mov CX.DX

shr СХ,3количество 8-байтных блоков

cmp CX.64-3

ja

@@TD_Array_Error

and EDX,111b :размер последнего блока

mov EBX,[AddrDataDescr]

mov EDI,80000h :триггер данных

cmp CX,0

je

@@ShortData81ock

@@NextDataBlock:

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

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

mov ЕАХ.ESI

add ЕАХ.32

mov [GS:ESI],EAX

; Слово управления

mov ЕАХ,[ShDevType] ;тип устройства or ЕАХ,00800000И .-признак активности

mov [6S:ESI+4].ЕАХ : Маркер

mov ЕАХ.[ShFuncNum] ;номер функции or ЕАХ.00Е00069И ;принять 8 байт or ЕАХ,EDI;триггер данных

mov [GS:ESI+8],EAX

xor EDI,80000h ;переключить триггер

mov [GS:ESI+12],EBX ;буфер данных

add EBX,8

xor EAX,EAX

mov [GS:ESI+16],EAX

mov [GS:ESI+20],EAX

mov [GS:ESI+24].EAX

mov [GS:ESI+28],EAX

add ESI,32

loop

@@NextDataBlock

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

; Имеется короткий блок?

@@ShortDataBlock:

сшр DX.0

je

@@NoShortBlock

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

mov ЕАХ,ESI

add ЕАХ.32

mov [GS:ESI],EAX : Слово управления

mov ЕАХ,[ShDevType] ;тип устройства or ЕАХ.00800000h :признак активности

mov [GS:ESI+4],EAX : Маркер

mov ЕАХ,[ShFuncNum] ;номер функции dec DX shl EDX,21

or EAX,EDX;размер блока

or EAX,EDI;триггер данных

or EAX,69h

mov [GS:ESI+8],EAX

mov [GS:ESI+12],EBX

xor EAX.EAX

mov [GS:ESI+16],EAX

mov [GS:ESI+20],EAX

mov [GS:ESI+24],EAX

mov [GS:ESI+2B],EAX

add ESI.32

@@NoShortBlock:

: Сформировать дескриптор пустого пакета

mov [dword ptr GS:ESI],lb последний TD

; Слово управления

mov EAX,[ShDevType] ;тип устройства or EAX,00B00000h ;признак активности

mov [GS:ESI+4],EAX

; Маркер

mov EAX.[ShFuncNum] ;нонер функции or EAX.OFFEBOOElh ;передать пустой блок

mov [GS:ESI+8],EAX xor EAX. EAX

mov [GS:ESI+12],EAX

mov [GS:ESI+16],EAX

mov [GS:ESI+20],EAX

mov [GS:ESI+24],EAX

mov [GS:ESI+2B],EAX

; Установить указатель на список дескрипторов

; (контроллер начинает передачу данных)

mov ЕАХ, [AddrTDArray]

mov ESI,[Addr_QH]

add ESI.4

mov [GS:ESI].EAX

; Запомнить номер текущего кадра

mov DX,[USBBaseAddr]

add DX.6 in AX.DX

mov [StartFrame],AX : Ожидать завершения операции

@@Wai tOpComplete:

: Проверить номер кадра

in AX.DX

sub AX,[StartFrame]

and AX,7FFh :выделить младшие 11 разрядов

cmp AX.500 :ожидать не более 500 кадров

ja

@@TimeOut превышен интервал ожидания

: Проверить слово состояния

cmp [dword ptr GS:ESI].lb

jne

@@Wait_OpComplete

popad

ret

: Превышен допустимый интервал ожидания

@@TimeOut:

: Остановить контроллер

mov DX. [USBBaseAddr]

mov AX.O out DX.AX MFatalError TmOut : Переполнен массив дескрипторов

@@TD_Array_Error:

: Остановить контроллер

mov DX,[USB_BaseAddr]

mov AX, 0 out DX.AX MFatalError DsErr ENDP StatusIN Transaction

;*ПЕРЕДАТЬ КОМАНДУ УСТРОЙСТВУ USB*

;* Передаваемые параметры:*

;* SI – смещение дескриптора команды в сегменте данных.*

PROC Setup Transaction near pushad

; Вычислить линейный адрес данных дескриптора команды xor ЕАХ. ЕАХ

mov AX.DS shl ЕАХ,4 and ESI,OFFFFh

add EAX,ESI

mov [AddrCommandDescr]. EAX

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

; Загрузить в ESI указатель на массив дескрипторов

mov ESI, [AddrTDArray]

: Сформировать дескриптор команды

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

mov ЕАХ,ESI

add ЕАХ,32

mov . [GS:ESI],ЕАХ : Слово управления

mov ЕАХ,[ShDevType] ;тип устройства or EAX,00800000h ;признак активности

mov [GS:ESI+4],ЕАХ : Маркер

mov ЕАХ.[ShFuncNum] ;номер функции

or EAX.00E0002Dh передать 8 байт

mov [GS:ESI+8],ЕАХ

; Указатель на дескриптор команды

mov ЕАХ.[Addr_CommandDescr]

mov [GS:ESI+12].ЕАХ

xor EAX, EAX

mov [GS:ESI+16],EAX

mov [GS:ESI+20],EAX

mov [GS:ESI+24],EAX

mov [GS:ESI+28],EAX

add ESI,32

; Сформировать дескриптор для приема пустого пакета

mov [dword ptr GS:ESI].lb последний TD

; Слово управления

mov ЕАХ.[ShDevType] :тип устройства or ЕАХ,00800000h ;признак активности

mov [GS:ESI+4],ЕАХ

; Маркер

mov ЕАХ.[ShFuncNum] ;номер функции

or EAX,0FFE80069h ;принять пустой блок

mov [GS:ESI+8],EAX

xor ЕАХ, ЕАХ

mov [GS:ESI+12],ЕАХ

mov [GS:ESI+16].EAX

mov [GS:ESI+20],EAX

mov [GS:ESI+24],EAX

mov [GS:ESI+28],EAX

: Установить указатель на список дескрипторов

: (контроллер начинает передачу данных)

mov ЕАХ.[Addr_TD_Array]

mov ESI, [AddrQH]

add ESI,4

mov [GS:ESI],EAX

; Запомнить номер текущего кадра

mov DX.[USB_BaseAddr]

add DX.6 , in AX,DX

mov [StartFrame],AX

; Ожидать завершения операции

@@Wai tJDpComplete:

: Проверить номер кадра

in AX.DX

sub AX,[StartFrame]

and AX.7FFh ;выделить младшие 11 разрядов

cmp AX.500 ;ожидать не более 500 кадров

ja

@@TimeOut превышен интервал ожидания

: Проверить слово состояния

cmp [dword ptr GS:ESI],lb

jne

@@WaitJDpComplete

popad

ret

: Превышен допустимый интервал ожидания

@@TimeOut:

; Остановить контроллер

mov DX,[USB_BaseAddr]

mov AX, 0 out DX.AX MFatalError TmOut ENDP Setup_Transaction

;* ПРИСВОИТЬ ПОРЯДКОВЫЙ НОМЕР НАЙДЕННОМУ УСТРОЙСТВУ * ;* Передаваемые параметры:*

;* USBPortReg – адрес регистра порта;*

;* USB_Device_Number – порядковый номер устройства. *

PROC Enumeration near

pushad

; Разблокировать порт

mov DX,[USB_PortReg]

mov AX,1110b out DX.AX

; Определить и запомнить тип устройства

mov DX,[USBPortReg] in AX.DX test AX,100000000b jnz

@@Low

mov [dword ptr ShDevType],0

jmp short

@@DeviceTypeSaved

@@Low:

mov [dword ptr ShDevType].4000000h

@@Dev1ceTypeSaved:

; После сброса устройство имеет нулевой номер

mov [dword ptr ShFuncNum],0 : Вычислить порядковый номер

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

inc [USBDeviceNumber]

; Подать команду "Set Address" xor AX,AX

mov AL,[USBDevi ce_Number]

mov [word ptr SetAddrDesc+2],AX

mov SI,offset SetAddrDesc call Setup_Transaction : Присвоить устройству порядковый номер xor ЕАХ,ЕАХ

mov AL,[USB_Device_Number] shl EAX.8

mov [ShFuncNum].EAX popad ret

ENDP Enumeration

;* ПОЛУЧИТЬ ДЕСКРИПТОР КОНФИГУРАЦИИ *

PROC GetConfigurationDescriptor near pusha

: Подать команду "Get Configuration Descriptor"

mov SI.offset GetConfDesc call StatusINJTransaction

; Запомнить полный разнер группы дескрипторов : конфигурации

mov АХ,[word ptr DataBuffer+2]

mov [word ptr GetConfDesc+6],AX

; Подать конанду "Get Configuration Descriptor"

mov SI.offset GetConfDesc call StatusIN_Transaction popa ret

ENDP GetConfigurationDescriptor ENDS

Листинг 8.2 содержит программу USB_Device_Search, предназначенную для тестирования интерфейса USB. Программа выполняет поиск устройства USB по всем портам всех имеющихся в системе хост- контроллеров. Как только программа обнаруживает какое-либо устройство, она прекращает процесс поиска и выводи на экран содержимое регистров хост-контроллера, к которому подсоединено найденное устройство. Далее программа запрашивает у устройства и отображает на экран содержимое дескриптора устройства и дескриптора конфигурации.

Программа USB_Device_Search использует универсальные процедуры ввода-вывода из листинга 1.2, процедуру переключения в линейный

режим адресации из листинга 2.1, процедуры для вывода десятичных чисел из листинга 2.5 и набор процедур для работы с хост-контроллером и устройствами USB из листинга 8.1.

ПРИМЕЧАНИЕ

Программа может обнаружить только устройство с включенным электропитанием.

Листинг 8.2. Поиск устройств на шине USB и считывание

параметров первого обнаруженного устройства

IDEAL

Р386

LOCALS

MODEL MEDIUM

; Физический адрес области памяти для списка кадров USB FrameListBaseAddr equ 200000h

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

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

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

Include "listl_04.inc"

DATASEG

; ТЕКСТОВЫЕ СООБЩЕНИЯ TxtO

DB LIGHTCYAN.О,26

DB "ПОИСК И ОПРОС УСТРОЙСТВА USB",0 Txtl

DB 2.27,"ПАРАМЕТРЫ ХОСТ-КОНТРОЛЛЕРА",О

DB 4,10."Порядковый нонер контроллера:".О

DB 5,8."Базовый адрес набора регистров:",0

DB 6,В,"Нонер используеного прерывания:",0

DB 9,24,"СОДЕРЖИМОЕ РЕГИСТРОВ КОНТРОЛЛЕРА".0

DB 11,23,"Регистр команды:",0

DB 12,21,"Регистр состояния:",0

DB 13,7,"Регистр управления прерываниями:",0

DB 14,27,"Нонер кадра:",0

DB 15,11,"Базовый адрес списка кадров:",0

DB 16,14,"Модификация начала кадра:",0

DB 17,13,"Регистр состояния порта 1:",0

DB 1В,13."Регистр состояния порта 2:".О

DB 20.0,"Устройство подключено к порту N".0

DB 22.0."Тип устройства:".О Full

DB LIGHTCYAN,22.16,"полноскоростное",0 LowS

DB LIGHTMAGENTA,22.16."низкоскоростное".0 Txt2

DB 2,23."СТАНДАРТНЫЙ ДЕСКРИПТОР УСТРОЙСТВА".0

DB 4,14."Размер дескриптора. байт:",0

DB 5,1В,"Код типа дескриптора:".Опродолжение*

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

DB 6,9."Номер версии спецификации USB:".О

DB 7,17,"Код класса устройства:",0

DB 8,14,"Код подкласса устройства:",0

DB 9,14,"Код протокола устройства:",0

DB 10,1,"Макс, размер пакета для нулевой точки:",0

DB 11,22,"Код изготовителя:",0

DB 12.27,"Код изделия:",0 D8 13,10,"Число доступных конфигураций:",0 Txt3

DB 2,23."СТАНДАРТНЫЙ ДЕСКРИПТОР КОНФИГУРАЦИИ",0

DB 4,14,"Размер дескриптора, байт:".0

DB 5,18,"Код типа дескриптора:",0

DB 6,14,"Общий объем данных, байт:",0

DB 7,16,"Количество интерфейсов:",0

DB 8,15,"Код данной конфигурации:",0

DB 9,11,"Характеристики конфигурации:",0

DB 10,13,"Потребляемая мощность, мА:",0 АпуК

DB YELLOW,24,29,"Нажмите любую клавишу",0 : ДЕСКРИПТОРЫ КОМАНД

: Дескриптор команды "Get Device Descriptor" GetDevDesc

DB 80h,6

DW 100h,0,8

; Создать дескриптор команды "Set Address" SetAddrDesc

DB 0,5 DW 1,0,0

; Дескриптор команды "Get Configuration Descriptor" GetConfDesc

DB 80h,6

DW 200h,0,8

ENDS

; Область памяти для хранения дескрипторов передачи SEGMENT USBDESCR para public ‘DATA’

; Заголовок очереди дескрипторов QH_Descriptor DD 00000003И единственный заголовок DD 00000000h указатель на первый TD DD 0,0,0,0,0,0 ;область данных ПО : Список дескрипторов для одной транзакции TD_Array DD 8*64 DUP(?) ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h 0UP(?)

ENDS

CODESEG

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

* A Af А A "A A A A A’AAAA А А1 А А" А А1 А А1 А AAA АА AA

PROC USB Device Search

mov AX, DGROUP

mov DS.AX

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

mov АХ.З int 10h

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

mov [ScreenStri ng].25

mov [ScreenColumn],О call SetCursorPosition : Проверить наличие PCI BIOS

mov AX.OBlOlh int lAh

jc

@@PCIBIOSNotFound cmp EDX,20494350h jne

@@PCIBIOSNotFound

; Установить режим прямой адресации памяти

call Initialization

; Инициализировать дескрипторы USB

call InitializeDeascriptors

; ЦИКЛ ПОИСКА ХОСТ-КОНТРОЛЛЕРОВ

mov [USB_HostIndex].0

@@NextHost:

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

call FindUSBController cmp [SearchResult].0 jne

@@NoHost : Произвести глобальный сброс контроллера

mov DX.[USB_BaseAddr]

mov AX,100bустановить сигнал сброса

‘ out DX.AX

; Ожидать не иенее 10 мс call Wait05S

; Снять сигнал сброса

mov АХ.0 out DX.AX : Ожидать не ненее 10 мс call Wait05s : Проверить регистр состояния порта 1

mov [USBPortNum].1

mov DX,[USB_BaseAddr]

add DX.lOh in AX.DX test AX,000Fh jnz PPSavePortReg

; Проверить регистр состояния порта 2

mov [USBPortNum].2

add DX.2 in AX.DX test AX.OOOFh

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

jz

@@NextHost

; Запомнить адрес регистра состояния порта

@@SavePortReg:

mov [USBPortReg],DX

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

; адреса списка кадров

mov DX,[USB_BaseAddr]

add DX,6 ‘

mov AX,0 out DX.AX

add DX,2

mov EAX.FrameListBaseAddr out DX.EAX

; ОТОБРАЗИТЬ СОДЕРЖИМОЕ РЕГИСТРОВ ВВОДА-ВЫВОДА

; Очистить экран

call ClearScreen

; Вывести заголовок экрана

MShowColorString TxtO

; Вывести заголовки полей

mov [TextColorAndBackground],LIGHTGREEN MShowText 15,Txtl

; Вывести базовый адрес и номер прерывания

mov [TextColorAndBackground],LIGHTGREY MShowDecByte 4,40.<[byte ptr USB_HostIndex]> MShowHexWord 5,40. [USB BaseAddr] MShowHexByte 6.40.[USBIntLine] : Вывести содержимое регистров

mov DX,[USBBaseAddr] in AX.DX MShowHexWord 11.40,AX

add DX.2 in AX.DX MShowHexWord 12.40,AX

add DX.2 in AX.DX MShowHexWord 13.40.AX

add DX.2 in AX.DX MShowHexWord 14.40.AX

add DX.2 in EAX.DX MShowHexDWord 15,40.EAX

add DX.4 in AL.DX MShowHexByte 16.40.AL

mov DX,[USB_BaseAddr]

add DX.lOh in AX.DX

MShowHexWord 17,40,AX -

add DX.2 in AX.DX MShowHexWord 18,40,AX

: Показать нонер используемого порта

MShowDecByte 20,32,[USB_PortNum]

; Указать тип устройства

mov DX,[USBPortReg] in AX.DX test AX.lOOOOOOOOb jnz

@@Low

mov [dword ptr ShDevType],0 MShowColorString Full

jmp short

@@WaitAnyKey

@@Low:

mov [dword ptr ShDevType],4000000h MShowColorString LowS

; Ожидать нажатия любой клавиши

@@WaitAnyKey:

MShowColorString AnyK call GetChar

: Включить хост-контроллер

mov DX,[USBBaseAddr]

mov AX,1 out DX.AX

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

mov [USB_Devi ceNumber],0 call Enumeration

; ПОЛУЧИТЬ И ОТОБРАЗИТЬ НА ЭКРАНЕ ДЕСКРИПТОР УСТРОЙСТВА

; Подать команду "Get Device Descriptor"

mov SI,offset GetDevDesc call StatusINJTransaction : Очистить экран

call ClearScreen : Вывести заголовок экрана

MShowColorString TxtO : Вывести заголовки полей

mov [TextColorAndBackground],LIGHTGREEN MShowText ll,Txt2

; Вывести базовый адрес и номер прерывания

mov [TextColorAndBackground],LIGHTGREY MShowOecByte 4,40,[DataBuffer] MShowHexByte 5.40,<[DataBuffer+l]> MShowHexWord 6,40,<[word ptr DataBuffer+2]> MShowHexByte 7,40,<[DataBuffer+4]> MShowHexByte 8,40,<[DataBuffer+5]> MShowHexByte 9.40,<[DataBuffer+6]>

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

MShowOecByte 10,40,<[DataBuffer+7]> MShowHexWord 11.40,<[word ptr DataBuffer+B]> MShowHexWord 12,40,<[word ptr DataBuffer+10]> MShowOecByte 13.40.<[DataBuffer+17]>

; Ожидать нажатия любой клавиши MShowColorString AnyK call GetChar

; ПОЛУЧИТЬ И ОТОБРАЗИТЬ НА ЭКРАНЕ ДЕСКРИПТОР КОНФИГУРАЦИИ

call GetConfigurationDescriptor

; Очистить экран

call ClearScreen

; Вывести заголовок экрана

MShowColorString TxtO

; Вывести заголовки полей

mov [TextColorAndBackground],LIGHTGREEN MShowText B,Txt3 : Вывести базовый адрес и нонер прерывания

mov [TextColorAndBackground],LIGHTGREY MShowOecByte 4,40,[DataBuffer] MShowHexByte 5,40,<[DataBuffer+l]> MShowOecWord 6,40.<[word ptr DataBuffer+2]> MShowOecByte 7,40,<[DataBuffer+4]> MShowHexByte B.40,<[DataBuffer+5]> MShowBinByte 9.40.<[DataBuffer+7]> xor AX, AX

mov AL,[DataBuffer+B] shl AX, 2 MShowDecWord 10,40,AX

; Ожидать нажатия любой клавиши MShowColorString AnyK call GetChar

; ВЫКЛЮЧИТЬ ХОСТ-КОНТРОЛЛЕР

mov DX,[USB_BaseAddr]

mov AX,0 out DX.AX

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

mov АХ.З int 10h

; Выход в DOS

mov AH,4Ch int 21h

; ОБРАБОТКА ОШИБОК : He поддерживается PCI BIDS

@@PCIBIOSNotFound:

MFatalError NoPCI

; He найден хост или устройство

@@NoHost:

cmp [USB_HostIndex],0

je

@@HostNotFound : Устройство USB не найдено

@@DeviceNotFound:

MFatalError NoOev : Нет ни одного контроллера USB

@@HostNotFound:

MFatalError NoUSB ENDP USB_Device_Search ENDS

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

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

Include "listl_02.inc"

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

; регистр GS в режим линейной адресации

Include "list2_01.inc"

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

Include "list2_05.inc"

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

include "listB_01.inc"

END

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

По теме:

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