#ifndef _ARCHITECTURE_ADB_BUS_
#define _ARCHITECTURE_ADB_BUS_
typedef unsigned char adbHandlerId;
typedef unsigned char adbAddress;
#define ADB_ADDRESS_NONE ((adbAddress)-1)
#define ADB_HANDLER_ID_NONE ((adbHandlerId)0)
#define AC_ADDRESS_MASK 0xf0
#define AC_ADDRESS_SHIFT 4
#define AC_COMMAND_MASK 0x0c
#define AC_REGISTER_MASK 0x03
#define AC_ADDRESS(commandByte) \
((commandByte & AC_ADDRESS_MASK) >> AC_ADDRESS_SHIFT)
#define AC_REGISTER(commandByte) \
(commandByte & AC_REGISTER_MASK)
#define AC_COMMAND(commandByte) \
(commandByte & AC_COMMAND_MASK)
#define ADB_CMD_TALK 0x0c
#define ADB_CMD_LISTEN 0x08
#define ADB_CMD_FLUSH 0x01
#define ADB_CMD_SENDRESET 0x00
#define TALK_REGISTER(reg, deviceAddress) \
(ADB_CMD_TALK | (deviceAddress << AC_ADDRESS_SHIFT) | \
(unsigned char)(reg))
#define LISTEN_REGISTER(reg, deviceAddress) \
(ADB_CMD_LISTEN | (deviceAddress << AC_ADDRESS_SHIFT) | \
(unsigned char)(reg))
#define ADB_FLUSH(deviceAddress) \
(ADB_CMD_FLUSH | (deviceAddress << AC_ADDRESS_SHIFT))
#define ADB_SEND_RESET ADB_CMD_SENDRESET
#define ADB_REGISTER_SIZE 8
typedef struct {
unsigned char byte[ADB_REGISTER_SIZE];
} adbRegisterStandard;
typedef struct {
unsigned reserved0:1, exceptionalEvent:1, serviceRequestEnable:1, reserved1:1, deviceAddress:4, handlerId:8;
unsigned char reserved2[ADB_REGISTER_SIZE-2];
} adbRegister3bits;
typedef struct {
unsigned short data;
unsigned char reserved[ADB_REGISTER_SIZE-2];
} adbRegister3short;
typedef union {
adbRegister3bits bits;
adbRegister3short sh;
} adbRegister3;
#define AR3_RESERVED0 0x8000
#define AR3_EXCEPTIONAL_EVENT 0x4000
#define AR3_SERVICE_REQUEST_ENABLE 0x2000
#define AR3_RESERVED1 0x1000
#define AR3_DEVICE_ADDRESS_MASK 0x0f00
#define AR3_HANDLER_ID_MASK 0x00ff
typedef union {
adbRegisterStandard stand;
adbRegister3 reg3;
} adbRegister;
#define HANDLER_ID_SELF_TEST 0xff
#define HANDLER_ID_UPDATE_ALWAYS 0xff // listen only - update address
#define HANDLER_ID_SELF_TEST_FAIL 0xff // talk only - self test failed
#define HANDLER_ID_UPDATE_NO_COLLISION 0xfe // update address only if no
#define HANDLER_ID_UPDATE_IF_ACTIVATOR 0xfd // update address only if
#define NUM_ADB_ADDRESSES 16
#define MIN_BUS_DEVICE_ADDRESS 1
#define MAX_BUS_DEVICE_ADDRESS 15
#define ADB_SOFT_ADDRESS_START 8
#define ADB_SOFT_ADDRESS_END (NUM_ADB_ADDRESSES - 1)
#endif