The Pedigree Project  0.1
Classes | Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
Uhci Class Reference

#include <Uhci.h>

+ Inheritance diagram for Uhci:
+ Collaboration diagram for Uhci:

Classes

struct  QH
 
struct  TD
 

Public Member Functions

 Uhci (Device *pDev)
 
struct Uhci::TD ALIGN (16)
 
struct Uhci::QH ALIGN (16)
 
virtual void getName (String &str)
 
virtual void addTransferToTransaction (uintptr_t pTransaction, bool bToggle, UsbPid pid, uintptr_t pBuffer, size_t nBytes)
 Adds a new transfer to an existent transaction.
 
virtual uintptr_t createTransaction (UsbEndpoint endpointInfo)
 Creates a new transaction with the given endpoint data.
 
virtual void doAsync (uintptr_t pTransaction, void(*pCallback)(uintptr_t, ssize_t)=0, uintptr_t pParam=0)
 
virtual void addInterruptInHandler (UsbEndpoint endpointInfo, uintptr_t pBuffer, uint16_t nBytes, void(*pCallback)(uintptr_t, ssize_t), uintptr_t pParam=0)
 Adds a new handler for an interrupt IN transaction.
 
virtual bool irq (irq_id_t number, InterruptState &state)
 IRQ handler. More...
 
void doDequeue () NORETURN
 
void timer (uint64_t delta, InterruptState &state)
 Timer callback to handle port status changes.
 
virtual bool portReset (uint8_t nPort, bool bErrorResponse=false)
 Gets a UsbDevice from a given vendor:product pair. More...
 
- Public Member Functions inherited from UsbHub
 UsbHub (Device *p)
 
virtual Type getType ()
 
bool deviceConnected (uint8_t nPort, UsbSpeed speed)
 Called when a device is connected to a port on the hub.
 
void deviceDisconnected (uint8_t nPort)
 Called when a device is disconnected from a port on the hub.
 
ssize_t doSync (uintptr_t nTransaction, uint32_t timeout=5000)
 
void ignoreConnectionChanges (uint8_t nPort, bool bIgnore=true)
 
- Public Member Functions inherited from Device
 Device (Device *p)
 
DevicegetParent () const
 
void setParent (Device *p)
 
virtual String getSpecificType ()
 
virtual void setSpecificType (String str)
 
void setPciPosition (uint32_t bus, uint32_t device, uint32_t func)
 
void setPciIdentifiers (uint8_t classCode, uint8_t subclassCode, uint16_t vendorId, uint16_t deviceId, uint8_t progIf)
 
void setPciConfigHeader (const PciBus::ConfigSpace &space)
 
PciBus::ConfigSpace getPciConfigHeader () const
 
uint8_t getPciClassCode ()
 
uint8_t getPciSubclassCode ()
 
uint16_t getPciVendorId ()
 
uint16_t getPciDeviceId ()
 
uint8_t getPciProgInterface ()
 
uint32_t getPciBusPosition ()
 
uint32_t getPciDevicePosition ()
 
uint32_t getPciFunctionNumber ()
 
virtual void dump (String &str)
 
virtual Vector< Address * > & addresses ()
 
virtual uintptr_t getInterruptNumber ()
 
virtual void setInterruptNumber (uintptr_t n)
 
void addChild (Device *pDevice)
 
DevicegetChild (size_t n)
 
size_t getNumChildren ()
 
void removeChild (size_t n)
 
void removeChild (Device *d)
 
void replaceChild (Device *src, Device *dest)
 
- Public Member Functions inherited from RequestQueue
 RequestQueue (const String &name)
 
virtual void initialise ()
 
virtual void destroy ()
 
