|
|
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: /* Copyright (c) 1993 NeXT Computer, Inc. All rights reserved. ! 25: * ! 26: * IODeviceDescription.m. ! 27: * ! 28: * HISTORY ! 29: * 08-Jan-93 Doug Mitchell at NeXT ! 30: * Created. ! 31: */ ! 32: ! 33: #import <objc/List.h> ! 34: #import <driverkit/IODeviceDescription.h> ! 35: #import <driverkit/IODeviceDescriptionPrivate.h> ! 36: #import <driverkit/KernBus.h> ! 37: #import <driverkit/KernDeviceDescription.h> ! 38: ! 39: struct _private { ! 40: unsigned int *interrupts; ! 41: unsigned int numInterrupts; ! 42: IORange *memoryRanges; ! 43: unsigned int numMemoryRanges; ! 44: }; ! 45: ! 46: @implementation IODeviceDescription ! 47: ! 48: - init ! 49: { ! 50: return [self _initWithDelegate:nil]; ! 51: } ! 52: ! 53: - free ! 54: { ! 55: struct _private *private = _private; ! 56: ! 57: if (private->numInterrupts > 0) ! 58: IOFree(private->interrupts, ! 59: private->numInterrupts * sizeof (*private->interrupts)); ! 60: if (private->numMemoryRanges > 0) ! 61: IOFree(private->memoryRanges, ! 62: private->numMemoryRanges * sizeof (*private->memoryRanges)); ! 63: IOFree(private, sizeof (*private)); ! 64: ! 65: if (_devicePort != PORT_NULL) ! 66: destroy_dev_port(_devicePort); // XXX ! 67: ! 68: return [super free]; ! 69: } ! 70: ! 71: - (port_t)devicePort ! 72: { ! 73: return _devicePort; ! 74: } ! 75: ! 76: - (void)setDevicePort: (port_t)devicePort ! 77: { ! 78: _devicePort = devicePort; ! 79: } ! 80: ! 81: - directDevice ! 82: { ! 83: return _directDevice; ! 84: } ! 85: ! 86: - (void)setDirectDevice: directDevice ! 87: { ! 88: _directDevice = directDevice; ! 89: } ! 90: ! 91: - (void)setConfigTable: (IOConfigTable *)configTable ! 92: { ! 93: /* nop */ ! 94: } ! 95: ! 96: - (IOConfigTable *)configTable ! 97: { ! 98: return [_delegate configTable]; ! 99: } ! 100: ! 101: - getDevicePath:(char *)path maxLength:(int)maxLen useAlias:(BOOL)doAlias ! 102: { ! 103: return( NULL); ! 104: } ! 105: ! 106: - (char *) matchDevicePath:(char *)matchPath ! 107: { ! 108: return( NULL); ! 109: } ! 110: ! 111: @end ! 112: ! 113: @implementation IODeviceDescription(IOInterrupt) ! 114: - (unsigned int) interrupt ! 115: { ! 116: return [self interruptList][0]; ! 117: } ! 118: ! 119: - (unsigned int *) interruptList ! 120: { ! 121: struct _private *private = _private; ! 122: ! 123: if (private->numInterrupts == 0) ! 124: private->interrupts = [self ! 125: _fetchItemList:[[self _delegate] ! 126: resourcesForKey:IRQ_LEVELS_KEY] ! 127: returnedNum:&private->numInterrupts]; ! 128: return private->interrupts; ! 129: } ! 130: ! 131: - (unsigned int) numInterrupts ! 132: { ! 133: struct _private *private = _private; ! 134: ! 135: if (private->numInterrupts == 0) ! 136: private->interrupts = [self ! 137: _fetchItemList:[[self _delegate] ! 138: resourcesForKey:IRQ_LEVELS_KEY] ! 139: returnedNum:&private->numInterrupts]; ! 140: return private->numInterrupts; ! 141: } ! 142: ! 143: - (IOReturn) setInterruptList:(unsigned int *)aList num:(unsigned int) length ! 144: { ! 145: IOReturn ret = IO_R_RESOURCE; ! 146: ! 147: if ([[self _delegate] ! 148: allocateItems:aList numItems:length ! 149: forKey:IRQ_LEVELS_KEY] != nil) { ! 150: ! 151: struct _private *private = (struct _private *)_private; ! 152: if (private->numInterrupts > 0) ! 153: IOFree(private->interrupts, ! 154: private->numInterrupts * sizeof (*private->interrupts)); ! 155: private->numInterrupts = 0; ! 156: ret = IO_R_SUCCESS; ! 157: } ! 158: return ret; ! 159: } ! 160: @end ! 161: ! 162: @implementation IODeviceDescription(IOMemory) ! 163: - (IORange *) memoryRangeList ! 164: { ! 165: struct _private *private = _private; ! 166: ! 167: if (private->numMemoryRanges == 0) ! 168: private->memoryRanges = ! 169: [self ! 170: _fetchRangeList:[[self _delegate] ! 171: resourcesForKey:MEM_MAPS_KEY] ! 172: returnedNum:&private->numMemoryRanges]; ! 173: return private->memoryRanges; ! 174: } ! 175: ! 176: - (unsigned int) numMemoryRanges ! 177: { ! 178: struct _private *private = _private; ! 179: ! 180: if (private->numMemoryRanges == 0) ! 181: private->memoryRanges = ! 182: [self ! 183: _fetchRangeList:[[self _delegate] ! 184: resourcesForKey:MEM_MAPS_KEY] ! 185: returnedNum:&private->numMemoryRanges]; ! 186: return private->numMemoryRanges; ! 187: } ! 188: ! 189: - (IOReturn) setMemoryRangeList:(IORange *)aList num:(unsigned int) length ! 190: { ! 191: IOReturn ret = IO_R_RESOURCE; ! 192: Range *ranges; ! 193: int i; ! 194: ! 195: ranges = (Range *)IOMalloc(sizeof(Range) * length); ! 196: for (i=0; i<length; i++) { ! 197: ranges[i].base = aList[i].start; ! 198: ranges[i].length = aList[i].size; ! 199: } ! 200: if ([[self _delegate] ! 201: allocateRanges:ranges numRanges:length forKey:MEM_MAPS_KEY] ! 202: != nil) { ! 203: ! 204: struct _private *private = (struct _private *)_private; ! 205: if (private->numMemoryRanges > 0) ! 206: IOFree(private->memoryRanges, ! 207: private->numMemoryRanges * sizeof (*private->memoryRanges)); ! 208: private->numMemoryRanges = 0; ! 209: ret = IO_R_SUCCESS; ! 210: } ! 211: IOFree(ranges, sizeof(Range) * length); ! 212: return ret; ! 213: } ! 214: ! 215: @end ! 216: ! 217: @implementation IODeviceDescription(Private) ! 218: ! 219: - _initWithDelegate:delegate ! 220: { ! 221: _private = (void *)IOMalloc(sizeof (struct _private)); ! 222: bzero(_private, sizeof (struct _private)); ! 223: ! 224: _delegate = delegate; ! 225: ! 226: return self; ! 227: } ! 228: ! 229: - _delegate ! 230: { ! 231: return _delegate; ! 232: } ! 233: ! 234: - _deviceClass ! 235: { ! 236: return nil; ! 237: } ! 238: ! 239: - (void *)_fetchItemList: list ! 240: returnedNum: (unsigned int *)returnedNum ! 241: { ! 242: unsigned int *array = 0; ! 243: int i, num; ! 244: ! 245: num = [list count]; ! 246: if (num > 0) { ! 247: array = (void *)IOMalloc(num * sizeof (*array)); ! 248: for (i = 0; i < num; i++) ! 249: array[i] = [[list objectAt:i] item]; ! 250: } ! 251: ! 252: *returnedNum = num; ! 253: return array; ! 254: } ! 255: ! 256: - (void *)_fetchRangeList: list ! 257: returnedNum: (unsigned int *)returnedNum ! 258: { ! 259: IORange *array = 0; ! 260: Range range; ! 261: int i, num; ! 262: ! 263: num = [list count]; ! 264: if (num > 0) { ! 265: array = (void *)IOMalloc(num * sizeof (*array)); ! 266: for (i = 0; i < num; i++) { ! 267: range = [[list objectAt:i] range]; ! 268: array[i].start = range.base; ! 269: array[i].size = range.length; ! 270: } ! 271: } ! 272: ! 273: *returnedNum = num; ! 274: return array; ! 275: } ! 276: ! 277: - lookUpProperty:(const char *)propertyName ! 278: value:(unsigned char *)value ! 279: length:(unsigned int *)length ! 280: selector:(SEL)selector ! 281: isString:(BOOL)isString ! 282: { ! 283: id rtn = nil; ! 284: char * str; ! 285: ! 286: if( [self respondsTo:selector]) { ! 287: // guarantee a minimal size so most methods don't have to check ! 288: if( (isString == NO) || ((strlen( value) + 32) <= *length)) ! 289: rtn = objc_msgSend( self, selector, value, length ); ! 290: } ! 291: ! 292: if( nil == rtn) { ! 293: if( (str = [[self configTable] valueForStringKey:propertyName])) { ! 294: if( (strlen( str) + 1) < *length) { ! 295: strcpy( value, str); ! 296: rtn = self; ! 297: } ! 298: } ! 299: } ! 300: ! 301: return( rtn); ! 302: } ! 303: ! 304: - property_IODeviceClass:(char *)classes length:(unsigned int *)maxLen ! 305: { ! 306: return( nil); ! 307: } ! 308: ! 309: - property_IODeviceType:(char *)classes length:(unsigned int *)maxLen ! 310: { ! 311: return( nil); ! 312: } ! 313: ! 314: - (char *) nodeName ! 315: { ! 316: return( NULL); ! 317: } ! 318: ! 319: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.