⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uhci.h

📁 Next BIOS Source code : Extensible Firmware Interface
💻 H
📖 第 1 页 / 共 2 页
字号:
/*++

Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
This software and associated documentation (if any) is furnished
under a license and may only be used or copied in accordance
with the terms of the license. Except as permitted by such
license, no part of this software or documentation may be
reproduced, stored in a retrieval system, or transmitted in any
form or by any means without the express written consent of
Intel Corporation.


Module Name:

    Uhci.h
    
Abstract: 
    

Revision History
--*/

#ifndef _UHCI_H
#define _UHCI_H

/*
 * Universal Host Controller Interface data structures and defines
 */
#include "Efi.h"
#include "EfiDriverLib.h" 

//
// Driver Consumed Protocol Prototypes
//
#include EFI_PROTOCOL_DEFINITION(DriverBinding)
#include EFI_PROTOCOL_DEFINITION(PciIo)

//
// Driver Produced Protocol Prototypes
//
#include EFI_PROTOCOL_DEFINITION (UsbHostController)
#include EFI_PROTOCOL_DEFINITION (ComponentName)

#define EFI_D_UHCI   EFI_D_INFO

#define STALL_1_SECOND          1000000 // stall 1 second
#define STALL_1_MILLI_SECOND    1000    // stall 1 millisecond

//
// One memory block uses 1 page (common buffer for QH,TD use.)
//
#define NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES   1

#define EFI_PAGES_TO_SIZE(a)   ( (a) << EFI_PAGE_SHIFT)

#define bit(a)   1 << (a)

//////////////////////////////////////////////////////////////////////////
//
//          Universal Host Controller Registers Definitions
//
//////////////////////////////////////////////////////////////////////////

extern  UINT16  USBBaseAddr;
/* Command register */
#define   USBCMD        0   /* Command Register Offset 00-01h */
#define   USBCMD_RS       bit(0)  /* Run/Stop */
#define   USBCMD_HCRESET  bit(1)  /* Host reset */
#define   USBCMD_GRESET   bit(2)  /* Global reset */
#define   USBCMD_EGSM     bit(3)  /* Global Suspend Mode */
#define   USBCMD_FGR      bit(4)  /* Force Global Resume */
#define   USBCMD_SWDBG    bit(5)  /* SW Debug mode */
#define   USBCMD_CF       bit(6)  /* Config Flag (sw only) */
#define   USBCMD_MAXP     bit(7)  /* Max Packet (0 = 32, 1 = 64) */

/* Status register */
#define   USBSTS        2   /* Status Register Offset 02-03h */
#define   USBSTS_USBINT   bit(0)  /* Interrupt due to IOC */
#define   USBSTS_ERROR    bit(1)  /* Interrupt due to error */
#define   USBSTS_RD       bit(2)  /* Resume Detect */
#define   USBSTS_HSE      bit(3)  /* Host System Error*/
#define   USBSTS_HCPE     bit(4)  /* Host Controller Process Error*/
#define   USBSTS_HCH      bit(5)  /* HC Halted */

/* Interrupt enable register */
#define   USBINTR       4   /* Interrupt Enable Register 04-05h */
#define   USBINTR_TIMEOUT bit(0)  /* Timeout/CRC error enable */
#define   USBINTR_RESUME  bit(1)  /* Resume interrupt enable */
#define   USBINTR_IOC     bit(2)  /* Interrupt On Complete enable */
#define   USBINTR_SP      bit(3) /* Short packet interrupt enable */

/* Frame Number Register Offset 06-08h */
#define   USBFRNUM      6

/* Frame List Base Address Register Offset 08-0Bh */
#define   USBFLBASEADD  8   

/* Start of Frame Modify Register Offset 0Ch */
#define   USBSOF      0x0c

/* USB port status and control registers */
#define   USBPORTSC1    0x10  /*Port 1 offset 10-11h */
#define   USBPORTSC2    0x12  /*Port 2 offset 12-13h */

#define   USBPORTSC_CCS   bit(0)  /* Current Connect Status*/
#define   USBPORTSC_CSC   bit(1)  /* Connect Status Change */
#define   USBPORTSC_PED   bit(2)  /* Port Enable / Disable */
#define   USBPORTSC_PEDC  bit(3)  /* Port Enable / Disable Change */
#define   USBPORTSC_LSL   bit(4)  /* Line Status Low bit*/
#define   USBPORTSC_LSH   bit(5)  /* Line Status High bit*/
#define   USBPORTSC_RD    bit(6)  /* Resume Detect */
#define   USBPORTSC_LSDA  bit(8)  /* Low Speed Device Attached */
#define   USBPORTSC_PR    bit(9)  /* Port Reset */
#define   USBPORTSC_SUSP  bit(12) /* Suspend */

/* PCI Configuration Registers for USB */
// Class Code Register offset
#define CLASSC                      0x09
// USB IO Space Base Address Register offset
#define USBBASE                     0x20

// USB legacy Support
#define USB_EMULATION               0xc0

