42#include <sys/stdint.h>
43#include <sys/stddef.h>
48#include <sys/kernel.h>
50#include <sys/module.h>
53#include <sys/condvar.h>
54#include <sys/sysctl.h>
56#include <sys/unistd.h>
57#include <sys/callout.h>
58#include <sys/malloc.h>
66#define USB_DEBUG_VAR uvscom_debug
73static int uvscom_debug = 0;
75static SYSCTL_NODE(_hw_usb, OID_AUTO, uvscom, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
78 &uvscom_debug, 0,
"Debug level");
81#define UVSCOM_MODVER 1
83#define UVSCOM_CONFIG_INDEX 0
84#define UVSCOM_IFACE_INDEX 0
87#define UVSCOM_SET_SPEED 0x10
88#define UVSCOM_LINE_CTL 0x11
89#define UVSCOM_SET_PARAM 0x12
90#define UVSCOM_READ_STATUS 0xd0
91#define UVSCOM_SHUTDOWN 0xe0
94#define UVSCOM_SPEED_150BPS 0x00
95#define UVSCOM_SPEED_300BPS 0x01
96#define UVSCOM_SPEED_600BPS 0x02
97#define UVSCOM_SPEED_1200BPS 0x03
98#define UVSCOM_SPEED_2400BPS 0x04
99#define UVSCOM_SPEED_4800BPS 0x05
100#define UVSCOM_SPEED_9600BPS 0x06
101#define UVSCOM_SPEED_19200BPS 0x07
102#define UVSCOM_SPEED_38400BPS 0x08
103#define UVSCOM_SPEED_57600BPS 0x09
104#define UVSCOM_SPEED_115200BPS 0x0a
107#define UVSCOM_BREAK 0x40
108#define UVSCOM_RTS 0x02
109#define UVSCOM_DTR 0x01
110#define UVSCOM_LINE_INIT 0x08
113#define UVSCOM_DATA_MASK 0x03
114#define UVSCOM_DATA_BIT_8 0x03
115#define UVSCOM_DATA_BIT_7 0x02
116#define UVSCOM_DATA_BIT_6 0x01
117#define UVSCOM_DATA_BIT_5 0x00
119#define UVSCOM_STOP_MASK 0x04
120#define UVSCOM_STOP_BIT_2 0x04
121#define UVSCOM_STOP_BIT_1 0x00
123#define UVSCOM_PARITY_MASK 0x18
124#define UVSCOM_PARITY_EVEN 0x18
125#define UVSCOM_PARITY_ODD 0x08
126#define UVSCOM_PARITY_NONE 0x00
129#define UVSCOM_TXRDY 0x04
130#define UVSCOM_RXRDY 0x01
132#define UVSCOM_DCD 0x08
133#define UVSCOM_NOCARD 0x04
134#define UVSCOM_DSR 0x02
135#define UVSCOM_CTS 0x01
136#define UVSCOM_USTAT_MASK (UVSCOM_NOCARD | UVSCOM_DSR | UVSCOM_CTS)
138#define UVSCOM_BULK_BUF_SIZE 1024
200 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
209 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
217 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
243 {
USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS144L4, 0)},
245 {
USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_DS96L, 0)},
247 {
USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_IS96U, 0)},
249 {
USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_PS64P1, 0)},
251 {
USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_VS10U, 0)},
300 mtx_init(&sc->
sc_mtx,
"uvscom", NULL, MTX_DEF);
314 DPRINTF(
"could not allocate all USB transfers!\n");
359 device_claim_softc(
dev);
373 device_free_softc(sc);
504 DPRINTF(
"onoff = %d\n", onoff);
519 DPRINTF(
"onoff = %d\n", onoff);
534 DPRINTF(
"onoff = %d\n", onoff);
547 switch (t->c_ospeed) {
573 switch (t->c_ospeed) {
615 if (t->c_cflag & CSTOPB) {
618 if (t->c_cflag & PARENB) {
619 if (t->c_cflag & PARODD) {
628 switch (t->c_cflag & CSIZE) {
737 &
req, NULL, 0, 1000);
739 DPRINTFN(0,
"device request failed, err=%s "
760 DPRINTFN(0,
"device request failed, err=%s "
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+")
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
struct usb_device * sc_udev
struct usb_xfer * sc_xfer[UVSCOM_N_TRANSFER]
struct ucom_softc sc_ucom
struct ucom_super_softc sc_super_ucom
#define UT_WRITE_VENDOR_DEVICE
#define UT_READ_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)
#define UVSCOM_SPEED_19200BPS
#define UVSCOM_SPEED_600BPS
static void uvscom_start_write(struct ucom_softc *)
static usb_callback_t uvscom_intr_callback
static void uvscom_cfg_set_break(struct ucom_softc *, uint8_t)
static void uvscom_cfg_open(struct ucom_softc *)
#define UVSCOM_BULK_BUF_SIZE
static usb_callback_t uvscom_read_callback
static void uvscom_start_read(struct ucom_softc *)
#define UVSCOM_SPEED_1200BPS
static void uvscom_cfg_param(struct ucom_softc *, struct termios *)
#define UVSCOM_IFACE_INDEX
static void uvscom_free_softc(struct uvscom_softc *)
USB_PNP_HOST_INFO(uvscom_devs)
#define UVSCOM_SPEED_115200BPS
static device_detach_t uvscom_detach
#define UVSCOM_SPEED_4800BPS
static void uvscom_stop_read(struct ucom_softc *)
#define UVSCOM_SPEED_150BPS
static const struct usb_config uvscom_config[UVSCOM_N_TRANSFER]
static const struct ucom_callback uvscom_callback
UCOM_UNLOAD_DRAIN(uvscom)
static void uvscom_cfg_close(struct ucom_softc *)
#define UVSCOM_SPEED_2400BPS
static devclass_t uvscom_devclass
#define UVSCOM_SPEED_300BPS
#define UVSCOM_CONFIG_INDEX
#define UVSCOM_PARITY_NONE
#define UVSCOM_STOP_BIT_2
#define UVSCOM_SPEED_9600BPS
#define UVSCOM_SPEED_57600BPS
#define UVSCOM_PARITY_ODD
MODULE_DEPEND(uvscom, ucom, 1, 1, 1)
#define UVSCOM_SPEED_38400BPS
static usb_callback_t uvscom_write_callback
static int uvscom_pre_param(struct ucom_softc *, struct termios *)
static void uvscom_poll(struct ucom_softc *ucom)
static void uvscom_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *)
#define UVSCOM_DATA_BIT_6
static device_method_t uvscom_methods[]
static int uvscom_pre_open(struct ucom_softc *)
MODULE_VERSION(uvscom, UVSCOM_MODVER)
static void uvscom_cfg_set_dtr(struct ucom_softc *, uint8_t)
static void uvscom_stop_write(struct ucom_softc *)
#define UVSCOM_DATA_BIT_5
static driver_t uvscom_driver
#define UVSCOM_DATA_BIT_8
static device_probe_t uvscom_probe
#define UVSCOM_PARITY_EVEN
static void uvscom_cfg_write(struct uvscom_softc *, uint8_t, uint16_t)
static uint16_t uvscom_cfg_read_status(struct uvscom_softc *)
static device_attach_t uvscom_attach
#define UVSCOM_READ_STATUS
static void uvscom_free(struct ucom_softc *)
static const STRUCT_USB_HOST_ID uvscom_devs[]
DRIVER_MODULE(uvscom, uhub, uvscom_driver, uvscom_devclass, NULL, 0)
#define UVSCOM_DATA_BIT_7
static void uvscom_cfg_set_rts(struct ucom_softc *, uint8_t)