FreeBSD kernel usb device Code
uftdi.c File Reference
#include <sys/cdefs.h>
#include <sys/stdint.h>
#include <sys/stddef.h>
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/module.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/condvar.h>
#include <sys/sysctl.h>
#include <sys/sx.h>
#include <sys/unistd.h>
#include <sys/callout.h>
#include <sys/malloc.h>
#include <sys/priv.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include <dev/usb/usb_core.h>
#include <dev/usb/usb_ioctl.h>
#include "usbdevs.h"
#include <dev/usb/usb_debug.h>
#include <dev/usb/usb_process.h>
#include <dev/usb/serial/usb_serial.h>
#include <dev/usb/serial/uftdi_reg.h>
#include <dev/usb/uftdiio.h>
Include dependency graph for uftdi.c:

Go to the source code of this file.

Data Structures

struct  uftdi_softc
 
struct  uftdi_param_config
 
struct  jtag_by_name
 

Macros

#define USB_DEBUG_VAR   uftdi_debug
 
#define UFTDI_CONFIG_INDEX   0
 
#define UFTDI_IBUFSIZE   2048
 
#define UFTDI_IHDRSIZE   2
 
#define UFTDI_OBUFSIZE   2048
 
#define UFTDI_OPKTSIZE   64
 
#define DEVF_BAUDBITS_HINDEX   0x01 /* Baud bits in high byte of index. */
 
#define DEVF_BAUDCLK_12M   0X02 /* Base baud clock is 12MHz. */
 
#define UFTDI_DEV(v, p, i)    { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
 

Enumerations

enum  { UFTDI_BULK_DT_WR , UFTDI_BULK_DT_RD , UFTDI_N_TRANSFER }
 
enum  {
  DEVT_SIO , DEVT_232A , DEVT_232B , DEVT_2232D ,
  DEVT_232R , DEVT_2232H , DEVT_4232H , DEVT_232H ,
  DEVT_230X
}
 

Functions

 __FBSDID ("$FreeBSD$")
 