//
// USB Base Class Code,Sub-Class Code and Programming Interface.
//
#define PCI_CLASSC_BASE_CLASS_SERIAL        0x0c
#define PCI_CLASSC_SUBCLASS_SERIAL_USB      0x03
#define PCI_CLASSC_PI_UHCI                  0x00

// USB Class Code structure
typedef struct
{
  UINT8    PI;
  UINT8    SubClassCode;
  UINT8    BaseCode;
} USB_CLASSC;

#define SETUP_PACKET_ID  0x2D
#define INPUT_PACKET_ID  0x69
#define OUTPUT_PACKET_ID 0xE1
#define ERROR_PACKET_ID  0x55


//////////////////////////////////////////////////////////////////////////
//
//          USB Transfer Mechanism Data Structures
//
//////////////////////////////////////////////////////////////////////////

#pragma pack(1)

typedef struct
{
  UINT32    QHHorizontalTerminate : 1;
  UINT32    QHHorizontalQSelect : 1;
  UINT32    QHHorizontalRsvd : 2;
  UINT32    QHHorizontalPtr : 28;
  UINT32    QHVerticalTerminate : 1;
  UINT32    QHVerticalQSelect : 1;
  UINT32    QHVerticalRsvd : 2;
  UINT32    QHVerticalPtr : 28;
} QUEUE_HEAD;

typedef struct 
{
  UINT32    TDLinkPtrTerminate : 1;
  UINT32    TDLinkPtrQSelect : 1;
  UINT32    TDLinkPtrDepthSelect :1;
  UINT32    TDLinkPtrRsvd : 1;
  UINT32    TDLinkPtr : 28;
  UINT32    TDStatusActualLength :11;
  UINT32    TDStatusRsvd : 5;
  UINT32    TDStatus : 8;
  UINT32    TDStatusIOC : 1;
  UINT32    TDStatusIOS : 1;
  UINT32    TDStatusLS : 1;
  UINT32    TDStatusErr : 2;
  UINT32    TDStatusSPD : 1;
  UINT32    TDStatusRsvd2 : 2;
  UINT32    TDTokenPID : 8;
  UINT32    TDTokenDevAddr : 7;
  UINT32    TDTokenEndPt : 4;
  UINT32    TDTokenDataToggle : 1;
  UINT32    TDTokenRsvd : 1;
  UINT32    TDTokenMaxLen : 11;
  UINT32    TDBufferPtr;
} TD;

#pragma pack()

typedef struct
{
  QUEUE_HEAD  QH;
  void        *ptrNext;
  void        *ptrDown;
  void        *ptrNextIntQH;    // for interrupt transfer's special use
  void        *LoopPtr;
} QH_STRUCT;

typedef struct
{
  TD      TDData;
  UINT8   *pTDBuffer;
  void    *ptrNextTD;
  void    *ptrNextQH;
  UINT16  TDBufferLength;
  UINT16  reserved;
} TD_STRUCT;

//////////////////////////////////////////////////////////////////////////
//
//          Universal Host Controller Device Data Structure
//
//////////////////////////////////////////////////////////////////////////
#define USB_HC_DEV_FROM_THIS(a) CR(a, USB_HC_DEV, UsbHc, USB_HC_DEV_SIGNATURE)

#define   USB_HC_DEV_SIGNATURE    EFI_SIGNATURE_32('u','h','c','i')
#define   INTERRUPT_LIST_SIGNATURE  EFI_SIGNATURE_32('i','n','t','s')
typedef struct
{
  UINTN                           Signature;
  
  EFI_LIST_ENTRY                  Link ;
  UINT8                           DevAddr ;
  UINT8                           EndPoint ;
  UINT8                           DataToggle ;
  UINT8                           Reserved[5];
  TD_STRUCT                       *ptrFirstTD ;
  QH_STRUCT                       *ptrQH ;
  UINTN                           DataLen ;
  UINTN                           PollInterval;  
  VOID                            *Mapping;
  UINT8                           *DataBuffer; // allocated host memory, not mapped memory
  EFI_ASYNC_USB_TRANSFER_CALLBACK InterruptCallBack ;
  VOID                            *InterruptContext;
}INTERRUPT_LIST ;

#define INTERRUPT_LIST_FROM_LINK(a) CR(a, INTERRUPT_LIST, Link, INTERRUPT_LIST_SIGNATURE)

typedef struct
{
  UINT32            FrameListPtrTerminate:1 ;
  UINT32            FrameListPtrQSelect:1 ;
  UINT32            FrameListRsvd:2 ;
  UINT32            FrameListPtr:28 ;

} FRAMELIST_ENTRY;

typedef struct _MEMORY_MANAGE_HEADER {
  UINT8                         *BitArrayPtr;
  UINTN                         BitArraySizeInBytes;
  UINT8                         *MemoryBlockPtr;
  UINTN                         MemoryBlockSizeInBytes;
  void                          *Mapping;
  struct _MEMORY_MANAGE_HEADER  *Next;
} MEMORY_MANAGE_HEADER;

