39#include <sys/stdint.h>
40#include <sys/stddef.h>
45#include <sys/kernel.h>
47#include <sys/module.h>
50#include <sys/condvar.h>
51#include <sys/sysctl.h>
53#include <sys/unistd.h>
54#include <sys/callout.h>
55#include <sys/malloc.h>
58#include <dev/hid/hid.h>
66#define USB_DEBUG_VAR usb_debug
72#define UCYCOM_MAX_IOLEN (1024 + 2)
74#define UCYCOM_IFACE_INDEX 0
91#define MODEL_CY7C63743 0x63743
92#define MODEL_CY7C64013 0x64013
102#define UCYCOM_CFG_RESET 0x80
103#define UCYCOM_CFG_PARODD 0x20
104#define UCYCOM_CFG_PAREN 0x10
105#define UCYCOM_CFG_STOPB 0x08
106#define UCYCOM_CFG_DATAB 0x03
147 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
194#define UCYCOM_DEFAULT_RATE 4800
195#define UCYCOM_DEFAULT_CFG 0x03
219 void *urd_ptr = NULL;
227 mtx_init(&sc->
sc_mtx,
"ucycom", NULL, MTX_DEF);
235 device_printf(
dev,
"unsupported device\n");
238 device_printf(
dev,
"Cypress CY7C%X USB to RS232 bridge\n", sc->
sc_model);
243 &urd_ptr, &urd_len, M_USBDEV,
247 device_printf(
dev,
"failed to get report "
254 sc->
sc_flen = hid_report_size_max(urd_ptr, urd_len, hid_feature, &sc->
sc_fid);
255 sc->
sc_ilen = hid_report_size_max(urd_ptr, urd_len, hid_input, &sc->
sc_iid);
256 sc->
sc_olen = hid_report_size_max(urd_ptr, urd_len, hid_output, &sc->
sc_oid);
261 device_printf(
dev,
"invalid report size i=%d, o=%d, f=%d, max=%d\n",
273 device_printf(
dev,
"allocating USB "
274 "transfers failed\n");
285 free(urd_ptr, M_USBDEV);
292 free(urd_ptr, M_USBDEV);
306 device_claim_softc(
dev);
320 device_free_softc(sc);
471 DPRINTFN(0,
"device request failed, err=%s "
479 switch (t->c_ospeed) {
512 if (t->c_cflag & CIGNORE) {
516 switch (t->c_cflag & CSIZE) {
528 if (t->c_cflag & CSTOPB)
530 if (t->c_cflag & PARENB)
532 if (t->c_cflag & PARODD)
561 sc->
sc_ist = buf[0] & ~0x07;
575 sc->
sc_ist = buf[0] & ~0x07;
584 DPRINTFN(0,
"unsupported model number\n");
void(* ucom_cfg_param)(struct ucom_softc *, struct termios *)
struct ucom_super_softc sc_super_ucom
struct usb_device * sc_udev
struct usb_xfer * sc_xfer[UCYCOM_N_TRANSFER]
struct ucom_softc sc_ucom
enum usb_hc_mode usb_mode
struct usbd_lookup_info info
struct usb_device * device
static driver_t ucycom_driver
static device_detach_t ucycom_detach
static device_method_t ucycom_methods[]
static const struct usb_config ucycom_config[UCYCOM_N_TRANSFER]
DRIVER_MODULE(ucycom, uhub, ucycom_driver, ucycom_devclass, NULL, 0)
static void ucycom_cfg_open(struct ucom_softc *)
static void ucycom_start_write(struct ucom_softc *)
UCOM_UNLOAD_DRAIN(ucycom)
MODULE_DEPEND(ucycom, ucom, 1, 1, 1)
static device_attach_t ucycom_attach
static usb_callback_t ucycom_intr_read_callback
static void ucycom_free(struct ucom_softc *)
#define UCYCOM_CFG_PARODD
static devclass_t ucycom_devclass
#define UCYCOM_IFACE_INDEX
static void ucycom_stop_write(struct ucom_softc *)
USB_PNP_HOST_INFO(ucycom_devs)
static void ucycom_cfg_param(struct ucom_softc *, struct termios *)
#define UCYCOM_DEFAULT_RATE
MODULE_VERSION(ucycom, 1)
static const struct ucom_callback ucycom_callback
static const STRUCT_USB_HOST_ID ucycom_devs[]
static device_probe_t ucycom_probe
static void ucycom_start_read(struct ucom_softc *)
static void ucycom_cfg_write(struct ucycom_softc *, uint32_t, uint8_t)
#define UCYCOM_DEFAULT_CFG
static void ucycom_free_softc(struct ucycom_softc *)
static int ucycom_pre_param(struct ucom_softc *, struct termios *)
static void ucycom_poll(struct ucom_softc *ucom)
static usb_callback_t ucycom_ctrl_write_callback
static void ucycom_stop_read(struct ucom_softc *)
#define UT_WRITE_CLASS_INTERFACE
void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len)
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset, void *ptr, usb_frlength_t len)
#define USETW2(w, b1, b0)
const char * usbd_errstr(usb_error_t err)
usb_error_t usbd_req_get_hid_desc(struct usb_device *udev, struct mtx *mtx, void **descp, uint16_t *sizep, struct malloc_type *mem, uint8_t iface_index)
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)
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_xfer_set_frames(struct usb_xfer *xfer, usb_frcount_t n)
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)
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_DRIVER_INFO(did)
#define USB_GET_STATE(xfer)
#define UHID_FEATURE_REPORT
#define UHID_OUTPUT_REPORT