linux/drivers/usb/serial/usb_debug.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * USB Debug cable driver
   4 *
   5 * Copyright (C) 2006 Greg Kroah-Hartman <greg@kroah.com>
   6 */
   7
   8#include <linux/gfp.h>
   9#include <linux/kernel.h>
  10#include <linux/tty.h>
  11#include <linux/module.h>
  12#include <linux/usb.h>
  13#include <linux/usb/serial.h>
  14
  15#define USB_DEBUG_MAX_PACKET_SIZE       8
  16#define USB_DEBUG_BRK_SIZE              8
  17static const char USB_DEBUG_BRK[USB_DEBUG_BRK_SIZE] = {
  18        0x00,
  19        0xff,
  20        0x01,
  21        0xfe,
  22        0x00,
  23        0xfe,
  24        0x01,
  25        0xff,
  26};
  27
  28static const struct usb_device_id id_table[] = {
  29        { USB_DEVICE(0x0525, 0x127a) },
  30        { },
  31};
  32
  33static const struct usb_device_id dbc_id_table[] = {
  34        { USB_DEVICE(0x1d6b, 0x0010) },
  35        { USB_DEVICE(0x1d6b, 0x0011) },
  36        { },
  37};
  38
  39static const struct usb_device_id id_table_combined[] = {
  40        { USB_DEVICE(0x0525, 0x127a) },
  41        { USB_DEVICE(0x1d6b, 0x0010) },
  42        { USB_DEVICE(0x1d6b, 0x0011) },
  43        { },
  44};
  45MODULE_DEVICE_TABLE(usb, id_table_combined);
  46
  47/* This HW really does not support a serial break, so one will be
  48 * emulated when ever the break state is set to true.
  49 */
  50static void usb_debug_break_ctl(struct tty_struct *tty, int break_state)
  51{
  52        struct usb_serial_port *port = tty->driver_data;
  53        if (!break_state)
  54                return;
  55        usb_serial_generic_write(tty, port, USB_DEBUG_BRK, USB_DEBUG_BRK_SIZE);
  56}
  57
  58static void usb_debug_process_read_urb(struct urb *urb)
  59{
  60        struct usb_serial_port *port = urb->context;
  61
  62        if (urb->actual_length == USB_DEBUG_BRK_SIZE &&
  63                memcmp(urb->transfer_buffer, USB_DEBUG_BRK,
  64                                                USB_DEBUG_BRK_SIZE) == 0) {
  65                usb_serial_handle_break(port);
  66                return;
  67        }
  68
  69        usb_serial_generic_process_read_urb(urb);
  70}
  71
  72static struct usb_serial_driver debug_device = {
  73        .driver = {
  74                .owner =        THIS_MODULE,
  75                .name =         "debug",
  76        },
  77        .id_table =             id_table,
  78        .num_ports =            1,
  79        .bulk_out_size =        USB_DEBUG_MAX_PACKET_SIZE,
  80        .break_ctl =            usb_debug_break_ctl,
  81        .process_read_urb =     usb_debug_process_read_urb,
  82};
  83
  84static struct usb_serial_driver dbc_device = {
  85        .driver = {
  86                .owner =        THIS_MODULE,
  87                .name =         "xhci_dbc",
  88        },
  89        .id_table =             dbc_id_table,
  90        .num_ports =            1,
  91        .break_ctl =            usb_debug_break_ctl,
  92        .process_read_urb =     usb_debug_process_read_urb,
  93};
  94
  95static struct usb_serial_driver * const serial_drivers[] = {
  96        &debug_device, &dbc_device, NULL
  97};
  98
  99module_usb_serial_driver(serial_drivers, id_table_combined);
 100MODULE_LICENSE("GPL v2");
 101