1 /* $NetBSD: adb.c,v 1.26 1998/10/26 07:09:37 scottr Exp $ */ 2 3 /* 4 * Copyright (C) 1994 Bradley A. Grantham 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Bradley A. Grantham. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include "opt_adb.h" 34 35 #include <sys/param.h> 36 #include <sys/device.h> 37 #include <sys/fcntl.h> 38 #include <sys/poll.h> 39 #include <sys/select.h> 40 #include <sys/proc.h> 41 #include <sys/signalvar.h> 42 #include <sys/systm.h> 43 44 #include <machine/autoconf.h> 45 #include <machine/cpu.h> 46 47 #include <mac68k/mac68k/macrom.h> 48 #include <mac68k/dev/adbvar.h> 49 #include <mac68k/dev/itevar.h> 50 #include <mac68k/dev/kbdvar.h> 51 52 #include "aed.h" /* ADB Event Device for compatibility */ 53 54 /* 55 * Function declarations. 56 */ 57 static int adbmatch __P((struct device *, struct cfdata *, void *)); 58 static void adbattach __P((struct device *, struct device *, void *)); 59 static int adbprint __P((void *, const char *)); 60 61 extern void adb_jadbproc __P((void)); 62 63 /* 64 * Global variables. 65 */ 66 int adb_initted = 0; /* adb_init() has completed successfully */ 67 #ifdef ADB_DEBUG 68 int adb_debug = 0; /* Output debugging messages */ 69 #endif /* ADB_DEBUG */ 70 71 extern struct mac68k_machine_S mac68k_machine; 72 extern int adbHardware; 73 extern char *adbHardwareDescr[]; 74 75 /* 76 * Driver definition. 77 */ 78 struct cfattach adb_ca = { 79 sizeof(struct device), adbmatch, adbattach 80 }; 81 82 static int 83 adbmatch(parent, cf, aux) 84 struct device *parent; 85 struct cfdata *cf; 86 void *aux; 87 { 88 static int adb_matched = 0; 89 90 /* Allow only one instance. */ 91 if (adb_matched) 92 return (0); 93 94 adb_matched = 1; 95 return (1); 96 } 97 98 static void 99 adbattach(parent, dev, aux) 100 struct device *parent, *dev; 101 void *aux; 102 { 103 ADBDataBlock adbdata; 104 struct adb_attach_args aa_args; 105 int totaladbs; 106 int adbindex, adbaddr; 107 108 #ifdef MRG_ADB 109 /* 110 * Even if serial console only, some models require the 111 * ADB in order to get the date/time and do soft power. 112 */ 113 if ((mac68k_machine.serial_console & 0x03)) { 114 printf(": using serial console"); 115 return; 116 } 117 118 if (!mrg_romready()) { 119 printf(": no ROM ADB driver in this kernel for this machine"); 120 return; 121 } 122 123 #ifdef ADB_DEBUG 124 if (adb_debug) 125 printf("adb: call mrg_initadbintr\n"); 126 #endif 127 128 mrg_initadbintr(); /* Mac ROM Glue okay to do ROM intr */ 129 #ifdef ADB_DEBUG 130 if (adb_debug) 131 printf("adb: returned from mrg_initadbintr\n"); 132 #endif 133 134 /* ADBReInit pre/post-processing */ 135 JADBProc = adb_jadbproc; 136 137 /* Initialize ADB */ 138 #ifdef ADB_DEBUG 139 if (adb_debug) 140 printf("adb: calling ADBAlternateInit.\n"); 141 #endif 142 143 printf(" (mrg) "); 144 ADBAlternateInit(); 145 #else 146 ADBReInit(); 147 printf(" (direct, %s)", adbHardwareDescr[adbHardware]); 148 #endif /* MRG_ADB */ 149 150 #ifdef ADB_DEBUG 151 if (adb_debug) 152 printf("adb: done with ADBReInit\n"); 153 #endif 154 155 totaladbs = CountADBs(); 156 157 printf(": %d targets\n", totaladbs); 158 159 #if NAED > 0 160 /* ADB event device for compatibility */ 161 aa_args.origaddr = 0; 162 aa_args.adbaddr = 0; 163 aa_args.handler_id = 0; 164 (void)config_found(dev, &aa_args, adbprint); 165 #endif 166 167 /* for each ADB device */ 168 for (adbindex = 1; adbindex <= totaladbs; adbindex++) { 169 /* Get the ADB information */ 170 adbaddr = GetIndADB(&adbdata, adbindex); 171 172 aa_args.origaddr = adbdata.origADBAddr; 173 aa_args.adbaddr = adbaddr; 174 aa_args.handler_id = adbdata.devType; 175 176 (void)config_found(dev, &aa_args, adbprint); 177 } 178 } 179 180 181 int 182 adbprint(args, name) 183 void *args; 184 const char *name; 185 { 186 struct adb_attach_args *aa_args = (struct adb_attach_args *)args; 187 int rv = UNCONF; 188 189 if (name) { /* no configured device matched */ 190 rv = UNSUPP; /* most ADB device types are unsupported */ 191 192 /* print out what kind of ADB device we have found */ 193 printf("%s addr %d: ", name, aa_args->origaddr); 194 switch(aa_args->origaddr) { 195 #ifdef DIAGNOSTIC 196 case 0: 197 printf("ADB event device"); 198 rv = UNCONF; 199 break; 200 case ADBADDR_SECURE: 201 printf("security dongle (%d)", aa_args->handler_id); 202 break; 203 #endif 204 case ADBADDR_MAP: 205 printf("mapped device (%d)", aa_args->handler_id); 206 rv = UNCONF; 207 break; 208 case ADBADDR_REL: 209 printf("relative positioning device (%d)", 210 aa_args->handler_id); 211 rv = UNCONF; 212 break; 213 #ifdef DIAGNOSTIC 214 case ADBADDR_ABS: 215 switch (aa_args->handler_id) { 216 case ADB_ARTPAD: 217 printf("WACOM ArtPad II"); 218 break; 219 default: 220 printf("absolute positioning device (%d)", 221 aa_args->handler_id); 222 break; 223 } 224 break; 225 case ADBADDR_DATATX: 226 printf("data transfer device (modem?) (%d)", 227 aa_args->handler_id); 228 break; 229 case ADBADDR_MISC: 230 switch (aa_args->handler_id) { 231 case ADB_POWERKEY: 232 printf("Sophisticated Circuits PowerKey"); 233 break; 234 default: 235 printf("misc. device (remote control?) (%d)", 236 aa_args->handler_id); 237 break; 238 } 239 break; 240 default: 241 printf("unknown type device, (handler %d)", 242 aa_args->handler_id); 243 break; 244 #endif /* DIAGNOSTIC */ 245 } 246 } else /* a device matched and was configured */ 247 printf(" addr %d: ", aa_args->origaddr); 248 249 return (rv); 250 } 251