1 /* $NetBSD: adb.c,v 1.62 2024/09/18 01:34:08 nat 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 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include <sys/cdefs.h> 29 __KERNEL_RCSID(0, "$NetBSD: adb.c,v 1.62 2024/09/18 01:34:08 nat Exp $"); 30 31 #include "opt_adb.h" 32 33 #include <sys/param.h> 34 #include <sys/device.h> 35 #include <sys/fcntl.h> 36 #include <sys/poll.h> 37 #include <sys/select.h> 38 #include <sys/proc.h> 39 #include <sys/signalvar.h> 40 #include <sys/systm.h> 41 #include <sys/cpu.h> 42 #include <sys/intr.h> 43 44 #include <machine/autoconf.h> 45 46 #include <mac68k/mac68k/macrom.h> 47 #include <mac68k/dev/adbvar.h> 48 #include <mac68k/dev/akbdvar.h> 49 50 #include "aed.h" /* ADB Event Device for compatibility */ 51 52 /* 53 * Function declarations. 54 */ 55 static int adbmatch(device_t, cfdata_t, void *); 56 static void adbattach(device_t, device_t, void *); 57 static int adbprint(void *, const char *); 58 void adb_config_interrupts(device_t); 59 60 extern void adb_jadbproc(void); 61 62 /* 63 * Global variables. 64 */ 65 int adb_polling = 0; /* Are we polling? (Debugger mode) */ 66 #ifdef ADB_DEBUG 67 int adb_debug = 0; /* Output debugging messages */ 68 #endif /* ADB_DEBUG */ 69 70 extern struct mac68k_machine_S mac68k_machine; 71 extern int adbHardware; 72 extern char *adbHardwareDescr[]; 73 74 /* 75 * Driver definition. 76 */ 77 CFATTACH_DECL_NEW(adb, 0, 78 adbmatch, adbattach, NULL, NULL); 79 80 static int 81 adbmatch(device_t parent, cfdata_t cf, void *aux) 82 { 83 static bool adb_matched; 84 85 /* Allow only one instance. */ 86 if (adb_matched) 87 return (0); 88 89 adb_matched = true; 90 return (1); 91 } 92 93 static void 94 adbattach(device_t parent, device_t self, void *aux) 95 { 96 97 switch (mac68k_machine.machineid) { 98 case MACH_MACPB140: 99 case MACH_MACPB145: 100 case MACH_MACPB160: 101 case MACH_MACPB165: 102 case MACH_MACPB165C: 103 case MACH_MACPB170: 104 case MACH_MACPB180: 105 case MACH_MACPB180C: 106 case MACH_MACPB150: 107 /* Reqired on machines with in-built trackballs. */ 108 printf("... Waiting 5 seconds for adb devices to " 109 "settle."); 110 kpause("adb-slp", false, mstohz(5000), NULL); 111 break; 112 default: 113 break; 114 } 115 116 adb_softintr_cookie = softint_establish(SOFTINT_SERIAL, 117 (void (*)(void *))adb_soft_intr, NULL); 118 printf("\n"); 119 120 /* 121 * Defer configuration until interrupts are enabled. 122 */ 123 config_interrupts(self, adb_config_interrupts); 124 } 125 126 void 127 adb_config_interrupts(device_t self) 128 { 129 ADBDataBlock adbdata; 130 struct adb_attach_args aa_args; 131 int totaladbs; 132 int adbindex, adbaddr; 133 134 printf("%s", device_xname(self)); 135 adb_polling = 1; 136 137 #ifdef MRG_ADB 138 if (!mrg_romready()) { 139 printf(": no ROM ADB driver in this kernel for this machine\n"); 140 return; 141 } 142 143 #ifdef ADB_DEBUG 144 if (adb_debug) 145 printf("adb: call mrg_initadbintr\n"); 146 #endif 147 148 mrg_initadbintr(); /* Mac ROM Glue okay to do ROM intr */ 149 #ifdef ADB_DEBUG 150 if (adb_debug) 151 printf("adb: returned from mrg_initadbintr\n"); 152 #endif 153 154 /* ADBReInit pre/post-processing */ 155 JADBProc = adb_jadbproc; 156 157 /* Initialize ADB */ 158 #ifdef ADB_DEBUG 159 if (adb_debug) 160 printf("adb: calling ADBAlternateInit.\n"); 161 #endif 162 163 printf(" (mrg)"); 164 ADBAlternateInit(); 165 #else 166 ADBReInit(); 167 printf(" (direct, %s)", adbHardwareDescr[adbHardware]); 168 #endif /* MRG_ADB */ 169 170 #ifdef ADB_DEBUG 171 if (adb_debug) 172 printf("adb: done with ADBReInit\n"); 173 #endif 174 175 totaladbs = CountADBs(); 176 177 printf(": %d target%s\n", totaladbs, (totaladbs == 1) ? "" : "s"); 178 179 #if NAED > 0 180 /* ADB event device for compatibility */ 181 aa_args.origaddr = 0; 182 aa_args.adbaddr = 0; 183 aa_args.handler_id = 0; 184 (void)config_found(self, &aa_args, adbprint, CFARGS_NONE); 185 #endif 186 187 /* for each ADB device */ 188 for (adbindex = 1; adbindex <= totaladbs; adbindex++) { 189 /* Get the ADB information */ 190 adbaddr = GetIndADB(&adbdata, adbindex); 191 192 aa_args.origaddr = (int)(adbdata.origADBAddr); 193 aa_args.adbaddr = adbaddr; 194 aa_args.handler_id = (int)(adbdata.devType); 195 196 (void)config_found(self, &aa_args, adbprint, CFARGS_NONE); 197 } 198 adb_polling = 0; 199 } 200 201 202 int 203 adbprint(void *args, const char *name) 204 { 205 struct adb_attach_args *aa_args = (struct adb_attach_args *)args; 206 int rv = UNCONF; 207 208 if (name) { /* no configured device matched */ 209 rv = UNSUPP; /* most ADB device types are unsupported */ 210 211 /* print out what kind of ADB device we have found */ 212 aprint_normal("%s addr %d: ", name, aa_args->adbaddr); 213 switch(aa_args->origaddr) { 214 case 0: 215 #ifdef DIAGNOSTIC 216 aprint_normal("ADB event device"); 217 #endif 218 rv = UNCONF; 219 break; 220 #ifdef DIAGNOSTIC 221 case ADBADDR_SECURE: 222 aprint_normal("security dongle (%d)", 223 aa_args->handler_id); 224 break; 225 #endif 226 case ADBADDR_MAP: 227 aprint_normal("mapped device (%d)", 228 aa_args->handler_id); 229 rv = UNCONF; 230 break; 231 case ADBADDR_REL: 232 aprint_normal("relative positioning device (%d)", 233 aa_args->handler_id); 234 rv = UNCONF; 235 break; 236 #ifdef DIAGNOSTIC 237 case ADBADDR_ABS: 238 switch (aa_args->handler_id) { 239 case ADB_ARTPAD: 240 aprint_normal("WACOM ArtPad II"); 241 break; 242 default: 243 aprint_normal("absolute positioning device (%d)", 244 aa_args->handler_id); 245 break; 246 } 247 break; 248 case ADBADDR_DATATX: 249 aprint_normal("data transfer device (modem?) (%d)", 250 aa_args->handler_id); 251 break; 252 case ADBADDR_MISC: 253 switch (aa_args->handler_id) { 254 case ADB_POWERKEY: 255 aprint_normal("Sophisticated Circuits PowerKey"); 256 break; 257 default: 258 aprint_normal("misc. device (remote control?) (%d)", 259 aa_args->handler_id); 260 break; 261 } 262 break; 263 default: 264 aprint_normal("unknown type device, (handler %d)", 265 aa_args->handler_id); 266 break; 267 #endif /* DIAGNOSTIC */ 268 } 269 } else /* a device matched and was configured */ 270 aprint_normal(" addr %d: ", aa_args->adbaddr); 271 272 return (rv); 273 } 274 275 276 /* 277 * adb_op_sync 278 * 279 * This routine does exactly what the adb_op routine does, except that after 280 * the adb_op is called, it waits until the return value is present before 281 * returning. 282 * 283 * NOTE: The user specified compRout is ignored, since this routine specifies 284 * its own to adb_op, which is why you really called this in the first place 285 * anyway. 286 */ 287 int 288 adb_op_sync(Ptr buffer, Ptr compRout, Ptr data, short command) 289 { 290 int result; 291 volatile int flag = 0; 292 293 result = ADBOp(buffer, (void *)adb_op_comprout, __UNVOLATILE(&flag), 294 command); /* send command */ 295 if (result == 0) { /* send ok? */ 296 adb_spin(&flag); 297 if (!flag) 298 result = -2; 299 } 300 301 return result; 302 } 303 304 /* 305 * adb_spin 306 * 307 * Implements a spin-wait with timeout to be used for synchronous 308 * operations on the ADB bus. 309 * 310 * Total time to wait is calculated as follows: 311 * - Tlt (stop to start time): 260 usec 312 * - start bit: 100 usec 313 * - up to 8 data bytes: 64 * 100 usec = 6400 usec 314 * - stop bit (with SRQ): 140 usec 315 * Total: 6900 usec 316 * 317 * This is the total time allowed by the specification. Any device that 318 * doesn't conform to this will fail to operate properly on some Apple 319 * systems. In spite of this we double the time to wait; Cuda-based 320 * systems apparently queue commands and allow the main CPU to continue 321 * processing (how radical!). To be safe, allow time for two complete 322 * ADB transactions to occur. 323 */ 324 void 325 adb_spin(volatile int *fp) 326 { 327 int tmout; 328 329 for (tmout = 13800; *fp == 0 && tmout >= 10; tmout -= 10) 330 delay(10); 331 if (*fp == 0 && tmout > 0) 332 delay(tmout); 333 } 334 335 336 /* 337 * adb_op_comprout 338 * 339 * This function is used by the adb_op_sync routine so it knows when the 340 * function is done. 341 */ 342 void 343 adb_op_comprout(void) 344 { 345 __asm("movw #1,%a2@ | update flag value"); 346 } 347