60#include <sys/stdint.h>
61#include <sys/stddef.h>
66#include <sys/kernel.h>
68#include <sys/module.h>
71#include <sys/condvar.h>
72#include <sys/sysctl.h>
74#include <sys/unistd.h>
75#include <sys/callout.h>
76#include <sys/malloc.h>
84#define USB_DEBUG_VAR ubsa_debug
91static int ubsa_debug = 0;
93static SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
96 &ubsa_debug, 0,
"ubsa debug level");
99#define UBSA_BSIZE 1024
101#define UBSA_CONFIG_INDEX 0
102#define UBSA_IFACE_INDEX 0
104#define UBSA_REG_BAUDRATE 0x00
105#define UBSA_REG_STOP_BITS 0x01
106#define UBSA_REG_DATA_BITS 0x02
107#define UBSA_REG_PARITY 0x03
108#define UBSA_REG_DTR 0x0A
109#define UBSA_REG_RTS 0x0B
110#define UBSA_REG_BREAK 0x0C
111#define UBSA_REG_FLOW_CTRL 0x10
113#define UBSA_PARITY_NONE 0x00
114#define UBSA_PARITY_EVEN 0x01
115#define UBSA_PARITY_ODD 0x02
116#define UBSA_PARITY_MARK 0x03
117#define UBSA_PARITY_SPACE 0x04
119#define UBSA_FLOW_NONE 0x0000
120#define UBSA_FLOW_OCTS 0x0001
121#define UBSA_FLOW_ODSR 0x0002
122#define UBSA_FLOW_IDSR 0x0004
123#define UBSA_FLOW_IDTR 0x0008
124#define UBSA_FLOW_IRTS 0x0010
125#define UBSA_FLOW_ORTS 0x0020
126#define UBSA_FLOW_UNKNOWN 0x0040
127#define UBSA_FLOW_OXON 0x0080
128#define UBSA_FLOW_IXON 0x0100
131#define UBSA_LSR_TSRE 0x40
132#define UBSA_LSR_TXRDY 0x20
133#define UBSA_LSR_BI 0x10
134#define UBSA_LSR_FE 0x08
135#define UBSA_LSR_PE 0x04
136#define UBSA_LSR_OE 0x02
137#define UBSA_LSR_RXRDY 0x01
138#define UBSA_LSR_RCV_MASK 0x1f
142#define UBSA_MSR_DCD 0x80
143#define UBSA_MSR_RI 0x40
144#define UBSA_MSR_DSR 0x20
145#define UBSA_MSR_CTS 0x10
146#define UBSA_MSR_DDCD 0x08
147#define UBSA_MSR_TERI 0x04
148#define UBSA_MSR_DDSR 0x02
149#define UBSA_MSR_DCTS 0x01
202 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
211 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
219 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
242 {
USB_VPI(USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_500A, 0)},
244 {
USB_VPI(USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_E100X, 0)},
246 {
USB_VPI(USB_VENDOR_AXESSTEL, USB_PRODUCT_AXESSTEL_DATAMODEM, 0)},
248 {
USB_VPI(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U103, 0)},
250 {
USB_VPI(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U120, 0)},
252 {
USB_VPI(USB_VENDOR_ETEK, USB_PRODUCT_ETEK_1COM, 0)},
254 {
USB_VPI(USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232, 0)},
256 {
USB_VPI(USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1, 0)},
307 mtx_init(&sc->
sc_mtx,
"ubsa", NULL, MTX_DEF);
318 DPRINTF(
"could not allocate all pipes\n");
330 DPRINTF(
"ucom_attach failed\n");
352 device_claim_softc(
dev);
366 device_free_softc(sc);
390 &
req, NULL, 0, 1000);
392 DPRINTFN(0,
"device request failed, err=%s "
402 DPRINTF(
"onoff = %d\n", onoff);
412 DPRINTF(
"onoff = %d\n", onoff);
422 DPRINTF(
"onoff = %d\n", onoff);
433 switch (t->c_ospeed) {
461 switch (t->c_ospeed) {
478 value = B230400 / t->c_ospeed;
485 if (t->c_cflag & PARENB)
492 switch (t->c_cflag & CSIZE) {
510 value = (t->c_cflag & CSTOPB) ? 1 : 0;
515 if (t->c_cflag & CRTSCTS)
518 if (t->c_iflag & (IXON | IXOFF))
647 if (actlen >= (
int)
sizeof(buf)) {
666 DPRINTF(
"lsr = 0x%02x, msr = 0x%02x\n",
671 DPRINTF(
"ignoring short packet, %d bytes\n", actlen);
static SYSCTL_NODE(_hw_usb, OID_AUTO, dwc_otg, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB DWC OTG")
SYSCTL_INT(_hw_usb_dwc_otg, OID_AUTO, phy_type, CTLFLAG_RDTUN, &dwc_otg_phy_type, 0, "DWC OTG PHY TYPE - 0/1/2/3 - ULPI/HSIC/INTERNAL/UTMI+")
struct ucom_super_softc sc_super_ucom
struct usb_device * sc_udev
struct ucom_softc sc_ucom
struct usb_xfer * sc_xfer[UBSA_N_TRANSFER]
void(* ucom_cfg_get_status)(struct ucom_softc *, uint8_t *plsr, uint8_t *pmsr)
enum usb_hc_mode usb_mode
struct usbd_lookup_info info
struct usb_device * device
static const struct ucom_callback ubsa_callback
static void ubsa_stop_read(struct ucom_softc *)
static void ubsa_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *)
static void ubsa_poll(struct ucom_softc *ucom)
MODULE_DEPEND(ubsa, ucom, 1, 1, 1)
static usb_callback_t ubsa_read_callback
static void ubsa_start_write(struct ucom_softc *)
#define UBSA_REG_DATA_BITS
static void ubsa_cfg_request(struct ubsa_softc *, uint8_t, uint16_t)
static device_detach_t ubsa_detach
static void ubsa_free_softc(struct ubsa_softc *)
static void ubsa_cfg_set_break(struct ucom_softc *, uint8_t)
static void ubsa_free(struct ucom_softc *)
static void ubsa_cfg_set_rts(struct ucom_softc *, uint8_t)
static int ubsa_pre_param(struct ucom_softc *, struct termios *)
static usb_callback_t ubsa_intr_callback
#define UBSA_REG_FLOW_CTRL
DRIVER_MODULE(ubsa, uhub, ubsa_driver, ubsa_devclass, NULL, 0)
static void ubsa_cfg_param(struct ucom_softc *, struct termios *)
static void ubsa_cfg_set_dtr(struct ucom_softc *, uint8_t)
static const struct usb_config ubsa_config[UBSA_N_TRANSFER]
static void ubsa_start_read(struct ucom_softc *)
#define UBSA_CONFIG_INDEX
static usb_callback_t ubsa_write_callback
static device_probe_t ubsa_probe
static devclass_t ubsa_devclass
#define UBSA_REG_STOP_BITS
#define UBSA_REG_BAUDRATE
static const STRUCT_USB_HOST_ID ubsa_devs[]
static driver_t ubsa_driver
static device_attach_t ubsa_attach
static device_method_t ubsa_methods[]
USB_PNP_HOST_INFO(ubsa_devs)
static void ubsa_stop_write(struct ucom_softc *)
#define UT_WRITE_VENDOR_DEVICE
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset, void *ptr, usb_frlength_t len)
const char * usbd_errstr(usb_error_t err)
int usbd_lookup_id_by_uaa(const struct usb_device_id *id, usb_size_t sizeof_id, struct usb_attach_arg *uaa)
uint8_t ucom_get_data(struct ucom_softc *sc, struct usb_page_cache *pc, uint32_t offset, uint32_t len, uint32_t *actlen)
void ucom_status_change(struct ucom_softc *sc)
int ucom_attach(struct ucom_super_softc *ssc, struct ucom_softc *sc, int subunits, void *parent, const struct ucom_callback *callback, struct mtx *mtx)
int ucom_unref(struct ucom_super_softc *ssc)
void ucom_ref(struct ucom_super_softc *ssc)
void ucom_set_pnpinfo_usb(struct ucom_super_softc *ssc, device_t dev)
void ucom_detach(struct ucom_super_softc *ssc, struct ucom_softc *sc)
void ucom_put_data(struct ucom_softc *sc, struct usb_page_cache *pc, uint32_t offset, uint32_t len)
#define ucom_cfg_do_request(udev, com, req, ptr, flags, timo)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, usb_frlength_t len)
struct usb_page_cache * usbd_xfer_get_frame(struct usb_xfer *xfer, usb_frcount_t frindex)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void usbd_transfer_poll(struct usb_xfer **ppxfer, uint16_t max)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_transfer_stop(struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
usb_frlength_t usbd_xfer_max_len(struct usb_xfer *xfer)
void device_set_usb_desc(device_t dev)
#define USB_ST_TRANSFERRED
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define USB_VPI(vend, prod, info)
#define STRUCT_USB_HOST_ID
#define USB_GET_STATE(xfer)