/[gxemul]/upstream/0.4.2/src/devices/dev_ohci.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.4.2/src/devices/dev_ohci.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations)
Mon Oct 8 16:20:48 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 4363 byte(s)
0.4.2
1 /*
2 * Copyright (C) 2004-2006 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: dev_ohci.c,v 1.8 2006/02/09 20:02:59 debug Exp $
29 *
30 * USB OHCI (Open Host Controller Interface).
31 *
32 * TODO
33 */
34
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <string.h>
38
39 #include "cpu.h"
40 #include "device.h"
41 #include "machine.h"
42 #include "memory.h"
43 #include "misc.h"
44
45 #include "ohcireg.h"
46
47
48 /* Length is 0x1000 at least on Playstation 2 */
49 #define DEV_OHCI_LENGTH 0x1000
50
51
52 #define debug fatal
53
54
55 struct ohci_data {
56 int irq_nr;
57
58 int port1reset;
59 };
60
61
62 /*
63 * dev_ohci_access():
64 */
65 DEVICE_ACCESS(ohci)
66 {
67 struct ohci_data *d = extra;
68 uint64_t idata = 0, odata = 0;
69 char *name = NULL;
70
71 if (writeflag == MEM_WRITE)
72 idata = memory_readmax64(cpu, data, len);
73
74 switch (relative_addr) {
75 case OHCI_REVISION:
76 name = "REVISION";
77 if (writeflag == MEM_READ) {
78 odata = 0x10; /* Version 1.0. */
79 }
80 break;
81 case OHCI_COMMAND_STATUS:
82 name = "COMMAND_STATUS";
83 if (idata == 0x2) {
84 fatal("URK\n");
85 cpu_interrupt(cpu, d->irq_nr);
86 }
87 break;
88 case OHCI_INTERRUPT_STATUS:
89 name = "INTERRUPT_STATUS";
90 odata = OHCI_WDH;
91 break;
92 /*
93 * TODO: It now sleeps at tsleep(xfer, PRIBIO, "usbsyn", 0);
94 * in netbsd/src/sys/dev/usb/usbdi.c
95 */
96 case OHCI_RH_DESCRIPTOR_A:
97 name = "RH_DESCRIPTOR_A";
98 odata = 2; /* Nr of ports */
99 break;
100 case OHCI_RH_STATUS:
101 name = "RH_STATUS";
102 /* TODO */
103 break;
104 case OHCI_RH_PORT_STATUS(1): /* First port */
105 name = "RH_PORT_STATUS(1)";
106 if (writeflag == MEM_READ) {
107 /* Status = low 16, Change = top 16 */
108 odata = 0x10101;
109 /* 0x0001 = connected
110 0x0100 = power */
111 if (d->port1reset)
112 odata |= (0x10 << 16) | 0x10;
113 } else {
114 /* 0x10 = UPS_C_PORT_RESET */
115 if (idata & 0x10)
116 d->port1reset = 1;
117 if (idata & 0x100000)
118 d->port1reset = 0;
119 }
120 break;
121 case OHCI_RH_PORT_STATUS(2): /* Second port */
122 name = "RH_PORT_STATUS(2)";
123 /* TODO */
124 odata = 0;
125 break;
126 default:
127 if (writeflag == MEM_READ) {
128 debug("[ ohci: read from addr 0x%x: 0x%llx ]\n",
129 (int)relative_addr, (long long)odata);
130 } else {
131 debug("[ ohci: write to addr 0x%x: 0x%llx ]\n",
132 (int)relative_addr, (long long)idata);
133 }
134 }
135
136 if (name != NULL) {
137 if (writeflag == MEM_READ)
138 debug("[ ohci: read from %s: 0x%llx ]\n",
139 name, (long long)odata);
140 else
141 debug("[ ohci: write to %s: 0x%llx ]\n",
142 name, (long long)idata);
143 }
144
145 if (writeflag == MEM_READ)
146 memory_writemax64(cpu, data, len, odata);
147
148 return 1;
149 }
150
151
152 DEVINIT(ohci)
153 {
154 struct ohci_data *d;
155
156 d = malloc(sizeof(struct ohci_data));
157 if (d == NULL) {
158 fprintf(stderr, "out of memory\n");
159 exit(1);
160 }
161 memset(d, 0, sizeof(struct ohci_data));
162 d->irq_nr = devinit->irq_nr;
163
164 memory_device_register(devinit->machine->memory,
165 devinit->name, devinit->addr,
166 DEV_OHCI_LENGTH, dev_ohci_access, d, DM_DEFAULT, NULL);
167
168 return 1;
169 }
170

  ViewVC Help
Powered by ViewVC 1.1.26