/* SPDX-License-Identifier: GPL-2.0 */ /*************************************************************************** * copyright : (C) 2002, 2004 by Frank Mori Hess ***************************************************************************/ #ifndef _TNT4882_REGISTERS_H #define _TNT4882_REGISTERS_H // tnt4882 register offsets enum { ACCWR = 0x5, // offset of auxiliary command register in 9914 mode AUXCR = 0x6, INTRT = 0x7, // register number for auxiliary command register when swap bit is set (9914 mode) SWAPPED_AUXCR = 0xa, HSSEL = 0xd, // handshake select register CNT2 = 0x9, CNT3 = 0xb, CFG = 0x10, SASR = 0x1b, IMR0 = 0x1d, IMR3 = 0x12, CNT0 = 0x14, CNT1 = 0x16, KEYREG = 0x17, // key control register (7210 mode only) CSR = KEYREG, FIFOB = 0x18, FIFOA = 0x19, CCR = 0x1a, // carry cycle register CMDR = 0x1c, // command register TIMER = 0x1e, // timer register STS1 = 0x10, /* T488 Status Register 1 */ STS2 = 0x1c, /* T488 Status Register 2 */ ISR0 = IMR0, ISR3 = 0x1a, /* T488 Interrupt Status Register 3 */ BCR = 0x1f, /* bus control/status register */ BSR = BCR, }; enum { tnt_pagein_offset = 0x11, }; /*============================================================*/ /* TURBO-488 registers bit definitions */ enum bus_control_status_bits { BCSR_REN_BIT = 0x1, BCSR_IFC_BIT = 0x2, BCSR_SRQ_BIT = 0x4, BCSR_EOI_BIT = 0x8, BCSR_NRFD_BIT = 0x10, BCSR_NDAC_BIT = 0x20, BCSR_DAV_BIT = 0x40, BCSR_ATN_BIT = 0x80, }; /* CFG -- Configuration Register (write only) */ enum cfg_bits { TNT_COMMAND = 0x80, /* bytes are command bytes instead of data bytes * (tnt4882 one-chip and newer only?) */ TNT_TLCHE = (1 << 6), /* halt transfer on imr0, imr1, or imr2 interrupt */ TNT_IN = (1 << 5), /* transfer is GPIB read */ TNT_A_B = (1 << 4), /* order to use fifos 1=fifo A first(big endian), * 0=fifo b first(little endian) */ TNT_CCEN = (1 << 3), /* enable carry cycle */ TNT_TMOE = (1 << 2), /* enable CPU bus time limit */ TNT_TIM_BYTN = (1 << 1), /* tmot reg is: 1=125ns clocks, 0=num bytes */ TNT_B_16BIT = (1 << 0), /* 1=FIFO is 16-bit register, 0=8-bit */ }; /* CMDR -- Command Register */ enum cmdr_bits { CLRSC = 0x2, /* clear the system controller bit */ SETSC = 0x3, /* set the system controller bit */ GO = 0x4, /* start fifos */ STOP = 0x8, /* stop fifos */ RESET_FIFO = 0x10, /* reset the FIFOs */ SOFT_RESET = 0x22, /* issue a software reset */ HARD_RESET = 0x40 /* 500x only? */ }; /* HSSEL -- handshake select register (write only) */ enum hssel_bits { TNT_ONE_CHIP_BIT = 0x1, NODMA = 0x10, TNT_GO2SIDS_BIT = 0x20, }; /* IMR0 -- Interrupt Mode Register 0 */ enum imr0_bits { TNT_SYNCIE_BIT = 0x1, /* handshake sync */ TNT_TOIE_BIT = 0x2, /* timeout */ TNT_ATNIE_BIT = 0x4, /* ATN interrupt */ TNT_IFCIE_BIT = 0x8, /* interface clear interrupt */ TNT_BTO_BIT = 0x10, /* byte timeout */ TNT_NLEN_BIT = 0x20, /* treat new line as EOS char */ TNT_STBOIE_BIT = 0x40, /* status byte out */ TNT_IMR0_ALWAYS_BITS = 0x80, /* always set this bit on write */ }; /* ISR0 -- Interrupt Status Register 0 */ enum isr0_bits { TNT_SYNC_BIT = 0x1, /* handshake sync */ TNT_TO_BIT = 0x2, /* timeout */ TNT_ATNI_BIT = 0x4, /* ATN interrupt */ TNT_IFCI_BIT = 0x8, /* interface clear interrupt */ TNT_EOS_BIT = 0x10, /* end of string */ TNT_NL_BIT = 0x20, /* new line receive */ TNT_STBO_BIT = 0x40, /* status byte out */ TNT_NBA_BIT = 0x80, /* new byte available */ }; /* ISR3 -- Interrupt Status Register 3 (read only) */ enum isr3_bits { HR_DONE = (1 << 0), /* transfer done */ HR_TLCI = (1 << 1), /* isr0, isr1, or isr2 interrupt asserted */ HR_NEF = (1 << 2), /* NOT empty fifo */ HR_NFF = (1 << 3), /* NOT full fifo */ HR_STOP = (1 << 4), /* fifo empty or STOP command issued */ HR_SRQI_CIC = (1 << 5), /* SRQ asserted and we are CIC (500x only?)*/ HR_INTR = (1 << 7), /* isr3 interrupt active */ }; enum keyreg_bits { MSTD = 0x20, // enable 350ns T1 delay }; /* STS1 -- Status Register 1 (read only) */ enum sts1_bits { S_DONE = 0x80, /* DMA done */ S_SC = 0x40, /* is system controller */ S_IN = 0x20, /* DMA in (to memory) */ S_DRQ = 0x10, /* DRQ line (for diagnostics) */ S_STOP = 0x08, /* DMA stopped */ S_NDAV = 0x04, /* inverse of DAV */ S_HALT = 0x02, /* status of transfer machine */ S_GSYNC = 0x01, /* indicates if GPIB is in sync w I/O */ }; /* STS2 -- Status Register 2 */ enum sts2_bits { AFFN = (1 << 3), /* "A full FIFO NOT" (0=FIFO full) */ AEFN = (1 << 2), /* "A empty FIFO NOT" (0=FIFO empty) */ BFFN = (1 << 1), /* "B full FIFO NOT" (0=FIFO full) */ BEFN = (1 << 0), /* "B empty FIFO NOT" (0=FIFO empty) */ }; // Auxiliary commands enum tnt4882_aux_cmds { AUX_9914 = 0x15, // switch to 9914 mode AUX_REQT = 0x18, AUX_REQF = 0x19, AUX_PAGEIN = 0x50, /* page in alternate registers */ AUX_HLDI = 0x51, // rfd holdoff immediately AUX_CLEAR_END = 0x55, AUX_7210 = 0x99, // switch to 7210 mode }; enum tnt4882_aux_regs { AUXRG = 0x40, AUXRI = 0xe0, }; enum auxg_bits { /* no talking when no listeners bit (prevents bus errors when data written at wrong time) */ NTNL_BIT = 0x8, RPP2_BIT = 0x4, /* set/clear local rpp message */ CHES_BIT = 0x1, /*clear holdoff on end select bit*/ }; enum auxi_bits { SISB = 0x1, // static interrupt bits (don't clear isr1, isr2 on read) PP2 = 0x4, // ignore remote parallel poll configuration USTD = 0x8, // ultra short (1100 nanosec) T1 delay }; enum sasr_bits { ACRDY_BIT = 0x4, /* acceptor ready state */ ADHS_BIT = 0x8, /* acceptor data holdoff state */ ANHS2_BIT = 0x10, /* acceptor not ready holdoff immediately state */ ANHS1_BIT = 0x20, /* acceptor not ready holdoff state */ AEHS_BIT = 0x40, /* acceptor end holdoff state */ }; #endif // _TNT4882_REGISTERS_H