23#include "pedigree/kernel/compiler.h"
24#include "pedigree/kernel/processor/types.h"
25#include "pedigree/kernel/utilities/String.h"
27#include "modules/drivers/common/usb-hcd/PortChangeRequest.h"
28#include "modules/system/usb/Usb.h"
29#include "modules/system/usb/UsbConstants.h"
30#include "modules/system/usb/UsbDevice.h"
31#include "modules/system/usb/UsbHub.h"
41 str.assign(
"USB Hub Device", 15);
57 uintptr_t pBuffer,
size_t nBytes);
60 void (*pCallback)(uintptr_t, ssize_t) = 0,
61 uintptr_t pParam = 0);
64 void (*pCallback)(uintptr_t, ssize_t),
66 uintptr_t pParam = 0);
68 virtual bool portReset(uint8_t nPort,
bool bErrorResponse =
false);
71 virtual void cancelAsyncAndDrain(uintptr_t pTransaction,
void (*pCallback)(uintptr_t, ssize_t),
74 void (*callback)(uintptr_t, ssize_t),
76 bool producerAlreadyStopped)
override;
77 uint64_t
executeRequest(uint64_t p1, uint64_t p2, uint64_t p3, uint64_t p4, uint64_t p5,
78 uint64_t p6, uint64_t p7, uint64_t p8)
override;
80 bool portSpeed(uint8_t port, UsbSpeed& speed)
override;
83 enum HubFeatureSelectors {
88 enum PortFeatureSelectors {
99 CPortOverCurrent = 19,
106 HubRequest =
static_cast<uint8_t
>(UsbRequestType::Class),
107 HubPortRequest =
static_cast<uint8_t
>(
static_cast<uint8_t
>(UsbRequestType::Class) |
108 static_cast<uint8_t
>(UsbRequestRecipient::Other))
111 bool setPortFeature(
size_t port, PortFeatureSelectors feature);
112 bool clearPortFeature(
size_t port, PortFeatureSelectors feature);
116 bool clearPortChanges(
size_t port, uint32_t status);
117 bool debouncePort(
size_t port, uint32_t& status);
118 bool connectPort(
size_t port);
119 void portChanged(
size_t port);
121 static void statusChanged(uintptr_t parameter, ssize_t result);
125 : pDescriptor(
static_cast<Descriptor*
>(pBuffer)),
126 nPorts(pDescriptor->nPorts),
127 hubCharacteristics(pDescriptor->hubCharacteristics),
128 powerGoodDelay(pDescriptor->powerGoodDelay) {}
131 delete[]
reinterpret_cast<uint8_t*
>(pDescriptor);
138 uint16_t hubCharacteristics;
139 uint8_t powerGoodDelay;
140 uint8_t controllerCurrent;
144 uint16_t hubCharacteristics;
145 uint8_t powerGoodDelay;
149 size_t m_PowerGoodDelay;
150 uint8_t* m_StatusBuffer;
151 size_t m_StatusBytes;
bool portSpeed(uint8_t port, UsbSpeed &speed) override
void prepareForDisconnection() override
bool getPortStatus(size_t port, uint32_t &status)
Top 16 bits of status hold the port-change flags.
Device * getDevice() override
virtual void cancelAsyncAndDrain(uintptr_t pTransaction, void(*pCallback)(uintptr_t, ssize_t), uintptr_t pParam)
MUST_USE_RESULT bool cancelInterruptInAndDrain(const UsbInterruptInToken &token, void(*callback)(uintptr_t, ssize_t), uintptr_t parameter, bool producerAlreadyStopped) override
void quiesceForRetirement() override
virtual void getName(String &str)
void prepareForDriverRetirement() override
virtual MUST_USE_RESULT bool doAsync(uintptr_t pTransaction, void(*pCallback)(uintptr_t, ssize_t)=0, uintptr_t pParam=0)
virtual bool portReset(uint8_t nPort, bool bErrorResponse=false)
Gets a UsbDevice from a given vendor:product pair.
bool hasSubtree() const override
Do we expose our own Device tree?
virtual void addTransferToTransaction(uintptr_t pTransaction, bool bToggle, UsbPid pid, uintptr_t pBuffer, size_t nBytes)
Adds a new transfer to an existent transaction.
void cancelRequest(const Request &request) override
virtual void initialiseDriver()
Implemented by the driver class, initialises driver-specific stuff.
uint64_t executeRequest(uint64_t p1, uint64_t p2, uint64_t p3, uint64_t p4, uint64_t p5, uint64_t p6, uint64_t p7, uint64_t p8) override
virtual MUST_USE_RESULT bool addInterruptInHandler(UsbEndpoint endpointInfo, uintptr_t pBuffer, uint16_t nBytes, void(*pCallback)(uintptr_t, ssize_t), UsbInterruptInHandle &handle, uintptr_t pParam=0)
Adds an owned recurring interrupt-IN transaction.
virtual uintptr_t createTransaction(UsbEndpoint endpointInfo)
Creates a new transaction with the given endpoint data.