/*!
|
/*!
|
ZTEX Firmware Kit for EZ-USB Microcontrollers
|
ZTEX Firmware Kit for EZ-USB Microcontrollers
|
Copyright (C) 2009-2010 ZTEX e.K.
|
Copyright (C) 2009-2010 ZTEX e.K.
|
http://www.ztex.de
|
http://www.ztex.de
|
|
|
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
it under the terms of the GNU General Public License version 3 as
|
it under the terms of the GNU General Public License version 3 as
|
published by the Free Software Foundation.
|
published by the Free Software Foundation.
|
|
|
This program is distributed in the hope that it will be useful, but
|
This program is distributed in the hope that it will be useful, but
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
General Public License for more details.
|
General Public License for more details.
|
|
|
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
along with this program; if not, see http://www.gnu.org/licenses/.
|
along with this program; if not, see http://www.gnu.org/licenses/.
|
!*/
|
!*/
|
|
|
/*
|
/*
|
Defines the USB descriptors
|
Defines the USB descriptors
|
*/
|
*/
|
|
|
#ifndef[ZTEX_DESCRIPTORS_H]
|
#ifndef[ZTEX_DESCRIPTORS_H]
|
#define[ZTEX_DESCRIPTORS_H]
|
#define[ZTEX_DESCRIPTORS_H]
|
|
|
#define[ZTEX_DESCRIPTOR_OFFS][0x06c]
|
#define[ZTEX_DESCRIPTOR_OFFS][0x06c]
|
#define[ZTEX_DESCRIPTOR_LEN][40]
|
#define[ZTEX_DESCRIPTOR_LEN][40]
|
|
|
xdata at ZTEX_DESCRIPTOR_OFFS BYTE ZTEX_DESCRIPTOR;
|
xdata at ZTEX_DESCRIPTOR_OFFS BYTE ZTEX_DESCRIPTOR;
|
|
|
/* ZTEX descriptor version. Must be 1. */
|
/* ZTEX descriptor version. Must be 1. */
|
xdata at ZTEX_DESCRIPTOR_OFFS+1 BYTE ZTEX_DESCRIPTOR_VERSION;
|
xdata at ZTEX_DESCRIPTOR_OFFS+1 BYTE ZTEX_DESCRIPTOR_VERSION;
|
|
|
/* Must not be modified, ID="ZTEX" */
|
/* Must not be modified, ID="ZTEX" */
|
xdata at ZTEX_DESCRIPTOR_OFFS+2 BYTE ZTEXID[4];
|
xdata at ZTEX_DESCRIPTOR_OFFS+2 BYTE ZTEXID[4];
|
|
|
/*
|
/*
|
Product ID and firmware compatibility information.
|
Product ID and firmware compatibility information.
|
|
|
A firmware can overwrite an installed one if
|
A firmware can overwrite an installed one if
|
if ( INSTALLED.PRODUCTID[0]==0 || PRODUCTID[0]==0 || INSTALLED.PRODUCTID[0]==PRODUCTID[0] ) &&
|
if ( INSTALLED.PRODUCTID[0]==0 || PRODUCTID[0]==0 || INSTALLED.PRODUCTID[0]==PRODUCTID[0] ) &&
|
( INSTALLED.PRODUCTID[1]==0 || PRODUCTID[1]==0 || INSTALLED.PRODUCTID[1]==PRODUCTID[1] ) &&
|
( INSTALLED.PRODUCTID[1]==0 || PRODUCTID[1]==0 || INSTALLED.PRODUCTID[1]==PRODUCTID[1] ) &&
|
( INSTALLED.PRODUCTID[2]==0 || PRODUCTID[2]==0 || INSTALLED.PRODUCTID[2]==PRODUCTID[2] ) &&
|
( INSTALLED.PRODUCTID[2]==0 || PRODUCTID[2]==0 || INSTALLED.PRODUCTID[2]==PRODUCTID[2] ) &&
|
( INSTALLED.PRODUCTID[3]==0 || PRODUCTID[3]==0 || INSTALLED.PRODUCTID[3]==PRODUCTID[3] )
|
( INSTALLED.PRODUCTID[3]==0 || PRODUCTID[3]==0 || INSTALLED.PRODUCTID[3]==PRODUCTID[3] )
|
|
|
Reserved Product ID's:
|
Reserved Product ID's:
|
|
|
0.0.0.0 // default Product ID (no product specified)
|
0.0.0.0 // default Product ID (no product specified)
|
1.*.*.* // may be used for experimental purposes
|
1.*.*.* // may be used for experimental purposes
|
10.*.*.* // used for ZTEX products
|
10.*.*.* // used for ZTEX products
|
10.11.*.* // ZTEX USB-FPGA-Module 1.2
|
10.11.*.* // ZTEX USB-FPGA-Module 1.2
|
10.12.*.* // ZTEX USB-FPGA-Module 1.10
|
10.12.*.* // ZTEX USB-FPGA-Module 1.11
|
10.20.*.* // ZTEX USB-Module 1.0
|
10.20.*.* // ZTEX USB-Module 1.0
|
|
10.30.*.* // ZTEX USB-XMEGA-Module 1.0
|
|
|
Please contact me (http://www.ztex.de --> Impressum/Kontakt) if you want to register/reserve a Product ID (range).
|
Please contact me (http://www.ztex.de --> Impressum/Kontakt) if you want to register/reserve a Product ID (range).
|
*/
|
*/
|
xdata at ZTEX_DESCRIPTOR_OFFS+6 BYTE PRODUCT_ID[4];
|
xdata at ZTEX_DESCRIPTOR_OFFS+6 BYTE PRODUCT_ID[4];
|
|
|
/* Firmware version, may be used to distinguish seveveral firmware versions */
|
/* Firmware version, may be used to distinguish seveveral firmware versions */
|
xdata at ZTEX_DESCRIPTOR_OFFS+10 BYTE FW_VERSION;
|
xdata at ZTEX_DESCRIPTOR_OFFS+10 BYTE FW_VERSION;
|
|
|
/* Interface version. Must be 1. */
|
/* Interface version. Must be 1. */
|
xdata at ZTEX_DESCRIPTOR_OFFS+11 BYTE INTERFACE_VERSION;
|
xdata at ZTEX_DESCRIPTOR_OFFS+11 BYTE INTERFACE_VERSION;
|
|
|
/*
|
/*
|
Standard interface capabilities:
|
Standard interface capabilities:
|
0.0 : EEPROM read/write, see ztex-eeprom.h
|
0.0 : EEPROM read/write, see ztex-eeprom.h
|
0.1 : FPGA configuration, see ztex-fpga.h
|
0.1 : FPGA configuration, see ztex-fpga.h
|
0.2 : Flash memeory suport, see ztex-flash1.h
|
0.2 : Flash memory support, see ztex-flash1.h
|
|
0.3 : Debug helper, see ztex-debug.h
|
|
0.4 : AVR XMEGA support, see ztex-xmega.h
|
*/
|
*/
|
xdata at ZTEX_DESCRIPTOR_OFFS+12 BYTE INTERFACE_CAPABILITIES[6];
|
xdata at ZTEX_DESCRIPTOR_OFFS+12 BYTE INTERFACE_CAPABILITIES[6];
|
|
|
/* Space for settings which depends on PRODUCT_ID, e.g extra capabilities */
|
/* Space for settings which depends on PRODUCT_ID, e.g extra capabilities */
|
xdata at ZTEX_DESCRIPTOR_OFFS+18 BYTE MODULE_RESERVED[12];
|
xdata at ZTEX_DESCRIPTOR_OFFS+18 BYTE MODULE_RESERVED[12];
|
|
|
/*
|
/*
|
Serial number string
|
Serial number string
|
default: "0000000000"
|
default: "0000000000"
|
Should only be modified by the the firmware upload software
|
Should only be modified by the the firmware upload software
|
*/
|
*/
|
xdata at ZTEX_DESCRIPTOR_OFFS+30 BYTE SN_STRING[10];
|
xdata at ZTEX_DESCRIPTOR_OFFS+30 BYTE SN_STRING[10];
|
|
|
/* Are Vendor ID and Product ID defined? */
|
/* Are Vendor ID and Product ID defined? */
|
#ifndef[USB_VENDOR_ID]
|
#ifndef[USB_VENDOR_ID]
|
#error[No USB Vendor ID defined]
|
#error[No USB Vendor ID defined]
|
#endif
|
#endif
|
|
|
#ifndef[USB_PRODUCT_ID]
|
#ifndef[USB_PRODUCT_ID]
|
#error[No USB Product ID defined]
|
#error[No USB Product ID defined]
|
#endif
|
#endif
|
|
|
/* Prepare the Interfaces, i.e. check which interfaces are defined */
|
/* Prepare the Interfaces, i.e. check which interfaces are defined */
|
#define[CONFIGURE_INTERFACE(][);][
|
#define[CONFIGURE_INTERFACE(][);][
|
#define[CONFIG_INTERFACE$0]
|
#define[CONFIG_INTERFACE$0]
|
#ifeq[EP1IN_INTERFACE][$0]
|
#ifeq[EP1IN_INTERFACE][$0]
|
#elifeq[EP1OUT_INTERFACE][$0]
|
#elifeq[EP1OUT_INTERFACE][$0]
|
#elifeq[EP2_INTERFACE][$0]
|
#elifeq[EP2_INTERFACE][$0]
|
#elifeq[EP4_INTERFACE][$0]
|
#elifeq[EP4_INTERFACE][$0]
|
#elifeq[EP6_INTERFACE][$0]
|
#elifeq[EP6_INTERFACE][$0]
|
#elifneq[EP8_INTERFACE][$0]
|
#elifneq[EP8_INTERFACE][$0]
|
#udefine[CONFIG_INTERFACE$0]
|
#udefine[CONFIG_INTERFACE$0]
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE$0]
|
#ifdef[CONFIG_INTERFACE$0]
|
//Interface $0: YES
|
//Interface $0: YES
|
#else
|
#else
|
//Interface $0: NO
|
//Interface $0: NO
|
#endif]
|
#endif]
|
|
|
CONFIGURE_INTERFACE(0);
|
CONFIGURE_INTERFACE(0);
|
CONFIGURE_INTERFACE(1);
|
CONFIGURE_INTERFACE(1);
|
CONFIGURE_INTERFACE(2);
|
CONFIGURE_INTERFACE(2);
|
CONFIGURE_INTERFACE(3);
|
CONFIGURE_INTERFACE(3);
|
|
|
/* define the ZTEX descriptor */
|
/* define the ZTEX descriptor */
|
void abscode_identity() _naked
|
void abscode_identity() _naked
|
{
|
{
|
_asm
|
_asm
|
.area ABSCODE (ABS,CODE)
|
.area ABSCODE (ABS,CODE)
|
|
|
.org ZTEX_DESCRIPTOR_OFFS
|
.org ZTEX_DESCRIPTOR_OFFS
|
.db ZTEX_DESCRIPTOR_LEN
|
.db ZTEX_DESCRIPTOR_LEN
|
|
|
.org _ZTEX_DESCRIPTOR_VERSION
|
.org _ZTEX_DESCRIPTOR_VERSION
|
.db 1
|
.db 1
|
|
|
.org _ZTEXID
|
.org _ZTEXID
|
.ascii "ZTEX"
|
.ascii "ZTEX"
|
|
|
.org _PRODUCT_ID
|
.org _PRODUCT_ID
|
.db PRODUCT_ID_0
|
.db PRODUCT_ID_0
|
.db PRODUCT_ID_1
|
.db PRODUCT_ID_1
|
.db PRODUCT_ID_2
|
.db PRODUCT_ID_2
|
.db PRODUCT_ID_3
|
.db PRODUCT_ID_3
|
|
|
.org _FW_VERSION
|
.org _FW_VERSION
|
.db FWVER
|
.db FWVER
|
|
|
.org _INTERFACE_VERSION
|
.org _INTERFACE_VERSION
|
.db 1
|
.db 1
|
|
|
.org _INTERFACE_CAPABILITIES
|
.org _INTERFACE_CAPABILITIES
|
.db 0
|
.db 0
|
#ifdef[@CAPABILITY_EEPROM;]
|
#ifdef[@CAPABILITY_EEPROM;]
|
#nolf
|
#nolf
|
+ 1
|
+ 1
|
#endif
|
#endif
|
#ifdef[@CAPABILITY_FPGA;]
|
#ifdef[@CAPABILITY_FPGA;]
|
#nolf
|
#nolf
|
+ 2
|
+ 2
|
#endif
|
#endif
|
#ifdef[@CAPABILITY_FLASH;]
|
#ifdef[@CAPABILITY_FLASH;]
|
#nolf
|
#nolf
|
+ 4
|
+ 4
|
#endif
|
#endif
|
|
#ifdef[@CAPABILITY_DEBUG;]
|
|
#nolf
|
|
+ 8
|
|
#endif
|
|
#ifdef[@CAPABILITY_XMEGA;]
|
|
#nolf
|
|
+ 16
|
|
#endif
|
.db 0
|
.db 0
|
.db 0
|
.db 0
|
.db 0
|
.db 0
|
.db 0
|
.db 0
|
.db 0
|
.db 0
|
|
|
.org _MODULE_RESERVED
|
.org _MODULE_RESERVED
|
.db MODULE_RESERVED_00
|
.db MODULE_RESERVED_00
|
.db MODULE_RESERVED_01
|
.db MODULE_RESERVED_01
|
.db MODULE_RESERVED_02
|
.db MODULE_RESERVED_02
|
.db MODULE_RESERVED_03
|
.db MODULE_RESERVED_03
|
.db MODULE_RESERVED_04
|
.db MODULE_RESERVED_04
|
.db MODULE_RESERVED_05
|
.db MODULE_RESERVED_05
|
.db MODULE_RESERVED_06
|
.db MODULE_RESERVED_06
|
.db MODULE_RESERVED_07
|
.db MODULE_RESERVED_07
|
.db MODULE_RESERVED_08
|
.db MODULE_RESERVED_08
|
.db MODULE_RESERVED_09
|
.db MODULE_RESERVED_09
|
.db MODULE_RESERVED_10
|
.db MODULE_RESERVED_10
|
.db MODULE_RESERVED_11
|
.db MODULE_RESERVED_11
|
|
|
.org _SN_STRING
|
.org _SN_STRING
|
.ascii "0000000000"
|
.ascii "0000000000"
|
|
|
.area CSEG (CODE)
|
.area CSEG (CODE)
|
_endasm;
|
_endasm;
|
}
|
}
|
|
|
/* *********************************************************************
|
/* *********************************************************************
|
***** strings *******************************************************
|
***** strings *******************************************************
|
********************************************************************* */
|
********************************************************************* */
|
code char manufacturerString[] = MANUFACTURER_STRING;
|
code char manufacturerString[] = MANUFACTURER_STRING;
|
code char productString[] = PRODUCT_STRING;
|
code char productString[] = PRODUCT_STRING;
|
code char configurationString[] = CONFIGURATION_STRING;
|
code char configurationString[] = CONFIGURATION_STRING;
|
|
|
|
|
/* *********************************************************************
|
/* *********************************************************************
|
***** descriptors ***************************************************
|
***** descriptors ***************************************************
|
********************************************************************* */
|
********************************************************************* */
|
#define[EP_DESCRIPTOR(][);][
|
#define[EP_DESCRIPTOR(][);][
|
// Endpoint $0 descriptor
|
// Endpoint $0 descriptor
|
,7 // 0, Descriptor length
|
,7 // 0, Descriptor length
|
,5 // 1, Descriptor type
|
,5 // 1, Descriptor type
|
#ifeq[$0][1IN]
|
#ifeq[$0][1IN]
|
,0x81 // 2, direction=output, address=1
|
,0x81 // 2, direction=output, address=1
|
#elifeq[$0][1OUT]
|
#elifeq[$0][1OUT]
|
,0x01 // 2, direction=output, address=1
|
,0x01 // 2, direction=output, address=1
|
#elifeq[EP$0_DIR][IN]
|
#elifeq[EP$0_DIR][IN]
|
,0x80+$0 // 2, direction=output, address=$0
|
,0x80+$0 // 2, direction=output, address=$0
|
#elifeq[EP$0_DIR][OUT]
|
#elifeq[EP$0_DIR][OUT]
|
,$0 // 2, direction=input, address=$0
|
,$0 // 2, direction=input, address=$0
|
#else
|
#else
|
#error[Invalid direction for endpoint $0 (`IN' or `ÒUT' expected)]
|
#error[Invalid direction for endpoint $0 (`IN' or `ÒUT' expected)]
|
#endif
|
#endif
|
#ifeq[EP$0_TYPE][ISO]
|
#ifeq[EP$0_TYPE][ISO]
|
,1 // 3, ISO transferns
|
,1 // 3, ISO transferns
|
#elifeq[EP$0_TYPE][BULK]
|
#elifeq[EP$0_TYPE][BULK]
|
,2 // 3, BULK transferns
|
,2 // 3, BULK transferns
|
#elifeq[EP$0_TYPE][INT]
|
#elifeq[EP$0_TYPE][INT]
|
,3 // 3, INT transferns
|
,3 // 3, INT transferns
|
#else
|
#else
|
#error[Invalid type for endpoint $0: `EP$0_TYPE' (`ISO', 'BULK' or `INT' expected)]
|
#error[Invalid type for endpoint $0: `EP$0_TYPE' (`ISO', 'BULK' or `INT' expected)]
|
#endif
|
#endif
|
#ifdef[HIGH_SPEED]
|
#ifdef[HIGH_SPEED]
|
,EP$0_SIZE & 0xff // 4, max. packet size (L)
|
,EP$0_SIZE & 0xff // 4, max. packet size (L)
|
,EP$0_SIZE >> 8 // 5, max. packet size (H)
|
,EP$0_SIZE >> 8 // 5, max. packet size (H)
|
#ifneq[EP$0_TYPE][BULK]
|
#ifneq[EP$0_TYPE][BULK]
|
| ( (EP$0_PPMF-1) << 3 )
|
| ( (EP$0_PPMF-1) << 3 )
|
#endif
|
#endif
|
#else
|
#else
|
,64 // 4, max. packet size (L)
|
,64 // 4, max. packet size (L)
|
,0 // 5, max. packet size (H)
|
,0 // 5, max. packet size (H)
|
#endif
|
#endif
|
#ifeq[EP$0_TYPE][BULK]
|
#ifeq[EP$0_TYPE][BULK]
|
,0 // 6, Polling interval
|
,0 // 6, Polling interval
|
#elifeq[EP$0_TYPE][ISO]
|
#elifeq[EP$0_TYPE][ISO]
|
,1 // 6, Polling interval (1ms if Full Speed mode, 125µs in High Speed Mode)
|
,1 // 6, Polling interval (1ms if Full Speed mode, 125µs in High Speed Mode)
|
#else
|
#else
|
,EP$0_POLL // 6, Polling interval (1ms if Full Speed mode, 125µs in High Speed Mode)
|
,EP$0_POLL // 6, Polling interval (1ms if Full Speed mode, 125µs in High Speed Mode)
|
#endif
|
#endif
|
]
|
]
|
|
|
#define[INTERFACE_DESCRIPTOR(][);][
|
#define[INTERFACE_DESCRIPTOR(][);][
|
// Interface $0 descriptor
|
// Interface $0 descriptor
|
,9 // 0, Descriptor length
|
,9 // 0, Descriptor length
|
,0x04 // 1, Descriptor type
|
,0x04 // 1, Descriptor type
|
,0 // 2, Zero-based index of this interface
|
,0 // 2, Zero-based index of this interface
|
#ifneq[$0][0]
|
#ifneq[$0][0]
|
#ifdef[CONFIG_INTERFACE0]
|
#ifdef[CONFIG_INTERFACE0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifneq[$0][1]
|
#ifneq[$0][1]
|
#ifdef[CONFIG_INTERFACE1]
|
#ifdef[CONFIG_INTERFACE1]
|
+1
|
+1
|
#endif
|
#endif
|
#ifneq[$0][2]
|
#ifneq[$0][2]
|
#ifdef[CONFIG_INTERFACE2]
|
#ifdef[CONFIG_INTERFACE2]
|
+1
|
+1
|
#endif
|
#endif
|
#endif
|
#endif
|
#endif
|
#endif
|
#endif
|
#endif
|
,0 // 3, Alternate setting 0
|
,0 // 3, Alternate setting 0
|
,0 // 4, Number of end points
|
,0 // 4, Number of end points
|
#ifeq[EP1IN_INTERFACE][$0]
|
#ifeq[EP1IN_INTERFACE][$0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifeq[EP1OUT_INTERFACE][$0]
|
#ifeq[EP1OUT_INTERFACE][$0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifeq[EP2_INTERFACE][$0]
|
#ifeq[EP2_INTERFACE][$0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifeq[EP4_INTERFACE][$0]
|
#ifeq[EP4_INTERFACE][$0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifeq[EP6_INTERFACE][$0]
|
#ifeq[EP6_INTERFACE][$0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifeq[EP8_INTERFACE][$0]
|
#ifeq[EP8_INTERFACE][$0]
|
+1
|
+1
|
#endif
|
#endif
|
,0xff // 5, Interface class
|
,0xff // 5, Interface class
|
,0xff // 6, Interface sub class
|
,0xff // 6, Interface sub class
|
,0xff // 7, Interface protocol
|
,0xff // 7, Interface protocol
|
,0 // 8, Index of interface string descriptor
|
,0 // 8, Index of interface string descriptor
|
#ifeq[EP1IN_INTERFACE][$0]
|
#ifeq[EP1IN_INTERFACE][$0]
|
EP_DESCRIPTOR(1IN);
|
EP_DESCRIPTOR(1IN);
|
#endif
|
#endif
|
#ifeq[EP1OUT_INTERFACE][$0]
|
#ifeq[EP1OUT_INTERFACE][$0]
|
EP_DESCRIPTOR(1OUT);
|
EP_DESCRIPTOR(1OUT);
|
#endif
|
#endif
|
#ifeq[EP2_INTERFACE][$0]
|
#ifeq[EP2_INTERFACE][$0]
|
EP_DESCRIPTOR(2);
|
EP_DESCRIPTOR(2);
|
#endif
|
#endif
|
#ifeq[EP4_INTERFACE][$0]
|
#ifeq[EP4_INTERFACE][$0]
|
EP_DESCRIPTOR(4);
|
EP_DESCRIPTOR(4);
|
#endif
|
#endif
|
#ifeq[EP6_INTERFACE][$0]
|
#ifeq[EP6_INTERFACE][$0]
|
EP_DESCRIPTOR(6);
|
EP_DESCRIPTOR(6);
|
#endif
|
#endif
|
#ifeq[EP8_INTERFACE][$0]
|
#ifeq[EP8_INTERFACE][$0]
|
EP_DESCRIPTOR(8);
|
EP_DESCRIPTOR(8);
|
#endif
|
#endif
|
]
|
]
|
|
|
#define[APPEND_PADBYTE(][);][code BYTE $0_PadByte[2-(sizeof($0) & 1)] = { 0 };]
|
#define[APPEND_PADBYTE(][);][code BYTE $0_PadByte[2-(sizeof($0) & 1)] = { 0 };]
|
|
|
#ifdef[PAD_BYTE] // to ensure word alignment of the descriptors; PAD_BYTE is defined automatically by bmpsdcc script
|
#ifdef[PAD_BYTE] // to ensure word alignment of the descriptors; PAD_BYTE is defined automatically by bmpsdcc script
|
code BYTE PadByte = 0;
|
code BYTE PadByte = 0;
|
#endif
|
#endif
|
|
|
code BYTE DeviceDescriptor[] =
|
code BYTE DeviceDescriptor[] =
|
{
|
{
|
18, // 0, Descriptor length
|
18, // 0, Descriptor length
|
0x01, // 1, Descriptor type
|
0x01, // 1, Descriptor type
|
0x00, // 2, Specification Version (L)
|
0x00, // 2, Specification Version (L)
|
0x02, // 3, Specification Version (H)
|
0x02, // 3, Specification Version (H)
|
0xff, // 4, Device class
|
0xff, // 4, Device class
|
0xff, // 5, Device sub-class
|
0xff, // 5, Device sub-class
|
0xff, // 6, Device protocol
|
0xff, // 6, Device protocol
|
64, // 7, Maximum packet size for EP0
|
64, // 7, Maximum packet size for EP0
|
(USB_VENDOR_ID) & 255, // 8, VENDOR_ID (L)
|
(USB_VENDOR_ID) & 255, // 8, VENDOR_ID (L)
|
(USB_VENDOR_ID) >> 8, // 9, VENDOR_ID (H)
|
(USB_VENDOR_ID) >> 8, // 9, VENDOR_ID (H)
|
(USB_PRODUCT_ID) & 255, // 10, PRODUCT_ID (L)
|
(USB_PRODUCT_ID) & 255, // 10, PRODUCT_ID (L)
|
(USB_PRODUCT_ID) >> 8, // 11, PRODUCT_ID (H)
|
(USB_PRODUCT_ID) >> 8, // 11, PRODUCT_ID (H)
|
0x00, // 12, device release number (BCD, L)
|
0x00, // 12, device release number (BCD, L)
|
0x00, // 13, device release number (BCD, H)
|
0x00, // 13, device release number (BCD, H)
|
1, // 14, Manufacturer string index
|
1, // 14, Manufacturer string index
|
2, // 15, Product string index
|
2, // 15, Product string index
|
3, // 16, Serial number string index
|
3, // 16, Serial number string index
|
1 // 17, Number of configurations
|
1 // 17, Number of configurations
|
};
|
};
|
|
|
code BYTE DeviceQualifierDescriptor[] =
|
code BYTE DeviceQualifierDescriptor[] =
|
{
|
{
|
10, // 0, Descriptor length
|
10, // 0, Descriptor length
|
0x06, // 1, Decriptor type
|
0x06, // 1, Decriptor type
|
0x00, // 2, Specification Version (L)
|
0x00, // 2, Specification Version (L)
|
0x02, // 3, Specification Version (H)
|
0x02, // 3, Specification Version (H)
|
0xff, // 4, Device class
|
0xff, // 4, Device class
|
0xff, // 5, Device sub-class
|
0xff, // 5, Device sub-class
|
0xff, // 6, Device protocol
|
0xff, // 6, Device protocol
|
64, // 7, Maximum packet size (EP0?)
|
64, // 7, Maximum packet size (EP0?)
|
1, // 8, Number of configurations
|
1, // 8, Number of configurations
|
0, // 9, Reserved, must be zero
|
0, // 9, Reserved, must be zero
|
};
|
};
|
|
|
code BYTE HighSpeedConfigDescriptor[] =
|
code BYTE HighSpeedConfigDescriptor[] =
|
{
|
{
|
#define[HIGH_SPEED]
|
#define[HIGH_SPEED]
|
9 // 0, Descriptor length
|
9 // 0, Descriptor length
|
,0x02 // 1, Decriptor type
|
,0x02 // 1, Decriptor type
|
,sizeof(HighSpeedConfigDescriptor) & 0xff // 2, Total length (LSB)
|
,sizeof(HighSpeedConfigDescriptor) & 0xff // 2, Total length (LSB)
|
// ,sizeof(HighSpeedConfigDescriptor) >> 8 // 3, Total length (MB)
|
// ,sizeof(HighSpeedConfigDescriptor) >> 8 // 3, Total length (MB)
|
,0 // 3, To avoid warnings, descriptor length will never exceed 255 bytes
|
,0 // 3, To avoid warnings, descriptor length will never exceed 255 bytes
|
,0 // 4, Number of Interfaces
|
,0 // 4, Number of Interfaces
|
#ifdef[CONFIG_INTERFACE0]
|
#ifdef[CONFIG_INTERFACE0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE1]
|
#ifdef[CONFIG_INTERFACE1]
|
+1
|
+1
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE2]
|
#ifdef[CONFIG_INTERFACE2]
|
+1
|
+1
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE3]
|
#ifdef[CONFIG_INTERFACE3]
|
+1
|
+1
|
#endif
|
#endif
|
|
|
,1 // 5, Configuration number
|
,1 // 5, Configuration number
|
,4 // 6, Configuration string
|
,4 // 6, Configuration string
|
,0xc0 // 7, Attributes: bus and self powered
|
,0xc0 // 7, Attributes: bus and self powered
|
,50 // Maximum bus power 100 mA
|
,50 // Maximum bus power 100 mA
|
#ifdef[CONFIG_INTERFACE0]
|
#ifdef[CONFIG_INTERFACE0]
|
INTERFACE_DESCRIPTOR(0);
|
INTERFACE_DESCRIPTOR(0);
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE1]
|
#ifdef[CONFIG_INTERFACE1]
|
INTERFACE_DESCRIPTOR(1);
|
INTERFACE_DESCRIPTOR(1);
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE2]
|
#ifdef[CONFIG_INTERFACE2]
|
INTERFACE_DESCRIPTOR(2);
|
INTERFACE_DESCRIPTOR(2);
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE3]
|
#ifdef[CONFIG_INTERFACE3]
|
INTERFACE_DESCRIPTOR(3);
|
INTERFACE_DESCRIPTOR(3);
|
#endif
|
#endif
|
#udefine[HIGH_SPEED]
|
#udefine[HIGH_SPEED]
|
};
|
};
|
APPEND_PADBYTE(HighSpeedConfigDescriptor);
|
APPEND_PADBYTE(HighSpeedConfigDescriptor);
|
|
|
code BYTE FullSpeedConfigDescriptor[] =
|
code BYTE FullSpeedConfigDescriptor[] =
|
{
|
{
|
9 // 0, Descriptor length
|
9 // 0, Descriptor length
|
,0x02 // 1, Decriptor type
|
,0x02 // 1, Decriptor type
|
,sizeof(FullSpeedConfigDescriptor) & 0xff // 2, Total length (LSB)
|
,sizeof(FullSpeedConfigDescriptor) & 0xff // 2, Total length (LSB)
|
// ,sizeof(FullSpeedConfigDescriptor) >> 8 // 3, Total length (MSB)
|
// ,sizeof(FullSpeedConfigDescriptor) >> 8 // 3, Total length (MSB)
|
,0 // 3, To avoid warnings, descriptor length will never exceed 255 bytes
|
,0 // 3, To avoid warnings, descriptor length will never exceed 255 bytes
|
,0 // 4, Number of Interfaces
|
,0 // 4, Number of Interfaces
|
#ifdef[CONFIG_INTERFACE0]
|
#ifdef[CONFIG_INTERFACE0]
|
+1
|
+1
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE1]
|
#ifdef[CONFIG_INTERFACE1]
|
+1
|
+1
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE2]
|
#ifdef[CONFIG_INTERFACE2]
|
+1
|
+1
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE3]
|
#ifdef[CONFIG_INTERFACE3]
|
+1
|
+1
|
#endif
|
#endif
|
|
|
,1 // 5, Configuration number
|
,1 // 5, Configuration number
|
,4 // 6, Configuration string
|
,4 // 6, Configuration string
|
,0xc0 // 7, Attributes: bus and self powered
|
,0xc0 // 7, Attributes: bus and self powered
|
,50 // Maximum bus power 100 mA
|
,50 // Maximum bus power 100 mA
|
#ifdef[CONFIG_INTERFACE0]
|
#ifdef[CONFIG_INTERFACE0]
|
INTERFACE_DESCRIPTOR(0);
|
INTERFACE_DESCRIPTOR(0);
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE1]
|
#ifdef[CONFIG_INTERFACE1]
|
INTERFACE_DESCRIPTOR(1);
|
INTERFACE_DESCRIPTOR(1);
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE2]
|
#ifdef[CONFIG_INTERFACE2]
|
INTERFACE_DESCRIPTOR(2);
|
INTERFACE_DESCRIPTOR(2);
|
#endif
|
#endif
|
#ifdef[CONFIG_INTERFACE3]
|
#ifdef[CONFIG_INTERFACE3]
|
INTERFACE_DESCRIPTOR(3);
|
INTERFACE_DESCRIPTOR(3);
|
#endif
|
#endif
|
};
|
};
|
APPEND_PADBYTE(FullSpeedConfigDescriptor);
|
APPEND_PADBYTE(FullSpeedConfigDescriptor);
|
|
|
code BYTE EmptyStringDescriptor[] =
|
code BYTE EmptyStringDescriptor[] =
|
{
|
{
|
sizeof(EmptyStringDescriptor), // Length
|
sizeof(EmptyStringDescriptor), // Length
|
0x03, // Descriptor type
|
0x03, // Descriptor type
|
0, 0
|
0, 0
|
};
|
};
|
|
|
#endif /*ZTEX_DESCRIPTORS_H*/
|
#endif /*ZTEX_DESCRIPTORS_H*/
|
|
|