1 ECPP(7D)                            Devices                           ECPP(7D)
   2 
   3 
   4 
   5 NAME
   6        ecpp - IEEE 1284 compliant parallel port driver
   7 
   8 SYNOPSIS
   9        #include <sys/types.h>
  10 
  11 
  12        #include <sys/ecppio.h>
  13 
  14 
  15        ecpp@unit-address
  16 
  17 
  18 DESCRIPTION
  19        The ecpp driver provides a bi-directional interface to IEEE 1284
  20        compliant devices as well as a forward single-directional interface to
  21        Centronics devices. In addition to the Centronics protocol, the ecpp
  22        driver supports the IEEE 1284Compatibility, Nibble, and ECP protocols.
  23        ECPP_COMPAT_MODE and ECPP_CENTRONICS modes of operation have logically
  24        identical handshaking protocols, however devices that support
  25        ECPP_COMPAT_MODE are IEEE 1284 compliant devices. IEEE 1284 compliant
  26        devices support at least ECPP_COMPAT_MODE and ECPP_NIBBLE_MODE.
  27        Centronics devices support only ECPP_CENTRONICS mode.
  28 
  29 
  30        By default, ECPP_COMPAT_MODE devices have a strobe handshaking pulse
  31        width of 500ns. For this mode, forward data transfers are conducted by
  32        DMA. By default, the strobe pulse width for ECPP_CENTRONICS devices is
  33        two microseconds. Forward transfers for these devices are managed
  34        through PIO. The default characteristics for both ECPP_COMPAT_MODE and
  35        ECPP_CENTRONICS devices may be changed through tunable variables
  36        defined in ecpp.conf.
  37 
  38 
  39        The ecpp driver is an exclusive-use device, meaning that if the device
  40        is already open, subsequent opens fail with EBUSY.
  41 
  42    Default Operation
  43        Each time the ecpp device is opened, the device is marked as EBUSY and
  44        the configuration variables are set to their default values. The
  45        write_timeout period is set to 90 seconds.
  46 
  47 
  48        The driver sets the mode variable according to the following algorithm:
  49        The driver initially attempts to negotiate the link into ECPP_ECP_MODE
  50        during open(2). If it fails, the driver tries to negotiate into
  51        ECPP_NIBBLE_MODE mode. If that fails, the driver operates in
  52        ECPP_CENTRONICS mode. Upon successfully opening the device, IEEE 1284
  53        compliant devices will be left idle in either reverse idle phase of
  54        ECPP_ECP_MODE or in ECPP_NIBBLE_MODE. Subsequent calls to write(2)
  55        invokes the driver to move the link into either ECPP_COMPAT_MODE or the
  56        forward phase of ECPP_ECP_MODE. After the transfer completes, the link
  57        returns to idle state.
  58 
  59 
  60        The application may attempt to negotiate the device into a specific
  61        mode or set the write_timeout values through the ECPPIOC_SETPARMS
  62        ioctl(2) call. For mode negotiation to be successful, both the host
  63        workstation and the peripheral must support the requested mode.
  64 
  65    Tunables
  66        Characteristics of the ecpp driver may be tuned by the variables
  67        described in /kernel/drv/ecpp.conf. These variables are read by the
  68        kernel during system startup. To tune the variables, edit the ecpp.conf
  69        file and invoke update_drv(1M) to have the kernel read the file again.
  70 
  71 
  72        Some Centronics peripherals and certain IEEE 1284 compatible
  73        peripherals will not operate with the parallel port operating in a fast
  74        handshaking mode.  If printing problems occur, set "fast-centronics"
  75        and "fast-1284-compatible" to "false." See /kernel/drv/ecpp.conf for
  76        more information.
  77 
  78    Read/Write Operation
  79        The ecpp driver is a full duplex STREAMS device driver. While an
  80        application is writing to an IEEE 1284 compliant device, another thread
  81        may read from it.
  82 
  83    Write Operation
  84        A write(2) operation returns the number of bytes successfully written
  85        to the stream head. If a failure occurs while a Centronics device is
  86        transferring data, the content of the status bits will be captured at
  87        the time of the error and can be retrieved by the application program
  88        using the BPPIOC_GETERR ioctl(2) call. The captured status information
  89        is overwritten each time an attempted transfer or a BPPIOC_TESTIO
  90        ioctl(2) occurs.
  91 
  92    Read Operation
  93        If a failure or error condition occurs during a read(2), the number of
  94        bytes successfully read is returned (short read). When attempting to
  95        read a port that has no data currently available, read(2) returns 0 if
  96        O_NDELAY is set. If O_NONBLOCK is set, read(2) returns -1 and sets
  97        errno to EAGAIN. If O_NDELAY and O_NONBLOCK are clear, read(2) blocks
  98        until data become available.
  99 
 100 IOCTLS
 101        The ioctl(2) calls described below are supported. Note that when ecpp
 102        is transferring data, the driver waits until the data has been sent to
 103        the device before processing the ioctl(2) call.
 104 
 105 
 106        The ecpp driver supports prnio(7I) interfaces.
 107 
 108        Note -
 109 
 110          The PRNIOC_RESET command toggles the nInit signal for 2 ms, followed
 111          by default negotiation.
 112 
 113 
 114        The following ioctl(2) calls are supported for backward compatibility
 115        and are not recommended for new applications:
 116 
 117        ECPPIOC_GETPARMS
 118                            Get current transfer parameters. The argument is a
 119                            pointer to a struct ecpp_transfer_parms. See below
 120                            for a description of the elements of this
 121                            structure. If no parameters have been configured
 122                            since the device was opened, the structure will be
 123                            set to its default configuration. See Default
 124                            Operation above for more information.
 125 
 126 
 127        ECPPIOC_SETPARMS
 128                            Set transfer parameters. The argument is a pointer
 129                            to a struct ecpp_transfer_parms. If a parameter is
 130                            out of range, EINVAL is returned. If the peripheral
 131                            or host device cannot support the requested mode,
 132                            EPROTONOSUPPORT is returned. See below for a
 133                            description of ecpp_transfer_parms and its valid
 134                            parameters.
 135 
 136                            The Transfer Parameters Structure is defined in
 137                            <sys/ecppio.h>.
 138 
 139                              struct ecpp_transfer_parms {
 140                                  int  write_timeout;
 141                                  int  mode;
 142                              };
 143 
 144                            The write_timeout field is set to the value of
 145                            ecpp-transfer-timeout specified in the ecpp.conf.
 146                            The write_timeout field specifies how long the
 147                            driver will wait for the peripheral to respond to a
 148                            transfer request. The value must be greater than 0
 149                            and less than ECPP_MAX_TIMEOUT. All other values
 150                            are out of range.
 151 
 152                            The mode field reflects the IEEE 1284 mode to which
 153                            the parallel port is currently configured. The mode
 154                            may be set to one of the following values only:
 155                            ECPP_CENTRONICS, ECPP_COMPAT_MODE,
 156                            ECPP_NIBBLE_MODE, ECPP_ECP_MODE. All other values
 157                            are invalid. If the requested mode is not
 158                            supported, ECPPIOC_SETPARMS will return
 159                            EPROTONOSUPPORT and the mode will be set to
 160                            ECPP_CENTRONICS mode. Afterwards, the application
 161                            may change the mode back to the original mode with
 162                            ECPPIOC_SETPARMS.
 163 
 164 
 165        ECPPIOC_GETDEVID
 166                            This ioctl gets the IEEE 1284 device ID from the
 167                            peripheral in specified mode. Currently, the device
 168                            ID can be retrieved only in Nibble mode. A pointer
 169                            to the structure defined in <sys/ecppsys.h> must be
 170                            passed as an argument.
 171 
 172                            The 1284 device ID structure:
 173 
 174                              struct ecpp_device_id {
 175                                int  mode; /* mode to use for reading device id */
 176                                int  len;  /* length of buffer */
 177                                int  rlen;  /* actual length of device id string */
 178                                char *addr; /* buffer address */
 179                              };
 180 
 181                            The mode is the IEEE 1284 mode into which the port
 182                            will be negotiated to retrieve device ID
 183                            information. If the peripheral or host do not
 184                            support the mode, EPROTONOSUPPORT is returned.
 185                            Applications should set mode to ECPP_NIBBLE_MODE.
 186                            len is the length of the buffer pointed to by addr.
 187                            rlen is the actual length of the device ID string
 188                            returned from the peripheral. If the returned rlen
 189                            is greater than len, the application can call
 190                            ECPPIOC_GETDEVID again with a buffer length equal
 191                            or greater than rlen. Note that the two length
 192                            bytes of the IEEE 1284 device ID are not taken into
 193                            account and are not returned in the user buffer.
 194 
 195                            After ECPPIOC_GETDEVID successfully completes, the
 196                            driver returns the link to ECPP_COMPAT_MODE. The
 197                            application is responsible for determining the
 198                            previous mode the link was operating in and
 199                            returning the link to that mode.
 200 
 201 
 202        BPPIOC_TESTIO
 203                            Tests the forward transfer readiness of a
 204                            peripheral operating in Centronics or Compatibility
 205                            mode.
 206 
 207                            TESTIO determines if the peripheral is ready to
 208                            receive data by checking the open flags and the
 209                            Centronics status signals. If the current mode of
 210                            the device is ECPP_NIBBLE_MODE, the driver
 211                            negotiates the link into ECPP_COMPAT_MODE, check
 212                            the status signals and then return the link to
 213                            ECPP_NIBBLE_MODE mode. If the current mode is
 214                            ECPP_CENTRONICS or ECPP_COMPAT_MODE, TESTIO
 215                            examines the Centronics status signals in the
 216                            current mode. To receive data, the device must have
 217                            the nErr and Select signals asserted and must not
 218                            have the PE and Busy signals asserted. If ecpp is
 219                            transferring data, TESTIO waits until the previous
 220                            data sent to the driver is delivered before
 221                            executing TESTIO. However if an error condition
 222                            occurs while a TESTIO is waiting, TESTIO returns
 223                            immediately. If TESTIO determines that the
 224                            conditions are ok, 0 is returned. Otherwise, -1 is
 225                            returned, errno is set to EIO and the state of the
 226                            status pins is captured. The captured status can be
 227                            retrieved using the BPPIOC_GETERR ioctl(2) call.
 228                            The timeout_occurred and bus_error fields will
 229                            never be set by this ioctl(2). BPPIOC_TESTIO and
 230                            BPPIOC_GETERR are compatible to the ioctls
 231                            specified in bpp(7D).
 232 
 233 
 234        BPPIOC_GETERR
 235                            Get last error status. The argument is a pointer to
 236                            a struct bpp_error_status defined in <sys/bpp_io.h>
 237                            header file. The error status structure is:
 238 
 239                              struct bpp_error_status {
 240                                 char    timeout_occurred; /* 1=timeout */
 241                                 char    bus_error;        /* not used */
 242                                 uchar_t pin_status;       /* status of pins which
 243                                                           /* could cause error */
 244                              };
 245 
 246                            The pin_status field indicates possible error
 247                            conditions. The valid bits for pin_status are:
 248                            BPP_ERR_ERR, BPP_SLCT_ERR, BPP_PE_ERR,
 249                            BPP_BUSY_ERR. A set bit indicates that the
 250                            associated pin is asserted.
 251 
 252                            This structure indicates the status of all the
 253                            appropriate status bits at the time of the most
 254                            recent error condition during a write(2) call, or
 255                            the status of the bits at the most recent
 256                            BPPIOC_TESTIO ioctl(2)call.
 257 
 258                            pin_status indicates possible error conditions
 259                            under ECPP_CENTRONICS or ECPP_COMPAT_MODE. Under
 260                            these modes, the state of the status pins will
 261                            indicate the state of the device. For instance,
 262                            many Centronics printers lower the nErr signal when
 263                            a paper jam occurs. The behavior of the status pins
 264                            depends on the device. Additional status
 265                            information may be retrieved through the
 266                            backchannel.
 267 
 268                            The timeout_occurred value is set when a timeout
 269                            occurs during write(2). bus_error is not used in
 270                            this interface.
 271 
 272 
 273 
 274        The following ioctls are used to directly read and write the parallel
 275        port status and control signals. If the current mode of the device is
 276        ECPP_ECP_MODE or ECPP_NIBBLE_MODE, the driver negotiates the link into
 277        ECPP_COMPAT_MODE, gets or sets the registers and then returns the link
 278        to ECPP_NIBBLE_MODE. If the current mode is ECPP_CENTRONICS or
 279        ECPP_COMPAT_MODE, these ioctls will get/set the register values in the
 280        current mode.
 281 
 282        ECPPIOC_GETREGS
 283                           Read register values. The argument is a pointer to a
 284                           struct ecpp_regs.  See below for a description of
 285                           this structure.
 286 
 287 
 288        ECPPIOC_SETREGS
 289                           Set ecpp register values. The argument is a pointer
 290                           to a struct ecpp_regs. See below for a description
 291                           of this structure. If a parameter is out of range,
 292                           EINVAL is returned.
 293 
 294                           The Port Register Structure is defined in
 295                           <sys/ecppio.h>.
 296 
 297                             struct ecpp_regs {
 298                                 uchar     dsr;  /* status reg */
 299                                 u_char    dcr;  /* control reg */
 300                             };
 301 
 302                           The status register is read-only. The
 303                           ECPPIOC_SETREGS ioctl has no affect on this
 304                           register. Valid bit values for dsr are: ECPP_nERR,
 305                           ECPP_SLCT, ECPP_PE, ECPP_nACK, ECPP_nBUSY. All other
 306                           bits are reserved and always return 1.
 307 
 308                           The control register is read/write. Valid bit values
 309                           for dcr are: ECPP_STB, ECPP_AFX, ECPP_nINIT,
 310                           ECPP_SLCTIN. All other bits are reserved. Reading
 311                           reserved bits always return 1. An attempt to write
 312                           0s into these bits results in EINVAL.
 313 
 314 
 315 DEVICE SPECIAL FILES
 316        /dev/lpN
 317                           x86 only. (Backwards compatibility with former
 318                           lp(7D) devices.)
 319 
 320 
 321        /dev/printers/N
 322                           1284 compliant parallel port device special files
 323                           appears in both namespaces.
 324 
 325 
 326 FILES
 327        /kernel/drv/sparcv9/ecpp
 328 
 329            Device driver (SPARC)
 330 
 331 
 332        /kernel/drv/amd64/ecpp
 333 
 334            Device driver (x86)
 335 
 336 
 337        /kernel/drv/ecpp.conf
 338 
 339            Driver configuration file
 340 
 341 
 342 ERRORS
 343        EBADF
 344                  The device is opened for write-only access and a read is
 345                  attempted, or the device is opened for read-only access and a
 346                  write is attempted.
 347 
 348 
 349        EBUSY
 350                  The device has been opened and another open is attempted. An
 351                  attempt has been made to unload the driver while one of the
 352                  units is open.
 353 
 354 
 355        EINVAL
 356                  A ECPPIOC_SETPARMS ioctl() is attempted with an out-of-range
 357                  value in the ecpp_transfer_parms structure. A ECPPIOC_SETREGS
 358                  ioctl() is attempted with an invalid value in the ecpp_regs
 359                  structure. An ioctl() is attempted with an invalid value in
 360                  the command argument.An invalid command argument is received
 361                  during modload(1M) or modunload(1M).
 362 
 363 
 364        EIO
 365                  The driver encountered a bus error when attempting an access.
 366                  A read or write did not complete properly, due to a
 367                  peripheral error or a transfer timeout.
 368 
 369 
 370        ENXIO
 371                  The driver has received an open request for a unit for which
 372                  the attach failed.  The driver has received a write request
 373                  for a unit which has an active peripheral error.
 374 
 375 
 376 ATTRIBUTES
 377        See attributes(5) for descriptions of the following attributes:
 378 
 379 
 380 
 381 
 382        +--------------------+-------------------------+
 383        |  ATTRIBUTE TYPE    |     ATTRIBUTE VALUE     |
 384        +--------------------+-------------------------+
 385        |Architecture        | PCI-based systems       |
 386        +--------------------+-------------------------+
 387        |                    | ISA-based systems (x86) |
 388        +--------------------+-------------------------+
 389        |Interface stability | Evolving                |
 390        +--------------------+-------------------------+
 391 
 392 SEE ALSO
 393        modload(1M), modunload(1M), update_drv(1M), ioctl(2), open(2), read(2),
 394        write(2), attributes(5), bpp(7D), usbprn(7D), prnio(7I), streamio(7I)
 395 
 396 
 397        IEEE Std 1284-1994
 398 
 399 DIAGNOSTICS
 400        Parallel port controller not supported
 401 
 402            Driver does not support parallel port controller on the given host.
 403            Attach failed.
 404 
 405 
 406 
 407 
 408                                January 10, 2020                       ECPP(7D)