Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 89

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 83 84 85 86 87 88 < 89 > 90 91 92 93 94 95 .. 166 >> Следующая

EnableController(False); { остановить контроллер } End; End;
Dispose(USBControllerList, Done); End.
If DetectPCIBios then begin WriteLn(1PICBIOS поддерживается');
End else begin WriteLn('PICBIOS не поддерживается'); Exit;
End;
Гпава 11. Функции BIOS
271
Unit ContList;
INTERFACE
Uses Crt, PCI;
{ USB-контроллер } Type
PUSBController = ~TUSBController; TUSBController = object Public Index : Word;
BusNumber : Byte; DevFuncNumber : Byte; BaseAddress : Longint; IRQNumbar : Byte; Public
Procedure ResetController (Reset : Boolean); Procedure EnableController(Enable : Boolean); Function IsConfigured : Boolean; Procedure CommandStop; Procedure CommandRun;
Procedure SetFrameNumber(Number : Word); Procedure SetFrameListAddress(FrameListAdr : Longint); Public
Function GetPortBaseAddr(Portindex : Byte) : Word; Function GetPortState(PortIndex : Byte) : Word; Function PortConnected(Portindex : Byte): Boolean; Function IsLowSpeedDevice(Portindex : Byte): Boolean; Procedure EnablePort(Portindex : Byte; Enable : Boolean); End;
{ Максимальное число контроллеров } Const
MaxControllerlndex = 6;
272
Часть III. Практика программирования
{Список контроллеров } Туре
PUSBControllerList = ATUSBControllerList; TUSBControllerList = object Private
USBContrArr : Array [1..MaxControllerlndex] of PUSBController; USBContrCnt : Byte; Private
Prqcedure DetectUSBDevice(ClassCode : Longint); Public
Constructor Init;
Destructor Done; virtual; Public
Procedure MakeList;
Function GetCount : Integer;
Function GetAt(Index : Integer) : PUSBController; End;
IMPLEMENTATION
{ TUSBController }
{====================================================)
Procedure TUSBController.ResetController(Reset : Boolean)
Var Signal : Word;
Begin
If Reset then Signal:= 4 else Signal:= 0; PortW[BaseAddress]:= Signal; Delay(10); End;
Procedure TUSBController.EnableController(Enable : Boolean);
Var Signal : Word;
Begin
If Enable then Signal:= 1 else Signal:= 0; PortW[BaseAddress]:= Signal; End;
Глава 11. Функции BIOS
273
Function TUSBController.IsConfigured : Boolean; Begin
IsConfigured:= (BaseAddress <> -lb-End;
Function TUSBController.GetPortBaseAddr(Portindex : Byte) : Word; Begin If Portindex = 1
Then GetPortBaseAddr:= BaseAddress + $10
Else GetPortBaseAddr:= BaseAddress + $12; End;
Function TUSBController.GetPortState(Portindex : Byte) : Word; Begin
GetPortState:= PortW[GetPortBaseAddr(Portindex)]; End;
Function TUSBController.PortConnected(Portindex : Byte): Boolean; Begin
PortConnected:= (GetPortState(Portindex) and $0001) <> 0; End;
Function TUSBController.IsLowSpeedDevice(Portindex : Byte): Boolean; Begin
IsLowSpeedDevice:= (GetPortState(Portindex) and $0100) <> 0; End;
Procedure TUSBController.EnablePort(Portindex : Byte; Enable : Boolean);
Var PortAddr : Word;
Begin
PortAddr:= GetPortBaseAddr(Portindex); If Enable
Then PortW[PortAddr]:= PortW[PortAddr] or $04 Else PortW[PortAddr]:= PortW[PortAddr] and $FB; End;
procedure TUSBController.CommandRun; begin
274
Часть III. Практика программирования
PortW[BaseAddress]:= PortW[BaseAddress] or 1; end;
procedure TUSBController.CommandStop; begin
PortW[BaseAddress]:= PortW[BaseAddress] and $FE; end;
Procedure TUSBController.SetFrameNumber(Number : Word); Begin
PortW[BaseAddress+6]:= Number; End;
Procedure TUSBController.SetFrameListAddress(FrameListAdr : Longint); Begin Asm
mov dx, BaseAddress add dx, 08h
db 66h; mov ax, word ptr FrameListAdr { mov eax, ... } db 66h; out dx,ax { out dx,eax }
End; End;
{ TUSBControllerList }
{=============^==^^==^=^====^^^^^ j
Constructor TUSBControllerList.Init; Var Index : Integer; Begin USBContrCnt:= 0;
For Index:= 1 to MaxControllerlndex do USBContrArr[Index]:= nil; End;
Destructor TUSBControllerList.Done;
Var Index : Integer;
Begin
For Index:= 1 to MaxControllerlndex do If USBContrArr[Index] <> nil then
Гпава 11. Функции BIOS
275
Dispose(USBContrArr[Index]); End;
Procedure TUSBControllerList.MakeList; Begin
DetectUSBDevice($0C0300); (UHC USB} {DetectUSBDevi ce($ OCO 310); {OHC USB} (== EHCI имеет другую карту адресов 1} {DetectuSBDevice($0C0320); {EHCI USB} End;
Function TUSBControllerList.GetCount : Integer; Begin
GetCount:= USBContrCnt; End;
{ Поиск USB-контроллеров }
Procedure TUSBControllerList.DetectUSBDevice(ClassCode : Longint); Var
Index : Word;
BusNumber, DevFuncNumber, IRQNumber : Byte; BaseAddress : Longint; Found : Byte;
DevicelD, VendorID : Word; Begin Index:= 0;
While (True) do begin Found:= DetectPCIdevicel(ClassCode, Index,
BusNumber, DevFuncNumber); { Если найден очередной контроллер} { Добавить его в список контроллеров} If Found = PCf-SUCCESS then begin { Добавить новую запись в список } Inc(USBContrCnt);
USBContrArr[USBContrCnt]:= New(PUSBController);
{ Заполняем свойства записи }
USBContrArr[USBContrCnt]Л.Index := Index;
276
Часть III. Практика программирования
USBContrArr[USBContrCnt]л.BusNumber := BusNumber; USBContrArr[USBContrCnt]л.DevFuncNumber:= DevFuncNumber;
Предыдущая << 1 .. 83 84 85 86 87 88 < 89 > 90 91 92 93 94 95 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100