static SYSCTL_NODE (_hw_usb, OID_AUTO, uftdi, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB uftdi")
 
static void uftdi_free_softc (struct uftdi_softc *)
 
static void uftdi_free (struct ucom_softc *)
 
static void uftdi_cfg_open (struct ucom_softc *)
 
static void uftdi_cfg_close (struct ucom_softc *)
 
static void uftdi_cfg_set_dtr (struct ucom_softc *, uint8_t)
 
static void uftdi_cfg_set_rts (struct ucom_softc *, uint8_t)
 
static void uftdi_cfg_set_break (struct ucom_softc *, uint8_t)
 
static int uftdi_set_parm_soft (struct ucom_softc *, struct termios *, struct uftdi_param_config *)
 
static int uftdi_pre_param (struct ucom_softc *, struct termios *)
 
static void uftdi_cfg_param (struct ucom_softc *, struct termios *)
 
static void uftdi_cfg_get_status (struct ucom_softc *, uint8_t *, uint8_t *)
 
static int uftdi_reset (struct ucom_softc *, int)
 
static int uftdi_set_bitmode (struct ucom_softc *, uint8_t, uint8_t)
 
static int uftdi_get_bitmode (struct ucom_softc *, uint8_t *, uint8_t *)
 
static int uftdi_set_latency (struct ucom_softc *, int)
 
static int uftdi_get_latency (struct ucom_softc *, int *)
 
static int uftdi_set_event_char (struct ucom_softc *, int)
 
static int uftdi_set_error_char (struct ucom_softc *, int)
 
static int uftdi_ioctl (struct ucom_softc *, uint32_t, caddr_t, int, struct thread *)
 
static void uftdi_start_read (struct ucom_softc *)
 
static void uftdi_stop_read (struct ucom_softc *)
 
static void uftdi_start_write (struct ucom_softc *)
 
static void uftdi_stop_write (struct ucom_softc *)
 
static void uftdi_poll (struct ucom_softc *ucom)
 
 DRIVER_MODULE (uftdi, uhub, uftdi_driver, uftdi_devclass, NULL, NULL)
 
 MODULE_DEPEND (uftdi, ucom, 1, 1, 1)
 
 MODULE_DEPEND (uftdi, usb, 1, 1, 1)
 
 MODULE_VERSION (uftdi, 1)
 
 USB_PNP_HOST_INFO (uftdi_devs)
 
 SYSCTL_INT (_hw_usb_uftdi, OID_AUTO, skip_jtag_interfaces, CTLFLAG_RWTUN, &skip_jtag_interfaces, 1, "Skip creating tty devices for jtag interfaces")
 
static boolean_t is_jtag_interface (struct usb_attach_arg *uaa, const struct usb_device_id *id)
 
static void uftdi_devtype_setup (struct uftdi_softc *sc, struct usb_attach_arg *uaa)
 
static int uftdi_probe (device_t dev)
 
static int uftdi_attach (device_t dev)
 
static int uftdi_detach (device_t dev)
 
 UCOM_UNLOAD_DRAIN (uftdi)
 
static void uftdi_write_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void uftdi_read_callback (struct usb_xfer *xfer, usb_error_t error)
 
static boolean_t uftdi_baud_within_tolerance (uint64_t speed, uint64_t target)
 
static int uftdi_sio_encode_baudrate (struct uftdi_softc *sc, speed_t speed, struct uftdi_param_config *cfg)
 
static int uftdi_encode_baudrate (struct uftdi_softc *sc, speed_t speed, struct uftdi_param_config *cfg)
 
static int uftdi_read_eeprom (struct ucom_softc *ucom, struct uftdi_eeio *eeio)
 
static int uftdi_write_eeprom (struct ucom_softc *ucom, struct uftdi_eeio *eeio)
 
static int uftdi_erase_eeprom (struct ucom_softc *ucom, int confirmation)
 

Variables

static device_probe_t uftdi_probe
 
static device_attach_t uftdi_attach
 
static device_detach_t uftdi_detach
 
static usb_callback_t uftdi_write_callback
 
static usb_callback_t uftdi_read_callback
 
static const struct usb_config uftdi_config [UFTDI_N_TRANSFER]
 
static const struct ucom_callback uftdi_callback
 
static device_method_t uftdi_methods []
 
static devclass_t uftdi_devclass
 
static driver_t uftdi_driver
 
static const STRUCT_USB_HOST_ID uftdi_devs []
 
static const struct jtag_by_name jtag_products_by_name []
 
static int skip_jtag_interfaces = 1
 

Macro Definition Documentation

◆ DEVF_BAUDBITS_HINDEX

#define DEVF_BAUDBITS_HINDEX   0x01 /* Baud bits in high byte of index. */

Definition at line 145 of file uftdi.c.

◆ DEVF_BAUDCLK_12M

#define DEVF_BAUDCLK_12M   0X02 /* Base baud clock is 12MHz. */

Definition at line 146 of file uftdi.c.

◆ UFTDI_CONFIG_INDEX

#define UFTDI_CONFIG_INDEX   0

Definition at line 96 of file uftdi.c.

◆ UFTDI_DEV

#define UFTDI_DEV (   v,
  p,
 
)     { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }

◆ UFTDI_IBUFSIZE

#define UFTDI_IBUFSIZE   2048

Definition at line 122 of file uftdi.c.

◆ UFTDI_IHDRSIZE

#define UFTDI_IHDRSIZE   2

Definition at line 123 of file uftdi.c.

◆ UFTDI_OBUFSIZE

#define UFTDI_OBUFSIZE   2048

Definition at line 124 of file uftdi.c.

◆ UFTDI_OPKTSIZE

#define UFTDI_OPKTSIZE   64

Definition at line 125 of file uftdi.c.

◆ USB_DEBUG_VAR

#define USB_DEBUG_VAR   uftdi_debug

Definition at line 79 of file uftdi.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
UFTDI_BULK_DT_WR 
UFTDI_BULK_DT_RD 
UFTDI_N_TRANSFER 

