source: mainline/uspace/drv/bus/usb/uhci/hc.h@ d0db4a0

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d0db4a0 was e4d7363, checked in by Ondřej Hlavatý <aearsis@…>, 8 years ago

usbhost: refactor the initialization

Before that, drivers had to setup MMIO range multiple times, or even parse hw
resources themselves again. The former init method was split in half - init and
start. Init shall allocate and initialize inner structures, start shall start
the HC.

In the XHCI it is demonstrated how to isolate inner HC implementation from the
fact this driver is using libusbhost. It adds some boilerplate code, but
I think it leads to cleaner design.

  • Property mode set to 100644
File size: 4.4 KB
Line 
1/*
2 * Copyright (c) 2011 Jan Vesely
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
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.
16 *
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.
27 */
28
29/** @addtogroup drvusbuhcihc
30 * @{
31 */
32/** @file
33 * @brief UHCI host controller driver structure
34 */
35
36#ifndef DRV_UHCI_HC_H
37#define DRV_UHCI_HC_H
38
39#include <device/hw_res_parsed.h>
40#include <fibril.h>
41#include <macros.h>
42#include <stdbool.h>
43#include <ddi.h>
44#include <usb/host/hcd.h>
45#include <usb/host/usb_transfer_batch.h>
46
47#include "uhci_rh.h"
48#include "transfer_list.h"
49#include "hw_struct/link_pointer.h"
50
51/** UHCI I/O registers layout */
52typedef struct uhci_regs {
53 /** Command register, controls HC behaviour */
54 ioport16_t usbcmd;
55#define UHCI_CMD_MAX_PACKET (1 << 7)
56#define UHCI_CMD_CONFIGURE (1 << 6)
57#define UHCI_CMD_DEBUG (1 << 5)
58#define UHCI_CMD_FORCE_GLOBAL_RESUME (1 << 4)
59#define UHCI_CMD_FORCE_GLOBAL_SUSPEND (1 << 3)
60#define UHCI_CMD_GLOBAL_RESET (1 << 2)
61#define UHCI_CMD_HCRESET (1 << 1)
62#define UHCI_CMD_RUN_STOP (1 << 0)
63
64 /** Status register, 1 means interrupt is asserted (if enabled) */
65 ioport16_t usbsts;
66#define UHCI_STATUS_HALTED (1 << 5)
67#define UHCI_STATUS_PROCESS_ERROR (1 << 4)
68#define UHCI_STATUS_SYSTEM_ERROR (1 << 3)
69#define UHCI_STATUS_RESUME (1 << 2)
70#define UHCI_STATUS_ERROR_INTERRUPT (1 << 1)
71#define UHCI_STATUS_INTERRUPT (1 << 0)
72#define UHCI_STATUS_NM_INTERRUPTS \
73 (UHCI_STATUS_PROCESS_ERROR | UHCI_STATUS_SYSTEM_ERROR)
74
75 /** Interrupt enabled registers */
76 ioport16_t usbintr;
77#define UHCI_INTR_SHORT_PACKET (1 << 3)
78#define UHCI_INTR_COMPLETE (1 << 2)
79#define UHCI_INTR_RESUME (1 << 1)
80#define UHCI_INTR_CRC (1 << 0)
81
82 /** Register stores frame number used in SOF packet */
83 ioport16_t frnum;
84
85 /** Pointer(physical) to the Frame List */
86 ioport32_t flbaseadd;
87
88 /** SOF modification to match external timers */
89 ioport8_t sofmod;
90
91 PADD8[3];
92 ioport16_t ports[];
93} uhci_regs_t;
94
95#define UHCI_FRAME_LIST_COUNT 1024
96#define UHCI_DEBUGER_TIMEOUT 5000000
97#define UHCI_ALLOWED_HW_FAIL 5
98
99/** Main UHCI driver structure */
100typedef struct hc {
101 uhci_rh_t rh;
102 /** Addresses of I/O registers */
103 uhci_regs_t *registers;
104
105 /** Frame List contains 1024 link pointers */
106 link_pointer_t *frame_list;
107
108 /** List and queue of interrupt transfers */
109 transfer_list_t transfers_interrupt;
110 /** List and queue of low speed control transfers */
111 transfer_list_t transfers_control_slow;
112 /** List and queue of full speed bulk transfers */
113 transfer_list_t transfers_bulk_full;
114 /** List and queue of full speed control transfers */
115 transfer_list_t transfers_control_full;
116
117 /** Pointer table to the above lists, helps during scheduling */
118 transfer_list_t *transfers[2][4];
119 /** Indicator of hw interrupts availability */
120 bool hw_interrupts;
121
122 /** Number of hw failures detected. */
123 unsigned hw_failures;
124} hc_t;
125
126extern int hc_init(hc_t *, const hw_res_list_parsed_t *);
127extern void hc_start(hc_t *);
128extern void hc_fini(hc_t *);
129
130extern int uhci_hc_gen_irq_code(irq_code_t *, hcd_t *,const hw_res_list_parsed_t *);
131
132extern void uhci_hc_interrupt(hcd_t *, uint32_t);
133extern int uhci_hc_status(hcd_t *, uint32_t *);
134extern int uhci_hc_schedule(hcd_t *, usb_transfer_batch_t *);
135
136#endif
137
138/**
139 * @}
140 */
Note: See TracBrowser for help on using the repository browser.