Annotation of driverkit/Examples/userDriver/userDriver.m, revision 1.1.1.1

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:  * userDriver.m.
                     26:  * sample user driver. Exec'd by Config.
                     27:  */
                     28:  
                     29: #import "userDriver.h"
                     30: #import <driverkit/IODeviceDescription.h>
                     31: #import <libc.h>
                     32: #import <mach/mach_error.h>
                     33: #import <driverkit/driverServer.h>
                     34: #import <driverkit/userConfigServer.h>
                     35: #import <driverkit/generalFuncs.h>
                     36: #import <servers/netname.h>
                     37: 
                     38: int main(int argc, char **argv)
                     39: {
                     40:        IOConfigReturn  crtn;
                     41:        kern_return_t   krtn;
                     42:        port_t          driverSigPort;
                     43:        port_t          devPorts[NUM_DEVICES];
                     44:        port_t          driverPort;
                     45:        int             i;
                     46:        id              deviceDescription;
                     47:        int             numPorts;
                     48:        port_t          configPort;
                     49:        
                     50:        IOLog("driver %s: starting\n", argv[0], 2,3,4,5);
                     51:        
                     52:        port_allocate(task_self(), &driverPort);
                     53:        krtn = netname_look_up(name_server_port,
                     54:                "",                                     // hostname
                     55:                CONFIG_SERVER_NAME,
                     56:                &configPort);
                     57:        if(krtn) {
                     58:                IOLog("%s: can't find %s: %s\n",
                     59:                        argv[0], CONFIG_SERVER_NAME, mach_error_string(krtn),
                     60:                        4,5);
                     61:                exit(1);
                     62:        }
                     63:        if(crtn = IOGetDevicePorts(NUM_DEVICES,
                     64:                        "userDriver",
                     65:                        devPorts, 
                     66:                        &numPorts,
                     67:                        &driverSigPort) != IO_CNF_SUCCESS) {
                     68:                IOLog("IOGetDevicePorts() returned %d\n", crtn);
                     69:                exit(1);
                     70:        }
                     71:        
                     72:        /*
                     73:         * Register with Config.
                     74:         */
                     75:        crtn = IORegisterDriver(configPort,
                     76:                driverSigPort,
                     77:                driverPort);    
                     78:        if(crtn) {
                     79:                IOLog("%s: IORegisterDriver: crtn = %d\n",
                     80:                        argv[0], crtn, 3,4,5);
                     81:                exit(1);
                     82:        }
                     83:        
                     84:        /*
                     85:         * Start up a driver instance for each dev_port.
                     86:         */
                     87:        for(i=0; i<NUM_DEVICES; i++) {
                     88:                deviceDescription = [IODeviceDescription new];
                     89:                [deviceDescription setDevicePort:devPorts[i]];
                     90:                [MyDevice probe:deviceDescription];
                     91:        }
                     92:        
                     93:        /*
                     94:         * Sleep until killed.
                     95:         */
                     96:        while(1)
                     97:                sleep(1);
                     98:        exit(0);
                     99: }
                    100: 
                    101: #if    0
                    102: /*
                    103:  * Look up all of our devPorts.  Returns # of ports found.
                    104:  */
                    105: static int getDevrPort(port_t *devPorts, 
                    106:        int maxDevices,
                    107:        const char *driverName)
                    108: {
                    109:        int i;
                    110:        name_array_t serviceNames;
                    111:        unsigned int serviceCount;
                    112:        name_array_t serverNames;
                    113:        unsigned int serverCount;
                    114:        bool_array_t serviceActive;
                    115:        unsigned int serviceActiveCount;
                    116:        kern_return_t krtn;
                    117:        int portIndex = 0;
                    118:        
                    119:        krtn = bootstrap_info(bootstrap_port, 
                    120:                &serviceNames, 
                    121:                &serviceCount,
                    122:                &serverNames, 
                    123:                &serverCount, 
                    124:                &serviceActive, 
                    125:                &serviceActiveCount);
                    126:        if (krtn != BOOTSTRAP_SUCCESS) {
                    127:                IOLog("%s: bootstrap_info: %s", 
                    128:                        driverName, mach_error_string(krtn), 3,4,5);
                    129:                return(PORT_NULL);
                    130:        }
                    131: 
                    132:        /*
                    133:         * Search for devr_XXXX_XXXX. Later - versions and dev_index via
                    134:         * dev_port_to_type().
                    135:         */
                    136:        IOLog("%s: serviceCount %d\n", driverName, serviceCount, 3,4,5);
                    137:        for (i = 0; i < serviceCount; i++) {
                    138: #ifdef notdef
                    139:                IOLog("%s: serviceName %s\n", driverName, serviceNames[i],
                    140:                        4,5);
                    141: #endif notdef
                    142:                if(strncmp(serviceNames[i], 
                    143:                    "dev_port_", strlen("dev_port_")) == 0) {
                    144:                        IOLog("%s: port %s found\n", 
                    145:                                driverName, serviceNames[i], 3,4,5);
                    146:                        
                    147:                        /*
                    148:                         * Get the devPort. 
                    149:                         */
                    150:                        krtn = bootstrap_look_up(bootstrap_port,
                    151:                                serviceNames[i],
                    152:                                &devPorts[portIndex]);
                    153:                        if(krtn) {
                    154:                                IOLog("%s: bootstrap_look_up: %s",
                    155:                                        driverName, mach_error_string(krtn),
                    156:                                        3,4,5);
                    157:                                return(0);
                    158:                        }
                    159:                        else {
                    160:                                if(++portIndex > maxDevices) {
                    161:                                        IOLog("%s: maxDevices exceeded\n",
                    162:                                                driverName, 2,3,4,5);
                    163:                                        return(portIndex);
                    164:                                }
                    165:                        }
                    166:                }
                    167:        }
                    168:        IOLog("%s: %d devPorts found\n", driverName, portIndex, 3,4,5);
                    169:        return(portIndex);
                    170: }
                    171: 
                    172: #endif 0
                    173: 
                    174: /*
                    175:  * Simple driver class.
                    176:  */
                    177: @implementation MyDevice
                    178: 
                    179: static int unitNum;
                    180: 
                    181: + (BOOL)probe : deviceDescription
                    182: {
                    183:        MyDevice *myId;
                    184:        IOString devName;
                    185:        
                    186:        myId = [self alloc];
                    187:        [myId setDeviceDescription:deviceDescription];
                    188:        [myId setUnit:unitNum];
                    189:        sprintf(devName, "MyDevice%d", unitNum++);
                    190:        [myId setName:devName];
                    191:        [myId setDeviceKind:"Example Driver"];
                    192:        [myId setLocation:NULL];
                    193:        [myId MyDeviceInit];
                    194:        return YES;
                    195: }
                    196: /*
                    197:  * Device-specific initialization.
                    198:  */
                    199: - MyDeviceInit
                    200: {
                    201:        IOLog("MyDeviceInit: unit %d\n", [self unit], 2,3,4,5);
                    202:        
                    203:        /*
                    204:         * ...initialization code here.
                    205:         */
                    206:        return self;
                    207: }
                    208: 
                    209: 
                    210: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.