Definition at line 127 of file uftdi.c.

◆ anonymous enum

anonymous enum
Enumerator
DEVT_SIO 
DEVT_232A 
DEVT_232B 
DEVT_2232D 
DEVT_232R 
DEVT_2232H 
DEVT_4232H 
DEVT_232H 
DEVT_230X 

Definition at line 133 of file uftdi.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ DRIVER_MODULE()

DRIVER_MODULE ( uftdi  ,
uhub  ,
uftdi_driver  ,
uftdi_devclass  ,
NULL  ,
NULL   
)

◆ is_jtag_interface()

static boolean_t is_jtag_interface ( struct usb_attach_arg uaa,
const struct usb_device_id id 
)
static

◆ MODULE_DEPEND() [1/2]

MODULE_DEPEND ( uftdi  ,
ucom  ,
,
,
 
)

◆ MODULE_DEPEND() [2/2]

MODULE_DEPEND ( uftdi  ,
usb  ,
,
,
 
)

◆ MODULE_VERSION()

MODULE_VERSION ( uftdi  ,
 
)

◆ SYSCTL_INT()

SYSCTL_INT ( _hw_usb_uftdi  ,
OID_AUTO  ,
skip_jtag_interfaces  ,
CTLFLAG_RWTUN  ,
skip_jtag_interfaces,
,
"Skip creating tty devices for jtag interfaces"   
)

◆ SYSCTL_NODE()

static SYSCTL_NODE ( _hw_usb  ,
OID_AUTO  ,
uftdi  ,
CTLFLAG_RW|  CTLFLAG_MPSAFE,
,
"USB uftdi"   
)
static

◆ UCOM_UNLOAD_DRAIN()

UCOM_UNLOAD_DRAIN ( uftdi  )

◆ uftdi_attach()

◆ uftdi_baud_within_tolerance()

static boolean_t uftdi_baud_within_tolerance ( uint64_t  speed,
uint64_t  target 
)
inlinestatic

Definition at line 1429 of file uftdi.c.

Referenced by uftdi_encode_baudrate().

Here is the caller graph for this function:

◆ uftdi_cfg_close()

static void uftdi_cfg_close ( struct ucom_softc ucom)
static

Definition at line 1193 of file uftdi.c.

References DPRINTF.

◆ uftdi_cfg_get_status()

static void uftdi_cfg_get_status ( struct ucom_softc ucom,
uint8_t *  lsr,
uint8_t *  msr 
)
static

Definition at line 1678 of file uftdi.c.

References uftdi_softc::sc_lsr, uftdi_softc::sc_msr, and ucom_softc::sc_parent.

◆ uftdi_cfg_open()

static void uftdi_cfg_open ( struct ucom_softc ucom)
static

Definition at line 1181 of file uftdi.c.

References DPRINTF.

◆ uftdi_cfg_param()

◆ uftdi_cfg_set_break()

◆ uftdi_cfg_set_dtr()

◆ uftdi_cfg_set_rts()

◆ uftdi_detach()

static int uftdi_detach ( device_t  dev)
static

Definition at line 1149 of file uftdi.c.

References dev, uftdi_softc::sc_super_ucom, uftdi_softc::sc_ucom, uftdi_softc::sc_xfer, ucom_detach(), uftdi_free_softc(), UFTDI_N_TRANSFER, and usbd_transfer_unsetup().

Here is the call graph for this function:

◆ uftdi_devtype_setup()

◆ uftdi_encode_baudrate()

static int uftdi_encode_baudrate ( struct uftdi_softc sc,
speed_t  speed,
struct uftdi_param_config cfg 
)
static

Definition at line 1459 of file uftdi.c.

References uftdi_param_config::baud_hibits, uftdi_param_config::baud_lobits, DEVF_BAUDBITS_HINDEX, DEVF_BAUDCLK_12M, DEVT_232A, uftdi_softc::sc_devflags, uftdi_softc::sc_devtype, and uftdi_baud_within_tolerance().

