2
* Copyright (c) 2011 Jan Vesely
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
9
* - Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* - Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
* - The name of the author may not be used to endorse or promote products
15
* derived from this software without specific prior written permission.
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
/** @addtogroup drvusbohci
32
* @brief OHCI host controller driver structure
38
#include <fibril_synch.h>
43
#include <usb/host/device_keeper.h>
44
#include <usb/host/usb_endpoint_manager.h>
45
#include <usbhc_iface.h>
48
#include "ohci_regs.h"
50
#include "endpoint_list.h"
51
#include "hw_struct/hcca.h"
53
#define OHCI_NEEDED_IRQ_COMMANDS 5
55
/** Main OHCI drier structure */
57
/** USB bus driver, devices and addresses */
58
usb_device_keeper_t manager;
59
/** USB bus driver, endpoints */
60
usb_endpoint_manager_t ep_manager;
62
/** Memory mapped I/O registers area */
63
ohci_regs_t *registers;
64
/** Host controller communication area structure */
67
/** Transfer schedules */
68
endpoint_list_t lists[4];
69
/** List of active transfers */
70
link_t pending_batches;
72
/** Fibril for periodic checks if interrupts can't be used */
73
fid_t interrupt_emulator;
75
/** Guards schedule and endpoint manipulation */
78
/** Code to be executed in kernel interrupt handler */
79
irq_code_t interrupt_code;
81
/** Commands that form interrupt code */
82
irq_cmd_t interrupt_commands[OHCI_NEEDED_IRQ_COMMANDS];
84
/** USB hub emulation structure */
88
int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun);
89
int hc_init(hc_t *instance, uintptr_t regs, size_t reg_size, bool interrupts);
90
void hc_start_hw(hc_t *instance);
92
/** Safely dispose host controller internal structures
94
* @param[in] instance Host controller structure to use.
96
static inline void hc_fini(hc_t *instance)
97
{ /* TODO: implement*/ };
99
int hc_add_endpoint(hc_t *instance, usb_address_t address, usb_endpoint_t ep,
100
usb_speed_t speed, usb_transfer_type_t type, usb_direction_t direction,
101
size_t max_packet_size, size_t size, unsigned interval);
102
int hc_remove_endpoint(hc_t *instance, usb_address_t address,
103
usb_endpoint_t endpoint, usb_direction_t direction);
104
endpoint_t * hc_get_endpoint(hc_t *instance, usb_address_t address,
105
usb_endpoint_t endpoint, usb_direction_t direction, size_t *bw);
107
int hc_schedule(hc_t *instance, usb_transfer_batch_t *batch);
108
void hc_interrupt(hc_t *instance, uint32_t status);
110
/** Get and cast pointer to the driver data
112
* @param[in] fun DDF function pointer
113
* @return cast pointer to driver_data
115
static inline hc_t * fun_to_hc(ddf_fun_t *fun)
116
{ return fun->driver_data; }