1*41488Smckusick /* 2*41488Smckusick * Copyright (c) 1988 University of Utah. 3*41488Smckusick * Copyright (c) 1990 The Regents of the University of California. 4*41488Smckusick * All rights reserved. 5*41488Smckusick * 6*41488Smckusick * This code is derived from software contributed to Berkeley by 7*41488Smckusick * the Systems Programming Group of the University of Utah Computer 8*41488Smckusick * Science Department. 9*41488Smckusick * 10*41488Smckusick * %sccs.include.redist.c% 11*41488Smckusick * 12*41488Smckusick * from: Utah $Hdr: autoconf.c 1.9 89/10/07$ 13*41488Smckusick * 14*41488Smckusick * @(#)autoconf.c 7.1 (Berkeley) 05/08/90 15*41488Smckusick */ 16*41488Smckusick 17*41488Smckusick #include "samachdep.h" 18*41488Smckusick #include "param.h" 19*41488Smckusick 20*41488Smckusick #include "../hpdev/device.h" 21*41488Smckusick #include "../hpdev/grfvar.h" 22*41488Smckusick 23*41488Smckusick struct hp_hw sc_table[MAX_CTLR]; 24*41488Smckusick 25*41488Smckusick configure() 26*41488Smckusick { 27*41488Smckusick find_devs(); 28*41488Smckusick cninit(); 29*41488Smckusick hpibinit(); 30*41488Smckusick scsiinit(); 31*41488Smckusick } 32*41488Smckusick 33*41488Smckusick sctoaddr(sc) 34*41488Smckusick int sc; 35*41488Smckusick { 36*41488Smckusick extern int internalhpib; 37*41488Smckusick 38*41488Smckusick if (sc == -2) 39*41488Smckusick return(0x1000000); 40*41488Smckusick if (sc == -1) 41*41488Smckusick return(GRFIADDR); 42*41488Smckusick if (sc == 7) 43*41488Smckusick return(internalhpib); 44*41488Smckusick if (sc < 32) 45*41488Smckusick return(0x600000+(0x10000*sc)); 46*41488Smckusick return(sc); 47*41488Smckusick } 48*41488Smckusick 49*41488Smckusick /* 50*41488Smckusick * Probe all select codes (0 - 32) and internal display address. 51*41488Smckusick * Note that we only care about displays, SCSIs and HP-IBs. 52*41488Smckusick */ 53*41488Smckusick find_devs() 54*41488Smckusick { 55*41488Smckusick u_char *id_reg; 56*41488Smckusick register short sc; 57*41488Smckusick register int addr; 58*41488Smckusick register struct hp_hw *hw; 59*41488Smckusick 60*41488Smckusick hw = sc_table; 61*41488Smckusick for (sc = -2; sc < 32; sc++) { 62*41488Smckusick addr = sctoaddr(sc); 63*41488Smckusick if (badaddr(addr)) 64*41488Smckusick continue; 65*41488Smckusick 66*41488Smckusick id_reg = (u_char *) addr; 67*41488Smckusick hw->hw_addr = (char *) addr; 68*41488Smckusick hw->hw_id = id_reg[1] & 0xff; 69*41488Smckusick hw->hw_sc = sc; 70*41488Smckusick 71*41488Smckusick switch (hw->hw_id) { 72*41488Smckusick case 8: /* 98625B */ 73*41488Smckusick case 128: /* 98624A */ 74*41488Smckusick hw->hw_type = HPIB; 75*41488Smckusick break; 76*41488Smckusick case 57: /* Displays */ 77*41488Smckusick hw->hw_type = BITMAP; 78*41488Smckusick hw->hw_id2 = id_reg[0x15]; 79*41488Smckusick switch (hw->hw_id2) { 80*41488Smckusick case 4: /* renaissance */ 81*41488Smckusick case 8: /* davinci */ 82*41488Smckusick sc++; /* occupy 2 select codes */ 83*41488Smckusick break; 84*41488Smckusick } 85*41488Smckusick break; 86*41488Smckusick case 9: 87*41488Smckusick hw->hw_type = KEYBOARD; 88*41488Smckusick break; 89*41488Smckusick case 7: 90*41488Smckusick case 39: 91*41488Smckusick case 71: 92*41488Smckusick case 103: 93*41488Smckusick hw->hw_type = SCSI; 94*41488Smckusick break; 95*41488Smckusick default: /* who cares */ 96*41488Smckusick hw->hw_type = MISC; 97*41488Smckusick break; 98*41488Smckusick } 99*41488Smckusick hw++; 100*41488Smckusick } 101*41488Smckusick } 102