Referenced by uftdi_set_parm_soft().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ uftdi_erase_eeprom()

static int uftdi_erase_eeprom ( struct ucom_softc ucom,
int  confirmation 
)
static

Definition at line 1898 of file uftdi.c.

References FTDI_SIO_ERASE_EEPROM, req, uftdi_softc::sc_mtx, ucom_softc::sc_parent, uftdi_softc::sc_udev, UFTDI_CONFIRM_ERASE, usbd_do_request, USETW, and UT_WRITE_VENDOR_DEVICE.

Referenced by uftdi_ioctl().

Here is the caller graph for this function:

◆ uftdi_free()

static void uftdi_free ( struct ucom_softc ucom)
static

Definition at line 1175 of file uftdi.c.

References ucom_softc::sc_parent, and uftdi_free_softc().

Here is the call graph for this function:

◆ uftdi_free_softc()

static void uftdi_free_softc ( struct uftdi_softc sc)
static

Definition at line 1166 of file uftdi.c.

References uftdi_softc::sc_mtx, uftdi_softc::sc_super_ucom, and ucom_unref().

Referenced by uftdi_detach(), and uftdi_free().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ uftdi_get_bitmode()

static int uftdi_get_bitmode ( struct ucom_softc ucom,
uint8_t *  bitmode,
uint8_t *  iomask 
)
static

◆ uftdi_get_latency()

static int uftdi_get_latency ( struct ucom_softc ucom,
int *  latency 
)
static

Definition at line 1774 of file uftdi.c.

References FTDI_SIO_GET_LATENCY, req, uftdi_softc::sc_mtx, ucom_softc::sc_parent, ucom_softc::sc_portno, uftdi_softc::sc_ucom, uftdi_softc::sc_udev, usbd_do_request, USETW, and UT_READ_VENDOR_DEVICE.

Referenced by uftdi_ioctl().

Here is the caller graph for this function:

◆ uftdi_ioctl()

◆ uftdi_poll()

static void uftdi_poll ( struct ucom_softc ucom)
static

Definition at line 2011 of file uftdi.c.

References ucom_softc::sc_parent, uftdi_softc::sc_xfer, UFTDI_N_TRANSFER, and usbd_transfer_poll().

Here is the call graph for this function:

◆ uftdi_pre_param()

static int uftdi_pre_param ( struct ucom_softc ucom,
struct termios *  t 
)
static

Definition at line 1627 of file uftdi.c.

References DPRINTF, and uftdi_set_parm_soft().

Here is the call graph for this function:

◆ uftdi_probe()

◆ uftdi_read_callback()

◆ uftdi_read_eeprom()

static int uftdi_read_eeprom ( struct ucom_softc ucom,
struct uftdi_eeio eeio 
)
static

◆ uftdi_reset()

static int uftdi_reset ( struct ucom_softc ucom,
int  reset_type 
)
static

Definition at line 1689 of file uftdi.c.

References FTDI_SIO_RESET, req, uftdi_softc::sc_mtx, ucom_softc::sc_parent, ucom_softc::sc_portno, uftdi_softc::sc_ucom, uftdi_softc::sc_udev, usbd_do_request, USETW, and UT_WRITE_VENDOR_DEVICE.

Referenced by uftdi_ioctl().

Here is the caller graph for this function:

◆ uftdi_set_bitmode()

static int uftdi_set_bitmode ( struct ucom_softc ucom,
uint8_t  bitmode,
uint8_t  iomask 
)
static

◆ uftdi_set_error_char()

static int uftdi_set_error_char ( struct ucom_softc ucom,
int  echar 
)
static

◆ uftdi_set_event_char()

static int uftdi_set_event_char ( struct ucom_softc ucom,
int  echar 
)
static

◆ uftdi_set_latency()

static int uftdi_set_latency ( struct ucom_softc ucom,
int  latency 
)
static

◆ uftdi_set_parm_soft()

◆ uftdi_sio_encode_baudrate()

