[Voyageurs] Receive keypress information from the usb keyboard.
This commit is contained in:
		
							parent
							
								
									2cc9c89051
								
							
						
					
					
						commit
						c5f8195255
					
				| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
add_executable(voyageurs
 | 
			
		||||
  keyboard/keyboard_driver.cpp
 | 
			
		||||
  xhci/device_slot.cpp
 | 
			
		||||
  xhci/endpoint.cpp
 | 
			
		||||
  xhci/trb.cpp
 | 
			
		||||
  xhci/trb_ring.cpp
 | 
			
		||||
  xhci/xhci_driver.cpp
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,6 +45,8 @@ XhciTrb DeviceSlot::CreateAddressDeviceCommand(uint8_t root_port,
 | 
			
		|||
  input_context_->endpoint_contexts[0].tr_dequeue_ptr =
 | 
			
		||||
      control_endpoint_transfer_trb_->PhysicalAddress() | 0x1;
 | 
			
		||||
 | 
			
		||||
  endpoints_ = glcr::Array<Endpoint>(32);
 | 
			
		||||
 | 
			
		||||
  return ::CreateAddressDeviceCommand(context_phys_ + kInputSlotContextOffset,
 | 
			
		||||
                                      slot_index_);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -54,8 +56,19 @@ uint8_t DeviceSlot::State() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
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) {
 | 
			
		||||
    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)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -80,9 +93,7 @@ mmth::Semaphore DeviceSlot::IssueConfigureDeviceCommand(uint8_t config_value) {
 | 
			
		|||
  input_context_->slot_context.route_speed_entries |= (max_endpoint << 27);
 | 
			
		||||
 | 
			
		||||
  // TODO: Dont' hardcode this.
 | 
			
		||||
  other_endpoint_transfer_trb_ = glcr::MakeUnique<TrbRingWriter>();
 | 
			
		||||
  input_context_->endpoint_contexts[2].tr_dequeue_ptr =
 | 
			
		||||
      other_endpoint_transfer_trb_->PhysicalAddress() | 0x1;
 | 
			
		||||
  endpoints_[3].Initialize(input_context_->endpoint_contexts + 2);
 | 
			
		||||
 | 
			
		||||
  xhci_driver_->IssueCommand(CreateConfigureEndpointCommand(
 | 
			
		||||
      context_phys_ + kInputSlotContextOffset, slot_index_));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@
 | 
			
		|||
#include <mammoth/util/memory_region.h>
 | 
			
		||||
 | 
			
		||||
#include "xhci/control_command.h"
 | 
			
		||||
#include "xhci/endpoint.h"
 | 
			
		||||
#include "xhci/trb_ring.h"
 | 
			
		||||
#include "xhci/xhci.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +60,7 @@ class DeviceSlot {
 | 
			
		|||
 | 
			
		||||
  mmth::Semaphore configure_device_semaphore_;
 | 
			
		||||
 | 
			
		||||
  glcr::UniquePtr<TrbRingWriter> other_endpoint_transfer_trb_;
 | 
			
		||||
  glcr::Array<Endpoint> endpoints_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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() +
 | 
			
		||||
                                            capabilities_->runtime_offset);
 | 
			
		||||
 | 
			
		||||
  dbgln("INTTTT: {x}", (uint64_t)runtime_->interrupters);
 | 
			
		||||
 | 
			
		||||
  doorbells_ = reinterpret_cast<XhciDoorbells*>(mmio_regions_.vaddr() +
 | 
			
		||||
                                                capabilities_->doorbell_offset);
 | 
			
		||||
  dbgln("Doorbells: {x}", (uint64_t)doorbells_);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue