Improve ppbus(4) microsequencer description. Remove ppbconf.9 which is
to rapidly depreciated.
This commit is contained in:
parent
305b918913
commit
06fc25611a
|
@ -1,4 +1,4 @@
|
|||
.\" Copyright (c) 1998, Nicolas Souchu
|
||||
.\" Copyright (c) 1998, 1999, Nicolas Souchu
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
|
@ -45,68 +45,412 @@ a uniform programming model
|
|||
.It
|
||||
efficient code
|
||||
.El
|
||||
.Sh INTERFACE
|
||||
.Pp
|
||||
Before using microsequences, you are encouraged to look at
|
||||
.Xr ppc 4
|
||||
microsequencer implementation and an example of how using it in
|
||||
.Xr vpo 4 .
|
||||
.Sh PPBUS register model
|
||||
.Ss Background
|
||||
The parallel port model chosen for ppbus is the PC parallel port model.
|
||||
Thus, any register described later has the same semantic than its counterpart
|
||||
in a PC parallel port. For more info about ISA/ECP programming, get the
|
||||
Microsoft standard referenced as "Extended Capabilities Port Protocol and
|
||||
ISA interface Standard". Registers described later are standard parallel port
|
||||
registers.
|
||||
.Pp
|
||||
Mask macros are defined in the standard ppbus include files for each valid
|
||||
bit of parallel port registers.
|
||||
.Ss Data register
|
||||
In compatible or nibble mode, writing to this register will drive data to the
|
||||
parallel port data lines. In any other mode, drivers may be tri-stated by
|
||||
setting the direction bit (PCD) in the control register. Reads to this register
|
||||
return the value on the data lines.
|
||||
.Ss Device status register
|
||||
This read-only register reflects the inputs on the parallel port interface.
|
||||
.Pp
|
||||
.Bl -column "Bit" "Name" "Description" -compact
|
||||
.It Em Bit Ta Em Name Ta Em Description
|
||||
.It 7 Ta nBUSY Ta "inverted version of parallel port Busy signal"
|
||||
.It 6 Ta nACK Ta "version of parellel port nAck signal"
|
||||
.It 5 Ta PERROR Ta "version of parallel port PERROR signal"
|
||||
.It 4 Ta SELECT Ta "version of parallel port Select signal"
|
||||
.It 3 Ta nFAULT Ta "version of parallel port nFault signal"
|
||||
.El
|
||||
.Pp
|
||||
Others are reserved and return undefined result when read.
|
||||
.Ss Device control register
|
||||
This register directly controls several output signals as well as enabling
|
||||
some functions.
|
||||
.Pp
|
||||
.Bl -column "Bit" "Name " "Description" -compact
|
||||
.It Em Bit Ta Em Name Ta Em Description
|
||||
.It 5 Ta PCD Ta "direction bit in extended modes"
|
||||
.It 4 Ta IRQENABLE Ta "1 enables an interrupt on the rising edge of nAck"
|
||||
.It 3 Ta SELECTIN Ta "inverted and driven as parallel port nSelectin signal"
|
||||
.It 2 Ta nINIT Ta "driven as parallel port nInit signal"
|
||||
.It 1 Ta AUTOFEED Ta "inverted and driven as parallel port nAutoFd signal"
|
||||
.It 0 Ta STROBE Ta "inverted and driven as parallel port nStrobe signal"
|
||||
.El
|
||||
.Sh MICROINSTRUCTIONS
|
||||
.Ss Description
|
||||
.Em Microinstructions
|
||||
are either parallel port accesses, program iterations, submicrosequence or
|
||||
C calls. The parallel port must be considered as the logical model described in
|
||||
.Xr ppbus 4 .
|
||||
.Pp
|
||||
Available microinstructions are:
|
||||
.Bd -literal
|
||||
#define MS_OP_GET 0 /* get <ptr>, <len> */
|
||||
#define MS_OP_PUT 1 /* put <ptr>, <len> */
|
||||
#define MS_OP_RFETCH 2 /* rfetch <reg>, <mask>, <ptr> */
|
||||
#define MS_OP_RSET 3 /* rset <reg>, <mask>, <mask> */
|
||||
#define MS_OP_RASSERT 4 /* rassert <reg>, <mask> */
|
||||
#define MS_OP_DELAY 5 /* delay <val> */
|
||||
#define MS_OP_SET 6 /* set <val> */
|
||||
#define MS_OP_DBRA 7 /* dbra <offset> */
|
||||
#define MS_OP_BRSET 8 /* brset <mask>, <offset> */
|
||||
#define MS_OP_BRCLEAR 9 /* brclear <mask>, <offset> */
|
||||
#define MS_OP_RET 10 /* ret <retcode> */
|
||||
#define MS_OP_C_CALL 11 /* c_call <function>, <parameter> */
|
||||
#define MS_OP_PTR 12 /* ptr <pointer> */
|
||||
#define MS_OP_ADELAY 13 /* adelay <val> */
|
||||
#define MS_OP_BRSTAT 14 /* brstat <mask>, <mask>, <offset> */
|
||||
#define MS_OP_SUBRET 15 /* subret <code> */
|
||||
#define MS_OP_CALL 16 /* call <microsequence> */
|
||||
#define MS_OP_RASSERT_P 17 /* rassert_p <iter>, <reg> */
|
||||
#define MS_OP_RFETCH_P 18 /* rfetch_p <iter>, <reg>, <mask> */
|
||||
#define MS_OP_TRIG 19 /* trigger <reg>, <len>, <array> */
|
||||
.Ed
|
||||
.Ss Execution context
|
||||
The
|
||||
.Em execution context
|
||||
of microinstructions is:
|
||||
.Bl -bullet -item -offset indent
|
||||
.It
|
||||
the
|
||||
.Em program counter
|
||||
which points to the next microinstruction to execute either in the main
|
||||
microsequence or in a subcall
|
||||
.It
|
||||
the current value of
|
||||
.Em ptr
|
||||
which points to the next char to send/receive
|
||||
.It
|
||||
the current value of the internal
|
||||
.Em branch register
|
||||
.El
|
||||
.Pp
|
||||
This data is modified by some of the microinstructions, not all.
|
||||
.Ss MS_OP_GET and MS_OP_PUT
|
||||
are microinstructions used to do either predefined standard IEEE1284-1994
|
||||
transfers or programed non-standard io.
|
||||
.Ss MS_OP_RFETCH - Register FETCH
|
||||
is used to retrieve the current value of a parallel port register, apply a
|
||||
mask and save it in a buffer.
|
||||
.Pp
|
||||
Parameters:
|
||||
.Bl -enum -offset indent
|
||||
.It
|
||||
register
|
||||
.It
|
||||
character mask
|
||||
.It
|
||||
pointer to the buffer
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_RFETCH(reg,mask,ptr)
|
||||
.Ss MS_OP_RSET - Register SET
|
||||
is used to assert/clear some bits of a particular parallel port register,
|
||||
two masks are applied.
|
||||
.Pp
|
||||
Parameters:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
register
|
||||
.It
|
||||
mask of bits to assert
|
||||
.It
|
||||
mask of bits to clear
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_RSET(reg,assert,clear)
|
||||
.Ss MS_OP_RASSERT - Register ASSERT
|
||||
is used to assert all bits of a particular parallel port register.
|
||||
.Pp
|
||||
Parameters:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
register
|
||||
.It
|
||||
byte to assert
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_RASSERT(reg,byte)
|
||||
.Ss MS_OP_DELAY - microsecond DELAY
|
||||
is used to delay the execution of the microsequence.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
delay in microseconds
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_DELAY(delay)
|
||||
.Ss MS_OP_SET - SET internal branch register
|
||||
is used to set the value of the internal branch register.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
integer value
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_SET(accum)
|
||||
.Ss MS_OP_DBRA - Do BRAnch
|
||||
is used to branch if internal branch register decremented by one result value
|
||||
is positive.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
integer offset in the current executed (sub)microsequence. Offset is added to
|
||||
the index of the next microinstruction to execute.
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_DBRA(offset)
|
||||
.Ss MS_OP_BRSET - BRanch on SET
|
||||
is used to branch if some of the status register bits of the parallel port
|
||||
are set.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
bits of the status register
|
||||
.It
|
||||
integer offset in the current executed (sub)microsequence. Offset is added to
|
||||
the index of the next microinstruction to execute.
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_BRSET(mask,offset)
|
||||
.Ss MS_OP_BRCLEAR - BRanch on CLEAR
|
||||
is used to branch if some of the status register bits of the parallel port
|
||||
are cleared.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
bits of the status register
|
||||
.It
|
||||
integer offset in the current executed (sub)microsequence. Offset is added to
|
||||
the index of the next microinstruction to execute.
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_BRCLEAR(mask,offset)
|
||||
.Ss MS_OP_RET - RETurn
|
||||
is used to return from a microsequence. This instruction is mandatory. This
|
||||
is the only way for the microsequencer to detect the end of the microsequence.
|
||||
The return code is returned in the integer pointed by the (int *) parameter
|
||||
of the ppb_MS_microseq().
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
integer return code
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_RET(code)
|
||||
.Ss MS_OP_C_CALL - C function CALL
|
||||
is used to call C functions from microsequence execution. This may be usefull
|
||||
when a non-standard i/o is performed to retrieve a data character from the
|
||||
parallel port.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
the C function to call
|
||||
.It
|
||||
the parameter to pass to the function call
|
||||
.El
|
||||
.Pp
|
||||
The C function shall be declared as a
|
||||
.Fd int(*)(void *p, char *ptr)
|
||||
The ptr parameter is the current position in the buffer currently scanned.
|
||||
.Pp
|
||||
Predefined macro: MS_C_CALL(func,param)
|
||||
.Ss MS_OP_PTR - initialize internal PTR
|
||||
is used to initilize the internal pointeur to the currently scanned buffer.
|
||||
This pointer is passed to any C call (see above).
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
pointer to the buffer that shall be accessed by xxx_P() microsequence calls.
|
||||
Note that this pointer is automatically incremented during xxx_P() calls
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_PTR(ptr)
|
||||
.Ss MS_OP_ADELAY - do an Asynchroneous DELAY
|
||||
is used to make a tsleep() during microsequence execution. The tsleep is
|
||||
executed at PPBPRI level.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
delay in ms
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_ADELAY(delay)
|
||||
.Ss MS_OP_BRSTAT - BRanch on STATe
|
||||
is used to branch on status register state condition.
|
||||
.Pp
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
mask of asserted bits. Bits that shall be asserted in the status register
|
||||
are set in the mask
|
||||
.It
|
||||
mask of cleared bits. Bits that shall be cleared in the status register
|
||||
are set in the mask
|
||||
.It
|
||||
integer offset in the current executed (sub)microsequence. Offset is added
|
||||
to the index of the next microinstruction to execute.
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_BRSTAT(asserted_bits,clear_bits,offset)
|
||||
.Ss MS_OP_SUBRET - SUBmicrosequence RETurn
|
||||
is used to return from the submicrosequence call. This action is mandatory
|
||||
before a RET call. Some microinstructions (PUT, GET) may not be callable
|
||||
within a submicrosequence.
|
||||
.Pp
|
||||
No parameter.
|
||||
.Pp
|
||||
Predefined macro: MS_SUBRET()
|
||||
.Ss MS_OP_CALL - submicrosequence CALL
|
||||
is used to call a submicrosequence. A submicrosequence is a microsequence with
|
||||
a SUBRET call.
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
the submicrosequence to execute
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_CALL(microseq)
|
||||
.Ss MS_OP_RASSERT_P - Register ASSERT from internal PTR
|
||||
is used to assert a register with data currently pointed by the internal PTR
|
||||
pointer.
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
amount of data to write to the register
|
||||
.It
|
||||
register
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_RASSERT_P(iter,reg)
|
||||
.Ss MS_OP_RFETCH_P - Register FETCH to internal PTR
|
||||
is used to fetch data from a register. Data is stored in the buffer currently
|
||||
pointed by the internal PTR pointer.
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
amount of data to read from the register
|
||||
.It
|
||||
register
|
||||
.It
|
||||
mask applied to fetched data
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_RFETCH_P(iter,reg,mask)
|
||||
.Ss MS_OP_TRIG - TRIG register
|
||||
is used to trigger the parallel port. This microinstruction is intended to
|
||||
provide a very efficient control of the parallel port. Triggering a register
|
||||
is writing data, wait a while, write data, wait a while... This allows to
|
||||
write magic sequences to the port.
|
||||
Parameter:
|
||||
.Bl -enum -offset ident
|
||||
.It
|
||||
amount of data to read from the register
|
||||
.It
|
||||
register
|
||||
.It
|
||||
size of the array
|
||||
.It
|
||||
array of unsigned chars. Each couple of u_chars define the data to write to
|
||||
the register and the delay in us to wait. The delay is limited to 255 us to
|
||||
simplify and reduce the size of the array.
|
||||
.El
|
||||
.Pp
|
||||
Predefined macro: MS_TRIG(reg,len,array)
|
||||
.Sh MICROSEQUENCES
|
||||
.Ss C structures
|
||||
.Bd -literal
|
||||
union ppb_insarg {
|
||||
int i;
|
||||
char c;
|
||||
void *p;
|
||||
int (* f)(void *, char *);
|
||||
int i;
|
||||
char c;
|
||||
void *p;
|
||||
int (* f)(void *, char *);
|
||||
};
|
||||
.Ed
|
||||
.Bd -literal
|
||||
|
||||
struct ppb_microseq {
|
||||
int opcode; /* microins. opcode */
|
||||
union ppb_insarg arg[PPB_MS_MAXARGS]; /* arguments */
|
||||
int opcode; /* microins. opcode */
|
||||
union ppb_insarg arg[PPB_MS_MAXARGS]; /* arguments */
|
||||
};
|
||||
.Ed
|
||||
.Ss Using microsequences
|
||||
.Pp
|
||||
To instanciate a microsequence, just declare an array of ppb_microseq
|
||||
structures and initialize it as needed. You may either use defined macros
|
||||
structures and initialize it as needed. You may either use predefined macros
|
||||
or code directly your microinstructions according to the ppb_microseq
|
||||
definition. For example,
|
||||
.Bd -literal
|
||||
struct ppb_microseq select_microseq[] = {
|
||||
struct ppb_microseq select_microseq[] = {
|
||||
|
||||
/* parameter list
|
||||
*/
|
||||
#define SELECT_TARGET MS_PARAM(0, 1, MS_TYP_INT)
|
||||
#define SELECT_INITIATOR MS_PARAM(3, 1, MS_TYP_INT)
|
||||
/* parameter list
|
||||
*/
|
||||
#define SELECT_TARGET MS_PARAM(0, 1, MS_TYP_INT)
|
||||
#define SELECT_INITIATOR MS_PARAM(3, 1, MS_TYP_INT)
|
||||
|
||||
/* send the select command to the drive */
|
||||
MS_DASS(MS_UNKNOWN),
|
||||
MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE),
|
||||
MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE),
|
||||
MS_DASS(MS_UNKNOWN),
|
||||
MS_CASS( H_AUTO | H_nSELIN | H_nINIT | H_STROBE),
|
||||
/* send the select command to the drive */
|
||||
MS_DASS(MS_UNKNOWN),
|
||||
MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE),
|
||||
MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE),
|
||||
MS_DASS(MS_UNKNOWN),
|
||||
MS_CASS( H_AUTO | H_nSELIN | H_nINIT | H_STROBE),
|
||||
|
||||
/* now, wait until the drive is ready */
|
||||
MS_SET(VP0_SELTMO),
|
||||
/* loop: */ MS_BRSET(H_ACK, 3 /* ready */),
|
||||
MS_DBRA(-1 /* loop */),
|
||||
/* error: */ MS_RET(1),
|
||||
/* ready: */ MS_RET(0)
|
||||
};
|
||||
/* now, wait until the drive is ready */
|
||||
MS_SET(VP0_SELTMO),
|
||||
/* loop: */ MS_BRSET(H_ACK, 2 /* ready */),
|
||||
MS_DBRA(-2 /* loop */),
|
||||
/* error: */ MS_RET(1),
|
||||
/* ready: */ MS_RET(0)
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
Here, some parameters are undefined and must be filled before executing
|
||||
the microsequence. In order to initialize seach a microsequence, one should
|
||||
use the ppb_MS_init_msq() function like this:
|
||||
the microsequence. In order to initialize seach a microsequence, one
|
||||
should use the ppb_MS_init_msq() function like this:
|
||||
.Bd -literal
|
||||
ppb_MS_init_msq(select_microseq, 2,
|
||||
SELECT_TARGET, 1 << target,
|
||||
SELECT_INITIATOR, 1 << initiator);
|
||||
ppb_MS_init_msq(select_microseq, 2,
|
||||
SELECT_TARGET, 1 << target,
|
||||
SELECT_INITIATOR, 1 << initiator);
|
||||
.Ed
|
||||
.Pp
|
||||
and then execute the microsequence.
|
||||
.Ss The microsequencer
|
||||
The microsequencer is executed either at ppbus or adapter level (see
|
||||
.Xr ppbus 4
|
||||
for info about ppbus system layers).
|
||||
for info about ppbus system layers). Most of the microsequencer is executed
|
||||
at ppc level to avoid ppbus to adapter function call overhead. But some
|
||||
actions like deciding whereas the transfer is IEEE1284-1994 compliant are
|
||||
executed at ppbus layer.
|
||||
.Sh BUGS
|
||||
Only one level of submicrosequences is allowed.
|
||||
.Pp
|
||||
When triggering the port, maximum delay allowed is 255 us.
|
||||
.Sh SEE ALSO
|
||||
.Xr ppbus 4
|
||||
.Xr ppbus 4 ,
|
||||
.Xr ppc 4 ,
|
||||
.Xr vpo 4
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
|
|
|
@ -1,205 +0,0 @@
|
|||
.\" Copyright (c) 1998, Nicolas Souchu
|
||||
.\" 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.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
||||
.\"
|
||||
.\"
|
||||
.Dd April 5, 1998
|
||||
.Dt PPBCONF 9
|
||||
.Os FreeBSD
|
||||
.Sh NAME
|
||||
.Nm ppbconf
|
||||
.Nd
|
||||
ppbus developer's guide
|
||||
.Sh SYNOPSIS
|
||||
.Fd "#include <dev/ppbus/ppbconf.h>"
|
||||
.Sh DESCRIPTION
|
||||
See
|
||||
.Xr ppbus 4
|
||||
for ppbus description.
|
||||
.Sh PPBUS STRUCTURES
|
||||
Each ppbus layer
|
||||
.Po
|
||||
.Em adapter ,
|
||||
.Em ppbus
|
||||
and
|
||||
.Em device
|
||||
.Pc
|
||||
is described by one or more C structure.
|
||||
.Ss The adapter layer
|
||||
.Bd -literal
|
||||
struct ppb_adapter {
|
||||
|
||||
void (*intr_handler)(int);
|
||||
void (*reset_epp_timeout)(int);
|
||||
void (*ecp_sync)(int);
|
||||
|
||||
int (*exec_microseq)(int, struct ppb_microseq *, int *);
|
||||
|
||||
int (*setmode)(int, int);
|
||||
|
||||
void (*outsb_epp)(int, char *, int);
|
||||
void (*outsw_epp)(int, char *, int);
|
||||
void (*outsl_epp)(int, char *, int);
|
||||
void (*insb_epp)(int, char *, int);
|
||||
void (*insw_epp)(int, char *, int);
|
||||
void (*insl_epp)(int, char *, int);
|
||||
|
||||
char (*r_dtr)(int);
|
||||
char (*r_str)(int);
|
||||
char (*r_ctr)(int);
|
||||
char (*r_epp)(int);
|
||||
char (*r_ecr)(int);
|
||||
char (*r_fifo)(int);
|
||||
|
||||
void (*w_dtr)(int, char);
|
||||
void (*w_str)(int, char);
|
||||
void (*w_ctr)(int, char);
|
||||
void (*w_epp)(int, char);
|
||||
void (*w_ecr)(int, char);
|
||||
void (*w_fifo)(int, char);
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
This structure is the interface between
|
||||
.Xr ppc 4
|
||||
layer and upper ppbus system levels. For each ppc device, this
|
||||
structure is filled with generic i/o functions that may be redefined if
|
||||
needed for particular chipsets.
|
||||
.Pp
|
||||
Developers are really encouraged to use the
|
||||
exec_microseq entry to avoid indirect function call overhead. See
|
||||
.Xr microseq 9
|
||||
for more info.
|
||||
.Ss The ppbus layer
|
||||
.Bd -literal
|
||||
struct ppb_driver
|
||||
{
|
||||
struct ppb_device *(*probe)(struct ppb_data *ppb);
|
||||
int (*attach)(struct ppb_device *pdp);
|
||||
char *name;
|
||||
};
|
||||
.Ed
|
||||
.Bd -literal
|
||||
struct ppb_data {
|
||||
|
||||
#define PPB_PnP_PRINTER 0
|
||||
#define PPB_PnP_MODEM 1
|
||||
#define PPB_PnP_NET 2
|
||||
#define PPB_PnP_HDC 3
|
||||
#define PPB_PnP_PCMCIA 4
|
||||
#define PPB_PnP_MEDIA 5
|
||||
#define PPB_PnP_FDC 6
|
||||
#define PPB_PnP_PORTS 7
|
||||
#define PPB_PnP_SCANNER 8
|
||||
#define PPB_PnP_DIGICAM 9
|
||||
#define PPB_PnP_UNKNOWN 10
|
||||
int class_id; /* not a PnP device if class_id < 0 */
|
||||
|
||||
ushort mode; /* IEEE 1284-1994 mode
|
||||
* NIBBLE, PS2, EPP, ECP */
|
||||
ushort avm; /* IEEE 1284-1994 available
|
||||
* modes */
|
||||
|
||||
struct ppb_link *ppb_link; /* link to the adapter */
|
||||
struct ppb_device *ppb_owner; /* device which owns the bus */
|
||||
LIST_HEAD(, ppb_device) ppb_devs; /* list of devices on the bus */
|
||||
LIST_ENTRY(ppb_data) ppb_chain; /* list of busses */
|
||||
};
|
||||
.Ed
|
||||
.Ss The device layer
|
||||
.Bd -literal
|
||||
/* microseqences used for GET/PUT operations */
|
||||
struct ppb_xfer {
|
||||
struct ppb_microseq *prolog; /* loop prologue */
|
||||
struct ppb_microseq *body; /* loop body */
|
||||
struct ppb_microseq *epilog; /* loop epilogue */
|
||||
};
|
||||
.Ed
|
||||
.Bd -literal
|
||||
struct ppb_context {
|
||||
int valid; /* 1 if the struct is valid */
|
||||
int mode; /* operating mode */
|
||||
|
||||
struct microseq *curpc; /* pc in curmsq */
|
||||
struct microseq *curmsq; /* currently executed microseq */
|
||||
};
|
||||
.Ed
|
||||
.Bd -literal
|
||||
struct ppb_device {
|
||||
|
||||
int id_unit; /* unit of the device */
|
||||
char *name; /* name of the device */
|
||||
|
||||
ushort mode; /* current mode of the device */
|
||||
ushort avm; /* available modes of the device */
|
||||
|
||||
struct ppb_context ctx; /* context of the device */
|
||||
|
||||
/* mode dependent get msq. If NULL,
|
||||
* IEEE1284 code is used */
|
||||
struct ppb_xfer
|
||||
get_xfer[PPB_MAX_XFER];
|
||||
|
||||
/* mode dependent put msq. If NULL,
|
||||
* IEEE1284 code is used */
|
||||
struct ppb_xfer
|
||||
put_xfer[PPB_MAX_XFER];
|
||||
|
||||
void (*intr)(int); /* interrupt handler */
|
||||
|
||||
struct ppb_data *ppb; /* link to the ppbus */
|
||||
|
||||
LIST_ENTRY(ppb_device) chain; /* list of devices on the bus */
|
||||
};
|
||||
.Ed
|
||||
.Ss Linking these structures all together
|
||||
.Bd -literal
|
||||
struct ppb_link {
|
||||
|
||||
int adapter_unit; /* unit of the adapter */
|
||||
int base; /* base address of the port */
|
||||
int id_irq; /* != 0 if irq enabled */
|
||||
|
||||
#define EPP_1_9 0x0 /* default */
|
||||
#define EPP_1_7 0x1
|
||||
int epp_protocol; /* EPP protocol: 0=1.9, 1=1.7 */
|
||||
|
||||
struct ppb_adapter *adapter; /* link to the ppc adapter */
|
||||
struct ppb_data *ppbus; /* link to the ppbus */
|
||||
};
|
||||
.Ed
|
||||
.Sh EXAMPLE
|
||||
See vpo.c source file.
|
||||
.Sh SEE ALSO
|
||||
.Xr ppbus 4 ,
|
||||
.Xr ppi 4 ,
|
||||
.Xr microseq 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
manual page first appeared in
|
||||
.Fx 3.0 .
|
||||
.Sh AUTHOR
|
||||
This
|
||||
manual page was written by
|
||||
.An Nicolas Souchu .
|
Loading…
Reference in New Issue