static int uftdi_sio_encode_baudrate ( struct uftdi_softc sc,
speed_t  speed,
struct uftdi_param_config cfg 
)
static

Definition at line 1436 of file uftdi.c.

References uftdi_param_config::baud_hibits, and uftdi_param_config::baud_lobits.

Referenced by uftdi_set_parm_soft().

Here is the caller graph for this function:

◆ uftdi_start_read()

static void uftdi_start_read ( struct ucom_softc ucom)
static

Definition at line 1979 of file uftdi.c.

References ucom_softc::sc_parent, uftdi_softc::sc_xfer, UFTDI_BULK_DT_RD, and usbd_transfer_start().

Here is the call graph for this function:

◆ uftdi_start_write()

static void uftdi_start_write ( struct ucom_softc ucom)
static

Definition at line 1995 of file uftdi.c.

References ucom_softc::sc_parent, uftdi_softc::sc_xfer, UFTDI_BULK_DT_WR, and usbd_transfer_start().

Here is the call graph for this function:

◆ uftdi_stop_read()

static void uftdi_stop_read ( struct ucom_softc ucom)
static

Definition at line 1987 of file uftdi.c.

References ucom_softc::sc_parent, uftdi_softc::sc_xfer, UFTDI_BULK_DT_RD, and usbd_transfer_stop().

Here is the call graph for this function:

◆ uftdi_stop_write()

static void uftdi_stop_write ( struct ucom_softc ucom)
static

Definition at line 2003 of file uftdi.c.

References ucom_softc::sc_parent, uftdi_softc::sc_xfer, UFTDI_BULK_DT_WR, and usbd_transfer_stop().

Here is the call graph for this function:

◆ uftdi_write_callback()

◆ uftdi_write_eeprom()

static int uftdi_write_eeprom ( struct ucom_softc ucom,
struct uftdi_eeio eeio 
)
static

◆ USB_PNP_HOST_INFO()

USB_PNP_HOST_INFO ( uftdi_devs  )

Variable Documentation

◆ jtag_products_by_name

const struct jtag_by_name jtag_products_by_name[]
static
Initial value:
= {
{"XDS100V", UFTDI_JTAG_IFACE(0)},
}
#define UFTDI_JTAG_IFACE(i)
Definition: uftdi_reg.h:44

Referenced by is_jtag_interface().

◆ skip_jtag_interfaces

int skip_jtag_interfaces = 1
static

Definition at line 944 of file uftdi.c.

Referenced by uftdi_probe().

◆ uftdi_attach

device_attach_t uftdi_attach
static

Definition at line 182 of file uftdi.c.

◆ uftdi_callback

const struct ucom_callback uftdi_callback
static
Initial value:
= {
.ucom_cfg_get_status = &uftdi_cfg_get_status,
.ucom_cfg_set_dtr = &uftdi_cfg_set_dtr,
.ucom_cfg_set_rts = &uftdi_cfg_set_rts,
.ucom_cfg_set_break = &uftdi_cfg_set_break,
.ucom_cfg_param = &uftdi_cfg_param,
.ucom_cfg_open = &uftdi_cfg_open,
.ucom_cfg_close = &uftdi_cfg_close,
.ucom_pre_param = &uftdi_pre_param,
.ucom_ioctl = &uftdi_ioctl,
.ucom_start_read = &uftdi_start_read,
.ucom_stop_read = &uftdi_stop_read,
.ucom_start_write = &uftdi_start_write,
.ucom_stop_write = &uftdi_stop_write,
.ucom_poll = &uftdi_poll,
.ucom_free = &uftdi_free,
}
static int uftdi_pre_param(struct ucom_softc *, struct termios *)
Definition: uftdi.c:1627
static void uftdi_cfg_param(struct ucom_softc *, struct termios *)
Definition: uftdi.c:1637
static int uftdi_ioctl(struct ucom_softc *, uint32_t, caddr_t, int, struct thread *)
Definition: uftdi.c:1921
static void uftdi_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *)
Definition: uftdi.c:1678
static void uftdi_start_write(struct ucom_softc *)
Definition: uftdi.c:1995
static void uftdi_cfg_open(struct ucom_softc *)
Definition: uftdi.c:1181
static void uftdi_cfg_close(struct ucom_softc *)
Definition: uftdi.c:1193
static void uftdi_poll(struct ucom_softc *ucom)
Definition: uftdi.c:2011
static void uftdi_start_read(struct ucom_softc *)
Definition: uftdi.c:1979
static void uftdi_cfg_set_rts(struct ucom_softc *, uint8_t)
Definition: uftdi.c:1377
static void uftdi_cfg_set_break(struct ucom_softc *, uint8_t)
Definition: uftdi.c:1398
static void uftdi_cfg_set_dtr(struct ucom_softc *, uint8_t)
Definition: uftdi.c:1356
static void uftdi_stop_read(struct ucom_softc *)
Definition: uftdi.c:1987
static void uftdi_free(struct ucom_softc *)
Definition: uftdi.c:1175
static void uftdi_stop_write(struct ucom_softc *)
Definition: uftdi.c:2003

