[Voyageurs] Receive keypress information from the usb keyboard.
This commit is contained in:
parent
2cc9c89051
commit
c5f8195255
|
@ -1,6 +1,7 @@
|
||||||
add_executable(voyageurs
|
add_executable(voyageurs
|
||||||
keyboard/keyboard_driver.cpp
|
keyboard/keyboard_driver.cpp
|
||||||
xhci/device_slot.cpp
|
xhci/device_slot.cpp
|
||||||
|
xhci/endpoint.cpp
|
||||||
xhci/trb.cpp
|
xhci/trb.cpp
|
||||||
xhci/trb_ring.cpp
|
xhci/trb_ring.cpp
|
||||||
xhci/xhci_driver.cpp
|
xhci/xhci_driver.cpp
|
||||||
|
|
|
@ -45,6 +45,8 @@ XhciTrb DeviceSlot::CreateAddressDeviceCommand(uint8_t root_port,
|
||||||
input_context_->endpoint_contexts[0].tr_dequeue_ptr =
|
input_context_->endpoint_contexts[0].tr_dequeue_ptr =
|
||||||
control_endpoint_transfer_trb_->PhysicalAddress() | 0x1;
|
control_endpoint_transfer_trb_->PhysicalAddress() | 0x1;
|
||||||
|
|
||||||
|
endpoints_ = glcr::Array<Endpoint>(32);
|
||||||
|
|
||||||
return ::CreateAddressDeviceCommand(context_phys_ + kInputSlotContextOffset,
|
return ::CreateAddressDeviceCommand(context_phys_ + kInputSlotContextOffset,
|
||||||
slot_index_);
|
slot_index_);
|
||||||
}
|
}
|
||||||
|
@ -54,8 +56,19 @@ uint8_t DeviceSlot::State() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceSlot::TransferComplete(uint8_t endpoint_index, uint64_t trb_phys) {
|
void DeviceSlot::TransferComplete(uint8_t endpoint_index, uint64_t trb_phys) {
|
||||||
|
if (endpoint_index >= 32) {
|
||||||
|
dbgln("ERROR: Received transfer for invalid endpoint {x}", endpoint_index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (endpoint_index != 1) {
|
if (endpoint_index != 1) {
|
||||||
crash("Transfer complete on non control endpoint", glcr::UNIMPLEMENTED);
|
if (!endpoints_[endpoint_index].Enabled()) {
|
||||||
|
dbgln("ERROR: XHCI received transfer for disabled endpoint {x}",
|
||||||
|
endpoint_index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
endpoints_[endpoint_index].TransferComplete(trb_phys);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!control_completion_sempahores_.Contains(trb_phys)) {
|
if (!control_completion_sempahores_.Contains(trb_phys)) {
|
||||||
|
@ -80,9 +93,7 @@ mmth::Semaphore DeviceSlot::IssueConfigureDeviceCommand(uint8_t config_value) {
|
||||||
input_context_->slot_context.route_speed_entries |= (max_endpoint << 27);
|
input_context_->slot_context.route_speed_entries |= (max_endpoint << 27);
|
||||||
|
|
||||||
// TODO: Dont' hardcode this.
|
// TODO: Dont' hardcode this.
|
||||||
other_endpoint_transfer_trb_ = glcr::MakeUnique<TrbRingWriter>();
|
endpoints_[3].Initialize(input_context_->endpoint_contexts + 2);
|
||||||
input_context_->endpoint_contexts[2].tr_dequeue_ptr =
|
|
||||||
other_endpoint_transfer_trb_->PhysicalAddress() | 0x1;
|
|
||||||
|
|
||||||
xhci_driver_->IssueCommand(CreateConfigureEndpointCommand(
|
xhci_driver_->IssueCommand(CreateConfigureEndpointCommand(
|
||||||
context_phys_ + kInputSlotContextOffset, slot_index_));
|
context_phys_ + kInputSlotContextOffset, slot_index_));
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <mammoth/util/memory_region.h>
|
#include <mammoth/util/memory_region.h>
|
||||||
|
|
||||||
#include "xhci/control_command.h"
|
#include "xhci/control_command.h"
|
||||||
|
#include "xhci/endpoint.h"
|
||||||
#include "xhci/trb_ring.h"
|
#include "xhci/trb_ring.h"
|
||||||
#include "xhci/xhci.h"
|
#include "xhci/xhci.h"
|
||||||
|
|
||||||
|
@ -59,7 +60,7 @@ class DeviceSlot {
|
||||||
|
|
||||||
mmth::Semaphore configure_device_semaphore_;
|
mmth::Semaphore configure_device_semaphore_;
|
||||||
|
|
||||||
glcr::UniquePtr<TrbRingWriter> other_endpoint_transfer_trb_;
|
glcr::Array<Endpoint> endpoints_;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "xhci/endpoint.h"
|
||||||
|
|
||||||
|
#include <mammoth/util/debug.h>
|
||||||
|
|
||||||
|
void Endpoint::Initialize(XhciEndpointContext* context) {
|
||||||
|
enabled_ = true;
|
||||||
|
context_ = context;
|
||||||
|
|
||||||
|
trb_ring_ = glcr::MakeUnique<TrbRingWriter>();
|
||||||
|
recv_mem_ = mmth::OwnedMemoryRegion::ContiguousPhysical(0x1000, &recv_phys_);
|
||||||
|
|
||||||
|
context_->tr_dequeue_ptr = trb_ring_->PhysicalAddress() | 1;
|
||||||
|
|
||||||
|
context_->error_and_type = (0x3 << 1) | (0x7 << 3) | (0x8 << 16);
|
||||||
|
trb_ring_->EnqueueTrb({
|
||||||
|
.parameter = recv_phys_,
|
||||||
|
.status = 8,
|
||||||
|
.type_and_cycle = 1 | (1 << 2) | (1 << 5) | (1 << 10),
|
||||||
|
.control = 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Endpoint::TransferComplete(uint64_t trb_phys) {
|
||||||
|
dbgln("Data: {x}", *(uint64_t*)recv_mem_.vaddr());
|
||||||
|
trb_ring_->EnqueueTrb({
|
||||||
|
.parameter = recv_phys_,
|
||||||
|
.status = 8,
|
||||||
|
.type_and_cycle = 1 | (1 << 2) | (1 << 5) | (1 << 10),
|
||||||
|
.control = 0,
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glacier/memory/unique_ptr.h>
|
||||||
|
|
||||||
|
#include "xhci/trb_ring.h"
|
||||||
|
#include "xhci/xhci.h"
|
||||||
|
|
||||||
|
class Endpoint {
|
||||||
|
public:
|
||||||
|
Endpoint() {}
|
||||||
|
|
||||||
|
void Initialize(XhciEndpointContext* context);
|
||||||
|
|
||||||
|
bool Enabled() { return enabled_; }
|
||||||
|
|
||||||
|
void TransferComplete(uint64_t trb_phys);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool enabled_ = false;
|
||||||
|
|
||||||
|
XhciEndpointContext* context_ = nullptr;
|
||||||
|
glcr::UniquePtr<TrbRingWriter> trb_ring_;
|
||||||
|
|
||||||
|
uint64_t recv_phys_;
|
||||||
|
mmth::OwnedMemoryRegion recv_mem_;
|
||||||
|
};
|
|
@ -205,6 +205,8 @@ glcr::ErrorCode XhciDriver::ParseMmioStructures() {
|
||||||
runtime_ = reinterpret_cast<XhciRuntime*>(mmio_regions_.vaddr() +
|
runtime_ = reinterpret_cast<XhciRuntime*>(mmio_regions_.vaddr() +
|
||||||
capabilities_->runtime_offset);
|
capabilities_->runtime_offset);
|
||||||
|
|
||||||
|
dbgln("INTTTT: {x}", (uint64_t)runtime_->interrupters);
|
||||||
|
|
||||||
doorbells_ = reinterpret_cast<XhciDoorbells*>(mmio_regions_.vaddr() +
|
doorbells_ = reinterpret_cast<XhciDoorbells*>(mmio_regions_.vaddr() +
|
||||||
capabilities_->doorbell_offset);
|
capabilities_->doorbell_offset);
|
||||||
dbgln("Doorbells: {x}", (uint64_t)doorbells_);
|
dbgln("Doorbells: {x}", (uint64_t)doorbells_);
|
||||||
|
|
Loading…
Reference in New Issue