76#define ALIGN(n,align) (((n)+((align)-1)) & ~((align)-1))
78#define usb_dma_alloc(n) (KMALLOC(ALIGN((n),CACHE_ALIGN),BUFF_ALIGN))
79#define usb_dma_free(p) (KFREE(p))
85#define USER_FIFOSIZE 256
101#define PL_SET_REQ 0x21
102#define PL_GET_REQ 0xA1
104#define PL_REQ_SET_LINE_CODING 0x20
105#define PL_REQ_GET_LINE_CODING 0x21
116#define MCT_SET_REQ 0x40
117#define MCT_GET_REQ 0xC0
119#define MCT_REQ_SET_BAUD 0x05
126#define GETDWFIELD(s,f) ((uint32_t)((s)->f##0) | ((uint32_t)((s)->f##1) << 8) | \
127 ((uint32_t)((s)->f##2) << 16) | ((uint32_t)((s)->f##3) << 24))
128#define PUTDWFIELD(s,f,v) (s)->f##0 = (v & 0xFF); \
129 (s)->f##1 = ((v)>>8 & 0xFF); \
130 (s)->f##2 = ((v)>>16 & 0xFF); \
131 (s)->f##3 = ((v)>>24 & 0xFF);
140static int usbserial_detach(
usbdev_t *dev);
143static void usb_uart_probe(cfe_driver_t *drv,
144 unsigned long probe_a,
unsigned long probe_b,
147static int usb_uart_open(cfe_devctx_t *ctx);
148static int usb_uart_read(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
149static int usb_uart_inpstat(cfe_devctx_t *ctx,iocb_inpstat_t *inpstat);
150static int usb_uart_write(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
151static int usb_uart_ioctl(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
152static int usb_uart_close(cfe_devctx_t *ctx);
154const static cfe_devdisp_t usb_uart_dispatch = {
165const cfe_driver_t usb_uart = {
173typedef struct usb_uart_s {
176 int uart_flowcontrol;
179#define USBUART_MAXUNITS 4
180static usbdev_t *usbuart_units[USBUART_MAXUNITS];
287 hs_memcpy_from_hs(bptr,buffer,len);
314static int usbserial_int_callback(
usbreq_t *ur)
348static int usbserial_rx_callback(
usbreq_t *ur)
437 if (ifdscr ==
NULL) {
438 printf(
"Could not get interface descriptor\n");
468 if (!indscr || !outdscr) {
469 printf(
"IN or OUT endpoint descriptors are missing\n");
497 for (idx = 0; idx < USBUART_MAXUNITS; idx++) {
498 if (usbuart_units[idx] ==
NULL) {
500 usbuart_units[idx] = dev;
531 usbserial_set_linedata(dev,ldata);
580static int usbserial_detach(
usbdev_t *dev)
604static void usb_uart_probe(cfe_driver_t *drv,
605 unsigned long probe_a,
unsigned long probe_b,
611 softc = (usb_uart_t *)
KMALLOC(
sizeof(usb_uart_t),0);
612 memset(softc,0,
sizeof(usb_uart_t));
613 softc->uart_unit = (int)probe_a;
615 xsprintf(descr,
"USB UART unit %d",(
int)probe_a);
616 cfe_attach(drv,softc,
NULL,descr);
620static int usb_uart_open(cfe_devctx_t *ctx)
625static int usb_uart_read(cfe_devctx_t *ctx, iocb_buffer_t *buffer)
627 usb_uart_t *softc = ctx->dev_softc;
628 usbdev_t *dev = usbuart_units[softc->uart_unit];
634 buffer->buf_retlen = 0;
639 bptr = buffer->buf_ptr;
640 blen = buffer->buf_length;
649 buffer->buf_retlen = buffer->buf_length - blen;
653static int usb_uart_inpstat(cfe_devctx_t *ctx, iocb_inpstat_t *inpstat)
655 usb_uart_t *softc = ctx->dev_softc;
656 usbdev_t *dev = usbuart_units[softc->uart_unit];
659 inpstat->inp_status = 0;
669static int usb_uart_write(cfe_devctx_t *ctx, iocb_buffer_t *buffer)
671 usb_uart_t *softc = ctx->dev_softc;
674 usbdev_t *dev = usbuart_units[softc->uart_unit];
677 bptr = buffer->buf_ptr;
678 blen = buffer->buf_length;
681 buffer->buf_retlen = blen;
688 usbserial_tx_data(dev,bptr,blen);
690 buffer->buf_retlen = blen;
694static int usb_uart_ioctl(cfe_devctx_t *ctx, iocb_buffer_t *buffer)
696 usb_uart_t *softc = ctx->dev_softc;
697 usbdev_t *dev = usbuart_units[softc->uart_unit];
702 switch ((
int)buffer->buf_ioctlcmd) {
703 case IOCTL_SERIAL_GETSPEED:
704 info = softc->uart_speed;
705 hs_memcpy_to_hs(buffer->buf_ptr,&info,
sizeof(info));
707 case IOCTL_SERIAL_SETSPEED:
708 hs_memcpy_from_hs(&info,buffer->buf_ptr,
sizeof(info));
709 softc->uart_speed = info;
712 case IOCTL_SERIAL_GETFLOW:
713 info = softc->uart_flowcontrol;
714 hs_memcpy_to_hs(buffer->buf_ptr,&info,
sizeof(info));
716 case IOCTL_SERIAL_SETFLOW:
717 hs_memcpy_from_hs(&info,buffer->buf_ptr,
sizeof(info));
718 softc->uart_flowcontrol = info;
728static int usb_uart_close(cfe_devctx_t *ctx)
#define console_log(fmt, x...)
#define KMALLOC(size, align)
uint8_t bConfigurationValue
usb_config_descr_t * ud_cfgdescr
usb_device_descr_t ud_devdescr
int(* ur_callback)(struct usbreq_s *req)
uint8_t bLineDataStopBits
uint8_t user_inbuf[USER_FIFOSIZE]
enum usbserial_softc_s::@13 dev_type
usbser_linedata_t user_linedata
#define GETUSBFIELD(s, f)
#define USB_ENDPOINT_TYPE_INTERRUPT
#define USB_ENDPOINT_DESCRIPTOR_TYPE
#define USB_ENDPOINT_DIR_OUT(addr)
#define USB_ENDPOINT_TYPE_MASK
#define USB_INTERFACE_DESCRIPTOR_TYPE
void * usb_find_cfg_descr(usbdev_t *dev, int dtype, int idx)
int usb_simple_request(usbdev_t *dev, uint8_t reqtype, int bRequest, int wValue, int wIndex)
int usb_std_request(usbdev_t *dev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *buffer, int length)
int usb_sync_request(usbreq_t *ur)
usbreq_t * usb_make_request(usbdev_t *dev, int epaddr, uint8_t *buf, int length, int flags)
void usb_free_request(usbreq_t *ur)
int usb_queue_request(usbreq_t *ur)
int usb_set_configuration(usbdev_t *dev, int config)
int usb_open_pipe(usbdev_t *dev, usb_endpoint_descr_t *epdesc)
#define UR_ERR_DEVICENOTRESPONDING
#define PL_REQ_GET_LINE_CODING
struct usbserial_softc_s usbserial_softc_t
#define PUTDWFIELD(s, f, v)
struct usbser_bauddata_s usbser_bauddata_t
struct usbser_linedata_s usbser_linedata_t
usb_driver_t usbserial_driver
#define PL_REQ_SET_LINE_CODING