memtest86plus/system/ohci.h
martinwhitaker 407fb811c2
Take ownership of all USB controllers before probing for devices. (#167)
When two controllers are attached to a physical port (e.g. in the
case of EHCI and its companion controllers, problems can occur if
the BIOS still has control of one controller when we try to use the
other one. So perform a first pass to scan the PCI bus and take
ownership of and reset all the controllers we find, and perform a
second pass to initialise the controllers and probe for attached
devices.

As we don't support hot plugging, split the second pass into two,
with the first probing the EHCI controllers and handing over any
low and full speed devices to the companion controllers, and the
second probing the remaining controller types.
2022-10-07 09:32:09 +01:00

47 lines
1.3 KiB
C

// SPDX-License-Identifier: GPL-2.0
#ifndef OHCI_H
#define OHCI_H
/**
* \file
*
* Provides support for USB keyboards connected via an OHCI controller.
*
*//*
* Copyright (C) 2021-2022 Martin Whitaker.
*/
#include <stdint.h>
#include "usbhcd.h"
/**
* If necessary, takes ownership of the OHCI device at the specified base
* address, then resets it.
*
* \param base_addr - the base address of the device in virtual memory
*
* \returns
* true if ownership was acquired and the device was successfully reset,
* otherwise false.
*/
bool ohci_reset(uintptr_t base_addr);
/**
* Initialises the OHCI device at the specified base address, probes all
* the attached USB devices, and configures any HID USB keyboard devices
* it finds to generate periodic interrupt transfers that report key
* presses. If successful, initialises the specified host controller
* driver object accordingly.
*
* \param base_addr - the base address of the device in virtual memory
* \param hcd - a pointer to a pre-allocated host controller
* driver object that can be used for this device
*
* \returns
* true if the device was successfully initialised and one or more
* keyboards were found, otherwise false.
*/
bool ohci_probe(uintptr_t base_addr, usb_hcd_t *hcd);
#endif // OHCI_H