home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Headers / architecture / adb_bus.h next >
C/C++ Source or Header  |  1993-08-17  |  3KB  |  141 lines

  1. /*     Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved. 
  2.  *
  3.  * adb_bus.h - Architecture-indpendent ADB bus defintions.
  4.  *
  5.  * HISTORY
  6.  * 12-Sep-91    Doug Mitchell at NeXT
  7.  *      Created. 
  8.  */
  9.  
  10. #ifndef    _ARCHITECTURE_ADB_BUS_
  11. #define _ARCHITECTURE_ADB_BUS_
  12.  
  13. typedef unsigned char adbHandlerId;
  14. typedef unsigned char adbAddress;
  15.  
  16. #define ADB_ADDRESS_NONE    ((adbAddress)-1)
  17. #define ADB_HANDLER_ID_NONE    ((adbHandlerId)0)
  18.  
  19.  
  20. /*
  21.  * ADB Command byte fields.
  22.  */
  23. #define AC_ADDRESS_MASK        0xf0
  24. #define AC_ADDRESS_SHIFT    4
  25. #define AC_COMMAND_MASK        0x0c
  26. #define AC_REGISTER_MASK    0x03
  27.  
  28. #define AC_ADDRESS(commandByte)        \
  29.     ((commandByte & AC_ADDRESS_MASK) >> AC_ADDRESS_SHIFT)
  30. #define AC_REGISTER(commandByte)    \
  31.     (commandByte & AC_REGISTER_MASK)
  32. #define AC_COMMAND(commandByte)        \
  33.     (commandByte & AC_COMMAND_MASK)
  34.  
  35. /*
  36.  * Command values.
  37.  */
  38. #define ADB_CMD_TALK        0x0c
  39. #define ADB_CMD_LISTEN        0x08
  40. #define ADB_CMD_FLUSH        0x01
  41. #define ADB_CMD_SENDRESET    0x00
  42.  
  43. /*
  44.  * Macros to build the known ADB commands.
  45.  */
  46. #define TALK_REGISTER(reg, deviceAddress)                 \
  47.     (ADB_CMD_TALK | (deviceAddress << AC_ADDRESS_SHIFT) |         \
  48.         (unsigned char)(reg))
  49.  
  50. #define LISTEN_REGISTER(reg, deviceAddress)                 \
  51.     (ADB_CMD_LISTEN | (deviceAddress << AC_ADDRESS_SHIFT) |     \
  52.         (unsigned char)(reg))
  53.  
  54. #define ADB_FLUSH(deviceAddress)                    \
  55.     (ADB_CMD_FLUSH | (deviceAddress << AC_ADDRESS_SHIFT))
  56.  
  57. #define ADB_SEND_RESET    ADB_CMD_SENDRESET
  58.  
  59.  
  60. /*
  61.  * Standard device register (register 0 thru 2).
  62.  */
  63. #define ADB_REGISTER_SIZE    8    
  64. typedef struct {
  65.     unsigned char byte[ADB_REGISTER_SIZE];
  66. } adbRegisterStandard;
  67.  
  68. /*
  69.  * Two ways of looking at Register 3.
  70.  */
  71. typedef struct {
  72.  
  73.     unsigned reserved0:1,            // bit 15, always 0
  74.          exceptionalEvent:1,        // bit 14
  75.          serviceRequestEnable:1,    // bit 13
  76.          reserved1:1,            // bit 12, always 0
  77.          deviceAddress:4,        // bits 11..8
  78.          handlerId:8;            // bits 7..0
  79.          
  80.     /* 
  81.      * Pad out to remainder of standard register size.
  82.      */
  83.     unsigned char reserved2[ADB_REGISTER_SIZE-2];
  84.     
  85. } adbRegister3bits;
  86.  
  87. typedef struct {
  88.     unsigned short data;
  89.     unsigned char reserved[ADB_REGISTER_SIZE-2];
  90. } adbRegister3short;
  91.  
  92. typedef union {
  93.     adbRegister3bits    bits;
  94.     adbRegister3short    sh;
  95. } adbRegister3;
  96.  
  97. /*
  98.  * Bit fields for adbRegister3.sh.
  99.  */
  100. #define AR3_RESERVED0            0x8000
  101. #define AR3_EXCEPTIONAL_EVENT        0x4000
  102. #define AR3_SERVICE_REQUEST_ENABLE    0x2000
  103. #define AR3_RESERVED1            0x1000
  104. #define AR3_DEVICE_ADDRESS_MASK        0x0f00        
  105. #define AR3_HANDLER_ID_MASK        0x00ff
  106.  
  107. /*
  108.  * Common device register.
  109.  */
  110. typedef union {
  111.     adbRegisterStandard    stand;
  112.     adbRegister3        reg3;
  113. } adbRegister;
  114.  
  115. /*
  116.  * Reserved Handler IDs.
  117.  */
  118. #define HANDLER_ID_SELF_TEST        0xff
  119. #define HANDLER_ID_UPDATE_ALWAYS    0xff    // listen only - update address
  120.                         //    and enable bits
  121. #define HANDLER_ID_SELF_TEST_FAIL    0xff    // talk only - self test failed
  122. #define HANDLER_ID_UPDATE_NO_COLLISION    0xfe    // update address only if no 
  123.                         //    collision detected
  124. #define HANDLER_ID_UPDATE_IF_ACTIVATOR    0xfd    // update address only if 
  125.                         //    activator depressed
  126.  
  127. /*
  128.  * Maximum number of ADB devices on the bus.
  129.  */    
  130. #define NUM_ADB_ADDRESSES        16
  131. #define MIN_BUS_DEVICE_ADDRESS        1
  132. #define MAX_BUS_DEVICE_ADDRESS        15
  133.  
  134. /*
  135.  * 'soft address' range.
  136.  */
  137. #define ADB_SOFT_ADDRESS_START        8
  138. #define ADB_SOFT_ADDRESS_END        (NUM_ADB_ADDRESSES - 1)
  139.  
  140. #endif    _ARCHITECTURE_ADB_BUS_
  141.