typedef struct
{
  UINTN                       Signature ;
  EFI_USB_HC_PROTOCOL         UsbHc ;
  EFI_PCI_IO_PROTOCOL         *PciIo;

  //
  // local data
  //
  EFI_LIST_ENTRY              InterruptListHead;
  FRAMELIST_ENTRY             *FrameListEntry;
  VOID                        *FrameListMapping;
  MEMORY_MANAGE_HEADER        *MemoryHeader;
  EFI_EVENT                   InterruptTransTimer;
  EFI_UNICODE_STRING_TABLE    *ControllerNameTable;

} USB_HC_DEV ;


extern EFI_DRIVER_BINDING_PROTOCOL gUhciDriverBinding;
extern EFI_COMPONENT_NAME_PROTOCOL gUhciComponentName;

VOID  
WriteUHCCommandReg(
  IN  EFI_PCI_IO_PROTOCOL *PciIo,
  IN  UINT32              CmdAddrOffset,
  IN  UINT16              UsbCmd
  ) ;

//STATIC
UINT16 
ReadUHCCommandReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                CmdAddrOffset
  );

//STATIC
VOID  
WriteUHCStatusReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusAddrOffset,
  IN  UINT16                UsbSts
);


//STATIC
UINT16 
ReadUHCStatusReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusAddrOffset
);


VOID
ClearStatusReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusAddrOffset
);

VOID
WriteUHCIntReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                InterruptAddrOffset,
  IN  UINT16                UsbInt
  );

UINT16 
ReadUHCIntReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                InterruptAddrOffset
  );

VOID  
WriteUHCFrameNumberReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                FrameNumAddrOffset,
  IN  UINT16                UsbFrameNum
  );

UINT16 
ReadUHCFrameNumberReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                FrameNumAddrOffset
  );

VOID  
WriteUHCFrameListBaseReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                FlBaseAddrOffset,
  IN  UINT32                UsbFrameListBaseAddr
  );

UINT32 
ReadUHCFrameListBaseReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                FlBaseAddrOffset
  );

UINT16 
ReadRootPortReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                PortAddrOffset
  );


//STATIC
VOID 
WriteRootPortReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                PortAddrOffset,
  IN  UINT16                ControlBits
  ) ;

EFI_STATUS
WaitForUHCHalt(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN UINT32                 StatusRegAddr,
  IN UINTN                  Timeout
  ) ;


BOOLEAN
DetectUHCInterrupt(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusRegAddr
  ) ;

BOOLEAN 
IsUSBInterrupt(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusRegAddr
  ) ;

BOOLEAN 
IsUSBErrInterrupt(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusRegAddr
  ) ;

BOOLEAN 
IsHostSysErr(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusRegAddr
  ) ;

BOOLEAN 
IsHCProcessErr(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusRegAddr
  ) ;

BOOLEAN 
IsHCHalted(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                StatusRegAddr
  ) ;


//
// This routine programs the USB frame number register. We assume that the
// HC schedule execution is stopped.
//
VOID
SetFrameNumberReg(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                FRNUMAddr,
  IN  UINT16                Index
  ) ;


UINT16 
GetCurrentFrameNumber(
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT32                FRNUMAddr
  ) ;

VOID 
SetFrameListBaseAddress(
  EFI_PCI_IO_PROTOCOL       *PciIo,
  UINT32                    FLBASEADDRReg,
  UINT32                    Addr
  ) ;

UINT32 
GetFrameListBaseAddress(
  EFI_PCI_IO_PROTOCOL       *PciIo,
  UINT32                    FLBAddr
  ) ;

EFI_STATUS
CreateFrameList (
  USB_HC_DEV                *HcDev,
  UINT32                    FLBASEADDRReg
  );

EFI_STATUS
FreeFrameListEntry(
  USB_HC_DEV        *UhcDev
  );
    
VOID
InitFrameList (
  USB_HC_DEV    *HcDev
  );  


EFI_STATUS
AllocateQHStruct(
  IN  USB_HC_DEV          *HcDev,
  OUT QH_STRUCT           **ppQHStruct
  ) ;

VOID
InitQH(
  IN  QH_STRUCT *ptrQH
  ) ;


EFI_STATUS
CreateQH(
  IN  USB_HC_DEV          *HcDev,
  OUT QH_STRUCT           **pptrQH
  ) ;

VOID
SetQHHorizontalLinkPtr(
  IN QH_STRUCT  *ptrQH,
  IN VOID       *ptrNext
  ) ;

VOID*
GetQHHorizontalLinkPtr(
  IN QH_STRUCT  *ptrQH
  ) ;

VOID
SetQHHorizontalQHorTDSelect(
  IN QH_STRUCT  *ptrQH,
  IN BOOLEAN    bQH
  ) ;


VOID
SetQHHorizontalValidorInvalid(
  IN QH_STRUCT  *ptrQH,
  IN BOOLEAN    bValid
  ) ;

VOID
SetQHVerticalLinkPtr(
  IN QH_STRUCT  *ptrQH,
  IN VOID     *ptrNext
  ) ; 

VOID*
GetQHVerticalLinkPtr(
  IN QH_STRUCT  *ptrQH
  ) ;

VOID
SetQHVerticalQHorTDSelect(
  IN QH_STRUCT  *ptrQH,
  IN BOOLEAN    bQH
  ) ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -