1 /* $NetBSD: ucomvar.h,v 1.23 2019/05/09 02:43:35 mrg Exp $ */ 2 3 /* 4 * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Lennart Augustsson (lennart@augustsson.net) at 9 * Carlstedt Research & Technology. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 34 /* just for ucom_attach_args, not in the config namespace */ 35 #define UCOM_UNK_PORTNO (-1) 36 37 struct ucom_softc; 38 39 /* 40 * USB detach requires ensuring that outstanding operations and 41 * open devices are properly closed before detach can return. 42 * 43 * ucom parents rely upon ucom(4) itself doing any safety here. 44 * The standard method is: 45 * 46 * 1. device softc has a "bool sc_dying" member, that may be set 47 * in attach or other run-time for general failure, and set 48 * early in the detach callback 49 * 50 * 2. if sc_dying is set, most functions should perform as close 51 * to zero operations as possible 52 * 53 * 3. detach callback sets sc_dying to true and then cleans up 54 * any local state and calls config_detach() on each child 55 */ 56 57 /* 58 * The first argument to the ucom callbacks is the passed in ucaa_arg 59 * member of the attach args, typically the parent softc pointer. 60 * 61 * All of these are optional. 62 */ 63 struct ucom_methods { 64 /* 65 * arg2: port number 66 * arg3: pointer to lsr (always non NULL) 67 * arg4: pointer to msr (always non NULL) 68 */ 69 void (*ucom_get_status)(void *, int, u_char *, u_char *); 70 /* 71 * arg2: port number 72 * arg3: value to turn on or off (DTR, RTS, BREAK) 73 * arg4: onoff 74 */ 75 void (*ucom_set)(void *, int, int, int); 76 #define UCOM_SET_DTR 1 77 #define UCOM_SET_RTS 2 78 #define UCOM_SET_BREAK 3 79 /* 80 * arg2: port number 81 * arg3: termios structure to set parameters from 82 */ 83 int (*ucom_param)(void *, int, struct termios *); 84 /* 85 * arg2: port number 86 * arg3: ioctl command 87 * arg4: ioctl data 88 * arg5: ioctl flags 89 * arg6: process calling ioctl 90 */ 91 int (*ucom_ioctl)(void *, int, u_long, void *, int, proc_t *); 92 /* arg2: port number */ 93 int (*ucom_open)(void *, int); 94 /* arg2: port number */ 95 void (*ucom_close)(void *, int); 96 /* 97 * arg2: port number 98 * arg3: pointer to buffer pointer 99 * arg4: pointer to buffer count 100 * 101 * Note: The 'ptr' (3nd arg) and 'count' (4rd arg) pointers can be 102 * adjusted as follows: 103 * 104 * ptr: If consuming characters from the start of the buffer, 105 * advance '*ptr' to skip the data consumed. 106 * 107 * count: If consuming characters at the end of the buffer, 108 * decrement '*count' by the number of characters 109 * consumed. 110 * 111 * If consuming all characters, set '*count' to zero. 112 */ 113 void (*ucom_read)(void *, int, u_char **, uint32_t *); 114 /* 115 * arg2: port number 116 * arg3: pointer to source buffer 117 * arg4: pointer to destination buffer 118 * arg5: pointer to buffer count 119 */ 120 void (*ucom_write)(void *, int, u_char *, u_char *, uint32_t *); 121 }; 122 123 /* modem control register */ 124 #define UMCR_RTS 0x02 /* Request To Send */ 125 #define UMCR_DTR 0x01 /* Data Terminal Ready */ 126 127 /* line status register */ 128 #define ULSR_RCV_FIFO 0x80 129 #define ULSR_TSRE 0x40 /* Transmitter empty: byte sent */ 130 #define ULSR_TXRDY 0x20 /* Transmitter buffer empty */ 131 #define ULSR_BI 0x10 /* Break detected */ 132 #define ULSR_FE 0x08 /* Framing error: bad stop bit */ 133 #define ULSR_PE 0x04 /* Parity error */ 134 #define ULSR_OE 0x02 /* Overrun, lost incoming byte */ 135 #define ULSR_RXRDY 0x01 /* Byte ready in Receive Buffer */ 136 #define ULSR_RCV_MASK 0x1f /* Mask for incoming data or error */ 137 138 /* modem status register */ 139 /* All deltas are from the last read of the MSR. */ 140 #define UMSR_DCD 0x80 /* Current Data Carrier Detect */ 141 #define UMSR_RI 0x40 /* Current Ring Indicator */ 142 #define UMSR_DSR 0x20 /* Current Data Set Ready */ 143 #define UMSR_CTS 0x10 /* Current Clear to Send */ 144 #define UMSR_DDCD 0x08 /* DCD has changed state */ 145 #define UMSR_TERI 0x04 /* RI has toggled low to high */ 146 #define UMSR_DDSR 0x02 /* DSR has changed state */ 147 #define UMSR_DCTS 0x01 /* CTS has changed state */ 148 149 struct ucom_attach_args { 150 int ucaa_portno; 151 int ucaa_bulkin; 152 int ucaa_bulkout; 153 u_int ucaa_ibufsize; 154 u_int ucaa_ibufsizepad; 155 u_int ucaa_obufsize; 156 u_int ucaa_opkthdrlen; 157 const char *ucaa_info; /* attach message */ 158 struct usbd_device *ucaa_device; 159 struct usbd_interface *ucaa_iface; 160 const struct ucom_methods *ucaa_methods; 161 void *ucaa_arg; 162 }; 163 164 int ucomprint(void *, const char *); 165 int ucomsubmatch(device_t t, cfdata_t, const int *, void *); 166 void ucom_status_change(struct ucom_softc *); 167