Definition at line 236 of file uftdi.c.

Referenced by uftdi_attach().

◆ uftdi_config

const struct usb_config uftdi_config[UFTDI_N_TRANSFER]
static
Initial value:
= {
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
.bufsize = UFTDI_OBUFSIZE,
.flags = {.pipe_bof = 1,},
.callback = &uftdi_write_callback,
},
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.bufsize = UFTDI_IBUFSIZE,
.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
.callback = &uftdi_read_callback,
},
}
#define UFTDI_OBUFSIZE
Definition: uftdi.c:124
@ UFTDI_BULK_DT_RD
Definition: uftdi.c:129
@ UFTDI_BULK_DT_WR
Definition: uftdi.c:128
static usb_callback_t uftdi_read_callback
Definition: uftdi.c:187
static usb_callback_t uftdi_write_callback
Definition: uftdi.c:186
#define UFTDI_IBUFSIZE
Definition: uftdi.c:122
#define UE_ADDR_ANY
Definition: usb.h:537
#define UE_BULK
Definition: usb.h:543
#define UE_DIR_IN
Definition: usb.h:531
#define UE_DIR_OUT
Definition: usb.h:532

Definition at line 216 of file uftdi.c.

Referenced by uftdi_attach().

◆ uftdi_detach

device_detach_t uftdi_detach
static

Definition at line 183 of file uftdi.c.

Referenced by uftdi_attach().

◆ uftdi_devclass

devclass_t uftdi_devclass
static

Definition at line 262 of file uftdi.c.

◆ uftdi_devs

const STRUCT_USB_HOST_ID uftdi_devs[]
static

Definition at line 270 of file uftdi.c.

Referenced by uftdi_probe().

◆ uftdi_driver

driver_t uftdi_driver
static
Initial value:
= {
.name = "uftdi",
.methods = uftdi_methods,
.size = sizeof(struct uftdi_softc),
}
static device_method_t uftdi_methods[]
Definition: uftdi.c:254

Definition at line 264 of file uftdi.c.

◆ uftdi_methods

device_method_t uftdi_methods[]
static
Initial value:
= {
DEVMETHOD(device_probe, uftdi_probe),
DEVMETHOD(device_attach, uftdi_attach),
DEVMETHOD(device_detach, uftdi_detach),
DEVMETHOD_END
}
static device_detach_t uftdi_detach
Definition: uftdi.c:183
static device_attach_t uftdi_attach
Definition: uftdi.c:182
static device_probe_t uftdi_probe
Definition: uftdi.c:181

Definition at line 254 of file uftdi.c.

◆ uftdi_probe

device_probe_t uftdi_probe
static

Definition at line 181 of file uftdi.c.

◆ uftdi_read_callback

usb_callback_t uftdi_read_callback
static

Definition at line 187 of file uftdi.c.

◆ uftdi_write_callback

usb_callback_t uftdi_write_callback
static

Definition at line 186 of file uftdi.c.