|
|
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: CompositeDriverDescription.c
27:
28: Contains: Composite Class Driver Definition Header
29:
30: Version: xxx put version here xxx
31:
32: Copyright: � 1997-1998 by Apple Computer, Inc., all rights reserved.
33:
34: File Ownership:
35:
36: DRI: Craig Keithley
37:
38: Other Contact: xxx put other contact here xxx
39:
40: Technology: xxx put technology here xxx
41:
42: Writers:
43:
44: (TC) Tom Clark
45: (DF) David Ferguson
46: (BT) Barry Twycross
47: (CJK) Craig Keithley
48:
49: Change History (most recent first):
50:
51: <USB7> 9/4/98 TC Update CompositeDriverNotifyProc to use version 1.1 of dispatch
52: table.
53: <USB6> 8/25/98 BT Isoc name changes
54: <USB5> 6/8/98 CJK add bus power available to DeviceInitialize params
55: <USB4> 6/5/98 CJK clean up/straighten up Initialize routine
56: <USB3> 4/27/98 DF Don't load against a matching interface!
57: <USB2> 4/9/98 CJK change to use USB.h
58: <1> 4/7/98 CJK first checked in as USBCompositeClassDriver
59: <27> 4/2/98 CJK Change kUSBCompound� to kUSBComposite�
60: <26> 3/17/98 CJK Replace "};" with just "}". Moved function prototypes to header
61: file. Changed pragma unuseds so that MW doesn't complain about
62: them.
63: <25> 3/6/98 CJK Add dispatch table for add/remove simulation
64: <24> 3/5/98 CJK Add include of version.h file. Change descriptor header to use
65: the defines from the version.h file.
66: <23> 2/26/98 CJK remove driver services mem alloc/dealloc function calls
67: <22> 2/9/98 CJK Add pragma unused for buspoweravailable
68: <21> 2/9/98 CJK remove HIDEmulation.h include
69: <20> 2/9/98 BT Stub in new functions
70: <19> 2/6/98 BT Power allocation stuff
71: <18> 2/6/98 CJK remove debugstr. Add pragma unused
72: <17> 2/4/98 CJK Remove expert entry proc.
73: <16> 2/3/98 CJK change pFullConfig field name to pFullConfigDescriptor.
74: <15> 2/2/98 CJK change vendor/product ids back to 0
75: <14> 1/30/98 CJK move HID Module dispatch table to HIDEmulation.c
76: <13> 1/27/98 CJK Change dispatch table to have a separate HID API dispatch table.
77: <12> 1/26/98 CJK Change to use USBDeviceDescriptor structure
78: <11> 1/26/98 BT Mangle names after design review
79: <10> 1/26/98 CJK Add other dispatch functions needed by the ADB/USB shim.
80: <9> 1/23/98 CJK Add pFullConfig MemDeAlloc call.
81: <8> 1/15/98 CJK Change include of USL.h to USBServicesLib.h
82: <7> 1/14/98 BT Getting rid of time entry, change to USBClassDriver.h
83: <6> 1/14/98 BT Removing outdated pre expert stuff
84: <5> 1/14/98 CJK Change name registry name.
85: <4> 1/8/98 CJK Moved the initialize & finalize routines into this file (allows
86: them to be static and thus not have the symbols exported).
87: <3> 1/6/98 CJK Add dispatch table entry points needed by expert.
88: <2> 12/17/97 CJK Add BBS file header
89: <1> 12/17/97 CJK First time checkin
90: */
91: /*naga
92: #include <Types.h>
93: #include <Devices.h>
94: #include <DriverServices.h>
95: #include <USB.h>
96: */
97: #include "../driverservices.h"
98: #include "../USB.h"
99:
100: #include "CompositeClassDriver.h"
101: #include "CompositeClassVersion.h"
102:
103: usbCompositePBStruct newInterfacesPB[2];
104:
105:
106: OSStatus CompositeDriverInitInterface(
107: UInt32 interfaceNum,
108: USBInterfaceDescriptor *interfaceDesc,
109: USBDeviceDescriptor *deviceDesc,
110: USBDeviceRef device);
111:
112: //------------------------------------------------------
113: //
114: // This is the driver description structure that the expert looks for first.
115: // If it's here, the information within is used to match the driver
116: // to the device whose descriptor was passed to the expert.
117: // Information in this block is also used by the expert when an
118: // entry is created in the Name Registry.
119: //
120: //------------------------------------------------------
121: /*naga
122: USBDriverDescription TheUSBDriverDescription =
123: {
124: // Signature info
125: kTheUSBDriverDescriptionSignature,
126: kInitialUSBDriverDescriptor,
127:
128: // Device Info
129: {0, // vendor = not device specific
130: 0, // product = not device specific
131: 0, // version of product = not device specific
132: 0,}, // protocol = not device specific
133:
134: // Interface Info (* I don't think this would always be required...*)
135: 0, // Configuration Value
136: 0, // Interface Number
137: 0, // Interface Class
138: 0, // Interface SubClass
139: 0, // Interface Protocol
140:
141:
142: // Driver Info
143: "USBCompositeDevice", // Driver name for Name Registry
144: kUSBCompositeClass, // Device Class (from USBDeviceDefines.h)
145: kUSBCompositeSubClass, // Device Subclass
146: kCMPHexMajorVers,
147: kCMPHexMinorVers,
148: kCMPCurrentRelease,
149: kCMPReleaseStage, // version of driver
150:
151: // Driver Loading Info
152: kUSBDoNotMatchInterface // Please don't load us as an interface driver.
153: };
154: naga */
155: USBClassDriverPluginDispatchTable TheClassDriverPluginDispatchTable =
156: {
157: kClassDriverPluginVersion, // Version of this structure
158: CompositeDriverValidateHW, // Hardware Validation Procedure
159: CompositeDriverInitialize, // Initialization Procedure
160: CompositeDriverInitInterface, // Interface Initialization Procedure
161: CompositeDriverFinalize, // Finalization Procedure
162: CompositeDriverNotifyProc // Driver Notification Procedure
163: };
164:
165: // hubDriverInitInterface function
166: // Called to initialize driver for an individual interface - either by expert or
167: // internally by driver
168: OSStatus CompositeDriverInitInterface(
169: UInt32 interfaceNum,
170: USBInterfaceDescriptor *interfaceDesc,
171: USBDeviceDescriptor *deviceDesc,
172: USBDeviceRef device)
173: {
174: #pragma unused (interfaceNum)
175: #pragma unused (interfaceDesc)
176: #pragma unused (deviceDesc)
177: #pragma unused (device)
178:
179: return (OSStatus)kUSBNoErr;
180: }
181:
182: OSStatus CompositeDriverNotifyProc(UInt32 notification, void *pointer, UInt32 refcon)
183: {
184: #pragma unused (pointer)
185: #pragma unused (notification)
186: #pragma unused (refcon)
187: return(kUSBNoErr);
188: }
189:
190: // Hardware Validation
191: // Called upon load by Expert
192: OSStatus CompositeDriverValidateHW(USBDeviceRef device, USBDeviceDescriptor *desc)
193: {
194: #pragma unused (device)
195: #pragma unused (desc)
196:
197: return (OSStatus)kUSBNoErr;
198: }
199:
200: // Initialization function
201: // Called upon load by Expert
202: OSStatus CompositeDriverInitialize (USBDeviceRef device, USBDeviceDescriptorPtr pDesc, UInt32 busPowerAvailable)
203: {
204: #pragma unused (busPowerAvailable)
205: // until we get going, it's okay to accept a call to finalize
206: //naga newInterfacesPB[index].okayToFinalizeFlag = true;
207: if(pDesc->protocol == 0)
208: newInterfacesPB[0].okayToFinalizeFlag = true;
209: else newInterfacesPB[1].okayToFinalizeFlag = true;
210: DeviceInitialize(device, pDesc, busPowerAvailable);
211: return (OSStatus)kUSBNoErr;
212: }
213:
214: // Termination function
215: // Called by Expert when driver is being shut down
216: OSStatus CompositeDriverFinalize(USBDeviceRef theDeviceRef, USBDeviceDescriptorPtr pDesc)
217: {
218: #pragma unused (pDesc)
219: UInt32 i;
220: int index;
221: OSStatus myErr;
222:
223: // If all the interfaces have been examined and had their interface
224: // drivers loaded, then go ahead and removed them all
225: // otherwise just return with a device busy error code.
226: if(pDesc->protocol == 0)
227: index = 0;
228: else index = 1;
229: USBExpertStatus(newInterfacesPB[index].pb.usbReference, "Composite Driver: Finalize", newInterfacesPB[index].pb.usbStatus);
230: if (theDeviceRef == newInterfacesPB[index].deviceRef)
231: {
232: if (newInterfacesPB[index].okayToFinalizeFlag)
233: {
234: USBExpertStatus(newInterfacesPB[index].pb.usbReference, "Composite Driver: Removing Interface drivers & InterfaceRefs", newInterfacesPB[index].pb.usbStatus);
235: for (i=0; i < newInterfacesPB[index].interfaceCount; i++)
236: {
237: USBExpertRemoveInterfaceDriver(newInterfacesPB[index].interfaceRefArray[i]);
238: InitParamBlock(newInterfacesPB[index].deviceRef, &newInterfacesPB[index].pb);
239: newInterfacesPB[index].pb.usbRefcon = 0;
240: newInterfacesPB[index].pb.usb.cntl.WIndex = i;
241: newInterfacesPB[index].pb.usbCompletion = (USBCompletion)-1;
242: myErr = USBDisposeInterfaceRef(&newInterfacesPB[index].pb);
243: }
244:
245: InitParamBlock(newInterfacesPB[index].deviceRef, &newInterfacesPB[index].pb);
246: newInterfacesPB[index].pb.usbRefcon = 0;
247: newInterfacesPB[index].pb.usbBuffer = newInterfacesPB[index].pFullConfigDescriptor;
248: newInterfacesPB[index].pb.usbCompletion = (USBCompletion)-1;
249: myErr = USBDeallocMem(&newInterfacesPB[index].pb);
250: return (OSStatus)kUSBNoErr;
251: }
252: else
253: {
254: return (OSStatus)kUSBDeviceBusy;
255: }
256: }
257: else
258: {
259: USBExpertFatalError(newInterfacesPB[index].pb.usbReference, kUSBInternalErr, "Composite Driver - Finalize received unknown deviceRef", newInterfacesPB[index].pb.usbRefcon);
260: return (OSStatus)kUSBUnknownDeviceErr;
261: }
262: }
263:
264: void DeviceInitialize(USBDeviceRef device, USBDeviceDescriptorPtr pDeviceDescriptor, UInt32 busPowerAvailable)
265: {
266: Boolean beenThereDoneThat = false;
267: int index;
268: if(pDeviceDescriptor->protocol == 0)
269: index = 0;
270: else index = 1;
271: kprintf("USB: in DeviceInitialize Composite Driver\n");
272: if(beenThereDoneThat)
273: {
274: USBExpertFatalError(device, kUSBInternalErr, "Composite driver is not reentrant!", 0);
275: return;
276: }
277: //naga beenThereDoneThat = true;
278: newInterfacesPB[index].okayToFinalizeFlag = false;
279:
280: newInterfacesPB[index].deviceRef = device;
281: newInterfacesPB[index].deviceDescriptor = *pDeviceDescriptor;
282:
283: newInterfacesPB[index].busPowerAvailable = busPowerAvailable;
284: newInterfacesPB[index].delayLevel = 0;
285: newInterfacesPB[index].transDepth = 0;
286: newInterfacesPB[index].retryCount = kCompositeRetryCount;
287: newInterfacesPB[index].pFullConfigDescriptor = nil;
288:
289: InitParamBlock(device, &newInterfacesPB[index].pb);
290: newInterfacesPB[index].pb.usbRefcon = kGetFullConfiguration0; /* Start out at first state */
291:
292: // DebugStr("In Composite Driver");
293: CompositeDeviceInitiateTransaction(&newInterfacesPB[index].pb);
294: }
295:
296:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.