diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2006-01-04 20:39:07 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2006-01-04 20:39:07 +0000 |
commit | b5304bb58ccc8685d27ff0f96701bb1cb258a6b9 (patch) | |
tree | 4a5df4ff90f4b17e9461da71efb1bb18e882b5a2 /sys/arch/mac68k/dev | |
parent | 15d15e3ad69f61e77c02fed009906131becd759f (diff) |
Import NetBSD's direct adb code on mac68k, switching to real keyboard and mouse
drivers, and to wscons as the console; a few parts borrowed from OpenBSD/macppc
as well.
Currently only working with displays configured in 1bpp or 8bpp modes; this
limitation will be worked on ASAP.
Tested by claudio@ kettenis@ martin@ nick@ and I on various models. X11 changes
coming soon.
Diffstat (limited to 'sys/arch/mac68k/dev')
-rw-r--r-- | sys/arch/mac68k/dev/6x10.h | 1416 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/adb.c | 660 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/adb_direct.c | 2220 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/adbsys.c | 315 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/adbsysasm.s | 74 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/adbvar.h | 92 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/akbd.c | 536 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/akbdmap.h | 431 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/akbdvar.h | 71 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/ams.c | 535 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/amsvar.h | 67 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/grf.c | 315 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/grf_iv.c | 26 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/grf_mv.c | 26 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/grf_subr.c | 9 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/grfvar.h | 58 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/ite.c | 1345 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/macfb.c | 359 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/macfbvar.h (renamed from sys/arch/mac68k/dev/itevar.h) | 66 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/pm_direct.c | 806 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/pm_direct.h | 10 |
21 files changed, 4110 insertions, 5327 deletions
diff --git a/sys/arch/mac68k/dev/6x10.h b/sys/arch/mac68k/dev/6x10.h deleted file mode 100644 index c3c20b49c75..00000000000 --- a/sys/arch/mac68k/dev/6x10.h +++ /dev/null @@ -1,1416 +0,0 @@ -/* $OpenBSD: 6x10.h,v 1.2 1996/05/26 18:35:13 briggs Exp $ */ -/* $NetBSD: 6x10.h,v 1.4 1995/04/21 02:47:35 briggs Exp $ */ - -/* This file was automatically generated by the program "sf" from */ -/* the Bitmap Description Format file "6x10.bdf". */ - -static unsigned char Font6x10[] = { - 0x00, /* ........ *//* (char = 0, 0x00) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 1, 0x01) */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x0E, /* ..###... */ - 0x1F, /* .#####.. */ - 0x0E, /* ..###... */ - 0x0E, /* ..###... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 2, 0x02) */ - 0x15, /* .#.#.#.. */ - 0x0A, /* ..#.#... */ - 0x15, /* .#.#.#.. */ - 0x0A, /* ..#.#... */ - 0x15, /* .#.#.#.. */ - 0x0A, /* ..#.#... */ - 0x15, /* .#.#.#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 3, 0x03) */ - 0x12, /* .#..#... */ - 0x12, /* .#..#... */ - 0x1E, /* .####... */ - 0x12, /* .#..#... */ - 0x12, /* .#..#... */ - 0x0F, /* ..####.. */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - - 0x00, /* ........ *//* (char = 4, 0x04) */ - 0x1C, /* .###.... */ - 0x10, /* .#...... */ - 0x18, /* .##..... */ - 0x10, /* .#...... */ - 0x17, /* .#.###.. */ - 0x04, /* ...#.... */ - 0x06, /* ...##... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x00, /* ........ *//* (char = 5, 0x05) */ - 0x0E, /* ..###... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x0E, /* ..###... */ - 0x0E, /* ..###... */ - 0x09, /* ..#..#.. */ - 0x0E, /* ..###... */ - 0x09, /* ..#..#.. */ - 0x09, /* ..#..#.. */ - - 0x00, /* ........ *//* (char = 6, 0x06) */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x1E, /* .####... */ - 0x0F, /* ..####.. */ - 0x08, /* ..#..... */ - 0x0E, /* ..###... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - - 0x00, /* ........ *//* (char = 7, 0x07) */ - 0x04, /* ...#.... */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 8, 0x08) */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x1F, /* .#####.. */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 9, 0x09) */ - 0x12, /* .#..#... */ - 0x1A, /* .##.#... */ - 0x1A, /* .##.#... */ - 0x16, /* .#.##... */ - 0x12, /* .#..#... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x0F, /* ..####.. */ - - 0x00, /* ........ *//* (char = 10, 0x0a) */ - 0x12, /* .#..#... */ - 0x12, /* .#..#... */ - 0x0C, /* ..##.... */ - 0x08, /* ..#..... */ - 0x0F, /* ..####.. */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - - 0x04, /* ...#.... *//* (char = 11, 0x0b) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x3C, /* ####.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 12, 0x0c) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x3C, /* ####.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x00, /* ........ *//* (char = 13, 0x0d) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x07, /* ...###.. */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x04, /* ...#.... *//* (char = 14, 0x0e) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x07, /* ...###.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x04, /* ...#.... *//* (char = 15, 0x0f) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x3F, /* ######.. */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x3F, /* ######.. *//* (char = 16, 0x10) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 17, 0x11) */ - 0x00, /* ........ */ - 0x3F, /* ######.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 18, 0x12) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x3F, /* ######.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 19, 0x13) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x3F, /* ######.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 20, 0x14) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x3F, /* ######.. */ - 0x00, /* ........ */ - - 0x04, /* ...#.... *//* (char = 21, 0x15) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x07, /* ...###.. */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x04, /* ...#.... *//* (char = 22, 0x16) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x3C, /* ####.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x04, /* ...#.... *//* (char = 23, 0x17) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x3F, /* ######.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 24, 0x18) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x3F, /* ######.. */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x04, /* ...#.... *//* (char = 25, 0x19) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - - 0x00, /* ........ *//* (char = 26, 0x1a) */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x08, /* ..#..... */ - 0x02, /* ....#... */ - 0x01, /* .....#.. */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 27, 0x1b) */ - 0x10, /* .#...... */ - 0x08, /* ..#..... */ - 0x02, /* ....#... */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 28, 0x1c) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x1F, /* .#####.. */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 29, 0x1d) */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x1F, /* .#####.. */ - 0x04, /* ...#.... */ - 0x1F, /* .#####.. */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 30, 0x1e) */ - 0x06, /* ...##... */ - 0x09, /* ..#..#.. */ - 0x08, /* ..#..... */ - 0x1C, /* .###.... */ - 0x08, /* ..#..... */ - 0x09, /* ..#..#.. */ - 0x16, /* .#.##... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 31, 0x1f) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 32, 0x20) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 33, 0x21) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 34, 0x22) */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 35, 0x23) */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x1F, /* .#####.. */ - 0x0A, /* ..#.#... */ - 0x1F, /* .#####.. */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 36, 0x24) */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x14, /* .#.#.... */ - 0x0E, /* ..###... */ - 0x05, /* ...#.#.. */ - 0x0E, /* ..###... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 37, 0x25) */ - 0x09, /* ..#..#.. */ - 0x15, /* .#.#.#.. */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x0A, /* ..#.#... */ - 0x15, /* .#.#.#.. */ - 0x12, /* .#..#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 38, 0x26) */ - 0x08, /* ..#..... */ - 0x14, /* .#.#.... */ - 0x14, /* .#.#.... */ - 0x08, /* ..#..... */ - 0x15, /* .#.#.#.. */ - 0x12, /* .#..#... */ - 0x0D, /* ..##.#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 39, 0x27) */ - 0x06, /* ...##... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 40, 0x28) */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x04, /* ...#.... */ - 0x02, /* ....#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 41, 0x29) */ - 0x08, /* ..#..... */ - 0x04, /* ...#.... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 42, 0x2a) */ - 0x00, /* ........ */ - 0x11, /* .#...#.. */ - 0x0A, /* ..#.#... */ - 0x1F, /* .#####.. */ - 0x0A, /* ..#.#... */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 43, 0x2b) */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x1F, /* .#####.. */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 44, 0x2c) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x06, /* ...##... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 45, 0x2d) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 46, 0x2e) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 47, 0x2f) */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 48, 0x30) */ - 0x04, /* ...#.... */ - 0x0A, /* ..#.#... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 49, 0x31) */ - 0x04, /* ...#.... */ - 0x0C, /* ..##.... */ - 0x14, /* .#.#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 50, 0x32) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x01, /* .....#.. */ - 0x06, /* ...##... */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 51, 0x33) */ - 0x1F, /* .#####.. */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x06, /* ...##... */ - 0x01, /* .....#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 52, 0x34) */ - 0x02, /* ....#... */ - 0x06, /* ...##... */ - 0x0A, /* ..#.#... */ - 0x12, /* .#..#... */ - 0x1F, /* .#####.. */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 53, 0x35) */ - 0x1F, /* .#####.. */ - 0x10, /* .#...... */ - 0x16, /* .#.##... */ - 0x19, /* .##..#.. */ - 0x01, /* .....#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 54, 0x36) */ - 0x06, /* ...##... */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x16, /* .#.##... */ - 0x19, /* .##..#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 55, 0x37) */ - 0x1F, /* .#####.. */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 56, 0x38) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 57, 0x39) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x13, /* .#..##.. */ - 0x0D, /* ..##.#.. */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x0C, /* ..##.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 58, 0x3a) */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 59, 0x3b) */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x06, /* ...##... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 60, 0x3c) */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x04, /* ...#.... */ - 0x02, /* ....#... */ - 0x01, /* .....#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 61, 0x3d) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 62, 0x3e) */ - 0x10, /* .#...... */ - 0x08, /* ..#..... */ - 0x04, /* ...#.... */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 63, 0x3f) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 64, 0x40) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x13, /* .#..##.. */ - 0x15, /* .#.#.#.. */ - 0x16, /* .#.##... */ - 0x10, /* .#...... */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 65, 0x41) */ - 0x04, /* ...#.... */ - 0x0A, /* ..#.#... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x1F, /* .#####.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 66, 0x42) */ - 0x1E, /* .####... */ - 0x09, /* ..#..#.. */ - 0x09, /* ..#..#.. */ - 0x0E, /* ..###... */ - 0x09, /* ..#..#.. */ - 0x09, /* ..#..#.. */ - 0x1E, /* .####... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 67, 0x43) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 68, 0x44) */ - 0x1E, /* .####... */ - 0x09, /* ..#..#.. */ - 0x09, /* ..#..#.. */ - 0x09, /* ..#..#.. */ - 0x09, /* ..#..#.. */ - 0x09, /* ..#..#.. */ - 0x1E, /* .####... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 69, 0x45) */ - 0x1F, /* .#####.. */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x1E, /* .####... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 70, 0x46) */ - 0x1F, /* .#####.. */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x1E, /* .####... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 71, 0x47) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x13, /* .#..##.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 72, 0x48) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x1F, /* .#####.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 73, 0x49) */ - 0x0E, /* ..###... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 74, 0x4a) */ - 0x07, /* ...###.. */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 75, 0x4b) */ - 0x11, /* .#...#.. */ - 0x12, /* .#..#... */ - 0x14, /* .#.#.... */ - 0x18, /* .##..... */ - 0x14, /* .#.#.... */ - 0x12, /* .#..#... */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 76, 0x4c) */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 77, 0x4d) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x1B, /* .##.##.. */ - 0x15, /* .#.#.#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 78, 0x4e) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x19, /* .##..#.. */ - 0x15, /* .#.#.#.. */ - 0x13, /* .#..##.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 79, 0x4f) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 80, 0x50) */ - 0x1E, /* .####... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x1E, /* .####... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 81, 0x51) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x15, /* .#.#.#.. */ - 0x0E, /* ..###... */ - 0x01, /* .....#.. */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 82, 0x52) */ - 0x1E, /* .####... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x1E, /* .####... */ - 0x14, /* .#.#.... */ - 0x12, /* .#..#... */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 83, 0x53) */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x10, /* .#...... */ - 0x0E, /* ..###... */ - 0x01, /* .....#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 84, 0x54) */ - 0x1F, /* .#####.. */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 85, 0x55) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 86, 0x56) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 87, 0x57) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x15, /* .#.#.#.. */ - 0x15, /* .#.#.#.. */ - 0x1B, /* .##.##.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 88, 0x58) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x0A, /* ..#.#... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 89, 0x59) */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 90, 0x5a) */ - 0x1F, /* .#####.. */ - 0x01, /* .....#.. */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x10, /* .#...... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 91, 0x5b) */ - 0x0E, /* ..###... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 92, 0x5c) */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x08, /* ..#..... */ - 0x04, /* ...#.... */ - 0x02, /* ....#... */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 93, 0x5d) */ - 0x0E, /* ..###... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 94, 0x5e) */ - 0x04, /* ...#.... */ - 0x0A, /* ..#.#... */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 95, 0x5f) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 96, 0x60) */ - 0x0C, /* ..##.... */ - 0x04, /* ...#.... */ - 0x02, /* ....#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 97, 0x61) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x0E, /* ..###... */ - 0x01, /* .....#.. */ - 0x0F, /* ..####.. */ - 0x11, /* .#...#.. */ - 0x0F, /* ..####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 98, 0x62) */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x16, /* .#.##... */ - 0x19, /* .##..#.. */ - 0x11, /* .#...#.. */ - 0x19, /* .##..#.. */ - 0x16, /* .#.##... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 99, 0x63) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x10, /* .#...... */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 100, 0x64) */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - 0x0D, /* ..##.#.. */ - 0x13, /* .#..##.. */ - 0x11, /* .#...#.. */ - 0x13, /* .#..##.. */ - 0x0D, /* ..##.#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 101, 0x65) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x1F, /* .#####.. */ - 0x10, /* .#...... */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 102, 0x66) */ - 0x06, /* ...##... */ - 0x09, /* ..#..#.. */ - 0x08, /* ..#..... */ - 0x1E, /* .####... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 103, 0x67) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x0D, /* ..##.#.. */ - 0x12, /* .#..#... */ - 0x0C, /* ..##.... */ - 0x10, /* .#...... */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - - 0x00, /* ........ *//* (char = 104, 0x68) */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x16, /* .#.##... */ - 0x19, /* .##..#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 105, 0x69) */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x0C, /* ..##.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 106, 0x6a) */ - 0x02, /* ....#... */ - 0x00, /* ........ */ - 0x06, /* ...##... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x02, /* ....#... */ - 0x12, /* .#..#... */ - 0x12, /* .#..#... */ - 0x0C, /* ..##.... */ - - 0x00, /* ........ *//* (char = 107, 0x6b) */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x11, /* .#...#.. */ - 0x12, /* .#..#... */ - 0x1C, /* .###.... */ - 0x12, /* .#..#... */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 108, 0x6c) */ - 0x0C, /* ..##.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 109, 0x6d) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x1A, /* .##.#... */ - 0x15, /* .#.#.#.. */ - 0x15, /* .#.#.#.. */ - 0x15, /* .#.#.#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 110, 0x6e) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x16, /* .#.##... */ - 0x19, /* .##..#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 111, 0x6f) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x0E, /* ..###... */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 112, 0x70) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x16, /* .#.##... */ - 0x19, /* .##..#.. */ - 0x19, /* .##..#.. */ - 0x16, /* .#.##... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - - 0x00, /* ........ *//* (char = 113, 0x71) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x0D, /* ..##.#.. */ - 0x13, /* .#..##.. */ - 0x13, /* .#..##.. */ - 0x0D, /* ..##.#.. */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - 0x01, /* .....#.. */ - - 0x00, /* ........ *//* (char = 114, 0x72) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x16, /* .#.##... */ - 0x19, /* .##..#.. */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x10, /* .#...... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 115, 0x73) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x0E, /* ..###... */ - 0x10, /* .#...... */ - 0x0E, /* ..###... */ - 0x01, /* .....#.. */ - 0x1E, /* .####... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 116, 0x74) */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x1E, /* .####... */ - 0x08, /* ..#..... */ - 0x08, /* ..#..... */ - 0x09, /* ..#..#.. */ - 0x06, /* ...##... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 117, 0x75) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x13, /* .#..##.. */ - 0x0D, /* ..##.#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 118, 0x76) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x0A, /* ..#.#... */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 119, 0x77) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x15, /* .#.#.#.. */ - 0x15, /* .#.#.#.. */ - 0x0A, /* ..#.#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 120, 0x78) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x11, /* .#...#.. */ - 0x0A, /* ..#.#... */ - 0x04, /* ...#.... */ - 0x0A, /* ..#.#... */ - 0x11, /* .#...#.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 121, 0x79) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x11, /* .#...#.. */ - 0x11, /* .#...#.. */ - 0x13, /* .#..##.. */ - 0x0D, /* ..##.#.. */ - 0x01, /* .....#.. */ - 0x11, /* .#...#.. */ - 0x0E, /* ..###... */ - - 0x00, /* ........ *//* (char = 122, 0x7a) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x1F, /* .#####.. */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x1F, /* .#####.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 123, 0x7b) */ - 0x03, /* ....##.. */ - 0x04, /* ...#.... */ - 0x02, /* ....#... */ - 0x0C, /* ..##.... */ - 0x02, /* ....#... */ - 0x04, /* ...#.... */ - 0x03, /* ....##.. */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 124, 0x7c) */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x04, /* ...#.... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 125, 0x7d) */ - 0x18, /* .##..... */ - 0x04, /* ...#.... */ - 0x08, /* ..#..... */ - 0x06, /* ...##... */ - 0x08, /* ..#..... */ - 0x04, /* ...#.... */ - 0x18, /* .##..... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 126, 0x7e) */ - 0x09, /* ..#..#.. */ - 0x15, /* .#.#.#.. */ - 0x12, /* .#..#... */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - - 0x00, /* ........ *//* (char = 127, 0x7f) */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - 0x00, /* ........ */ - -}; diff --git a/sys/arch/mac68k/dev/adb.c b/sys/arch/mac68k/dev/adb.c index e83010937ed..50531807ce1 100644 --- a/sys/arch/mac68k/dev/adb.c +++ b/sys/arch/mac68k/dev/adb.c @@ -1,7 +1,7 @@ -/* $OpenBSD: adb.c,v 1.14 2005/11/21 18:16:37 millert Exp $ */ -/* $NetBSD: adb.c,v 1.13 1996/12/16 16:17:02 scottr Exp $ */ +/* $OpenBSD: adb.c,v 1.15 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: adb.c,v 1.47 2005/06/16 22:43:36 jmc Exp $ */ -/*- +/* * Copyright (C) 1994 Bradley A. Grantham * All rights reserved. * @@ -11,7 +11,7 @@ * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright -e* notice, this list of conditions and the following disclaimer in the + * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: @@ -34,531 +34,265 @@ e* notice, this list of conditions and the following disclaimer in the #include <sys/param.h> #include <sys/device.h> #include <sys/fcntl.h> -#include <sys/ioctl.h> -#include <sys/selinfo.h> #include <sys/poll.h> +#include <sys/selinfo.h> #include <sys/proc.h> #include <sys/signalvar.h> #include <sys/systm.h> -#include <sys/time.h> -#include <sys/timeout.h> #include <machine/autoconf.h> -#include <machine/keyboard.h> +#include <machine/cpu.h> -#include <arch/mac68k/mac68k/macrom.h> -#include <arch/mac68k/dev/adbvar.h> -#include <arch/mac68k/dev/itevar.h> +#include <mac68k/dev/adbvar.h> /* * Function declarations. */ -static int adbmatch(struct device *, void *, void *); -static void adbattach(struct device *, struct device *, void *); +int adbmatch(struct device *, void *, void *); +void adbattach(struct device *, struct device *, void *); +int adbprint(void *, const char *); +void adb_attach_deferred(void *); + +extern void adb_jadbproc(void); /* * Global variables. */ -int adb_polling = 0; /* Are we polling? (Debugger mode) */ +int adb_polling = 0; /* Are we polling? (Debugger mode) */ +#ifdef ADB_DEBUG +int adb_debug = 0; /* Output debugging messages */ +#endif /* ADB_DEBUG */ + +extern struct mac68k_machine_S mac68k_machine; +extern int adbHardware; +extern char *adbHardwareDescr[]; /* - * Local variables. + * Driver definition. */ - -/* External keyboard translation matrix */ -extern unsigned char keyboard[128][3]; - -/* Event queue definitions */ -#if !defined(ADB_MAX_EVENTS) -#define ADB_MAX_EVENTS 200 /* Maximum events to be kept in queue */ - /* maybe should be higher for slower macs? */ -#endif /* !defined(ADB_MAX_EVENTS) */ -static adb_event_t adb_evq[ADB_MAX_EVENTS]; /* ADB event queue */ -static int adb_evq_tail = 0; /* event queue tail */ -static int adb_evq_len = 0; /* event queue length */ - -/* ADB device state information */ -static int adb_isopen = 0; /* Are we queuing events for adb_read? */ -static struct selinfo adb_selinfo; /* select() info */ -static struct proc *adb_ioproc = NULL; /* process to wakeup */ - -/* Key repeat parameters */ -static int adb_rptdelay = 20; /* ticks before auto-repeat */ -static int adb_rptinterval = 6; /* ticks between auto-repeat */ -static int adb_repeating = -1; /* key that is auto-repeating */ -static adb_event_t adb_rptevent;/* event to auto-repeat */ - -/* Driver definition. -- This should probably be a bus... */ struct cfattach adb_ca = { sizeof(struct device), adbmatch, adbattach }; - struct cfdriver adb_cd = { NULL, "adb", DV_DULL }; -struct timeout repeat_timeout; - -static int -adbmatch(parent, vcf, aux) - struct device *parent; - void *vcf; - void *aux; +int +adbmatch(struct device *parent, void *vcf, void *aux) { - return 1; + static int adb_matched = 0; + + /* Allow only one instance. */ + if (adb_matched) + return (0); + + adb_matched = 1; + return (1); } -static void -adbattach(parent, dev, aux) - struct device *parent, *dev; - void *aux; +void +adbattach(struct device *parent, struct device *self, void *aux) { - printf(" (ADB event device)\n"); + printf("\n"); + startuphook_establish(adb_attach_deferred, self); } -void -adb_enqevent(event) - adb_event_t *event; +void +adb_attach_deferred(void *v) { - int s; + struct device *self = v; + ADBDataBlock adbdata; + struct adb_attach_args aa_args; + int totaladbs; + int adbindex, adbaddr; + + printf("%s", self->dv_xname); + adb_polling = 1; + +#ifdef MRG_ADB + if (!mrg_romready()) { + printf(": no ROM ADB driver in this kernel for this machine\n"); + return; + } - if (adb_evq_tail < 0 || adb_evq_tail >= ADB_MAX_EVENTS) - panic("adb: event queue tail is out of bounds"); +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: call mrg_initadbintr\n"); +#endif - if (adb_evq_len < 0 || adb_evq_len > ADB_MAX_EVENTS) - panic("adb: event queue len is out of bounds"); + mrg_initadbintr(); /* Mac ROM Glue okay to do ROM intr */ +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: returned from mrg_initadbintr\n"); +#endif - s = splhigh(); + /* ADBReInit pre/post-processing */ + JADBProc = adb_jadbproc; - if (adb_evq_len == ADB_MAX_EVENTS) { - splx(s); - return; /* Oh, well... */ - } - adb_evq[(adb_evq_len + adb_evq_tail) % ADB_MAX_EVENTS] = - *event; - adb_evq_len++; + /* Initialize ADB */ +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: calling ADBAlternateInit.\n"); +#endif - selwakeup(&adb_selinfo); - if (adb_ioproc) - psignal(adb_ioproc, SIGIO); + printf(": mrg"); + ADBAlternateInit(); +#else + ADBReInit(); + printf(": %s", adbHardwareDescr[adbHardware]); - splx(s); -} +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: done with ADBReInit\n"); +#endif -void -adb_handoff(event) - adb_event_t *event; -{ - if (adb_isopen && !adb_polling) { - adb_enqevent(event); - } else { - if (event->def_addr == 2) - ite_intr(event); - } -} +#endif /* MRG_ADB */ + totaladbs = CountADBs(); -void -adb_autorepeat(keyp) - void *keyp; -{ - int key = (int) keyp; + printf(", %d target%s\n", totaladbs, (totaladbs == 1) ? "" : "s"); - adb_rptevent.bytes[0] |= 0x80; - microtime(&adb_rptevent.timestamp); - adb_handoff(&adb_rptevent); /* do key up */ + /* for each ADB device */ + for (adbindex = 1; adbindex <= totaladbs; adbindex++) { + /* Get the ADB information */ + adbaddr = GetIndADB(&adbdata, adbindex); - adb_rptevent.bytes[0] &= 0x7f; - microtime(&adb_rptevent.timestamp); - adb_handoff(&adb_rptevent); /* do key down */ + aa_args.origaddr = (int)(adbdata.origADBAddr); + aa_args.adbaddr = adbaddr; + aa_args.handler_id = (int)(adbdata.devType); - if (adb_repeating == key) { - timeout_set(&repeat_timeout, adb_autorepeat, keyp); - timeout_add(&repeat_timeout, adb_rptinterval); + (void)config_found(self, &aa_args, adbprint); } + adb_polling = 0; } -void -adb_dokeyupdown(event) - adb_event_t *event; +int +adbprint(void *args, const char *name) { - int adb_key; - - if (event->def_addr == 2) { - adb_key = event->u.k.key & 0x7f; - if (!(event->u.k.key & 0x80) && - keyboard[event->u.k.key & 0x7f][0] != 0) { - /* ignore shift & control */ - if (adb_repeating != -1) { - timeout_del(&repeat_timeout); + struct adb_attach_args *aa_args = (struct adb_attach_args *)args; + int rv = UNCONF; + + if (name) { /* no configured device matched */ + rv = UNSUPP; /* most ADB device types are unsupported */ + + /* print out what kind of ADB device we have found */ + printf("%s addr %d: ", name, aa_args->adbaddr); + switch(aa_args->origaddr) { +#ifdef DIAGNOSTIC + case ADBADDR_SECURE: + printf("security dongle (%d)", + aa_args->handler_id); + break; +#endif + case ADBADDR_MAP: + printf("mapped device (%d)", + aa_args->handler_id); + rv = UNCONF; + break; + case ADBADDR_REL: + printf("relative positioning device (%d)", + aa_args->handler_id); + rv = UNCONF; + break; +#ifdef DIAGNOSTIC + case ADBADDR_ABS: + switch (aa_args->handler_id) { + case ADB_ARTPAD: + printf("WACOM ArtPad II"); + break; + default: + printf("absolute positioning device (%d)", + aa_args->handler_id); + break; } - adb_rptevent = *event; - adb_repeating = adb_key; - timeout_set(&repeat_timeout, adb_autorepeat, - (caddr_t)adb_key); - timeout_add(&repeat_timeout, adb_rptdelay); - } else { - if (adb_repeating != -1) { - adb_repeating = -1; - timeout_del(&repeat_timeout); + break; + case ADBADDR_DATATX: + printf("data transfer device (modem?) (%d)", + aa_args->handler_id); + break; + case ADBADDR_MISC: + switch (aa_args->handler_id) { + case ADB_POWERKEY: + printf("Sophisticated Circuits PowerKey"); + break; + default: + printf("misc. device (remote control?) (%d)", + aa_args->handler_id); + break; } - adb_rptevent = *event; - } - } - adb_handoff(event); -} - -static int adb_ms_buttons = 0; - -void -adb_keymaybemouse(event) - adb_event_t *event; -{ - static int optionkey_down = 0; - adb_event_t new_event; - - if (event->u.k.key == ADBK_KEYDOWN(ADBK_OPTION)) { - optionkey_down = 1; - } else if (event->u.k.key == ADBK_KEYUP(ADBK_OPTION)) { - /* key up */ - optionkey_down = 0; - if (adb_ms_buttons & 0xfe) { - adb_ms_buttons &= 1; - new_event.def_addr = ADBADDR_MS; - new_event.u.m.buttons = adb_ms_buttons; - new_event.u.m.dx = new_event.u.m.dy = 0; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - } - } else if (optionkey_down) { - if (event->u.k.key == ADBK_KEYDOWN(ADBK_LEFT)) { - adb_ms_buttons |= 2; /* middle down */ - new_event.def_addr = ADBADDR_MS; - new_event.u.m.buttons = adb_ms_buttons; - new_event.u.m.dx = new_event.u.m.dy = 0; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - } else if (event->u.k.key == ADBK_KEYUP(ADBK_LEFT)) { - adb_ms_buttons &= ~2; /* middle up */ - new_event.def_addr = ADBADDR_MS; - new_event.u.m.buttons = adb_ms_buttons; - new_event.u.m.dx = new_event.u.m.dy = 0; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - } else if (event->u.k.key == ADBK_KEYDOWN(ADBK_RIGHT)) { - adb_ms_buttons |= 4; /* right down */ - new_event.def_addr = ADBADDR_MS; - new_event.u.m.buttons = adb_ms_buttons; - new_event.u.m.dx = new_event.u.m.dy = 0; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - } else if (event->u.k.key == ADBK_KEYUP(ADBK_RIGHT)) { - adb_ms_buttons &= ~4; /* right up */ - new_event.def_addr = ADBADDR_MS; - new_event.u.m.buttons = adb_ms_buttons; - new_event.u.m.dx = new_event.u.m.dy = 0; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - } else if (ADBK_MODIFIER(event->u.k.key)) { - /* ctrl, shift, cmd */ - adb_dokeyupdown(event); - } else if (!(event->u.k.key & 0x80)) { - /* key down */ - new_event = *event; - - /* send option-down */ - new_event.u.k.key = ADBK_KEYDOWN(ADBK_OPTION); - new_event.bytes[0] = new_event.u.k.key; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - - /* send key-down */ - new_event.u.k.key = event->bytes[0]; - new_event.bytes[0] = new_event.u.k.key; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - - /* send key-up */ - new_event.u.k.key = - ADBK_KEYUP(ADBK_KEYVAL(event->bytes[0])); - microtime(&new_event.timestamp); - new_event.bytes[0] = new_event.u.k.key; - adb_dokeyupdown(&new_event); - - /* send option-up */ - new_event.u.k.key = ADBK_KEYUP(ADBK_OPTION); - new_event.bytes[0] = new_event.u.k.key; - microtime(&new_event.timestamp); - adb_dokeyupdown(&new_event); - } else { - /* option-keyup -- do nothing. */ - } - } else { - adb_dokeyupdown(event); - } -} - - -void -adb_processevent(event) - adb_event_t *event; -{ - adb_event_t new_event; - int i, button_bit, max_byte, mask, buttons; - - new_event = *event; - buttons = 0; - - switch (event->def_addr) { - case ADBADDR_KBD: - new_event.u.k.key = event->bytes[0]; - new_event.bytes[1] = 0xff; - adb_keymaybemouse(&new_event); - if (event->bytes[1] != 0xff) { - new_event.u.k.key = event->bytes[1]; - new_event.bytes[0] = event->bytes[1]; - new_event.bytes[1] = 0xff; - adb_keymaybemouse(&new_event); - } - break; - case ADBADDR_MS: - /* - * This should handle both plain ol' Apple mice and mice - * that claim to support the Extended Apple Mouse Protocol. - */ - max_byte = event->byte_count; - button_bit = 1; - switch (event->hand_id) { - case ADBMS_USPEED: - /* MicroSpeed mouse */ - if (max_byte == 4) - buttons = (~event->bytes[2]) & 0xff; - else - buttons = (event->bytes[0] & 0x80) ? 0 : 1; break; default: - /* Classic Mouse Protocol (up to 2 buttons) */ - for (i = 0; i < 2; i++, button_bit <<= 1) - /* 0 when button down */ - if (!(event->bytes[i] & 0x80)) - buttons |= button_bit; - else - buttons &= ~button_bit; - /* Extended Protocol (up to 6 more buttons) */ - for (mask = 0x80; i < max_byte; - i += (mask == 0x80), button_bit <<= 1) { - /* 0 when button down */ - if (!(event->bytes[i] & mask)) - buttons |= button_bit; - else - buttons &= ~button_bit; - mask = ((mask >> 4) & 0xf) - | ((mask & 0xf) << 4); - } + printf("unknown type device, (handler %d)", + aa_args->handler_id); break; +#endif /* DIAGNOSTIC */ } - new_event.u.m.buttons = adb_ms_buttons | buttons; - new_event.u.m.dx = ((signed int) (event->bytes[1] & 0x3f)) - - ((event->bytes[1] & 0x40) ? 64 : 0); - new_event.u.m.dy = ((signed int) (event->bytes[0] & 0x3f)) - - ((event->bytes[0] & 0x40) ? 64 : 0); - adb_dokeyupdown(&new_event); - break; - default: /* God only knows. */ - adb_dokeyupdown(event); - } -} + } else /* a device matched and was configured */ + printf(" addr %d: ", aa_args->adbaddr); - -int -adbopen(dev, flag, mode, p) - dev_t dev; - int flag, mode; - struct proc *p; -{ - register int unit; - int error = 0; - int s; - - unit = minor(dev); - if (unit != 0) - return (ENXIO); - - s = splhigh(); - if (adb_isopen) { - splx(s); - return (EBUSY); - } - splx(s); - adb_evq_tail = 0; - adb_evq_len = 0; - adb_isopen = 1; - adb_ioproc = p; - - return (error); -} - - -int -adbclose(dev, flag, mode, p) - dev_t dev; - int flag, mode; - struct proc *p; -{ - adb_isopen = 0; - adb_ioproc = NULL; - return (0); -} - - -int -adbread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; -{ - int s, error; - int willfit; - int total; - int firstmove; - int moremove; - - if (uio->uio_resid < sizeof(adb_event_t)) - return (EMSGSIZE); /* close enough. */ - - s = splhigh(); - if (adb_evq_len == 0) { - splx(s); - return (0); - } - willfit = howmany(uio->uio_resid, sizeof(adb_event_t)); - total = (adb_evq_len < willfit) ? adb_evq_len : willfit; - - firstmove = (adb_evq_tail + total > ADB_MAX_EVENTS) - ? (ADB_MAX_EVENTS - adb_evq_tail) : total; - - error = uiomove((caddr_t) & adb_evq[adb_evq_tail], - firstmove * sizeof(adb_event_t), uio); - if (error) { - splx(s); - return (error); - } - moremove = total - firstmove; - - if (moremove > 0) { - error = uiomove((caddr_t) & adb_evq[0], - moremove * sizeof(adb_event_t), uio); - if (error) { - splx(s); - return (error); - } - } - adb_evq_tail = (adb_evq_tail + total) % ADB_MAX_EVENTS; - adb_evq_len -= total; - splx(s); - return (0); -} - - -int -adbwrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; -{ - return 0; + return (rv); } -int -adbioctl(dev, cmd, data, flag, p) - dev_t dev; - int cmd; - caddr_t data; - int flag; - struct proc *p; +/* + * adb_op_sync + * + * This routine does exactly what the adb_op routine does, except that after + * the adb_op is called, it waits until the return value is present before + * returning. + * + * NOTE: The user specified compRout is ignored, since this routine specifies + * it's own to adb_op, which is why you really called this in the first place + * anyway. + */ +int +adb_op_sync(Ptr buffer, Ptr compRout, Ptr data, short command) { - switch (cmd) { - case ADBIOC_DEVSINFO: { - adb_devinfo_t *di; - ADBDataBlock adbdata; - int totaldevs; - int adbaddr; - int i; - - di = (void *) data; - - /* Initialize to no devices */ - for (i = 0; i < 16; i++) - di->dev[i].addr = -1; - - totaldevs = CountADBs(); - for (i = 1; i <= totaldevs; i++) { - adbaddr = GetIndADB(&adbdata, i); - di->dev[adbaddr].addr = adbaddr; - di->dev[adbaddr].default_addr = adbdata.origADBAddr; - di->dev[adbaddr].handler_id = adbdata.devType; - } - - /* Must call ADB Manager to get devices now */ - break; - } - - case ADBIOC_GETREPEAT:{ - adb_rptinfo_t *ri; - - ri = (void *) data; - ri->delay_ticks = adb_rptdelay; - ri->interval_ticks = adb_rptinterval; - break; - } - - case ADBIOC_SETREPEAT:{ - adb_rptinfo_t *ri; - - ri = (void *) data; - adb_rptdelay = ri->delay_ticks; - adb_rptinterval = ri->interval_ticks; - break; - } + int tmout; + int result; + volatile int flag = 0; - case ADBIOC_RESET: - adb_init(); - break; - - case ADBIOC_LISTENCMD:{ - adb_listencmd_t *lc; + result = ADBOp(buffer, (void *)adb_op_comprout, (Ptr)&flag, + command); /* send command */ + if (result == 0) { /* send ok? */ + /* + * Total time to wait is calculated as follows: + * - Tlt (stop to start time): 260 usec + * - start bit: 100 usec + * - up to 8 data bytes: 64 * 100 usec = 6400 usec + * - stop bit (with SRQ): 140 usec + * Total: 6900 usec + * + * This is the total time allowed by the specification. Any + * device that doesn't conform to this will fail to operate + * properly on some Apple systems. In spite of this we + * double the time to wait; some Cuda-based apparently + * queues some commands and allows the main CPU to continue + * processing (radical concept, eh?). To be safe, allow + * time for two complete ADB transactions to occur. + */ + for (tmout = 13800; !flag && tmout >= 10; tmout -= 10) + delay(10); + if (!flag && tmout > 0) + delay(tmout); - lc = (void *) data; + if (!flag) + result = -2; } - default: - return (EINVAL); - } - return (0); + return result; } -int -adbpoll(dev, events, p) - dev_t dev; - int events; - struct proc *p; +/* + * adb_op_comprout + * + * This function is used by the adb_op_sync routine so it knows when the + * function is done. + */ +void +adb_op_comprout(void) { - int revents = 0; - - if (events & (POLLIN | POLLRDNORM)) { - /* succeed if there is something to read */ - if (adb_evq_len > 0) - revents |= events & (POLLIN | POLLRDNORM); - else - selrecord(p, &adb_selinfo); - } - if (events & (POLLOUT | POLLWRNORM)) { - /* always fails => never blocks */ - revents |= events & (POLLOUT | POLLWRNORM); - } - - return (revents); + asm("movw #1,a2@ | update flag value"); } diff --git a/sys/arch/mac68k/dev/adb_direct.c b/sys/arch/mac68k/dev/adb_direct.c index f6f747ca974..70bb750fe58 100644 --- a/sys/arch/mac68k/dev/adb_direct.c +++ b/sys/arch/mac68k/dev/adb_direct.c @@ -1,7 +1,7 @@ -/* $OpenBSD: adb_direct.c,v 1.15 2004/11/26 21:21:23 miod Exp $ */ -/* $NetBSD: adb_direct.c,v 1.5 1997/04/21 18:04:28 scottr Exp $ */ +/* $OpenBSD: adb_direct.c,v 1.16 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: adb_direct.c,v 1.51 2005/06/16 22:43:36 jmc Exp $ */ -/* From: adb_direct.c 2.02 4/18/97 jpw */ +/* From: adb_direct.c 2.02 4/18/97 jpw */ /* * Copyright (C) 1996, 1997 John P. Wittkoski @@ -33,38 +33,58 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* This code is rather messy, but I don't have time right now +/* + * This code is rather messy, but I don't have time right now * to clean it up as much as I would like. - * But it works, so I'm happy. :-) jpw */ + * But it works, so I'm happy. :-) jpw + */ + +/* + * TO DO: + * - We could reduce the time spent in the adb_intr_* routines + * by having them save the incoming and outgoing data directly + * in the adbInbound and adbOutbound queues, as it would reduce + * the number of times we need to copy the data around. It + * would also make the code more readable and easier to follow. + * - (Related to above) Use the header part of adbCommand to + * reduce the number of copies we have to do of the data. + * - (Related to above) Actually implement the adbOutbound queue. + * This is fairly easy once you switch all the intr routines + * over to using adbCommand structs directly. + * - There is a bug in the state machine of adb_intr_cuda + * code that causes hangs, especially on 030 machines, probably + * because of some timing issues. Because I have been unable to + * determine the exact cause of this bug, I used the timeout function + * to check for and recover from this condition. If anyone finds + * the actual cause of this bug, the calls to timeout and the + * adb_cuda_tickle routine can be removed. + */ #if defined(__NetBSD__) || defined(__OpenBSD__) #include <sys/param.h> #include <sys/cdefs.h> +#include <sys/pool.h> +#include <sys/queue.h> #include <sys/systm.h> +#include <sys/timeout.h> #include <machine/viareg.h> #include <machine/param.h> #include <machine/cpu.h> -#include <machine/adbsys.h> /* required for adbvar.h */ - -#include <arch/mac68k/mac68k/macrom.h> -#include "adbvar.h" +#include <mac68k/dev/adbvar.h> #define printf_intr printf -#else +#else /* !__NetBSD__, i.e. Mac OS */ #include "via.h" /* for macos based testing */ -typedef unsigned char u_char; -#endif - - -#ifdef MRG_ADB -int adb_poweroff(void); -int adb_read_date_time(unsigned long *t); -int adb_set_date_time(unsigned long t); -#endif +/* #define ADB_DEBUG */ /* more verbose for testing */ -/* more verbose for testing */ -/*#define DEBUG*/ +/* Types of ADB hardware that we support */ +#define ADB_HW_UNKNOWN 0x0 /* don't know */ +#define ADB_HW_II 0x1 /* Mac II series */ +#define ADB_HW_IISI 0x2 /* Mac IIsi series */ +#define ADB_HW_PB 0x3 /* PowerBook series */ +#define ADB_HW_CUDA 0x4 /* Machines with a Cuda chip */ +#endif /* __NetBSD__ */ /* some misc. leftovers */ #define vPB 0x0000 @@ -74,31 +94,25 @@ int adb_set_date_time(unsigned long t); #define vSR_INT 0x04 #define vSR_OUT 0x10 -/* types of adb hardware that we (will eventually) support */ -#define ADB_HW_UNKNOWN 0x01 /* don't know */ -#define ADB_HW_II 0x02 /* Mac II series */ -#define ADB_HW_IISI 0x03 /* Mac IIsi series */ -#define ADB_HW_PB 0x04 /* PowerBook series */ -#define ADB_HW_CUDA 0x05 /* Machines with a Cuda chip */ - /* the type of ADB action that we are currently preforming */ -#define ADB_ACTION_NOTREADY 0x01 /* has not been initialized yet */ -#define ADB_ACTION_IDLE 0x02 /* the bus is currently idle */ -#define ADB_ACTION_OUT 0x03 /* sending out a command */ -#define ADB_ACTION_IN 0x04 /* receiving data */ +#define ADB_ACTION_NOTREADY 0x1 /* has not been initialized yet */ +#define ADB_ACTION_IDLE 0x2 /* the bus is currently idle */ +#define ADB_ACTION_OUT 0x3 /* sending out a command */ +#define ADB_ACTION_IN 0x4 /* receiving data */ +#define ADB_ACTION_POLLING 0x5 /* polling - II only */ /* * These describe the state of the ADB bus itself, although they * don't necessarily correspond directly to ADB states. * Note: these are not really used in the IIsi code. */ -#define ADB_BUS_UNKNOWN 0x01 /* we don't know yet - all models */ -#define ADB_BUS_IDLE 0x02 /* bus is idle - all models */ -#define ADB_BUS_CMD 0x03 /* starting a command - II models */ -#define ADB_BUS_ODD 0x04 /* the "odd" state - II models */ -#define ADB_BUS_EVEN 0x05 /* the "even" state - II models */ -#define ADB_BUS_ACTIVE 0x06 /* active state - IIsi models */ -#define ADB_BUS_ACK 0x07 /* currently ACKing - IIsi models */ +#define ADB_BUS_UNKNOWN 0x1 /* we don't know yet - all models */ +#define ADB_BUS_IDLE 0x2 /* bus is idle - all models */ +#define ADB_BUS_CMD 0x3 /* starting a command - II models */ +#define ADB_BUS_ODD 0x4 /* the "odd" state - II models */ +#define ADB_BUS_EVEN 0x5 /* the "even" state - II models */ +#define ADB_BUS_ACTIVE 0x6 /* active state - IIsi models */ +#define ADB_BUS_ACK 0x7 /* currently ACKing - IIsi models */ /* * Shortcuts for setting or testing the VIA bit states. @@ -111,7 +125,7 @@ int adb_set_date_time(unsigned long t); #define ADB_SET_STATE_EVEN() via_reg(VIA1, vBufB) = ((via_reg(VIA1, \ vBufB) | vPB4) & ~vPB5) #define ADB_SET_STATE_ODD() via_reg(VIA1, vBufB) = ((via_reg(VIA1, \ - vBufB) | vPB5) & ~vPB4 ) + vBufB) | vPB5) & ~vPB4) #define ADB_SET_STATE_ACTIVE() via_reg(VIA1, vBufB) |= vPB5 #define ADB_SET_STATE_INACTIVE() via_reg(VIA1, vBufB) &= ~vPB5 #define ADB_SET_STATE_TIP() via_reg(VIA1, vBufB) &= ~vPB5 @@ -144,7 +158,11 @@ int adb_set_date_time(unsigned long t); * Maximum ADB message length; includes space for data, result, and * device code - plus a little for safety. */ -#define MAX_ADB_MSG_LENGTH 20 +#define ADB_MAX_MSG_LENGTH 16 +#define ADB_MAX_HDR_LENGTH 8 + +#define ADB_QUEUE 32 +#define ADB_TICKLE_TICKS 4 /* * A structure for storing information about each ADB device. @@ -152,22 +170,49 @@ int adb_set_date_time(unsigned long t); struct ADBDevEntry { void (*ServiceRtPtr)(void); void *DataAreaAddr; - char devType; - char origAddr; - char currentAddr; + int devType; + int origAddr; + int currentAddr; }; /* * Used to hold ADB commands that are waiting to be sent out. */ struct adbCmdHoldEntry { - u_char outBuf[MAX_ADB_MSG_LENGTH]; /* our message */ + u_char outBuf[ADB_MAX_MSG_LENGTH]; /* our message */ u_char *saveBuf; /* buffer to know where to save result */ u_char *compRout; /* completion routine pointer */ u_char *data; /* completion routine data pointer */ }; /* + * Eventually used for two separate queues, the queue between + * the upper and lower halves, and the outgoing packet queue. + * TO DO: adbCommand can replace all of adbCmdHoldEntry eventually + */ +struct adbCommand { + u_char header[ADB_MAX_HDR_LENGTH]; /* not used yet */ + u_char data[ADB_MAX_MSG_LENGTH]; /* packet data only */ + u_char *saveBuf; /* where to save result */ + u_char *compRout; /* completion routine pointer */ + u_char *compData; /* completion routine data pointer */ + u_int cmd; /* the original command for this data */ + u_int unsol; /* 1 if packet was unsolicited */ + u_int ack_only; /* 1 for no special processing */ +}; + +/* + * Text representations of each hardware class + */ +const char *adbHardwareDescr[MAX_ADB_HW + 1] = { + "unknown", + "II series", + "IIsi series", + "PowerBook", + "Cuda", +}; + +/* * A few variables that we need and their initial values. */ int adbHardware = ADB_HW_UNKNOWN; @@ -177,11 +222,12 @@ int adbWaiting = 0; /* waiting for return data from the device */ int adbWriteDelay = 0; /* working on (or waiting to do) a write */ int adbOutQueueHasData = 0; /* something in the queue waiting to go out */ int adbNextEnd = 0; /* the next incoming bute is the last (II) */ +int adbSoftPower = 0; /* machine supports soft power */ int adbWaitingCmd = 0; /* ADB command we are waiting for */ -u_char *adbBuffer = (long) 0; /* pointer to user data area */ -void *adbCompRout = (long) 0; /* pointer to the completion routine */ -void *adbCompData = (long) 0; /* pointer to the completion routine data */ +u_char *adbBuffer = (long)0; /* pointer to user data area */ +void *adbCompRout = (long)0; /* pointer to the completion routine */ +void *adbCompData = (long)0; /* pointer to the completion routine data */ long adbFakeInts = 0; /* keeps track of fake ADB interrupts for * timeouts (II) */ int adbStarting = 1; /* doing ADBReInit so do polling differently */ @@ -190,8 +236,8 @@ int adbSendTalk = 0; /* the intr routine is sending the talk, not int adbPolling = 0; /* we are polling for service request */ int adbPollCmd = 0; /* the last poll command we sent */ -u_char adbInputBuffer[MAX_ADB_MSG_LENGTH]; /* data input buffer */ -u_char adbOutputBuffer[MAX_ADB_MSG_LENGTH]; /* data output buffer */ +u_char adbInputBuffer[ADB_MAX_MSG_LENGTH]; /* data input buffer */ +u_char adbOutputBuffer[ADB_MAX_MSG_LENGTH]; /* data output buffer */ struct adbCmdHoldEntry adbOutQueue; /* our 1 entry output queue */ int adbSentChars = 0; /* how many characters we have sent */ @@ -199,30 +245,50 @@ int adbLastDevice = 0; /* last ADB dev we heard from (II ONLY) */ int adbLastDevIndex = 0; /* last ADB dev loc in dev table (II ONLY) */ int adbLastCommand = 0; /* the last ADB command we sent (II) */ -struct ADBDevEntry ADBDevTable[16]; /* our ADB device table */ +struct ADBDevEntry ADBDevTable[16]; /* our ADB device table */ int ADBNumDevices; /* num. of ADB devices found with ADBReInit */ +struct adbCommand adbInbound[ADB_QUEUE]; /* incoming queue */ +volatile int adbInCount = 0; /* how many packets in in queue */ +int adbInHead = 0; /* head of in queue */ +int adbInTail = 0; /* tail of in queue */ +struct adbCommand adbOutbound[ADB_QUEUE]; /* outgoing queue - not used yet */ +int adbOutCount = 0; /* how many packets in out queue */ +int adbOutHead = 0; /* head of out queue */ +int adbOutTail = 0; /* tail of out queue */ + +int tickle_count = 0; /* how many tickles seen for this packet? */ +int tickle_serial = 0; /* the last packet tickled */ +int adb_cuda_serial = 0; /* the current packet */ + +struct timeout adb_cuda_timeout; + extern struct mac68k_machine_S mac68k_machine; void pm_setup_adb(void); +void pm_hw_setup(void); void pm_check_adb_devices(int); -void pm_intr(void); +void pm_intr(void *); int pm_adb_op(u_char *, void *, void *, int); void pm_init_adb_device(void); /* * The following are private routines. */ +#ifdef ADB_DEBUG void print_single(u_char *); -void adb_intr(void); -void adb_intr_II(void); -void adb_intr_IIsi(void); -void adb_intr_cuda(void); +#endif +int adb_intr(void *); +int adb_intr_II(void *); +int adb_intr_IIsi(void *); +int adb_intr_cuda(void *); +void adb_soft_intr(void); int send_adb_II(u_char *, u_char *, void *, void *, int); int send_adb_IIsi(u_char *, u_char *, void *, void *, int); int send_adb_cuda(u_char *, u_char *, void *, void *, int); void adb_intr_cuda_test(void); -void adb_handle_unsol(u_char *); +void adb_cuda_tickle(void); +void adb_pass_up(struct adbCommand *); void adb_op_comprout(void); void adb_reinit(void); int count_adbs(void); @@ -231,11 +297,9 @@ int get_adb_info(ADBDataBlock *, int); int set_adb_info(ADBSetInfoBlock *, int); void adb_setup_hw_type(void); int adb_op(Ptr, Ptr, Ptr, short); -void adb_handle_unsol(u_char *); -int adb_op_sync(Ptr, Ptr, Ptr, short); void adb_read_II(u_char *); -void adb_cleanup(u_char *); -void adb_cleanup_IIsi(u_char *); +void adb_hw_setup(void); +void adb_hw_setup_IIsi(u_char *); void adb_comp_exec(void); int adb_cmd_result(u_char *); int adb_cmd_extra(u_char *); @@ -245,6 +309,7 @@ int adb_prog_switch_disable(void); /* we should create this and it will be the public version */ int send_adb(u_char *, void *, void *); +#ifdef ADB_DEBUG /* * print_single * Diagnostic display routine. Displays the hex values of the @@ -252,64 +317,97 @@ int send_adb(u_char *, void *, void *); * is in [0]. */ void -print_single(thestring) - u_char *thestring; +print_single(u_char *str) { int x; - if ((int) (thestring[0]) == 0) { - printf_intr("nothing returned\n"); + if (str == 0) { + printf_intr("no data - null pointer\n"); return; } - if (thestring == 0) { - printf_intr("no data - null pointer\n"); + if (*str == 0) { + printf_intr("nothing returned\n"); return; } - if (thestring[0] > 20) { + if (*str > 20) { printf_intr("ADB: ACK > 20 no way!\n"); - thestring[0] = 20; + *str = (u_char)20; } - printf_intr("(length=0x%x):", thestring[0]); - for (x = 0; x < thestring[0]; x++) - printf_intr(" 0x%02x", thestring[x + 1]); + printf_intr("(length=0x%x):", (u_int)*str); + for (x = 1; x <= *str; x++) + printf_intr(" 0x%02x", (u_int)*(str + x)); printf_intr("\n"); } +#endif + +void +adb_cuda_tickle(void) +{ + volatile int s; + + if (adbActionState == ADB_ACTION_IN) { + if (tickle_serial == adb_cuda_serial) { + if (++tickle_count > 0) { + s = splhigh(); + adbActionState = ADB_ACTION_IDLE; + adbInputBuffer[0] = 0; + ADB_SET_STATE_IDLE_CUDA(); + splx(s); + } + } else { + tickle_serial = adb_cuda_serial; + tickle_count = 0; + } + } else { + tickle_serial = adb_cuda_serial; + tickle_count = 0; + } + timeout_add(&adb_cuda_timeout, ADB_TICKLE_TICKS); +} /* * called when when an adb interrupt happens * * Cuda version of adb_intr - * TO DO: do we want to add some zshard calls in here? + * TO DO: do we want to add some calls to intr_dispatch() here to + * grab serial interrupts? */ -void -adb_intr_cuda(void) +int +adb_intr_cuda(void *arg) { - int i, ending, len; - unsigned int s; + volatile int i, ending; + volatile unsigned int s; + struct adbCommand packet; s = splhigh(); /* can't be too careful - might be called */ /* from a routine, NOT an interrupt */ ADB_VIA_CLR_INTR(); /* clear interrupt */ - ADB_VIA_INTR_DISABLE(); /* disable ADB interrupt on IIs. */ switch_start: switch (adbActionState) { case ADB_ACTION_IDLE: - /* This is an unexpected packet, so grab the first (dummy) + /* + * This is an unexpected packet, so grab the first (dummy) * byte, set up the proper vars, and tell the chip we are - * starting to receive the packet by setting the TIP bit. */ + * starting to receive the packet by setting the TIP bit. + */ adbInputBuffer[1] = ADB_SR(); - ADB_SET_STATE_TIP(); + adb_cuda_serial++; + if (ADB_INTR_IS_OFF) /* must have been a fake start */ + break; + ADB_SET_SR_INPUT(); - delay(ADB_DELAY); /* required delay */ -#ifdef DEBUG - printf_intr("idle 0x%02x ", adbInputBuffer[1]); -#endif + ADB_SET_STATE_TIP(); + adbInputBuffer[0] = 1; adbActionState = ADB_ACTION_IN; +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("idle 0x%02x ", adbInputBuffer[1]); +#endif break; case ADB_ACTION_IN: @@ -320,72 +418,54 @@ switch_start: else ending = 0; - /* if the second byte is 0xff, it's a "dummy" packet */ - if (adbInputBuffer[2] == 0xff) - ending = 1; - if (1 == ending) { /* end of message? */ -#ifdef DEBUG - printf_intr("in end 0x%02x ", - adbInputBuffer[adbInputBuffer[0]]); - print_single(adbInputBuffer); +#ifdef ADB_DEBUG + if (adb_debug) { + printf_intr("in end 0x%02x ", + adbInputBuffer[adbInputBuffer[0]]); + print_single(adbInputBuffer); + } #endif - /* Are we waiting AND does this packet match what we + /* + * Are we waiting AND does this packet match what we * are waiting for AND is it coming from either the * ADB or RTC/PRAM sub-device? This section _should_ * recognize all ADB and RTC/PRAM type commands, but * there may be more... NOTE: commands are always at - * [4], even for RTC/PRAM commands. */ + * [4], even for RTC/PRAM commands. + */ + /* set up data for adb_pass_up */ + memcpy(packet.data, adbInputBuffer, adbInputBuffer[0] + 1); + if ((adbWaiting == 1) && (adbInputBuffer[4] == adbWaitingCmd) && ((adbInputBuffer[2] == 0x00) || (adbInputBuffer[2] == 0x01))) { + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.unsol = 0; + packet.ack_only = 0; + adb_pass_up(&packet); - if (adbBuffer != (long) 0) { - /* if valid return data pointer */ - /* get return length minus extras */ - len = adbInputBuffer[0] - 4; - /* - * If adb_op is ever made to be called - * from a user routine, we should use - * a copyout or copyin here to be sure - * we're in the correct context - */ - for (i = 1; i <= len; i++) - adbBuffer[i] = adbInputBuffer[4 + i]; - if (len < 0) - len = 0; - adbBuffer[0] = len; - } - /* call completion routine and clean up */ - adb_comp_exec(); - adbWaitingCmd = 0; + adbWaitingCmd = 0; /* reset "waiting" vars */ adbWaiting = 0; - adbBuffer = (long) 0; - adbCompRout = (long) 0; - adbCompData = (long) 0; + adbBuffer = (long)0; + adbCompRout = (long)0; + adbCompData = (long)0; } else { - /* - * This was an unsolicited packet, so - * pass the data off to the handler for - * this device if we are NOT doing this - * during a ADBReInit. - * This section IGNORES all data that is not - * from the ADB sub-device. That is, not from - * RTC or PRAM. Maybe we should fix later, - * but do the other devices every send things - * without being asked? - */ - if (adbStarting == 0) - if (adbInputBuffer[2] == 0x00) - adb_handle_unsol(adbInputBuffer); + packet.unsol = 1; + packet.ack_only = 0; + adb_pass_up(&packet); } + /* reset vars and signal the end of this frame */ adbActionState = ADB_ACTION_IDLE; adbInputBuffer[0] = 0; ADB_SET_STATE_IDLE_CUDA(); + /*ADB_SET_SR_INPUT();*/ /* * If there is something waiting to be sent out, @@ -395,9 +475,6 @@ switch_start: delay(ADB_DELAY); /* required */ adbSentChars = 0; adbActionState = ADB_ACTION_OUT; - -/* TO DO: don't we need to set up adbWaiting vars here??? */ - /* * If the interrupt is on, we were too slow * and the chip has already started to send @@ -405,8 +482,8 @@ switch_start: * and start a read cycle. */ if (ADB_INTR_IS_ON) { - ADB_SET_STATE_IDLE_CUDA(); ADB_SET_SR_INPUT(); + ADB_SET_STATE_IDLE_CUDA(); adbSentChars = 0; adbActionState = ADB_ACTION_IDLE; adbInputBuffer[0] = 0; @@ -417,33 +494,35 @@ switch_start: * so load the first byte and tell the chip * we want to send. */ + ADB_SET_STATE_TIP(); ADB_SET_SR_OUTPUT(); ADB_SR() = adbOutputBuffer[adbSentChars + 1]; - ADB_SET_STATE_TIP(); } } else { ADB_TOGGLE_STATE_ACK_CUDA(); -#ifdef DEBUG - printf_intr("in 0x%02x ", - adbInputBuffer[adbInputBuffer[0]]); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("in 0x%02x ", + adbInputBuffer[adbInputBuffer[0]]); #endif } break; case ADB_ACTION_OUT: i = ADB_SR(); /* reset SR-intr in IFR */ -#ifdef DEBUG - printf_intr("intr out 0x%02x ", i); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("intr out 0x%02x ", i); #endif - ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ adbSentChars++; if (ADB_INTR_IS_ON) { /* ADB intr low during write */ -#ifdef DEBUG - printf_intr("intr was on "); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("intr was on "); #endif - ADB_SET_STATE_IDLE_CUDA(); ADB_SET_SR_INPUT(); /* make sure SR is set to IN */ + ADB_SET_STATE_IDLE_CUDA(); adbSentChars = 0; /* must start all over */ adbActionState = ADB_ACTION_IDLE; /* new state */ adbInputBuffer[0] = 0; @@ -459,63 +538,82 @@ switch_start: * back? */ adbWaiting = 1; /* signal waiting for return */ adbWaitingCmd = adbOutputBuffer[2]; /* save waiting command */ - } else {/* no talk, so done */ - adb_comp_exec(); /* call completion - * routine */ - adbWaitingCmd = 0; /* reset "waiting" vars, - * just in case */ - adbBuffer = (long) 0; - adbCompRout = (long) 0; - adbCompData = (long) 0; + } else { /* no talk, so done */ + /* set up stuff for adb_pass_up */ + memcpy(packet.data, adbInputBuffer, adbInputBuffer[0] + 1); + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.cmd = adbWaitingCmd; + packet.unsol = 0; + packet.ack_only = 1; + adb_pass_up(&packet); + + /* reset "waiting" vars, just in case */ + adbWaitingCmd = 0; + adbBuffer = (long)0; + adbCompRout = (long)0; + adbCompData = (long)0; } adbWriteDelay = 0; /* done writing */ adbActionState = ADB_ACTION_IDLE; /* signal bus is idle */ + ADB_SET_SR_INPUT(); ADB_SET_STATE_IDLE_CUDA(); -#ifdef DEBUG - printf_intr("write done "); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("write done "); #endif } else { ADB_SR() = adbOutputBuffer[adbSentChars + 1]; /* send next byte */ ADB_TOGGLE_STATE_ACK_CUDA(); /* signal byte ready to * shift */ -#ifdef DEBUG - printf_intr("toggle "); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("toggle "); #endif } break; case ADB_ACTION_NOTREADY: - printf_intr("adb: not yet initialized\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: not yet initialized\n"); +#endif break; default: - printf_intr("intr: unknown ADB state\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("intr: unknown ADB state\n"); +#endif + break; } ADB_VIA_INTR_ENABLE(); /* enable ADB interrupt on IIs. */ splx(s); /* restore */ - return; -} /* end adb_intr_IIsi */ + return (1); +} /* end adb_intr_cuda */ int -send_adb_cuda(u_char * in, u_char * buffer, void *compRout, void *data, int +send_adb_cuda(u_char *in, u_char *buffer, void *compRout, void *data, int command) { - int i, s, len; + int s, len; -#ifdef DEBUG - printf_intr("SEND\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("SEND\n"); #endif if (adbActionState == ADB_ACTION_NOTREADY) return 1; - s = splhigh(); /* don't interrupt while we are messing with - * the ADB */ + /* Don't interrupt while we are messing with the ADB */ + s = splhigh(); if ((adbActionState == ADB_ACTION_IDLE) && /* ADB available? */ (ADB_INTR_IS_OFF)) { /* and no incoming interrupt? */ @@ -528,13 +626,16 @@ send_adb_cuda(u_char * in, u_char * buffer, void *compRout, void *data, int return 1; /* really busy! */ } -#ifdef DEBUG - printf_intr("QUEUE\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("QUEUE\n"); #endif - if ((long) in == (long) 0) { /* need to convert? */ - /* don't need to use adb_cmd_extra here because this section - * will be called */ - /* ONLY when it is an ADB command (no RTC or PRAM) */ + if ((long)in == (long)0) { /* need to convert? */ + /* + * Don't need to use adb_cmd_extra here because this section + * will be called ONLY when it is an ADB command (no RTC or + * PRAM) + */ if ((command & 0x0c) == 0x08) /* copy addl data ONLY if * doing a listen! */ len = buffer[0]; /* length of additional data */ @@ -544,14 +645,13 @@ send_adb_cuda(u_char * in, u_char * buffer, void *compRout, void *data, int adbOutputBuffer[0] = 2 + len; /* dev. type + command + addl. * data */ adbOutputBuffer[1] = 0x00; /* mark as an ADB command */ - adbOutputBuffer[2] = (u_char) command; /* load command */ + adbOutputBuffer[2] = (u_char)command; /* load command */ - for (i = 1; i <= len; i++) /* copy additional output - * data, if any */ - adbOutputBuffer[2 + i] = buffer[i]; + /* copy additional output data, if any */ + memcpy(adbOutputBuffer + 3, buffer + 1, len); } else - for (i = 0; i <= (adbOutputBuffer[0] + 1); i++) - adbOutputBuffer[i] = in[i]; + /* if data ready, just copy over */ + memcpy(adbOutputBuffer, in, in[0] + 2); adbSentChars = 0; /* nothing sent yet */ adbBuffer = buffer; /* save buffer to know where to save result */ @@ -560,8 +660,9 @@ send_adb_cuda(u_char * in, u_char * buffer, void *compRout, void *data, int adbWaitingCmd = adbOutputBuffer[2]; /* save wait command */ if (adbWriteDelay != 1) { /* start command now? */ -#ifdef DEBUG - printf_intr("out start NOW"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("out start NOW"); #endif delay(ADB_DELAY); adbActionState = ADB_ACTION_OUT; /* set next state */ @@ -574,24 +675,26 @@ send_adb_cuda(u_char * in, u_char * buffer, void *compRout, void *data, int splx(s); - if (0x0100 <= (s & 0x0700)) /* were VIA1 interrupts blocked ? */ + if (0x0100 <= (s & 0x0700)) /* were VIA1 interrupts blocked? */ /* poll until byte done */ while ((adbActionState != ADB_ACTION_IDLE) || (ADB_INTR_IS_ON) || (adbWaiting == 1)) - if (ADB_SR_INTR_IS_ON) /* wait for "interrupt" */ - adb_intr_cuda(); /* go process - * "interrupt" */ + if (ADB_SR_INTR_IS_ON) { /* wait for "interrupt" */ + adb_intr_cuda(NULL); /* go process it */ + if (adb_polling) + adb_soft_intr(); + } return 0; } /* send_adb_cuda */ -/* TO DO: add one or two zshard calls in here */ -void -adb_intr_II(void) +int +adb_intr_II(void *arg) { - int i, len, intr_on = 0; - int send = 0, do_srq = 0; + struct adbCommand packet; + int i, intr_on = 0; + int send = 0; unsigned int s; s = splhigh(); /* can't be too careful - might be called */ @@ -601,24 +704,73 @@ adb_intr_II(void) ADB_VIA_INTR_DISABLE(); /* disable ADB interrupt on IIs. */ -/*if (ADB_INTR_IS_ON)*/ -/* printf_intr("INTR ON ");*/ + delay(ADB_DELAY); /* yuck (don't remove) */ + + (void)intr_dispatch(0x70); /* grab any serial interrupts */ + if (ADB_INTR_IS_ON) intr_on = 1; /* save for later */ - + +switch_start: switch (adbActionState) { + case ADB_ACTION_POLLING: + if (!intr_on) { + if (adbOutQueueHasData) { +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("POLL-doing-out-queue. "); +#endif + ADB_SET_STATE_IDLE_II(); + delay(ADB_DELAY); + + /* copy over data */ + memcpy(adbOutputBuffer, adbOutQueue.outBuf, + adbOutQueue.outBuf[0] + 2); + + adbBuffer = adbOutQueue.saveBuf; /* user data area */ + adbCompRout = adbOutQueue.compRout; /* completion routine */ + adbCompData = adbOutQueue.data; /* comp. rout. data */ + adbOutQueueHasData = 0; /* currently processing + * "queue" entry */ + adbSentChars = 0; /* nothing sent yet */ + adbActionState = ADB_ACTION_OUT; /* set next state */ + ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ + ADB_SR() = adbOutputBuffer[1]; /* load byte for output */ + adbBusState = ADB_BUS_CMD; /* set bus to cmd state */ + ADB_SET_STATE_CMD(); /* tell ADB that we want to send */ + break; + } else { +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("pIDLE "); +#endif + adbActionState = ADB_ACTION_IDLE; + } + } else { +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("pIN "); +#endif + adbActionState = ADB_ACTION_IN; + } + delay(ADB_DELAY); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ + goto switch_start; + break; case ADB_ACTION_IDLE: if (!intr_on) { - /* printf_intr("FAKE DROPPED \n"); */ - /* printf_intr(" XX "); */ i = ADB_SR(); + adbBusState = ADB_BUS_IDLE; + adbActionState = ADB_ACTION_IDLE; + ADB_SET_STATE_IDLE_II(); break; } - adbNextEnd = 0; - /* printf_intr("idle "); */ adbInputBuffer[0] = 1; adbInputBuffer[1] = ADB_SR(); /* get first byte */ - /* printf_intr("0x%02x ", adbInputBuffer[1]); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("idle 0x%02x ", adbInputBuffer[1]); +#endif ADB_SET_SR_INPUT(); /* make sure SR is set to IN */ adbActionState = ADB_ACTION_IN; /* set next state */ ADB_SET_STATE_EVEN(); /* set bus state to even */ @@ -627,128 +779,113 @@ adb_intr_II(void) case ADB_ACTION_IN: adbInputBuffer[++adbInputBuffer[0]] = ADB_SR(); /* get byte */ - /* printf_intr("in 0x%02x ", - * adbInputBuffer[adbInputBuffer[0]]); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("in 0x%02x ", + adbInputBuffer[adbInputBuffer[0]]); +#endif ADB_SET_SR_INPUT(); /* make sure SR is set to IN */ - /* - * Check for an unsolicited Service Request (SRQ). - * An empty SRQ packet NEVER ends, so we must manually - * check for the following condition. - */ - if (adbInputBuffer[0] == 4 && adbInputBuffer[2] == 0xff && - adbInputBuffer[3] == 0xff && adbInputBuffer[4] == 0xff && - intr_on && !adbNextEnd) - do_srq = 1; - - if (adbNextEnd == 1) { /* process last byte of packet */ - adbNextEnd = 0; - /* printf_intr("done: "); */ - - /* If the following conditions are true (4 byte - * message, last 3 bytes are 0xff) then we basically - * got a "no response" from the ADB chip, so change - * the message to an empty one. We also clear intr_on - * to stop the SRQ send later on because these packets - * normally have the SRQ bit set even when there is - * NOT a pending SRQ. */ - if (adbInputBuffer[0] == 4 && adbInputBuffer[2] == 0xff && - adbInputBuffer[3] == 0xff && adbInputBuffer[4] == 0xff) { - /* printf_intr("NO RESP "); */ - intr_on = 0; - adbInputBuffer[0] = 0; + if (intr_on) { /* process last byte of packet */ + adbInputBuffer[0]--; /* minus one */ + /* + * If intr_on was true, and it's the second byte, then + * the byte we just discarded is really valid, so + * adjust the count + */ + if (adbInputBuffer[0] == 2) { + adbInputBuffer[0]++; } - adbLastDevice = (adbInputBuffer[1] & 0xf0) >> 4; - - if ((!adbWaiting || adbPolling) - && (adbInputBuffer[0] != 0)) { - /* unsolicided - ignore if starting */ - if (!adbStarting) - adb_handle_unsol(adbInputBuffer); - } else - if (!adbPolling) { /* someone asked for it */ - /* printf_intr("SOL: "); */ - /* print_single(adbInputBuffer); */ - if (adbBuffer != (long) 0) { /* if valid return data - * pointer */ - /* get return length minus - * extras */ - len = adbInputBuffer[0] - 1; - - /* if adb_op is ever made to - * be called from a user - * routine, we should use a - * copyout or copyin here to - * be sure we're in the - * correct context. */ - for (i = 1; i <= len; i++) - adbBuffer[i] = adbInputBuffer[i + 1]; - if (len < 0) - len = 0; - adbBuffer[0] = len; - } - adb_comp_exec(); - } + +#ifdef ADB_DEBUG + if (adb_debug & 0x80) { + printf_intr("done: "); + print_single(adbInputBuffer); + } +#endif + + adbLastDevice = ADB_CMDADDR(adbInputBuffer[1]); + + if (adbInputBuffer[0] == 1 && !adbWaiting) { /* SRQ!!!*/ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr(" xSRQ! "); +#endif + adb_guess_next_device(); +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("try 0x%0x ", + adbLastDevice); +#endif + adbOutputBuffer[0] = 1; + adbOutputBuffer[1] = ADBTALK(adbLastDevice, 0); + + adbSentChars = 0; /* nothing sent yet */ + adbActionState = ADB_ACTION_POLLING; /* set next state */ + ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ + ADB_SR() = adbOutputBuffer[1]; /* load byte for output */ + adbBusState = ADB_BUS_CMD; /* set bus to cmd state */ + ADB_SET_STATE_CMD(); /* tell ADB that we want to */ + break; + } + + /* set up data for adb_pass_up */ + memcpy(packet.data, adbInputBuffer, adbInputBuffer[0] + 1); + + if (!adbWaiting && (adbInputBuffer[0] != 0)) { + packet.unsol = 1; + packet.ack_only = 0; + adb_pass_up(&packet); + } else { + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.unsol = 0; + packet.ack_only = 0; + adb_pass_up(&packet); + } + adbWaiting = 0; - adbPolling = 0; adbInputBuffer[0] = 0; - adbBuffer = (long) 0; - adbCompRout = (long) 0; - adbCompData = (long) 0; + adbBuffer = (long)0; + adbCompRout = (long)0; + adbCompData = (long)0; /* * Since we are done, check whether there is any data * waiting to do out. If so, start the sending the data. */ if (adbOutQueueHasData == 1) { - /* printf_intr("XXX: DOING OUT QUEUE\n"); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("XXX: DOING OUT QUEUE\n"); +#endif /* copy over data */ - for (i = 0; i <= (adbOutQueue.outBuf[0] + 1); i++) - adbOutputBuffer[i] = adbOutQueue.outBuf[i]; + memcpy(adbOutputBuffer, adbOutQueue.outBuf, + adbOutQueue.outBuf[0] + 2); adbBuffer = adbOutQueue.saveBuf; /* user data area */ adbCompRout = adbOutQueue.compRout; /* completion routine */ adbCompData = adbOutQueue.data; /* comp. rout. data */ adbOutQueueHasData = 0; /* currently processing * "queue" entry */ - adbPolling = 0; send = 1; - /* if intr_on is true, then it's a SRQ so poll - * other devices. */ - } else - if (intr_on) { - /* printf_intr("starting POLL "); */ - do_srq = 1; - adbPolling = 1; - } else - if ((adbInputBuffer[1] & 0x0f) != 0x0c) { - /* printf_intr("xC HACK "); */ - adbPolling = 1; - send = 1; - adbOutputBuffer[0] = 1; - adbOutputBuffer[1] = (adbInputBuffer[1] & 0xf0) | 0x0c; - } else { - /* printf_intr("ending "); */ - adbBusState = ADB_BUS_IDLE; - adbActionState = ADB_ACTION_IDLE; - ADB_SET_STATE_IDLE_II(); - break; - } - } - /* - * If do_srq is true then something above determined that - * the message has ended and some device is sending a - * service request. So we need to determine the next device - * and send a poll to it. (If the device we send to isn't the - * one that sent the SRQ, that ok as it will be caught - * the next time though.) - */ - if (do_srq) { - /* printf_intr("SRQ! "); */ - adbPolling = 1; - adb_guess_next_device(); - adbOutputBuffer[0] = 1; - adbOutputBuffer[1] = ((adbLastDevice & 0x0f) << 4) | 0x0c; - send = 1; + } else { +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("XXending "); +#endif + adb_guess_next_device(); + adbOutputBuffer[0] = 1; + adbOutputBuffer[1] = ((adbLastDevice & 0x0f) << 4) | 0x0c; + adbSentChars = 0; /* nothing sent yet */ + adbActionState = ADB_ACTION_POLLING; /* set next state */ + ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ + ADB_SR() = adbOutputBuffer[1]; /* load byte for output */ + adbBusState = ADB_BUS_CMD; /* set bus to cmd state */ + ADB_SET_STATE_CMD(); /* tell ADB that we want to */ + break; + } } + /* * If send is true then something above determined that * the message has ended and we need to start sending out @@ -756,7 +893,6 @@ adb_intr_II(void) * is data waiting to go out or because an SRQ was seen. */ if (send) { - adbNextEnd = 0; adbSentChars = 0; /* nothing sent yet */ adbActionState = ADB_ACTION_OUT; /* set next state */ ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ @@ -767,9 +903,6 @@ adb_intr_II(void) break; } /* We only get this far if the message hasn't ended yet. */ - if (!intr_on) /* if adb intr. on then the */ - adbNextEnd = 1; /* NEXT byte is the last */ - switch (adbBusState) { /* set to next state */ case ADB_BUS_EVEN: ADB_SET_STATE_ODD(); /* set state to odd */ @@ -787,9 +920,6 @@ adb_intr_II(void) break; case ADB_ACTION_OUT: - adbNextEnd = 0; - if (!adbPolling) - adbWaiting = 1; /* not unsolicited */ i = ADB_SR(); /* clear interrupt */ adbSentChars++; /* @@ -803,44 +933,74 @@ adb_intr_II(void) ADB_SET_SR_INPUT(); adbBusState = ADB_BUS_EVEN; ADB_SET_STATE_EVEN(); - /* printf_intr("talk out 0x%02x ", i); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("talk out 0x%02x ", i); +#endif + /* we want something back */ + adbWaiting = 1; break; } - /* If it's not a TALK, check whether all data has been sent. + /* + * If it's not a TALK, check whether all data has been sent. * If so, call the completion routine and clean up. If not, - * advance to the next state. */ - /* printf_intr("non-talk out 0x%0x ", i); */ + * advance to the next state. + */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("non-talk out 0x%0x ", i); +#endif ADB_SET_SR_OUTPUT(); if (adbOutputBuffer[0] == adbSentChars) { /* check for done */ - /* printf_intr("done \n"); */ - adb_comp_exec(); - adbBuffer = (long) 0; - adbCompRout = (long) 0; - adbCompData = (long) 0; +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("done \n"); +#endif + /* set up stuff for adb_pass_up */ + memcpy(packet.data, adbOutputBuffer, adbOutputBuffer[0] + 1); + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.cmd = adbWaitingCmd; + packet.unsol = 0; + packet.ack_only = 1; + adb_pass_up(&packet); + + /* reset "waiting" vars, just in case */ + adbBuffer = (long)0; + adbCompRout = (long)0; + adbCompData = (long)0; if (adbOutQueueHasData == 1) { /* copy over data */ - for (i = 0; i <= (adbOutQueue.outBuf[0] + 1); i++) - adbOutputBuffer[i] = adbOutQueue.outBuf[i]; + memcpy(adbOutputBuffer, adbOutQueue.outBuf, + adbOutQueue.outBuf[0] + 2); adbBuffer = adbOutQueue.saveBuf; /* user data area */ adbCompRout = adbOutQueue.compRout; /* completion routine */ adbCompData = adbOutQueue.data; /* comp. rout. data */ adbOutQueueHasData = 0; /* currently processing * "queue" entry */ - adbPolling = 0; + adbSentChars = 0; /* nothing sent yet */ + adbActionState = ADB_ACTION_OUT; /* set next state */ + ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ + ADB_SR() = adbOutputBuffer[1]; /* load byte for output */ + adbBusState = ADB_BUS_CMD; /* set bus to cmd state */ + ADB_SET_STATE_CMD(); /* tell ADB that we want to + * send */ + break; } else { + /* send talk to last device instead */ adbOutputBuffer[0] = 1; - adbOutputBuffer[1] = (adbOutputBuffer[1] & 0xf0) | 0x0c; - adbPolling = 1; /* non-user poll */ + adbOutputBuffer[1] = + ADBTALK(ADB_CMDADDR(adbOutputBuffer[1]), 0); + + adbSentChars = 0; /* nothing sent yet */ + adbActionState = ADB_ACTION_IDLE; /* set next state */ + ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ + ADB_SR() = adbOutputBuffer[1]; /* load byte for output */ + adbBusState = ADB_BUS_CMD; /* set bus to cmd state */ + ADB_SET_STATE_CMD(); /* tell ADB that we want to */ + break; } - adbNextEnd = 0; - adbSentChars = 0; /* nothing sent yet */ - adbActionState = ADB_ACTION_OUT; /* set next state */ - ADB_SET_SR_OUTPUT(); /* set shift register for OUT */ - ADB_SR() = adbOutputBuffer[1]; /* load byte for output */ - adbBusState = ADB_BUS_CMD; /* set bus to cmd state */ - ADB_SET_STATE_CMD(); /* tell ADB that we want to - * send */ - break; } ADB_SR() = adbOutputBuffer[adbSentChars + 1]; switch (adbBusState) { /* advance to next state */ @@ -856,20 +1016,29 @@ adb_intr_II(void) break; default: - printf_intr("strange state!!! (0x%x)\n", adbBusState); +#ifdef ADB_DEBUG + if (adb_debug) { + printf_intr("strange state!!! (0x%x)\n", + adbBusState); + } +#endif break; } break; default: - printf_intr("adb: unknown ADB state (during intr)\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: unknown ADB state (during intr)\n"); +#endif + break; } ADB_VIA_INTR_ENABLE(); /* enable ADB interrupt on IIs. */ splx(s); /* restore */ - return; + return (1); } @@ -878,22 +1047,22 @@ adb_intr_II(void) * send_adb version for II series machines */ int -send_adb_II(u_char * in, u_char * buffer, void *compRout, void *data, int command) +send_adb_II(u_char *in, u_char *buffer, void *compRout, void *data, int command) { - int i, s, len; + int s, len; if (adbActionState == ADB_ACTION_NOTREADY) /* return if ADB not * available */ return 1; - s = splhigh(); /* don't interrupt while we are messing with - * the ADB */ + /* Don't interrupt while we are messing with the ADB */ + s = splhigh(); if (0 != adbOutQueueHasData) { /* right now, "has data" means "full" */ splx(s); /* sorry, try again later */ return 1; } - if ((long) in == (long) 0) { /* need to convert? */ + if ((long)in == (long)0) { /* need to convert? */ /* * Don't need to use adb_cmd_extra here because this section * will be called ONLY when it is an ADB command (no RTC or @@ -906,15 +1075,13 @@ send_adb_II(u_char * in, u_char * buffer, void *compRout, void *data, int comman len = 0;/* no additional data */ adbOutQueue.outBuf[0] = 1 + len; /* command + addl. data */ - adbOutQueue.outBuf[1] = (u_char) command; /* load command */ + adbOutQueue.outBuf[1] = (u_char)command; /* load command */ - for (i = 1; i <= len; i++) /* copy additional output - * data, if any */ - adbOutQueue.outBuf[1 + i] = buffer[i]; + /* copy additional output data, if any */ + memcpy(adbOutQueue.outBuf + 2, buffer + 1, len); } else /* if data ready, just copy over */ - for (i = 0; i <= (adbOutQueue.outBuf[0] + 1); i++) - adbOutQueue.outBuf[i] = in[i]; + memcpy(adbOutQueue.outBuf, in, in[0] + 2); adbOutQueue.saveBuf = buffer; /* save buffer to know where to save * result */ @@ -923,11 +1090,10 @@ send_adb_II(u_char * in, u_char * buffer, void *compRout, void *data, int comman adbOutQueue.data = data;/* save completion routine data pointer */ if ((adbActionState == ADB_ACTION_IDLE) && /* is ADB available? */ - (ADB_INTR_IS_OFF) &&/* and no incoming interrupts? */ - (adbPolling == 0)) {/* and we are not currently polling */ + (ADB_INTR_IS_OFF)) { /* and no incoming interrupts? */ /* then start command now */ - for (i = 0; i <= (adbOutQueue.outBuf[0] + 1); i++) /* copy over data */ - adbOutputBuffer[i] = adbOutQueue.outBuf[i]; + memcpy(adbOutputBuffer, adbOutQueue.outBuf, + adbOutQueue.outBuf[0] + 2); /* copy over data */ adbBuffer = adbOutQueue.saveBuf; /* pointer to user data * area */ @@ -950,12 +1116,15 @@ send_adb_II(u_char * in, u_char * buffer, void *compRout, void *data, int comman splx(s); - if (0x0100 <= (s & 0x0700)) /* were VIA1 interrupts blocked ? */ + if (0x0100 <= (s & 0x0700)) /* were VIA1 interrupts blocked? */ /* poll until message done */ while ((adbActionState != ADB_ACTION_IDLE) || (ADB_INTR_IS_ON) - || (adbWaiting == 1) || (adbPolling == 1)) - if (ADB_SR_INTR_IS_ON) /* wait for "interrupt" */ - adb_intr_II(); /* go process "interrupt" */ + || (adbWaiting == 1)) + if (ADB_SR_INTR_IS_ON) { /* wait for "interrupt" */ + adb_intr_II(NULL); /* go process it */ + if (adb_polling) + adb_soft_intr(); + } return 0; } @@ -971,8 +1140,10 @@ adb_guess_next_device(void) int last, i, dummy; if (adbStarting) { - /* start polling EVERY device, since we can't be sure there is - * anything in the device table yet */ + /* + * Start polling EVERY device, since we can't be sure there is + * anything in the device table yet + */ if (adbLastDevice < 1 || adbLastDevice > 15) adbLastDevice = 1; if (++adbLastDevice > 15) /* point to next one */ @@ -996,7 +1167,7 @@ adb_guess_next_device(void) * device! This can happen if * there are no devices on the * bus */ - dummy = 2; + dummy = 1; break; } /* found the next device */ @@ -1007,33 +1178,37 @@ adb_guess_next_device(void) } return adbLastDevice; } + + /* * Called when when an adb interrupt happens. * This routine simply transfers control over to the appropriate * code for the machine we are running on. */ -void -adb_intr(void) +int +adb_intr(void *arg) { switch (adbHardware) { - case ADB_HW_II: - adb_intr_II(); + case ADB_HW_II: + return adb_intr_II(arg); break; case ADB_HW_IISI: - adb_intr_IIsi(); + return adb_intr_IIsi(arg); break; - case ADB_HW_PB: + case ADB_HW_PB: /* Should not come through here. */ break; case ADB_HW_CUDA: - adb_intr_cuda(); + return adb_intr_cuda(arg); break; case ADB_HW_UNKNOWN: break; } + + return (-1); } @@ -1043,10 +1218,11 @@ adb_intr(void) * IIsi version of adb_intr * */ -void -adb_intr_IIsi(void) +int +adb_intr_IIsi(void *arg) { - int i, ending, len; + struct adbCommand packet; + int i, ending; unsigned int s; s = splhigh(); /* can't be too careful - might be called */ @@ -1071,7 +1247,7 @@ switch_start: ADB_SET_STATE_ACKON(); /* start ACK to ADB chip */ delay(ADB_DELAY); /* delay */ ADB_SET_STATE_ACKOFF(); /* end ACK to ADB chip */ - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ break; case ADB_ACTION_IN: @@ -1085,15 +1261,19 @@ switch_start: ADB_SET_STATE_ACKON(); /* start ACK to ADB chip */ delay(ADB_DELAY); /* delay */ ADB_SET_STATE_ACKOFF(); /* end ACK to ADB chip */ - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ if (1 == ending) { /* end of message? */ ADB_SET_STATE_INACTIVE(); /* signal end of frame */ - /* this section _should_ handle all ADB and RTC/PRAM - * type commands, */ - /* but there may be more... */ - /* note: commands are always at [4], even for rtc/pram - * commands */ + /* + * This section _should_ handle all ADB and RTC/PRAM + * type commands, but there may be more... Note: + * commands are always at [4], even for rtc/pram + * commands + */ + /* set up data for adb_pass_up */ + memcpy(packet.data, adbInputBuffer, adbInputBuffer[0] + 1); + if ((adbWaiting == 1) && /* are we waiting AND */ (adbInputBuffer[4] == adbWaitingCmd) && /* the cmd we sent AND */ ((adbInputBuffer[2] == 0x00) || /* it's from the ADB @@ -1101,40 +1281,22 @@ switch_start: (adbInputBuffer[2] == 0x01))) { /* it's from the * PRAM/RTC device */ - /* is this data we are waiting for? */ - if (adbBuffer != (long) 0) { /* if valid return data - * pointer */ - /* get return length minus extras */ - len = adbInputBuffer[0] - 4; - /* if adb_op is ever made to be called - * from a user routine, we should use - * a copyout or copyin here to be sure - * we're in the correct context */ - for (i = 1; i <= len; i++) - adbBuffer[i] = adbInputBuffer[4 + i]; - if (len < 0) - len = 0; - adbBuffer[0] = len; - } - adb_comp_exec(); /* call completion - * routine */ + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.unsol = 0; + packet.ack_only = 0; + adb_pass_up(&packet); adbWaitingCmd = 0; /* reset "waiting" vars */ adbWaiting = 0; - adbBuffer = (long) 0; - adbCompRout = (long) 0; - adbCompData = (long) 0; + adbBuffer = (long)0; + adbCompRout = (long)0; + adbCompData = (long)0; } else { - /* pass the data off to the handler */ - /* This section IGNORES all data that is not - * from the ADB sub-device. That is, not from - * rtc or pram. Maybe we should fix later, - * but do the other devices every send things - * without being asked? */ - if (adbStarting == 0) /* ignore if during - * adbreinit */ - if (adbInputBuffer[2] == 0x00) - adb_handle_unsol(adbInputBuffer); + packet.unsol = 1; + packet.ack_only = 0; + adb_pass_up(&packet); } adbActionState = ADB_ACTION_IDLE; @@ -1146,7 +1308,7 @@ switch_start: adbActionState = ADB_ACTION_OUT; /* set next state */ delay(ADB_DELAY); /* delay */ - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ if (ADB_INTR_IS_ON) { /* ADB intr low during * write */ @@ -1187,13 +1349,13 @@ switch_start: adbWriteDelay = 1; /* must retry when done with * read */ delay(ADB_DELAY); /* delay */ - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ goto switch_start; /* process next state right * now */ break; } delay(ADB_DELAY); /* required delay */ - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ if (adbOutputBuffer[0] == adbSentChars) { /* check for done */ if (0 == adb_cmd_result(adbOutputBuffer)) { /* do we expect data @@ -1201,13 +1363,22 @@ switch_start: adbWaiting = 1; /* signal waiting for return */ adbWaitingCmd = adbOutputBuffer[2]; /* save waiting command */ } else {/* no talk, so done */ - adb_comp_exec(); /* call completion - * routine */ - adbWaitingCmd = 0; /* reset "waiting" vars, - * just in case */ - adbBuffer = (long) 0; - adbCompRout = (long) 0; - adbCompData = (long) 0; + /* set up stuff for adb_pass_up */ + memcpy(packet.data, adbInputBuffer, + adbInputBuffer[0] + 1); + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.cmd = adbWaitingCmd; + packet.unsol = 0; + packet.ack_only = 1; + adb_pass_up(&packet); + + /* reset "waiting" vars, just in case */ + adbWaitingCmd = 0; + adbBuffer = (long)0; + adbCompRout = (long)0; + adbCompData = (long)0; } adbWriteDelay = 0; /* done writing */ @@ -1221,18 +1392,25 @@ switch_start: break; case ADB_ACTION_NOTREADY: - printf_intr("adb: not yet initialized\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: not yet initialized\n"); +#endif break; default: - printf_intr("intr: unknown ADB state\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("intr: unknown ADB state\n"); +#endif + break; } ADB_VIA_INTR_ENABLE(); /* enable ADB interrupt on IIs. */ splx(s); /* restore */ - return; + return (1); } /* end adb_intr_IIsi */ @@ -1240,27 +1418,27 @@ switch_start: * if the device is currently busy, and there is no data waiting to go out, then * the data is "queued" in the outgoing buffer. If we are already waiting, then * we return. - * in: if (in==0) then the command string is built from command and buffer - * if (in!=0) then in is used as the command string - * buffer: additional data to be sent (used only if in==0) + * in: if (in == 0) then the command string is built from command and buffer + * if (in != 0) then in is used as the command string + * buffer: additional data to be sent (used only if in == 0) * this is also where return data is stored * compRout: the completion routine that is called when then return value * is received (if a return value is expected) * data: a data pointer that can be used by the completion routine - * command: an ADB command to be sent (used only if in==0) + * command: an ADB command to be sent (used only if in == 0) * */ int -send_adb_IIsi(u_char * in, u_char * buffer, void *compRout, void *data, int +send_adb_IIsi(u_char *in, u_char *buffer, void *compRout, void *data, int command) { - int i, s, len; + int s, len; if (adbActionState == ADB_ACTION_NOTREADY) return 1; - s = splhigh(); /* don't interrupt while we are messing with - * the ADB */ + /* Don't interrupt while we are messing with the ADB */ + s = splhigh(); if ((adbActionState == ADB_ACTION_IDLE) && /* ADB available? */ (ADB_INTR_IS_OFF)) {/* and no incoming interrupt? */ @@ -1274,10 +1452,12 @@ send_adb_IIsi(u_char * in, u_char * buffer, void *compRout, void *data, int return 1; /* really busy! */ } - if ((long) in == (long) 0) { /* need to convert? */ - /* don't need to use adb_cmd_extra here because this section - * will be called */ - /* ONLY when it is an ADB command (no RTC or PRAM) */ + if ((long)in == (long)0) { /* need to convert? */ + /* + * Don't need to use adb_cmd_extra here because this section + * will be called ONLY when it is an ADB command (no RTC or + * PRAM) + */ if ((command & 0x0c) == 0x08) /* copy addl data ONLY if * doing a listen! */ len = buffer[0]; /* length of additional data */ @@ -1287,14 +1467,13 @@ send_adb_IIsi(u_char * in, u_char * buffer, void *compRout, void *data, int adbOutputBuffer[0] = 2 + len; /* dev. type + command + addl. * data */ adbOutputBuffer[1] = 0x00; /* mark as an ADB command */ - adbOutputBuffer[2] = (u_char) command; /* load command */ + adbOutputBuffer[2] = (u_char)command; /* load command */ - for (i = 1; i <= len; i++) /* copy additional output - * data, if any */ - adbOutputBuffer[2 + i] = buffer[i]; + /* copy additional output data, if any */ + memcpy(adbOutputBuffer + 3, buffer + 1, len); } else - for (i = 0; i <= (adbOutputBuffer[0] + 1); i++) - adbOutputBuffer[i] = in[i]; + /* if data ready, just copy over */ + memcpy(adbOutputBuffer, in, in[0] + 2); adbSentChars = 0; /* nothing sent yet */ adbBuffer = buffer; /* save buffer to know where to save result */ @@ -1318,153 +1497,259 @@ send_adb_IIsi(u_char * in, u_char * buffer, void *compRout, void *data, int splx(s); - if (0x0100 <= (s & 0x0700)) /* were VIA1 interrupts blocked ? */ + if (0x0100 <= (s & 0x0700)) /* were VIA1 interrupts blocked? */ /* poll until byte done */ while ((adbActionState != ADB_ACTION_IDLE) || (ADB_INTR_IS_ON) || (adbWaiting == 1)) - if (ADB_SR_INTR_IS_ON) /* wait for "interrupt" */ - adb_intr_IIsi(); /* go process - * "interrupt" */ + if (ADB_SR_INTR_IS_ON) { /* wait for "interrupt" */ + adb_intr_IIsi(NULL); /* go process it */ + if (adb_polling) + adb_soft_intr(); + } - return 0; + return 0; } /* send_adb_IIsi */ - -/* - * adb_comp_exec - * This is a general routine that calls the completion routine if there is one. +/* + * adb_pass_up is called by the interrupt-time routines. + * It takes the raw packet data that was received from the + * device and puts it into the queue that the upper half + * processes. It then signals for a soft ADB interrupt which + * will eventually call the upper half routine (adb_soft_intr). + * + * If in->unsol is 0, then this is either the notification + * that the packet was sent (on a LISTEN, for example), or the + * response from the device (on a TALK). The completion routine + * is called only if the user specified one. + * + * If in->unsol is 1, then this packet was unsolicited and + * so we look up the device in the ADB device table to determine + * what it's default service routine is. + * + * If in->ack_only is 1, then we really only need to call + * the completion routine, so don't do any other stuff. + * + * Note that in->data contains the packet header AND data, + * while adbInbound[]->data contains ONLY data. + * + * Note: Called only at interrupt time. Assumes this. */ void -adb_comp_exec(void) +adb_pass_up(struct adbCommand *in) { - if ((long) 0 != adbCompRout) /* don't call if empty return location */ -#if defined(__NetBSD__) || defined(__OpenBSD__) - asm(" - movml #0xffff, sp@- | save all registers - movl %0, a2 | adbCompData - movl %1, a1 | adbCompRout - movl %2, a0 | adbBuffer - movl %3, d0 | adbWaitingCmd - jbsr a1@ | go call the routine - movml sp@+, #0xffff | restore all registers" - : - :"g"(adbCompData), "g"(adbCompRout), - "g"(adbBuffer), "g"(adbWaitingCmd) - :"d0", "a0", "a1", "a2"); -#else /* for macos based testing */ - asm { - movem.l a0/a1/a2/d0, -(a7) - move.l adbCompData, a2 - move.l adbCompRout, a1 - move.l adbBuffer, a0 - move.w adbWaitingCmd, d0 - jsr(a1) - movem.l(a7) +, d0/a2/a1/a0 + int start = 0, len = 0, cmd = 0; + ADBDataBlock block; + + /* temp for testing */ + /*u_char *buffer = 0;*/ + /*u_char *compdata = 0;*/ + /*u_char *comprout = 0;*/ + + if (adbInCount >= ADB_QUEUE) { +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: ring buffer overflow\n"); +#endif + return; + } + + if (in->ack_only) { + len = in->data[0]; + cmd = in->cmd; + start = 0; + } else { + switch (adbHardware) { + case ADB_HW_II: + cmd = in->data[1]; + if (in->data[0] < 2) + len = 0; + else + len = in->data[0]-1; + start = 1; + break; + + case ADB_HW_IISI: + case ADB_HW_CUDA: + /* If it's unsolicited, accept only ADB data for now */ + if (in->unsol) + if (0 != in->data[2]) + return; + cmd = in->data[4]; + if (in->data[0] < 5) + len = 0; + else + len = in->data[0]-4; + start = 4; + break; + + case ADB_HW_PB: + cmd = in->data[1]; + if (in->data[0] < 2) + len = 0; + else + len = in->data[0]-1; + start = 1; + break; + + case ADB_HW_UNKNOWN: + return; } + + /* Make sure there is a valid device entry for this device */ + if (in->unsol) { + /* ignore unsolicited data during adbreinit */ + if (adbStarting) + return; + /* get device's comp. routine and data area */ + if (-1 == get_adb_info(&block, ADB_CMDADDR(cmd))) + return; + } + } + + /* + * If this is an unsolicited packet, we need to fill in + * some info so adb_soft_intr can process this packet + * properly. If it's not unsolicited, then use what + * the caller sent us. + */ + if (in->unsol) { + adbInbound[adbInTail].compRout = (void *)block.dbServiceRtPtr; + adbInbound[adbInTail].compData = (void *)block.dbDataAreaAddr; + adbInbound[adbInTail].saveBuf = (void *)adbInbound[adbInTail].data; + } else { + adbInbound[adbInTail].compRout = (void *)in->compRout; + adbInbound[adbInTail].compData = (void *)in->compData; + adbInbound[adbInTail].saveBuf = (void *)in->saveBuf; + } + +#ifdef ADB_DEBUG + if (adb_debug && in->data[1] == 2) + printf_intr("adb: caught error\n"); #endif + + /* copy the packet data over */ + /* + * TO DO: If the *_intr routines fed their incoming data + * directly into an adbCommand struct, which is passed to + * this routine, then we could eliminate this copy. + */ + memcpy(adbInbound[adbInTail].data + 1, in->data + start + 1, len); + adbInbound[adbInTail].data[0] = len; + adbInbound[adbInTail].cmd = cmd; + + adbInCount++; + if (++adbInTail >= ADB_QUEUE) + adbInTail = 0; + + /* + * If the debugger is running, call upper half manually. + * Otherwise, trigger a soft interrupt to handle the rest later. + */ + if (adb_polling) + adb_soft_intr(); + else + setsoftadb(); + + return; } /* - * This routine handles what needs to be done after an unsolicited - * message is read from the ADB device. 'in' points to the raw - * data received from the device, including device number - * (on IIsi) and result code. + * Called to process the packets after they have been + * placed in the incoming queue. * - * Note that the service (completion) routine for an unsolicited - * message is whatever is set in the ADB device table. This is - * different than for a device responding to a specific request, - * where the completion routine is defined by the caller. */ void -adb_handle_unsol(u_char * in) +adb_soft_intr(void) { - int i, cmd = 0; - u_char data[MAX_ADB_MSG_LENGTH]; + int s; + int cmd = 0; u_char *buffer = 0; - ADBDataBlock block; + u_char *comprout = 0; + u_char *compdata = 0; - /* make local copy so we don't destroy the real one - it may be needed - * later. */ - for (i = 0; i <= (in[0] + 1); i++) - data[i] = in[i]; - - switch (adbHardware) { - case ADB_HW_II: - /* adjust the "length" byte */ - cmd = data[1]; - if (data[0] < 2) - data[1] = 0; - else - data[1] = data[0] - 1; - - buffer = (data + 1); - break; - - case ADB_HW_IISI: - case ADB_HW_CUDA: - /* only handles ADB for now */ - if (0 != *(data + 2)) - return; - - /* adjust the "length" byte */ - cmd = data[4]; - if (data[0] < 5) - data[4] = 0; - else - data[4] = data[0] - 4; - - buffer = (data + 4); - break; - - case ADB_HW_PB: - return; /* how does PM handle "unsolicited" messages? */ +#if 0 + s = splhigh(); + printf_intr("sr: %x\n", (s & 0x0700)); + splx(s); +#endif - case ADB_HW_UNKNOWN: - return; - } +/*delay(2*ADB_DELAY);*/ - if (-1 == get_adb_info(&block, ((cmd & 0xf0) >> 4))) - return; + while (adbInCount) { +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("%x %x %x ", + adbInCount, adbInHead, adbInTail); +#endif + /* get the data we need from the queue */ + buffer = adbInbound[adbInHead].saveBuf; + comprout = adbInbound[adbInHead].compRout; + compdata = adbInbound[adbInHead].compData; + cmd = adbInbound[adbInHead].cmd; + + /* copy over data to data area if it's valid */ + /* + * Note that for unsol packets we don't want to copy the + * data anywhere, so buffer was already set to 0. + * For ack_only buffer was set to 0, so don't copy. + */ + if (buffer) + memcpy(buffer, adbInbound[adbInHead].data, + adbInbound[adbInHead].data[0] + 1); + +#ifdef ADB_DEBUG + if (adb_debug & 0x80) { + printf_intr("%p %p %p %x ", + buffer, comprout, compdata, (short)cmd); + printf_intr("buf: "); + print_single(adbInbound[adbInHead].data); + } +#endif - /* call default completion routine if it's valid */ - /* TO DO: This section of code is somewhat redundant with - * adb_comp_exec (above). Some day we may want to generalize it and - * make it a single function. */ - if ((long) 0 != (long) block.dbServiceRtPtr) { + /* call default completion routine if it's valid */ + if (comprout) { #if defined(__NetBSD__) || defined(__OpenBSD__) - asm(" - movml #0xffff, sp@- | save all registers - movl %0, a2 | block.dbDataAreaAddr - movl %1, a1 | block.dbServiceRtPtr - movl %2, a0 | buffer - movl %3, d0 | cmd - jbsr a1@ | go call the routine - movml sp@+, #0xffff | restore all registers" - : - : "g"(block.dbDataAreaAddr), - "g"(block.dbServiceRtPtr), "g"(buffer), "g"(cmd) - : "d0", "a0", "a1", "a2"); + __asm __volatile ( + " movml #0xffff,sp@- \n" /* save all regs */ + " movl %0,a2 \n" /* compdata */ + " movl %1,a1 \n" /* comprout */ + " movl %2,a0 \n" /* buffer */ + " movl %3,d0 \n" /* cmd */ + " jbsr a1@ \n" /* go call routine */ + " movml sp@+,#0xffff" /* restore all regs */ + : + : "g"(compdata), "g"(comprout), + "g"(buffer), "g"(cmd) + : "d0", "a0", "a1", "a2"); #else /* for macos based testing */ - asm - { - movem.l a0/a1/a2/d0, -(a7) - move.l block.dbDataAreaAddr, a2 - move.l block.dbServiceRtPtr, a1 - move.l buffer, a0 - move.w cmd, d0 - jsr(a1) - movem.l(a7) +, d0/a2/a1/a0 - } + asm + { + movem.l a0/a1/a2/d0, -(a7) + move.l compdata, a2 + move.l comprout, a1 + move.l buffer, a0 + move.w cmd, d0 + jsr(a1) + movem.l(a7)+, d0/a2/a1/a0 + } #endif + } + + s = splhigh(); + adbInCount--; + if (++adbInHead >= ADB_QUEUE) + adbInHead = 0; + splx(s); + } return; } /* - * This is my version of the ADBOp routine. It mainly just calls the hardware-specific - * routine. + * This is my version of the ADBOp routine. It mainly just calls the + * hardware-specific routine. * * data : pointer to data area to be used by compRout * compRout : completion routine @@ -1472,8 +1757,8 @@ adb_handle_unsol(u_char * in) * byte 0 = # of bytes * : for TALK: points to place to save return data * command : the adb command to send - * result : 0 = success - * : -1 = could not complete + * result : 0 = success + * : -1 = could not complete */ int adb_op(Ptr buffer, Ptr compRout, Ptr data, short command) @@ -1482,9 +1767,8 @@ adb_op(Ptr buffer, Ptr compRout, Ptr data, short command) switch (adbHardware) { case ADB_HW_II: - result = send_adb_II((u_char *) 0, - (u_char *) buffer, (void *) compRout, - (void *) data, (int) command); + result = send_adb_II((u_char *)0, (u_char *)buffer, + (void *)compRout, (void *)data, (int)command); if (result == 0) return 0; else @@ -1492,9 +1776,8 @@ adb_op(Ptr buffer, Ptr compRout, Ptr data, short command) break; case ADB_HW_IISI: - result = send_adb_IIsi((u_char *) 0, - (u_char *) buffer, (void *) compRout, - (void *) data, (int) command); + result = send_adb_IIsi((u_char *)0, (u_char *)buffer, + (void *)compRout, (void *)data, (int)command); /* * I wish I knew why this delay is needed. It usually needs to * be here when several commands are sent in close succession, @@ -1519,9 +1802,8 @@ adb_op(Ptr buffer, Ptr compRout, Ptr data, short command) break; case ADB_HW_CUDA: - result = send_adb_cuda((u_char *) 0, - (u_char *) buffer, (void *) compRout, - (void *) data, (int) command); + result = send_adb_cuda((u_char *)0, (u_char *)buffer, + (void *)compRout, (void *)data, (int)command); if (result == 0) return 0; else @@ -1536,33 +1818,92 @@ adb_op(Ptr buffer, Ptr compRout, Ptr data, short command) /* - * adb_cleanup - * This routine simply calls the appropriate version of the adb_cleanup routine. + * adb_hw_setup + * This routine sets up the possible machine specific hardware + * config (mainly VIA settings) for the various models. */ void -adb_cleanup(u_char * in) +adb_hw_setup(void) { volatile int i; + u_char send_string[ADB_MAX_MSG_LENGTH]; switch (adbHardware) { case ADB_HW_II: + via1_register_irq(2, adb_intr_II, NULL, NULL); + + via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5: + * outputs */ + via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */ + via_reg(VIA1, vACR) &= ~vSR_OUT; /* make sure SR is set + * to IN (II, IIsi) */ + adbActionState = ADB_ACTION_IDLE; /* used by all types of + * hardware (II, IIsi) */ + adbBusState = ADB_BUS_IDLE; /* this var. used in II-series + * code only */ + via_reg(VIA1, vIER) = 0x84; /* make sure VIA interrupts + * are on (II, IIsi) */ + ADB_SET_STATE_IDLE_II(); /* set ADB bus state to idle */ + ADB_VIA_CLR_INTR(); /* clear interrupt */ break; case ADB_HW_IISI: + via1_register_irq(2, adb_intr_IIsi, NULL, NULL); + via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5: + * outputs */ + via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */ + via_reg(VIA1, vACR) &= ~vSR_OUT; /* make sure SR is set + * to IN (II, IIsi) */ + adbActionState = ADB_ACTION_IDLE; /* used by all types of + * hardware (II, IIsi) */ + adbBusState = ADB_BUS_IDLE; /* this var. used in II-series + * code only */ + via_reg(VIA1, vIER) = 0x84; /* make sure VIA interrupts + * are on (II, IIsi) */ + ADB_SET_STATE_IDLE_IISI(); /* set ADB bus state to idle */ + /* get those pesky clock ticks we missed while booting */ - adb_cleanup_IIsi(in); + for (i = 0; i < 30; i++) { + delay(ADB_DELAY); + adb_hw_setup_IIsi(send_string); +#ifdef ADB_DEBUG + if (adb_debug) { + printf_intr("adb: cleanup: "); + print_single(send_string); + } +#endif + delay(ADB_DELAY); + if (ADB_INTR_IS_OFF) + break; + } break; case ADB_HW_PB: /* - * XXX - really PM_VIA_CLR_INTR - should we put it in + * XXX - really PM_VIA_CLR_INTR - should we put it in * pm_direct.h? */ - via_reg(VIA1, vIFR) = 0x90; /* clear interrupt */ + pm_hw_setup(); break; case ADB_HW_CUDA: + via1_register_irq(2, adb_intr_cuda, NULL, NULL); + via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5: + * outputs */ + via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */ + via_reg(VIA1, vACR) &= ~vSR_OUT; /* make sure SR is set + * to IN */ + via_reg(VIA1, vACR) = (via_reg(VIA1, vACR) | 0x0c) & ~0x10; + adbActionState = ADB_ACTION_IDLE; /* used by all types of + * hardware */ + adbBusState = ADB_BUS_IDLE; /* this var. used in II-series + * code only */ + via_reg(VIA1, vIER) = 0x84; /* make sure VIA interrupts + * are on */ + ADB_SET_STATE_IDLE_CUDA(); /* set ADB bus state to idle */ + + /* sort of a device reset */ i = ADB_SR(); /* clear interrupt */ ADB_VIA_INTR_DISABLE(); /* no interrupts while clearing */ ADB_SET_STATE_IDLE_CUDA(); /* reset state to idle */ @@ -1579,20 +1920,24 @@ adb_cleanup(u_char * in) break; case ADB_HW_UNKNOWN: + default: + via_reg(VIA1, vIER) = 0x04; /* turn interrupts off - TO + * DO: turn PB ints off? */ return; + break; } } /* - * adb_cleanup_IIsi + * adb_hw_setup_IIsi * This is sort of a "read" routine that forces the adb hardware through a read cycle * if there is something waiting. This helps "clean up" any commands that may have gotten * stuck or stopped during the boot process. * */ void -adb_cleanup_IIsi(u_char * buffer) +adb_hw_setup_IIsi(u_char *buffer) { int i; int dummy; @@ -1614,17 +1959,21 @@ adb_cleanup_IIsi(u_char * buffer) endofframe = 0; while (0 == endofframe) { - /* poll for ADB interrupt and watch for timeout */ - /* if time out, keep going in hopes of not hanging the - * ADB chip - I think */ + /* + * Poll for ADB interrupt and watch for timeout. + * If time out, keep going in hopes of not hanging + * the ADB chip - I think + */ my_time = ADB_DELAY * 5; while ((ADB_SR_INTR_IS_OFF) && (my_time-- > 0)) dummy = via_reg(VIA1, vBufB); buffer[i++] = ADB_SR(); /* reset interrupt flag by * reading vSR */ - /* perhaps put in a check here that ignores all data - * after the first MAX_ADB_MSG_LENGTH bytes ??? */ + /* + * Perhaps put in a check here that ignores all data + * after the first ADB_MAX_MSG_LENGTH bytes ??? + */ if (ADB_INTR_IS_OFF) /* check for end of frame */ endofframe = 1; @@ -1643,7 +1992,7 @@ adb_cleanup_IIsi(u_char * buffer) splx(s); /* restore interrupts */ return; -} /* adb_cleanup_IIsi */ +} /* adb_hw_setup_IIsi */ @@ -1654,110 +2003,49 @@ adb_cleanup_IIsi(u_char * buffer) void adb_reinit(void) { - u_char send_string[MAX_ADB_MSG_LENGTH]; - int s = 0; + u_char send_string[ADB_MAX_MSG_LENGTH]; + ADBDataBlock data; /* temp. holder for getting device info */ volatile int i, x; + int s; int command; int result; int saveptr; /* point to next free relocation address */ int device; int nonewtimes; /* times thru loop w/o any new devices */ - ADBDataBlock data; /* temp. holder for getting device info */ + + adb_setup_hw_type(); /* setup hardware type */ /* Make sure we are not interrupted while building the table. */ - if (adbHardware != ADB_HW_PB) /* ints must be on for PB? */ + /* ints must be on for PB & IOP (at least, for now) */ + if (adbHardware != ADB_HW_PB) s = splhigh(); + else + s = 0; /* XXX shut the compiler up*/ ADBNumDevices = 0; /* no devices yet */ /* Let intr routines know we are running reinit */ adbStarting = 1; - /* Initialize the ADB table. For now, we'll always use the same table - * that is defined at the beginning of this file - no mallocs. */ - for (i = 0; i < 16; i++) - ADBDevTable[i].devType = 0; - - adb_setup_hw_type(); /* setup hardware type */ - - /* Set up all the VIA bits we need to do the ADB stuff. */ - switch (adbHardware) { - case ADB_HW_II: - via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5: - * outputs */ - via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */ - via_reg(VIA1, vACR) &= ~vSR_OUT; /* make sure SR is set - * to IN (II, IIsi) */ - adbActionState = ADB_ACTION_IDLE; /* used by all types of - * hardware (II, IIsi) */ - adbBusState = ADB_BUS_IDLE; /* this var. used in II-series - * code only */ - via_reg(VIA1, vIER) = 0x84; /* make sure VIA interrupts - * are on (II, IIsi) */ - ADB_SET_STATE_IDLE_II(); /* set ADB bus state to idle */ - break; - - case ADB_HW_IISI: - via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5: - * outputs */ - via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */ - via_reg(VIA1, vACR) &= ~vSR_OUT; /* make sure SR is set - * to IN (II, IIsi) */ - adbActionState = ADB_ACTION_IDLE; /* used by all types of - * hardware (II, IIsi) */ - adbBusState = ADB_BUS_IDLE; /* this var. used in II-series - * code only */ - via_reg(VIA1, vIER) = 0x84; /* make sure VIA interrupts - * are on (II, IIsi) */ - ADB_SET_STATE_IDLE_IISI(); /* set ADB bus state to idle */ - break; - - case ADB_HW_PB: - break; /* there has to be more than this? */ - - case ADB_HW_CUDA: - via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5: - * outputs */ - via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */ - via_reg(VIA1, vACR) &= ~vSR_OUT; /* make sure SR is set - * to IN */ - via_reg(VIA1, vACR) = (via_reg(VIA1, vACR) | 0x0c) & ~0x10; - adbActionState = ADB_ACTION_IDLE; /* used by all types of - * hardware */ - adbBusState = ADB_BUS_IDLE; /* this var. used in II-series - * code only */ - via_reg(VIA1, vIER) = 0x84; /* make sure VIA interrupts - * are on */ - ADB_SET_STATE_IDLE_CUDA(); /* set ADB bus state to idle */ - break; - - case ADB_HW_UNKNOWN: /* if type unknown then skip out */ - default: - via_reg(VIA1, vIER) = 0x04; /* turn interrupts off - TO - * DO: turn PB ints off? */ - splx(s); - return; - } - /* - * Clear out any "leftover" commands. Remember that up until this - * point, the interrupt routine will be either off or it should be - * able to ignore inputs until the device table is built. + * Initialize the ADB table. For now, we'll always use the same table + * that is defined at the beginning of this file - no mallocs. */ - for (i = 0; i < 30; i++) { - delay(ADB_DELAY); - adb_cleanup(send_string); - printf_intr("adb: cleanup: "); - print_single(send_string); - delay(ADB_DELAY); - if (ADB_INTR_IS_OFF) - break; + for (i = 0; i < 16; i++) { + ADBDevTable[i].devType = 0; + ADBDevTable[i].origAddr = ADBDevTable[i].currentAddr = 0; } + adb_hw_setup(); /* init the VIA bits and hard reset ADB */ + + delay(1000); + /* send an ADB reset first */ - adb_op_sync((Ptr) 0, (Ptr) 0, (Ptr) 0, (short) 0x00); + (void)adb_op_sync((Ptr)0, (Ptr)0, (Ptr)0, (short)0x00); + delay(3000); - /* Probe for ADB devices. Probe devices 1-15 quickly to determine + /* + * Probe for ADB devices. Probe devices 1-15 quickly to determine * which device addresses are in use and which are free. For each * address that is in use, move the device at that address to a higher * free address. Continue doing this at that address until no device @@ -1765,25 +2053,31 @@ adb_reinit(void) * back to the original address. Do this for the remaining addresses * that we determined were in use. * - * When finished, do this entire process over again with the updated list - * of in use addresses. Do this until no new devices have been found - * in 20 passes though the in use address list. (This probably seems - * long and complicated, but it's the best way to detect multiple + * When finished, do this entire process over again with the updated + * list of in use addresses. Do this until no new devices have been + * found in 20 passes though the in use address list. (This probably + * seems long and complicated, but it's the best way to detect multiple * devices at the same address - sometimes it takes a couple of tries - * before the collision is detected.) */ + * before the collision is detected.) + */ /* initial scan through the devices */ for (i = 1; i < 16; i++) { - command = (int) (0x0f | ((int) (i & 0x000f) << 4)); /* talk R3 */ - result = adb_op_sync((Ptr) send_string, (Ptr) 0, (Ptr) 0, (short) command); - if (0x00 != send_string[0]) { /* anything come back ?? */ - ADBDevTable[++ADBNumDevices].devType = (u_char) send_string[2]; + command = ADBTALK(i, 3); + result = adb_op_sync((Ptr)send_string, (Ptr)0, + (Ptr)0, (short)command); + + if (result == 0 && send_string[0] != 0) { + /* found a device */ + ++ADBNumDevices; + KASSERT(ADBNumDevices < 16); + ADBDevTable[ADBNumDevices].devType = + (int)(send_string[2]); ADBDevTable[ADBNumDevices].origAddr = i; ADBDevTable[ADBNumDevices].currentAddr = i; - ADBDevTable[ADBNumDevices].DataAreaAddr = (long) 0; - ADBDevTable[ADBNumDevices].ServiceRtPtr = (void *) 0; - /* printf_intr("initial device found (at index %i)\n", - * ADBNumDevices); */ + ADBDevTable[ADBNumDevices].DataAreaAddr = + (long)0; + ADBDevTable[ADBNumDevices].ServiceRtPtr = (void *)0; pm_check_adb_devices(i); /* tell pm driver device * is here */ } @@ -1794,128 +2088,241 @@ adb_reinit(void) if (-1 == get_adb_info(&data, saveptr)) break; - if (saveptr == 0) /* no free addresses??? */ - saveptr = 15; - - /* printf_intr("first free is: 0x%02x\n", saveptr); */ - /* printf_intr("devices: %i\n", ADBNumDevices); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) { + printf_intr("first free is: 0x%02x\n", saveptr); + printf_intr("devices: %i\n", ADBNumDevices); + } +#endif nonewtimes = 0; /* no loops w/o new devices */ - while (nonewtimes++ < 11) { - for (i = 1; i <= ADBNumDevices; i++) { + while (saveptr > 0 && nonewtimes++ < 11) { + for (i = 1;saveptr > 0 && i <= ADBNumDevices; i++) { device = ADBDevTable[i].currentAddr; - /* printf_intr("moving device 0x%02x to 0x%02x (index - * 0x%02x) ", device, saveptr, i); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("moving device 0x%02x to 0x%02x " + "(index 0x%02x) ", device, saveptr, i); +#endif /* send TALK R3 to address */ - command = (int) (0x0f | ((int) (device & 0x000f) << 4)); - adb_op_sync((Ptr) send_string, (Ptr) 0, (Ptr) 0, (short) command); + command = ADBTALK(device, 3); + (void)adb_op_sync((Ptr)send_string, (Ptr)0, + (Ptr)0, (short)command); /* move device to higher address */ - command = (int) (0x0b | ((int) (device & 0x000f) << 4)); + command = ADBLISTEN(device, 3); send_string[0] = 2; - send_string[1] = (u_char) (saveptr | 0x60); + send_string[1] = (u_char)(saveptr | 0x60); send_string[2] = 0xfe; - adb_op_sync((Ptr) send_string, (Ptr) 0, (Ptr) 0, (short) command); + (void)adb_op_sync((Ptr)send_string, (Ptr)0, + (Ptr)0, (short)command); + delay(1000); + + /* send TALK R3 - anthing at new address? */ + command = ADBTALK(saveptr, 3); + send_string[0] = 0; + result = adb_op_sync((Ptr)send_string, (Ptr)0, + (Ptr)0, (short)command); + delay(1000); + + if (result != 0 || send_string[0] == 0) { + /* + * maybe there's a communication breakdown; + * just in case, move it back from whence it + * came, and we'll try again later + */ + command = ADBLISTEN(saveptr, 3); + send_string[0] = 2; + send_string[1] = (u_char)(device | 0x60); + send_string[2] = 0x00; + (void)adb_op_sync((Ptr)send_string, (Ptr)0, + (Ptr)0, (short)command); +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("failed, continuing\n"); +#endif + delay(1000); + continue; + } /* send TALK R3 - anything at old address? */ - command = (int) (0x0f | ((int) (device & 0x000f) << 4)); - result = adb_op_sync((Ptr) send_string, (Ptr) 0, (Ptr) 0, (short) command); - if (send_string[0] != 0) { + command = ADBTALK(device, 3); + send_string[0] = 0; + result = adb_op_sync((Ptr)send_string, (Ptr)0, + (Ptr)0, (short)command); + if (result == 0 && send_string[0] != 0) { /* new device found */ /* update data for previously moved device */ ADBDevTable[i].currentAddr = saveptr; - /* printf_intr("old device at index %i\n",i); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("old device at index %i\n",i); +#endif /* add new device in table */ - /* printf_intr("new device found\n"); */ - ADBDevTable[++ADBNumDevices].devType = (u_char) send_string[2]; +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("new device found\n"); +#endif + if (saveptr > ADBNumDevices) { + ++ADBNumDevices; + KASSERT(ADBNumDevices < 16); + } + ADBDevTable[ADBNumDevices].devType = + (int)(send_string[2]); ADBDevTable[ADBNumDevices].origAddr = device; ADBDevTable[ADBNumDevices].currentAddr = device; /* These will be set correctly in adbsys.c */ /* Until then, unsol. data will be ignored. */ - ADBDevTable[ADBNumDevices].DataAreaAddr = (long) 0; - ADBDevTable[ADBNumDevices].ServiceRtPtr = (void *) 0; + ADBDevTable[ADBNumDevices].DataAreaAddr = + (long)0; + ADBDevTable[ADBNumDevices].ServiceRtPtr = + (void *)0; /* find next unused address */ - for (x = saveptr; x > 0; x--) + for (x = saveptr; x > 0; x--) { if (-1 == get_adb_info(&data, x)) { saveptr = x; break; } - /* printf_intr("new free is 0x%02x\n", - * saveptr); */ + } + if (x == 0) + saveptr = 0; +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("new free is 0x%02x\n", + saveptr); +#endif nonewtimes = 0; /* tell pm driver device is here */ pm_check_adb_devices(device); } else { - /* printf_intr("moving back...\n"); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("moving back...\n"); +#endif /* move old device back */ - command = (int) (0x0b | ((int) (saveptr & 0x000f) << 4)); + command = ADBLISTEN(saveptr, 3); send_string[0] = 2; - send_string[1] = (u_char) (device | 0x60); + send_string[1] = (u_char)(device | 0x60); send_string[2] = 0xfe; - adb_op_sync((Ptr) send_string, (Ptr) 0, (Ptr) 0, (short) command); + (void)adb_op_sync((Ptr)send_string, (Ptr)0, + (Ptr)0, (short)command); + delay(1000); } } } -#ifdef DEBUG - for (i = 1; i <= ADBNumDevices; i++) { - x = get_ind_adb_info(&data, i); - if (x != -1) - printf_intr("index 0x%x, addr 0x%x, type 0x%x\n", i, x, data.devType); - +#ifdef ADB_DEBUG + if (adb_debug) { + for (i = 1; i <= ADBNumDevices; i++) { + x = get_ind_adb_info(&data, i); + if (x != -1) + printf_intr("index 0x%x, addr 0x%x, type 0x%hx\n", + i, x, data.devType); + } } #endif - adb_prog_switch_enable(); /* enable the programmer's switch, if - * we have one */ +#ifndef MRG_ADB + /* enable the programmer's switch, if we have one */ + adb_prog_switch_enable(); +#endif - if (0 == ADBNumDevices) /* tell user if no devices found */ - printf_intr("adb: no devices found\n"); +#ifdef ADB_DEBUG + if (adb_debug) { + if (0 == ADBNumDevices) /* tell user if no devices found */ + printf_intr("adb: no devices found\n"); + } +#endif adbStarting = 0; /* not starting anymore */ - printf_intr("adb: ADBReInit complete\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: ADBReInit complete\n"); +#endif - if (adbHardware != ADB_HW_PB) /* ints must be on for PB? */ + if (adbHardware == ADB_HW_CUDA) { + timeout_set(&adb_cuda_timeout, (void *)adb_cuda_tickle, NULL); + timeout_add(&adb_cuda_timeout, ADB_TICKLE_TICKS); + } + + /* ints must be on for PB & IOP (at least, for now) */ + if (adbHardware != ADB_HW_PB) splx(s); + return; } -/* adb_cmd_result - * This routine lets the caller know whether the specified adb command string should - * expect a returned result, such as a TALK command. +/* + * adb_comp_exec + * This is a general routine that calls the completion routine if there is one. + * NOTE: This routine is now only used by pm_direct.c + * All the code in this file (adb_direct.c) uses + * the adb_pass_up routine now. + */ +void +adb_comp_exec(void) +{ + if ((long)0 != adbCompRout) /* don't call if empty return location */ +#if defined(__NetBSD__) || defined(__OpenBSD__) + __asm __volatile( + " movml #0xffff,sp@- \n" /* save all registers */ + " movl %0,a2 \n" /* adbCompData */ + " movl %1,a1 \n" /* adbCompRout */ + " movl %2,a0 \n" /* adbBuffer */ + " movl %3,d0 \n" /* adbWaitingCmd */ + " jbsr a1@ \n" /* go call the routine */ + " movml sp@+,#0xffff" /* restore all registers */ + : + : "g"(adbCompData), "g"(adbCompRout), + "g"(adbBuffer), "g"(adbWaitingCmd) + : "d0", "a0", "a1", "a2"); +#else /* for Mac OS-based testing */ + asm { + movem.l a0/a1/a2/d0, -(a7) + move.l adbCompData, a2 + move.l adbCompRout, a1 + move.l adbBuffer, a0 + move.w adbWaitingCmd, d0 + jsr(a1) + movem.l(a7) +, d0/a2/a1/a0 + } +#endif +} + + +/* + * adb_cmd_result + * + * This routine lets the caller know whether the specified adb command string + * should expect a returned result, such as a TALK command. + * * returns: 0 if a result should be expected * 1 if a result should NOT be expected */ int -adb_cmd_result(u_char * in) +adb_cmd_result(u_char *in) { switch (adbHardware) { - case ADB_HW_II: + case ADB_HW_II: /* was it an ADB talk command? */ if ((in[1] & 0x0c) == 0x0c) return 0; - else - return 1; - break; + return 1; case ADB_HW_IISI: case ADB_HW_CUDA: - /* was is an ADB talk command? */ + /* was it an ADB talk command? */ if ((in[1] == 0x00) && ((in[2] & 0x0c) == 0x0c)) return 0; - /* was is an RTC/PRAM read date/time? */ - else - if ((in[1] == 0x01) && (in[2] == 0x03)) - return 0; - else - return 1; - break; + /* was it an RTC/PRAM read date/time? */ + if ((in[1] == 0x01) && (in[2] == 0x03)) + return 0; + return 1; case ADB_HW_PB: return 1; - break; case ADB_HW_UNKNOWN: default: @@ -1924,36 +2331,37 @@ adb_cmd_result(u_char * in) } -/* adb_cmd_extra - * This routine lets the caller know whether the specified adb command string may have - * extra data appended to the end of it, such as a LISTEN command. +/* + * adb_cmd_extra + * + * This routine lets the caller know whether the specified adb command string + * may have extra data appended to the end of it, such as a LISTEN command. + * * returns: 0 if extra data is allowed * 1 if extra data is NOT allowed */ int -adb_cmd_extra(u_char * in) +adb_cmd_extra(u_char *in) { switch (adbHardware) { - case ADB_HW_II: + case ADB_HW_II: if ((in[1] & 0x0c) == 0x08) /* was it a listen command? */ return 0; - else - return 1; - break; + return 1; case ADB_HW_IISI: case ADB_HW_CUDA: - /* TO DO: support needs to be added to recognize RTC and PRAM - * commands */ + /* + * TO DO: support needs to be added to recognize RTC and PRAM + * commands + */ if ((in[2] & 0x0c) == 0x08) /* was it a listen command? */ return 0; - else /* add others later */ - return 1; - break; + /* add others later */ + return 1; case ADB_HW_PB: return 1; - break; case ADB_HW_UNKNOWN: default: @@ -1962,41 +2370,6 @@ adb_cmd_extra(u_char * in) } -/* adb_op_sync - * This routine does exactly what the adb_op routine does, except that after the - * adb_op is called, it waits until the return value is present before returning - */ -int -adb_op_sync(Ptr buffer, Ptr compRout, Ptr data, short command) -{ - int result; - volatile int flag = 0; - - result = adb_op(buffer, (void *) adb_op_comprout, - (void *) &flag, command); /* send command */ - if (result == 0) { /* send ok? */ - while (0 == flag); /* wait for compl. routine */ - return 0; - } else - return result; -} - - -/* adb_op_comprout - * This function is used by the adb_op_sync routine so it knows when the function is - * done. - */ -void -adb_op_comprout(void) -{ -#if defined(__NetBSD__) || defined(__OpenBSD__) - asm("movw #1,a2@ | update flag value"); -#else /* for macos based testing */ - asm { - move.w #1,(a2) } /* update flag value */ -#endif -} - void adb_setup_hw_type(void) { @@ -2004,75 +2377,127 @@ adb_setup_hw_type(void) response = mac68k_machine.machineid; + /* + * Determine what type of ADB hardware we are running on. + */ switch (response) { - case 6: /* II */ - case 7: /* IIx */ - case 8: /* IIcx */ - case 9: /* SE/30 */ - case 11: /* IIci */ - case 22: /* Quadra 700 */ - case 30: /* Centris 650 */ - case 35: /* Quadra 800 */ - case 36: /* Quadra 650 */ - case 52: /* Centris 610 */ - case 53: /* Quadra 610 */ + case MACH_MACC610: /* Centris 610 */ + case MACH_MACC650: /* Centris 650 */ + case MACH_MACII: /* II */ + case MACH_MACIICI: /* IIci */ + case MACH_MACIICX: /* IIcx */ + case MACH_MACIIX: /* IIx */ + case MACH_MACQ610: /* Quadra 610 */ + case MACH_MACQ650: /* Quadra 650 */ + case MACH_MACQ700: /* Quadra 700 */ + case MACH_MACQ800: /* Quadra 800 */ + case MACH_MACSE30: /* SE/30 */ adbHardware = ADB_HW_II; - printf_intr("adb: using II series hardware support\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: using II series hardware support\n"); +#endif break; - case 18: /* IIsi */ - case 20: /* Quadra 900 - not sure if IIsi or not */ - case 23: /* Classic II */ - case 26: /* Quadra 950 - not sure if IIsi or not */ - case 27: /* LC III, Performa 450 */ - case 37: /* LC II, Performa 400/405/430 */ - case 44: /* IIvi */ - case 45: /* Performa 600 */ - case 48: /* IIvx */ - case 49: /* Color Classic - not sure if IIsi or not */ - case 62: /* Performa 460/465/467 */ - case 83: /* Color Classic II - not sure if IIsi or not */ + + case MACH_MACCLASSICII: /* Classic II */ + case MACH_MACLCII: /* LC II, Performa 400/405/430 */ + case MACH_MACLCIII: /* LC III, Performa 450 */ + case MACH_MACIISI: /* IIsi */ + case MACH_MACIIVI: /* IIvi */ + case MACH_MACIIVX: /* IIvx */ + case MACH_MACP460: /* Performa 460/465/467 */ + case MACH_MACP600: /* Performa 600 */ adbHardware = ADB_HW_IISI; - printf_intr("adb: using IIsi series hardware support\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: using IIsi series hardware support\n"); +#endif break; - case 21: /* PowerBook 170 */ - case 25: /* PowerBook 140 */ - case 54: /* PowerBook 145 */ - case 34: /* PowerBook 160 */ - case 84: /* PowerBook 165 */ - case 50: /* PowerBook 165c */ - case 33: /* PowerBook 180 */ - case 71: /* PowerBook 180c */ - case 115: /* PowerBook 150 */ + + case MACH_MACPB140: /* PowerBook 140 */ + case MACH_MACPB145: /* PowerBook 145 */ + case MACH_MACPB160: /* PowerBook 160 */ + case MACH_MACPB165: /* PowerBook 165 */ + case MACH_MACPB165C: /* PowerBook 165c */ + case MACH_MACPB170: /* PowerBook 170 */ + case MACH_MACPB180: /* PowerBook 180 */ + case MACH_MACPB180C: /* PowerBook 180c */ adbHardware = ADB_HW_PB; pm_setup_adb(); - printf_intr("adb: using PowerBook 100-series hardware support\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: using PowerBook 100-series hardware support\n"); +#endif break; - case 29: /* PowerBook Duo 210 */ - case 32: /* PowerBook Duo 230 */ - case 38: /* PowerBook Duo 250 */ - case 72: /* PowerBook 500 series */ - case 77: /* PowerBook Duo 270 */ - case 102: /* PowerBook Duo 280 */ - case 103: /* PowerBook Duo 280c */ + + case MACH_MACPB150: /* PowerBook 150 */ + case MACH_MACPB210: /* PowerBook Duo 210 */ + case MACH_MACPB230: /* PowerBook Duo 230 */ + case MACH_MACPB250: /* PowerBook Duo 250 */ + case MACH_MACPB270: /* PowerBook Duo 270 */ + case MACH_MACPB280: /* PowerBook Duo 280 */ + case MACH_MACPB280C: /* PowerBook Duo 280c */ + case MACH_MACPB500: /* PowerBook 500 series */ + case MACH_MACPB190: /* PowerBook 190 */ + case MACH_MACPB190CS: /* PowerBook 190cs */ adbHardware = ADB_HW_PB; pm_setup_adb(); - printf_intr("adb: using PowerBook Duo-series and PowerBook 500-series hardware support\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: using PowerBook Duo-series and PowerBook 500-series hardware support\n"); +#endif break; - case 56: /* LC 520 */ - case 60: /* Centris 660AV */ - case 78: /* Quadra 840AV */ - case 80: /* LC 550, Performa 550 */ - case 89: /* LC 475, Performa 475/476 */ - case 92: /* LC 575, Performa 575/577/578 */ - case 94: /* Quadra 605 */ - case 98: /* LC 630, Performa 630, Quadra 630 */ + + case MACH_MACC660AV: /* Centris 660AV */ + case MACH_MACCCLASSIC: /* Color Classic */ + case MACH_MACCCLASSICII: /* Color Classic II */ + case MACH_MACLC475: /* LC 475, Performa 475/476 */ + case MACH_MACLC475_33: /* Clock-chipped 47x */ + case MACH_MACLC520: /* LC 520 */ + case MACH_MACLC575: /* LC 575, Performa 575/577/578 */ + case MACH_MACP550: /* LC 550, Performa 550 */ + case MACH_MACTV: /* Macintosh TV */ + case MACH_MACP580: /* Performa 580/588 */ + case MACH_MACQ605: /* Quadra 605 */ + case MACH_MACQ605_33: /* Clock-chipped Quadra 605 */ + case MACH_MACQ630: /* LC 630, Performa 630, Quadra 630 */ + case MACH_MACQ840AV: /* Quadra 840AV */ adbHardware = ADB_HW_CUDA; - printf_intr("adb: using Cuda series hardware support\n"); +#ifdef ADB_DEBUG + if (adb_debug) + printf_intr("adb: using Cuda series hardware support\n"); +#endif break; + default: adbHardware = ADB_HW_UNKNOWN; - printf_intr("adb: hardware type unknown for this machine\n"); - printf_intr("adb: ADB support is disabled\n"); +#ifdef ADB_DEBUG + if (adb_debug) { + printf_intr("adb: hardware type unknown for this machine\n"); + printf_intr("adb: ADB support is disabled\n"); + } +#endif + break; + } + + /* + * Determine whether this machine has ADB based soft power. + */ + switch (response) { + case MACH_MACCCLASSIC: /* Color Classic */ + case MACH_MACCCLASSICII: /* Color Classic II */ + case MACH_MACIISI: /* IIsi */ + case MACH_MACIIVI: /* IIvi */ + case MACH_MACIIVX: /* IIvx */ + case MACH_MACLC520: /* LC 520 */ + case MACH_MACLC575: /* LC 575, Performa 575/577/578 */ + case MACH_MACP550: /* LC 550, Performa 550 */ + case MACH_MACTV: /* Macintosh TV */ + case MACH_MACP580: /* Performa 580/588 */ + case MACH_MACP600: /* Performa 600 */ + case MACH_MACQ630: /* LC 630, Performa 630, Quadra 630 */ + case MACH_MACQ840AV: /* Quadra 840AV */ + adbSoftPower = 1; break; } } @@ -2086,33 +2511,36 @@ count_adbs(void) found = 0; for (i = 1; i < 16; i++) - if (0 != ADBDevTable[i].devType) + if (0 != ADBDevTable[i].currentAddr) found++; return found; } int -get_ind_adb_info(ADBDataBlock * info, int index) +get_ind_adb_info(ADBDataBlock *info, int index) { if ((index < 1) || (index > 15)) /* check range 1-15 */ return (-1); - /* printf_intr("index 0x%x devType is: 0x%x\n", index, - ADBDevTable[index].devType); */ +#ifdef ADB_DEBUG + if (adb_debug & 0x80) + printf_intr("index 0x%x devType is: 0x%x\n", index, + ADBDevTable[index].devType); +#endif if (0 == ADBDevTable[index].devType) /* make sure it's a valid entry */ return (-1); - info->devType = ADBDevTable[index].devType; - info->origADBAddr = ADBDevTable[index].origAddr; - info->dbServiceRtPtr = (Ptr) ADBDevTable[index].ServiceRtPtr; - info->dbDataAreaAddr = (Ptr) ADBDevTable[index].DataAreaAddr; + info->devType = (unsigned char)(ADBDevTable[index].devType); + info->origADBAddr = (unsigned char)(ADBDevTable[index].origAddr); + info->dbServiceRtPtr = (Ptr)ADBDevTable[index].ServiceRtPtr; + info->dbDataAreaAddr = (Ptr)ADBDevTable[index].DataAreaAddr; return (ADBDevTable[index].currentAddr); } int -get_adb_info(ADBDataBlock * info, int adbAddr) +get_adb_info(ADBDataBlock *info, int adbAddr) { int i; @@ -2121,8 +2549,8 @@ get_adb_info(ADBDataBlock * info, int adbAddr) for (i = 1; i < 15; i++) if (ADBDevTable[i].currentAddr == adbAddr) { - info->devType = ADBDevTable[i].devType; - info->origADBAddr = ADBDevTable[i].origAddr; + info->devType = (unsigned char)(ADBDevTable[i].devType); + info->origADBAddr = (unsigned char)(ADBDevTable[i].origAddr); info->dbServiceRtPtr = (Ptr)ADBDevTable[i].ServiceRtPtr; info->dbDataAreaAddr = ADBDevTable[i].DataAreaAddr; return 0; /* found */ @@ -2132,7 +2560,7 @@ get_adb_info(ADBDataBlock * info, int adbAddr) } int -set_adb_info(ADBSetInfoBlock * info, int adbAddr) +set_adb_info(ADBSetInfoBlock *info, int adbAddr) { int i; @@ -2155,24 +2583,23 @@ set_adb_info(ADBSetInfoBlock * info, int adbAddr) int mrg_adbintr(void) { - adb_intr(); + adb_intr(NULL); return 1; /* mimic mrg_adbintr in macrom.h just in case */ } int -mrg_pmintr(void) /* we don't do this yet */ +mrg_pmintr(void) { - pm_intr(); + pm_intr(NULL); return 1; /* mimic mrg_pmintr in macrom.h just in case */ } -#endif -/* caller should really use machine-independent version: getPramTime */ +/* caller should really use machine-independant version: getPramTime */ /* this version does pseudo-adb access only */ int adb_read_date_time(unsigned long *time) { - u_char output[MAX_ADB_MSG_LENGTH]; + u_char output[ADB_MAX_MSG_LENGTH]; int result; volatile int flag = 0; @@ -2184,16 +2611,15 @@ adb_read_date_time(unsigned long *time) output[0] = 0x02; /* 2 byte message */ output[1] = 0x01; /* to pram/rtc device */ output[2] = 0x03; /* read date/time */ - result = send_adb_IIsi((u_char *) output, - (u_char *) output, (void *) adb_op_comprout, - (int *) &flag, (int) 0); + result = send_adb_IIsi((u_char *)output, (u_char *)output, + (void *)adb_op_comprout, (void *)&flag, (int)0); if (result != 0) /* exit if not sent */ return -1; while (0 == flag) /* wait for result */ ; - *time = (long) (*(long *) (output + 1)); + *time = (long)(*(long *)(output + 1)); return 0; case ADB_HW_PB: @@ -2203,16 +2629,15 @@ adb_read_date_time(unsigned long *time) output[0] = 0x02; /* 2 byte message */ output[1] = 0x01; /* to pram/rtc device */ output[2] = 0x03; /* read date/time */ - result = send_adb_cuda((u_char *) output, - (u_char *) output, (void *) adb_op_comprout, - (void *) &flag, (int) 0); + result = send_adb_cuda((u_char *)output, (u_char *)output, + (void *)adb_op_comprout, (void *)&flag, (int)0); if (result != 0) /* exit if not sent */ return -1; while (0 == flag) /* wait for result */ ; - *time = (long) (*(long *) (output + 1)); + *time = (long)(*(long *)(output + 1)); return 0; case ADB_HW_UNKNOWN: @@ -2221,12 +2646,12 @@ adb_read_date_time(unsigned long *time) } } -/* caller should really use machine-independent version: setPramTime */ +/* caller should really use machine-independant version: setPramTime */ /* this version does pseudo-adb access only */ int adb_set_date_time(unsigned long time) { - u_char output[MAX_ADB_MSG_LENGTH]; + u_char output[ADB_MAX_MSG_LENGTH]; int result; volatile int flag = 0; @@ -2238,13 +2663,12 @@ adb_set_date_time(unsigned long time) output[0] = 0x06; /* 6 byte message */ output[1] = 0x01; /* to pram/rtc device */ output[2] = 0x09; /* set date/time */ - output[3] = (u_char) (time >> 24); - output[4] = (u_char) (time >> 16); - output[5] = (u_char) (time >> 8); - output[6] = (u_char) (time); - result = send_adb_IIsi((u_char *) output, - (u_char *) 0, (void *) adb_op_comprout, - (void *) &flag, (int) 0); + output[3] = (u_char)(time >> 24); + output[4] = (u_char)(time >> 16); + output[5] = (u_char)(time >> 8); + output[6] = (u_char)(time); + result = send_adb_IIsi((u_char *)output, (u_char *)0, + (void *)adb_op_comprout, (void *)&flag, (int)0); if (result != 0) /* exit if not sent */ return -1; @@ -2260,13 +2684,12 @@ adb_set_date_time(unsigned long time) output[0] = 0x06; /* 6 byte message */ output[1] = 0x01; /* to pram/rtc device */ output[2] = 0x09; /* set date/time */ - output[3] = (u_char) (time >> 24); - output[4] = (u_char) (time >> 16); - output[5] = (u_char) (time >> 8); - output[6] = (u_char) (time); - result = send_adb_cuda((u_char *) output, - (u_char *) 0, (void *) adb_op_comprout, - (void *) &flag, (int) 0); + output[3] = (u_char)(time >> 24); + output[4] = (u_char)(time >> 16); + output[5] = (u_char)(time >> 8); + output[6] = (u_char)(time); + result = send_adb_cuda((u_char *)output, (u_char *)0, + (void *)adb_op_comprout, (void *)&flag, (int)0); if (result != 0) /* exit if not sent */ return -1; @@ -2285,16 +2708,21 @@ adb_set_date_time(unsigned long time) int adb_poweroff(void) { - u_char output[MAX_ADB_MSG_LENGTH]; + u_char output[ADB_MAX_MSG_LENGTH]; int result; + if (!adbSoftPower) + return -1; + + adb_polling = 1; + switch (adbHardware) { case ADB_HW_IISI: output[0] = 0x02; /* 2 byte message */ output[1] = 0x01; /* to pram/rtc/soft-power device */ output[2] = 0x0a; /* set date/time */ - result = send_adb_IIsi((u_char *) output, - (u_char *) 0, (void *) 0, (void *) 0, (int) 0); + result = send_adb_IIsi((u_char *)output, (u_char *)0, + (void *)0, (void *)0, (int)0); if (result != 0) /* exit if not sent */ return -1; @@ -2305,9 +2733,20 @@ adb_poweroff(void) case ADB_HW_PB: return -1; - /* TO DO: some cuda models claim to do soft power - check out */ - case ADB_HW_II: /* II models don't do soft power */ - case ADB_HW_CUDA: /* cuda doesn't do soft power */ + case ADB_HW_CUDA: + output[0] = 0x02; /* 2 byte message */ + output[1] = 0x01; /* to pram/rtc/soft-power device */ + output[2] = 0x0a; /* set date/time */ + result = send_adb_cuda((u_char *)output, (u_char *)0, + (void *)0, (void *)0, (int)0); + if (result != 0) /* exit if not sent */ + return -1; + + for (;;); /* wait for power off */ + + return 0; + + case ADB_HW_II: /* II models don't do ADB soft power */ case ADB_HW_UNKNOWN: default: return -1; @@ -2317,7 +2756,7 @@ adb_poweroff(void) int adb_prog_switch_enable(void) { - u_char output[MAX_ADB_MSG_LENGTH]; + u_char output[ADB_MAX_MSG_LENGTH]; int result; volatile int flag = 0; @@ -2327,9 +2766,8 @@ adb_prog_switch_enable(void) output[1] = 0x01; /* to pram/rtc/soft-power device */ output[2] = 0x1c; /* prog. switch control */ output[3] = 0x01; /* enable */ - result = send_adb_IIsi((u_char *) output, - (u_char *) 0, (void *) adb_op_comprout, - (void *) &flag, (int) 0); + result = send_adb_IIsi((u_char *)output, (u_char *)0, + (void *)adb_op_comprout, (void *)&flag, (int)0); if (result != 0) /* exit if not sent */ return -1; @@ -2352,7 +2790,7 @@ adb_prog_switch_enable(void) int adb_prog_switch_disable(void) { - u_char output[MAX_ADB_MSG_LENGTH]; + u_char output[ADB_MAX_MSG_LENGTH]; int result; volatile int flag = 0; @@ -2362,9 +2800,8 @@ adb_prog_switch_disable(void) output[1] = 0x01; /* to pram/rtc/soft-power device */ output[2] = 0x1c; /* prog. switch control */ output[3] = 0x01; /* disable */ - result = send_adb_IIsi((u_char *) output, - (u_char *) 0, (void *) adb_op_comprout, - (void *) &flag, (int) 0); + result = send_adb_IIsi((u_char *)output, (u_char *)0, + (void *)adb_op_comprout, (void *)&flag, (int)0); if (result != 0) /* exit if not sent */ return -1; @@ -2384,8 +2821,6 @@ adb_prog_switch_disable(void) } } -#ifndef MRG_ADB - int CountADBs(void) { @@ -2399,19 +2834,19 @@ ADBReInit(void) } int -GetIndADB(ADBDataBlock * info, int index) +GetIndADB(ADBDataBlock *info, int index) { return (get_ind_adb_info(info, index)); } int -GetADBInfo(ADBDataBlock * info, int adbAddr) +GetADBInfo(ADBDataBlock *info, int adbAddr) { return (get_adb_info(info, adbAddr)); } int -SetADBInfo(ADBSetInfoBlock * info, int adbAddr) +SetADBInfo(ADBSetInfoBlock *info, int adbAddr) { return (set_adb_info(info, adbAddr)); } @@ -2423,4 +2858,3 @@ ADBOp(Ptr buffer, Ptr compRout, Ptr data, short commandNum) } #endif - diff --git a/sys/arch/mac68k/dev/adbsys.c b/sys/arch/mac68k/dev/adbsys.c deleted file mode 100644 index 78bbead2ba5..00000000000 --- a/sys/arch/mac68k/dev/adbsys.c +++ /dev/null @@ -1,315 +0,0 @@ -/* $OpenBSD: adbsys.c,v 1.11 2002/03/14 01:26:35 millert Exp $ */ -/* $NetBSD: adbsys.c,v 1.24 1997/01/13 07:01:23 scottr Exp $ */ - -/*- - * Copyright (C) 1994 Bradley A. Grantham - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bradley A. Grantham. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/systm.h> - -#include <machine/cpu.h> -#include <machine/viareg.h> - -#include <arch/mac68k/mac68k/macrom.h> -#include <arch/mac68k/dev/adbvar.h> - -extern struct mac68k_machine_S mac68k_machine; - -/* from adb.c */ -void adb_processevent(adb_event_t * event); - -extern void adb_jadbproc(void); - -void -adb_complete(buffer, data_area, adb_command) - caddr_t buffer; - caddr_t data_area; - int adb_command; -{ - adb_event_t event; - ADBDataBlock adbdata; - int adbaddr; - int error; -#ifdef MRG_DEBUG - register int i; - - printf("adb: transaction completion\n"); -#endif - - adbaddr = (adb_command & 0xf0) >> 4; - error = GetADBInfo(&adbdata, adbaddr); -#ifdef MRG_DEBUG - printf("adb: GetADBInfo returned %d\n", error); -#endif - - event.addr = adbaddr; - event.hand_id = adbdata.devType; - event.def_addr = adbdata.origADBAddr; - event.byte_count = buffer[0]; - memcpy(event.bytes, buffer + 1, event.byte_count); - -#ifdef MRG_DEBUG - printf("adb: from %d at %d (org %d) %d:", event.addr, - event.hand_id, event.def_addr, buffer[0]); - for (i = 1; i <= buffer[0]; i++) - printf(" %x", buffer[i]); - printf("\n"); -#endif - - microtime(&event.timestamp); - - adb_processevent(&event); -} - -static volatile int extdms_done; - -/* - * initialize extended mouse - probes devices as - * described in _Inside Macintosh, Devices_. - */ -void -extdms_init(totaladbs) - int totaladbs; -{ - ADBDataBlock adbdata; - int adbindex, adbaddr; - short cmd; - char buffer[9]; - - for (adbindex = 1; adbindex <= totaladbs; adbindex++) { - /* Get the ADB information */ - adbaddr = GetIndADB(&adbdata, adbindex); - if (adbdata.origADBAddr == ADBADDR_MS && - (adbdata.devType == ADBMS_USPEED)) { - /* Found MicroSpeed Mouse Deluxe Mac */ - cmd = ((adbaddr<<4)&0xF0)|0x9; /* listen 1 */ - - /* - * To setup the MicroSpeed, it appears that we can - * send the following command to the mouse and then - * expect data back in the form: - * buffer[0] = 4 (bytes) - * buffer[1], buffer[2] as std. mouse - * buffer[3] = buffer[4] = 0xff when no buttons - * are down. When button N down, bit N is clear. - * buffer[4]'s locking mask enables a - * click to toggle the button down state--sort of - * like the "Easy Access" shift/control/etc. keys. - * buffer[3]'s alternative speed mask enables using - * different speed when the corr. button is down - */ - buffer[0] = 4; - buffer[1] = 0x00; /* Alternative speed */ - buffer[2] = 0x00; /* speed = maximum */ - buffer[3] = 0x10; /* enable extended protocol, - * lower bits = alt. speed mask - * = 0000b - */ - buffer[4] = 0x07; /* Locking mask = 0000b, - * enable buttons = 0111b - */ - extdms_done = 0; - ADBOp((Ptr)buffer, (Ptr)extdms_complete, - (Ptr)&extdms_done, cmd); - while (!extdms_done) - /* busy wait until done */; - } - if (adbdata.origADBAddr == ADBADDR_MS && - ( adbdata.devType == ADBMS_100DPI - || adbdata.devType == ADBMS_200DPI)) { - /* found a mouse */ - cmd = ((adbaddr << 4) & 0xf0) | 0x3; - - extdms_done = 0; - cmd = (cmd & 0xf3) | 0x0c; /* talk command */ - ADBOp((Ptr)buffer, (Ptr)extdms_complete, - (Ptr)&extdms_done, cmd); - while (!extdms_done) - /* busy wait until done */; - - buffer[2] = '\004'; /* make handler ID 4 */ - extdms_done = 0; - cmd = (cmd & 0xf3) | 0x08; /* listen command */ - ADBOp((Ptr)buffer, (Ptr)extdms_complete, - (Ptr)&extdms_done, cmd); - while (!extdms_done) - /* busy wait until done */; - } - } -} - -void -adb_init() -{ - ADBDataBlock adbdata; - ADBSetInfoBlock adbinfo; - int totaladbs; - int adbindex, adbaddr; - int error; - char buffer[9]; - -#ifdef DISABLE_ADB_WHEN_SERIAL_CONSOLE - if ((mac68k_machine.serial_console & 0x03)) { - printf("adb: using serial console\n"); - return; - } -#endif - -#ifdef MRG_ADB /* We don't care about ADB ROM driver if we - * aren't using the MRG_ADB method for - * ADB/PRAM/RTC. */ - if (!mrg_romready()) { - printf("adb: no ROM ADB driver in this kernel for this machine\n"); - return; - } -#endif - printf("adb: bus subsystem\n"); -#ifdef MRG_DEBUG - printf("adb: call mrg_initadbintr\n"); -#endif - - mrg_initadbintr(); /* Mac ROM Glue okay to do ROM intr */ -#ifdef MRG_DEBUG - printf("adb: returned from mrg_initadbintr\n"); -#endif - - /* ADBReInit pre/post-processing */ - JADBProc = adb_jadbproc; - - /* - * Initialize ADB - * - * If not using MRG_ADB method to access ADB, then call - * ADBReInit directly. Otherwise use ADB AlternateInit() - */ -#ifndef MRG_ADB - printf("adb: calling ADBReInit\n"); - ADBReInit(); -#else -#ifdef MRG_DEBUG - printf("adb: calling ADBAlternateInit.\n"); -#endif - ADBAlternateInit(); -#endif - -#ifdef MRG_DEBUG - printf("adb: done with ADBReInit\n"); -#endif - - totaladbs = CountADBs(); - extdms_init(totaladbs); - - /* for each ADB device */ - for (adbindex = 1; adbindex <= totaladbs; adbindex++) { - /* Get the ADB information */ - adbaddr = GetIndADB(&adbdata, adbindex); - - /* Print out the glory */ - printf("adb: "); - switch (adbdata.origADBAddr) { - case ADBADDR_MAP: - switch (adbdata.devType) { - case ADB_STDKBD: - printf("keyboard"); - break; - case ADB_EXTKBD: - printf("extended keyboard"); - break; - case ADB_PBKBD: - printf("PowerBook keyboard"); - break; - default: - printf("mapped device (%d)", - adbdata.devType); - break; - } - break; - case ADBADDR_REL: - extdms_done = 0; - /* talk register 3 */ - ADBOp((Ptr)buffer, (Ptr)extdms_complete, - (Ptr)&extdms_done, (adbaddr << 4) | 0xf); - while (!extdms_done) - /* busy-wait until done */; - switch (buffer[2]) { - case ADBMS_100DPI: - printf("100 dpi mouse"); - break; - case ADBMS_200DPI: - printf("200 dpi mouse"); - break; - case ADBMS_USPEED: - printf("MicroSpeed mouse, default parameters"); - break; - case ADBMS_EXTENDED: - extdms_done = 0; - /* talk register 1 */ - ADBOp((Ptr)buffer, (Ptr)extdms_complete, - (Ptr)&extdms_done, - (adbaddr << 4) | 0xd); - while (!extdms_done) - /* busy-wait until done */; - printf("extended mouse " - "<%c%c%c%c> %d-button %d dpi ", - buffer[1], buffer[2], - buffer[3], buffer[4], - (int)buffer[8], - (int)*(short *)&buffer[5]); - if (buffer[7] == 1) - printf("mouse"); - else if (buffer[7] == 2) - printf("trackball"); - else - printf("unknown device"); - break; - default: - printf("relative positioning device (mouse?) (%d)", adbdata.devType); - break; - } - break; - case ADBADDR_ABS: - printf("absolute positioning device (tablet?) (%d)", adbdata.devType); - break; - default: - printf("unknown type device, (def %d, handler %d)", adbdata.origADBAddr, - adbdata.devType); - break; - } - printf(" at %d\n", adbaddr); - - /* Set completion routine to be MacBSD's */ - adbinfo.siServiceRtPtr = (Ptr) adb_asmcomplete; - adbinfo.siDataAreaAddr = NULL; - error = SetADBInfo(&adbinfo, adbaddr); -#ifdef MRG_DEBUG - printf("returned %d from SetADBInfo\n", error); -#endif - } -} diff --git a/sys/arch/mac68k/dev/adbsysasm.s b/sys/arch/mac68k/dev/adbsysasm.s index 478e52a0db3..c5a78df8867 100644 --- a/sys/arch/mac68k/dev/adbsysasm.s +++ b/sys/arch/mac68k/dev/adbsysasm.s @@ -1,5 +1,5 @@ -/* $OpenBSD: adbsysasm.s,v 1.2 1996/05/26 18:35:16 briggs Exp $ */ -/* $NetBSD: adbsysasm.s,v 1.2 1995/09/03 20:59:56 briggs Exp $ */ +/* $OpenBSD: adbsysasm.s,v 1.3 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: adbsysasm.s,v 1.11 2001/11/20 03:19:42 chs Exp $ */ /*- * Copyright (C) 1994 Bradley A. Grantham @@ -31,44 +31,62 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "akbd.h" +#include "ams.h" +#include <machine/asm.h> + /* * ADB subsystem routines in assembly */ -/* This routine is called when a device has sent us some data. */ +#if NAKBD > 0 +/* This routine is called when a keyboard has sent us some data. */ +/* (provided it has been set up with SetADBInfo) */ +GLOBAL(adb_kbd_asmcomplete) + moveml #0x80e0,sp@- | save scratch regs + movl d0,sp@- /* ADB command byte */ + movl a2,sp@- /* data area pointer */ + /* a1 is the pointer to this routine itself. */ + movl a0,sp@- /* device data buffer */ + jbsr _C_LABEL(kbd_adbcomplete) + addl #12,sp /* pop params */ + moveml sp@+,#0x0701 | restore scratch regs + rts +#endif + +#if NAMS > 0 +/* This routine is called when a mouse has sent us some data. */ /* (provided it has been set up with SetADBInfo) */ - .global _adb_asmcomplete - .global _adb_complete -_adb_asmcomplete: - moveml #0xc0c0, sp@- | save scratch regs - movl d0, sp@- /* ADB command byte */ - movl a2, sp@- /* data area pointer */ +GLOBAL(adb_ms_asmcomplete) + moveml #0x80e0,sp@- | save scratch regs + movl d0,sp@- /* ADB command byte */ + movl a2,sp@- /* data area pointer */ /* a1 is the pointer to this routine itself. */ - movl a0, sp@- /* device data buffer */ - jbsr _adb_complete - addl #12, sp /* pop params */ - moveml sp@+, #0x0303 | restore scratch regs + movl a0,sp@- /* device data buffer */ + jbsr _C_LABEL(ms_adbcomplete) + addl #12,sp /* pop params */ + moveml sp@+,#0x0701 | restore scratch regs rts +#endif + +#ifdef MRG_ADB -_adb_jadbprochello: +#if defined(ADB_DEBUG) && 0 +GLOBAL(adb_jadbprochello) .asciz "adb: hello from adbproc\n" .even +#endif - .global _adb_jadbproc -_adb_jadbproc: -#if defined(MRG_DEBUG) && 0 - moveml #0xc0c0, sp@- | save scratch regs - movl _adb_jadbprochello, sp@- - jbsr _printf - addl #4, sp /* pop params */ - moveml sp@+, #0x0303 | restore scratch regs +GLOBAL(adb_jadbproc) +#if defined(ADB_DEBUG) && 0 + moveml #0xc0c0,sp@- | save scratch regs + movl _C_LABEL(adb_jadbprochello),sp@- + jbsr _C_LABEL(printf) + addl #4,sp /* pop params */ + moveml sp@+,#0x0303 | restore scratch regs #endif - /* Don't do anything; adb_init fixes dev info for us. */ + /* Don't do anything; adbattach fixes dev info for us. */ rts - /* ADBOp's completion routine used by extdms_init() in adbsys.c. */ - .global _extdms_complete -_extdms_complete: - movl #-1,a2@ | set done flag - rts +#endif /* MRG_ADB */ diff --git a/sys/arch/mac68k/dev/adbvar.h b/sys/arch/mac68k/dev/adbvar.h index 67e40f1fcbd..e06099a3765 100644 --- a/sys/arch/mac68k/dev/adbvar.h +++ b/sys/arch/mac68k/dev/adbvar.h @@ -1,7 +1,7 @@ -/* $OpenBSD: adbvar.h,v 1.8 2003/09/23 16:51:11 millert Exp $ */ -/* $NetBSD: adbvar.h,v 1.5 1997/01/13 07:01:24 scottr Exp $ */ +/* $OpenBSD: adbvar.h,v 1.9 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: adbvar.h,v 1.22 2005/01/15 16:00:59 chs Exp $ */ -/*- +/* * Copyright (C) 1994 Bradley A. Grantham * All rights reserved. * @@ -31,60 +31,60 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <mac68k/mac68k/macrom.h> #include <machine/adbsys.h> -#define ADB_MAXTRACE (NBPG / sizeof(int) - 1) -extern int adb_traceq[ADB_MAXTRACE]; -extern int adb_traceq_tail; -extern int adb_traceq_len; - -typedef struct adb_trace_xlate_s { - int params; - char *string; -} adb_trace_xlate_t; +/* + * Arguments used to attach a device to the Apple Desktop Bus + */ +struct adb_attach_args { + int origaddr; + int adbaddr; + int handler_id; +}; -extern adb_trace_xlate_t adb_trace_xlations[]; +extern int adb_polling; -/* adb.c */ -void adb_asmcomplete(void); -void adb_enqevent(adb_event_t *event); -void adb_handoff(adb_event_t *event); -void adb_autorepeat(void *keyp); -void adb_dokeyupdown(adb_event_t *event); -void adb_keymaybemouse(adb_event_t *event); -void adb_processevent(adb_event_t *event); -int adbopen(dev_t dev, int flag, int mode, struct proc *p); -int adbclose(dev_t dev, int flag, int mode, struct proc *p); -int adbread(dev_t dev, struct uio *uio, int flag); -int adbwrite(dev_t dev, struct uio *uio, int flag); -int adbioctl(dev_t , int , caddr_t , int , struct proc *); -int adbpoll(dev_t dev, int rw, struct proc *p); +#ifdef DEBUG +#ifndef ADB_DEBUG +#define ADB_DEBUG +#endif +#endif -/* adbsysadm.s */ -void extdms_complete(void); +#ifdef ADB_DEBUG +extern int adb_debug; +#endif -/* adbsys.c */ -void adb_complete(caddr_t buffer, caddr_t data_area, int adb_command); -void extdms_init(int); +/* adb.c */ +int adb_op_sync(Ptr, Ptr, Ptr, short); +void adb_op_comprout(void); -#ifndef MRG_ADB +/* adbsysasm.s */ +void adb_kbd_asmcomplete(void); +void adb_ms_asmcomplete(void); /* types of adb hardware that we (will eventually) support */ -#define ADB_HW_UNKNOWN 0x01 /* don't know */ -#define ADB_HW_II 0x02 /* Mac II series */ -#define ADB_HW_IISI 0x03 /* Mac IIsi series */ -#define ADB_HW_PB 0x04 /* PowerBook series */ -#define ADB_HW_CUDA 0x05 /* Machines with a Cuda chip */ +#define ADB_HW_UNKNOWN 0x0 /* don't know */ +#define ADB_HW_II 0x1 /* Mac II series */ +#define ADB_HW_IISI 0x2 /* Mac IIsi series */ +#define ADB_HW_PB 0x3 /* PowerBook series */ +#define ADB_HW_CUDA 0x4 /* Machines with a Cuda chip */ +#define MAX_ADB_HW 4 /* Number of ADB hardware types */ + +#define ADB_CMDADDR(cmd) ((u_int8_t)(cmd & 0xf0) >> 4) +#define ADBFLUSH(dev) ((((u_int8_t)dev & 0x0f) << 4) | 0x01) +#define ADBLISTEN(dev, reg) ((((u_int8_t)dev & 0x0f) << 4) | 0x08 | reg) +#define ADBTALK(dev, reg) ((((u_int8_t)dev & 0x0f) << 4) | 0x0c | reg) +#ifndef MRG_ADB /* adb_direct.c */ int adb_poweroff(void); int CountADBs(void); void ADBReInit(void); -int GetIndADB(ADBDataBlock * info, int index); -int GetADBInfo(ADBDataBlock * info, int adbAddr); -int SetADBInfo(ADBSetInfoBlock * info, int adbAddr); -int ADBOp(Ptr buffer, Ptr compRout, Ptr data, short commandNum); -int adb_read_date_time(unsigned long *t); -int adb_set_date_time(unsigned long t); - -#endif +int GetIndADB(ADBDataBlock *, int); +int GetADBInfo(ADBDataBlock *, int); +int SetADBInfo(ADBSetInfoBlock *, int); +int ADBOp(Ptr, Ptr, Ptr, short); +int adb_read_date_time(unsigned long *); +int adb_set_date_time(unsigned long); +#endif /* !MRG_ADB */ diff --git a/sys/arch/mac68k/dev/akbd.c b/sys/arch/mac68k/dev/akbd.c new file mode 100644 index 00000000000..b3f2e9f12c6 --- /dev/null +++ b/sys/arch/mac68k/dev/akbd.c @@ -0,0 +1,536 @@ +/* $OpenBSD: akbd.c,v 1.1 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: akbd.c,v 1.17 2005/01/15 16:00:59 chs Exp $ */ + +/* + * Copyright (C) 1998 Colin Wood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Colin Wood. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/timeout.h> +#include <sys/kernel.h> +#include <sys/device.h> +#include <sys/fcntl.h> +#include <sys/poll.h> +#include <sys/selinfo.h> +#include <sys/proc.h> +#include <sys/signalvar.h> +#include <sys/systm.h> + +#include "wskbd.h" + +#include <dev/wscons/wsconsio.h> +#include <dev/wscons/wskbdvar.h> +#include <dev/wscons/wsksymdef.h> +#include <dev/wscons/wsksymvar.h> + +#include <machine/autoconf.h> +#include <machine/cpu.h> +#include <machine/viareg.h> + +#include <mac68k/dev/adbvar.h> +#include <mac68k/dev/akbdmap.h> +#include <mac68k/dev/akbdvar.h> + +#define KEYBOARD_ARRAY +#include <machine/keyboard.h> + +/* + * Function declarations. + */ +int akbdmatch(struct device *, void *, void *); +void akbdattach(struct device *, struct device *, void *); +void kbd_adbcomplete(caddr_t, caddr_t, int); +void kbd_processevent(adb_event_t *, struct akbd_softc *); +int akbd_is_console(void); + +/* Driver definition. */ +struct cfattach akbd_ca = { + sizeof(struct akbd_softc), akbdmatch, akbdattach +}; +struct cfdriver akbd_cd = { + NULL, "akbd", DV_DULL +}; + +int akbd_enable(void *, int); +void akbd_set_leds(void *, int); +int akbd_ioctl(void *, u_long, caddr_t, int, struct proc *); +int akbd_intr(adb_event_t *, struct akbd_softc *); +void akbd_rawrepeat(void *v); + + +struct wskbd_accessops akbd_accessops = { + akbd_enable, + akbd_set_leds, + akbd_ioctl, +}; + +struct wskbd_mapdata akbd_keymapdata = { + akbd_keydesctab, +#ifdef AKBD_LAYOUT + AKBD_LAYOUT, +#else + KB_US, +#endif +}; + +int +akbdmatch(struct device *parent, void *vcf, void *aux) +{ + struct adb_attach_args *aa_args = (struct adb_attach_args *)aux; + + if (aa_args->origaddr == ADBADDR_KBD) + return 1; + else + return 0; +} + +void +akbdattach(struct device *parent, struct device *self, void *aux) +{ + ADBSetInfoBlock adbinfo; + struct akbd_softc *sc = (struct akbd_softc *)self; + struct adb_attach_args *aa_args = (struct adb_attach_args *)aux; + int error, kbd_done; + short cmd; + u_char buffer[9]; +#if NWSKBD > 0 + struct wskbddev_attach_args a; + static int akbd_console_initted; + int wskbd_eligible; + + wskbd_eligible = 1; +#endif + + sc->origaddr = aa_args->origaddr; + sc->adbaddr = aa_args->adbaddr; + sc->handler_id = aa_args->handler_id; + + sc->sc_leds = (u_int8_t)0x00; /* initially off */ + + adbinfo.siServiceRtPtr = (Ptr)adb_kbd_asmcomplete; + adbinfo.siDataAreaAddr = (caddr_t)sc; + + switch (sc->handler_id) { + case ADB_STDKBD: + printf("standard keyboard\n"); + break; + case ADB_ISOKBD: + printf("standard keyboard (ISO layout)\n"); + break; + case ADB_EXTKBD: + cmd = ADBTALK(sc->adbaddr, 1); + kbd_done = + (adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd) == 0); + + /* Ignore Logitech MouseMan/Trackman pseudo keyboard */ + if (kbd_done && buffer[1] == 0x9a && buffer[2] == 0x20) { + printf("Mouseman (non-EMP) pseudo keyboard\n"); + adbinfo.siServiceRtPtr = (Ptr)0; + adbinfo.siDataAreaAddr = (Ptr)0; +#if NWSKBD > 0 + wskbd_eligible = 0; +#endif /* NWSKBD > 0 */ + } else if (kbd_done && buffer[1] == 0x9a && buffer[2] == 0x21) { + printf("Trackman (non-EMP) pseudo keyboard\n"); + adbinfo.siServiceRtPtr = (Ptr)0; + adbinfo.siDataAreaAddr = (Ptr)0; +#if NWSKBD > 0 + wskbd_eligible = 0; +#endif /* NWSKBD > 0 */ + } else { + printf("extended keyboard\n"); +#ifdef notyet + blinkleds(sc); +#endif + } + break; + case ADB_EXTISOKBD: + printf("extended keyboard (ISO layout)\n"); +#ifdef notyet + blinkleds(sc); +#endif + break; + case ADB_KBDII: + printf("keyboard II\n"); + break; + case ADB_ISOKBDII: + printf("keyboard II (ISO layout)\n"); + break; + case ADB_PBKBD: + printf("PowerBook keyboard\n"); + break; + case ADB_PBISOKBD: + printf("PowerBook keyboard (ISO layout)\n"); + break; + case ADB_ADJKPD: + printf("adjustable keypad\n"); +#if NWSKBD > 0 + wskbd_eligible = 0; +#endif /* NWSKBD > 0 */ + break; + case ADB_ADJKBD: + printf("adjustable keyboard\n"); + break; + case ADB_ADJISOKBD: + printf("adjustable keyboard (ISO layout)\n"); + break; + case ADB_ADJJAPKBD: + printf("adjustable keyboard (Japanese layout)\n"); + break; + case ADB_PBEXTISOKBD: + printf("PowerBook extended keyboard (ISO layout)\n"); + break; + case ADB_PBEXTJAPKBD: + printf("PowerBook extended keyboard (Japanese layout)\n"); + break; + case ADB_JPKBDII: + printf("keyboard II (Japanese layout)\n"); + break; + case ADB_PBEXTKBD: + printf("PowerBook extended keyboard\n"); + break; + case ADB_DESIGNKBD: + printf("extended keyboard\n"); +#ifdef notyet + blinkleds(sc); +#endif + break; + case ADB_PBJPKBD: + printf("PowerBook keyboard (Japanese layout)\n"); + break; + case ADB_PBG3JPKBD: + printf("PowerBook G3 keyboard (Japanese layout)\n"); + break; + case ADB_PBG4KBD: + printf("PowerBook G4 keyboard (Inverted T)\n"); + break; + case ADB_IBITISOKBD: + printf("iBook keyboard with inverted T (ISO layout)\n"); + break; + default: + printf("mapped device (%d)\n", sc->handler_id); +#if NWSKBD > 0 + wskbd_eligible = 0; +#endif /* NWSKBD > 0 */ + break; + } + error = SetADBInfo(&adbinfo, sc->adbaddr); +#ifdef ADB_DEBUG + if (adb_debug) + printf("akbd: returned %d from SetADBInfo\n", error); +#endif + +#if NWSKBD > 0 + if (akbd_is_console() && wskbd_eligible) + a.console = (++akbd_console_initted == 1); + else + a.console = 0; + a.keymap = &akbd_keymapdata; + a.accessops = &akbd_accessops; + a.accesscookie = sc; + + sc->sc_wskbddev = config_found(self, &a, wskbddevprint); +#endif +} + + +/* + * Handle putting the keyboard data received from the ADB into + * an ADB event record. + */ +void +kbd_adbcomplete(caddr_t buffer, caddr_t data_area, int adb_command) +{ + adb_event_t event; + struct akbd_softc *ksc; + int adbaddr; +#ifdef ADB_DEBUG + int i; + + if (adb_debug) + printf("adb: transaction completion\n"); +#endif + + adbaddr = ADB_CMDADDR(adb_command); + ksc = (struct akbd_softc *)data_area; + + event.addr = adbaddr; + event.hand_id = ksc->handler_id; + event.def_addr = ksc->origaddr; + event.byte_count = buffer[0]; + memcpy(event.bytes, buffer + 1, event.byte_count); + +#ifdef ADB_DEBUG + if (adb_debug) { + printf("akbd: from %d at %d (org %d) %d:", event.addr, + event.hand_id, event.def_addr, buffer[0]); + for (i = 1; i <= buffer[0]; i++) + printf(" %x", buffer[i]); + printf("\n"); + } +#endif + + microtime(&event.timestamp); + + kbd_processevent(&event, ksc); +} + +/* + * Given a keyboard ADB event, record the keycodes and call the key + * repeat handler, optionally passing the event through the mouse + * button emulation handler first. + */ +void +kbd_processevent(adb_event_t *event, struct akbd_softc *ksc) +{ + adb_event_t new_event; + + new_event = *event; + new_event.u.k.key = event->bytes[0]; + new_event.bytes[1] = 0xff; +#if NWSKBD > 0 + if (ksc->sc_wskbddev != NULL) /* wskbd is attached? */ + akbd_intr(&new_event, ksc); +#endif + if (event->bytes[1] != 0xff) { + new_event.u.k.key = event->bytes[1]; + new_event.bytes[0] = event->bytes[1]; + new_event.bytes[1] = 0xff; +#if NWSKBD > 0 + if (ksc->sc_wskbddev != NULL) /* wskbd is attached? */ + akbd_intr(&new_event, ksc); +#endif + } + +} + +int +akbd_enable(void *v, int on) +{ + return 0; +} + +void +akbd_set_leds(void *v, int on) +{ +} + +int +akbd_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p) +{ +#ifdef WSDISPLAY_COMPAT_RAWKBD + struct akbd_softc *sc = v; +#endif + + switch (cmd) { + + case WSKBDIO_GTYPE: + *(int *)data = WSKBD_TYPE_ADB; + return 0; + case WSKBDIO_SETLEDS: + return 0; + case WSKBDIO_GETLEDS: + *(int *)data = 0; + return 0; +#ifdef WSDISPLAY_COMPAT_RAWKBD + case WSKBDIO_SETMODE: + sc->sc_rawkbd = *(int *)data == WSKBD_RAW; + timeout_del(&sc->sc_rawrepeat_ch); + return (0); +#endif + case WSKBDIO_BELL: + case WSKBDIO_COMPLEXBELL: +#define d ((struct wskbd_bell_data *)data) + mac68k_ring_bell(d->pitch, d->period * hz / 1000, 100); + /* comes in as msec, goes out as ticks; volume ignored */ +#undef d + return (0); + + default: + return (-1); + } +} + +#ifdef WSDISPLAY_COMPAT_RAWKBD +void +akbd_rawrepeat(void *v) +{ + struct akbd_softc *sc = v; + int s; + + s = spltty(); + wskbd_rawinput(sc->sc_wskbddev, sc->sc_rep, sc->sc_nrep); + splx(s); + timeout_add(&sc->sc_rawrepeat_ch, hz * REP_DELAYN / 1000); +} +#endif + +int adb_polledkey; +int +akbd_intr(adb_event_t *event, struct akbd_softc *sc) +{ + int key, press, val; + int type; + static int shift; + + key = event->u.k.key; + + /* + * Caps lock is weird. The key sequence generated is: + * press: down(57) [57] (LED turns on) + * release: up(127) [255] + * press: up(127) [255] + * release: up(57) [185] (LED turns off) + */ + if (ADBK_KEYVAL(key) == ADBK_CAPSLOCK) + shift = 0; + + if (key == 255) { + if (shift == 0) { + key = ADBK_KEYUP(ADBK_CAPSLOCK); + shift = 1; + } else { + key = ADBK_KEYDOWN(ADBK_CAPSLOCK); + shift = 0; + } + } + + press = ADBK_PRESS(key); + val = ADBK_KEYVAL(key); + + type = press ? WSCONS_EVENT_KEY_DOWN : WSCONS_EVENT_KEY_UP; + + if (adb_polling) { + adb_polledkey = key; +#ifdef WSDISPLAY_COMPAT_RAWKBD + } else if (sc->sc_rawkbd) { + char cbuf[MAXKEYS *2]; + int c, j, s; + int npress; + + j = npress = 0; + + c = keyboard[val][3]; + if (c == 0) { + return 0; /* XXX */ + } + if (c & 0x80) + cbuf[j++] = 0xe0; + cbuf[j] = c & 0x7f; + if (type == WSCONS_EVENT_KEY_UP) { + cbuf[j] |= 0x80; + } else { + /* this only records last key pressed */ + if (c & 0x80) + sc->sc_rep[npress++] = 0xe0; + sc->sc_rep[npress++] = c & 0x7f; + } + j++; + s = spltty(); + wskbd_rawinput(sc->sc_wskbddev, cbuf, j); + splx(s); + timeout_del(&sc->sc_rawrepeat_ch); + sc->sc_nrep = npress; + if (npress != 0) + timeout_add(&sc->sc_rawrepeat_ch, hz * REP_DELAY1/1000); + return 0; +#endif + } else { + wskbd_input(sc->sc_wskbddev, type, val); + } + + return 0; +} + +int +akbd_is_console(void) +{ + extern struct mac68k_machine_S mac68k_machine; + + return ((mac68k_machine.serial_console & 0x03) == 0); +} + +void akbd_cngetc(void *, u_int *, int *); +void akbd_cnpollc(void *, int); + +struct wskbd_consops akbd_consops = { + akbd_cngetc, + akbd_cnpollc, +}; + +int +akbd_cnattach(void) +{ + extern struct wskbd_mapdata akbd_keymapdata; + + wskbd_cnattach(&akbd_consops, NULL, &akbd_keymapdata); + + return 0; +} + +void +akbd_cngetc(void *v, u_int *type, int *data) +{ + int intbits, key, press, val; + int s; + extern int adb_polledkey; + + s = splhigh(); + + adb_polledkey = -1; + adb_polling = 1; + + while (adb_polledkey == -1) { + intbits = via_reg(VIA1, vIFR); + + if (intbits & V1IF_ADBRDY) { + mrg_adbintr(); + via_reg(VIA1, vIFR) = V1IF_ADBRDY; + } + if (intbits & 0x10) { + mrg_pmintr(); + via_reg(VIA1, vIFR) = 0x10; + } + } + + adb_polling = 0; + splx(s); + + key = adb_polledkey; + press = ADBK_PRESS(key); + val = ADBK_KEYVAL(key); + + *data = val; + *type = press ? WSCONS_EVENT_KEY_DOWN : WSCONS_EVENT_KEY_UP; +} + +void +akbd_cnpollc(void *v, int on) +{ +} diff --git a/sys/arch/mac68k/dev/akbdmap.h b/sys/arch/mac68k/dev/akbdmap.h new file mode 100644 index 00000000000..8e0c01f0523 --- /dev/null +++ b/sys/arch/mac68k/dev/akbdmap.h @@ -0,0 +1,431 @@ +/* $NetBSD: akbdmap.h,v 1.7 2005/05/05 22:29:41 abs Exp $ */ + +/*- + * Copyright (c) 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Juergen Hannken-Illjes. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* XXX This list is incomplete. */ + +#define KC(n) KS_KEYCODE(n) + +static const keysym_t akbd_keydesc_us[] = { +/* pos command normal shifted */ + KC(0), KS_a, + KC(1), KS_s, + KC(2), KS_d, + KC(3), KS_f, + KC(4), KS_h, + KC(5), KS_g, + KC(6), KS_z, + KC(7), KS_x, + KC(8), KS_c, + KC(9), KS_v, + + KC(11), KS_b, + KC(12), KS_q, + KC(13), KS_w, + KC(14), KS_e, + KC(15), KS_r, + KC(16), KS_y, + KC(17), KS_t, + KC(18), KS_1, KS_exclam, + KC(19), KS_2, KS_at, + KC(20), KS_3, KS_numbersign, + KC(21), KS_4, KS_dollar, + KC(22), KS_6, KS_asciicircum, + KC(23), KS_5, KS_percent, + KC(24), KS_equal, KS_plus, + KC(25), KS_9, KS_parenleft, + KC(26), KS_7, KS_ampersand, + KC(27), KS_minus, KS_underscore, + KC(28), KS_8, KS_asterisk, + KC(29), KS_0, KS_parenright, + KC(30), KS_bracketright, KS_braceright, + KC(31), KS_o, + KC(32), KS_u, + KC(33), KS_bracketleft, KS_braceleft, + KC(34), KS_i, + KC(35), KS_p, + KC(36), KS_Return, + KC(37), KS_l, + KC(38), KS_j, + KC(39), KS_apostrophe, KS_quotedbl, + KC(40), KS_k, + KC(41), KS_semicolon, KS_colon, + KC(42), KS_backslash, KS_bar, + KC(43), KS_comma, KS_less, + KC(44), KS_slash, KS_question, + KC(45), KS_n, + KC(46), KS_m, + KC(47), KS_period, KS_greater, + KC(48), KS_Tab, + KC(49), KS_space, + KC(50), KS_grave, KS_asciitilde, + KC(51), KS_Delete, + KC(52), KS_KP_Enter, /* Pretend this is alt-R ? */ + KC(53), KS_Escape, + KC(54), KS_Control_L, + KC(55), KS_Cmd, /* Command */ + KC(56), KS_Shift_L, + KC(57), KS_Caps_Lock, + KC(58), KS_Cmd1, /* Option */ + KC(59), KS_Left, + KC(60), KS_Right, + KC(61), KS_Down, + KC(62), KS_Up, + + KC(65), KS_KP_Decimal, + KC(67), KS_KP_Multiply, + KC(69), KS_KP_Add, + KC(71), KS_Num_Lock, + KC(75), KS_KP_Divide, + KC(76), KS_KP_Enter, + KC(78), KS_KP_Subtract, + + KC(81), KS_KP_Equal, + KC(82), KS_KP_Insert, KS_KP_0, + KC(83), KS_KP_End, KS_KP_1, + KC(84), KS_KP_Down, KS_KP_2, + KC(85), KS_KP_Next, KS_KP_3, + KC(86), KS_KP_Left, KS_KP_4, + KC(87), KS_KP_Begin, KS_KP_5, + KC(88), KS_KP_Right, KS_KP_6, + KC(89), KS_KP_Home, KS_KP_7, + + KC(91), KS_KP_Up, KS_KP_8, + KC(92), KS_KP_Prior, KS_KP_9, + + KC(95), KS_KP_Delete, KS_KP_Decimal, + KC(96), KS_f5, + KC(97), KS_f6, + KC(98), KS_f7, + KC(99), KS_f3, + KC(100), KS_f8, + + KC(101), KS_f9, + + KC(103), KS_f11, + + KC(105), KS_Print_Screen, + KC(106), KS_KP_Enter, + KC(107), KS_Hold_Screen, + + KC(109), KS_f10, + + KC(111), KS_f12, + + KC(113), KS_Pause, + KC(114), KS_Insert, + KC(115), KS_Home, + KC(116), KS_Prior, + KC(117), KS_Delete, + KC(118), KS_f4, + KC(119), KS_End, + KC(120), KS_f2, + KC(121), KS_Next, + KC(122), KS_f1, + + KC(127), KS_Cmd_Debugger, +}; + +static const keysym_t akbd_keydesc_fr[] = { +/* pos normal shifted altgr shift-altgr */ + KC(0), KS_q, + KC(1), KS_s, KS_S, KS_Ograve, + KC(4), KS_h, KS_H, KS_Igrave, KS_Icircumflex, + KC(6), KS_w, KS_W, KS_less, KS_greater, + KC(8), KS_c, KS_C, KS_copyright, KS_cent, + KC(10), KS_at, KS_numbersign, + KC(11), KS_b, KS_B, KS_ssharp, + KC(12), KS_a, KS_A, KS_ae, KS_AE, + KC(13), KS_z, KS_Z, KS_Acircumflex, KS_Aring, + KC(14), KS_e, KS_E, KS_ecircumflex, KS_Ecircumflex, + KC(15), KS_r, KS_R, KS_registered, /* Euro */ + KC(16), KS_y, KS_Y, KS_Uacute, + KC(18), KS_ampersand, KS_1, KS_voidSymbol, KS_dead_acute, + KC(19), KS_eacute, KS_2, KS_ediaeresis, + KC(20), KS_quotedbl, KS_3, + KC(21), KS_apostrophe, KS_4, KS_braceleft, KS_bracketleft, + KC(22), KS_section, KS_6, KS_paragraph, + KC(23), KS_parenleft, KS_5, KS_braceleft, KS_bracketleft, + KC(24), KS_minus, KS_underscore, KS_braceright, + KC(25), KS_ccedilla, KS_9, KS_Ccedilla, KS_Agrave, + KC(26), KS_egrave, KS_7, KS_guillemotleft,KS_guillemotright, + KC(27), KS_parenright, KS_degree, KS_braceright, KS_bracketright, + KC(28), KS_exclam, KS_8, KS_exclamdown, KS_Ucircumflex, + KC(29), KS_agrave, KS_0, KS_oslash, + KC(30), KS_dollar, KS_asterisk, KS_comma, KS_yen, + KC(33), KS_dead_circumflex, KS_dead_diaeresis,KS_ocircumflex,KS_Ocircumflex, + KC(34), KS_i, KS_I, KS_icircumflex, KS_Icircumflex, + KC(37), KS_l, KS_L, KS_notsign, KS_bar, + KC(38), KS_j, KS_J, KS_Idiaeresis, KS_Igrave, + KC(39), KS_ugrave, KS_percent, KS_Ugrave, + KC(40), KS_k, KS_K, KS_Egrave, KS_Ediaeresis, + KC(41), KS_m, KS_M, KS_mu, KS_Ograve, + KC(42), KS_dead_grave, KS_sterling, KS_at, KS_numbersign, + KC(43), KS_semicolon, KS_period, + KC(44), KS_equal, KS_plus, KS_voidSymbol, KS_plusminus, + KC(45), KS_n, KS_N, KS_dead_tilde, + KC(46), KS_comma, KS_question, KS_voidSymbol, KS_questiondown, + KC(47), KS_colon, KS_slash, KS_division, KS_backslash, + KC(50), KS_less, KS_greater, + KC(52), KS_Alt_R, + KC(55), KS_Meta_L, /* Command */ + KC(58), KS_Mode_switch, KS_Multi_key, /* Option */ +}; + +static const keysym_t akbd_keydesc_fr_nodead[] = { + KC(18), KS_ampersand, KS_1, KS_voidSymbol, KS_acute, + KC(33), KS_asciicircum, KS_diaeresis, KS_ocircumflex, KS_Ocircumflex, + KC(42), KS_grave, KS_sterling, KS_at, KS_numbersign, + KC(45), KS_n, KS_N, KS_asciitilde, +}; + +static const keysym_t akbd_keydesc_jp[] = { +/* pos command normal shifted */ + KC(19), KS_2, KS_quotedbl, + KC(22), KS_6, KS_ampersand, + KC(24), KS_asciicircum, KS_asciitilde, + KC(25), KS_9, KS_parenright, + KC(26), KS_7, KS_apostrophe, + KC(27), KS_minus, KS_equal, + KC(28), KS_8, KS_parenleft, + KC(29), KS_0, + KC(30), KS_bracketleft, KS_braceleft, + KC(33), KS_at, KS_grave, + KC(39), KS_colon, KS_asterisk, + + KC(41), KS_semicolon, KS_plus, + KC(42), KS_bracketright,KS_braceright, + KC(93), KS_backslash, KS_bar, + KC(94), KS_underscore, +}; + +static const keysym_t akbd_keydesc_uk[] = { +/* pos normal shifted altgr shift-altgr */ + KC(10), KS_section, KS_plusminus, + KC(20), KS_3, KS_sterling, KS_numbersign, + KC(52), KS_KP_Enter, + KC(58), KS_Mode_switch, KS_Multi_key, /* Option */ +}; + +static const keysym_t akbd_keydesc_sv[] = { +/* pos normal shifted altgr shift-altgr */ + KC(10), KS_section, KS_degree, + KC(19), KS_2, KS_quotedbl, KS_at, + KC(21), KS_4, KS_dollar, + KC(22), KS_6, KS_ampersand, + KC(24), KS_dead_acute, KS_dead_grave, + KC(25), KS_9, KS_parenright, KS_bracketright, + KC(26), KS_7, KS_slash, KS_braceleft, + KC(27), KS_plus, KS_question, KS_backslash, + KC(28), KS_8, KS_parenleft, KS_bracketleft, + KC(29), KS_0, KS_equal, KS_braceright, + KC(30), KS_dead_diaeresis,KS_dead_circumflex,KS_dead_tilde, + KC(33), KS_aring, + KC(39), KS_adiaeresis, + KC(41), KS_odiaeresis, + KC(42), KS_apostrophe, KS_asterisk, + KC(43), KS_comma, KS_semicolon, + KC(44), KS_minus, KS_underscore, + KC(47), KS_period, KS_colon, + KC(50), KS_less, KS_greater, KS_bar, + KC(58), KS_Mode_switch,KS_Multi_key, +}; + +static const keysym_t akbd_keydesc_sv_nodead[] = { +/* pos normal shifted altgr shift-altgr */ + KC(24), KS_apostrophe, KS_grave, + KC(30), KS_diaeresis, KS_asciicircum, KS_asciitilde, +}; + +static const keysym_t akbd_keydesc_de[] = { +/* pos normal shifted altgr shift-altgr */ + KC(0), KS_a, KS_A, KS_aring, KS_Aring, + KC(1), KS_s, KS_S, KS_voidSymbol, KS_Iacute, + KC(3), KS_f, KS_F, KS_voidSymbol, KS_Idiaeresis, + KC(4), KS_h, KS_H, KS_ordfeminine, KS_Oacute, + KC(5), KS_g, KS_G, KS_copyright, KS_Igrave, + KC(6), KS_y, KS_Y, KS_yen, + KC(7), KS_x, KS_X, KS_voidSymbol, KS_Ugrave, + KC(8), KS_c, KS_C, KS_ccedilla, KS_Ccedilla, + KC(10), KS_dead_circumflex,KS_degree, + KC(12), KS_q, KS_Q, KS_guillemotleft,KS_guillemotright, + KC(15), KS_r, KS_R, KS_registered, KS_cedilla, + KC(16), KS_z, KS_Z, + KC(18), KS_1, KS_exclam, KS_exclamdown, KS_notsign, + KC(19), KS_2, KS_quotedbl, + KC(20), KS_3, KS_section, KS_paragraph, KS_numbersign, + KC(21), KS_4, KS_dollar, KS_cent, KS_sterling, + KC(22), KS_6, KS_ampersand, KS_bracketright,KS_dead_circumflex, + KC(23), KS_5, KS_percent, KS_bracketleft, + KC(24), KS_dead_acute, KS_dead_grave, KS_apostrophe, + KC(25), KS_9, KS_parenright, KS_braceright, KS_periodcentered, + KC(26), KS_7, KS_slash, KS_bar, KS_backslash, + KC(27), KS_ssharp, KS_question, KS_questiondown, + KC(28), KS_8, KS_parenleft, KS_braceleft, + KC(29), KS_0, KS_equal, KS_voidSymbol, KS_macron, + KC(30), KS_plus, KS_asterisk, KS_plusminus, + KC(31), KS_o, KS_O, KS_oslash, KS_Ooblique, + KC(32), KS_u, KS_U, KS_dead_diaeresis,KS_Aacute, + KC(33), KS_udiaeresis, KS_Udiaeresis, KS_voidSymbol, KS_degree, + KC(34), KS_i, KS_I, KS_voidSymbol, KS_Ucircumflex, + KC(37), KS_l, KS_L, KS_at, + KC(38), KS_j, KS_J, KS_masculine, + KC(39), KS_adiaeresis, KS_Adiaeresis, KS_ae, KS_AE, + KC(41), KS_odiaeresis, KS_Odiaeresis, + KC(42), KS_numbersign, KS_apostrophe, + KC(43), KS_comma, KS_semicolon, + KC(44), KS_minus, KS_underscore, + KC(45), KS_n, KS_N, KS_dead_tilde, + KC(46), KS_m, KS_M, KS_mu, + KC(47), KS_period, KS_colon, + KC(50), KS_less, KS_greater, + KC(52), KS_Multi_key, + KC(58), KS_Mode_switch, +}; + +static const keysym_t akbd_keydesc_de_nodead[] = { +/* pos normal shifted altgr shift-altgr */ + KC(10), KS_asciicircum, KS_degree, + KC(22), KS_6, KS_ampersand, KS_bracketright,KS_asciicircum, + KC(24), KS_acute, KS_grave, KS_apostrophe, + KC(32), KS_u, KS_U, KS_diaeresis, KS_Aacute, + KC(45), KS_n, KS_N, KS_asciitilde, +}; + +static const keysym_t akbd_keydesc_sf[] = { +/* pos normal shifted altgr shift-altgr */ + KC(6), KS_y, + KC(10), KS_paragraph, KS_degree, + KC(16), KS_z, + KC(18), KS_plus, KS_1, + KC(19), KS_quotedbl, KS_2, + KC(20), KS_asterisk, KS_3, + KC(21), KS_ccedilla, KS_4, KS_Ccedilla, + KC(22), KS_ampersand, KS_6, + KC(23), KS_percent, KS_5, + KC(24), KS_dead_circumflex,KS_grave, + KC(25), KS_parenright, KS_9, + KC(26), KS_slash, KS_7, + KC(27), KS_apostrophe, KS_question, + KC(28), KS_parenleft, KS_8, + KC(29), KS_equal, KS_0, + KC(30), KS_dead_diaeresis,KS_exclam, + KC(33), KS_egrave, KS_udiaeresis, + KC(39), KS_agrave, KS_adiaeresis, + KC(41), KS_eacute, KS_odiaeresis, + KC(42), KS_dollar, KS_sterling, + KC(43), KS_period, KS_colon, + KC(46), KS_comma, KS_semicolon, + KC(47), KS_minus, KS_underscore, + KC(50), KS_less, KS_greater, +}; + +static const keysym_t akbd_keydesc_es[] = { +/* pos normal shifted altgr shift-altgr */ + KC(10), KS_degree, KS_ordfeminine, KS_backslash, + KC(18), KS_1, KS_exclam, KS_bar, + KC(19), KS_2, KS_quotedbl, KS_at, + KC(20), KS_3, KS_periodcentered, KS_numbersign, + KC(21), KS_4, KS_dollar, KS_asciitilde, + KC(22), KS_6, KS_ampersand, KS_notsign, + KC(23), KS_5, KS_percent, + KC(24), KS_exclamdown, KS_questiondown, + KC(25), KS_9, KS_parenright, + KC(26), KS_7, KS_slash, + KC(27), KS_apostrophe, KS_question, + KC(28), KS_8, KS_parenleft, + KC(29), KS_0, KS_equal, + KC(30), KS_plus, KS_asterisk, KS_bracketright, + KC(33), KS_dead_grave, KS_dead_circumflex, KS_bracketleft, + KC(39), KS_dead_acute, KS_dead_diaeresis, KS_braceleft, + KC(41), KS_ntilde, + KC(42), KS_ccedilla, KS_Ccedilla, KS_braceright, + KC(43), KS_comma, KS_semicolon, + KC(44), KS_minus, KS_underscore, + KC(47), KS_period, KS_colon, + KC(50), KS_less, KS_greater, + KC(55), KS_Alt_L, /* Command */ + KC(58), KS_Mode_switch, KS_Multi_key, /* Option */ +}; + +static const keysym_t akbd_keydesc_pt[] = { +/* pos normal shifted altgr shift-altgr */ + KC(7), KS_x, KS_X, KS_guillemotleft, KS_guillemotright, + KC(10), KS_section, KS_plusminus, + KC(19), KS_2, KS_quotedbl, KS_at, + KC(20), KS_3, KS_numbersign, KS_sterling, + KC(22), KS_6, KS_ampersand, + KC(24), KS_plus, KS_asterisk, + KC(25), KS_9, KS_parenright, KS_bracketright, KS_braceright, + KC(26), KS_7, KS_slash, + KC(27), KS_apostrophe, KS_question, + KC(28), KS_8, KS_parenleft, KS_bracketleft, KS_braceleft, + KC(29), KS_0, KS_equal, + KC(30), KS_dead_acute, KS_dead_grave, + KC(33), KS_masculine, KS_ordfeminine, + KC(39), KS_dead_tilde, KS_dead_circumflex, + KC(41), KS_ccedilla, KS_Ccedilla, + KC(43), KS_comma, KS_semicolon, + KC(44), KS_minus, KS_underscore, + KC(47), KS_period, KS_colon, + KC(50), KS_less, KS_greater, + KC(58), KS_Mode_switch, + KC(81), KS_KP_Equal, +}; + +#define KBD_MAP(name, base, map) \ + { name, base, sizeof(map)/sizeof(keysym_t), map } + +static const struct wscons_keydesc akbd_keydesctab[] = { + KBD_MAP(KB_US, 0, akbd_keydesc_us), + KBD_MAP(KB_FR, KB_US, akbd_keydesc_fr), + KBD_MAP(KB_JP, KB_US, akbd_keydesc_jp), + KBD_MAP(KB_FR | KB_NODEAD, KB_FR, akbd_keydesc_fr_nodead), + KBD_MAP(KB_SF, KB_US, akbd_keydesc_sf), + KBD_MAP(KB_SV, KB_US, akbd_keydesc_sv), + KBD_MAP(KB_SV | KB_NODEAD, KB_SV, akbd_keydesc_sv_nodead), + KBD_MAP(KB_DE, KB_US, akbd_keydesc_de), + KBD_MAP(KB_DE | KB_NODEAD, KB_DE, akbd_keydesc_de_nodead), + KBD_MAP(KB_UK, KB_US, akbd_keydesc_uk), + KBD_MAP(KB_ES, KB_US, akbd_keydesc_es), + KBD_MAP(KB_PT, KB_US, akbd_keydesc_pt), + {0, 0, 0, 0} +}; + +#undef KBD_MAP +#undef KC + diff --git a/sys/arch/mac68k/dev/akbdvar.h b/sys/arch/mac68k/dev/akbdvar.h new file mode 100644 index 00000000000..9688e8b421c --- /dev/null +++ b/sys/arch/mac68k/dev/akbdvar.h @@ -0,0 +1,71 @@ +/* $OpenBSD: akbdvar.h,v 1.1 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: akbdvar.h,v 1.4 1999/02/17 14:56:56 tsubai Exp $ */ + +/* + * Copyright (C) 1998 Colin Wood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Colin Wood. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MAC68K_KBDVAR_H_ +#define _MAC68K_KBDVAR_H_ + +#include <machine/adbsys.h> + +/* + * State info, per keyboard instance. + */ +struct akbd_softc { + struct device sc_dev; + + /* ADB info */ + int origaddr; /* ADB device type (ADBADDR_KBD) */ + int adbaddr; /* current ADB address */ + int handler_id; /* type of keyboard */ + + u_int8_t sc_leds; /* current LED state */ + struct device *sc_wskbddev; +#ifdef WSDISPLAY_COMPAT_RAWKBD +#define MAXKEYS 20 +#define REP_DELAY1 400 +#define REP_DELAYN 100 + int sc_rawkbd; + int sc_nrep; + char sc_rep[MAXKEYS]; + struct timeout sc_rawrepeat_ch; +#endif /* defined(WSDISPLAY_COMPAT_RAWKBD) */ +}; + +/* LED register bits, inverse of actual register value */ +#define LED_NUMLOCK 0x1 +#define LED_CAPSLOCK 0x2 +#define LED_SCROLL_LOCK 0x4 + +void kbd_adbcomplete(caddr_t buffer, caddr_t data_area, int adb_command); +int akbd_cnattach(void); + +#endif /* _MAC68K_KBDVAR_H_ */ diff --git a/sys/arch/mac68k/dev/ams.c b/sys/arch/mac68k/dev/ams.c new file mode 100644 index 00000000000..874a601d0cf --- /dev/null +++ b/sys/arch/mac68k/dev/ams.c @@ -0,0 +1,535 @@ +/* $OpenBSD: ams.c,v 1.1 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: ams.c,v 1.11 2000/12/19 03:13:40 tsubai Exp $ */ + +/* + * Copyright (C) 1998 Colin Wood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Colin Wood. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/device.h> +#include <sys/fcntl.h> +#include <sys/poll.h> +#include <sys/selinfo.h> +#include <sys/proc.h> +#include <sys/signalvar.h> +#include <sys/systm.h> + +#include <machine/autoconf.h> + +#include <dev/wscons/wsconsio.h> +#include <dev/wscons/wsmousevar.h> + +#include <mac68k/dev/adbvar.h> +#include <mac68k/dev/amsvar.h> + +/* + * Function declarations. + */ +int amsmatch(struct device *, void *, void *); +void amsattach(struct device *, struct device *, void *); +void ems_init(struct ams_softc *); +void ms_processevent(adb_event_t *event, struct ams_softc *); + +/* Driver definition. */ +struct cfattach ams_ca = { + sizeof(struct ams_softc), amsmatch, amsattach +}; +/* Driver definition. */ +struct cfdriver ams_cd = { + NULL, "ams", DV_DULL +}; + + +int ams_enable(void *); +int ams_ioctl(void *, u_long, caddr_t, int, struct proc *); +void ams_disable(void *); + +const struct wsmouse_accessops ams_accessops = { + ams_enable, + ams_ioctl, + ams_disable, +}; + +int +amsmatch(struct device *parent, void *cf, void *aux) +{ + struct adb_attach_args *aa_args = aux; + + if (aa_args->origaddr == ADBADDR_MS) + return 1; + else + return 0; +} + +void +amsattach(struct device *parent, struct device *self, void *aux) +{ + ADBSetInfoBlock adbinfo; + struct ams_softc *sc = (struct ams_softc *)self; + struct adb_attach_args *aa_args = aux; + int error; + struct wsmousedev_attach_args a; + + sc->origaddr = aa_args->origaddr; + sc->adbaddr = aa_args->adbaddr; + sc->handler_id = aa_args->handler_id; + + sc->sc_class = MSCLASS_MOUSE; + sc->sc_buttons = 1; + sc->sc_res = 100; + sc->sc_devid[0] = 0; + sc->sc_devid[4] = 0; + + adbinfo.siServiceRtPtr = (Ptr)adb_ms_asmcomplete; + adbinfo.siDataAreaAddr = (caddr_t)sc; + + ems_init(sc); + + /* print out the type of mouse we have */ + switch (sc->handler_id) { + case ADBMS_100DPI: + printf("%d-button, %d dpi mouse\n", sc->sc_buttons, + (int)(sc->sc_res)); + break; + case ADBMS_200DPI: + sc->sc_res = 200; + printf("%d-button, %d dpi mouse\n", sc->sc_buttons, + (int)(sc->sc_res)); + break; + case ADBMS_MSA3: + printf("Mouse Systems A3 mouse, %d-button, %d dpi\n", + sc->sc_buttons, (int)(sc->sc_res)); + break; + case ADBMS_USPEED: + printf("MicroSpeed mouse, default parameters\n"); + break; + case ADBMS_UCONTOUR: + printf("Contour mouse, default parameters\n"); + break; + case ADBMS_TURBO: + printf("Kensington Turbo Mouse\n"); + break; + case ADBMS_EXTENDED: + if (sc->sc_devid[0] == '\0') { + printf("Logitech "); + switch (sc->sc_class) { + case MSCLASS_MOUSE: + printf("MouseMan (non-EMP) mouse"); + break; + case MSCLASS_TRACKBALL: + printf("TrackMan (non-EMP) trackball"); + break; + default: + printf("non-EMP relative positioning device"); + break; + } + printf("\n"); + } else { + printf("EMP "); + switch (sc->sc_class) { + case MSCLASS_TABLET: + printf("tablet"); + break; + case MSCLASS_MOUSE: + printf("mouse"); + break; + case MSCLASS_TRACKBALL: + printf("trackball"); + break; + case MSCLASS_TRACKPAD: + printf("trackpad"); + break; + default: + printf("unknown device"); + break; + } + printf(" <%s> %d-button, %d dpi\n", sc->sc_devid, + sc->sc_buttons, (int)(sc->sc_res)); + } + break; + default: + printf("relative positioning device (mouse?) (%d)\n", + sc->handler_id); + break; + } + error = SetADBInfo(&adbinfo, sc->adbaddr); +#ifdef ADB_DEBUG + if (adb_debug) + printf("ams: returned %d from SetADBInfo\n", error); +#endif + + a.accessops = &ams_accessops; + a.accesscookie = sc; + sc->sc_wsmousedev = config_found(self, &a, wsmousedevprint); +} + + +/* + * Initialize extended mouse support -- probes devices as described + * in Inside Macintosh: Devices, Chapter 5 "ADB Manager". + * + * Extended Mouse Protocol is documented in TechNote HW1: + * "ADB - The Untold Story: Space Aliens Ate My Mouse" + * + * Supports: Extended Mouse Protocol, MicroSpeed Mouse Deluxe, + * Mouse Systems A^3 Mouse, Logitech non-EMP MouseMan + */ +void +ems_init(struct ams_softc *sc) +{ + int adbaddr; + short cmd; + u_char buffer[9]; + + adbaddr = sc->adbaddr; + if (sc->origaddr != ADBADDR_MS) + return; + if (sc->handler_id == ADBMS_USPEED || + sc->handler_id == ADBMS_UCONTOUR) { + /* Found MicroSpeed Mouse Deluxe Mac or Contour Mouse */ + cmd = ADBLISTEN(adbaddr, 1); + + /* + * To setup the MicroSpeed or the Contour, it appears + * that we can send the following command to the mouse + * and then expect data back in the form: + * buffer[0] = 4 (bytes) + * buffer[1], buffer[2] as std. mouse + * buffer[3] = buffer[4] = 0xff when no buttons + * are down. When button N down, bit N is clear. + * buffer[4]'s locking mask enables a + * click to toggle the button down state--sort of + * like the "Easy Access" shift/control/etc. keys. + * buffer[3]'s alternative speed mask enables using + * different speed when the corr. button is down + */ + buffer[0] = 4; + buffer[1] = 0x00; /* Alternative speed */ + buffer[2] = 0x00; /* speed = maximum */ + buffer[3] = 0x10; /* enable extended protocol, + * lower bits = alt. speed mask + * = 0000b + */ + buffer[4] = 0x07; /* Locking mask = 0000b, + * enable buttons = 0111b + */ + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd); + + sc->sc_buttons = 3; + sc->sc_res = 200; + return; + } + if (sc->handler_id == ADBMS_TURBO) { + /* Found Kensington Turbo Mouse */ + static u_char data1[] = + { 8, 0xe7, 0x8c, 0, 0, 0, 0xff, 0xff, 0x94 }; + static u_char data2[] = + { 8, 0xa5, 0x14, 0, 0, 0x69, 0xff, 0xff, 0x27 }; + + buffer[0] = 0; + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, ADBFLUSH(adbaddr)); + + adb_op_sync((Ptr)data1, (Ptr)0, (Ptr)0, ADBLISTEN(adbaddr, 2)); + + buffer[0] = 0; + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, ADBFLUSH(adbaddr)); + + adb_op_sync((Ptr)data2, (Ptr)0, (Ptr)0, ADBLISTEN(adbaddr, 2)); + return; + } + if ((sc->handler_id == ADBMS_100DPI) || + (sc->handler_id == ADBMS_200DPI)) { + /* found a mouse */ + cmd = ADBTALK(adbaddr, 3); + if (adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd)) { +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: ems_init timed out\n"); +#endif + return; + } + + /* Attempt to initialize Extended Mouse Protocol */ + buffer[2] = 4; /* make handler ID 4 */ + cmd = ADBLISTEN(adbaddr, 3); + if (adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd)) { +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: ems_init timed out\n"); +#endif + return; + } + + /* + * Check to see if successful, if not + * try to initialize it as other types + */ + cmd = ADBTALK(adbaddr, 3); + if (adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd) == 0 && + buffer[2] == ADBMS_EXTENDED) { + sc->handler_id = ADBMS_EXTENDED; + cmd = ADBTALK(adbaddr, 1); + if (adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd)) { +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: ems_init timed out\n"); +#endif + } else if (buffer[0] == 8) { + /* we have a true EMP device */ + sc->sc_class = buffer[7]; + sc->sc_buttons = buffer[8]; + sc->sc_res = (int)*(short *)&buffer[5]; + bcopy(&(buffer[1]), sc->sc_devid, 4); + } else if (buffer[1] == 0x9a && + ((buffer[2] == 0x20) || (buffer[2] == 0x21))) { + /* + * Set up non-EMP Mouseman/Trackman to put + * button bits in 3rd byte instead of sending + * via pseudo keyboard device. + */ + cmd = ADBLISTEN(adbaddr, 1); + buffer[0]=2; + buffer[1]=0x00; + buffer[2]=0x81; + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd); + + cmd = ADBLISTEN(adbaddr, 1); + buffer[0]=2; + buffer[1]=0x01; + buffer[2]=0x81; + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd); + + cmd = ADBLISTEN(adbaddr, 1); + buffer[0]=2; + buffer[1]=0x02; + buffer[2]=0x81; + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd); + + cmd = ADBLISTEN(adbaddr, 1); + buffer[0]=2; + buffer[1]=0x03; + buffer[2]=0x38; + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd); + + sc->sc_buttons = 3; + sc->sc_res = 400; + if (buffer[2] == 0x21) + sc->sc_class = MSCLASS_TRACKBALL; + else + sc->sc_class = MSCLASS_MOUSE; + } else + /* unknown device? */; + } else { + /* Attempt to initialize as an A3 mouse */ + buffer[2] = 0x03; /* make handler ID 3 */ + cmd = ADBLISTEN(adbaddr, 3); + if (adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd)) { +#ifdef ADB_DEBUG + if (adb_debug) + printf("adb: ems_init timed out\n"); +#endif + return; + } + + /* + * Check to see if successful, if not + * try to initialize it as other types + */ + cmd = ADBTALK(adbaddr, 3); + if (adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd) == 0 + && buffer[2] == ADBMS_MSA3) { + sc->handler_id = ADBMS_MSA3; + /* Initialize as above */ + cmd = ADBLISTEN(adbaddr, 2); + /* listen 2 */ + buffer[0] = 3; + buffer[1] = 0x00; + /* Irrelevant, buffer has 0x77 */ + buffer[2] = 0x07; + /* + * enable 3 button mode = 0111b, + * speed = normal + */ + adb_op_sync((Ptr)buffer, (Ptr)0, (Ptr)0, cmd); + sc->sc_buttons = 3; + sc->sc_res = 300; + } else { + /* No special support for this mouse */ + } + } + } +} + +/* + * Handle putting the mouse data received from the ADB into + * an ADB event record. + */ +void +ms_adbcomplete(caddr_t buffer, caddr_t data_area, int adb_command) +{ + adb_event_t event; + struct ams_softc *sc; + int adbaddr; +#ifdef ADB_DEBUG + int i; + + if (adb_debug) + printf("adb: transaction completion\n"); +#endif + + adbaddr = ADB_CMDADDR(adb_command); + sc = (struct ams_softc *)data_area; + + if ((sc->handler_id == ADBMS_EXTENDED) && (sc->sc_devid[0] == 0)) { + /* massage the data to look like EMP data */ + if ((buffer[3] & 0x04) == 0x04) + buffer[1] &= 0x7f; + else + buffer[1] |= 0x80; + if ((buffer[3] & 0x02) == 0x02) + buffer[2] &= 0x7f; + else + buffer[2] |= 0x80; + if ((buffer[3] & 0x01) == 0x01) + buffer[3] = 0x00; + else + buffer[3] = 0x80; + } + + event.addr = adbaddr; + event.hand_id = sc->handler_id; + event.def_addr = sc->origaddr; + event.byte_count = buffer[0]; + memcpy(event.bytes, buffer + 1, event.byte_count); + +#ifdef ADB_DEBUG + if (adb_debug) { + printf("ams: from %d at %d (org %d) %d:", event.addr, + event.hand_id, event.def_addr, buffer[0]); + for (i = 1; i <= buffer[0]; i++) + printf(" %x", buffer[i]); + printf("\n"); + } +#endif + + microtime(&event.timestamp); + + ms_processevent(&event, sc); +} + +/* + * Given a mouse ADB event, record the button settings, calculate the + * x- and y-axis motion, and handoff the event to the appropriate subsystem. + */ +void +ms_processevent(adb_event_t *event, struct ams_softc *sc) +{ + adb_event_t new_event; + int i, button_bit, max_byte, mask, buttons; + + new_event = *event; + buttons = 0; + + /* + * This should handle both plain ol' Apple mice and mice + * that claim to support the Extended Apple Mouse Protocol. + */ + max_byte = event->byte_count; + button_bit = 1; + switch (event->hand_id) { + case ADBMS_USPEED: + case ADBMS_UCONTOUR: + /* MicroSpeed mouse and Contour mouse */ + if (max_byte == 4) + buttons = (~event->bytes[2]) & 0xff; + else + buttons = (event->bytes[0] & 0x80) ? 0 : 1; + break; + case ADBMS_MSA3: + /* Mouse Systems A3 mouse */ + if (max_byte == 3) + buttons = (~event->bytes[2]) & 0x07; + else + buttons = (event->bytes[0] & 0x80) ? 0 : 1; + break; + default: + /* Classic Mouse Protocol (up to 2 buttons) */ + for (i = 0; i < 2; i++, button_bit <<= 1) + /* 0 when button down */ + if (!(event->bytes[i] & 0x80)) + buttons |= button_bit; + else + buttons &= ~button_bit; + /* Extended Protocol (up to 6 more buttons) */ + for (mask = 0x80; i < max_byte; + i += (mask == 0x80), button_bit <<= 1) { + /* 0 when button down */ + if (!(event->bytes[i] & mask)) + buttons |= button_bit; + else + buttons &= ~button_bit; + mask = ((mask >> 4) & 0xf) + | ((mask & 0xf) << 4); + } + break; + } + new_event.u.m.buttons = sc->sc_mb | buttons; + new_event.u.m.dx = ((signed int) (event->bytes[1] & 0x3f)) - + ((event->bytes[1] & 0x40) ? 64 : 0); + new_event.u.m.dy = ((signed int) (event->bytes[0] & 0x3f)) - + ((event->bytes[0] & 0x40) ? 64 : 0); + + if (sc->sc_wsmousedev) + wsmouse_input(sc->sc_wsmousedev, new_event.u.m.buttons, + new_event.u.m.dx, -new_event.u.m.dy, 0, + WSMOUSE_INPUT_DELTA); +} + +int +ams_enable(void *v) +{ + return 0; +} + +int +ams_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p) +{ + switch (cmd) { + case WSMOUSEIO_GTYPE: + *(u_int *)data = WSMOUSE_TYPE_ADB; + return (0); + } + + return -1; +} + +void +ams_disable(void *v) +{ +} diff --git a/sys/arch/mac68k/dev/amsvar.h b/sys/arch/mac68k/dev/amsvar.h new file mode 100644 index 00000000000..a4d7960cbd6 --- /dev/null +++ b/sys/arch/mac68k/dev/amsvar.h @@ -0,0 +1,67 @@ +/* $OpenBSD: amsvar.h,v 1.1 2006/01/04 20:39:04 miod Exp $ */ +/* $NetBSD: amsvar.h,v 1.4 1999/06/17 06:59:05 tsubai Exp $ */ + +/* + * Copyright (C) 1998 Colin Wood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Colin Wood. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MAC68K_AMSVAR_H_ +#define _MAC68K_AMSVAR_H_ + +/* + * State info, per mouse instance. + */ +struct ams_softc { + struct device sc_dev; + + /* ADB info */ + int origaddr; /* ADB device type (ADBADDR_MS) */ + int adbaddr; /* current ADB address */ + int handler_id; /* type of mouse */ + + /* Extended Mouse Protocol info, faked for non-EMP mice */ + u_int8_t sc_class; /* mouse class (mouse, trackball) */ + u_int8_t sc_buttons; /* number of buttons */ + u_int32_t sc_res; /* mouse resolution (dpi) */ + char sc_devid[5]; /* device indentifier */ + + int sc_mb; /* current button state */ + struct device *sc_wsmousedev; +}; + +/* EMP device classes */ +#define MSCLASS_TABLET 0 +#define MSCLASS_MOUSE 1 +#define MSCLASS_TRACKBALL 2 +#define MSCLASS_TRACKPAD 3 + +void ms_adbcomplete(caddr_t buffer, caddr_t data_area, int adb_command); +void ms_handoff(adb_event_t *event, struct ams_softc *); + +#endif /* _MAC68K_AMSVAR_H_ */ diff --git a/sys/arch/mac68k/dev/grf.c b/sys/arch/mac68k/dev/grf.c deleted file mode 100644 index 159df4083a1..00000000000 --- a/sys/arch/mac68k/dev/grf.c +++ /dev/null @@ -1,315 +0,0 @@ -/* $OpenBSD: grf.c,v 1.30 2005/10/23 19:00:26 martin Exp $ */ -/* $NetBSD: grf.c,v 1.53 1998/06/02 02:14:20 scottr Exp $ */ - -/* - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: Utah $Hdr: grf.c 1.31 91/01/21$ - * - * @(#)grf.c 7.8 (Berkeley) 5/7/91 - */ - -/* - * Graphics display driver for the Macintosh. - * This is the hardware-independent portion of the driver. - * Hardware access is through the grfdev routines below. - */ - -#include <sys/param.h> - -#include <sys/device.h> -#include <sys/ioctl.h> -#include <sys/file.h> -#include <sys/malloc.h> -#include <sys/mman.h> -#include <sys/poll.h> -#include <sys/proc.h> -#include <sys/resourcevar.h> -#include <sys/vnode.h> -#include <sys/systm.h> - -#include <machine/bus.h> -#include <machine/cpu.h> -#include <machine/grfioctl.h> - -#include <miscfs/specfs/specdev.h> - -#include <uvm/uvm.h> - -#include <mac68k/dev/nubus.h> -#include <mac68k/dev/itevar.h> -#include <mac68k/dev/grfvar.h> - -#include "grf.h" -#include "ite.h" - -#if NITE == 0 -#define iteon(u,f) -#define iteoff(u,f) -#endif - -int grfmatch(struct device *, void *, void *); -void grfattach(struct device *, struct device *, void *); - -struct cfdriver grf_cd = { - NULL, "grf", DV_DULL -}; - -struct cfattach grf_ca = { - sizeof(struct grf_softc), grfmatch, grfattach -}; - -#ifdef DEBUG -#define GRF_DEBUG -#endif - -#ifdef GRF_DEBUG -#define GDB_DEVNO 0x01 -#define GDB_MMAP 0x02 -#define GDB_IOMAP 0x04 -#define GDB_LOCK 0x08 -int grfdebug = 0; -#endif - -int -grfmatch(parent, vcf, aux) - struct device *parent; - void *vcf; - void *aux; -{ - struct grfbus_attach_args *ga = aux; - - return (strcmp(ga->ga_name, "grf") == 0); -} - -void -grfattach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - struct grf_softc *sc = (struct grf_softc *)self; - struct grfbus_attach_args *ga = aux; - - printf("\n"); - - /* Load forwarded pointers. */ - sc->sc_grfmode = ga->ga_grfmode; - sc->sc_slot = ga->ga_slot; - sc->sc_tag = ga->ga_tag; - sc->sc_regh = ga->ga_handle; - sc->sc_mode = ga->ga_mode; - sc->sc_phys = ga->ga_phys; - - sc->sc_flags = GF_ALIVE; /* XXX bogus */ - - /* - * Attach ite semantics to the grf. Change the name, forward - * everything else. - */ - ga->ga_name = "ite"; - (void)config_found(self, ga, grfbusprint); -} - -/*ARGSUSED*/ -int -grfopen(dev, flag, mode, p) - dev_t dev; - int flag; - int mode; - struct proc *p; -{ - register struct grf_softc *gp; - int unit; - int error; - - unit = GRFUNIT(dev); - gp = grf_cd.cd_devs[unit]; - - if (unit >= grf_cd.cd_ndevs || (gp->sc_flags & GF_ALIVE) == 0) - return (ENXIO); - - if ((gp->sc_flags & (GF_OPEN | GF_EXCLUDE)) == (GF_OPEN | GF_EXCLUDE)) - return (EBUSY); - - /* - * First open. - * XXX: always put in graphics mode. - */ - error = 0; - if ((gp->sc_flags & GF_OPEN) == 0) { - gp->sc_flags |= GF_OPEN; - error = grfon(dev); - } - return (error); -} - -/*ARGSUSED*/ -int -grfclose(dev, flag, mode, p) - dev_t dev; - int flag; - int mode; - struct proc *p; -{ - register struct grf_softc *gp; - - gp = grf_cd.cd_devs[GRFUNIT(dev)]; - - (void)grfoff(dev); - gp->sc_flags &= GF_ALIVE; - - return (0); -} - -/*ARGSUSED*/ -int -grfioctl(dev, cmd, data, flag, p) - dev_t dev; - int cmd; - caddr_t data; - int flag; - struct proc *p; -{ - struct grf_softc *gp; - struct grfmode *gm; - int error; - int unit = GRFUNIT(dev); - - gp = grf_cd.cd_devs[unit]; - gm = gp->sc_grfmode; - error = 0; - - switch (cmd) { - case GRFIOCON: - error = grfon(dev); - break; - case GRFIOCOFF: - error = grfoff(dev); - break; - - case GRFIOCGMODE: - bcopy(gm, data, sizeof(struct grfmode)); - break; - case GRFIOCGETMODE: - error = (*gp->sc_mode)(gp, GM_CURRMODE, data); - break; - case GRFIOCSETMODE: - error = (*gp->sc_mode)(gp, GM_NEWMODE, data); - break; - case GRFIOCLISTMODES: - error = (*gp->sc_mode)(gp, GM_LISTMODES, data); - break; - - default: - error = EINVAL; - break; - } - return (error); -} - -/*ARGSUSED*/ -int -grfpoll(dev, events, p) - dev_t dev; - int events; - struct proc *p; -{ - /* always fails => never blocks */ - return (events & (POLLOUT | POLLWRNORM)); -} - -/*ARGSUSED*/ -paddr_t -grfmmap(dev, off, prot) - dev_t dev; - off_t off; - int prot; -{ - struct grf_softc *gp = grf_cd.cd_devs[GRFUNIT(dev)]; - struct grfmode *gm = gp->sc_grfmode; - u_long addr; - -#ifdef GRF_DEBUG - if (grfdebug & GDB_MMAP) - printf("grfmmap(%x): off %x, prot %x\n", dev, off, prot); -#endif - - if (off < trunc_page(gm->fboff) || - off >= round_page(gm->fbsize + gm->fboff)) - addr = (-1); /* XXX bogus */ - else - addr = atop(gp->sc_phys + off); - -#ifdef GRF_DEBUG - if (grfdebug & GDB_MMAP) - printf("grfmmap(%x): returning addr 0x%08lx\n", dev, addr); -#endif - return (int)addr; -} - -int -grfon(dev) - dev_t dev; -{ - int unit = GRFUNIT(dev); - struct grf_softc *gp; - - gp = grf_cd.cd_devs[unit]; - - /* - * XXX: iteoff call relies on devices being in same order - * as ITEs and the fact that iteoff only uses the minor part - * of the dev arg. - */ - iteoff(unit, 3); - - return (*gp->sc_mode)(gp, GM_GRFON, NULL); -} - -int -grfoff(dev) - dev_t dev; -{ - int unit = GRFUNIT(dev); - struct grf_softc *gp; - int error; - - gp = grf_cd.cd_devs[unit]; - - error = (*gp->sc_mode)(gp, GM_GRFOFF, NULL); - - /* XXX: see comment for iteoff above */ - iteon(unit, 2); - - return (error); -} diff --git a/sys/arch/mac68k/dev/grf_iv.c b/sys/arch/mac68k/dev/grf_iv.c index d00d3e28936..58220e594e2 100644 --- a/sys/arch/mac68k/dev/grf_iv.c +++ b/sys/arch/mac68k/dev/grf_iv.c @@ -1,4 +1,4 @@ -/* $OpenBSD: grf_iv.c,v 1.31 2005/09/27 09:45:48 martin Exp $ */ +/* $OpenBSD: grf_iv.c,v 1.32 2006/01/04 20:39:04 miod Exp $ */ /* $NetBSD: grf_iv.c,v 1.17 1997/02/20 00:23:27 scottr Exp $ */ /* @@ -72,7 +72,6 @@ #include <machine/autoconf.h> #include <machine/bus.h> #include <machine/cpu.h> -#include <machine/grfioctl.h> #include <machine/viareg.h> #include <uvm/uvm_extern.h> @@ -88,7 +87,6 @@ extern long videorowbytes; extern long videobitdepth; extern u_long videosize; -static int grfiv_mode(struct grf_softc *gp, int cmd, void *arg); static int grfiv_match(struct device *, void *, void *); static void grfiv_attach(struct device *, struct device *, void *); @@ -364,25 +362,5 @@ grfiv_attach(parent, self, aux) gm->fboff = sc->sc_fbofs; /* Perform common video attachment. */ - grf_establish(sc, NULL, grfiv_mode); -} - -static int -grfiv_mode(sc, cmd, arg) - struct grf_softc *sc; - int cmd; - void *arg; -{ - switch (cmd) { - case GM_GRFON: - case GM_GRFOFF: - return 0; - case GM_CURRMODE: - break; - case GM_NEWMODE: - break; - case GM_LISTMODES: - break; - } - return EINVAL; + grf_establish(sc); } diff --git a/sys/arch/mac68k/dev/grf_mv.c b/sys/arch/mac68k/dev/grf_mv.c index 9893193d021..b42a5ef83af 100644 --- a/sys/arch/mac68k/dev/grf_mv.c +++ b/sys/arch/mac68k/dev/grf_mv.c @@ -1,4 +1,4 @@ -/* $OpenBSD: grf_mv.c,v 1.26 2005/09/12 10:07:29 martin Exp $ */ +/* $OpenBSD: grf_mv.c,v 1.27 2006/01/04 20:39:05 miod Exp $ */ /* $NetBSD: grf_nubus.c,v 1.62 2001/01/22 20:27:02 briggs Exp $ */ /* @@ -42,7 +42,6 @@ #include <machine/bus.h> #include <machine/cpu.h> -#include <machine/grfioctl.h> #include <machine/viareg.h> #include <mac68k/dev/nubus.h> @@ -68,7 +67,6 @@ static int grfmv_intr_gvimage(void *vsc); static int grfmv_intr_radius_gsc(void *vsc); static int grfmv_intr_radius_gx(void *vsc); -static int grfmv_mode(struct grf_softc *gp, int cmd, void *arg); static int grfmv_match(struct device *, void *, void *); static void grfmv_attach(struct device *, struct device *, void *); @@ -375,27 +373,7 @@ bad: } /* Perform common video attachment. */ - grf_establish(sc, &sc->sc_slot, grfmv_mode); -} - -static int -grfmv_mode(gp, cmd, arg) - struct grf_softc *gp; - int cmd; - void *arg; -{ - switch (cmd) { - case GM_GRFON: - case GM_GRFOFF: - return 0; - case GM_CURRMODE: - break; - case GM_NEWMODE: - break; - case GM_LISTMODES: - break; - } - return EINVAL; + grf_establish(sc); } /* Interrupt handlers... */ diff --git a/sys/arch/mac68k/dev/grf_subr.c b/sys/arch/mac68k/dev/grf_subr.c index 58c44afef60..ac35af1678e 100644 --- a/sys/arch/mac68k/dev/grf_subr.c +++ b/sys/arch/mac68k/dev/grf_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: grf_subr.c,v 1.7 2005/08/06 19:51:43 martin Exp $ */ +/* $OpenBSD: grf_subr.c,v 1.8 2006/01/04 20:39:05 miod Exp $ */ /* $NetBSD: grf_subr.c,v 1.6 1997/02/20 00:23:28 scottr Exp $ */ /*- @@ -42,16 +42,13 @@ #include <sys/systm.h> #include <machine/bus.h> -#include <machine/grfioctl.h> #include <mac68k/dev/nubus.h> #include <mac68k/dev/grfvar.h> void -grf_establish(sc, sp, g_mode) +grf_establish(sc) struct grfbus_softc *sc; - nubus_slot *sp; - int (*g_mode)(struct grf_softc *, int, void *); { struct grfmode *gm = &sc->curr_mode; struct grfbus_attach_args ga; @@ -66,9 +63,7 @@ grf_establish(sc, sp, g_mode) /* Attach grf semantics to the hardware. */ ga.ga_name = "grf"; ga.ga_grfmode = gm; - ga.ga_slot = sp; ga.ga_phys = sc->sc_basepa; - ga.ga_mode = g_mode; (void)config_found(&sc->sc_dev, &ga, grfbusprint); } diff --git a/sys/arch/mac68k/dev/grfvar.h b/sys/arch/mac68k/dev/grfvar.h index 4ac5a1ffb60..a89a57c453d 100644 --- a/sys/arch/mac68k/dev/grfvar.h +++ b/sys/arch/mac68k/dev/grfvar.h @@ -1,5 +1,6 @@ -/* $OpenBSD: grfvar.h,v 1.16 2005/08/06 19:51:43 martin Exp $ */ +/* $OpenBSD: grfvar.h,v 1.17 2006/01/04 20:39:05 miod Exp $ */ /* $NetBSD: grfvar.h,v 1.11 1996/08/04 06:03:58 scottr Exp $ */ +/* $NetBSD: grfioctl.h,v 1.5 1995/07/02 05:26:45 briggs Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,6 +40,21 @@ * @(#)grfvar.h 7.3 (Berkeley) 5/7/91 */ +struct grfmode { + u_int8_t mode_id; /* Identifier for mode */ + caddr_t fbbase; /* Base of page of frame buffer */ + u_int32_t fbsize; /* Size of frame buffer */ + u_int16_t fboff; /* Offset of frame buffer from base */ + u_int16_t rowbytes; /* Screen rowbytes */ + u_int16_t width; /* Screen width */ + u_int16_t height; /* Screen height */ + u_int16_t hres; /* Horizontal resolution (dpi) */ + u_int16_t vres; /* Vertical resolution (dpi) */ + u_int16_t ptype; /* 0 = indexed, 0x10 = direct */ + u_int16_t psize; /* Screen depth */ + char pad[32]; /* Space for expansion */ +}; + #define CARD_NAME_LEN 64 /* @@ -64,38 +80,14 @@ struct grfbus_softc { }; /* - * State info, per grf instance. - */ -struct grf_softc { - struct device sc_dev; /* device glue */ - - bus_space_tag_t sc_tag; - bus_space_handle_t sc_regh; - - int sc_flags; /* driver flags */ - u_long sc_phys; /* PA of framebuffer */ - - struct grfmode *sc_grfmode; /* forwarded ... */ - nubus_slot *sc_slot; - /* mode-change on/off/mode function */ - int (*sc_mode)(struct grf_softc *, int, void *); -}; - -/* * Attach grf and ite semantics to Mac video hardware. */ struct grfbus_attach_args { char *ga_name; /* name of semantics to attach */ - bus_space_tag_t ga_tag; - bus_space_handle_t ga_handle; struct grfmode *ga_grfmode; - nubus_slot *ga_slot; bus_addr_t ga_phys; - int (*ga_mode)(struct grf_softc *, int, void *); }; -typedef caddr_t (*grf_phys_t)(struct grf_softc *gp, vaddr_t addr); - /* flags */ #define GF_ALIVE 0x01 #define GF_OPEN 0x02 @@ -112,7 +104,7 @@ typedef caddr_t (*grf_phys_t)(struct grf_softc *gp, vaddr_t addr); #define GM_NEWMODE 5 /* minor device interpretation */ -#define GRFUNIT(d) ((d) & 0x7) +#define GRFUNIT(d) (minor(d)) /* * Nubus image data structure. This is the equivalent of a PixMap in @@ -144,17 +136,5 @@ struct image_data { #define VID_PAGE_CNT 3 #define VID_DEV_TYPE 4 -int grfopen(dev_t dev, int flag, int mode, struct proc *p); -int grfclose(dev_t dev, int flag, int mode, struct proc *p); -int grfioctl(dev_t, int, caddr_t, int, struct proc *p); -int grfpoll(dev_t dev, int rw, struct proc *p); -paddr_t grfmmap(dev_t dev, off_t off, int prot); -int grfon(dev_t dev); -int grfoff(dev_t dev); -int grfaddr(struct grf_softc *gp, register int off); -int grfmap(dev_t dev, caddr_t *addrp, struct proc *p); -int grfunmap(dev_t dev, caddr_t addr, struct proc *p); - -void grf_establish(struct grfbus_softc *, nubus_slot *, - int (*)(struct grf_softc *, int, void *)); +void grf_establish(struct grfbus_softc *); int grfbusprint(void *, const char *); diff --git a/sys/arch/mac68k/dev/ite.c b/sys/arch/mac68k/dev/ite.c deleted file mode 100644 index 30917bd4cfd..00000000000 --- a/sys/arch/mac68k/dev/ite.c +++ /dev/null @@ -1,1345 +0,0 @@ -/* $OpenBSD: ite.c,v 1.25 2005/07/23 23:28:58 martin Exp $ */ -/* $NetBSD: ite.c,v 1.32 1997/02/20 00:23:25 scottr Exp $ */ - -/* - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: Utah $Hdr: ite.c 1.28 92/12/20$ - * - * @(#)ite.c 8.2 (Berkeley) 1/12/94 - */ - -/* - * ite.c - * - * The ite module handles the system console; that is, stuff printed - * by the kernel and by user programs while "desktop" and X aren't - * running. Some (very small) parts are based on hp300's 4.4 ite.c, - * hence the above copyright. - * - * -- Brad and Lawrence, June 26th, 1994 - * - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <dev/cons.h> -#include <sys/conf.h> -#include <sys/device.h> -#include <sys/ioctl.h> -#include <sys/malloc.h> -#include <sys/proc.h> -#include <sys/tty.h> - -#include <machine/bus.h> -#include <machine/cpu.h> -#include <machine/frame.h> -#include <machine/viareg.h> - -#define KEYBOARD_ARRAY -#include <machine/keyboard.h> -#include <machine/adbsys.h> -#include <machine/iteioctl.h> -#include <machine/grfioctl.h> - -#include <uvm/uvm_extern.h> -#include <uvm/uvm_pmap.h> - -#include "../mac68k/macrom.h" - -#include "nubus.h" -#include "itevar.h" -#include "grfvar.h" - -#include "6x10.h" -#define CHARWIDTH 6 -#define CHARHEIGHT 10 - -/* Local function prototypes */ -static __inline void putpixel1(int, int, int *, int); -static void putpixel2(int, int, int *, int); -static void putpixel4(int, int, int *, int); -static void putpixel8(int, int, int *, int); -static void putpixel16(int, int, int *, int); -static void putpixel32(int, int, int *, int); -static void reversepixel1(int, int, int); -static void writechar(char, int, int, int); -static void drawcursor(void); -static void erasecursor(void); -static void scrollup(void); -static void scrolldown(void); -static void clear_screen(int); -static void clear_line(int); -static void reset_tabs(void); -static void clear_tabs(void); -static void vt100_reset(void); -static void putc_normal(char); -static void putc_esc(char); -static void putc_gotpars(char); -static void putc_getpars(char); -static void putc_square(char); -static void ite_putchar(char); -static int ite_pollforchar(void); -static int itematch(struct device *, void *, void *); -static void iteattach(struct device *, struct device *, void *); -static int ite_init(void); - -#define dprintf if (0) printf - -#define ATTR_NONE 0 -#define ATTR_BOLD 1 -#define ATTR_UNDER 2 -#define ATTR_REVERSE 4 - -enum vt100state_e { - ESnormal, /* Nothing yet */ - ESesc, /* Got ESC */ - ESsquare, /* Got ESC [ */ - ESgetpars, /* About to get or getting the parameters */ - ESgotpars, /* Finished getting the parameters */ - ESfunckey, /* Function key */ - EShash, /* DEC-specific stuff (screen align, etc.) */ - ESsetG0, /* Specify the G0 character set */ - ESsetG1, /* Specify the G1 character set */ - ESignore /* Ignore this sequence */ -} vt100state = ESnormal; - -/* From Booter via locore */ -long videoaddr; -long videorowbytes; -long videobitdepth; -unsigned long videosize; - -/* Calculated by itecninit() */ -static int ite_initted = 0; -static int width, height; /* width, height in pixels */ -static int scrcols, scrrows; /* width, height in characters */ -static int screenrowbytes; /* number of visible bytes per row */ - -/* VT100 emulation */ -#define MAXPARS 16 /* max number of VT100 op parameters */ -static int par[MAXPARS], numpars; /* parameter array, # of parameters */ -static int x = 0, y = 0; /* current VT100 cursor location */ -static int savex, savey; /* saved cursor location */ -static int hanging_cursor; /* cursor waiting for more output */ -static int attr; /* current video attribute */ -static char tab_stops[255]; /* tab stops */ -static int scrreg_top; /* scroll region */ -static int scrreg_bottom; - -/* Console bell parameters */ -static int bell_freq = 1880; /* frequency */ -static int bell_length = 10; /* duration */ -static int bell_volume = 100; /* volume */ - -/* For polled ADB mode */ -static int polledkey; -extern int adb_polling; - -extern u_int32_t mac68k_vidphys; - -struct tty *ite_tty; /* Our tty */ - -static void (*putpixel)(int x, int y, int *c, int num); -static void (*reversepixel)(int x, int y, int num); - -/* For capslock key functionality */ -#define isealpha(ch) (((ch)>='A'&&(ch)<='Z')||((ch)>='a'&&(ch)<='z')||((ch)>=0xC0&&(ch)<=0xFF)) - -/* - * Bitmap handling functions - */ - -static __inline void -putpixel1(xx, yy, c, num) - int xx, yy; - int *c; - int num; -{ - unsigned int i, mask; - unsigned char *sc; - - sc = (unsigned char *) videoaddr; - - i = 7 - (xx & 7); - mask = ~(1 << i); - sc += yy * videorowbytes + (xx >> 3); - while (num--) { - *sc &= mask; - *sc |= (*c++ & 1) << i; - sc += videorowbytes; - } -} - -static void -putpixel2(xx, yy, c, num) - int xx, yy; - int *c; - int num; -{ - unsigned int i, mask; - unsigned char *sc; - - sc = (unsigned char *) videoaddr; - - i = 6 - ((xx & 3) << 1); - mask = ~(3 << i); - sc += yy * videorowbytes + (xx >> 2); - while (num--) { - *sc &= mask; - *sc |= (*c++ & 3) << i; - sc += videorowbytes; - } -} - -static void -putpixel4(xx, yy, c, num) - int xx, yy; - int *c; - int num; -{ - unsigned int i, mask; - unsigned char *sc; - - sc = (unsigned char *) videoaddr; - - i = 4 - ((xx & 1) << 2); - mask = ~(15 << i); - sc += yy * videorowbytes + (xx >> 1); - while (num--) { - *sc &= mask; - *sc |= (*c++ & 15) << i; - sc += videorowbytes; - } -} - -static void -putpixel8(xx, yy, c, num) - int xx, yy; - int *c; - int num; -{ - unsigned char *sc; - - sc = (unsigned char *) videoaddr; - - sc += yy * videorowbytes + xx; - while (num--) { - *sc = *c++ & 0xff; - sc += videorowbytes; - } -} - -static void -putpixel16(xx, yy, c, num) - int xx, yy; - int *c; - int num; -{ - unsigned short *sc; - int videorowshorts; - unsigned char uc; - - sc = (unsigned short *)videoaddr; - - videorowshorts = videorowbytes >> 1; - sc += yy * videorowshorts + xx; - while (num--) { - uc = (*c++ & 0xff); - *sc = (uc << 8) | uc; - sc += videorowshorts; - } -} - -static void -putpixel32(xx, yy, c, num) - int xx, yy; - int *c; - int num; -{ - unsigned long *sc; - int videorowlongs; - unsigned char uc; - - sc = (unsigned long *)videoaddr; - - videorowlongs = videorowbytes >> 2; - sc += yy * videorowlongs + xx; - while (num--) { - uc = (*c++ & 0xff); - *sc = (uc << 24) | (uc << 16) | (uc << 8) | uc; - sc += videorowlongs; -} -} - -static void -reversepixel1(xx, yy, num) - int xx, yy, num; -{ - unsigned int mask; - unsigned char *sc; - unsigned long *sl; - unsigned short *ss; - int videorowshorts; - int videorowlongs; - - sc = (unsigned char *) videoaddr; - mask = 0; /* Get rid of warning from compiler */ - - switch (videobitdepth) { - case 1: - mask = 1 << (7 - (xx & 7)); - sc += yy * videorowbytes + (xx >> 3); - break; - case 2: - mask = 3 << (6 - ((xx & 3) << 1)); - sc += yy * videorowbytes + (xx >> 2); - break; - case 4: - mask = 15 << (4 - ((xx & 1) << 2)); - sc += yy * videorowbytes + (xx >> 1); - break; - case 8: - mask = 255; - sc += yy * videorowbytes + xx; - break; - case 16: - videorowshorts = videorowbytes >> 1; - ss = (unsigned short *) videoaddr; - ss += yy * videorowshorts + xx; - while (num--) { - *ss ^= 0xffff; - ss += videorowshorts; - } - return; - case 32: - videorowlongs = videorowbytes >> 2; - sl = (unsigned long *) videoaddr; - sl += yy * videorowlongs + xx; - while (num--) { - *sl ^= 0xffffffff; - sl += videorowlongs; - } - return; - default: - panic("reversepixel(): unsupported bit depth"); - } - - while (num--) { - *sc ^= mask; - sc += videorowbytes; - } -} - -static void -writechar(ch, x, y, attr) - char ch; - int x, y, attr; -{ - int i, j, mask, rev, col[CHARHEIGHT]; - unsigned char *c; - - ch &= 0x7F; - x *= CHARWIDTH; - y *= CHARHEIGHT; - - rev = (attr & ATTR_REVERSE) ? 255 : 0; - - c = &Font6x10[ch * CHARHEIGHT]; - - switch (videobitdepth) { - case 1: - for (j = 0; j < CHARWIDTH; j++) { - mask = 1 << (CHARWIDTH - 1 - j); - for (i = 0; i < CHARHEIGHT; i++) - col[i] = ((c[i] & mask) ? 255 : 0) ^ rev; - putpixel1(x + j, y, col, CHARHEIGHT); - } - if (attr & ATTR_UNDER) { - col[0] = 255; - for (j = 0; j < CHARWIDTH; j++) - putpixel1(x + j, y + CHARHEIGHT - 1, col, 1); - } - break; - case 2: - case 4: - case 8: - case 16: - case 32: - for (j = 0; j < CHARWIDTH; j++) { - mask = 1 << (CHARWIDTH - 1 - j); - for (i = 0; i < CHARHEIGHT; i++) - col[i] = ((c[i] & mask) ? 255 : 0) ^ rev; - putpixel(x + j, y, col, CHARHEIGHT); - } - if (attr & ATTR_UNDER) { - col[0] = 255; - for (j = 0; j < CHARWIDTH; j++) - putpixel(x + j, y + CHARHEIGHT - 1, col, 1); - } - break; - } -} - -static void -drawcursor() -{ - unsigned int j, X, Y; - - X = x * CHARWIDTH; - Y = y * CHARHEIGHT; - - for (j = 0; j < CHARWIDTH; j++) - reversepixel(X + j, Y, CHARHEIGHT); -} - -static void -erasecursor() -{ - unsigned int j, X, Y; - - X = x * CHARWIDTH; - Y = y * CHARHEIGHT; - - for (j = 0; j < CHARWIDTH; j++) - reversepixel(X + j, Y, CHARHEIGHT); -} - -static void -scrollup() -{ - unsigned char *from, *to; - unsigned int linebytes; - unsigned short i; - - linebytes = videorowbytes * CHARHEIGHT; - to = (unsigned char *) videoaddr + (scrreg_top * linebytes); - from = to + linebytes; - - for (i = (scrreg_bottom - scrreg_top) * CHARHEIGHT; i > 0; i--) { - ovbcopy(from, to, screenrowbytes); - from += videorowbytes; - to += videorowbytes; - } - for (i = CHARHEIGHT; i > 0; i--) { - bzero(to, screenrowbytes); - to += videorowbytes; - } -} - -static void -scrolldown() -{ - unsigned char *from, *to; - unsigned int linebytes; - unsigned short i; - - linebytes = videorowbytes * CHARHEIGHT; - to = (unsigned char *) videoaddr + ((scrreg_bottom + 1) * linebytes); - from = to - linebytes; - - for (i = (scrreg_bottom - scrreg_top) * CHARHEIGHT; i > 0; i--) { - from -= videorowbytes; - to -= videorowbytes; - ovbcopy(from, to, screenrowbytes); - } - for (i = CHARHEIGHT; i > 0; i--) { - to -= videorowbytes; - bzero(to, screenrowbytes); - } -} - -static void -clear_screen(which) - int which; -{ - unsigned char *p; - unsigned short len, i; - - p = (unsigned char *) videoaddr; - - switch (which) { - case 0: /* To end of screen */ - if (x > 0) { - clear_line(0); - if (y < scrrows) - y++; - x = 0; - } - p += y * videorowbytes * CHARHEIGHT; - len = scrrows - y; - break; - case 1: /* To start of screen */ - if (x > 0) { - clear_line(1); - if (y > 0) - y--; - x = 0; - } - len = y; - break; - case 2: /* Whole screen */ - default: - len = scrrows; - break; - } - - for (i = len * CHARHEIGHT; i > 0; i--) { - bzero(p, screenrowbytes); - p += videorowbytes; - } -} - -static void -clear_line(which) - int which; -{ - unsigned char *to; - unsigned int linebytes; - int start, end, i; - - - /* - * This routine runs extremely slowly. I don't think it's - * used all that often, except for To end of line. I'll go - * back and speed this up when I speed up the whole ite - * module. --LK - */ - - switch (which) { - default: - case 0: /* To end of line */ - start = x; - end = scrcols; - break; - case 1: /* To start of line */ - start = 0; - end = x; - break; - case 2: /* Whole line */ - linebytes = videorowbytes * CHARHEIGHT; - to = (unsigned char *) videoaddr + (y * linebytes); - - for (i = CHARHEIGHT; i > 0; i--) { - bzero(to, screenrowbytes); - to += videorowbytes; - } - return; - } - - for (i = start; i < end; i++) - writechar(' ', i, y, ATTR_NONE); -} - -static void -reset_tabs() -{ - int i; - - for (i = 0; i<= scrcols; i++) - tab_stops[i] = ((i % 8) == 0); -} - -static void -clear_tabs() -{ - int i; - - for (i = 0; i <= scrcols; i++) - tab_stops[i] = 0; -} - -static void -vt100_reset() -{ - reset_tabs(); - scrreg_top = 0; - scrreg_bottom = scrrows - 1; - attr = ATTR_NONE; -} - -static void -putc_normal(ch) - char ch; -{ - switch (ch) { - case '\a': /* Beep */ - mac68k_ring_bell(bell_freq, bell_length, bell_volume); - break; - case 127: /* Delete */ - case '\b': /* Backspace */ - if (hanging_cursor) - hanging_cursor = 0; - else if (x > 0) - x--; - break; - case '\t': /* Tab */ - do - ite_putchar(' '); - while ((tab_stops[x] == 0) && (x < scrcols)); - break; - case '\n': /* Line feed */ - if (y == scrreg_bottom) - scrollup(); - else - y++; - break; - case '\r': /* Carriage return */ - x = 0; - hanging_cursor = 0; - break; - case '\e': /* Escape */ - vt100state = ESesc; - hanging_cursor = 0; - break; - default: - if (ch >= ' ') { - if (hanging_cursor) { - x = 0; - if (y == scrreg_bottom) - scrollup(); - else - y++; - hanging_cursor = 0; - } - - writechar(ch, x, y, attr); - - if (x == scrcols - 1) - hanging_cursor = 1; - else - x++; - if (x >= scrcols) { /* can we ever get here? */ - x = 0; - y++; - } - } - break; - } -} - -static void -putc_esc(ch) - char ch; -{ - vt100state = ESnormal; - - switch (ch) { - case '[': - vt100state = ESsquare; - break; - case '(': - vt100state = ESsetG0; - break; - case ')': - vt100state = ESsetG1; - break; - case 'E': /* Next line */ - x = 0; - /* FALLTHROUGH */ - case 'D': /* Line feed */ - if (y == scrreg_bottom) - scrollup(); - else - y++; - break; - case 'H': /* Set tab stop */ - tab_stops[x] = 1; - break; - case 'M': /* Cursor up */ - if (y == scrreg_top) - scrolldown(); - else - y--; - break; - case '>': - vt100_reset(); - break; - case '7': /* Save cursor */ - savex = x; - savey = y; - break; - case '8': /* Restore cursor */ - x = savex; - y = savey; - break; - default: - /* Rest not supported */ - break; - } -} - -static void -putc_gotpars(ch) - char ch; -{ - int i; - - vt100state = ESnormal; - switch (ch) { - case 'A': /* Up */ - y -= par[0] ? par[0] : 1; - break; - case 'B': /* Down */ - y += par[0] ? par[0] : 1; - break; - case 'C': /* Right */ - x+= par[0] ? par[0] : 1; - break; - case 'D': /* Left */ - x-= par[0] ? par[0] : 1; - break; - case 'H': /* Set cursor position */ - case 'f': /* Set cursor position */ - x = par[1] - 1; - y = par[0] - 1; - hanging_cursor = 0; - break; - case 'J': /* Clear part of screen */ - clear_screen(par[0]); - break; - case 'K': /* Clear part of line */ - clear_line(par[0]); - break; - case 'L': /* Add line */ - if (scrreg_top < scrreg_bottom) { - i = scrreg_top; - scrreg_top = y; - scrolldown(); - scrreg_top = i; - } else - clear_line(0); - break; - case 'M': /* Delete line */ - if (scrreg_top < scrreg_bottom) { - i = scrreg_top; - scrreg_top = y; - scrollup(); - scrreg_top = i; - } else - clear_line(0); - break; - case 'g': /* Clear tab stops */ - if (numpars >= 1) { - if (par[0] == 3) - clear_tabs(); - else if (par[0] == 0) - tab_stops[x] = 0; - } - break; - case 'm': /* Set attribute */ - for (i = 0; i < numpars; i++) { - switch (par[i]) { - case 0: - attr = ATTR_NONE; - break; - case 1: - attr |= ATTR_BOLD; - break; - case 4: - attr |= ATTR_UNDER; - break; - case 7: - attr |= ATTR_REVERSE; - break; - case 21: - attr &= ~ATTR_BOLD; - break; - case 24: - attr &= ~ATTR_UNDER; - break; - case 27: - attr &= ~ATTR_REVERSE; - break; - } - } - break; - case 'r': /* Set scroll region */ - /* ensure top < bottom, and both within limits */ - if ((numpars > 0) && (par[0] < scrrows)) - scrreg_top = par[0] - 1; - else - scrreg_top = 0; - if ((numpars > 1) && (par[1] <= scrrows) && (par[1] > par[0])) - scrreg_bottom = par[1] - 1; - else - scrreg_bottom = scrrows - 1; - break; - } -} - -static void -putc_getpars(ch) - char ch; -{ - switch (ch) { - case '?': - /* Not supported */ - return; - case '[': - vt100state = ESnormal; - /* Not supported */ - return; - default: - if (ch == ';' && numpars < MAXPARS - 1) - numpars++; - else if (ch >= '0' && ch <= '9') { - par[numpars] *= 10; - par[numpars] += ch - '0'; - } else { - numpars++; - vt100state = ESgotpars; - putc_gotpars(ch); - } - } -} - -static void -putc_square(ch) - char ch; -{ - unsigned short i; - - for (i = 0; i < MAXPARS; i++) - par[i] = 0; - - numpars = 0; - vt100state = ESgetpars; - - putc_getpars(ch); -} - -static void -ite_putchar(ch) - char ch; -{ - switch (vt100state) { - default: - vt100state = ESnormal; /* FALLTHROUGH */ - case ESnormal: - putc_normal(ch); - break; - case ESesc: - putc_esc(ch); - break; - case ESsquare: - putc_square(ch); - break; - case ESgetpars: - putc_getpars(ch); - break; - case ESgotpars: - putc_gotpars(ch); - break; - } - - if (x >= scrcols) - x = scrcols - 1; - if (x < 0) - x = 0; - if (y >= scrrows) - y = scrrows - 1; - if (y < 0) - y = 0; -} - - -/* - * Keyboard support functions - */ - -static int -ite_pollforchar() -{ - int s; - register int intbits; - - s = splhigh(); - - polledkey = -1; - adb_polling = 1; - - /* pretend we're VIA interrupt dispatcher */ - while (polledkey == -1) { - intbits = via_reg(VIA1, vIFR); - - if (intbits & V1IF_ADBRDY) { - (void)mrg_adbintr(); - via_reg(VIA1, vIFR) = V1IF_ADBRDY; - } - if (intbits & 0x10) { - (void)mrg_pmintr(); - via_reg(VIA1, vIFR) = 0x10; - } - } - - adb_polling = 0; - - splx(s); - - return polledkey; -} - - -/* - * Autoconfig attachment - */ - -struct cfattach ite_ca = { - sizeof(struct device), itematch, iteattach -}; - -struct cfdriver ite_cd = { - NULL, "ite", DV_TTY -}; - -static int -itematch(parent, vcf, aux) - struct device *parent; - void *vcf; - void *aux; -{ - struct grfbus_attach_args *ga = aux; - struct grfmode *gm = ga->ga_grfmode; - paddr_t pa; - - if (strcmp(ga->ga_name, "ite")) - return 0; - pmap_extract(pmap_kernel(), (vaddr_t) gm->fbbase + gm->fboff, &pa); - - return (pa == (vaddr_t) mac68k_vidphys); -} - -static void -iteattach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - printf(" (minimal console)\n"); - (void) ite_init(); -} - - -/* - * Tty handling functions - */ - -int -iteopen(dev, mode, devtype, p) - dev_t dev; - int mode; - int devtype; - struct proc *p; -{ - register struct tty *tp; - register int error; - - dprintf("iteopen(): enter(0x%x)\n", (int) dev); - - if (!ite_initted) - return (ENXIO); - - if (ite_tty == NULL) { - tp = ite_tty = ttymalloc(); - } else - tp = ite_tty; - if ((tp->t_state & (TS_ISOPEN | TS_XCLUDE)) == (TS_ISOPEN | TS_XCLUDE) - && p->p_ucred->cr_uid != 0) - return (EBUSY); - - tp->t_oproc = itestart; - tp->t_param = NULL; - tp->t_dev = dev; - if ((tp->t_state & TS_ISOPEN) == 0) { - ttychars(tp); - tp->t_iflag = TTYDEF_IFLAG; - tp->t_oflag = TTYDEF_OFLAG; - tp->t_cflag = CS8 | CREAD; - tp->t_lflag = TTYDEF_LFLAG; - tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; - tp->t_state = TS_ISOPEN | TS_CARR_ON; - ttsetwater(tp); - } - - error = (*linesw[tp->t_line].l_open) (dev, tp); - tp->t_winsize.ws_row = scrrows; - tp->t_winsize.ws_col = scrcols; - - dprintf("iteopen(): exit(%d)\n", error); - return (error); -} - -int -iteclose(dev, flag, mode, p) - dev_t dev; - int flag; - int mode; - struct proc *p; -{ - dprintf("iteclose: enter (%d)\n", (int) dev); - - (*linesw[ite_tty->t_line].l_close) (ite_tty, flag); - ttyclose(ite_tty); -#if 0 - ttyfree(ite_tty); - ite_tty = (struct tty *) 0; -#endif - - dprintf("iteclose: exit\n"); - return 0; -} - -int -iteread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; -{ - dprintf("iteread: enter\n"); - return (*linesw[ite_tty->t_line].l_read) (ite_tty, uio, flag); -} - -int -itewrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; -{ - dprintf("itewrite: enter\n"); - return (*linesw[ite_tty->t_line].l_write) (ite_tty, uio, flag); -} - -struct tty * -itetty(dev) - dev_t dev; -{ - return (ite_tty); -} - -int -iteioctl(dev, cmd, addr, flag, p) - dev_t dev; - int cmd; - caddr_t addr; - int flag; - struct proc *p; -{ - register struct tty *tp = ite_tty; - int error; - - dprintf("iteioctl: enter(%d, 0x%x)\n", cmd, cmd); - - error = (*linesw[tp->t_line].l_ioctl) (tp, cmd, addr, flag, p); - if (error >= 0) { - dprintf("iteioctl: exit(%d)\n", error); - return (error); - } - - error = ttioctl(tp, cmd, addr, flag, p); - if (error >= 0) { - dprintf("iteioctl: exit(%d)\n", error); - return (error); - } - - switch (cmd) { - case ITEIOC_RINGBELL: - return mac68k_ring_bell(bell_freq, bell_length, bell_volume); - case ITEIOC_SETBELL: - { - struct bellparams *bp = (void *) addr; - - /* Do some sanity checks. */ - if (bp->freq < 10 || bp->freq > 40000) - return (EINVAL); - if (bp->len < 0 || bp->len > 3600) - return (EINVAL); - if (bp->vol < 0 || bp->vol > 100) - return (EINVAL); - - bell_freq = bp->freq; - bell_length = bp->len; - bell_volume = bp->vol; - return (0); - } - case ITEIOC_GETBELL: - { - struct bellparams *bp = (void *) addr; - - bell_freq = bp->freq; - bell_length = bp->len; - bell_volume = bp->vol; - return (0); - } - } - - dprintf("iteioctl: exit(ENOTTY)\n"); - return (ENOTTY); -} - -void -itestart(tp) - register struct tty *tp; -{ - register int cc, s; - - s = spltty(); - if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) { - splx(s); - return; - } - tp->t_state |= TS_BUSY; - - cc = tp->t_outq.c_cc; - splx(s); - erasecursor(); - while (cc-- > 0) - ite_putchar(getc(&tp->t_outq)); - drawcursor(); - - s = spltty(); - tp->t_state &= ~TS_BUSY; - splx(s); -} - -void -itestop(tp, flag) - struct tty *tp; - int flag; -{ - int s; - - s = spltty(); - if (tp->t_state & TS_BUSY) - if ((tp->t_state & TS_TTSTOP) == 0) - tp->t_state |= TS_FLUSH; - splx(s); -} - -int -ite_intr(event) - adb_event_t *event; -{ - static int shift = 0, control = 0, capslock = 0; - int key, press, val, state; - char str[10], *s; - - key = event->u.k.key; - press = ADBK_PRESS(key); - val = ADBK_KEYVAL(key); - - if (val == ADBK_SHIFT) - shift = press; - else if (val == ADBK_CAPSLOCK) - capslock = !capslock; - else if (val == ADBK_CONTROL) - control = press; - else if (press) { - switch (val) { - case ADBK_UP: - str[0] = '\e'; - str[1] = 'O'; - str[2] = 'A'; - str[3] = '\0'; - break; - case ADBK_DOWN: - str[0] = '\e'; - str[1] = 'O'; - str[2] = 'B'; - str[3] = '\0'; - break; - case ADBK_RIGHT: - str[0] = '\e'; - str[1] = 'O'; - str[2] = 'C'; - str[3] = '\0'; - break; - case ADBK_LEFT: - str[0] = '\e'; - str[1] = 'O'; - str[2] = 'D'; - str[3] = '\0'; - break; - default: - state = 0; - if (capslock && isealpha(keyboard[val][1])) - state = 1; - if (shift) - state = 1; - if (control) - state = 2; - str[0] = keyboard[val][state]; - str[1] = '\0'; - break; - } - if (adb_polling) - polledkey = str[0]; - else - for (s = str; *s; s++) - (*linesw[ite_tty->t_line].l_rint)(*s, ite_tty); - } - return 0; -} -/* - * Console functions - */ - -int -itecnprobe(cp) - struct consdev *cp; -{ - int maj, unit; - - /* locate the major number */ - for (maj = 0; maj < nchrdev; maj++) - if (cdevsw[maj].d_open == iteopen) - break; - - if (maj == nchrdev) - panic("itecnprobe(): did not find iteopen()."); - - unit = 0; /* hardcode first device as console. */ - - /* initialize required fields */ - cp->cn_dev = makedev(maj, unit); - cp->cn_pri = CN_INTERNAL; - - return 0; -} - -int -itecninit(cp) - struct consdev *cp; -{ - return ite_init(); -} - -void -itereset() -{ - width = videosize & 0xffff; - height = (videosize >> 16) & 0xffff; - scrrows = height / CHARHEIGHT; - scrcols = width / CHARWIDTH; - - switch (videobitdepth) { - default: - case 1: - putpixel = putpixel1; - reversepixel = reversepixel1; - screenrowbytes = (width + 7) >> 3; - break; - case 2: - putpixel = putpixel2; - reversepixel = reversepixel1; - screenrowbytes = (width + 3) >> 2; - break; - case 4: - putpixel = putpixel4; - reversepixel = reversepixel1; - screenrowbytes = (width + 1) >> 1; - break; - case 8: - putpixel = putpixel8; - reversepixel = reversepixel1; - screenrowbytes = width; - break; - case 16: - putpixel = putpixel16; - reversepixel = reversepixel1; - screenrowbytes = width*2; - break; - case 32: - putpixel = putpixel32; - reversepixel = reversepixel1; - screenrowbytes = width*4; - break; - } - - vt100_reset(); -} - -int -ite_init() -{ - if (ite_initted) - return 0; - - ite_initted = 1; - itereset(); - return iteon((dev_t) 0, 0); -} - -int -iteon(dev, flags) - dev_t dev; - int flags; -{ - erasecursor(); - clear_screen(2); - drawcursor(); - return 0; -} - -int -iteoff(dev, flags) - dev_t dev; - int flags; -{ - erasecursor(); - clear_screen(2); - return 0; -} - -int -itecngetc(dev) - dev_t dev; -{ - /* Oh, man... */ - - return ite_pollforchar(); -} - -void -itecnputc(dev, c) - dev_t dev; - int c; -{ - extern dev_t mac68k_zsdev; - extern int zscnputc(dev_t dev, int c); - - erasecursor(); - ite_putchar(c); - drawcursor(); - if (mac68k_machine.serial_boot_echo) - zscnputc(mac68k_zsdev, c); -} diff --git a/sys/arch/mac68k/dev/macfb.c b/sys/arch/mac68k/dev/macfb.c new file mode 100644 index 00000000000..ea17513ae71 --- /dev/null +++ b/sys/arch/mac68k/dev/macfb.c @@ -0,0 +1,359 @@ +/* $OpenBSD: macfb.c,v 1.1 2006/01/04 20:39:05 miod Exp $ */ +/* $NetBSD: macfb.c,v 1.11 2005/01/15 16:00:59 chs Exp $ */ +/* + * Copyright (c) 1998 Matt DeBergalis + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Matt DeBergalis + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> +#include <sys/malloc.h> + +#include <machine/cpu.h> +#include <machine/bus.h> + +#include <mac68k/dev/nubus.h> +#include <mac68k/dev/grfvar.h> +#include <mac68k/dev/macfbvar.h> + +#include <uvm/uvm_extern.h> + +#include <dev/wscons/wsconsio.h> + +#include <dev/rcons/raster.h> +#include <dev/wscons/wscons_raster.h> +#include <dev/wscons/wsdisplayvar.h> + +int macfb_match(struct device *, void *, void *); +void macfb_attach(struct device *, struct device *, void *); + +struct cfattach macfb_ca = { + sizeof(struct macfb_softc), macfb_match, macfb_attach +}; + +struct cfdriver macfb_cd = { + NULL, "macfb", DV_DULL +}; + +const struct wsdisplay_emulops macfb_emulops = { + rcons_cursor, + rcons_mapchar, + rcons_putchar, + rcons_copycols, + rcons_erasecols, + rcons_copyrows, + rcons_eraserows, + rcons_alloc_attr +}; + +struct wsscreen_descr macfb_stdscreen = { + "std", + 0, 0, /* will be filled in -- XXX shouldn't, it's global */ + &macfb_emulops, + 0, 0, + WSSCREEN_REVERSE +}; + +const struct wsscreen_descr *_macfb_scrlist[] = { + &macfb_stdscreen, +}; + +const struct wsscreen_list macfb_screenlist = { + sizeof(_macfb_scrlist) / sizeof(struct wsscreen_descr *), + _macfb_scrlist +}; + +int macfb_ioctl(void *, u_long, caddr_t, int, struct proc *); +paddr_t macfb_mmap(void *, off_t, int); +int macfb_alloc_screen(void *, const struct wsscreen_descr *, + void **, int *, int *, long *); +void macfb_free_screen(void *, void *); +int macfb_show_screen(void *, void *, int, + void (*)(void *, int, int), void *); + +const struct wsdisplay_accessops macfb_accessops = { + macfb_ioctl, + macfb_mmap, + macfb_alloc_screen, + macfb_free_screen, + macfb_show_screen, + NULL, /* load_font */ + NULL, /* scrollback */ + NULL, /* getchar */ + NULL /* burner */ +}; + +void macfb_init(struct macfb_devconfig *); + +paddr_t macfb_consaddr; +static int macfb_is_console(paddr_t); + +static struct macfb_devconfig macfb_console_dc; + +/* From Booter via locore */ +extern long videoaddr; +extern long videorowbytes; +extern long videobitdepth; +extern u_long videosize; +extern u_int32_t mac68k_vidlog; +extern u_int32_t mac68k_vidphys; +extern u_int32_t mac68k_vidlen; + +static int +macfb_is_console(paddr_t addr) +{ + if (addr != macfb_consaddr && + (addr >= 0xf9000000 && addr <= 0xfeffffff)) { + /* + * This is in the NuBus standard slot space range, so we + * may well have to look at 0xFssxxxxx, too. Mask off the + * slot number and duplicate it in bits 20-23, per IM:V + * pp 459, 463, and IM:VI ch 30 p 17. + * Note: this is an ugly hack and I wish I knew what + * to do about it. -- sr + */ + addr = (paddr_t)(((u_long)addr & 0xff0fffff) | + (((u_long)addr & 0x0f000000) >> 4)); + } + return ((mac68k_machine.serial_console & 0x03) == 0 + && (addr == macfb_consaddr)); +} + +void +macfb_clear(struct macfb_devconfig *dc) +{ + int i, rows; + + /* clear the display */ + rows = dc->dc_ht; + for (i = 0; rows-- > 0; i += dc->dc_rowbytes) + memset((u_char *)dc->dc_vaddr + dc->dc_offset + i, + 0, dc->dc_rowbytes); +} + +void +macfb_init(struct macfb_devconfig *dc) +{ + struct raster *rap; + struct rcons *rcp; + + macfb_clear(dc); + + rap = &dc->dc_raster; + rap->width = dc->dc_wid; + rap->height = dc->dc_ht; + rap->depth = dc->dc_depth; + rap->linelongs = dc->dc_rowbytes / sizeof(u_int32_t); + rap->pixels = (u_int32_t *)(dc->dc_vaddr + dc->dc_offset); + + /* initialize the raster console blitter */ + rcp = &dc->dc_rcons; + rcp->rc_sp = rap; + rcp->rc_crow = rcp->rc_ccol = -1; + rcp->rc_crowp = &rcp->rc_crow; + rcp->rc_ccolp = &rcp->rc_ccol; + rcons_init(rcp, 128, 192); + + macfb_stdscreen.nrows = dc->dc_rcons.rc_maxrow; + macfb_stdscreen.ncols = dc->dc_rcons.rc_maxcol; +} + +int +macfb_match(struct device *parent, void *match, void *aux) +{ + return (1); +} + +void +macfb_attach(struct device *parent, struct device *self, void *aux) +{ + struct grfbus_attach_args *ga = aux; + struct grfmode *gm = ga->ga_grfmode; + struct macfb_softc *sc; + struct wsemuldisplaydev_attach_args waa; + int isconsole; + + sc = (struct macfb_softc *)self; + +#ifdef DIAGNOSTIC /* temporary */ + printf(" offset %p", gm->fboff); +#endif + printf("\n"); + + isconsole = macfb_is_console(ga->ga_phys + ga->ga_grfmode->fboff); + + if (isconsole) { + sc->sc_dc = &macfb_console_dc; + sc->nscreens = 1; + } else { + sc->sc_dc = malloc(sizeof(struct macfb_devconfig), M_DEVBUF, M_WAITOK); + sc->sc_dc->dc_vaddr = (vaddr_t)gm->fbbase; + sc->sc_dc->dc_paddr = ga->ga_phys; + sc->sc_dc->dc_size = gm->fbsize; + + sc->sc_dc->dc_wid = gm->width; + sc->sc_dc->dc_ht = gm->height; + sc->sc_dc->dc_depth = gm->psize; + sc->sc_dc->dc_rowbytes = gm->rowbytes; + + sc->sc_dc->dc_offset = gm->fboff; + + macfb_init(sc->sc_dc); + + sc->nscreens = 0; + } + + waa.console = isconsole; + waa.scrdata = &macfb_screenlist; + waa.accessops = &macfb_accessops; + waa.accesscookie = sc; + + config_found(self, &waa, wsemuldisplaydevprint); +} + + +int +macfb_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p) +{ + struct macfb_softc *sc = v; + struct macfb_devconfig *dc = sc->sc_dc; + struct wsdisplay_fbinfo *wdf; + + switch (cmd) { + case WSDISPLAYIO_GTYPE: + *(int *)data = 0; /* XXX */ + break; + + case WSDISPLAYIO_GINFO: + wdf = (struct wsdisplay_fbinfo *)data; + wdf->height = dc->dc_raster.height; + wdf->width = dc->dc_raster.width; + wdf->depth = dc->dc_raster.depth; + wdf->cmsize = 0; /* until we can change it... */ + break; + + case WSDISPLAYIO_LINEBYTES: + *(u_int *)data = dc->dc_rowbytes; + break; + + case WSDISPLAYIO_GVIDEO: + case WSDISPLAYIO_SVIDEO: + break; + default: + return (-1); + } + + return (0); +} + +paddr_t +macfb_mmap(void *v, off_t offset, int prot) +{ + struct macfb_softc *sc = v; + struct macfb_devconfig *dc = sc->sc_dc; + paddr_t addr; + + if (offset >= 0 && + offset < round_page(dc->dc_size)) + addr = atop(dc->dc_paddr + dc->dc_offset + offset); + else + addr = (-1); + + return addr; +} + +int +macfb_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookiep, + int *curxp, int *curyp, long *defattrp) +{ + struct macfb_softc *sc = v; + long defattr; + + if (sc->nscreens > 0) + return (ENOMEM); + + *cookiep = &sc->sc_dc->dc_rcons; /* one and only for now */ + *curxp = 0; + *curyp = 0; + rcons_alloc_attr(&sc->sc_dc->dc_rcons, 0, 0, 0, &defattr); + *defattrp = defattr; + sc->nscreens++; + return (0); +} + +void +macfb_free_screen(void *v, void *cookie) +{ + struct macfb_softc *sc = v; + +#ifdef DIAGNOSTIC + if (sc->sc_dc == &macfb_console_dc) + panic("cfb_free_screen: console"); +#endif + + sc->nscreens--; +} + +int +macfb_show_screen(void *v, void *cookie, int waitok, + void (*cb)(void *, int, int), void *cbarg) +{ + return 0; +} + +int +macfb_cnattach(paddr_t addr) +{ + struct macfb_devconfig *dc = &macfb_console_dc; + long defattr; + + dc->dc_vaddr = trunc_page(videoaddr); + dc->dc_paddr = trunc_page(mac68k_vidphys); + + dc->dc_wid = videosize & 0xffff; + dc->dc_ht = (videosize >> 16) & 0xffff; + dc->dc_depth = videobitdepth; + dc->dc_rowbytes = videorowbytes; + + dc->dc_size = (mac68k_vidlen > 0) ? + mac68k_vidlen : dc->dc_ht * dc->dc_rowbytes; + dc->dc_offset = m68k_page_offset(mac68k_vidphys); + + /* set up the display */ + macfb_init(&macfb_console_dc); + + rcons_alloc_attr(&dc->dc_rcons, 0, 0, 0, &defattr); + + wsdisplay_cnattach(&macfb_stdscreen, &dc->dc_rcons, + 0, 0, defattr); + + macfb_consaddr = addr; + return (0); +} diff --git a/sys/arch/mac68k/dev/itevar.h b/sys/arch/mac68k/dev/macfbvar.h index 36f62bcb2f2..3dd0765a853 100644 --- a/sys/arch/mac68k/dev/itevar.h +++ b/sys/arch/mac68k/dev/macfbvar.h @@ -1,8 +1,8 @@ -/* $OpenBSD: itevar.h,v 1.4 2002/06/11 05:13:37 miod Exp $ */ -/* $NetBSD: itevar.h,v 1.1 1996/05/05 06:16:49 briggs Exp $ */ - +/* $OpenBSD: macfbvar.h,v 1.1 2006/01/04 20:39:05 miod Exp $ */ +/* $NetBSD: macfbvar.h,v 1.3 2005/01/15 16:00:59 chs Exp $ */ /* - * Copyright (c) 1995 Allen Briggs. All rights reserved. + * Copyright (c) 1998 Matt DeBergalis + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -14,9 +14,9 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by Allen Briggs. + * This product includes software developed by Matt DeBergalis * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * derived from this software without specific prior written permission * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -30,27 +30,33 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <machine/adbsys.h> - -int ite_intr(adb_event_t *event); -int iteon(dev_t dev, int flags); -int iteoff(dev_t dev, int flags); -void itereset(void); - -#ifndef CN_DEAD -#include <dev/cons.h> -#endif - -void itestop(struct tty * tp, int flag); -void itestart(register struct tty * tp); -int iteopen(dev_t dev, int mode, int devtype, struct proc * p); -int iteclose(dev_t dev, int flag, int mode, struct proc * p); -int iteread(dev_t dev, struct uio * uio, int flag); -int itewrite(dev_t dev, struct uio * uio, int flag); -int iteioctl(dev_t, int, caddr_t, int, struct proc *); -struct tty *itetty(dev_t dev); - -int itecnprobe(struct consdev * cp); -int itecninit(struct consdev * cp); -int itecngetc(dev_t dev); -void itecnputc(dev_t dev, int c); +#include <dev/rcons/raster.h> +#include <dev/wscons/wscons_raster.h> + +#include <machine/bus.h> + +struct macfb_devconfig { + vaddr_t dc_vaddr; /* memory space virtual base address */ + paddr_t dc_paddr; /* memory space physical base address */ + psize_t dc_size; /* size of slot memory */ + + int dc_offset; /* offset from dc_vaddr to base of flat fb */ + + int dc_wid; /* width of frame buffer */ + int dc_ht; /* height of frame buffer */ + int dc_depth; /* depth of frame buffer */ + int dc_rowbytes; /* bytes in fb scan line */ + + struct raster dc_raster; /* raster description */ + struct rcons dc_rcons; /* raster blitter control info */ +}; + +struct macfb_softc { + struct device sc_dev; + + int nscreens; + struct macfb_devconfig *sc_dc; +}; + +int macfb_cnattach(paddr_t); +void macfb_clear(struct macfb_devconfig *); diff --git a/sys/arch/mac68k/dev/pm_direct.c b/sys/arch/mac68k/dev/pm_direct.c index 49158ade649..d35df8189b4 100644 --- a/sys/arch/mac68k/dev/pm_direct.c +++ b/sys/arch/mac68k/dev/pm_direct.c @@ -1,5 +1,5 @@ -/* $OpenBSD: pm_direct.c,v 1.8 2005/02/11 20:09:30 martin Exp $ */ -/* $NetBSD: pm_direct.c,v 1.4 1998/02/23 03:11:26 scottr Exp $ */ +/* $OpenBSD: pm_direct.c,v 1.9 2006/01/04 20:39:05 miod Exp $ */ +/* $NetBSD: pm_direct.c,v 1.25 2005/10/28 21:54:52 christos Exp $ */ /* * Copyright (C) 1997 Takashi Hamada @@ -15,7 +15,7 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by Takashi HAMADA + * This product includes software developed by Takashi Hamada * 4. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * @@ -30,29 +30,30 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* From: pm_direct.c 1.3 03/18/98 Takashi Hamada */ +#ifdef DEBUG +#ifndef ADB_DEBUG +#define ADB_DEBUG +#endif +#endif -/* #define PM_DEBUG 1 */ /* #define PM_GRAB_SI 1 */ -#include <sys/types.h> -#include <sys/cdefs.h> +#include <sys/param.h> #include <sys/systm.h> -#include <sys/time.h> -#include <machine/adbsys.h> #include <machine/cpu.h> -#include <machine/param.h> #include <machine/viareg.h> -#include <arch/mac68k/mac68k/macrom.h> -#include <arch/mac68k/dev/adbvar.h> - -#include "pm_direct.h" +#include <mac68k/dev/adbvar.h> +#include <mac68k/dev/pm_direct.h> /* hardware dependent values */ extern u_short ADBDelay; extern u_int32_t HwCfgFlags3; +extern struct mac68k_machine_S mac68k_machine; + /* define the types of the Power Manager */ #define PM_HW_UNKNOWN 0x00 /* don't know */ @@ -66,10 +67,10 @@ extern u_int32_t HwCfgFlags3; #define PM_VIA_CLR_INTR() via_reg(VIA1, vIFR) = 0x90 #define PM_SET_STATE_ACKON() via_reg(VIA2, vBufB) |= 0x04 #define PM_SET_STATE_ACKOFF() via_reg(VIA2, vBufB) &= ~0x04 -#define PM_IS_ON ( 0x02 == (via_reg(VIA2, vBufB) & 0x02) ) -#define PM_IS_OFF ( 0x00 == (via_reg(VIA2, vBufB) & 0x02) ) +#define PM_IS_ON (0x02 == (via_reg(VIA2, vBufB) & 0x02)) +#define PM_IS_OFF (0x00 == (via_reg(VIA2, vBufB) & 0x02)) -/* +/* * Variables for internal use */ int pmHardware = PM_HW_UNKNOWN; @@ -80,42 +81,74 @@ u_int pm_counter = 0; /* clock count */ /* these values shows that number of data returned after 'send' cmd is sent */ char pm_send_cmd_type[] = { - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x01,0x01,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00, - 0xff,0x00,0x02,0x01,0x01,0xff,0xff,0xff, 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x04,0x14,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x02,0xff,0xff,0xff,0xff,0xff, - 0x01,0x01,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff, - 0x01,0x00,0x02,0x02,0xff,0x01,0x03,0x01, 0x00,0x01,0x00,0x00,0x00,0xff,0xff,0xff, - 0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, - 0x01,0x01,0x01,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0x04,0x04, - 0x04,0xff,0x00,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x01,0x02,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff, - 0x02,0x02,0x02,0x04,0xff,0x00,0xff,0xff, 0x01,0x01,0x03,0x02,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x01,0x01,0xff,0xff,0x00,0x00,0xff,0xff, - 0xff,0x04,0x00,0xff,0xff,0xff,0xff,0xff, 0x03,0xff,0x00,0xff,0x00,0xff,0xff,0x00, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xff, 0x00, 0x02, 0x01, 0x01, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x02, 0x02, 0xff, 0x01, 0x03, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x04, 0x04, + 0x04, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x02, 0x02, 0x02, 0x04, 0xff, 0x00, 0xff, 0xff, + 0x01, 0x01, 0x03, 0x02, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* these values shows that number of data returned after 'receive' cmd is sent */ char pm_receive_cmd_type[] = { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0xff,0xff,0xff,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x05,0x15,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x03,0x03,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x04,0x03,0x09,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x01, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0x02,0xff,0xff,0xff, - 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0x02,0xff,0xff,0xff,0xff,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x04, 0x03, 0x09, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; @@ -124,75 +157,78 @@ char pm_receive_cmd_type[] = { */ /* for debugging */ -#ifdef PM_DEBUG -void pm_printerr( char *, int, int, char * ); +#ifdef ADB_DEBUG +void pm_printerr(const char *, int, int, char *); #endif -int pm_wait_busy(int); -int pm_wait_free(int); +int pm_wait_busy(int); +int pm_wait_free(int); /* these functions are for the PB1XX series */ -int pm_receive_pm1(u_char *); -int pm_send_pm1(u_char,int); -int pm_pmgrop_pm1(PMData *); -void pm_intr_pm1(void); +int pm_receive_pm1(u_char *); +int pm_send_pm1(u_char, int); +int pm_pmgrop_pm1(PMData *); +int pm_intr_pm1(void *); /* these functions are for the PB Duo series and the PB 5XX series */ -int pm_receive_pm2(u_char *); -int pm_send_pm2(u_char); -int pm_pmgrop_pm2(PMData *); -void pm_intr_pm2(void); +int pm_receive_pm2(u_char *); +int pm_send_pm2(u_char); +int pm_pmgrop_pm2(PMData *); +int pm_intr_pm2(void *); /* this function is MRG-Based (for testing) */ -int pm_pmgrop_mrg(PMData *); +int pm_pmgrop_mrg(PMData *); /* these functions are called from adb_direct.c */ -void pm_setup_adb(void); -void pm_check_adb_devices(int); -void pm_intr(void); -int pm_adb_op(u_char *, void *, void *, int); +void pm_setup_adb(void); +void pm_check_adb_devices(int); +void pm_intr(void *); +int pm_adb_op(u_char *, void *, void *, int); +void pm_hw_setup(void); -/* these functions also use the valiables of adb_direct.c */ -void pm_adb_get_TALK_result(PMData *); -void pm_adb_get_ADB_data(PMData *); -void pm_adb_poll_next_device_pm1(PMData *); +/* these functions also use the variables of adb_direct.c */ +void pm_adb_get_TALK_result(PMData *); +void pm_adb_get_ADB_data(PMData *); +void pm_adb_poll_next_device_pm1(PMData *); /* - * These valiables are in adb_direct.c. + * These variables are in adb_direct.c. */ extern u_char *adbBuffer; /* pointer to user data area */ -#define MAX_ADB_MSG_LENGTH 20 -extern u_char adbInputBuffer[MAX_ADB_MSG_LENGTH]; /* data input buffer */ extern void *adbCompRout; /* pointer to the completion routine */ extern void *adbCompData; /* pointer to the completion routine data */ extern int adbWaiting; /* waiting for return data from the device */ extern int adbWaitingCmd; /* ADB command we are waiting for */ extern int adbStarting; /* doing ADB reinit, so do "polling" differently */ -/* - * Define the external functions - */ -extern void adb_comp_exec(void); /* from adb_direct.c */ - +#define ADB_MAX_MSG_LENGTH 16 +#define ADB_MAX_HDR_LENGTH 8 +struct adbCommand { + u_char header[ADB_MAX_HDR_LENGTH]; /* not used yet */ + u_char data[ADB_MAX_MSG_LENGTH]; /* packet data only */ + u_char *saveBuf; /* where to save result */ + u_char *compRout; /* completion routine pointer */ + u_char *compData; /* completion routine data pointer */ + u_int cmd; /* the original command for this data */ + u_int unsol; /* 1 if packet was unsolicited */ + u_int ack_only; /* 1 for no special processing */ +}; +extern void adb_pass_up(struct adbCommand *); -#ifdef PM_DEBUG +#ifdef ADB_DEBUG /* * This function dumps contents of the PMData */ void -pm_printerr(ttl, rval, num, data) - char *ttl; - int rval; - int num; - char *data; +pm_printerr(const char *ttl, int rval, int num, char *data) { int i; - printf( "pm: %s:%04x %02x ", ttl, rval, num ); - for( i=0; i<num; i++ ) - printf( "%02x ", data[i] ); - printf( "\n" ); + printf("pm: %s:%04x %02x ", ttl, rval, num); + for (i = 0; i < num; i++) + printf("%02x ", data[i]); + printf("\n"); } #endif @@ -207,7 +243,6 @@ pm_setup_adb(void) switch (mac68k_machine.machineid) { case MACH_MACPB140: case MACH_MACPB145: - case MACH_MACPB150: case MACH_MACPB160: case MACH_MACPB165: case MACH_MACPB165C: @@ -216,6 +251,7 @@ pm_setup_adb(void) case MACH_MACPB180C: pmHardware = PM_HW_PB1XX; break; + case MACH_MACPB150: case MACH_MACPB210: case MACH_MACPB230: case MACH_MACPB250: @@ -223,6 +259,8 @@ pm_setup_adb(void) case MACH_MACPB280: case MACH_MACPB280C: case MACH_MACPB500: + case MACH_MACPB190: + case MACH_MACPB190CS: pmHardware = PM_HW_PB5XX; break; default: @@ -235,8 +273,7 @@ pm_setup_adb(void) * Check the existent ADB devices */ void -pm_check_adb_devices(id) - int id; +pm_check_adb_devices(int id) { u_short ed = 0x1; @@ -249,17 +286,16 @@ pm_check_adb_devices(id) * Wait until PM IC is busy */ int -pm_wait_busy(delay) - int delay; +pm_wait_busy(int xdelay) { - while(PM_IS_ON) { + while (PM_IS_ON) { #ifdef PM_GRAB_SI - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ #endif - if ((--delay) < 0) - return( 1 ); /* timeout */ + if ((--xdelay) < 0) + return 1; /* timeout */ } - return( 0 ); + return 0; } @@ -267,17 +303,16 @@ pm_wait_busy(delay) * Wait until PM IC is free */ int -pm_wait_free(delay) - int delay; +pm_wait_free(int xdelay) { - while(PM_IS_OFF) { + while (PM_IS_OFF) { #ifdef PM_GRAB_SI - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ #endif - if ((--delay) < 0) - return( 0 ); /* timeout */ + if ((--xdelay) < 0) + return 0; /* timeout */ } - return( 1 ); + return 1; } @@ -290,23 +325,22 @@ pm_wait_free(delay) * Receive data from PM for the PB1XX series */ int -pm_receive_pm1(data) - u_char *data; +pm_receive_pm1(u_char *data) { int rval = 0xffffcd34; via_reg(VIA2, vDirA) = 0x00; - switch( 1 ) { + switch (1) { default: - if (pm_wait_busy( 0x40 ) != 0) + if (pm_wait_busy(0x40) != 0) break; /* timeout */ PM_SET_STATE_ACKOFF(); *data = via_reg(VIA2, 0x200); rval = 0xffffcd33; - if (pm_wait_free( 0x40 ) == 0) + if (pm_wait_free(0x40) == 0) break; /* timeout */ rval = 0x00; @@ -316,7 +350,7 @@ pm_receive_pm1(data) PM_SET_STATE_ACKON(); via_reg(VIA2, vDirA) = 0x00; - return( rval ); + return rval; } @@ -325,32 +359,32 @@ pm_receive_pm1(data) * Send data to PM for the PB1XX series */ int -pm_send_pm1(data, delay) - u_char data; - int delay; +pm_send_pm1(u_char data, int timo) { - int rval; + int rval; via_reg(VIA2, vDirA) = 0xff; via_reg(VIA2, 0x200) = data; PM_SET_STATE_ACKOFF(); - if (pm_wait_busy( 0x400 ) != 0) { +#if 0 + if (pm_wait_busy(0x400) == 0) { +#else + if (pm_wait_busy(timo) == 0) { +#endif PM_SET_STATE_ACKON(); - via_reg(VIA2, vDirA) = 0x00; - - return( 0xffffcd36 ); + if (pm_wait_free(0x40) != 0) + rval = 0x0; + else + rval = 0xffffcd35; + } else { + rval = 0xffffcd36; } - rval = 0x0; - PM_SET_STATE_ACKON(); - if (pm_wait_free( 0x40 ) == 0) - rval = 0xffffcd35; - PM_SET_STATE_ACKON(); via_reg(VIA2, vDirA) = 0x00; - return( rval ); + return rval; } @@ -358,17 +392,16 @@ pm_send_pm1(data, delay) * My PMgrOp routine for the PB1XX series */ int -pm_pmgrop_pm1(pmdata) - PMData *pmdata; +pm_pmgrop_pm1(PMData *pmdata) { - int i; - int s = 0x81815963; - u_char via1_vIER, via1_vDirA; - int rval = 0; - int num_pm_data = 0; - u_char pm_cmd; - u_char pm_data; - u_char *pm_buf; + int i; + int s = 0x81815963; + u_char via1_vIER, via1_vDirA; + int rval = 0; + int num_pm_data = 0; + u_char pm_cmd; + u_char pm_data; + u_char *pm_buf; /* disable all inetrrupts but PM */ via1_vIER = via_reg(VIA1, vIER); @@ -376,50 +409,51 @@ pm_pmgrop_pm1(pmdata) via1_vDirA = via_reg(VIA1, vDirA); - switch( pmdata->command ) { + switch (pmdata->command) { default: - for( i=0; i<7; i++ ) { + for (i = 0; i < 7; i++) { via_reg(VIA2, vDirA) = 0x00; /* wait until PM is free */ - if (pm_wait_free( ADBDelay ) == 0) { /* timeout */ + if (pm_wait_free(ADBDelay) == 0) { /* timeout */ via_reg(VIA2, vDirA) = 0x00; /* restore formar value */ via_reg(VIA1, vDirA) = via1_vDirA; via_reg(VIA1, vIER) = via1_vIER; - return( 0xffffcd38 ); + return 0xffffcd38; } - switch( mac68k_machine.machineid ) { + switch (mac68k_machine.machineid) { case MACH_MACPB160: case MACH_MACPB165: case MACH_MACPB165C: + case MACH_MACPB170: case MACH_MACPB180: case MACH_MACPB180C: { - int delay = ADBDelay * 16; + int xdelay = ADBDelay * 16; via_reg(VIA2, vDirA) = 0x00; - while((via_reg(VIA2, 0x200) == 0x7f) && (delay >= 0)) - delay--; + while ((via_reg(VIA2, 0x200) == 0x7f) && (xdelay >= 0)) + xdelay--; - if (delay < 0) { /* timeout */ + if (xdelay < 0) { /* timeout */ via_reg(VIA2, vDirA) = 0x00; /* restore formar value */ via_reg(VIA1, vIER) = via1_vIER; - return( 0xffffcd38 ); + return 0xffffcd38; } } } /* end switch */ - s=splhigh(); + s = splhigh(); via1_vDirA = via_reg(VIA1, vDirA); via_reg(VIA1, vDirA) &= 0x7f; pm_cmd = (u_char)(pmdata->command & 0xff); - if ((rval = pm_send_pm1( pm_cmd, ADBDelay*8 )) == 0) /* succeeded to send PM command */ - break; + if ((rval = pm_send_pm1(pm_cmd, ADBDelay * 8)) == 0) + break; /* send command succeeded */ via_reg(VIA1, vDirA) = via1_vDirA; splx(s); @@ -431,50 +465,51 @@ pm_pmgrop_pm1(pmdata) /* restore formar value */ via_reg(VIA1, vDirA) = via1_vDirA; via_reg(VIA1, vIER) = via1_vIER; - return( 0xffffcd38 ); + if (s != 0x81815963) + splx(s); + return 0xffffcd38; } /* send # of PM data */ num_pm_data = pmdata->num_data; - if ((rval = pm_send_pm1( (u_char)(num_pm_data & 0xff), ADBDelay*8 )) != 0) + if ((rval = pm_send_pm1((u_char)(num_pm_data & 0xff), ADBDelay * 8)) != 0) break; /* timeout */ /* send PM data */ pm_buf = (u_char *)pmdata->s_buf; - for( i=0; i<num_pm_data; i++ ) - if((rval = pm_send_pm1( pm_buf[i], ADBDelay*8 )) != 0) - break; /* timeout */ + for (i = 0; i < num_pm_data; i++) + if ((rval = pm_send_pm1(pm_buf[i], ADBDelay * 8)) != 0) + break; /* timeout */ if ((i != num_pm_data) && (num_pm_data != 0)) - break; /* timeout */ + break; /* timeout */ /* Will PM IC return data? */ if ((pm_cmd & 0x08) == 0) { rval = 0; - break; /* no returned data */ + break; /* no returned data */ } rval = 0xffffcd37; - if (pm_wait_busy( ADBDelay ) != 0) { + if (pm_wait_busy(ADBDelay) != 0) break; /* timeout */ - } /* receive PM command */ - if ((rval = pm_receive_pm1( &pm_data )) != 0) + if ((rval = pm_receive_pm1(&pm_data)) != 0) break; pmdata->command = pm_data; /* receive number of PM data */ - if ((rval = pm_receive_pm1( &pm_data )) != 0) - break; /* timeout */ + if ((rval = pm_receive_pm1(&pm_data)) != 0) + break; /* timeout */ num_pm_data = pm_data; pmdata->num_data = num_pm_data; /* receive PM data */ pm_buf = (u_char *)pmdata->r_buf; - for( i=0; i<num_pm_data; i++ ) { - if ((rval = pm_receive_pm1( &pm_data )) != 0) - break; /* timeout */ + for (i = 0; i < num_pm_data; i++) { + if ((rval = pm_receive_pm1(&pm_data)) != 0) + break; /* timeout */ pm_buf[i] = pm_data; } @@ -489,19 +524,19 @@ pm_pmgrop_pm1(pmdata) if (s != 0x81815963) splx(s); - return( rval ); + return rval; } /* - * My PM interrupt routine for PB100-series + * My PM interrupt routine for PB1XX series */ -void -pm_intr_pm1(void) +int +pm_intr_pm1(void *arg) { - int s; - int rval; - PMData pmdata; + int s; + int rval; + PMData pmdata; s = splhigh(); @@ -513,30 +548,37 @@ pm_intr_pm1(void) pmdata.data[0] = pmdata.data[1] = 0; pmdata.s_buf = &pmdata.data[2]; pmdata.r_buf = &pmdata.data[2]; - rval = pm_pmgrop_pm1( &pmdata ); + rval = pm_pmgrop_pm1(&pmdata); if (rval != 0) { -#ifdef PM_DEBUG - printf( "pm: PM is not ready. error code=%08x\n", rval ); +#ifdef ADB_DEBUG + if (adb_debug) + printf("pm: PM is not ready. error code=%08x\n", rval); #endif splx(s); - return; } if ((pmdata.data[2] & 0x10) == 0x10) { - if ((pmdata.data[2] & 0x0f) == 0) { /* ADB data that were requested by TALK command */ + if ((pmdata.data[2] & 0x0f) == 0) { + /* ADB data that were requested by TALK command */ pm_adb_get_TALK_result(&pmdata); - } else if ((pmdata.data[2] & 0x08) == 0x8) { /* PM is requesting to poll */ + } else if ((pmdata.data[2] & 0x08) == 0x8) { + /* PM is requesting to poll */ pm_adb_poll_next_device_pm1(&pmdata); - } else if ((pmdata.data[2] & 0x04) == 0x4) { /* ADB device event */ + } else if ((pmdata.data[2] & 0x04) == 0x4) { + /* ADB device event */ pm_adb_get_ADB_data(&pmdata); } } else { -#ifdef PM_DEBUG - pm_printerr( "driver does not supported this event.", rval, pmdata.num_data, pmdata.data ); +#ifdef ADB_DEBUG + if (adb_debug) + pm_printerr("driver does not supported this event.", + rval, pmdata.num_data, pmdata.data); #endif } splx(s); + + return (1); } @@ -549,15 +591,14 @@ pm_intr_pm1(void) * Receive data from PM for the PB Duo series and the PB 5XX series */ int -pm_receive_pm2(data) - u_char *data; +pm_receive_pm2(u_char *data) { - int i; - int rval; + int i; + int rval; rval = 0xffffcd34; - switch( 1 ) { + switch (1) { default: /* set VIA SR to input mode */ via_reg(VIA1, vACR) |= 0x0c; @@ -582,7 +623,7 @@ pm_receive_pm2(data) PM_SET_STATE_ACKON(); via_reg(VIA1, vACR) |= 0x1c; - return( rval ); + return rval; } @@ -591,33 +632,28 @@ pm_receive_pm2(data) * Send data to PM for the PB Duo series and the PB 5XX series */ int -pm_send_pm2(data) - u_char data; +pm_send_pm2(u_char data) { - int rval; + int rval; via_reg(VIA1, vACR) |= 0x1c; PM_SR() = data; PM_SET_STATE_ACKOFF(); - rval = 0xffffcd36; - if (pm_wait_busy((int)ADBDelay*32) != 0) { + if (pm_wait_busy((int)ADBDelay*32) == 0) { PM_SET_STATE_ACKON(); - - via_reg(VIA1, vACR) |= 0x1c; - - return( rval ); + if (pm_wait_free((int)ADBDelay*32) != 0) + rval = 0; + else + rval = 0xffffcd35; + } else { + rval = 0xffffcd36; } PM_SET_STATE_ACKON(); - rval = 0xffffcd35; - if (pm_wait_free((int)ADBDelay*32) != 0) - rval = 0; - - PM_SET_STATE_ACKON(); via_reg(VIA1, vACR) |= 0x1c; - return( rval ); + return rval; } @@ -626,20 +662,19 @@ pm_send_pm2(data) * My PMgrOp routine for the PB Duo series and the PB 5XX series */ int -pm_pmgrop_pm2(pmdata) - PMData *pmdata; +pm_pmgrop_pm2(PMData *pmdata) { - int i; - int s; - u_char via1_vIER; - int rval = 0; - int num_pm_data = 0; - u_char pm_cmd; - short pm_num_rx_data; - u_char pm_data; - u_char *pm_buf; - - s=splhigh(); + int i; + int s; + u_char via1_vIER; + int rval = 0; + int num_pm_data = 0; + u_char pm_cmd; + short pm_num_rx_data; + u_char pm_data; + u_char *pm_buf; + + s = splhigh(); /* disable all inetrrupts but PM */ via1_vIER = 0x10; @@ -648,47 +683,49 @@ pm_pmgrop_pm2(pmdata) if (via1_vIER != 0x0) via1_vIER |= 0x80; - switch( pmdata->command ) { + switch (pmdata->command) { default: /* wait until PM is free */ pm_cmd = (u_char)(pmdata->command & 0xff); rval = 0xcd38; - if (pm_wait_free( ADBDelay * 4 ) == 0) + if (pm_wait_free(ADBDelay * 4) == 0) break; /* timeout */ - if (HwCfgFlags3 & 0x00200000) { /* PB 160, PB 165(c), PB 180(c) ? */ - int delay = ADBDelay * 16; + if (HwCfgFlags3 & 0x00200000) { + /* PB 160, PB 165(c), PB 180(c)? */ + int xdelay = ADBDelay * 16; via_reg(VIA2, vDirA) = 0x00; - while((via_reg(VIA2, 0x200) == 0x07) && (delay >= 0)) - delay--; + while ((via_reg(VIA2, 0x200) == 0x07) && + (xdelay >= 0)) + xdelay--; - if (delay < 0) { + if (xdelay < 0) { rval = 0xffffcd38; break; /* timeout */ } } /* send PM command */ - if ((rval = pm_send_pm2( (u_char)(pm_cmd & 0xff) ))) + if ((rval = pm_send_pm2((u_char)(pm_cmd & 0xff)))) break; /* timeout */ /* send number of PM data */ num_pm_data = pmdata->num_data; if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */ if (pm_send_cmd_type[pm_cmd] < 0) { - if ((rval = pm_send_pm2( (u_char)(num_pm_data & 0xff) )) != 0) + if ((rval = pm_send_pm2((u_char)(num_pm_data & 0xff))) != 0) break; /* timeout */ pmdata->command = 0; } } else { /* PB 1XX series ? */ - if ((rval = pm_send_pm2( (u_char)(num_pm_data & 0xff) )) != 0) + if ((rval = pm_send_pm2((u_char)(num_pm_data & 0xff))) != 0) break; /* timeout */ } /* send PM data */ pm_buf = (u_char *)pmdata->s_buf; - for( i=0; i<num_pm_data; i++ ) - if((rval = pm_send_pm2( pm_buf[i] )) != 0) + for (i = 0 ; i < num_pm_data; i++) + if ((rval = pm_send_pm2(pm_buf[i])) != 0) break; /* timeout */ if (i != num_pm_data) break; /* timeout */ @@ -707,13 +744,13 @@ pm_pmgrop_pm2(pmdata) if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */ pm_num_rx_data--; if (pm_num_rx_data == 0) - if ((rval = pm_receive_pm2( &pm_data )) != 0) { + if ((rval = pm_receive_pm2(&pm_data)) != 0) { rval = 0xffffcd37; break; } pmdata->command = pm_data; } else { /* PB 1XX series ? */ - if ((rval = pm_receive_pm2( &pm_data )) != 0) { + if ((rval = pm_receive_pm2(&pm_data)) != 0) { rval = 0xffffcd37; break; } @@ -723,14 +760,14 @@ pm_pmgrop_pm2(pmdata) /* receive number of PM data */ if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */ if (pm_num_rx_data < 0) { - if ((rval = pm_receive_pm2( &pm_data )) != 0) + if ((rval = pm_receive_pm2(&pm_data)) != 0) break; /* timeout */ num_pm_data = pm_data; } else num_pm_data = pm_num_rx_data; pmdata->num_data = num_pm_data; } else { /* PB 1XX serias ? */ - if ((rval = pm_receive_pm2( &pm_data )) != 0) + if ((rval = pm_receive_pm2(&pm_data)) != 0) break; /* timeout */ num_pm_data = pm_data; pmdata->num_data = num_pm_data; @@ -738,8 +775,8 @@ pm_pmgrop_pm2(pmdata) /* receive PM data */ pm_buf = (u_char *)pmdata->r_buf; - for( i=0; i<num_pm_data; i++ ) { - if ((rval = pm_receive_pm2( &pm_data )) != 0) + for (i = 0; i < num_pm_data; i++) { + if ((rval = pm_receive_pm2(&pm_data)) != 0) break; /* timeout */ pm_buf[i] = pm_data; } @@ -751,61 +788,56 @@ pm_pmgrop_pm2(pmdata) via_reg(VIA1, vIER) = via1_vIER; splx(s); - return( rval ); + return rval; } /* * My PM interrupt routine for the PB Duo series and the PB 5XX series */ -void -pm_intr_pm2(void) +int +pm_intr_pm2(void *arg) { - int s; - int rval; - PMData pmdata; + int s; + int rval; + PMData pmdata; s = splhigh(); - PM_VIA_CLR_INTR(); /* clear VIA1 interrupt */ - /* ask PM what happend */ + PM_VIA_CLR_INTR(); /* clear VIA1 interrupt */ + /* ask PM what happend */ pmdata.command = 0x78; pmdata.num_data = 0; pmdata.s_buf = &pmdata.data[2]; pmdata.r_buf = &pmdata.data[2]; - rval = pm_pmgrop_pm2( &pmdata ); + rval = pm_pmgrop_pm2(&pmdata); if (rval != 0) { -#ifdef PM_DEBUG - printf( "pm: PM is not ready. error code: %08x\n", rval ); +#ifdef ADB_DEBUG + if (adb_debug) + printf("pm: PM is not ready. error code: %08x\n", rval); #endif splx(s); - return; } - switch( (u_int)(pmdata.data[2] & 0xff) ) { - case 0x00: /* 1 sec interrupt? */ - { + switch ((u_int)(pmdata.data[2] & 0xff)) { + case 0x00: /* 1 sec interrupt? */ break; - } - case 0x80: /* 1 sec interrupt? */ - { + case 0x80: /* 1 sec interrupt? */ pm_counter++; break; - } - case 0x08: /* Brightness/Contrast button on LCD panel */ - { + case 0x08: /* Brightness/Contrast button on LCD panel */ /* get brightness and contrast of the LCD */ pm_LCD_brightness = (u_int)pmdata.data[3] & 0xff; pm_LCD_contrast = (u_int)pmdata.data[4] & 0xff; /* - pm_printerr( "#08", rval, pmdata.num_data, pmdata.data ); + pm_printerr("#08", rval, pmdata.num_data, pmdata.data); pmdata.command = 0x33; pmdata.num_data = 1; pmdata.s_buf = pmdata.data; pmdata.r_buf = pmdata.data; pmdata.data[0] = pm_LCD_contrast; - rval = pm_pmgrop_pm2( &pmdata ); - pm_printerr( "#33", rval, pmdata.num_data, pmdata.data ); + rval = pm_pmgrop_pm2(&pmdata); + pm_printerr("#33", rval, pmdata.num_data, pmdata.data); */ /* this is an experimental code */ pmdata.command = 0x41; @@ -813,33 +845,35 @@ pm_intr_pm2(void) pmdata.s_buf = pmdata.data; pmdata.r_buf = pmdata.data; pm_LCD_brightness = 0x7f - pm_LCD_brightness / 2; - if (pm_LCD_brightness < 0x25) pm_LCD_brightness = 0x25; - if (pm_LCD_brightness > 0x5a) pm_LCD_brightness = 0x7f; + if (pm_LCD_brightness < 0x25) + pm_LCD_brightness = 0x25; + if (pm_LCD_brightness > 0x5a) + pm_LCD_brightness = 0x7f; pmdata.data[0] = pm_LCD_brightness; - rval = pm_pmgrop_pm2( &pmdata ); + rval = pm_pmgrop_pm2(&pmdata); break; - } - /* ADB data that were requested by TALK command */ - case 0x10: + case 0x10: /* ADB data that were requested by TALK command */ case 0x14: pm_adb_get_TALK_result(&pmdata); break; - /* ADB device event */ - case 0x16: + case 0x16: /* ADB device event */ case 0x18: case 0x1e: pm_adb_get_ADB_data(&pmdata); break; default: - { -#ifdef PM_DEBUG - pm_printerr( "driver does not supported this event.", pmdata.data[2], pmdata.num_data, pmdata.data ); +#ifdef ADB_DEBUG + if (adb_debug) + pm_printerr("driver does not supported this event.", + pmdata.data[2], pmdata.num_data, + pmdata.data); #endif - } break; } splx(s); + + return (1); } @@ -847,18 +881,17 @@ pm_intr_pm2(void) * MRG-based PMgrOp routine */ int -pm_pmgrop_mrg(pmdata) - PMData *pmdata; +pm_pmgrop_mrg(PMData *pmdata) { u_int32_t rval=0; - asm(" - movl %1, a0 - .word 0xa085 - movl d0, %0" + __asm __volatile( + " movl %1,a0 \n" + " .word 0xa085 \n" + " movl d0,%0" : "=g" (rval) : "g" (pmdata) - : "a0", "d0" ); + : "a0","d0"); return rval; } @@ -868,23 +901,18 @@ pm_pmgrop_mrg(pmdata) * My PMgrOp routine */ int -pmgrop(pmdata) - PMData *pmdata; +pmgrop(PMData *pmdata) { - switch( pmHardware ) { + switch (pmHardware) { case PM_HW_PB1XX: - { - return( pm_pmgrop_pm1(pmdata) ); + return (pm_pmgrop_pm1(pmdata)); break; - } case PM_HW_PB5XX: - { - return( pm_pmgrop_pm2(pmdata) ); + return (pm_pmgrop_pm2(pmdata)); break; - } default: -/* return( pmgrop_mrg(pmdata) ); */ - return( -1 ); + /* return (pmgrop_mrg(pmdata)); */ + return 1; } } @@ -893,44 +921,54 @@ pmgrop(pmdata) * My PM interrupt routine */ void -pm_intr(void) +pm_intr(void *arg) { - switch( pmHardware ) { + switch (pmHardware) { case PM_HW_PB1XX: - { - pm_intr_pm1(); + pm_intr_pm1(arg); break; - } case PM_HW_PB5XX: - { - pm_intr_pm2(); + pm_intr_pm2(arg); break; - } default: break; } } +void +pm_hw_setup(void) +{ + switch (pmHardware) { + case PM_HW_PB1XX: + via1_register_irq(4, pm_intr_pm1, NULL, NULL); + PM_VIA_CLR_INTR(); + break; + case PM_HW_PB5XX: + via1_register_irq(4, pm_intr_pm2, NULL, NULL); + PM_VIA_CLR_INTR(); + break; + default: + break; + } +} + /* * Synchronous ADBOp routine for the Power Manager */ int -pm_adb_op(buffer, compRout, data, command) - u_char *buffer; - void *compRout; - void *data; - int command; +pm_adb_op(u_char *buffer, void *compRout, void *data, int command) { - int i,len; - int s; - int rval; - int delay; - PMData pmdata; + int i; + int s; + int rval; + int xdelay; + PMData pmdata; + struct adbCommand packet; if (adbWaiting == 1) - return( -1 ); + return 1; s = splhigh(); via_reg(VIA1, vIER) = 0x10; @@ -955,46 +993,72 @@ pm_adb_op(buffer, compRout, data, command) if ((command & 0xc) == 0x8) { /* if the command is LISTEN, copy ADB data to PM buffer */ if ((buffer != (u_char *)0) && (buffer[0] <= 24)) { pmdata.data[2] = buffer[0]; /* number of data */ - for( i=0; i<buffer[0]; i++ ) + for (i = 0; i < buffer[0]; i++) pmdata.data[3 + i] = buffer[1 + i]; } else pmdata.data[2] = 0; } else pmdata.data[2] = 0; - rval = pmgrop( &pmdata ); - if (rval != 0) - return( -1 ); + if ((command & 0xc) != 0xc) { /* if the command is not TALK */ + /* set up stuff fNULLor adb_pass_up */ + packet.data[0] = 1 + pmdata.data[2]; + packet.data[1] = command; + for (i = 0; i < pmdata.data[2]; i++) + packet.data[i+2] = pmdata.data[i+3]; + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.cmd = command; + packet.unsol = 0; + packet.ack_only = 1; + adb_polling = 1; + adb_pass_up(&packet); + adb_polling = 0; + } - if (adbWaiting == 0) { - adbWaiting = 1; - adbWaitingCmd = command; + rval = pmgrop(&pmdata); + if (rval != 0) { + splx(s); + return 1; } + adbWaiting = 1; + adbWaitingCmd = command; + PM_VIA_INTR_ENABLE(); - /* wait until the PM interrupt is occurred */ - delay = 0x80000; - while(adbWaiting == 1) { - if ((via_reg(VIA1, vIFR) & 0x10) == 0x10) - pm_intr(); + /* wait until the PM interrupt has occurred */ + xdelay = 0x80000; + while (adbWaiting == 1) { + switch (mac68k_machine.machineid) { + case MACH_MACPB150: + case MACH_MACPB210: + case MACH_MACPB230: /* daishi tested with Duo230 */ + case MACH_MACPB250: + case MACH_MACPB270: + case MACH_MACPB280: + case MACH_MACPB280C: + case MACH_MACPB190: + case MACH_MACPB190CS: + pm_intr((void *)0); + break; + default: + if ((via_reg(VIA1, vIFR) & 0x10) == 0x10) + pm_intr((void *)0); + break; + } #ifdef PM_GRAB_SI - (void)intr_dispatch(0x70); + (void)intr_dispatch(0x70); /* grab any serial interrupts */ #endif - if ((--delay) < 0) - return( -1 ); - } - - if (buffer != (u_char *)0) { - len = adbInputBuffer[3]; - for (i=0; i<=len; i++) - buffer[i] = adbInputBuffer[3 + i]; - if (len < 0) - buffer[0] = 0; + if ((--xdelay) < 0) { + splx(s); + return 1; + } } - /* this command enables the interrupt by operating ADB devices */ - if (HwCfgFlags3 & 0x00020000) { /* PB Duo series, PB 500 series */ + /* this command enables the interrupt by operating ADB devices */ + if (HwCfgFlags3 & 0x00020000) { /* PB Duo series, PB 5XX series */ pmdata.command = 0x20; pmdata.num_data = 4; pmdata.s_buf = pmdata.data; @@ -1003,7 +1067,7 @@ pm_adb_op(buffer, compRout, data, command) pmdata.data[1] = 0x86; /* magic spell for awaking the PM */ pmdata.data[2] = 0x00; pmdata.data[3] = 0x0c; /* each bit may express the existent ADB device */ - } else { /* PB 100-series */ + } else { /* PB 1XX series */ pmdata.command = 0x20; pmdata.num_data = 3; pmdata.s_buf = pmdata.data; @@ -1012,64 +1076,60 @@ pm_adb_op(buffer, compRout, data, command) pmdata.data[1] = 0x04; pmdata.data[2] = 0x00; } - rval = pmgrop( &pmdata ); + rval = pmgrop(&pmdata); splx(s); - return( rval ); + return rval; } void -pm_adb_get_TALK_result(pmdata) - PMData *pmdata; +pm_adb_get_TALK_result(PMData *pmdata) { int i; - int rx_pm_adb_cmd; - - rx_pm_adb_cmd = (u_int)pmdata->data[3] & 0xff; - - pmdata->data[2] &= 0xf; - pmdata->data[1] = pmdata->data[3]; - pmdata->data[3] = pmdata->num_data - 2; - - adbInputBuffer[0] = pmdata->num_data + 1; - for( i=1; i<pmdata->num_data+2; i++ ) - adbInputBuffer[i] = pmdata->data[i]; - - if ((adbWaiting == 1) && (rx_pm_adb_cmd == adbWaitingCmd)) { - if (adbStarting == 0) - adb_complete( &pmdata->data[3] , (long)0, adbWaitingCmd ); - adbWaitingCmd = 0x0; - - adbWaiting = 0; - adb_comp_exec(); - adbBuffer = (long)0; - adbCompRout = (long)0; - adbCompData = (long)0; - } + struct adbCommand packet; + + /* set up data for adb_pass_up */ + packet.data[0] = pmdata->num_data-1; + packet.data[1] = pmdata->data[3]; + for (i = 0; i <packet.data[0]-1; i++) + packet.data[i+2] = pmdata->data[i+4]; + + packet.saveBuf = adbBuffer; + packet.compRout = adbCompRout; + packet.compData = adbCompData; + packet.unsol = 0; + packet.ack_only = 0; + adb_polling = 1; + adb_pass_up(&packet); + adb_polling = 0; + + adbWaiting = 0; + adbBuffer = (long)0; + adbCompRout = (long)0; + adbCompData = (long)0; } void -pm_adb_get_ADB_data(pmdata) - PMData *pmdata; +pm_adb_get_ADB_data(PMData *pmdata) { int i; - - i = (u_int)pmdata->data[3] & 0xff; - pmdata->data[2] &= 0xf; - pmdata->data[1] = pmdata->data[3]; - pmdata->data[3] = pmdata->num_data - 2; - - adbInputBuffer[0] = pmdata->num_data + 1; - if (adbStarting == 0) - adb_complete( &pmdata->data[3] , (long)0, i ); + struct adbCommand packet; + + /* set up data for adb_pass_up */ + packet.data[0] = pmdata->num_data-1; /* number of raw data */ + packet.data[1] = pmdata->data[3]; /* ADB command */ + for (i = 0; i <packet.data[0]-1; i++) + packet.data[i+2] = pmdata->data[i+4]; + packet.unsol = 1; + packet.ack_only = 0; + adb_pass_up(&packet); } void -pm_adb_poll_next_device_pm1(pmdata) - PMData *pmdata; +pm_adb_poll_next_device_pm1(PMData *pmdata) { int i; int ndid; @@ -1078,8 +1138,8 @@ pm_adb_poll_next_device_pm1(pmdata) PMData tmp_pmdata; /* find another existent ADB device to poll */ - for( i=1; i<16; i++ ) { - ndid = (((pmdata->data[3] & 0xf0) >> 4) + i) & 0xf; + for (i = 1; i < 16; i++) { + ndid = (ADB_CMDADDR(pmdata->data[3]) + i) & 0xf; bendid <<= ndid; if ((pm_existent_ADB_devices & bendid) != 0) break; @@ -1093,7 +1153,5 @@ pm_adb_poll_next_device_pm1(pmdata) tmp_pmdata.data[0] = (u_char)(ndid << 4) | 0xc; tmp_pmdata.data[1] = 0x04; /* magic spell for awaking the PM */ tmp_pmdata.data[2] = 0x00; - rval = pmgrop( &tmp_pmdata ); + rval = pmgrop(&tmp_pmdata); } - - diff --git a/sys/arch/mac68k/dev/pm_direct.h b/sys/arch/mac68k/dev/pm_direct.h index ec2b001e0f6..e19cc085182 100644 --- a/sys/arch/mac68k/dev/pm_direct.h +++ b/sys/arch/mac68k/dev/pm_direct.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pm_direct.h,v 1.4 2005/02/11 20:09:30 martin Exp $ */ +/* $OpenBSD: pm_direct.h,v 1.5 2006/01/04 20:39:05 miod Exp $ */ /* $NetBSD: pm_direct.h,v 1.1 1997/04/08 03:11:38 scottr Exp $ */ /* @@ -30,6 +30,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* From: pm_direct.h 1.0 01/02/97 Takashi Hamada */ /* * Public declarations that other routines may need. @@ -45,10 +46,3 @@ typedef struct { } PMData; int pmgrop(PMData *); - -extern void pm_setup_adb(void); -extern void pm_check_adb_devices(int); -extern void pm_intr(void); -extern int pm_adb_op(u_char *, void *, void *, int); -extern void pm_init_adb_device(void); - |