Communication between the real driver and the ucom driver is via the attachment arguments (when attached) and via the ucom_methods struct
struct ucom_attach_args {
int portno;
int bulkin;
int bulkout;
u_int ibufsize;
u_int ibufsizepad;
u_int obufsize;
u_int obufsizepad;
usbd_device_handle device;
usbd_interface_handle iface;
struct ucom_methods *methods;
void *arg;
};
int
portno
UCOM_UNK_PORTNO
if there is only one port.
int
bulkin
int
bulkout
u_int
ibufsize
u_int
ibufsizepad
ibufsize
.
u_int
obufsize
u_int
ibufsizepad
obufsize
.
usbd_device_handle
device
ucom_methods
struct contains a number of function pointers used by the
ucom
driver at various stages.
If the device is not interested in being called at a particular point
it should just use a
NULL
pointer and the
ucom
driver will use a sensible default.
struct ucom_methods {
void (*ucom_get_status)(void *sc, int portno,
u_char *lsr, u_char *msr);
void (*ucom_set)(void *sc, int portno, int reg, int onoff);
#define UCOM_SET_DTR 1
#define UCOM_SET_RTS 2
#define UCOM_SET_BREAK 3
int (*ucom_param)(void *sc, int portno, struct termios *);
int (*ucom_ioctl)(void *sc, int portno, u_long cmd,
void *data, int flag, struct lwp *l);
int (*ucom_open)(void *sc, int portno);
void (*ucom_close)(void *sc, int portno);
void (*ucom_read)(void *sc, int portno, u_char **ptr,
uint32_t *count);
void (*ucom_write)(void *sc, int portno, u_char *to,
u_char *from, uint32_t *count);
};
void *sc, int portno, u_char *lsr, u_char *msr
)
portno
.
The status consists of the line status,
lsr
,
and the modem status
msr
.
The contents of these two bytes is exactly as for a 16550 UART.
void *sc, int portno, int reg, int onoff
)
void *sc, int portno, struct termios *t
)
)
void *sc, int portno
)
void *sc, int portno
)
void *sc, int portno, u_char **ptr, uint32_t *count
)
ptr
and
count
so that they tell where to find the given number of raw characters.
void *sc, int portno, u_char *dst, u_char *src, uint32_t *count
)
count
raw characters from
src
into the buffer at
dst
and do the appropriate padding.
The
count
should be updated to the new size.
The buffer at
src
is at most
ibufsize
bytes and the buffer
at
dst
is
ibufsizepad
bytes.
Apart from these methods there is a function
struct ucom_softc *
)which should be called by the driver whenever it notices a status change.