|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
24: *
25: * HISTORY
26: * 08 Dec 98 ehewitt created.
27: *
28: */
29:
30: #include <IOKit/system.h>
31:
32: #define DEBUGGING_LEVEL 0 // 1 = low; 2 = high; 3 = extreme
33: #define DEBUGLOG kprintf
34:
35: #include <IOKit/usb/IOUSBController.h>
36: #include <IOKit/IOMemoryDescriptor.h>
37:
38: #define super IOUSBBus
39: #define self this
40:
41: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
42: IOReturn IOUSBController::openPipe(USBDeviceAddress address, UInt8 speed,
43: Endpoint *endpoint)
44: {
45: return _commandGate->runAction(doCreateEP, (void *)address,
46: (void *)speed, endpoint);
47: }
48:
49: IOReturn IOUSBController::closePipe(USBDeviceAddress address,
50: Endpoint * endpoint)
51: {
52: return _commandGate->runAction(doDeleteEP, (void *)address,
53: (void *)endpoint->number, (void *)endpoint->direction);
54: }
55:
56: IOReturn IOUSBController::abortPipe(USBDeviceAddress address,
57: Endpoint * endpoint)
58: {
59: return UIMAbortEndpoint(address,
60: endpoint->number, endpoint->direction);
61: }
62:
63: IOReturn IOUSBController::resetPipe(USBDeviceAddress address,
64: Endpoint * endpoint)
65: {
66: return UIMClearEndpointStall(address,
67: endpoint->number, endpoint->direction);
68: }
69:
70: IOReturn IOUSBController::clearPipeStall(USBDeviceAddress address,
71: Endpoint * endpoint)
72: {
73: return UIMClearEndpointStall(address,
74: endpoint->number, endpoint->direction);
75: }
76:
77:
78: // Transferring Data
79: IOReturn IOUSBController::read(IOMemoryDescriptor * buffer,
80: USBDeviceAddress address,
81: Endpoint * endpoint,
82: IOUSBCompletion * completion)
83: {
84: IOReturn err = kIOReturnSuccess;
85: IOUSBCommand *command = (IOUSBCommand *)IOMalloc(sizeof(IOUSBCommand));
86:
87: do
88: {
89: /* Validate its a inny pipe */
90: if (endpoint->direction != kUSBIn)
91: {
92: err = kIOReturnBadArgument;
93: break;
94: }
95:
96: /* Validate the completion */
97: if (completion == 0)
98: {
99: err = kIOReturnNoCompletion;
100: break;
101: }
102:
103: command->selector = READ;
104: command->request = 0; // Not a device request
105: command->address = address;
106: command->endpoint = endpoint->number;
107: command->direction = kUSBIn;
108: command->type = endpoint->transferType;
109: command->buffer = buffer;
110: command->completion = *completion;
111:
112: if (_commandGate == 0)
113: {
114: err = kIOReturnInternalError;
115: break;
116: }
117:
118: if ((err = _commandGate->runAction(doIOTransfer, command)))
119: break;
120:
121: return(err);
122:
123: } while (0);
124:
125: /* Free/give back the command */
126: IOFree(command, sizeof(IOUSBCommand));
127:
128: return (err);
129: }
130:
131: IOReturn IOUSBController::write(IOMemoryDescriptor * buffer,
132: USBDeviceAddress address,
133: Endpoint * endpoint,
134: IOUSBCompletion * completion)
135: {
136: IOReturn err = kIOReturnSuccess;
137: IOUSBCommand *command = (IOUSBCommand *)IOMalloc(sizeof(IOUSBCommand));
138:
139: do
140: {
141: /* Validate its a outty pipe */
142: if(endpoint->direction != kUSBOut)
143: {
144: err = kIOReturnBadArgument;
145: break;
146: }
147:
148: command->selector = WRITE;
149: command->request = 0; // Not a device request
150: command->address = address;
151: command->endpoint = endpoint->number;
152: command->direction = kUSBOut;
153: command->type = endpoint->transferType;
154: command->buffer = buffer;
155: command->completion = *completion;
156:
157: if (_commandGate == 0)
158: {
159: err = kIOReturnInternalError;
160: break;
161: }
162:
163: if ((err = _commandGate->runAction(doIOTransfer, command)))
164: break;
165:
166: return(err);
167:
168: } while (0);
169:
170: /* Free/give back the command */
171: IOFree(command, sizeof(IOUSBCommand));
172:
173: return (err);
174: }
175:
176: IOReturn IOUSBController::isocIO(IOMemoryDescriptor * buffer,
177: UInt64 frameStart,
178: UInt32 numFrames,
179: IOUSBIsocFrame *frameList,
180: USBDeviceAddress address,
181: Endpoint * endpoint,
182: IOUSBIsocCompletion * completion)
183: {
184: IOReturn err = kIOReturnSuccess;
185: IOUSBIsocCommand *command = (IOUSBIsocCommand *)IOMalloc(sizeof(IOUSBIsocCommand));
186:
187: do
188: {
189: /* Validate the completion */
190: if (completion == 0)
191: {
192: err = kIOReturnNoCompletion;
193: break;
194: }
195:
196: /* Set up direction */
197: if (endpoint->direction == kUSBOut) {
198: command->selector = WRITE;
199: command->direction = kUSBOut;
200: }
201: else if (endpoint->direction == kUSBIn) {
202: command->selector = READ;
203: command->direction = kUSBIn;
204: }
205: else {
206: err = kIOReturnBadArgument;
207: break;
208: }
209:
210: command->address = address;
211: command->endpoint = endpoint->number;
212: command->buffer = buffer;
213: command->completion = *completion;
214: command->startFrame = frameStart;
215: command->numFrames = numFrames;
216: command->frameList = frameList;
217: command->status = kIOReturnInvalid;
218:
219: if (_commandGate == 0)
220: {
221: err = kIOReturnInternalError;
222: break;
223: }
224:
225: if ((err = _commandGate->runAction(doIsocTransfer, command)))
226: break;
227:
228: return(err);
229:
230: } while (0);
231:
232: /* Free/give back the command */
233: IOFree(command, sizeof(IOUSBIsocCommand));
234:
235: return (err);
236: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.