Delete unused file.
This commit is contained in:
@@ -1,453 +0,0 @@
|
||||
/*
|
||||
* Console driver via USB.
|
||||
*
|
||||
* Copyright (C) 2011 Serge Vakulenko, <serge@vak.ru>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software
|
||||
* and its documentation for any purpose and without fee is hereby
|
||||
* granted, provided that the above copyright notice appear in all
|
||||
* copies and that both that the copyright notice and this
|
||||
* permission notice and warranty disclaimer appear in supporting
|
||||
* documentation, and that the name of the author not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
*
|
||||
* The author disclaim all warranties with regard to this
|
||||
* software, including all implied warranties of merchantability
|
||||
* and fitness. In no event shall the author be liable for any
|
||||
* special, indirect or consequential damages or any damages
|
||||
* whatsoever resulting from loss of use, data or profits, whether
|
||||
* in an action of contract, negligence or other tortious action,
|
||||
* arising out of or in connection with the use or performance of
|
||||
* this software.
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/tty.h>
|
||||
#include <machine/pic32mx.h>
|
||||
#include <machine/usb_device.h>
|
||||
#include <machine/usb_function_cdc.h>
|
||||
|
||||
struct tty cnttys [1];
|
||||
|
||||
void cnstart (struct tty *tp);
|
||||
|
||||
/*
|
||||
* Initialize USB module SFRs and firmware variables to known state.
|
||||
* Enable interrupts.
|
||||
*/
|
||||
void cninit()
|
||||
{
|
||||
usb_device_init();
|
||||
IECSET(1) = 1 << (PIC32_IRQ_USB - 32);
|
||||
|
||||
/* Wait for any user input. */
|
||||
while (! cdc_consume(0))
|
||||
usb_device_tasks();
|
||||
}
|
||||
|
||||
void cnidentify()
|
||||
{
|
||||
printf ("console: USB\n");
|
||||
}
|
||||
|
||||
int cnopen (dev, flag, mode)
|
||||
dev_t dev;
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
|
||||
tp->t_oproc = cnstart;
|
||||
if ((tp->t_state & TS_ISOPEN) == 0) {
|
||||
ttychars(tp);
|
||||
tp->t_state = TS_ISOPEN | TS_CARR_ON;
|
||||
tp->t_flags = ECHO | XTABS | CRMOD | CRTBS | CRTERA | CTLECH | CRTKIL;
|
||||
}
|
||||
if ((tp->t_state & TS_XCLUDE) && u.u_uid != 0)
|
||||
return (EBUSY);
|
||||
|
||||
return ttyopen (dev, tp);
|
||||
}
|
||||
|
||||
int cnclose (dev, flag, mode)
|
||||
dev_t dev;
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
|
||||
ttywflush(tp);
|
||||
ttyclose (tp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cnread (dev, uio, flag)
|
||||
dev_t dev;
|
||||
struct uio *uio;
|
||||
int flag;
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
|
||||
return ttread (tp, uio, flag);
|
||||
}
|
||||
|
||||
int cnwrite (dev, uio, flag)
|
||||
dev_t dev;
|
||||
struct uio *uio;
|
||||
int flag;
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
|
||||
return ttwrite (tp, uio, flag);
|
||||
}
|
||||
|
||||
int cnioctl (dev, cmd, addr, flag)
|
||||
dev_t dev;
|
||||
register u_int cmd;
|
||||
caddr_t addr;
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
register int error;
|
||||
|
||||
error = ttioctl (tp, cmd, addr, flag);
|
||||
if (error < 0)
|
||||
error = ENOTTY;
|
||||
return error;
|
||||
}
|
||||
|
||||
int cnselect (dev, rw)
|
||||
register dev_t dev;
|
||||
int rw;
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
|
||||
return ttyselect (tp, rw);
|
||||
}
|
||||
|
||||
void cnstart (tp)
|
||||
register struct tty *tp;
|
||||
{
|
||||
register int s;
|
||||
|
||||
s = spltty();
|
||||
if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) {
|
||||
out: /* Disable transmit_interrupt. */
|
||||
led_control (LED_TTY, 0);
|
||||
splx (s);
|
||||
return;
|
||||
}
|
||||
ttyowake(tp);
|
||||
if (tp->t_outq.c_cc == 0)
|
||||
goto out;
|
||||
if (cdc_is_tx_ready()) {
|
||||
while (tp->t_outq.c_cc != 0) {
|
||||
int c = getc (&tp->t_outq);
|
||||
if (cdc_putc (c) == 0)
|
||||
break;
|
||||
}
|
||||
cdc_tx_service();
|
||||
tp->t_state |= TS_BUSY;
|
||||
}
|
||||
led_control (LED_TTY, 1);
|
||||
splx (s);
|
||||
}
|
||||
|
||||
/*
|
||||
* Put a symbol on console terminal.
|
||||
*/
|
||||
void cnputc (c)
|
||||
char c;
|
||||
{
|
||||
register int s;
|
||||
|
||||
s = spltty();
|
||||
while (! cdc_is_tx_ready()) {
|
||||
usb_device_tasks();
|
||||
cdc_tx_service();
|
||||
}
|
||||
led_control (LED_TTY, 1);
|
||||
again:
|
||||
cdc_putc (c);
|
||||
cdc_tx_service();
|
||||
|
||||
while (! cdc_is_tx_ready()) {
|
||||
cdc_tx_service();
|
||||
usb_device_tasks();
|
||||
}
|
||||
if (c == '\n') {
|
||||
c = '\r';
|
||||
goto again;
|
||||
}
|
||||
|
||||
led_control (LED_TTY, 0);
|
||||
splx (s);
|
||||
}
|
||||
|
||||
static int getc_data;
|
||||
|
||||
/*
|
||||
* Receive a character for getc.
|
||||
*/
|
||||
static void store_char (int c)
|
||||
{
|
||||
getc_data = (unsigned char) c;
|
||||
}
|
||||
|
||||
/*
|
||||
* Receive a symbol from console terminal.
|
||||
*/
|
||||
int
|
||||
cngetc ()
|
||||
{
|
||||
register int s;
|
||||
|
||||
s = spltty();
|
||||
for (getc_data = -1; getc_data < 0; ) {
|
||||
usb_device_tasks();
|
||||
cdc_consume (store_char);
|
||||
cdc_tx_service();
|
||||
}
|
||||
splx (s);
|
||||
return getc_data;
|
||||
}
|
||||
|
||||
/*
|
||||
* Receive a character from CDC.
|
||||
*/
|
||||
static void cn_rx (int c)
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
|
||||
if ((tp->t_state & TS_ISOPEN) == 0)
|
||||
return;
|
||||
ttyinput (c, tp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check bus status and service USB interrupts.
|
||||
*/
|
||||
void cnintr (int chan)
|
||||
{
|
||||
register struct tty *tp = &cnttys[0];
|
||||
|
||||
// Must call this function from interrupt or periodically.
|
||||
usb_device_tasks();
|
||||
|
||||
// Check that USB connection is established.
|
||||
if (usb_device_state < CONFIGURED_STATE ||
|
||||
(U1PWRC & PIC32_U1PWRC_USUSPEND))
|
||||
return;
|
||||
|
||||
// Receive data from user.
|
||||
cdc_consume (cn_rx);
|
||||
|
||||
if (cdc_is_tx_ready()) {
|
||||
// Transmitter empty.
|
||||
led_control (LED_TTY, 0);
|
||||
|
||||
if (tp->t_state & TS_BUSY) {
|
||||
tp->t_state &= ~TS_BUSY;
|
||||
ttstart (tp);
|
||||
}
|
||||
}
|
||||
|
||||
// Transmit data to user.
|
||||
cdc_tx_service();
|
||||
}
|
||||
|
||||
/*
|
||||
* USB Callback Functions
|
||||
*/
|
||||
|
||||
/*
|
||||
* This function is called when the device becomes initialized.
|
||||
* It should initialize the endpoints for the device's usage
|
||||
* according to the current configuration.
|
||||
*/
|
||||
void usbcb_init_ep()
|
||||
{
|
||||
cdc_init_ep();
|
||||
}
|
||||
|
||||
/*
|
||||
* Process device-specific SETUP requests.
|
||||
*/
|
||||
void usbcb_check_other_req()
|
||||
{
|
||||
cdc_check_request();
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Wake up a host PC.
|
||||
*/
|
||||
void usb_send_resume (void)
|
||||
{
|
||||
/* Start RESUME signaling. */
|
||||
U1CON |= PIC32_U1CON_RESUME;
|
||||
|
||||
/* Set RESUME line for 1-13 ms. */
|
||||
udelay (5000);
|
||||
|
||||
U1CON &= ~PIC32_U1CON_RESUME;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONSOLE_VID
|
||||
# define CONSOLE_VID 0x04D8 // Vendor ID: Microchip
|
||||
#endif
|
||||
#ifndef CONSOLE_PID
|
||||
# define CONSOLE_PID 0x000A // Product ID: CDC RS-232 Emulation Demo
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Device Descriptor
|
||||
*/
|
||||
const USB_DEVICE_DESCRIPTOR usb_device = {
|
||||
sizeof(usb_device), // Size of this descriptor in bytes
|
||||
USB_DESCRIPTOR_DEVICE, // DEVICE descriptor type
|
||||
0x0200, // USB Spec Release Number in BCD format
|
||||
CDC_DEVICE, // Class Code
|
||||
0x00, // Subclass code
|
||||
0x00, // Protocol code
|
||||
USB_EP0_BUFF_SIZE, // Max packet size for EP0, see usb_config.h
|
||||
CONSOLE_VID, // Vendor ID
|
||||
CONSOLE_PID, // Product ID
|
||||
0x0100, // Device release number in BCD format
|
||||
0x01, // Manufacturer string index
|
||||
0x02, // Product string index
|
||||
0x00, // Device serial number string index
|
||||
0x01 // Number of possible configurations
|
||||
};
|
||||
|
||||
/*
|
||||
* Configuration 1 Descriptor
|
||||
*/
|
||||
const unsigned char usb_config1_descriptor[] =
|
||||
{
|
||||
/* Configuration Descriptor */
|
||||
9, // sizeof(USB_CFG_DSC)
|
||||
USB_DESCRIPTOR_CONFIGURATION, // CONFIGURATION descriptor type
|
||||
67, 0, // Total length of data for this cfg
|
||||
2, // Number of interfaces in this cfg
|
||||
1, // Index value of this configuration
|
||||
0, // Configuration string index
|
||||
_DEFAULT | _SELF, // Attributes, see usb_device.h
|
||||
150, // Max power consumption (2X mA)
|
||||
|
||||
/* Interface Descriptor */
|
||||
9, // sizeof(USB_INTF_DSC)
|
||||
USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type
|
||||
0, // Interface Number
|
||||
0, // Alternate Setting Number
|
||||
1, // Number of endpoints in this intf
|
||||
COMM_INTF, // Class code
|
||||
ABSTRACT_CONTROL_MODEL, // Subclass code
|
||||
V25TER, // Protocol code
|
||||
0, // Interface string index
|
||||
|
||||
/* CDC Class-Specific Descriptors */
|
||||
sizeof(USB_CDC_HEADER_FN_DSC),
|
||||
CS_INTERFACE,
|
||||
DSC_FN_HEADER,
|
||||
0x10,0x01,
|
||||
|
||||
sizeof(USB_CDC_ACM_FN_DSC),
|
||||
CS_INTERFACE,
|
||||
DSC_FN_ACM,
|
||||
USB_CDC_ACM_FN_DSC_VAL,
|
||||
|
||||
sizeof(USB_CDC_UNION_FN_DSC),
|
||||
CS_INTERFACE,
|
||||
DSC_FN_UNION,
|
||||
CDC_COMM_INTF_ID,
|
||||
CDC_DATA_INTF_ID,
|
||||
|
||||
sizeof(USB_CDC_CALL_MGT_FN_DSC),
|
||||
CS_INTERFACE,
|
||||
DSC_FN_CALL_MGT,
|
||||
0x00,
|
||||
CDC_DATA_INTF_ID,
|
||||
|
||||
/* Endpoint Descriptor */
|
||||
7, // sizeof(USB_EP_DSC)
|
||||
USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor
|
||||
_EP02_IN, // EndpointAddress
|
||||
_INTERRUPT, // Attributes
|
||||
0x08, 0x00, // size
|
||||
0x02, // Interval
|
||||
|
||||
/* Interface Descriptor */
|
||||
9, // sizeof(USB_INTF_DSC)
|
||||
USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type
|
||||
1, // Interface Number
|
||||
0, // Alternate Setting Number
|
||||
2, // Number of endpoints in this intf
|
||||
DATA_INTF, // Class code
|
||||
0, // Subclass code
|
||||
NO_PROTOCOL, // Protocol code
|
||||
0, // Interface string index
|
||||
|
||||
/* Endpoint Descriptor */
|
||||
7, // sizeof(USB_EP_DSC)
|
||||
USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor
|
||||
_EP03_OUT, // EndpointAddress
|
||||
_BULK, // Attributes
|
||||
0x40, 0x00, // size
|
||||
0x00, // Interval
|
||||
|
||||
/* Endpoint Descriptor */
|
||||
7, // sizeof(USB_EP_DSC)
|
||||
USB_DESCRIPTOR_ENDPOINT, // Endpoint Descriptor
|
||||
_EP03_IN, // EndpointAddress
|
||||
_BULK, // Attributes
|
||||
0x40, 0x00, // size
|
||||
0x00, // Interval
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Language code string descriptor.
|
||||
*/
|
||||
static const USB_STRING_INIT(1) string0_descriptor = {
|
||||
sizeof(string0_descriptor),
|
||||
USB_DESCRIPTOR_STRING,
|
||||
{ 0x0409 } /* US English */
|
||||
};
|
||||
|
||||
/*
|
||||
* Manufacturer string descriptor
|
||||
*/
|
||||
static const USB_STRING_INIT(25) string1_descriptor = {
|
||||
sizeof(string1_descriptor),
|
||||
USB_DESCRIPTOR_STRING,
|
||||
{ 'M','i','c','r','o','c','h','i','p',' ',
|
||||
'T','e','c','h','n','o','l','o','g','y',
|
||||
' ','I','n','c','.', },
|
||||
};
|
||||
|
||||
/*
|
||||
* Product string descriptor
|
||||
*/
|
||||
static const USB_STRING_INIT(16) string2_descriptor = {
|
||||
sizeof(string2_descriptor),
|
||||
USB_DESCRIPTOR_STRING,
|
||||
{ 'R','e','t','r','o','B','S','D',' ','C',
|
||||
'o','n','s','o','l','e', },
|
||||
};
|
||||
|
||||
/*
|
||||
* Array of configuration descriptors
|
||||
*/
|
||||
const unsigned char *const usb_config[] = {
|
||||
(const unsigned char *const) &usb_config1_descriptor,
|
||||
};
|
||||
|
||||
/*
|
||||
* Array of string descriptors
|
||||
*/
|
||||
const unsigned char *const usb_string[USB_NUM_STRING_DESCRIPTORS] = {
|
||||
(const unsigned char *const) &string0_descriptor,
|
||||
(const unsigned char *const) &string1_descriptor,
|
||||
(const unsigned char *const) &string2_descriptor,
|
||||
};
|
||||
Reference in New Issue
Block a user