MUST_USE_RESULT uint64_t addRequest (size_t priority, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
MUST_USE_RESULT uint64_t addRequest (size_t priority, ActionOnDuplicate action, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
uint64_t addAsyncRequest (size_t priority, uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
void halt ()
 
void resume ()
 

Protected Member Functions

virtual uint64_t executeRequest (uint64_t p1=0, uint64_t p2=0, uint64_t p3=0, uint64_t p4=0, uint64_t p5=0, uint64_t p6=0, uint64_t p7=0, uint64_t p8=0)
 
- Protected Member Functions inherited from Device
 NOT_COPYABLE_OR_ASSIGNABLE (Device)
 
- Protected Member Functions inherited from IrqHandler
virtual ~IrqHandler ()
 
- Protected Member Functions inherited from RequestQueue
 RequestQueue (const RequestQueue &)
 
void operator= (const RequestQueue &)
 
virtual bool compareRequests (const Request &a, const Request &b)
 
bool isRequestValid (const Request *r)
 
int work ()
 
RequestgetNextRequest ()
 

Private Types

enum  UhciConstants {
  UHCI_CMD = 0x00, UHCI_STS = 0x02, UHCI_INTR = 0x04, UHCI_FRMN = 0x06,
  UHCI_FRLP = 0x08, UHCI_PORTSC = 0x10, UHCI_CMD_GRES = 0x04, UHCI_CMD_HCRES = 0x02,
  UHCI_CMD_RUN = 0x01, UHCI_STS_HALT = 0x20, UHCI_STS_ERR = 0x02, UHCI_STS_INT = 0x01,
  UHCI_PORTSC_PRES = 0x200, UHCI_PORTSC_LOSPEED = 0x100, UHCI_PORTSC_EDCH = 0x8, UHCI_PORTSC_ENABLE = 0x4,
  UHCI_PORTSC_CSCH = 0x2, UHCI_PORTSC_CONN = 0x1
}
 

Private Member Functions

void stop ()
 Stops the UHCI controller.
 
void start ()
 Starts the UHCI controller.
 
 Uhci (const Uhci &)
 
void operator= (const Uhci &)
 

Private Attributes

enum Uhci::UhciConstants ALIGN
 
IoBasem_pBase
 
uint8_t m_nPorts
 
Mutex m_Mutex
 
Spinlock m_AsyncQueueListChangeLock
 
uint32_t * m_pFrameList
 
uintptr_t m_pFrameListPhys
 
TDm_pTDList
 
uintptr_t m_pTDListPhys
 
ExtensibleBitmap m_TDBitmap
 
QHm_pAsyncQH
 
QHm_pPeriodicQH
 
QHm_pQHList
 
uintptr_t m_pQHListPhys
 
ExtensibleBitmap m_QHBitmap
 
MemoryRegion m_UhciMR
 
QHm_pCurrentAsyncQueueTail
 
QHm_pCurrentAsyncQueueHead
 
List< QH * > m_AsyncSchedule
 List of QHs in the active asynchronous schedule.
 
List< QH * > m_DequeueList
 List of QHs ready for dequeue.
 
Semaphore m_DequeueCount
 Semaphore for the dequeue list.
 
uint64_t m_nPortCheckTicks
 The time passed since last port check.
 

Additional Inherited Members

- Public Types inherited from Device
enum  Type {
  Generic, Root, Disk, Bus,
  Display, Network, Sound, Console,
  Mouse, Controller, UsbController, UsbGeneric,
  UsbContainer
}
 
typedef Device *(* Callback) (Device *)
 
- Public Types inherited from RequestQueue
enum  ActionOnDuplicate { Block, NewRequest, ReturnImmediately }
 
- Static Public Member Functions inherited from Device
static void foreach (Callback callback, Device *root=0)
 
template<class F , class... Args>
static void foreach (pedigree_std::Callable< F > &callback, Device *root, Args...args)
 
static void addToRoot (Device *device)
 
static void searchByVendorId (uint16_t vendorId, void(*callback)(Device *), Device *root=0)
 
static void searchByVendorIdAndDeviceId (uint16_t vendorId, uint16_t deviceId, void(*callback)(Device *), Device *root=0)
 
static void searchByClass (uint16_t classCode, void(*callback)(Device *), Device *root=0)
 
static void searchByClassAndSubclass (uint16_t classCode, uint16_t subclassCode, void(*callback)(Device *), Device *root=0)
 
static void searchByClassSubclassAndProgInterface (uint16_t classCode, uint16_t subclassCode, uint8_t progInterface, void(*callback)(Device *), Device *root=0)
 
- Static Protected Member Functions inherited from Device
static Deviceroot ()
 
- Static Protected Member Functions inherited from RequestQueue
static int trampoline (void *p)
 
static int doAsync (void *p)
 
- Protected Attributes inherited from UsbHub
ExtensibleBitmap m_IgnoredPorts
 Bitmap of ports to ignore connection changes on.
 
- Protected Attributes inherited from Device
Vector< Address * > m_Addresses
 
Vector< Device * > m_Children
 
Devicem_pParent
 
uintptr_t m_InterruptNumber
 
String m_SpecificType
 
PciBus::ConfigSpace m_ConfigHeader
 
uint8_t m_ClassCode
 
uint8_t m_SubclassCode
 
uint16_t m_VendorId
 
uint16_t m_DeviceId
 
uint8_t m_ProgInterface
 
uint32_t m_PciBusPos
 
uint32_t m_PciDevicePos
 
uint32_t m_PciFunctionNum
 
- Protected Attributes inherited from RequestQueue
Requestm_pRequestQueue [REQUEST_QUEUE_NUM_PRIORITIES]
 
volatile bool m_Stop
 
Mutex m_RequestQueueMutex
 
ConditionVariable m_RequestQueueCondition
 
ConditionVariable m_AsyncRequestQueueCondition
 
Threadm_pThread
 
bool m_Halted
 
Mutex m_HaltAcknowledged
 
RequestQueueOverrunChecker m_OverrunChecker
 
size_t m_nMaxAsyncRequests
 
size_t m_nAsyncRequests
 
size_t m_nTotalRequests
 
String m_Name
 
- Static Protected Attributes inherited from Device
static Device m_Root
 
static Mutex m_TreeLock
 

Detailed Description

Device driver for the Uhci class

Definition at line 47 of file Uhci.h.

Member Function Documentation

void Uhci::doAsync ( uintptr_t  pTransaction,
void(*)(uintptr_t, ssize_t)  pCallback = 0,
uintptr_t  pParam = 0 
)
virtual

Performs a transaction asynchronously, calling the given callback on completion

Implements UsbHub.

Definition at line 620 of file Uhci.cc.

References ERROR.

Referenced by getName().

+ Here is the caller graph for this function:

uint64_t Uhci::executeRequest ( uint64_t  p1 = 0,
uint64_t  p2 = 0,
uint64_t  p3 = 0,
uint64_t  p4 = 0,
uint64_t  p5 = 0,
uint64_t  p6 = 0,
uint64_t  p7 = 0,
uint64_t  p8 = 0 
)
protectedvirtual

Callback - classes are expected to inherit and override this function. It's called when a request needs to be executed (by the worker thread).

Implements RequestQueue.

Definition at line 794 of file Uhci.cc.

References DEBUG_LOG, Dec, Hex, and WARNING.

Referenced by getName().

+ Here is the caller graph for this function:

virtual void Uhci::getName ( String str)
inlinevirtual

Stores the device's name in str.

Reimplemented from Device.

Definition at line 146 of file Uhci.h.

References addInterruptInHandler(), addTransferToTransaction(), createTransaction(), doAsync(), executeRequest(), irq(), NORETURN, portReset(), start(), stop(), and timer().

bool Uhci::irq ( irq_id_t  number,
InterruptState &  state 
)
virtual

IRQ handler.

Note
The reason LockGuard isn't used here is because C++ is free to decide when to
destruct an object whenever it wants. This is a really easy way to create a
case where it is possible for a deadlock to occur simply by trusting the
language to do the "right" thing ("Do what I mean", not "Do what I say").

Implements IrqHandler.

Definition at line 261 of file Uhci.cc.

References List< T, nodePoolSize >::begin(), List< T, nodePoolSize >::count(), DEBUG_LOG, Dec, List< T, nodePoolSize >::end(), List< T, nodePoolSize >::erase(), Hex, Uhci::QH::MetaData::id, List< T, nodePoolSize >::popFront(), List< T, nodePoolSize >::pushBack(), and List< T, nodePoolSize >::pushFront().

Referenced by getName().

+ Here is the caller graph for this function:

bool Uhci::portReset ( uint8_t  nPort,
bool  bErrorResponse = false 
)
virtual

Gets a UsbDevice from a given vendor:product pair.

Performs a port reset for the given port. Should only be used in situations where a device cannot recover from an error without a complete reset.

Note
Assumes the port is at CONNECTED with a VALID DEVICE attached.
Parameters
bErrorResponsetrue if this is a reset as a response to an error. Error responses are allowed to use significantly longer delays in their reset logic.

Implements UsbHub.

Definition at line 724 of file Uhci.cc.

References DEBUG_LOG.

Referenced by getName().

+ Here is the caller graph for this function:

Member Data Documentation

QH* Uhci::m_pCurrentAsyncQueueHead
private

Pointer to the current queue head. Used to fill pNext automatically for new queue heads inserted to the asynchronous schedule.

Definition at line 240 of file Uhci.h.

QH* Uhci::m_pCurrentAsyncQueueTail
private

Pointer to the current queue tail, which allows insertion of new queue heads to the asynchronous schedule.

Definition at line 236 of file Uhci.h.


The documentation for this class was generated from the following files: