232 lines
7.5 KiB
C
232 lines
7.5 KiB
C
/****************************************************************************
|
|
* drivers/usbdev/composite_desc.c
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <nuttx/usb/usb.h>
|
|
#include <nuttx/usb/usbdev.h>
|
|
|
|
#include "composite.h"
|
|
|
|
#ifdef CONFIG_USBDEV_COMPOSITE
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/* Configuration ************************************************************/
|
|
|
|
/* Packet sizes */
|
|
|
|
#ifndef CONFIG_COMPOSITE_EP0MAXPACKET
|
|
# define CONFIG_COMPOSITE_EP0MAXPACKET 64
|
|
#endif
|
|
|
|
/* Vendor and product IDs and strings */
|
|
|
|
#ifndef CONFIG_COMPOSITE_VENDORID
|
|
# warning "CONFIG_COMPOSITE_VENDORID not defined"
|
|
# define CONFIG_COMPOSITE_VENDORID 0x03eb
|
|
#endif
|
|
|
|
#ifndef CONFIG_COMPOSITE_PRODUCTID
|
|
# warning "CONFIG_COMPOSITE_PRODUCTID not defined"
|
|
# define CONFIG_COMPOSITE_PRODUCTID 0x2022
|
|
#endif
|
|
|
|
#ifndef CONFIG_COMPOSITE_VERSIONNO
|
|
# define CONFIG_COMPOSITE_VERSIONNO (0x0101)
|
|
#endif
|
|
|
|
#ifndef CONFIG_COMPOSITE_VENDORSTR
|
|
# warning "No Vendor string specified"
|
|
# define CONFIG_COMPOSITE_VENDORSTR "NuttX"
|
|
#endif
|
|
|
|
#ifndef CONFIG_COMPOSITE_PRODUCTSTR
|
|
# warning "No Product string specified"
|
|
# define CONFIG_COMPOSITE_PRODUCTSTR "Composite Device"
|
|
#endif
|
|
|
|
#undef CONFIG_COMPOSITE_SERIALSTR
|
|
#define CONFIG_COMPOSITE_SERIALSTR "0101"
|
|
|
|
#undef CONFIG_COMPOSITE_CONFIGSTR
|
|
#define CONFIG_COMPOSITE_CONFIGSTR "Composite"
|
|
|
|
#ifdef CONFIG_USBDEV_SELFPOWERED
|
|
# define COMPOSITE_SELFPOWERED USB_CONFIG_ATTR_SELFPOWER
|
|
#else
|
|
# define COMPOSITE_SELFPOWERED (0)
|
|
#endif
|
|
|
|
#ifdef CONFIG_USBDEV_REMOTEWAKEUP
|
|
# define COMPOSITE_REMOTEWAKEUP USB_CONFIG_ATTR_WAKEUP
|
|
#else
|
|
# define COMPOSITE_REMOTEWAKEUP (0)
|
|
#endif
|
|
|
|
/* Descriptors **************************************************************/
|
|
|
|
/* String language */
|
|
|
|
#define COMPOSITE_STR_LANGUAGE (0x0409) /* en-us */
|
|
|
|
/****************************************************************************
|
|
* Private Data
|
|
****************************************************************************/
|
|
|
|
/* Device Descriptor */
|
|
|
|
static const struct usb_devdesc_s g_devdesc =
|
|
{
|
|
USB_SIZEOF_DEVDESC, /* len */
|
|
USB_DESC_TYPE_DEVICE, /* type */
|
|
{ /* usb */
|
|
LSBYTE(0x0200),
|
|
MSBYTE(0x0200)
|
|
},
|
|
#ifdef CONFIG_COMPOSITE_IAD
|
|
USB_CLASS_MISC, /* classid */
|
|
2, /* subclass */
|
|
1, /* protocol */
|
|
#else
|
|
USB_CLASS_PER_INTERFACE, /* classid */
|
|
0, /* subclass */
|
|
0, /* protocol */
|
|
#endif
|
|
CONFIG_COMPOSITE_EP0MAXPACKET, /* maxpacketsize */
|
|
{
|
|
LSBYTE(CONFIG_COMPOSITE_VENDORID), /* vendor */
|
|
MSBYTE(CONFIG_COMPOSITE_VENDORID)
|
|
},
|
|
{
|
|
LSBYTE(CONFIG_COMPOSITE_PRODUCTID), /* product */
|
|
MSBYTE(CONFIG_COMPOSITE_PRODUCTID)
|
|
},
|
|
{
|
|
LSBYTE(CONFIG_COMPOSITE_VERSIONNO), /* device */
|
|
MSBYTE(CONFIG_COMPOSITE_VERSIONNO)
|
|
},
|
|
COMPOSITE_MANUFACTURERSTRID, /* imfgr */
|
|
COMPOSITE_PRODUCTSTRID, /* iproduct */
|
|
COMPOSITE_SERIALSTRID, /* serno */
|
|
COMPOSITE_NCONFIGS /* nconfigs */
|
|
};
|
|
|
|
static const struct usbdev_strdesc_s g_strdesc[] =
|
|
{
|
|
{COMPOSITE_MANUFACTURERSTRID, CONFIG_COMPOSITE_VENDORSTR},
|
|
{COMPOSITE_PRODUCTSTRID, CONFIG_COMPOSITE_PRODUCTSTR},
|
|
#ifdef CONFIG_COMPOSITE_SERIALSTR
|
|
{COMPOSITE_SERIALSTRID, CONFIG_COMPOSITE_SERIALSTR},
|
|
#else
|
|
{COMPOSITE_SERIALSTRID, ""},
|
|
#endif
|
|
{COMPOSITE_CONFIGSTRID, CONFIG_COMPOSITE_CONFIGSTR},
|
|
{}
|
|
};
|
|
|
|
static const struct usbdev_strdescs_s g_strdescs =
|
|
{
|
|
.language = COMPOSITE_STR_LANGUAGE,
|
|
.strdesc = g_strdesc,
|
|
};
|
|
|
|
static const struct usb_cfgdesc_s g_cfgdesc =
|
|
{
|
|
.len = USB_SIZEOF_CFGDESC, /* Descriptor length */
|
|
.type = USB_DESC_TYPE_CONFIG, /* Descriptor type */
|
|
.cfgvalue = COMPOSITE_CONFIGID, /* Configuration value */
|
|
.icfg = COMPOSITE_CONFIGSTRID, /* Configuration */
|
|
.attr = USB_CONFIG_ATTR_ONE |
|
|
COMPOSITE_SELFPOWERED |
|
|
COMPOSITE_REMOTEWAKEUP, /* Attributes */
|
|
|
|
.mxpower = (CONFIG_USBDEV_MAXPOWER + 1) / 2 /* Max power (mA/2) */
|
|
};
|
|
|
|
#ifdef CONFIG_USBDEV_DUALSPEED
|
|
static const struct usb_qualdesc_s g_qualdesc =
|
|
{
|
|
USB_SIZEOF_QUALDESC, /* len */
|
|
USB_DESC_TYPE_DEVICEQUALIFIER, /* type */
|
|
{ /* usb */
|
|
LSBYTE(0x0200),
|
|
MSBYTE(0x0200)
|
|
},
|
|
# ifdef CONFIG_COMPOSITE_IAD
|
|
USB_CLASS_MISC, /* classid */
|
|
2, /* subclass */
|
|
1, /* protocol */
|
|
# else
|
|
USB_CLASS_VENDOR_SPEC, /* classid */
|
|
0, /* subclass */
|
|
0, /* protocol */
|
|
# endif
|
|
CONFIG_COMPOSITE_EP0MAXPACKET, /* mxpacketsize */
|
|
COMPOSITE_NCONFIGS, /* nconfigs */
|
|
0, /* reserved */
|
|
};
|
|
#endif
|
|
|
|
static const struct usbdev_devdescs_s g_composite_devdescs =
|
|
{
|
|
&g_cfgdesc,
|
|
&g_strdescs,
|
|
&g_devdesc,
|
|
#ifdef CONFIG_USBDEV_DUALSPEED
|
|
&g_qualdesc,
|
|
#endif
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Public Data
|
|
****************************************************************************/
|
|
|
|
const char g_compvendorstr[] = CONFIG_COMPOSITE_VENDORSTR;
|
|
const char g_compproductstr[] = CONFIG_COMPOSITE_PRODUCTSTR;
|
|
#ifndef CONFIG_COMPOSITE_BOARD_SERIALSTR
|
|
const char g_compserialstr[] = CONFIG_COMPOSITE_SERIALSTR;
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Public Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: composite_getdevdescs
|
|
*
|
|
* Description:
|
|
* Return a pointer to the device descriptor
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR const struct usbdev_devdescs_s *composite_getdevdescs(void)
|
|
{
|
|
return &g_composite_devdescs;
|
|
}
|
|
|
|
#endif /* CONFIG_USBDEV_COMPOSITE */
|