mirror of
https://github.com/RGBCube/serenity
synced 2025-07-05 18:17:36 +00:00

This adds a simple EHCI driver that currently only interrogates the device and checks if all ports are addressable via associated legacy controllers (companion controllers), and warns if this is not the case. This also adds a lot of the other data structures needed for actually driving the controller, but these are currently not hooked up to anything. To test this run with `SERENITY_EXTRA_QEMU_ARGS="--device usb-ehci"` or the q35 machine type
46 lines
1.6 KiB
C++
46 lines
1.6 KiB
C++
/*
|
|
* Copyright (c) 2023, Leon Albrecht <leon.a@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Types.h>
|
|
#include <Kernel/Bus/PCI/Device.h>
|
|
#include <Kernel/Bus/USB/EHCI/Registers.h>
|
|
#include <Kernel/Bus/USB/USBController.h>
|
|
#include <Kernel/Memory/TypedMapping.h>
|
|
|
|
namespace Kernel::USB::EHCI {
|
|
|
|
class EHCIController : public USBController
|
|
, public PCI::Device {
|
|
public:
|
|
static ErrorOr<NonnullLockRefPtr<EHCIController>> try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier);
|
|
virtual ~EHCIController() override = default;
|
|
|
|
// ^PCI::Device
|
|
virtual StringView device_name() const override { return "EHCI"sv; }
|
|
|
|
// ^USBController
|
|
virtual ErrorOr<void> initialize() override;
|
|
|
|
virtual ErrorOr<void> reset() override { return ENOTSUP; }
|
|
virtual ErrorOr<void> stop() override { return ENOTSUP; }
|
|
virtual ErrorOr<void> start() override { return ENOTSUP; }
|
|
|
|
virtual void cancel_async_transfer(NonnullLockRefPtr<Transfer>) override {};
|
|
virtual ErrorOr<size_t> submit_control_transfer(Transfer&) override { return ENOTSUP; }
|
|
virtual ErrorOr<size_t> submit_bulk_transfer(Transfer&) override { return ENOTSUP; }
|
|
virtual ErrorOr<void> submit_async_interrupt_transfer(NonnullLockRefPtr<Transfer>, u16) override { return ENOTSUP; }
|
|
|
|
private:
|
|
EHCIController(PCI::DeviceIdentifier const& pci_device_identifier, NonnullOwnPtr<Memory::Region> register_region);
|
|
|
|
NonnullOwnPtr<Memory::Region> m_register_region;
|
|
CapabilityRegisters const* m_cap_regs;
|
|
OperationalRegisters volatile* m_op_regs;
|
|
};
|
|
|
|
}
|