|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: File: uslpriv.h
27:
28: Contains: USB Services Library private include.
29:
30: Version: Neptune 1.0
31:
32: Copyright: � 1997-1998 by Apple Computer, Inc., all rights reserved.
33:
34: File Ownership:
35:
36: DRI: Barry Twycross
37:
38: Other Contact: xxx put other contact here xxx
39:
40: Technology: USB
41:
42: Writers:
43:
44: (DF) David Ferguson
45: (TC) Tom Clark
46: (CJK) Craig Keithley
47: (BT) Barry Twycross
48:
49: Change History (most recent first):
50:
51: <USB52> 10/29/98 BT Close old configurations on reset or reconfiguration.
52: <USB51> 10/22/98 BT Fix wrong status for deleted devices.
53: <USB50> 10/21/98 DF Add uslDeviceAddrToBus function
54: <USB49> 9/29/98 BT Use real frame timing
55: <USB48> 9/28/98 BT Add device reset function
56: <USB47> 9/17/98 BT 1.1 rules for captive devices.
57: <USB46> 8/31/98 BT Add isoc pipes
58: <USB45> 8/24/98 BT Isoc param block definition
59: <USB44> 8/13/98 BT Add multibus support
60: <USB43> 7/9/98 BT Clean up after delete device and config clash. Merge in branch
61: <USB42> 6/30/98 BT Some defs moved to usb.i
62: <USB41> 6/22/98 BT Add Alt interface to configure interface
63: <USB40> 6/14/98 DF Add RemoveRootHub function prototype
64: <USB39> 6/5/98 BT Add pb param to deletedvice
65: <USB38> 6/5/98 TC Change uxBusRef to USBBusRef.
66: <USB37> 5/21/98 BT Add uslOpenDevice
67: <USB36> 5/20/98 BT Lots of stuff for V2 PB s
68: <USB35> 5/17/98 BT Add config stuff
69: <USB34> 5/12/98 BT New interface stuff
70: <USB33> 5/8/98 BT Add open interface for Tom
71: <USB32> 4/30/98 BT Add real interrupt driven timer
72: <USB31> 4/28/98 BT Add bulk performance monitoring.
73: <USB30> 4/26/98 BT Make find pipe global
74: <USB29> 4/24/98 BT Add pipe functions
75: <USB28> 4/23/98 BT Add hub watchdog function
76: <USB27> 4/21/98 BT Allow requests to device zero, pipe zero.
77: <USB26> 4/16/98 BT Remove duplicated defn
78: <USB25> 4/14/98 BT Note restrictions on device structure. uslDeleteDevice makes
79: assumptions
80: <USB24> 4/14/98 BT Impliment device remove
81: <USB23> 4/11/98 CJK Now that USB.i has been re-built, the problem of the qtypes is
82: gone...
83: <USB22> 4/11/98 CJK investigate qtype problem
84: <USB21> 4/10/98 BT Re add q type defines
85: <USB20> 4/9/98 CJK trim down to only those defines not yet present in USBPriv.h
86: <USB19> 4/9/98 BT Move defines from public
87: <18> 4/8/98 BT Move error codes to public file
88: <17> 4/8/98 BT Add error codes (should be in USL.h)
89: <16> 4/2/98 BT Start on config/interface/endpoint stuff. First caching config
90: descriptors.
91: <15> 3/19/98 BT Add USLprivate.h
92: <14> 3/19/98 BT Split USBServices.h into public and private
93: <13> 3/5/98 BT Add int transactions
94: <12> 2/4/98 BT Fix uslControlPacket to have errors. Add more support for
95: usbProbe
96: <11> 2/2/98 BT Add bulk stuff
97: <10> 1/29/98 BT Carve up the flags
98: <9> 1/26/98 BT Mangle names after design review
99: <8> 1/26/98 BT Make expert notify public
100: <7> 1/19/98 BT More root hub sim
101: <6> 1/15/98 BT Add extra defines for bMRequestType
102: <5> 1/13/98 BT Change uslPacket to uslControlPacket, get ready for Int
103: transactions.
104: <4> 12/22/97 BT StartRootHub moving to USL
105: <3> 12/18/97 BT Emulate expert notification proc.
106: */
107:
108: /* Need to autoinclude all files here */
109: /* Must conditionalise this */
110:
111: #ifndef __USLPRIVH__
112: #define __USLPRIVH__
113: #include "../driverservices.h"
114: /* ************* Constants ************* */
115:
116: #if 0
117: enum{
118: kUSBBus = 0
119: };
120: #endif
121:
122: enum{
123: kUSBDeviceIDShift = 7,
124: kUSBMaxDevices = 128,
125: kUSBMaxDevice = kUSBMaxDevices-1,
126: kUSBDeviceIDMask = 0x7f,
127:
128: kUSBMaxPipeIDShift =7,
129: kUSBMaxPipes = (1<<kUSBMaxPipeIDShift),
130: kUSBPipeIDMask = (kUSBMaxPipes-1),
131:
132: kUSBMaxEndptPerDevice = 30,
133:
134: kUSBEndPtShift = 7,
135: kUSBDeviceMask = ((1 << kUSBEndPtShift) -1),
136:
137: kUSBNoPipeIdx = -1,
138:
139: kUSBHubQType = 21,
140: kUSBDelayQType = 22
141:
142: };
143:
144: enum{
145: kUSBIdleStalled = kUSBStalled+1
146: };
147:
148:
149:
150: /* Flag long word of PB. Used internally
151:
152: Should probably make this a seperate reserved field
153: b0 Task Time, wow a real flag
154: b1
155: b2
156: b3
157: b4
158: b5
159: b6
160: b7
161: b8
162: b9
163: b10
164: b11 der/alloc - 1 bit is this an alloc or dealloc of task time memory
165: b12 bus - bus 4 bit internal bus number
166: b13 bus
167: b14 bus
168: b15 bus
169: b16 stage - 4 bit internal stage counter
170: b17 stage
171: b18 stage
172: b19 stage
173: b20 endp - 5 bits of endpoint (if we need direction).
174: b21 endp
175: b22 endp
176: b23 endp
177: b24 endp
178: b25 addr - 7 bits of function addr
179: b26 addr
180: b27 addr
181: b28 addr
182: b29 addr
183: b30 addr
184: b31 addr
185:
186: */
187: enum{
188: kUSLTTMemDeAllocFlagShift = 11,
189: kUSLBusShift = 12,
190: kUSLBusMask = 0xf000,
191: kUSLStageShift = 16,
192: kUSLStageMask = 0xf0000,
193: kUSLEndpShift = 20,
194: kUSLEndpMask = 0x1f00000,
195: kUSLAddrShift = 25,
196: kUSLAddrMask = 0xfe000000
197: };
198:
199:
200: /* ************* types ************* */
201:
202:
203: #define addrStash reserved6
204: #define wIndexStash reserved7
205: #define wValueStash reserved8
206:
207: typedef short pipesIdx;
208: typedef short InterfacesIdx;
209: typedef short packetIdx;
210: typedef short transIndex;
211:
212: typedef struct{
213: USBPipeRef ref;
214: USBReference devIntfRef; /* device or interface ref of container */
215:
216: UInt32 bus;
217:
218: long maxPacket;
219: USBFlags flags;
220: USBPipeState state;
221:
222: UInt8 devAddress;
223: UInt8 endPt;
224: UInt8 direction;
225: UInt8 type;
226:
227: /* For perforance monitoring */
228: UInt32 lastRead;
229: UInt32 bytesTransfered;
230: UInt32 transferTime;
231: Boolean monitorPerformance;
232:
233: }pipe;
234:
235: typedef struct{
236: USBInterfaceRef ref;
237: USBDeviceRef device;
238: UInt32 interfaceNum;
239: UInt32 alt;
240: }uslInterface;
241:
242: /* This one is the beginnings of a config descriptor, so we can extract total length */
243: typedef struct{
244: UInt8 len;
245: UInt8 type;
246: UInt16 totalLen;
247: } configHeader;
248:
249: typedef struct{
250: /* uslDeleteDevice assumes that this is the first entry in this struct */
251: USBDeviceRef ID;
252:
253: /* it assumes this is the second. Beware if you change the order here */
254: void *allConfigDescriptors;
255: UInt32 allConfigLen;
256: UInt32 powerAvailable;
257: UInt32 configLock;
258: UInt32 killMe;
259:
260: UInt32 bus;
261:
262: pipesIdx pipe0;
263: pipesIdx pipes[kUSBMaxEndptPerDevice];
264:
265: configHeader configScratch;
266: USBDeviceDescriptor deviceDescriptor;
267:
268: UInt8 currentConfiguration;
269: UInt8 usbAddress;
270: Boolean confValid;
271: Boolean speed;
272: }usbDevice;
273:
274:
275: #define OFFSET(ty, fl) ((UInt32) &(((ty *)0)->fl))
276:
277: void uslInterruptPriority(UInt32);
278:
279: Boolean uslIsInterfaceRef(USBInterfaceRef interf);
280: OSStatus findInterface(USBInterfaceRef InterfaceRef, uslInterface **p);
281: OSStatus uslOpenPipeImmed(USBInterfaceRef intrfc, USBEndPointDescriptor *endp);
282: usbDevice *getDevicePtrFromIdx(unsigned deviceIndex);
283: int makeDevPipeIdx( UInt8 endpoint, UInt8 direction);
284: pipe *getPipeByIdx(pipesIdx idx);
285: OSStatus uslOpenDevice(USBPB *pb);
286:
287: //UInt32 uslDeviceToBus(USBDeviceRef ref);
288: Boolean uslHubValidateDevZero(USBDeviceRef ref, UInt32 *bus);
289: void uslHubAddDevice(USBPB *pb);
290: void UIMSetRootHubRef(UInt32 bus, USBDeviceRef ref);
291:
292:
293: Boolean checkPBVersion(USBPB *pb, UInt32 flags);
294: Boolean checkPBVersionIsoc(USBPB *pb, UInt32 flags);
295:
296: OSStatus USBExpertNotifyParentMsg(USBReference reference, void *pointer);
297: USBDeviceRef MakeDevRef(UInt32 bus, UInt16 addr);
298: USBDeviceRef addNewDevice(UInt32 bus, UInt16 addr, UInt8 speed, UInt8 maxPacket, UInt32 power);
299: UInt32 uslDeviceAddrToBus(UInt16 addr);
300: UInt8 getNewAddress(void);
301: usbDevice *getDevicePtr(USBDeviceRef device);
302: OSStatus findPipe(USBPipeRef pipeRef, pipe **p);
303: USBPipeRef getPipeZero(USBDeviceRef device);
304: long recoverPipeIdx(USBPipeRef pipeRef);
305: pipe *getPipe(usbDevice *device, UInt8 endpoint, UInt8 direction);
306: pipe *AllocPipe(usbDevice *device, UInt8 endpoint, UInt8 direction);
307: unsigned makeDeviceIdx(USBDeviceRef device);
308: void deallocPipe(usbDevice *device, UInt8 endpoint, UInt8 direction);
309: pipe *GetPipePtr(USBPipeRef pipeRef);
310: void uslSetPipeStall(USBPipeRef ref);
311: uslInterface *AllocInterface(USBDeviceRef device);
312:
313: OSStatus validateRef(USBReference ref, UInt32 *bus);
314: void uslCleanHubQueue(USBDeviceRef ref);
315: void uslCleanDelayQueue(USBDeviceRef ref);
316: void uslCleanNotifyQueue(USBDeviceRef ref);
317: void uslCleanMemQueue(USBDeviceRef ref);
318: void uslCleanAQueue(QHdrPtr queue, USBDeviceRef ref);
319: Boolean isSameDevice(USBReference ref, USBDeviceRef devRef);
320:
321:
322:
323:
324:
325: OSStatus uslClosePipe(pipesIdx pipe);
326: void uslCloseNonDefaultPipes(usbDevice *deviceP);
327: void uslUnconfigureDevice(usbDevice *device);
328: void uslCloseInterfacePipes(USBInterfaceRef iRef, usbDevice *deviceP);
329: OSStatus uslDeleteDevice(USBPB *pb, usbDevice *device);
330: UInt32 deltaFrames(UInt32 previous, UInt32 bus);
331: UInt32 UIMGetAFrame(void);
332: void uslHubWatchDog(Duration currentMilliSec);
333:
334: OSStatus usbControlPacket(UInt32 bus, USBPB *pb, UInt8 address, UInt8 endpoint);
335: OSStatus usbIntPacket(UInt32 bus, USBPB *pb, UInt8 address, UInt8 endpoint, UInt8 direction);
336: OSStatus usbIsocPacket(UInt32 bus, USBPB *pb, UInt8 address, UInt8 endpoint, UInt8 direction);
337: OSStatus usbBulkPacket(UInt32 bus, USBPB *pb, UInt8 address, UInt8 endpoint, UInt8 direction);
338: OSStatus xUSLControlRequest(UInt32 bus, USBPB *pb, pipe *thisPipe);
339:
340: Boolean immediateError(OSStatus err);
341: OSStatus StartRootHub(UInt32 bus);
342:
343: void initialiseNotifications(void);
344: void initialiseDelays(void);
345: void initialiseTimer(void);
346: void initialiseHubs(void);
347:
348: void finaliseNotifications(void);
349: void finaliseDelays(void);
350: void finaliseHubs(void);
351:
352: void SetExpertFunction(void *exProc);
353:
354: void resolvePerformance(USBPB *pb);
355: OSStatus uslMonitorBulkPerformanceByReference(USBPipeRef ref, UInt32 what,
356: UInt32 *lastRead, UInt32 *bytesTransfered, UInt32 *transferTime);
357:
358:
359: /* these are internal versions of USB... with less error checking */
360: OSStatus uslDeviceRequest(struct USBPB *pb);
361:
362: OSStatus uslAllocMem(USBPB *pb);
363: OSStatus uslDeallocMem(USBPB *pb);
364:
365:
366: #endif /*__USLPRIVH__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.