Update USB_FLASH_DRIVE_SUPPORT (#15021)

This commit is contained in:
Marcio Teixeira 2019-08-24 00:47:19 -06:00 committed by Scott Lahteine
parent 20fc66f875
commit da601d5114
149 changed files with 12939 additions and 693 deletions

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -22,12 +22,75 @@
#include "../../inc/MarlinConfigPre.h"
/**
* Adjust USB_DEBUG to select debugging verbosity.
* 0 - no debug messages
* 1 - basic insertion/removal messages
* 2 - show USB state transitions
* 3 - perform block range checking
* 4 - print each block access
*/
#define USB_DEBUG 1
#define USB_STARTUP_DELAY 0
// uncomment to get 'printf' console debugging. NOT FOR UNO!
//#define HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);}
//#define BS_HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);}
//#define MAX_HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);}
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#include "../../Marlin.h"
#include "../../core/serial.h"
#include "../../module/temperature.h"
#include "lib/Usb.h"
#include "lib/masstorage.h"
static_assert(USB_CS_PIN != -1, "USB_CS_PIN must be defined");
static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined");
#if ENABLED(USE_UHS3_USB)
#define NO_AUTO_SPEED
#define UHS_MAX3421E_SPD 8000000 >> SPI_SPEED
#define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 1
#define UHS_HOST_MAX_INTERFACE_DRIVERS 2
#define MASS_MAX_SUPPORTED_LUN 1
#define USB_HOST_SERIAL MYSERIAL0
// Workaround for certain issues with UHS3
#define SKIP_PAGE3F // Required for IOGEAR media adapter
#define USB_NO_TEST_UNIT_READY // Required for removable media adapter
#define USB_HOST_MANUAL_POLL // Optimization to shut off IRQ automatically
// Workarounds for keeping Marlin's watchdog timer from barking...
void marlin_yield() {
thermalManager.manage_heater();
}
#define SYSTEM_OR_SPECIAL_YIELD(...) marlin_yield();
#define delay(x) safe_delay(x)
#define LOAD_USB_HOST_SYSTEM
#define LOAD_USB_HOST_SHIELD
#define LOAD_UHS_BULK_STORAGE
#define MARLIN_UHS_WRITE_SS(v) WRITE(USB_CS_PIN, v)
#define MARLIN_UHS_READ_IRQ() READ(USB_INTR_PIN)
#include "lib-uhs3/UHS_host/UHS_host.h"
MAX3421E_HOST usb(USB_CS_PIN, USB_INTR_PIN);
UHS_Bulk_Storage bulk(&usb);
#define UHS_START (usb.Init() == 0)
#define UHS_STATE(state) UHS_USB_HOST_STATE_##state
#else
#include "lib-uhs2/Usb.h"
#include "lib-uhs2/masstorage.h"
USB usb;
BulkOnly bulk(&usb);
#define UHS_START usb.start()
#define UHS_STATE(state) USB_STATE_##state
#endif
#include "Sd2Card_FlashDrive.h"
@ -35,10 +98,41 @@
#include "../../lcd/ultralcd.h"
#endif
USB usb;
BulkOnly bulk(&usb);
static enum {
UNINITIALIZED,
DO_STARTUP,
WAIT_FOR_DEVICE,
WAIT_FOR_LUN,
MEDIA_READY,
MEDIA_ERROR
} state;
Sd2Card::state_t Sd2Card::state;
#if USB_DEBUG >= 3
uint32_t lun0_capacity;
#endif
bool Sd2Card::usbStartup() {
if (state <= DO_STARTUP) {
SERIAL_ECHOPGM("Starting USB host...");
if (!UHS_START) {
SERIAL_ECHOLNPGM(" failed.");
#if EITHER(ULTRA_LCD, EXTENSIBLE_UI)
LCD_MESSAGEPGM("USB start failed");
#endif
return false;
}
// SPI quick test - check revision register
switch (usb.regRd(rREVISION)) {
case 0x01: SERIAL_ECHOLNPGM("rev.01 started"); break;
case 0x12: SERIAL_ECHOLNPGM("rev.02 started"); break;
case 0x13: SERIAL_ECHOLNPGM("rev.03 started"); break;
default: SERIAL_ECHOLNPGM("started. rev unknown."); break;
}
state = WAIT_FOR_DEVICE;
}
return true;
}
// The USB library needs to be called periodically to detect USB thumbdrive
// insertion and removals. Call this idle() function periodically to allow
@ -46,75 +140,145 @@ Sd2Card::state_t Sd2Card::state;
// of initializing the USB library for the first time.
void Sd2Card::idle() {
static uint32_t next_retry;
usb.Task();
const uint8_t task_state = usb.getUsbTaskState();
#if USB_DEBUG >= 2
if (state > DO_STARTUP) {
static uint8_t laststate = 232;
if (task_state != laststate) {
laststate = task_state;
#define UHS_USB_DEBUG(x) case UHS_STATE(x): SERIAL_ECHOLNPGM(#x); break
switch (task_state) {
UHS_USB_DEBUG(IDLE);
UHS_USB_DEBUG(RESET_DEVICE);
UHS_USB_DEBUG(RESET_NOT_COMPLETE);
UHS_USB_DEBUG(DEBOUNCE);
UHS_USB_DEBUG(DEBOUNCE_NOT_COMPLETE);
UHS_USB_DEBUG(WAIT_SOF);
UHS_USB_DEBUG(ERROR);
UHS_USB_DEBUG(CONFIGURING);
UHS_USB_DEBUG(CONFIGURING_DONE);
UHS_USB_DEBUG(RUNNING);
default:
SERIAL_ECHOLNPAIR("UHS_USB_HOST_STATE: ", task_state);
break;
}
}
}
#endif
static millis_t next_state_ms = millis();
#define GOTO_STATE_AFTER_DELAY(STATE, DELAY) do{ state = STATE; next_state_ms = millis() + DELAY; }while(0)
if (ELAPSED(millis(), next_state_ms)) {
GOTO_STATE_AFTER_DELAY(state, 250); // Default delay
switch (state) {
case USB_HOST_DELAY_INIT:
next_retry = millis() + 2000;
state = USB_HOST_WAITING;
break;
case USB_HOST_WAITING:
if (ELAPSED(millis(), next_retry)) {
next_retry = millis() + 2000;
state = USB_HOST_UNINITIALIZED;
}
break;
case USB_HOST_UNINITIALIZED:
SERIAL_ECHOPGM("Starting USB host...");
if (!usb.start()) {
SERIAL_ECHOPGM(" Failed. Retrying in 2s.");
#if HAS_DISPLAY
LCD_MESSAGEPGM("USB start failed");
#endif
state = USB_HOST_DELAY_INIT;
}
else
state = USB_HOST_INITIALIZED;
SERIAL_EOL();
break;
case USB_HOST_INITIALIZED:
const uint8_t lastUsbTaskState = usb.getUsbTaskState();
usb.Task();
const uint8_t newUsbTaskState = usb.getUsbTaskState();
if (lastUsbTaskState == USB_STATE_RUNNING && newUsbTaskState != USB_STATE_RUNNING) {
// the user pulled the flash drive. Make sure the bulk storage driver releases the address
#ifdef USB_DEBUG
SERIAL_ECHOLNPGM("USB drive removed");
case UNINITIALIZED:
#ifndef MANUAL_USB_STARTUP
GOTO_STATE_AFTER_DELAY( DO_STARTUP, USB_STARTUP_DELAY );
#endif
//bulk.Release();
}
if (lastUsbTaskState != USB_STATE_RUNNING && newUsbTaskState == USB_STATE_RUNNING) {
#ifdef USB_DEBUG
SERIAL_ECHOLNPGM("USB drive inserted");
break;
case DO_STARTUP: usbStartup(); break;
case WAIT_FOR_DEVICE:
if (task_state == UHS_STATE(RUNNING)) {
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("USB device inserted");
#endif
GOTO_STATE_AFTER_DELAY( WAIT_FOR_LUN, 250 );
}
break;
case WAIT_FOR_LUN:
/* USB device is inserted, but if it is an SD card,
* adapter it may not have an SD card in it yet. */
if (bulk.LUNIsGood(0)) {
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("LUN is good");
#endif
GOTO_STATE_AFTER_DELAY( MEDIA_READY, 100 );
}
else {
#ifdef USB_HOST_MANUAL_POLL
// Make sure we catch disconnect events
usb.busprobe();
usb.VBUS_changed();
#endif
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("Waiting for media");
#endif
#if EITHER(ULTRA_LCD, EXTENSIBLE_UI)
LCD_MESSAGEPGM("Waiting for media");
#endif
GOTO_STATE_AFTER_DELAY(state, 2000);
}
break;
case MEDIA_READY: break;
case MEDIA_ERROR: break;
}
if (state > WAIT_FOR_DEVICE && task_state != UHS_STATE(RUNNING)) {
// Handle device removal events
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("USB device removed");
#endif
#if EITHER(ULTRA_LCD, EXTENSIBLE_UI)
if (state != MEDIA_READY)
LCD_MESSAGEPGM("USB device removed");
#endif
GOTO_STATE_AFTER_DELAY( WAIT_FOR_DEVICE, 0 );
}
else if (state > WAIT_FOR_LUN && !bulk.LUNIsGood(0)) {
// Handle media removal events
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("Media removed");
#endif
#if EITHER(ULTRA_LCD, EXTENSIBLE_UI)
LCD_MESSAGEPGM("Media removed");
#endif
GOTO_STATE_AFTER_DELAY( WAIT_FOR_DEVICE, 0 );
}
else if (task_state == UHS_STATE(ERROR)) {
#if EITHER(ULTRA_LCD, EXTENSIBLE_UI)
LCD_MESSAGEPGM("Media read error");
#endif
GOTO_STATE_AFTER_DELAY( MEDIA_ERROR, 0 );
}
}
}
// Marlin calls this function to check whether an USB drive is inserted.
// This is equivalent to polling the SD_DETECT when using SD cards.
bool Sd2Card::isInserted() {
return usb.getUsbTaskState() == USB_STATE_RUNNING;
return state == MEDIA_READY;
}
bool Sd2Card::ready() {
return state > DO_STARTUP;
}
// Marlin calls this to initialize an SD card once it is inserted.
bool Sd2Card::init(const uint8_t sckRateID/*=0*/, const pin_t chipSelectPin/*=SD_CHIP_SELECT_PIN*/) {
if (!ready()) return false;
if (!bulk.LUNIsGood(0)) {
SERIAL_ECHOLNPGM("LUN zero is not good");
return false;
}
bool Sd2Card::init(const uint8_t, const pin_t) {
if (!isInserted()) return false;
#if USB_DEBUG >= 1
const uint32_t sectorSize = bulk.GetSectorSize(0);
if (sectorSize != 512) {
SERIAL_ECHOLNPAIR("Expecting sector size of 512. Got: ", sectorSize);
return false;
}
#endif
#ifdef USB_DEBUG
#if USB_DEBUG >= 3
lun0_capacity = bulk.GetCapacity(0);
SERIAL_ECHOLNPAIR("LUN Capacity (in blocks): ", lun0_capacity);
#endif
@ -123,8 +287,8 @@ bool Sd2Card::init(const uint8_t sckRateID/*=0*/, const pin_t chipSelectPin/*=SD
// Returns the capacity of the card in blocks.
uint32_t Sd2Card::cardSize() {
if (!ready()) return 0;
#ifndef USB_DEBUG
if (!isInserted()) return false;
#if USB_DEBUG < 3
const uint32_t
#endif
lun0_capacity = bulk.GetCapacity(0);
@ -132,13 +296,13 @@ uint32_t Sd2Card::cardSize() {
}
bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) {
if (!ready()) return false;
#ifdef USB_DEBUG
if (!isInserted()) return false;
#if USB_DEBUG >= 3
if (block >= lun0_capacity) {
SERIAL_ECHOLNPAIR("Attempt to read past end of LUN: ", block);
return false;
}
#if USB_DEBUG > 1
#if USB_DEBUG >= 4
SERIAL_ECHOLNPAIR("Read block ", block);
#endif
#endif
@ -146,13 +310,13 @@ bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) {
}
bool Sd2Card::writeBlock(uint32_t block, const uint8_t* src) {
if (!ready()) return false;
#ifdef USB_DEBUG
if (!isInserted()) return false;
#if USB_DEBUG >= 3
if (block >= lun0_capacity) {
SERIAL_ECHOLNPAIR("Attempt to write past end of LUN: ", block);
return false;
}
#if USB_DEBUG > 1
#if USB_DEBUG >= 4
SERIAL_ECHOLNPAIR("Write block ", block);
#endif
#endif

View file

@ -26,12 +26,6 @@
* \brief Sd2Card class for V2 SD/SDHC cards
*/
/* Uncomment USB_DEBUG to enable debugging.
* 1 - basic debugging and bounds checking
* 2 - print each block access
*/
//#define USB_DEBUG 1
#include "../SdFatConfig.h"
#include "../SdInfo.h"
@ -52,24 +46,13 @@
class Sd2Card {
private:
typedef enum : uint8_t {
USB_HOST_UNINITIALIZED,
USB_HOST_INITIALIZED,
USB_HOST_DELAY_INIT,
USB_HOST_WAITING
} state_t;
static state_t state;
uint32_t pos;
#ifdef USB_DEBUG
uint32_t lun0_capacity;
#endif
static inline bool ready() { return state == USB_HOST_INITIALIZED; }
static void usbStateDebug();
public:
static bool usbStartup();
bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=SD_CHIP_SELECT_PIN);
static void idle();
@ -87,4 +70,5 @@ class Sd2Card {
uint32_t cardSize();
static bool isInserted();
static bool ready();
};

View file

@ -1,15 +1,4 @@
==== SUMMARY ====
Source Path: Repository: License:
------------ ----------- --------
usb_flashdrive/lib github.com/felis/USB_Host_Shield_2.0 GPLv2 or later
usb_flashdrive/lib/masstorage.cpp [1] github.com/greiman/UsbFat MIT
usb_flashdrive/lib/settings.h [1] github.com/greiman/UsbFat MIT
[1] Changes related to SKIP_WRITE_PROTECT and DELAY only
==== USB HOST SHIELD 2.0 LIBRARY ====
The lib/ folder contains a subset of the files from the USB Host Shield 2.0
@ -26,6 +15,15 @@ files needed for Marlin as "GPLv2 or later", as documented in this thread.
Small modifications have been made to the source. Please search for
USB_FLASH_DRIVE_SUPPORT or look at the patch file to see what was changed.
==== LICENSE SUMMARY ====
Source Path: Repository: License:
------------ ----------- --------
lib-uhs3/ github.com/felis/USB_Host_Shield_2.0 GPLv2 or later
lib-uhs3/lib/masstorage.cpp github.com/greiman/UsbFat [1] MIT
lib-uhs3/lib/settings.h github.com/greiman/UsbFat [1] MIT
[1] Changes related to SKIP_WRITE_PROTECT and DELAY only
==== PERFORMANCE ENHANCEMENTS FOR USB DRIVES ====

View file

@ -26,7 +26,7 @@
#include "../../../inc/MarlinConfigPre.h"
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB)
#include "Usb.h"

View file

@ -45,8 +45,7 @@
#include "address.h"
//#include "avrpins.h"
#include "usb_ch9.h"
//#include "usbhost.h"
#include "../usb_host.h"
#include "usbhost.h"
#include "UsbCore.h"
#include "parsetools.h"
#include "confdescparser.h"

View file

@ -25,7 +25,7 @@
#include "../../../inc/MarlinConfigPre.h"
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB)
#include "masstorage.h"
@ -762,7 +762,7 @@ uint8_t BulkOnly::Page3F(uint8_t lun) {
buf[i] = 0x00;
}
WriteOk[lun] = true;
#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && defined(SKIP_WRITE_PROTECT)
#ifdef SKIP_WRITE_PROTECT
return 0;
#endif
uint8_t rc = ModeSense6(lun, 0, 0x3f, 0, 192, buf);

View file

@ -191,6 +191,15 @@
#define bmSNDTOG1 0x80
#define rHXFR 0xf0 //30<<3
#undef tokSETUP
#undef tokIN
#undef tokOUT
#undef tokINHS
#undef tokOUTHS
#undef tokISOIN
#undef tokISOOUT
/* Host transfer token values for writing the HXFR register (R30) */
/* OR this bit field with the endpoint number in bits 3:0 */
#define tokSETUP 0x10 // HS=0, ISO=0, OUTNIN=0, SETUP=1

View file

@ -25,7 +25,7 @@
#include "../../../inc/MarlinConfigPre.h"
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB)
#include "Usb.h"

View file

@ -25,7 +25,7 @@
#include "../../../inc/MarlinConfigPre.h"
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB)
#include "Usb.h"

View file

@ -23,12 +23,12 @@
* lib/usbhost.c". This has been rewritten to use SPI routines from the
* Marlin HAL */
#include "../../inc/MarlinConfigPre.h"
#include "../../../inc/MarlinConfigPre.h"
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB)
#include "lib/Usb.h"
#include "usb_host.h"
#include "Usb.h"
#include "usbhost.h"
uint8_t MAX3421e::vbusState = 0;

View file

@ -0,0 +1,31 @@
==== USB HOST SHIELD 3.0 LIBRARY ====
The lib-uhs3/ folder contains a subset of the files from the USB Host Shield
3.0 library:
https://github.com/felis/UHS30
==== LICENSE SUMMARY ====
Source Path: Repository: License:
------------ ----------- --------
usb_flashdrive/lib github.com/felis/UHS30 GPLv2 or later
==== MARLIN INTEGRATION WORK ====
All additional work done to integrate USB into Marlin was performed by
AlephObjects, Inc. and is licensed under the GPLv3.
This version of UHS3 has been modified for better compatibility with Marlin.
The upstream version of UHS 3.0 runs a frame timer interrupt every 1 ms to
handle device polling. This timer interrupt interferes with Marlin's stepper
IRQ, so the flag USB_HOST_MANUAL_POLL has been added to move the polling to
the idle task. Additional logic was added to disable and enable the frame
IRQ.
SKIP_PAGE3F and USB_NO_TEST_UNIT_READY were added to work around bugs with
certain devices.
-- marcio@alephobjects.com

View file

@ -0,0 +1,249 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(__UHS_BULK_STORAGE_H__)
#define __UHS_BULK_STORAGE_H__
////////////////////////////////////////////////////////////////////////////////
// Define any of these options at the top of your sketch to override
// the defaults contained herewith. Do NOT do modifications here.
// Macro | Settings and notes | Default
// -----------------------------------------+-----------------------+-----------
// | 1 to 8 |
// | Each LUN needs |
// MASS_MAX_SUPPORTED_LUN | ~13 bytes to be able | 8
// | to track the state of |
// | each unit. |
// -----------------------------------------+-----------------------+-----------
// | Just define to use. |
// DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE | works only if extra |
// | huge debug is on too. |
// -----------------------------------------^-----------------------^-----------
#ifndef MASS_MAX_SUPPORTED_LUN
#define MASS_MAX_SUPPORTED_LUN 8
#endif
#include "UHS_SCSI.h"
#define UHS_BULK_bmREQ_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
#define UHS_BULK_bmREQ_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
// Request Codes
#define UHS_BULK_REQ_ADSC 0x00U
#define UHS_BULK_REQ_GET 0xFCU
#define UHS_BULK_REQ_PUT 0xFDU
#define UHS_BULK_REQ_GET_MAX_LUN 0xFEU
#define UHS_BULK_REQ_BOMSR 0xFFU // Mass Storage Reset
#define UHS_BULK_CBW_SIGNATURE 0x43425355LU
#define UHS_BULK_CSW_SIGNATURE 0x53425355LU
#define UHS_BULK_CMD_DIR_OUT 0x00U
#define UHS_BULK_CMD_DIR_IN 0x80U
/* Bulk error codes */
#define UHS_BULK_ERR_SUCCESS UHS_HOST_ERROR_NONE
#define UHS_BULK_ERR_PHASE_ERROR 0x22U
#define UHS_BULK_ERR_UNIT_NOT_READY 0x23U
#define UHS_BULK_ERR_UNIT_BUSY 0x24U
#define UHS_BULK_ERR_STALL 0x25U
#define UHS_BULK_ERR_CMD_NOT_SUPPORTED 0x26U
#define UHS_BULK_ERR_INVALID_CSW 0x27U
#define UHS_BULK_ERR_NO_MEDIA 0x28U
#define UHS_BULK_ERR_BAD_LBA 0x29U
#define UHS_BULK_ERR_MEDIA_CHANGED 0x2AU
#define UHS_BULK_ERR_DEVICE_DISCONNECTED UHS_HOST_ERROR_UNPLUGGED
#define UHS_BULK_ERR_UNABLE_TO_RECOVER 0x32U // Reset recovery error
#define UHS_BULK_ERR_INVALID_LUN 0x33U
#define UHS_BULK_ERR_WRITE_STALL 0x34U
#define UHS_BULK_ERR_READ_NAKS 0x35U
#define UHS_BULK_ERR_WRITE_NAKS 0x36U
#define UHS_BULK_ERR_WRITE_PROTECTED 0x37U
#define UHS_BULK_ERR_NOT_IMPLEMENTED 0xFDU
#define UHS_BULK_ERR_GENERAL_SCSI_ERROR 0xF0U
#define UHS_BULK_ERR_GENERAL_USB_ERROR 0xFFU
#define UHS_BULK_ERR_USER 0xA0U // For subclasses to define their own error codes
#define MASS_MAX_ENDPOINTS 3
struct UHS_BULK_CommandBlockWrapperBase {
volatile uint32_t dCBWSignature;
volatile uint32_t dCBWTag;
volatile uint32_t dCBWDataTransferLength;
volatile uint8_t bmCBWFlags;
public:
UHS_BULK_CommandBlockWrapperBase(void) {
}
UHS_BULK_CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs) :
dCBWSignature(UHS_BULK_CBW_SIGNATURE), dCBWTag(tag), dCBWDataTransferLength(xflen), bmCBWFlags(flgs) {
}
} __attribute__((packed));
struct UHS_BULK_CommandBlockWrapper : public UHS_BULK_CommandBlockWrapperBase {
struct {
uint8_t bmCBWLUN : 4;
uint8_t bmReserved1 : 4;
};
struct {
uint8_t bmCBWCBLength : 4;
uint8_t bmReserved2 : 4;
};
uint8_t CBWCB[16];
public:
// All zeroed.
UHS_BULK_CommandBlockWrapper() :
UHS_BULK_CommandBlockWrapperBase(0, 0, 0), bmReserved1(0), bmReserved2(0) {
for(int i = 0; i < 16; i++) CBWCB[i] = 0;
}
// Generic Wrap, CDB zeroed.
UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd) :
UHS_BULK_CommandBlockWrapperBase(tag, xflen, flgs),
bmCBWLUN(lu), bmReserved1(0), bmCBWCBLength(cmdlen), bmReserved2(0) {
for(int i = 0; i < 16; i++) CBWCB[i] = 0;
SCSI_CDB_BASE_t *x = reinterpret_cast<SCSI_CDB_BASE_t *>(CBWCB);
x->LUN = cmd;
}
// Wrap for CDB of 6
UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, SCSI_CDB6_t *cdb, uint8_t dir) :
UHS_BULK_CommandBlockWrapperBase(tag, xflen, dir),
bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(6), bmReserved2(0) {
memcpy(&CBWCB, cdb, 6);
}
// Wrap for CDB of 10
UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, SCSI_CDB10_t *cdb, uint8_t dir) :
UHS_BULK_CommandBlockWrapperBase(tag, xflen, dir),
bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(10), bmReserved2(0) {
memcpy(&CBWCB, cdb, 10);
}
} __attribute__((packed));
struct UHS_BULK_CommandStatusWrapper {
uint32_t dCSWSignature;
uint32_t dCSWTag;
uint32_t dCSWDataResidue;
uint8_t bCSWStatus;
} __attribute__((packed));
class UHS_Bulk_Storage : public UHS_USBInterface {
protected:
static const uint8_t epDataInIndex = 1; // DataIn endpoint index
static const uint8_t epDataOutIndex = 2; // DataOUT endpoint index
static const uint8_t epInterruptInIndex = 3; // InterruptIN endpoint index
uint8_t bMaxLUN; // Max LUN
volatile uint32_t dCBWTag; // Tag
volatile uint8_t bTheLUN; // Active LUN
volatile uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]; // Total sectors
volatile uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits
volatile bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes.
volatile bool WriteOk[MASS_MAX_SUPPORTED_LUN];
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
public:
UHS_Bulk_Storage(UHS_USB_HOST_BASE *p);
volatile UHS_EpInfo epInfo[MASS_MAX_ENDPOINTS];
uint8_t GetbMaxLUN(void) {
return bMaxLUN; // Max LUN
}
uint8_t GetbTheLUN(void) {
return bTheLUN; // Active LUN
}
bool WriteProtected(uint8_t lun);
uint8_t MediaCTL(uint8_t lun, uint8_t ctl);
uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf);
uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf);
uint8_t LockMedia(uint8_t lun, uint8_t lock);
bool LUNIsGood(uint8_t lun);
uint32_t GetCapacity(uint8_t lun);
uint16_t GetSectorSize(uint8_t lun);
uint8_t SCSITransaction6(SCSI_CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir);
uint8_t SCSITransaction10(SCSI_CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir);
// Configure and internal methods, these should never be called by a user's sketch.
uint8_t Start(void);
bool OKtoEnumerate(ENUMERATION_INFO *ei);
uint8_t SetInterface(ENUMERATION_INFO *ei);
uint8_t GetAddress(void) {
return bAddress;
};
void Poll(void);
void DriverDefaults(void);
private:
void Reset(void);
void CheckMedia(void);
bool IsValidCBW(uint8_t size, uint8_t *pcbw);
bool IsMeaningfulCBW(uint8_t size, uint8_t *pcbw);
bool IsValidCSW(UHS_BULK_CommandStatusWrapper *pcsw, UHS_BULK_CommandBlockWrapperBase *pcbw);
bool CheckLUN(uint8_t lun);
uint8_t Inquiry(uint8_t lun, uint16_t size, uint8_t *buf);
uint8_t TestUnitReady(uint8_t lun);
uint8_t RequestSense(uint8_t lun, uint16_t size, uint8_t *buf);
uint8_t ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t *buf);
uint8_t GetMaxLUN(uint8_t *max_lun);
uint8_t SetCurLUN(uint8_t lun);
uint8_t ResetRecovery();
uint8_t ReadCapacity10(uint8_t lun, uint8_t *buf);
uint8_t Page3F(uint8_t lun);
uint8_t ClearEpHalt(uint8_t index);
uint8_t Transaction(UHS_BULK_CommandBlockWrapper *cbw, uint16_t bsize, void *buf);
uint8_t HandleUsbError(uint8_t error, uint8_t index);
uint8_t HandleSCSIError(uint8_t status);
};
#if defined(LOAD_UHS_BULK_STORAGE) && !defined(UHS_BULK_STORAGE_LOADED)
#include "UHS_BULK_STORAGE_INLINE.h"
#endif
#endif // __MASSTORAGE_H__

View file

@ -0,0 +1,1210 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if defined(LOAD_UHS_BULK_STORAGE) && defined(__UHS_BULK_STORAGE_H__) && !defined(UHS_BULK_STORAGE_LOADED)
#define UHS_BULK_STORAGE_LOADED
// uncomment to get 'printf' console debugging. NOT FOR UNO!
//#define DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE
#if DEBUG_PRINTF_EXTRA_HUGE
#ifdef DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE
#define BS_HOST_DEBUG(...) printf(__VA_ARGS__)
#else
#define BS_HOST_DEBUG(...) VOID0
#endif
#else
#define BS_HOST_DEBUG(...) VOID0
#endif
////////////////////////////////////////////////////////////////////////////////
// Interface code
////////////////////////////////////////////////////////////////////////////////
/**
* Get the capacity of the media
*
* @param lun Logical Unit Number
* @return media capacity
*/
uint32_t UHS_NI UHS_Bulk_Storage::GetCapacity(uint8_t lun) {
uint32_t v = 0LU;
pUsb->DisablePoll();
if(LUNOk[lun])
v = CurrentCapacity[lun];
pUsb->EnablePoll();
return v;
}
/**
* Get the sector (block) size used on the media
*
* @param lun Logical Unit Number
* @return media sector size
*/
uint16_t UHS_NI UHS_Bulk_Storage::GetSectorSize(uint8_t lun) {
uint16_t v = 0U;
pUsb->DisablePoll();
if(LUNOk[lun])
v = CurrentSectorSize[lun];
pUsb->EnablePoll();
return v;
}
/**
* Test if LUN is ready for use
*
* @param lun Logical Unit Number
* @return true if LUN is ready for use
*/
bool UHS_NI UHS_Bulk_Storage::LUNIsGood(uint8_t lun) {
bool v;
pUsb->DisablePoll();
v = LUNOk[lun];
pUsb->EnablePoll();
return v;
}
/**
* Test if LUN is write protected
*
* @param lun Logical Unit Number
* @return cached status of write protect switch
*/
bool UHS_NI UHS_Bulk_Storage::WriteProtected(uint8_t lun) {
bool v;
pUsb->DisablePoll();
v = WriteOk[lun];
pUsb->EnablePoll();
return v;
}
/**
* Wrap and execute a SCSI CDB with length of 6
*
* @param cdb CDB to execute
* @param buf_size Size of expected transaction
* @param buf Buffer
* @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::SCSITransaction6(SCSI_CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
pUsb->DisablePoll();
// promote buf_size to 32bits.
UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir);
#if 0
// Lets check the CBW here:
printf("\r\n");
printf("\r\n");
uint8_t *dump = (uint8_t*)(&cbw);
for(int i=0; i<(sizeof (UHS_BULK_CommandBlockWrapper)); i++) {
printf("%02.2x ", *dump);
dump++;
}
printf("\r\n");
printf("\r\n");
#endif
uint8_t v = (HandleSCSIError(Transaction(&cbw, buf_size, buf)));
pUsb->EnablePoll();
return v;
}
/**
* Wrap and execute a SCSI CDB with length of 10
*
* @param cdb CDB to execute
* @param buf_size Size of expected transaction
* @param buf Buffer
* @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::SCSITransaction10(SCSI_CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
pUsb->DisablePoll();
// promote buf_size to 32bits.
UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir);
//SetCurLUN(cdb->LUN);
uint8_t v = (HandleSCSIError(Transaction(&cbw, buf_size, buf)));
pUsb->EnablePoll();
return v;
}
/**
* Lock or Unlock the tray or door on device.
* Caution: Some devices with buggy firmware will lock up.
*
* @param lun Logical Unit Number
* @param lock 1 to lock, 0 to unlock
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::LockMedia(uint8_t lun, uint8_t lock) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
pUsb->DisablePoll();
Notify(PSTR("\r\nLockMedia\r\n"), 0x80);
Notify(PSTR("---------\r\n"), 0x80);
SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_PREVENT_REMOVAL, lun, (uint8_t)0, lock);
uint8_t v = SCSITransaction6(&cdb, (uint16_t)0, NULL, (uint8_t)UHS_BULK_CMD_DIR_IN);
pUsb->EnablePoll();
return v;
}
/**
* Media control, for spindle motor and media tray or door.
* This includes CDROM, TAPE and anything with a media loader.
*
* @param lun Logical Unit Number
* @param ctl 0x00 Stop Motor, 0x01 Start Motor, 0x02 Eject Media, 0x03 Load Media
* @return 0 on success
*/
uint8_t UHS_NI UHS_Bulk_Storage::MediaCTL(uint8_t lun, uint8_t ctl) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
pUsb->DisablePoll();
Notify(PSTR("\r\nMediaCTL\r\n"), 0x80);
Notify(PSTR("-----------------\r\n"), 0x80);
uint8_t rcode = UHS_BULK_ERR_UNIT_NOT_READY;
if(bAddress) {
SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_START_STOP_UNIT, lun, ctl & 0x03, 0);
rcode = SCSITransaction6(&cdb, (uint16_t)0, NULL, (uint8_t)UHS_BULK_CMD_DIR_OUT);
} else {
SetCurLUN(lun);
}
pUsb->EnablePoll();
return rcode;
}
/**
* Read data from media
*
* @param lun Logical Unit Number
* @param addr LBA address on media to read
* @param bsize size of a block (we should probably use the cached size)
* @param blocks how many blocks to read
* @param buf memory that is able to hold the requested data
* @return 0 on success
*/
uint8_t UHS_NI UHS_Bulk_Storage::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) {
if(!bAddress) return UHS_BULK_ERR_NO_MEDIA;
uint8_t er = UHS_BULK_ERR_NO_MEDIA;
pUsb->DisablePoll();
if(LUNOk[lun]) {
Notify(PSTR("\r\nRead LUN:\t"), 0x80);
D_PrintHex<uint8_t > (lun, 0x90);
Notify(PSTR("\r\nLBA:\t\t"), 0x90);
D_PrintHex<uint32_t > (addr, 0x90);
Notify(PSTR("\r\nblocks:\t\t"), 0x90);
D_PrintHex<uint8_t > (blocks, 0x90);
Notify(PSTR("\r\nblock size:\t"), 0x90);
D_PrintHex<uint16_t > (bsize, 0x90);
Notify(PSTR("\r\n---------\r\n"), 0x80);
SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_READ_10, lun, blocks, addr);
again:
er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), buf, (uint8_t)UHS_BULK_CMD_DIR_IN);
if(er == UHS_BULK_ERR_STALL) {
MediaCTL(lun, 1);
if(UHS_SLEEP_MS(150)) {
if(!TestUnitReady(lun)) goto again;
}
}
}
qNextPollTime = millis() + 100;
pUsb->EnablePoll();
return er;
}
/**
* Write data to media
*
* @param lun Logical Unit Number
* @param addr LBA address on media to write
* @param bsize size of a block (we should probably use the cached size)
* @param blocks how many blocks to write
* @param buf memory that contains the data to write
* @return 0 on success
*/
uint8_t UHS_NI UHS_Bulk_Storage::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) {
if(!bAddress) return UHS_BULK_ERR_NO_MEDIA;
uint8_t er = UHS_BULK_ERR_NO_MEDIA;
pUsb->DisablePoll();
if(LUNOk[lun]) {
if(!WriteOk[lun]) {
er = UHS_BULK_ERR_WRITE_PROTECTED;
} else {
Notify(PSTR("\r\nWrite LUN:\t"), 0x80);
D_PrintHex<uint8_t > (lun, 0x90);
Notify(PSTR("\r\nLBA:\t\t"), 0x90);
D_PrintHex<uint32_t > (addr, 0x90);
Notify(PSTR("\r\nblocks:\t\t"), 0x90);
D_PrintHex<uint8_t > (blocks, 0x90);
Notify(PSTR("\r\nblock size:\t"), 0x90);
D_PrintHex<uint16_t > (bsize, 0x90);
Notify(PSTR("\r\n---------\r\n"), 0x80);
SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_WRITE_10, lun, blocks, addr);
again:
er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), (void*)buf, (uint8_t)UHS_BULK_CMD_DIR_OUT);
if(er == UHS_BULK_ERR_WRITE_STALL) {
MediaCTL(lun, 1);
if(UHS_SLEEP_MS(150)) {
if(!TestUnitReady(lun)) goto again;
}
}
}
}
qNextPollTime = millis() + 100;
pUsb->EnablePoll();
return er;
}
// End of user functions, the remaining code below is driver internals.
// Only developer serviceable parts below!
////////////////////////////////////////////////////////////////////////////////
// Main driver code
////////////////////////////////////////////////////////////////////////////////
UHS_NI UHS_Bulk_Storage::UHS_Bulk_Storage(UHS_USB_HOST_BASE *p) {
pUsb = p;
dCBWTag = 0;
if(pUsb) {
DriverDefaults();
pUsb->RegisterDeviceClass(this);
// Serial.print("Bulk Register to USB Host @ 0x");
// Serial.println((uint32_t)pUsb, HEX);
// Serial.print("Bulk Register to USB Host Address Pool @ 0x");
// Serial.println((uint32_t)pUsb->GetAddressPool(), HEX);
}
}
/**
*
* @param ei Enumeration information
* @return true if this interface driver can handle this interface description
*/
bool UHS_NI UHS_Bulk_Storage::OKtoEnumerate(ENUMERATION_INFO *ei) {
BS_HOST_DEBUG("BulkOnly: checking numep %i, klass %2.2x, subklass %2.2x\r\n", ei->interface.numep, ei->klass, ei->subklass);
BS_HOST_DEBUG("BulkOnly: checking protocol %2.2x, interface.klass %2.2x, interface.subklass %2.2x\r\n", ei->protocol, ei->interface.klass, ei->interface.subklass);
BS_HOST_DEBUG("BulkOnly: checking interface.protocol %2.2x\r\n", ei->interface.protocol);
//
// TO-DO?
// Check that we have 2 bulk endpoints, and one in each direction??
// e.g. (ei->interface.numep > 1) && // two or more endpoints AND check types
// This will work with proper hardware though.
//
return (
((ei->klass == UHS_USB_CLASS_MASS_STORAGE) || (ei->interface.klass == UHS_USB_CLASS_MASS_STORAGE)) && // mass storage class AND
((ei->subklass == UHS_BULK_SUBCLASS_SCSI) || (ei->interface.subklass == UHS_BULK_SUBCLASS_SCSI)) && // SCSI command set AND
((ei->protocol == UHS_STOR_PROTO_BBB) || (ei->interface.protocol == UHS_STOR_PROTO_BBB)) // Bulk Only transport
);
}
/**
* @param ei Enumeration information
* @return 0 always
*/
uint8_t UHS_NI UHS_Bulk_Storage::SetInterface(ENUMERATION_INFO *ei) {
uint8_t index;
bAddress = ei->address;
BS_HOST_DEBUG("BS SetInterface\r\n");
// Fill in the endpoint info structure
for(uint8_t ep = 0; ep < ei->interface.numep; ep++) {
BS_HOST_DEBUG("ep: 0x%2.2x bmAttributes: 0x%2.2x ", ep, ei->interface.epInfo[ep].bmAttributes);
if(ei->interface.epInfo[ep].bmAttributes == USB_TRANSFER_TYPE_BULK) {
index = ((ei->interface.epInfo[ep].bEndpointAddress & USB_TRANSFER_DIRECTION_IN) == USB_TRANSFER_DIRECTION_IN) ? epDataInIndex : epDataOutIndex;
epInfo[index].epAddr = (ei->interface.epInfo[ep].bEndpointAddress & 0x0F);
epInfo[index].maxPktSize = ei->interface.epInfo[ep].wMaxPacketSize;
epInfo[index].epAttribs = 0;
epInfo[index].bmNakPower = UHS_USB_NAK_MAX_POWER;
epInfo[index].bmSndToggle = 0;
epInfo[index].bmRcvToggle = 0;
epInfo[index].bIface=ei->interface.bInterfaceNumber;
BS_HOST_DEBUG("index: %i\r\n", index);
}
BS_HOST_DEBUG("\r\n");
}
bNumEP = 3;
epInfo[0].epAddr = 0;
epInfo[0].maxPktSize = ei->bMaxPacketSize0;
epInfo[0].bmNakPower = UHS_USB_NAK_MAX_POWER;
bIface = ei->interface.bInterfaceNumber;
return 0;
};
/**
*
* @return 0 for success
*/
uint8_t UHS_NI UHS_Bulk_Storage::Start(void) {
uint8_t rcode;
// Serial.print("Bulk Start from USB Host @ 0x");
// Serial.println((uint32_t)pUsb, HEX);
// Serial.print("Bulk Start USB Host Address Pool @ 0x");
// Serial.println((uint32_t)pUsb->GetAddressPool(), HEX);
BS_HOST_DEBUG("BS Start, speed: %i\r\n", pUsb->GetAddressPool()->GetUsbDevicePtr(bAddress)->speed);
BS_HOST_DEBUG("BS Start\r\n");
rcode = pUsb->setEpInfoEntry(bAddress, bIface, 3, epInfo);
// Serial.println(rcode,HEX);
if(rcode) goto FailOnInit;
// Do a 1 second delay before LUN query
if(!UHS_SLEEP_MS(1000)) goto FailUnPlug;
rcode = GetMaxLUN(&bMaxLUN);
BS_HOST_DEBUG("GetMaxLUN 0x%2.2x\r\n", rcode);
if(rcode) {
goto FailGetMaxLUN;
}
if(bMaxLUN >= MASS_MAX_SUPPORTED_LUN) bMaxLUN = MASS_MAX_SUPPORTED_LUN - 1;
BS_HOST_DEBUG("MaxLUN %u\r\n", bMaxLUN);
//ErrorMessage<uint8_t > (PSTR("MaxLUN"), bMaxLUN);
if(!UHS_SLEEP_MS(150)) goto FailUnPlug; // Delay a bit for slow firmware. (again)
for(uint8_t lun = 0; lun <= bMaxLUN; lun++) {
if(!UHS_SLEEP_MS(3)) goto FailUnPlug;
SCSI_Inquiry_Response response;
rcode = Inquiry(lun, sizeof (SCSI_Inquiry_Response), (uint8_t*) & response);
BS_HOST_DEBUG("Inquiry 0x%2.2x 0x%2.2x\r\n", sizeof (SCSI_Inquiry_Response), rcode);
if(rcode) {
goto FailInquiry;
#if 0
} else {
BS_HOST_DEBUG("LUN %i `", lun);
uint8_t *buf = response.VendorID;
for(int i = 0; i < 28; i++) BS_HOST_DEBUG("%c", buf[i]);
BS_HOST_DEBUG("'\r\nQualifier %1.1X ", response.PeripheralQualifier);
BS_HOST_DEBUG("Device type %2.2X ", response.DeviceType);
BS_HOST_DEBUG("RMB %1.1X ", response.Removable);
BS_HOST_DEBUG("SSCS %1.1X ", response.SCCS);
uint8_t sv = response.Version;
BS_HOST_DEBUG("SCSI version %2.2X\r\nDevice conforms to ", sv);
switch(sv) {
case 0:
BS_HOST_DEBUG("No specific");
break;
case 1:
BS_HOST_DEBUG("ANSI X3.131-1986 (ANSI 1)");
break;
case 2:
BS_HOST_DEBUG("ANSI X3.131-1994 (ANSI 2)");
break;
case 3:
BS_HOST_DEBUG("ANSI INCITS 301-1997 (SPC)");
break;
case 4:
BS_HOST_DEBUG("ANSI INCITS 351-2001 (SPC-2)");
break;
case 5:
BS_HOST_DEBUG("ANSI INCITS 408-2005 (SPC-4)");
break;
case 6:
BS_HOST_DEBUG("T10/1731-D (SPC-4)");
break;
default:
BS_HOST_DEBUG("unknown");
}
BS_HOST_DEBUG(" standards.\r\n");
#endif
}
}
for(uint8_t lun = 0; lun <= bMaxLUN; lun++) {
if(!UHS_SLEEP_MS(3)) goto FailUnPlug;
#ifndef USB_NO_TEST_UNIT_READY
uint8_t tries = 0xf0;
while((rcode = TestUnitReady(lun))) {
BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xf0, rcode);
if(rcode == 0x08) break; // break on no media, this is OK to do.
if(rcode == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug;
if(rcode == UHS_BULK_ERR_INVALID_CSW) goto Fail;
if(rcode != UHS_BULK_ERR_MEDIA_CHANGED) goto Fail;
if(!UHS_SLEEP_MS(2 * (tries + 1))) goto FailUnPlug;
tries++;
if(!tries) break;
}
#else
// Don't wait for the LUN to become ready, as this will
// trigger Marlin's watchdog timer
rcode = -1;
#endif
if(!UHS_SLEEP_MS(3)) goto FailUnPlug;
LockMedia(lun, 1);
if(rcode == 0x08) {
if(!UHS_SLEEP_MS(3)) goto FailUnPlug;
if(MediaCTL(lun, 1) == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug; // I actually have a USB stick that needs this!
}
BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xf0, rcode);
if(!rcode) {
if(!UHS_SLEEP_MS(3)) goto FailUnPlug;
BS_HOST_DEBUG("CheckLUN...\r\n");
BS_HOST_DEBUG("%lu\r\n", millis()/1000);
// Stalls on ***some*** devices, ***WHY***?! Device SAID it is READY!!
LUNOk[lun] = CheckLUN(lun);
BS_HOST_DEBUG("%lu\r\n", millis()/1000);
if(!LUNOk[lun]) LUNOk[lun] = CheckLUN(lun);
if(!UHS_SLEEP_MS(1)) goto FailUnPlug;
BS_HOST_DEBUG("Checked LUN...\r\n");
} else {
LUNOk[lun] = false;
}
}
rcode = OnStart();
if(rcode) goto FailOnInit;
#ifdef DEBUG_USB_HOST
USBTRACE("BS configured\r\n\r\n");
#endif
qNextPollTime = millis() + 100;
bPollEnable = true;
return 0;
FailUnPlug:
rcode = UHS_BULK_ERR_DEVICE_DISCONNECTED;
goto Fail;
FailOnInit:
#ifdef DEBUG_USB_HOST
USBTRACE("OnStart:");
goto Fail;
#endif
FailGetMaxLUN:
#ifdef DEBUG_USB_HOST
USBTRACE("GetMaxLUN:");
goto Fail;
#endif
FailInquiry:
#ifdef DEBUG_USB_HOST
USBTRACE("Inquiry:");
#endif
Fail:
#ifdef DEBUG_USB_HOST
NotifyFail(rcode);
#endif
Release();
return rcode;
}
// Base class definition of Release() used. See UHS_USBInterface class definition for details
/**
* For driver use only.
*
* @return
*/
//void UHS_NI UHS_Bulk_Storage::Release(void) {
// pUsb->DisablePoll();
// OnRelease();
// DriverDefaults();
// pUsb->EnablePoll();
// return;
//}
/**
* For driver use only.
*
* @param lun Logical Unit Number
* @return true if LUN is ready for use.
*/
bool UHS_NI UHS_Bulk_Storage::CheckLUN(uint8_t lun) {
uint8_t rcode;
SCSI_Capacity capacity;
for(uint8_t i = 0; i < 8; i++) capacity.data[i] = 0;
rcode = ReadCapacity10(lun, (uint8_t*)capacity.data);
if(rcode) {
BS_HOST_DEBUG(">>>>>>>>>>>>>>>>ReadCapacity returned %i\r\n", rcode);
return false;
}
#ifdef DEBUG_USB_HOST
ErrorMessage<uint8_t > (PSTR(">>>>>>>>>>>>>>>>CAPACITY OK ON LUN"), lun);
for(uint8_t i = 0; i < 8 /*sizeof (Capacity)*/; i++)
D_PrintHex<uint8_t > (capacity.data[i], 0x80);
Notify(PSTR("\r\n\r\n"), 0x80);
#endif
// Only 512/1024/2048/4096 are valid values!
uint32_t c = UHS_BYTES_TO_UINT32(capacity.data[4], capacity.data[5], capacity.data[6], capacity.data[7]);
if(c != 0x0200LU && c != 0x0400LU && c != 0x0800LU && c != 0x1000LU) {
return false;
}
// Store capacity information.
CurrentSectorSize[lun] = (uint16_t)(c); // & 0xFFFF);
CurrentCapacity[lun] = UHS_BYTES_TO_UINT32(capacity.data[0], capacity.data[1], capacity.data[2], capacity.data[3]) + 1;
if(CurrentCapacity[lun] == /*0xffffffffLU */ 0x01LU || CurrentCapacity[lun] == 0x00LU) {
// Buggy firmware will report 0xffffffff or 0 for no media
#ifdef DEBUG_USB_HOST
if(CurrentCapacity[lun])
ErrorMessage<uint8_t > (PSTR(">>>>>>>>>>>>>>>>BUGGY FIRMWARE. CAPACITY FAIL ON LUN"), lun);
#endif
return false;
}
if(!UHS_SLEEP_MS(20)) return false;
#ifndef SKIP_PAGE3F
Page3F(lun);
#endif
if(!TestUnitReady(lun)) return true;
return false;
}
/**
* For driver use only.
*
* Scan for media change on all LUNs
*/
void UHS_NI UHS_Bulk_Storage::CheckMedia(void) {
if(!bAddress) return;
for(uint8_t lun = 0; lun <= bMaxLUN; lun++) {
if(TestUnitReady(lun)) {
LUNOk[lun] = false;
continue;
}
if(!LUNOk[lun])
LUNOk[lun] = CheckLUN(lun);
}
#if 0
BS_HOST_DEBUG("}}}}}}}}}}}}}}}}STATUS ");
for(uint8_t lun = 0; lun <= bMaxLUN; lun++) {
if(LUNOk[lun])
BS_HOST_DEBUG("#");
else BS_HOST_DEBUG(".");
}
BS_HOST_DEBUG("\r\n");
#endif
OnPoll();
qNextPollTime = millis() + 100;
}
/**
* For driver use only.
*
*/
void UHS_NI UHS_Bulk_Storage::Poll(void) {
if((long)(millis() - qNextPollTime) >= 0L) {
CheckMedia();
}
return;
}
////////////////////////////////////////////////////////////////////////////////
// SCSI code
////////////////////////////////////////////////////////////////////////////////
/**
* For driver use only.
*
* @param plun
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::GetMaxLUN(uint8_t *plun) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
uint8_t ret = pUsb->ctrlReq(bAddress, mkSETUP_PKT16(UHS_BULK_bmREQ_IN, UHS_BULK_REQ_GET_MAX_LUN, 0x0000U, bIface, 1), 1, plun);
if(ret == UHS_HOST_ERROR_STALL) {
*plun = 0;
Notify(PSTR("\r\nGetMaxLUN Stalled\r\n"), 0x80);
}
return 0;
}
/**
* For driver use only. Used during Driver Start
*
* @param lun Logical Unit Number
* @param bsize
* @param buf
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::Inquiry(uint8_t lun, uint16_t bsize, uint8_t *buf) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
Notify(PSTR("\r\nInquiry\r\n"), 0x80);
Notify(PSTR("---------\r\n"), 0x80);
SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_INQUIRY, lun, 0LU, (uint8_t)bsize, 0);
uint8_t rc = SCSITransaction6(&cdb, bsize, buf, (uint8_t)UHS_BULK_CMD_DIR_IN);
return rc;
}
/**
* For driver use only.
*
* @param lun Logical Unit Number
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::TestUnitReady(uint8_t lun) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
//SetCurLUN(lun);
if(!bAddress)
return UHS_BULK_ERR_UNIT_NOT_READY;
Notify(PSTR("\r\nTestUnitReady\r\n"), 0x80);
Notify(PSTR("-----------------\r\n"), 0x80);
SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_TEST_UNIT_READY, lun, (uint8_t)0, 0);
return SCSITransaction6(&cdb, 0, NULL, (uint8_t)UHS_BULK_CMD_DIR_IN);
}
/**
* For driver use only.
*
* @param lun Logical Unit Number
* @param pc
* @param page
* @param subpage
* @param len
* @param pbuf
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t * pbuf) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
Notify(PSTR("\r\rModeSense\r\n"), 0x80);
Notify(PSTR("------------\r\n"), 0x80);
SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_MODE_SENSE_6, lun, (uint32_t)((((pc << 6) | page) << 8) | subpage), len, 0);
return SCSITransaction6(&cdb, len, pbuf, (uint8_t)UHS_BULK_CMD_DIR_IN);
}
/**
* For driver use only.
*
* @param lun Logical Unit Number
* @param bsize
* @param buf
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::ReadCapacity10(uint8_t lun, uint8_t *buf) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
Notify(PSTR("\r\nReadCapacity\r\n"), 0x80);
Notify(PSTR("---------------\r\n"), 0x80);
SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_READ_CAPACITY_10, lun);
return SCSITransaction10(&cdb, 8, buf, (uint8_t)UHS_BULK_CMD_DIR_IN);
}
/**
* For driver use only.
*
* Page 3F contains write protect status.
*
* @param lun Logical Unit Number to test.
* @return Write protect switch status.
*/
uint8_t UHS_NI UHS_Bulk_Storage::Page3F(uint8_t lun) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
uint8_t buf[192];
for(int i = 0; i < 192; i++) {
buf[i] = 0x00;
}
WriteOk[lun] = true;
uint8_t rc = ModeSense6(lun, 0, 0x3f, 0, 192, buf);
if(!rc) {
WriteOk[lun] = ((buf[2] & 0x80) == 0);
#ifdef DEBUG_USB_HOST
Notify(PSTR("Mode Sense: "), 0x80);
for(int i = 0; i < 4; i++) {
D_PrintHex<uint8_t > (buf[i], 0x80);
Notify(PSTR(" "), 0x80);
}
Notify(PSTR("\r\n"), 0x80);
#endif
}
return rc;
}
/**
* For driver use only.
*
* @param lun Logical Unit Number
* @param size
* @param buf
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::RequestSense(uint8_t lun, uint16_t size, uint8_t *buf) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
pUsb->DisablePoll();
Notify(PSTR("\r\nRequestSense\r\n"), 0x80);
Notify(PSTR("----------------\r\n"), 0x80);
SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_REQUEST_SENSE, lun, 0LU, (uint8_t)size, 0);
UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)size, &cdb, (uint8_t)UHS_BULK_CMD_DIR_IN);
uint8_t v = Transaction(&cbw, size, buf);
pUsb->EnablePoll();
return v;
}
////////////////////////////////////////////////////////////////////////////////
// USB code
////////////////////////////////////////////////////////////////////////////////
/**
* For driver use only.
*
* @param index
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::ClearEpHalt(uint8_t index) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
uint8_t ret = 0;
if(index != 0) {
uint8_t ep = (index == epDataInIndex) ? (0x80 | epInfo[index].epAddr) : epInfo[index].epAddr;
do {
ret = pUsb->EPClearHalt(bAddress, ep);
if(!UHS_SLEEP_MS(6)) break;
} while(ret == 0x01);
if(ret) {
ErrorMessage<uint8_t > (PSTR("ClearEpHalt"), ret);
ErrorMessage<uint8_t > (PSTR("EP"), ep);
epInfo[index].bmSndToggle = 0;
epInfo[index].bmRcvToggle = 0;
return ret;
} else {
epInfo[index].bmSndToggle = 0;
epInfo[index].bmRcvToggle = 0;
}
}
return ret;
}
/**
* For driver use only.
*
*/
void UHS_NI UHS_Bulk_Storage::Reset(void) {
if(!bAddress) return;
while(pUsb->ctrlReq(bAddress, mkSETUP_PKT16(UHS_BULK_bmREQ_OUT, UHS_BULK_REQ_BOMSR, 0x0000U, bIface, 0), 0, NULL) == 0x01) {
if(!UHS_SLEEP_MS(6)) break;
}
if(!bAddress) return;
UHS_SLEEP_MS(2500);
}
/**
* For driver use only.
*
* @return 0 if successful
*/
uint8_t UHS_NI UHS_Bulk_Storage::ResetRecovery(void) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
Notify(PSTR("\r\nResetRecovery\r\n"), 0x80);
Notify(PSTR("-----------------\r\n"), 0x80);
qNextPollTime = millis() + 90000;
uint8_t bLastUsbError = UHS_HOST_ERROR_UNPLUGGED;
if(UHS_SLEEP_MS(6)) {
Reset();
if(UHS_SLEEP_MS(6)) {
bLastUsbError = ClearEpHalt(epDataInIndex);
if(UHS_SLEEP_MS(6)) {
bLastUsbError = ClearEpHalt(epDataOutIndex);
UHS_SLEEP_MS(6);
}
}
}
return bLastUsbError;
}
/**
* For driver use only.
*
* Clear all EP data and clear all LUN status
*/
void UHS_NI UHS_Bulk_Storage::DriverDefaults(void) {
pUsb->DeviceDefaults(MASS_MAX_ENDPOINTS, this);
for(uint8_t i = 0; i < MASS_MAX_SUPPORTED_LUN; i++) {
LUNOk[i] = false;
WriteOk[i] = false;
CurrentCapacity[i] = 0lu;
CurrentSectorSize[i] = 0;
}
dCBWTag = 0;
bMaxLUN = 0;
bTheLUN = 0;
}
/**
* For driver use only.
*
* @param pcsw
* @param pcbw
* @return
*/
bool UHS_NI UHS_Bulk_Storage::IsValidCSW(UHS_BULK_CommandStatusWrapper *pcsw, UHS_BULK_CommandBlockWrapperBase *pcbw) {
if(!bAddress) return false;
if(pcsw->dCSWSignature != UHS_BULK_CSW_SIGNATURE) {
Notify(PSTR("CSW:Sig error\r\n"), 0x80);
return false;
}
if(pcsw->dCSWTag != pcbw->dCBWTag) {
Notify(PSTR("CSW:Wrong tag\r\n"), 0x80);
ErrorMessage<uint32_t > (PSTR("dCSWTag"), pcsw->dCSWTag);
ErrorMessage<uint32_t > (PSTR("dCBWTag"), pcbw->dCBWTag);
return false;
}
return true;
}
/**
* For driver use only.
*
* @param error
* @param index
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::HandleUsbError(uint8_t error, uint8_t index) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
uint8_t count = 3;
while(error && count) {
if(error != UHS_HOST_ERROR_NONE) {
ErrorMessage<uint8_t > (PSTR("USB Error"), error);
ErrorMessage<uint8_t > (PSTR("Index"), index);
}
switch(error) {
// case UHS_HOST_ERROR_WRONGPID:
case UHS_HOST_ERROR_NONE:
return UHS_BULK_ERR_SUCCESS;
case UHS_HOST_ERROR_BUSY:
// SIE is busy, just hang out and try again.
return UHS_BULK_ERR_UNIT_BUSY;
case UHS_HOST_ERROR_NAK:
return UHS_BULK_ERR_UNIT_BUSY;
case UHS_HOST_ERROR_UNPLUGGED:
case UHS_HOST_ERROR_TIMEOUT:
case UHS_HOST_ERROR_JERR:
return UHS_BULK_ERR_DEVICE_DISCONNECTED;
case UHS_HOST_ERROR_STALL:
if(index == 0) return UHS_BULK_ERR_STALL;
ClearEpHalt(index);
if(index != epDataInIndex) return UHS_BULK_ERR_WRITE_STALL;
return UHS_BULK_ERR_STALL;
case UHS_HOST_ERROR_TOGERR:
// Handle a very super rare corner case, where toggles become de-synched.
// I have only ran into one device that has this firmware bug, and this is
// the only clean way to get back into sync with the buggy device firmware.
// --AJK
if(bAddress && bConfNum) {
error = pUsb->setConf(bAddress, bConfNum);
if(error) break;
}
return UHS_BULK_ERR_SUCCESS;
default:
ErrorMessage<uint8_t > (PSTR("\r\nUSB"), error);
return UHS_BULK_ERR_GENERAL_USB_ERROR;
}
count--;
} // while
return ((error && !count) ? UHS_BULK_ERR_GENERAL_USB_ERROR : UHS_BULK_ERR_SUCCESS);
}
/**
* For driver use only.
*
* @param pcbw
* @param buf_size
* @param buf
* @param flags
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::Transaction(UHS_BULK_CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
uint16_t bytes = buf_size;
bool write = (pcbw->bmCBWFlags & UHS_BULK_CMD_DIR_IN) != UHS_BULK_CMD_DIR_IN;
uint8_t ret = 0;
uint8_t usberr;
UHS_BULK_CommandStatusWrapper csw; // up here, we allocate ahead to save cpu cycles.
SetCurLUN(pcbw->bmCBWLUN);
ErrorMessage<uint32_t > (PSTR("CBW.dCBWTag"), pcbw->dCBWTag);
while((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, sizeof (UHS_BULK_CommandBlockWrapper), (uint8_t*)pcbw)) == UHS_HOST_ERROR_BUSY) {
if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
}
ret = HandleUsbError(usberr, epDataOutIndex);
if(ret) {
ErrorMessage<uint8_t > (PSTR("============================ CBW"), ret);
} else {
if(bytes) {
if(!write) {
while((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*)buf)) == UHS_HOST_ERROR_BUSY) {
if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
}
ret = HandleUsbError(usberr, epDataInIndex);
} else {
while((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, bytes, (uint8_t*)buf)) == UHS_HOST_ERROR_BUSY) {
if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
}
ret = HandleUsbError(usberr, epDataOutIndex);
}
if(ret) {
ErrorMessage<uint8_t > (PSTR("============================ DAT"), ret);
}
}
}
{
bytes = sizeof (UHS_BULK_CommandStatusWrapper);
int tries = 2;
while(tries--) {
while((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*) & csw)) == UHS_HOST_ERROR_BUSY) {
if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
}
if(!usberr) break;
if(tries) {
if(usberr == UHS_HOST_ERROR_STALL) {
ResetRecovery();
} else {
ClearEpHalt(epDataInIndex);
}
}
}
if(!ret) {
Notify(PSTR("CBW:\t\tOK\r\n"), 0x80);
Notify(PSTR("Data Stage:\tOK\r\n"), 0x80);
} else {
// Throw away csw, IT IS NOT OF ANY USE.
ResetRecovery();
return ret;
}
ret = HandleUsbError(usberr, epDataInIndex);
if(ret) {
ErrorMessage<uint8_t > (PSTR("============================ CSW"), ret);
}
if(usberr == UHS_HOST_ERROR_NONE) {
if(IsValidCSW(&csw, pcbw)) {
//ErrorMessage<uint32_t > (PSTR("CSW.dCBWTag"), csw.dCSWTag);
//ErrorMessage<uint8_t > (PSTR("bCSWStatus"), csw.bCSWStatus);
//ErrorMessage<uint32_t > (PSTR("dCSWDataResidue"), csw.dCSWDataResidue);
Notify(PSTR("CSW:\t\tOK\r\n\r\n"), 0x80);
return csw.bCSWStatus;
} else {
// NOTE! Sometimes this is caused by the reported residue being wrong.
// Get a different device. It isn't compliant, and should have never passed Q&A.
// I own one... 05e3:0701 Genesys Logic, Inc. USB 2.0 IDE Adapter.
// Other devices that exhibit this behavior exist in the wild too.
// Be sure to check quirks in the Linux source code before reporting a bug. --xxxajk
Notify(PSTR("Invalid CSW\r\n"), 0x80);
Reset();
ResetRecovery();
return UHS_BULK_ERR_INVALID_CSW;
}
}
}
return ret;
}
/**
* For driver use only.
*
* @param lun Logical Unit Number
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::SetCurLUN(uint8_t lun) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
if(lun > bMaxLUN)
return UHS_BULK_ERR_INVALID_LUN;
bTheLUN = lun;
return UHS_BULK_ERR_SUCCESS;
};
/**
* For driver use only.
*
* @param status
* @return
*/
uint8_t UHS_NI UHS_Bulk_Storage::HandleSCSIError(uint8_t status) {
if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
uint8_t ret = 0;
switch(status) {
case 0: return UHS_BULK_ERR_SUCCESS;
case 2:
ErrorMessage<uint8_t > (PSTR("Phase Error"), status);
ErrorMessage<uint8_t > (PSTR("LUN"), bTheLUN);
ResetRecovery();
return UHS_BULK_ERR_GENERAL_SCSI_ERROR;
case 1:
ErrorMessage<uint8_t > (PSTR("SCSI Error"), status);
ErrorMessage<uint8_t > (PSTR("LUN"), bTheLUN);
SCSI_Request_Sense_Response rsp;
ret = RequestSense(bTheLUN, sizeof (SCSI_Request_Sense_Response), (uint8_t*) & rsp);
if(ret) {
if(ret == UHS_BULK_ERR_DEVICE_DISCONNECTED) return UHS_BULK_ERR_DEVICE_DISCONNECTED;
return UHS_BULK_ERR_GENERAL_SCSI_ERROR;
}
#if ENABLE_UHS_DEBUGGING
ErrorMessage<uint8_t > (PSTR("Response Code"), rsp.bResponseCode);
if(rsp.bResponseCode & 0x80) {
Notify(PSTR("Information field: "), 0x80);
for(int i = 0; i < 4; i++) {
D_PrintHex<uint8_t > (rsp.CmdSpecificInformation[i], 0x80);
Notify(PSTR(" "), 0x80);
}
Notify(PSTR("\r\n"), 0x80);
}
ErrorMessage<uint8_t > (PSTR("Sense Key"), rsp.bmSenseKey);
ErrorMessage<uint8_t > (PSTR("Add Sense Code"), rsp.bAdditionalSenseCode);
ErrorMessage<uint8_t > (PSTR("Add Sense Qual"), rsp.bAdditionalSenseQualifier);
#endif
// warning, this is not testing ASQ, only SK and ASC.
switch(rsp.bmSenseKey) {
case SCSI_S_UNIT_ATTENTION:
switch(rsp.bAdditionalSenseCode) {
case SCSI_ASC_MEDIA_CHANGED:
return UHS_BULK_ERR_MEDIA_CHANGED;
default:
return UHS_BULK_ERR_UNIT_NOT_READY;
}
case SCSI_S_NOT_READY:
switch(rsp.bAdditionalSenseCode) {
case SCSI_ASC_MEDIUM_NOT_PRESENT:
return UHS_BULK_ERR_NO_MEDIA;
default:
return UHS_BULK_ERR_UNIT_NOT_READY;
}
case SCSI_S_ILLEGAL_REQUEST:
switch(rsp.bAdditionalSenseCode) {
case SCSI_ASC_LBA_OUT_OF_RANGE:
return UHS_BULK_ERR_BAD_LBA;
default:
return UHS_BULK_ERR_CMD_NOT_SUPPORTED;
}
default:
return UHS_BULK_ERR_GENERAL_SCSI_ERROR;
}
// case 4: return MASS_ERR_UNIT_BUSY; // Busy means retry later.
// case 0x05/0x14: we stalled out
// case 0x15/0x16: we naked out.
default:
ErrorMessage<uint8_t > (PSTR("Gen SCSI Err"), status);
ErrorMessage<uint8_t > (PSTR("LUN"), bTheLUN);
return status;
} // switch
}
////////////////////////////////////////////////////////////////////////////////
// Debugging code
////////////////////////////////////////////////////////////////////////////////
/**
*
* @param ep_ptr
*/
void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR * ep_ptr) {
Notify(PSTR("Endpoint descriptor:"), 0x80);
Notify(PSTR("\r\nLength:\t\t"), 0x80);
D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
Notify(PSTR("\r\nType:\t\t"), 0x80);
D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
Notify(PSTR("\r\nAddress:\t"), 0x80);
D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
Notify(PSTR("\r\nAttributes:\t"), 0x80);
D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
Notify(PSTR("\r\n"), 0x80);
}
#else
#error "Never include UHS_BULK_STORAGE_INLINE.h, include UHS_host.h instead"
#endif

View file

@ -0,0 +1,328 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#ifndef UHS_SCSI_H
#define UHS_SCSI_H
/*
* Reference documents from T10 (http://www.t10.org)
* SCSI Primary Commands - 3 (SPC-3)
* SCSI Block Commands - 2 (SBC-2)
* Multi-Media Commands - 5 (MMC-5)
*/
/* Group 1 commands (CDB's here are should all be 6-bytes) */
#define SCSI_CMD_TEST_UNIT_READY 0x00U
#define SCSI_CMD_REQUEST_SENSE 0x03U
#define SCSI_CMD_FORMAT_UNIT 0x04U
#define SCSI_CMD_READ_6 0x08U
#define SCSI_CMD_WRITE_6 0x0AU
#define SCSI_CMD_INQUIRY 0x12U
#define SCSI_CMD_MODE_SELECT_6 0x15U
#define SCSI_CMD_MODE_SENSE_6 0x1AU
#define SCSI_CMD_START_STOP_UNIT 0x1BU
#define SCSI_CMD_PREVENT_REMOVAL 0x1EU
/* Group 2 Commands (CDB's here are 10-bytes) */
#define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23U
#define SCSI_CMD_READ_CAPACITY_10 0x25U
#define SCSI_CMD_READ_10 0x28U
#define SCSI_CMD_WRITE_10 0x2AU
#define SCSI_CMD_SEEK_10 0x2BU
#define SCSI_CMD_ERASE_10 0x2CU
#define SCSI_CMD_WRITE_AND_VERIFY_10 0x2EU
#define SCSI_CMD_VERIFY_10 0x2FU
#define SCSI_CMD_SYNCHRONIZE_CACHE 0x35U
#define SCSI_CMD_WRITE_BUFFER 0x3BU
#define SCSI_CMD_READ_BUFFER 0x3CU
#define SCSI_CMD_READ_SUBCHANNEL 0x42U
#define SCSI_CMD_READ_TOC 0x43U
#define SCSI_CMD_READ_HEADER 0x44U
#define SCSI_CMD_PLAY_AUDIO_10 0x45U
#define SCSI_CMD_GET_CONFIGURATION 0x46U
#define SCSI_CMD_PLAY_AUDIO_MSF 0x47U
#define SCSI_CMD_PLAY_AUDIO_TI 0x48U
#define SCSI_CMD_PLAY_TRACK_REL_10 0x49U
#define SCSI_CMD_GET_EVENT_STATUS 0x4AU
#define SCSI_CMD_PAUSE_RESUME 0x4BU
#define SCSI_CMD_READ_DISC_INFORMATION 0x51U
#define SCSI_CMD_READ_TRACK_INFORMATION 0x52U
#define SCSI_CMD_RESERVE_TRACK 0x53U
#define SCSI_CMD_SEND_OPC_INFORMATION 0x54U
#define SCSI_CMD_MODE_SELECT_10 0x55U
#define SCSI_CMD_REPAIR_TRACK 0x58U
#define SCSI_CMD_MODE_SENSE_10 0x5AU
#define SCSI_CMD_CLOSE_TRACK_SESSION 0x5BU
#define SCSI_CMD_READ_BUFFER_CAPACITY 0x5CU
#define SCSI_CMD_SEND_CUE_SHEET 0x5DU
/* Group 5 Commands (CDB's here are 12-bytes) */
#define SCSI_CMD_REPORT_LUNS 0xA0U
#define SCSI_CMD_BLANK 0xA1U
#define SCSI_CMD_SECURITY_PROTOCOL_IN 0xA2U
#define SCSI_CMD_SEND_KEY 0xA3U
#define SCSI_CMD_REPORT_KEY 0xA4U
#define SCSI_CMD_PLAY_AUDIO_12 0xA5U
#define SCSI_CMD_LOAD_UNLOAD 0xA6U
#define SCSI_CMD_SET_READ_AHEAD 0xA7U
#define SCSI_CMD_READ_12 0xA8U
#define SCSI_CMD_PLAY_TRACK_REL_12 0xA9U
#define SCSI_CMD_WRITE_12 0xAAU
#define SCSI_CMD_READ_MEDIA_SERIAL_12 0xABU
#define SCSI_CMD_GET_PERFORMANCE 0xACU
#define SCSI_CMD_READ_DVD_STRUCTURE 0xADU
#define SCSI_CMD_SECURITY_PROTOCOL_OUT 0xB5U
#define SCSI_CMD_SET_STREAMING 0xB6U
#define SCSI_CMD_READ_MSF 0xB9U
#define SCSI_CMD_SET_SPEED 0xBBU
#define SCSI_CMD_MECHANISM_STATUS 0xBDU
#define SCSI_CMD_READ_CD 0xBEU
#define SCSI_CMD_SEND_DISC_STRUCTURE 0xBFU
/* Vendor-unique Commands, included for completeness */
#define SCSI_CMD_CD_PLAYBACK_STATUS 0xC4U /* SONY unique */
#define SCSI_CMD_PLAYBACK_CONTROL 0xC9U /* SONY unique */
#define SCSI_CMD_READ_CDDA 0xD8U /* Vendor unique */
#define SCSI_CMD_READ_CDXA 0xDBU /* Vendor unique */
#define SCSI_CMD_READ_ALL_SUBCODES 0xDFU /* Vendor unique */
/* SCSI error codes */
#define SCSI_S_NOT_READY 0x02U
#define SCSI_S_MEDIUM_ERROR 0x03U
#define SCSI_S_ILLEGAL_REQUEST 0x05U
#define SCSI_S_UNIT_ATTENTION 0x06U
#define SCSI_ASC_LBA_OUT_OF_RANGE 0x21U
#define SCSI_ASC_MEDIA_CHANGED 0x28U
#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3AU
struct SCSI_Capacity {
uint8_t data[8];
//uint32_t dwBlockAddress;
//uint32_t dwBlockLength;
} __attribute__((packed));
struct SCSI_CDB_BASE {
uint8_t Opcode;
unsigned unused : 5;
unsigned LUN : 3;
uint8_t info[12];
} __attribute__((packed));
typedef SCSI_CDB_BASE SCSI_CDB_BASE_t;
struct SCSI_CDB6 {
uint8_t Opcode;
unsigned LBAMSB : 5;
unsigned LUN : 3;
uint8_t LBAHB;
uint8_t LBALB;
uint8_t AllocationLength;
uint8_t Control;
public:
SCSI_CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) :
Opcode(_Opcode), LBAMSB(UHS_UINT8_BYTE2(LBA) & 0x1f), LUN(_LUN), LBAHB(UHS_UINT8_BYTE1(LBA)), LBALB(UHS_UINT8_BYTE0(LBA)),
AllocationLength(_AllocationLength), Control(_Control) {
}
SCSI_CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control) :
Opcode(_Opcode), LBAMSB(0), LUN(_LUN), LBAHB(0), LBALB(0),
AllocationLength(_AllocationLength), Control(_Control) {
}
} __attribute__((packed));
typedef SCSI_CDB6 SCSI_CDB6_t;
struct SCSI_CDB10 {
uint8_t Opcode;
unsigned Service_Action : 5;
unsigned LUN : 3;
uint8_t LBA_L_M_MB;
uint8_t LBA_L_M_LB;
uint8_t LBA_L_L_MB;
uint8_t LBA_L_L_LB;
uint8_t Misc2;
uint8_t ALC_MB;
uint8_t ALC_LB;
uint8_t Control;
public:
SCSI_CDB10(uint8_t _Opcode, uint8_t _LUN) :
Opcode(_Opcode), Service_Action(0), LUN(_LUN),
LBA_L_M_MB(0), LBA_L_M_LB(0), LBA_L_L_MB(0), LBA_L_L_LB(0),
Misc2(0), ALC_MB(0), ALC_LB(0), Control(0) {
}
SCSI_CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA) :
Opcode(_Opcode), Service_Action(0), LUN(_LUN),
LBA_L_M_MB(UHS_UINT8_BYTE3(_LBA)), LBA_L_M_LB(UHS_UINT8_BYTE2(_LBA)), LBA_L_L_MB(UHS_UINT8_BYTE1(_LBA)), LBA_L_L_LB(UHS_UINT8_BYTE0(_LBA)),
Misc2(0), ALC_MB(UHS_UINT8_BYTE1(xflen)), ALC_LB(UHS_UINT8_BYTE0(xflen)), Control(0) {
}
} __attribute__((packed));
typedef SCSI_CDB10 SCSI_CDB10_t;
struct SCSI_CDB12 {
uint8_t Opcode;
unsigned Service_Action : 5;
unsigned Misc : 3;
uint8_t LBA_L_M_LB;
uint8_t LBA_L_L_MB;
uint8_t LBA_L_L_LB;
uint8_t ALC_M_LB;
uint8_t ALC_L_MB;
uint8_t ALC_L_LB;
uint8_t Control;
} __attribute__((packed));
typedef SCSI_CDB12 SCSI_CDB12_t;
struct SCSI_CDB_LBA32_16 {
uint8_t Opcode;
unsigned Service_Action : 5;
unsigned Misc : 3;
uint8_t LBA_L_M_MB;
uint8_t LBA_L_M_LB;
uint8_t LBA_L_L_MB;
uint8_t LBA_L_L_LB;
uint8_t A_M_M_MB;
uint8_t A_M_M_LB;
uint8_t A_M_L_MB;
uint8_t A_M_L_LB;
uint8_t ALC_M_MB;
uint8_t ALC_M_LB;
uint8_t ALC_L_MB;
uint8_t ALC_L_LB;
uint8_t Misc2;
uint8_t Control;
} __attribute__((packed));
struct SCSI_CDB_LBA64_16 {
uint8_t Opcode;
uint8_t Misc;
uint8_t LBA_M_M_MB;
uint8_t LBA_M_M_LB;
uint8_t LBA_M_L_MB;
uint8_t LBA_M_L_LB;
uint8_t LBA_L_M_MB;
uint8_t LBA_L_M_LB;
uint8_t LBA_L_L_MB;
uint8_t LBA_L_L_LB;
uint8_t ALC_M_MB;
uint8_t ALC_M_LB;
uint8_t ALC_L_MB;
uint8_t ALC_L_LB;
uint8_t Misc2;
uint8_t Control;
} __attribute__((packed));
struct SCSI_Inquiry_Response {
uint8_t DeviceType : 5;
uint8_t PeripheralQualifier : 3;
unsigned Reserved : 7;
unsigned Removable : 1;
uint8_t Version;
unsigned ResponseDataFormat : 4;
unsigned HISUP : 1;
unsigned NormACA : 1;
unsigned TrmTsk : 1;
unsigned AERC : 1;
uint8_t AdditionalLength;
unsigned PROTECT : 1;
unsigned Res : 2;
unsigned ThreePC : 1;
unsigned TPGS : 2;
unsigned ACC : 1;
unsigned SCCS : 1;
unsigned ADDR16 : 1;
unsigned R1 : 1;
unsigned R2 : 1;
unsigned MCHNGR : 1;
unsigned MULTIP : 1;
unsigned VS : 1;
unsigned ENCSERV : 1;
unsigned BQUE : 1;
unsigned SoftReset : 1;
unsigned CmdQue : 1;
unsigned Reserved4 : 1;
unsigned Linked : 1;
unsigned Sync : 1;
unsigned WideBus16Bit : 1;
unsigned WideBus32Bit : 1;
unsigned RelAddr : 1;
uint8_t VendorID[8];
uint8_t ProductID[16];
uint8_t RevisionID[4];
} __attribute__((packed));
struct SCSI_Request_Sense_Response {
uint8_t bResponseCode;
uint8_t bSegmentNumber;
uint8_t bmSenseKey : 4;
uint8_t bmReserved : 1;
uint8_t bmILI : 1;
uint8_t bmEOM : 1;
uint8_t bmFileMark : 1;
uint8_t Information[4];
uint8_t bAdditionalLength;
uint8_t CmdSpecificInformation[4];
uint8_t bAdditionalSenseCode;
uint8_t bAdditionalSenseQualifier;
uint8_t bFieldReplaceableUnitCode;
uint8_t SenseKeySpecific[3];
} __attribute__((packed));
#endif /* UHS_SCSI_H */

View file

@ -0,0 +1,33 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#ifndef _UHS_UNOFFICIAL_IDs_h
#define _UHS_UNOFFICIAL_IDs_h
// Bogus unofficial and unregistered VIDs from cloners to be listed here.
#define UHS_VID_UNOFFICIAL_JOYTECH 0x162EU // For unofficial Joytech controllers
#endif

View file

@ -0,0 +1,2995 @@
/*
* USB vendor ids
* This file was generated by running python ./make-USB_IDs.py > UHS_USB_IDs.h
* Don't change it directly.
*
* Copyright 2014, Andrew J. Kroll for Circuits At Home, LTD. All rights reserved.
*
* Copyright 2012, Michal Labedzki for Tieto Corporation
* Other values imported from libghoto2/camlibs/ptp2/library.c, music-players.h
* Copyright (C) 2001-2005 Mariusz Woloszyn <emsi@ipartners.pl>
* Copyright (C) 2003-2013 Marcus Meissner <marcus@jet.franken.de>
* Copyright (C) 2005 Hubert Figuiere <hfiguiere@teaser.fr>
* Copyright (C) 2009 Axel Waggershauser <awagger@web.de>
* Copyright (C) 2005-2007 Richard A. Low <richard@wentnet.com>
* Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se>
* Copyright (C) 2007 Ted Bullock
* Copyright (C) 2012 Sony Mobile Communications AB
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef _UHS_USB_IDs_h_
#define _UHS_USB_IDs_h_
#include "UHS_UNOFFICIAL_IDs.h"
#define UHS_VID_FRYS_ELECTRONICS 0x0001U // Fry's Electronics
#define UHS_VID_INGRAM 0x0002U // Ingram
#define UHS_VID_CLUB_MAC 0x0003U // Club Mac
#define UHS_VID_NEBRASKA_FURNITURE_MART 0x0004U // Nebraska Furniture Mart
#define UHS_VID_UNKNOWN 0x0011U // Unknown
#define UHS_VID_PLANEX 0x0053U // Planex
#define UHS_VID_DRAGONRISE 0x0079U // DragonRise Inc.
#define UHS_VID_TRUST_INTERNATIONAL_BV 0x0105U // Trust International B.V.
#define UHS_VID_IBP 0x0127U // IBP
#define UHS_VID_UNKNOWN_1 0x0145U // Unknown
#define UHS_VID_MLK 0x017cU // MLK
#define UHS_VID_TP_LINK 0x0200U // TP-Link
#define UHS_VID_CHIPSBANK_MICROELECTRONICS 0x0204U // Chipsbank Microelectronics Co., Ltd
#define UHS_VID_HANGZHOU_WORLDE 0x0218U // Hangzhou Worlde
#define UHS_VID_HUMAX 0x02adU // HUMAX Co., Ltd.
#define UHS_VID_MM300_EBOOK_READER 0x0300U // MM300 eBook Reader
#define UHS_VID_OCZ_TECHNOLOGY 0x0324U // OCZ Technology Inc
#define UHS_VID_OCZ_TECHNOLOGY_1 0x0325U // OCZ Technology Inc
#define UHS_VID_LTS 0x0386U // LTS
#define UHS_VID_SHENZHEN_SINOTE_TECH_ELECTRON 0x03d9U // Shenzhen Sinote Tech-Electron Co., Ltd
#define UHS_VID_BERND_WALTER_COMPUTER_TECHNOLOGY 0x03daU // Bernd Walter Computer Technology
#define UHS_VID_ENDPOINTS 0x03e8U // EndPoints, Inc.
#define UHS_VID_THESYS_MICROELECTRONICS 0x03e9U // Thesys Microelectronics
#define UHS_VID_DATA_BROADCASTING 0x03eaU // Data Broadcasting Corp.
#define UHS_VID_ATMEL 0x03ebU // Atmel Corp.
#define UHS_VID_IWATSU_AMERICA 0x03ecU // Iwatsu America, Inc.
#define UHS_VID_MITEL 0x03edU // Mitel Corp.
#define UHS_VID_MITSUMI 0x03eeU // Mitsumi
#define UHS_VID_HEWLETT_PACKARD 0x03f0U // Hewlett-Packard
#define UHS_VID_GENOA_TECHNOLOGY 0x03f1U // Genoa Technology
#define UHS_VID_OAK_TECHNOLOGY 0x03f2U // Oak Technology, Inc.
#define UHS_VID_ADAPTEC 0x03f3U // Adaptec, Inc.
#define UHS_VID_DIEBOLD 0x03f4U // Diebold, Inc.
#define UHS_VID_SIEMENS_ELECTROMECHANICAL 0x03f5U // Siemens Electromechanical
#define UHS_VID_EPSON_IMAGING_TECHNOLOGY_CENTER 0x03f8U // Epson Imaging Technology Center
#define UHS_VID_KEYTRONIC 0x03f9U // KeyTronic Corp.
#define UHS_VID_OPTI 0x03fbU // OPTi, Inc.
#define UHS_VID_ELITEGROUP_COMPUTER_SYSTEMS 0x03fcU // Elitegroup Computer Systems
#define UHS_VID_XILINX 0x03fdU // Xilinx, Inc.
#define UHS_VID_FARALLON_COMUNICATIONS 0x03feU // Farallon Comunications
#define UHS_VID_NATIONAL_SEMICONDUCTOR 0x0400U // National Semiconductor Corp.
#define UHS_VID_NATIONAL_REGISTRY 0x0401U // National Registry, Inc.
#define UHS_VID_ALI 0x0402U // ALi Corp.
#define UHS_VID_FUTURE_TECHNOLOGY_DEVICES_INTERNATIONAL 0x0403U // Future Technology Devices International, Ltd
#define UHS_VID_NCR 0x0404U // NCR Corp.
#define UHS_VID_SYNOPSYS 0x0405U // Synopsys, Inc.
#define UHS_VID_FUJITSU_ICL_COMPUTERS 0x0406U // Fujitsu-ICL Computers
#define UHS_VID_FUJITSU_PERSONAL_SYSTEMS 0x0407U // Fujitsu Personal Systems, Inc.
#define UHS_VID_QUANTA_COMPUTER 0x0408U // Quanta Computer, Inc.
#define UHS_VID_NEC 0x0409U // NEC Corp.
#define UHS_VID_KODAK 0x040aU // Kodak Co.
#define UHS_VID_WELTREND_SEMICONDUCTOR 0x040bU // Weltrend Semiconductor
#define UHS_VID_VTECH_COMPUTERS 0x040cU // VTech Computers, Ltd
#define UHS_VID_VIA_TECHNOLOGIES 0x040dU // VIA Technologies, Inc.
#define UHS_VID_MCCI 0x040eU // MCCI
#define UHS_VID_ECHO_SPEECH 0x040fU // Echo Speech Corp.
#define UHS_VID_BUFFALO_INC_FORMERLY_MELCO 0x0411U // BUFFALO INC. (formerly MelCo., Inc.)
#define UHS_VID_AWARD_SOFTWARE_INTERNATIONAL 0x0412U // Award Software International
#define UHS_VID_LEADTEK_RESEARCH 0x0413U // Leadtek Research, Inc.
#define UHS_VID_GIGA_BYTE_TECHNOLOGY 0x0414U // Giga-Byte Technology Co., Ltd
#define UHS_VID_WINBOND_ELECTRONICS 0x0416U // Winbond Electronics Corp.
#define UHS_VID_SYMBIOS_LOGIC 0x0417U // Symbios Logic
#define UHS_VID_AST_RESEARCH 0x0418U // AST Research
#define UHS_VID_SAMSUNG_INFO_SYSTEMS_AMERICA 0x0419U // Samsung Info. Systems America, Inc.
#define UHS_VID_PHOENIX_TECHNOLOGIES 0x041aU // Phoenix Technologies, Ltd
#define UHS_VID_DTV 0x041bU // d'TV
#define UHS_VID_S3 0x041dU // S3, Inc.
#define UHS_VID_CREATIVE_TECHNOLOGY 0x041eU // Creative Technology, Ltd
#define UHS_VID_LCS_TELEGRAPHICS 0x041fU // LCS Telegraphics
#define UHS_VID_CHIPS_AND_TECHNOLOGIES 0x0420U // Chips and Technologies
#define UHS_VID_NOKIA_MOBILE_PHONES 0x0421U // Nokia Mobile Phones
#define UHS_VID_ADI_SYSTEMS 0x0422U // ADI Systems, Inc.
#define UHS_VID_COMPUTER_ACCESS_TECHNOLOGY 0x0423U // Computer Access Technology Corp.
#define UHS_VID_STANDARD_MICROSYSTEMS 0x0424U // Standard Microsystems Corp.
#define UHS_VID_MOTOROLA_SEMICONDUCTORS_HK 0x0425U // Motorola Semiconductors HK, Ltd
#define UHS_VID_INTEGRATED_DEVICE_TECHNOLOGY 0x0426U // Integrated Device Technology, Inc.
#define UHS_VID_MOTOROLA_ELECTRONICS_TAIWAN 0x0427U // Motorola Electronics Taiwan, Ltd
#define UHS_VID_ADVANCED_GRAVIS_COMPUTER_TECH 0x0428U // Advanced Gravis Computer Tech, Ltd
#define UHS_VID_CIRRUS_LOGIC 0x0429U // Cirrus Logic
#define UHS_VID_ERICSSON_AUSTRIAN_AG 0x042aU // Ericsson Austrian, AG
#define UHS_VID_INTEL 0x042bU // Intel Corp.
#define UHS_VID_INNOVATIVE_SEMICONDUCTORS 0x042cU // Innovative Semiconductors, Inc.
#define UHS_VID_MICRONICS 0x042dU // Micronics
#define UHS_VID_ACER 0x042eU // Acer, Inc.
#define UHS_VID_MOLEX 0x042fU // Molex, Inc.
#define UHS_VID_SUN_MICROSYSTEMS 0x0430U // Sun Microsystems, Inc.
#define UHS_VID_ITAC_SYSTEMS 0x0431U // Itac Systems, Inc.
#define UHS_VID_UNISYS 0x0432U // Unisys Corp.
#define UHS_VID_ALPS_ELECTRIC 0x0433U // Alps Electric, Inc.
#define UHS_VID_SAMSUNG_INFO_SYSTEMS_AMERICA_1 0x0434U // Samsung Info. Systems America, Inc.
#define UHS_VID_HYUNDAI_ELECTRONICS_AMERICA 0x0435U // Hyundai Electronics America
#define UHS_VID_TAUGAGREINING_HF 0x0436U // Taugagreining HF
#define UHS_VID_FRAMATOME_CONNECTORS_USA 0x0437U // Framatome Connectors USA
#define UHS_VID_ADVANCED_MICRO_DEVICES 0x0438U // Advanced Micro Devices, Inc.
#define UHS_VID_VOICE_TECHNOLOGIES_GROUP 0x0439U // Voice Technologies Group
#define UHS_VID_LEXMARK_INTERNATIONAL 0x043dU // Lexmark International, Inc.
#define UHS_VID_LG_ELECTRONICS_USA 0x043eU // LG Electronics USA, Inc.
#define UHS_VID_RADISYS 0x043fU // RadiSys Corp.
#define UHS_VID_EIZO_NANAO 0x0440U // Eizo Nanao Corp.
#define UHS_VID_WINBOND_SYSTEMS_LAB 0x0441U // Winbond Systems Lab.
#define UHS_VID_ERICSSON 0x0442U // Ericsson, Inc.
#define UHS_VID_GATEWAY 0x0443U // Gateway, Inc.
#define UHS_VID_LUCENT_TECHNOLOGIES 0x0445U // Lucent Technologies, Inc.
#define UHS_VID_NMB_TECHNOLOGIES 0x0446U // NMB Technologies Corp.
#define UHS_VID_MOMENTUM_MICROSYSTEMS 0x0447U // Momentum Microsystems
#define UHS_VID_SHAMROCK_TECH 0x044aU // Shamrock Tech. Co., Ltd
#define UHS_VID_WSI 0x044bU // WSI
#define UHS_VID_CCLITRI 0x044cU // CCL/ITRI
#define UHS_VID_SIEMENS_NIXDORF_AG 0x044dU // Siemens Nixdorf AG
#define UHS_VID_ALPS_ELECTRIC_1 0x044eU // Alps Electric Co., Ltd
#define UHS_VID_THRUSTMASTER 0x044fU // ThrustMaster, Inc.
#define UHS_VID_DFI 0x0450U // DFI, Inc.
#define UHS_VID_TEXAS_INSTRUMENTS 0x0451U // Texas Instruments, Inc.
#define UHS_VID_MITSUBISHI_ELECTRONICS_AMERICA 0x0452U // Mitsubishi Electronics America, Inc.
#define UHS_VID_CMD_TECHNOLOGY 0x0453U // CMD Technology
#define UHS_VID_VOBIS_MICROCOMPUTER_AG 0x0454U // Vobis Microcomputer AG
#define UHS_VID_TELEMATICS_INTERNATIONAL 0x0455U // Telematics International, Inc.
#define UHS_VID_ANALOG_DEVICES 0x0456U // Analog Devices, Inc.
#define UHS_VID_SILICON_INTEGRATED_SYSTEMS 0x0457U // Silicon Integrated Systems Corp.
#define UHS_VID_KYE_SYSTEMS_CORP_MOUSE_SYSTEMS 0x0458U // KYE Systems Corp. (Mouse Systems)
#define UHS_VID_ADOBE_SYSTEMS 0x0459U // Adobe Systems, Inc.
#define UHS_VID_SONICBLUE 0x045aU // SONICblue, Inc.
#define UHS_VID_HITACHI 0x045bU // Hitachi, Ltd
#define UHS_VID_NORTEL_NETWORKS 0x045dU // Nortel Networks, Ltd
#define UHS_VID_MICROSOFT 0x045eU // Microsoft Corp.
#define UHS_VID_ACE_CAD_ENTERPRISE 0x0460U // Ace Cad Enterprise Co., Ltd
#define UHS_VID_PRIMAX_ELECTRONICS 0x0461U // Primax Electronics, Ltd
#define UHS_VID_MGE_UPS_SYSTEMS 0x0463U // MGE UPS Systems
#define UHS_VID_AMPTYCOELECTRONICS 0x0464U // AMP/Tycoelectronics Corp.
#define UHS_VID_ATANDT_PARADYNE 0x0467U // AT&T Paradyne
#define UHS_VID_WIESON_TECHNOLOGIES 0x0468U // Wieson Technologies Co., Ltd
#define UHS_VID_CHERRY 0x046aU // Cherry GmbH
#define UHS_VID_AMERICAN_MEGATRENDS 0x046bU // American Megatrends, Inc.
#define UHS_VID_TOSHIBA_CORP_DIGITAL_MEDIA_EQUIPMENT 0x046cU // Toshiba Corp., Digital Media Equipment
#define UHS_VID_LOGITECH 0x046dU // Logitech, Inc.
#define UHS_VID_BEHAVIOR_TECH_COMPUTER 0x046eU // Behavior Tech. Computer Corp.
#define UHS_VID_CRYSTAL_SEMICONDUCTOR 0x046fU // Crystal Semiconductor
#define UHS_VID_PHILIPS_OR_NXP 0x0471U // Philips (or NXP)
#define UHS_VID_CHICONY_ELECTRONICS 0x0472U // Chicony Electronics Co., Ltd
#define UHS_VID_SANYO_INFORMATION_BUSINESS 0x0473U // Sanyo Information Business Co., Ltd
#define UHS_VID_SANYO_ELECTRIC 0x0474U // Sanyo Electric Co., Ltd
#define UHS_VID_RELISYSTECO_INFORMATION_SYSTEM 0x0475U // Relisys/Teco Information System
#define UHS_VID_AESP 0x0476U // AESP
#define UHS_VID_SEAGATE_TECHNOLOGY 0x0477U // Seagate Technology, Inc.
#define UHS_VID_CONNECTIX 0x0478U // Connectix Corp.
#define UHS_VID_ADVANCED_PERIPHERAL_LABORATORIES 0x0479U // Advanced Peripheral Laboratories
#define UHS_VID_SEMTECH 0x047aU // Semtech Corp.
#define UHS_VID_SILITEK 0x047bU // Silitek Corp.
#define UHS_VID_DELL_COMPUTER 0x047cU // Dell Computer Corp.
#define UHS_VID_KENSINGTON 0x047dU // Kensington
#define UHS_VID_AGERE_SYSTEMS_INC_LUCENT 0x047eU // Agere Systems, Inc. (Lucent)
#define UHS_VID_PLANTRONICS 0x047fU // Plantronics, Inc.
#define UHS_VID_TOSHIBA_AMERICA 0x0480U // Toshiba America Inc
#define UHS_VID_ZENITH_DATA_SYSTEMS 0x0481U // Zenith Data Systems
#define UHS_VID_KYOCERA 0x0482U // Kyocera Corp.
#define UHS_VID_STMICROELECTRONICS 0x0483U // STMicroelectronics
#define UHS_VID_SPECIALIX 0x0484U // Specialix
#define UHS_VID_NOKIA_MONITORS 0x0485U // Nokia Monitors
#define UHS_VID_ASUS_COMPUTERS 0x0486U // ASUS Computers, Inc.
#define UHS_VID_STEWART_CONNECTOR 0x0487U // Stewart Connector
#define UHS_VID_CIRQUE 0x0488U // Cirque Corp.
#define UHS_VID_FOXCONN_HON_HAI 0x0489U // Foxconn / Hon Hai
#define UHS_VID_S_MOS_SYSTEMS 0x048aU // S-MOS Systems, Inc.
#define UHS_VID_ALPS_ELECTRIC_IRELAND 0x048cU // Alps Electric Ireland, Ltd
#define UHS_VID_INTEGRATED_TECHNOLOGY_EXPRESS 0x048dU // Integrated Technology Express, Inc.
#define UHS_VID_EICON_TECH 0x048fU // Eicon Tech.
#define UHS_VID_UNITED_MICROELECTRONICS 0x0490U // United Microelectronics Corp.
#define UHS_VID_CAPETRONIC 0x0491U // Capetronic
#define UHS_VID_SAMSUNG_SEMICONDUCTOR 0x0492U // Samsung SemiConductor, Inc.
#define UHS_VID_MAG_TECHNOLOGY 0x0493U // MAG Technology Co., Ltd
#define UHS_VID_ESS_TECHNOLOGY 0x0495U // ESS Technology, Inc.
#define UHS_VID_MICRON_ELECTRONICS 0x0496U // Micron Electronics
#define UHS_VID_SMILE_INTERNATIONAL 0x0497U // Smile International
#define UHS_VID_CAPETRONIC_KAOHSIUNG 0x0498U // Capetronic (Kaohsiung) Corp.
#define UHS_VID_YAMAHA 0x0499U // Yamaha Corp.
#define UHS_VID_GANDALF_TECHNOLOGIES 0x049aU // Gandalf Technologies, Ltd
#define UHS_VID_CURTIS_COMPUTER_PRODUCTS 0x049bU // Curtis Computer Products
#define UHS_VID_ACER_ADVANCED_LABS 0x049cU // Acer Advanced Labs, Inc.
#define UHS_VID_VLSI_TECHNOLOGY 0x049dU // VLSI Technology
#define UHS_VID_COMPAQ_COMPUTER 0x049fU // Compaq Computer Corp.
#define UHS_VID_DIGITAL_EQUIPMENT 0x04a0U // Digital Equipment Corp.
#define UHS_VID_SYSTEMSOFT 0x04a1U // SystemSoft Corp.
#define UHS_VID_FIREPOWER_SYSTEMS 0x04a2U // FirePower Systems
#define UHS_VID_TRIDENT_MICROSYSTEMS 0x04a3U // Trident Microsystems, Inc.
#define UHS_VID_HITACHI_1 0x04a4U // Hitachi, Ltd
#define UHS_VID_ACER_PERIPHERALS_INC_NOW_BENQ 0x04a5U // Acer Peripherals Inc. (now BenQ Corp.)
#define UHS_VID_NOKIA_DISPLAY_PRODUCTS 0x04a6U // Nokia Display Products
#define UHS_VID_VISIONEER 0x04a7U // Visioneer
#define UHS_VID_MULTIVIDEO_LABS 0x04a8U // Multivideo Labs, Inc.
#define UHS_VID_CANON 0x04a9U // Canon, Inc.
#define UHS_VID_DAEWOO_TELECOM 0x04aaU // DaeWoo Telecom, Ltd
#define UHS_VID_CHROMATIC_RESEARCH 0x04abU // Chromatic Research
#define UHS_VID_MICRO_AUDIOMETRICS 0x04acU // Micro Audiometrics Corp.
#define UHS_VID_DOOIN_ELECTRONICS 0x04adU // Dooin Electronics
#define UHS_VID_WINNOV_LP 0x04afU // Winnov L.P.
#define UHS_VID_NIKON 0x04b0U // Nikon Corp.
#define UHS_VID_PAN_INTERNATIONAL 0x04b1U // Pan International
#define UHS_VID_IBM 0x04b3U // IBM Corp.
#define UHS_VID_CYPRESS_SEMICONDUCTOR 0x04b4U // Cypress Semiconductor Corp.
#define UHS_VID_ROHM_LSI_SYSTEMS_USA 0x04b5U // ROHM LSI Systems USA, LLC
#define UHS_VID_HINT 0x04b6U // Hint Corp.
#define UHS_VID_COMPAL_ELECTRONICS 0x04b7U // Compal Electronics, Inc.
#define UHS_VID_SEIKO_EPSON 0x04b8U // Seiko Epson Corp.
#define UHS_VID_RAINBOW_TECHNOLOGIES 0x04b9U // Rainbow Technologies, Inc.
#define UHS_VID_TOUCAN_SYSTEMS 0x04baU // Toucan Systems, Ltd
#define UHS_VID_I_O_DATA_DEVICE 0x04bbU // I-O Data Device, Inc.
#define UHS_VID_TOSHIBA_ELECTRONICS_TAIWAN 0x04bdU // Toshiba Electronics Taiwan Corp.
#define UHS_VID_TELIA_RESEARCH 0x04beU // Telia Research AB
#define UHS_VID_TDK 0x04bfU // TDK Corp.
#define UHS_VID_US_ROBOTICS_3COM 0x04c1U // U.S. Robotics (3Com)
#define UHS_VID_METHODE_ELECTRONICS_FAR_EAST_PTE 0x04c2U // Methode Electronics Far East PTE, Ltd
#define UHS_VID_MAXI_SWITCH 0x04c3U // Maxi Switch, Inc.
#define UHS_VID_LOCKHEED_MARTIN_ENERGY_RESEARCH 0x04c4U // Lockheed Martin Energy Research
#define UHS_VID_FUJITSU 0x04c5U // Fujitsu, Ltd
#define UHS_VID_TOSHIBA_AMERICA_ELECTRONIC_COMPONENTS 0x04c6U // Toshiba America Electronic Components
#define UHS_VID_MICRO_MACRO_TECHNOLOGIES 0x04c7U // Micro Macro Technologies
#define UHS_VID_KONICA 0x04c8U // Konica Corp.
#define UHS_VID_LITE_ON_TECHNOLOGY 0x04caU // Lite-On Technology Corp.
#define UHS_VID_FUJI_PHOTO_FILM 0x04cbU // Fuji Photo Film Co., Ltd
#define UHS_VID_ST_ERICSSON 0x04ccU // ST-Ericsson
#define UHS_VID_TATUNG_CO_OF_AMERICA 0x04cdU // Tatung Co. Of America
#define UHS_VID_SCANLOGIC 0x04ceU // ScanLogic Corp.
#define UHS_VID_MYSON_CENTURY 0x04cfU // Myson Century, Inc.
#define UHS_VID_DIGI_INTERNATIONAL 0x04d0U // Digi International
#define UHS_VID_ITT_CANON 0x04d1U // ITT Canon
#define UHS_VID_ALTEC_LANSING_TECHNOLOGIES 0x04d2U // Altec Lansing Technologies
#define UHS_VID_VIDUS 0x04d3U // VidUS, Inc.
#define UHS_VID_LSI_LOGIC 0x04d4U // LSI Logic, Inc.
#define UHS_VID_FORTE_TECHNOLOGIES 0x04d5U // Forte Technologies, Inc.
#define UHS_VID_MENTOR_GRAPHICS 0x04d6U // Mentor Graphics
#define UHS_VID_OKI_SEMICONDUCTOR 0x04d7U // Oki Semiconductor
#define UHS_VID_MICROCHIP_TECHNOLOGY 0x04d8U // Microchip Technology, Inc.
#define UHS_VID_HOLTEK_SEMICONDUCTOR 0x04d9U // Holtek Semiconductor, Inc.
#define UHS_VID_PANASONIC_MATSUSHITA 0x04daU // Panasonic (Matsushita)
#define UHS_VID_HYPERTEC_PTY 0x04dbU // Hypertec Pty, Ltd
#define UHS_VID_HUAN_HSIN_HOLDINGS 0x04dcU // Huan Hsin Holdings, Ltd
#define UHS_VID_SHARP 0x04ddU // Sharp Corp.
#define UHS_VID_MINDSHARE 0x04deU // MindShare, Inc.
#define UHS_VID_INTERLINK_ELECTRONICS 0x04dfU // Interlink Electronics
#define UHS_VID_IIYAMA_NORTH_AMERICA 0x04e1U // Iiyama North America, Inc.
#define UHS_VID_EXAR 0x04e2U // Exar Corp.
#define UHS_VID_ZILOG 0x04e3U // Zilog, Inc.
#define UHS_VID_ACC_MICROELECTRONICS 0x04e4U // ACC Microelectronics
#define UHS_VID_PROMISE_TECHNOLOGY 0x04e5U // Promise Technology
#define UHS_VID_SCM_MICROSYSTEMS 0x04e6U // SCM Microsystems, Inc.
#define UHS_VID_ELO_TOUCHSYSTEMS 0x04e7U // Elo TouchSystems
#define UHS_VID_SAMSUNG_ELECTRONICS 0x04e8U // Samsung Electronics Co., Ltd
#define UHS_VID_PC_TEL 0x04e9U // PC-Tel, Inc.
#define UHS_VID_BROOKTREE 0x04eaU // Brooktree Corp.
#define UHS_VID_NORTHSTAR_SYSTEMS 0x04ebU // Northstar Systems, Inc.
#define UHS_VID_TOKYO_ELECTRON_DEVICE 0x04ecU // Tokyo Electron Device, Ltd
#define UHS_VID_ANNABOOKS 0x04edU // Annabooks
#define UHS_VID_PACIFIC_ELECTRONIC_INTERNATIONAL 0x04efU // Pacific Electronic International, Inc.
#define UHS_VID_DAEWOO_ELECTRONICS 0x04f0U // Daewoo Electronics Co., Ltd
#define UHS_VID_VICTOR_COMPANY_OF_JAPAN 0x04f1U // Victor Company of Japan, Ltd
#define UHS_VID_CHICONY_ELECTRONICS_1 0x04f2U // Chicony Electronics Co., Ltd
#define UHS_VID_ELAN_MICROELECTRONICS 0x04f3U // Elan Microelectronics Corp.
#define UHS_VID_HARTING_ELEKTRONIK 0x04f4U // Harting Elektronik, Inc.
#define UHS_VID_FUJITSU_ICL_SYSTEMS 0x04f5U // Fujitsu-ICL Systems, Inc.
#define UHS_VID_NORAND 0x04f6U // Norand Corp.
#define UHS_VID_NEWNEX_TECHNOLOGY 0x04f7U // Newnex Technology Corp.
#define UHS_VID_FUTUREPLUS_SYSTEMS 0x04f8U // FuturePlus Systems
#define UHS_VID_BROTHER_INDUSTRIES 0x04f9U // Brother Industries, Ltd
#define UHS_VID_DALLAS_SEMICONDUCTOR 0x04faU // Dallas Semiconductor
#define UHS_VID_BIOSTAR_MICROTECH_INTERNATIONAL 0x04fbU // Biostar Microtech International Corp.
#define UHS_VID_SUNPLUS_TECHNOLOGY 0x04fcU // Sunplus Technology Co., Ltd
#define UHS_VID_SOLITON_SYSTEMS_KK 0x04fdU // Soliton Systems, K.K.
#define UHS_VID_PFU 0x04feU // PFU, Ltd
#define UHS_VID_E_CMOS 0x04ffU // E-CMOS Corp.
#define UHS_VID_SIAM_UNITED_HI_TECH 0x0500U // Siam United Hi-Tech
#define UHS_VID_FUJIKURA_DDK 0x0501U // Fujikura DDK, Ltd
#define UHS_VID_ACER_1 0x0502U // Acer, Inc.
#define UHS_VID_HITACHI_AMERICA 0x0503U // Hitachi America, Ltd
#define UHS_VID_HAYES_MICROCOMPUTER_PRODUCTS 0x0504U // Hayes Microcomputer Products
#define UHS_VID_3COM 0x0506U // 3Com Corp.
#define UHS_VID_HOSIDEN 0x0507U // Hosiden Corp.
#define UHS_VID_CLARION 0x0508U // Clarion Co., Ltd
#define UHS_VID_AZTECH_SYSTEMS 0x0509U // Aztech Systems, Ltd
#define UHS_VID_CINCH_CONNECTORS 0x050aU // Cinch Connectors
#define UHS_VID_CABLE_SYSTEM_INTERNATIONAL 0x050bU // Cable System International
#define UHS_VID_INNOMEDIA 0x050cU // InnoMedia, Inc.
#define UHS_VID_BELKIN_COMPONENTS 0x050dU // Belkin Components
#define UHS_VID_NEON_TECHNOLOGY 0x050eU // Neon Technology, Inc.
#define UHS_VID_KC_TECHNOLOGY 0x050fU // KC Technology, Inc.
#define UHS_VID_SEJIN_ELECTRON 0x0510U // Sejin Electron, Inc.
#define UHS_VID_NABLE_DATABOOK_TECHNOLOGIES 0x0511U // N'Able (DataBook) Technologies, Inc.
#define UHS_VID_HUALON_MICROELECTRONICS 0x0512U // Hualon Microelectronics Corp.
#define UHS_VID_DIGITAL_X 0x0513U // digital-X, Inc.
#define UHS_VID_FCI_ELECTRONICS 0x0514U // FCI Electronics
#define UHS_VID_ACTC 0x0515U // ACTC
#define UHS_VID_LONGWELL_ELECTRONICS 0x0516U // Longwell Electronics
#define UHS_VID_BUTTERFLY_COMMUNICATIONS 0x0517U // Butterfly Communications
#define UHS_VID_EZKEY 0x0518U // EzKEY Corp.
#define UHS_VID_STAR_MICRONICS 0x0519U // Star Micronics Co., Ltd
#define UHS_VID_WYSE_TECHNOLOGY 0x051aU // WYSE Technology
#define UHS_VID_SILICON_GRAPHICS 0x051bU // Silicon Graphics
#define UHS_VID_SHUTTLE 0x051cU // Shuttle, Inc.
#define UHS_VID_AMERICAN_POWER_CONVERSION 0x051dU // American Power Conversion
#define UHS_VID_SCIENTIFIC_ATLANTA 0x051eU // Scientific Atlanta, Inc.
#define UHS_VID_IO_SYSTEMS_ELITE_ELECTRONICS 0x051fU // IO Systems (Elite Electronics), Inc.
#define UHS_VID_TAIWAN_SEMICONDUCTOR_MANUFACTURING 0x0520U // Taiwan Semiconductor Manufacturing Co.
#define UHS_VID_AIRBORN_CONNECTORS 0x0521U // Airborn Connectors
#define UHS_VID_ADVANCED_CONNECTEK 0x0522U // Advanced Connectek, Inc.
#define UHS_VID_ATEN 0x0523U // ATEN GmbH
#define UHS_VID_SOLA_ELECTRONICS 0x0524U // Sola Electronics
#define UHS_VID_NETCHIP_TECHNOLOGY 0x0525U // Netchip Technology, Inc.
#define UHS_VID_TEMIC_MHS 0x0526U // Temic MHS S.A.
#define UHS_VID_ALTRA 0x0527U // ALTRA
#define UHS_VID_ATI_TECHNOLOGIES 0x0528U // ATI Technologies, Inc.
#define UHS_VID_ALADDIN_KNOWLEDGE_SYSTEMS 0x0529U // Aladdin Knowledge Systems
#define UHS_VID_CRESCENT_HEART_SOFTWARE 0x052aU // Crescent Heart Software
#define UHS_VID_TEKOM_TECHNOLOGIES 0x052bU // Tekom Technologies, Inc.
#define UHS_VID_CANON_INFORMATION_SYSTEMS 0x052cU // Canon Information Systems, Inc.
#define UHS_VID_AVID_ELECTRONICS 0x052dU // Avid Electronics Corp.
#define UHS_VID_STANDARD_MICROSYSTEMS_1 0x052eU // Standard Microsystems Corp.
#define UHS_VID_UNICORE_SOFTWARE 0x052fU // Unicore Software, Inc.
#define UHS_VID_AMERICAN_MICROSYSTEMS 0x0530U // American Microsystems, Inc.
#define UHS_VID_WACOM_TECHNOLOGY 0x0531U // Wacom Technology Corp.
#define UHS_VID_SYSTECH 0x0532U // Systech Corp.
#define UHS_VID_ALCATEL_MOBILE_PHONES 0x0533U // Alcatel Mobile Phones
#define UHS_VID_MOTOROLA 0x0534U // Motorola, Inc.
#define UHS_VID_LIH_TZU_ELECTRIC 0x0535U // LIH TZU Electric Co., Ltd
#define UHS_VID_HAND_HELD_PRODUCTS_WELCH_ALLYN 0x0536U // Hand Held Products (Welch Allyn, Inc.)
#define UHS_VID_INVENTEC 0x0537U // Inventec Corp.
#define UHS_VID_CALDERA_INTERNATIONAL_INC_SCO 0x0538U // Caldera International, Inc. (SCO)
#define UHS_VID_SHYH_SHIUN_TERMINALS 0x0539U // Shyh Shiun Terminals Co., Ltd
#define UHS_VID_PREHKEYTEC 0x053aU // PrehKeyTec GmbH
#define UHS_VID_GLOBAL_VILLAGE_COMMUNICATION 0x053bU // Global Village Communication
#define UHS_VID_INSTITUT_OF_MICROELECTRONIC_AND_MECHATRONIC_SYSTEMS 0x053cU // Institut of Microelectronic & Mechatronic Systems
#define UHS_VID_SILICON_ARCHITECT 0x053dU // Silicon Architect
#define UHS_VID_MOBILITY_ELECTRONICS 0x053eU // Mobility Electronics
#define UHS_VID_SYNOPSYS_1 0x053fU // Synopsys, Inc.
#define UHS_VID_UNIACCESS 0x0540U // UniAccess AB
#define UHS_VID_SIRF_TECHNOLOGY 0x0541U // Sirf Technology, Inc.
#define UHS_VID_VIEWSONIC 0x0543U // ViewSonic Corp.
#define UHS_VID_CRISTIE_ELECTRONICS 0x0544U // Cristie Electronics, Ltd
#define UHS_VID_XIRLINK 0x0545U // Xirlink, Inc.
#define UHS_VID_POLAROID 0x0546U // Polaroid Corp.
#define UHS_VID_ANCHOR_CHIPS 0x0547U // Anchor Chips, Inc.
#define UHS_VID_TYAN_COMPUTER 0x0548U // Tyan Computer Corp.
#define UHS_VID_PIXERA 0x0549U // Pixera Corp.
#define UHS_VID_FUJITSU_MICROELECTRONICS 0x054aU // Fujitsu Microelectronics, Inc.
#define UHS_VID_NEW_MEDIA 0x054bU // New Media Corp.
#define UHS_VID_SONY 0x054cU // Sony Corp.
#define UHS_VID_TRY 0x054dU // Try Corp.
#define UHS_VID_PROSIDE 0x054eU // Proside Corp.
#define UHS_VID_WYSE_TECHNOLOGY_TAIWAN 0x054fU // WYSE Technology Taiwan
#define UHS_VID_FUJI_XEROX 0x0550U // Fuji Xerox Co., Ltd
#define UHS_VID_COMPUTREND_SYSTEMS 0x0551U // CompuTrend Systems, Inc.
#define UHS_VID_PHILIPS_MONITORS 0x0552U // Philips Monitors
#define UHS_VID_STMICROELECTRONICS_IMAGING_DIVISION_VLSI_VISION 0x0553U // STMicroelectronics Imaging Division (VLSI Vision)
#define UHS_VID_DICTAPHONE 0x0554U // Dictaphone Corp.
#define UHS_VID_ANAM_SANDT 0x0555U // ANAM S&T Co., Ltd
#define UHS_VID_ASAHI_KASEI_MICROSYSTEMS 0x0556U // Asahi Kasei Microsystems Co., Ltd
#define UHS_VID_ATEN_INTERNATIONAL 0x0557U // ATEN International Co., Ltd
#define UHS_VID_TRUEVISION 0x0558U // Truevision, Inc.
#define UHS_VID_CADENCE_DESIGN_SYSTEMS 0x0559U // Cadence Design Systems, Inc.
#define UHS_VID_KENWOOD_USA 0x055aU // Kenwood USA
#define UHS_VID_KNOWLEDGETEK 0x055bU // KnowledgeTek, Inc.
#define UHS_VID_PROTON_ELECTRONIC_IND 0x055cU // Proton Electronic Ind.
#define UHS_VID_SAMSUNG_ELECTRO_MECHANICS 0x055dU // Samsung Electro-Mechanics Co.
#define UHS_VID_CTX_OPTO_ELECTRONICS 0x055eU // CTX Opto-Electronics Corp.
#define UHS_VID_MUSTEK_SYSTEMS 0x055fU // Mustek Systems, Inc.
#define UHS_VID_INTERFACE 0x0560U // Interface Corp.
#define UHS_VID_OASIS_DESIGN 0x0561U // Oasis Design, Inc.
#define UHS_VID_TELEX_COMMUNICATIONS 0x0562U // Telex Communications, Inc.
#define UHS_VID_IMMERSION 0x0563U // Immersion Corp.
#define UHS_VID_KODAK_DIGITAL_PRODUCT_CENTER_JAPAN_LTD_FORMERLY_CHINON_INDUSTRIES 0x0564U // Kodak Digital Product Center, Japan Ltd. (formerly Chinon Industries Inc.)
#define UHS_VID_PERACOM_NETWORKS 0x0565U // Peracom Networks, Inc.
#define UHS_VID_MONTEREY_INTERNATIONAL 0x0566U // Monterey International Corp.
#define UHS_VID_XYRATEX_INTERNATIONAL 0x0567U // Xyratex International, Ltd
#define UHS_VID_QUARTZ_INGENIERIE 0x0568U // Quartz Ingenierie
#define UHS_VID_SEGASOFT 0x0569U // SegaSoft
#define UHS_VID_WACOM 0x056aU // Wacom Co., Ltd
#define UHS_VID_DECICON 0x056bU // Decicon, Inc.
#define UHS_VID_ETEK_LABS 0x056cU // eTEK Labs
#define UHS_VID_EIZO 0x056dU // EIZO Corp.
#define UHS_VID_ELECOM 0x056eU // Elecom Co., Ltd
#define UHS_VID_KOREA_DATA_SYSTEMS 0x056fU // Korea Data Systems Co., Ltd
#define UHS_VID_EPSON_AMERICA 0x0570U // Epson America
#define UHS_VID_INTEREX 0x0571U // Interex, Inc.
#define UHS_VID_CONEXANT_SYSTEMS_ROCKWELL 0x0572U // Conexant Systems (Rockwell), Inc.
#define UHS_VID_ZORAN_CO_PERSONAL_MEDIA_DIVISION_NOGATECH 0x0573U // Zoran Co. Personal Media Division (Nogatech)
#define UHS_VID_CITY_UNIVERSITY_OF_HONG_KONG 0x0574U // City University of Hong Kong
#define UHS_VID_PHILIPS_CREATIVE_DISPLAY_SOLUTIONS 0x0575U // Philips Creative Display Solutions
#define UHS_VID_BAFOQUALITY_COMPUTER_ACCESSORIES 0x0576U // BAFO/Quality Computer Accessories
#define UHS_VID_ELSA 0x0577U // ELSA
#define UHS_VID_INTRINSIX 0x0578U // Intrinsix Corp.
#define UHS_VID_GVC 0x0579U // GVC Corp.
#define UHS_VID_SAMSUNG_ELECTRONICS_AMERICA 0x057aU // Samsung Electronics America
#define UHS_VID_Y_E_DATA 0x057bU // Y-E Data, Inc.
#define UHS_VID_AVM 0x057cU // AVM GmbH
#define UHS_VID_SHARK_MULTIMEDIA 0x057dU // Shark Multimedia, Inc.
#define UHS_VID_NINTENDO 0x057eU // Nintendo Co., Ltd
#define UHS_VID_QUICKSHOT 0x057fU // QuickShot, Ltd
#define UHS_VID_DENRON 0x0580U // Denron, Inc.
#define UHS_VID_RACAL_DATA_GROUP 0x0581U // Racal Data Group
#define UHS_VID_ROLAND 0x0582U // Roland Corp.
#define UHS_VID_PADIX_CO_LTD_ROCKFIRE 0x0583U // Padix Co., Ltd (Rockfire)
#define UHS_VID_RATOC_SYSTEM 0x0584U // RATOC System, Inc.
#define UHS_VID_FLASHPOINT_TECHNOLOGY 0x0585U // FlashPoint Technology, Inc.
#define UHS_VID_ZYXEL_COMMUNICATIONS 0x0586U // ZyXEL Communications Corp.
#define UHS_VID_AMERICA_KOTOBUKI_ELECTRONICS_INDUSTRIES 0x0587U // America Kotobuki Electronics Industries, Inc.
#define UHS_VID_SAPIEN_DESIGN 0x0588U // Sapien Design
#define UHS_VID_VICTRON 0x0589U // Victron
#define UHS_VID_NOHAU 0x058aU // Nohau Corp.
#define UHS_VID_INFINEON_TECHNOLOGIES 0x058bU // Infineon Technologies
#define UHS_VID_IN_FOCUS_SYSTEMS 0x058cU // In Focus Systems
#define UHS_VID_MICREL_SEMICONDUCTOR 0x058dU // Micrel Semiconductor
#define UHS_VID_TRIPATH_TECHNOLOGY 0x058eU // Tripath Technology, Inc.
#define UHS_VID_ALCOR_MICRO 0x058fU // Alcor Micro Corp.
#define UHS_VID_OMRON 0x0590U // Omron Corp.
#define UHS_VID_QUESTRA_CONSULTING 0x0591U // Questra Consulting
#define UHS_VID_POWERWARE 0x0592U // Powerware Corp.
#define UHS_VID_INCITE 0x0593U // Incite
#define UHS_VID_PRINCETON_GRAPHIC_SYSTEMS 0x0594U // Princeton Graphic Systems
#define UHS_VID_ZORAN_MICROELECTRONICS 0x0595U // Zoran Microelectronics, Ltd
#define UHS_VID_MICROTOUCH_SYSTEMS 0x0596U // MicroTouch Systems, Inc.
#define UHS_VID_TRISIGNAL_COMMUNICATIONS 0x0597U // Trisignal Communications
#define UHS_VID_NIIGATA_CANOTEC 0x0598U // Niigata Canotec Co., Inc.
#define UHS_VID_BRILLIANCE_SEMICONDUCTOR 0x0599U // Brilliance Semiconductor, Inc.
#define UHS_VID_SPECTRUM_SIGNAL_PROCESSING 0x059aU // Spectrum Signal Processing, Inc.
#define UHS_VID_IOMEGA 0x059bU // Iomega Corp.
#define UHS_VID_A_TREND_TECHNOLOGY 0x059cU // A-Trend Technology Co., Ltd
#define UHS_VID_ADVANCED_INPUT_DEVICES 0x059dU // Advanced Input Devices
#define UHS_VID_INTELLIGENT_INSTRUMENTATION 0x059eU // Intelligent Instrumentation
#define UHS_VID_LACIE 0x059fU // LaCie, Ltd
#define UHS_VID_VETRONIX 0x05a0U // Vetronix Corp.
#define UHS_VID_USC 0x05a1U // USC Corp.
#define UHS_VID_FUJI_FILM_MICRODEVICES 0x05a2U // Fuji Film Microdevices Co., Ltd
#define UHS_VID_ARC_INTERNATIONAL 0x05a3U // ARC International
#define UHS_VID_ORTEK_TECHNOLOGY 0x05a4U // Ortek Technology, Inc.
#define UHS_VID_SAMPO_TECHNOLOGY 0x05a5U // Sampo Technology Corp.
#define UHS_VID_CISCO_SYSTEMS 0x05a6U // Cisco Systems, Inc.
#define UHS_VID_BOSE 0x05a7U // Bose Corp.
#define UHS_VID_SPACETEC_IMC 0x05a8U // Spacetec IMC Corp.
#define UHS_VID_OMNIVISION_TECHNOLOGIES 0x05a9U // OmniVision Technologies, Inc.
#define UHS_VID_UTILUX_SOUTH_CHINA 0x05aaU // Utilux South China, Ltd
#define UHS_VID_IN_SYSTEM_DESIGN 0x05abU // In-System Design
#define UHS_VID_APPLE 0x05acU // Apple, Inc.
#define UHS_VID_YC_CABLE_USA 0x05adU // Y.C. Cable U.S.A., Inc.
#define UHS_VID_SYNOPSYS_2 0x05aeU // Synopsys, Inc.
#define UHS_VID_JING_MOLD_ENTERPRISE 0x05afU // Jing-Mold Enterprise Co., Ltd
#define UHS_VID_FOUNTAIN_TECHNOLOGIES 0x05b0U // Fountain Technologies, Inc.
#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER 0x05b1U // First International Computer, Inc.
#define UHS_VID_LG_SEMICON 0x05b4U // LG Semicon Co., Ltd
#define UHS_VID_DIALOGIC 0x05b5U // Dialogic Corp.
#define UHS_VID_PROXIMA 0x05b6U // Proxima Corp.
#define UHS_VID_MEDIANIX_SEMICONDUCTOR 0x05b7U // Medianix Semiconductor, Inc.
#define UHS_VID_AGILER 0x05b8U // Agiler, Inc.
#define UHS_VID_PHILIPS_RESEARCH_LABORATORIES 0x05b9U // Philips Research Laboratories
#define UHS_VID_DIGITALPERSONA 0x05baU // DigitalPersona, Inc.
#define UHS_VID_GREY_CELL_SYSTEMS 0x05bbU // Grey Cell Systems
#define UHS_VID_3G_GREEN_GREEN_GLOBE 0x05bcU // 3G Green Green Globe Co., Ltd
#define UHS_VID_RAFI_GMBH_AND_CO_KG 0x05bdU // RAFI GmbH & Co. KG
#define UHS_VID_TYCO_ELECTRONICS_RAYCHEM 0x05beU // Tyco Electronics (Raychem)
#define UHS_VID_S_AND_S_RESEARCH 0x05bfU // S & S Research
#define UHS_VID_KEIL_SOFTWARE 0x05c0U // Keil Software
#define UHS_VID_KAWASAKI_MICROELECTRONICS 0x05c1U // Kawasaki Microelectronics, Inc.
#define UHS_VID_MEDIA_PHONICS_SUISSE 0x05c2U // Media Phonics (Suisse) S.A.
#define UHS_VID_DIGI_INTERNATIONAL_1 0x05c5U // Digi International, Inc.
#define UHS_VID_QUALCOMM 0x05c6U // Qualcomm, Inc.
#define UHS_VID_QTRONIX 0x05c7U // Qtronix Corp.
#define UHS_VID_CHENG_UEI_PRECISION_INDUSTRY_CO_LTD_FOXLINK 0x05c8U // Cheng Uei Precision Industry Co., Ltd (Foxlink)
#define UHS_VID_SEMTECH_1 0x05c9U // Semtech Corp.
#define UHS_VID_RICOH 0x05caU // Ricoh Co., Ltd
#define UHS_VID_POWERVISION_TECHNOLOGIES 0x05cbU // PowerVision Technologies, Inc.
#define UHS_VID_ELSA_AG 0x05ccU // ELSA AG
#define UHS_VID_SILICOM 0x05cdU // Silicom, Ltd
#define UHS_VID_SCI_WORX 0x05ceU // sci-worx GmbH
#define UHS_VID_SUNG_FORN 0x05cfU // Sung Forn Co., Ltd
#define UHS_VID_GE_MEDICAL_SYSTEMS_LUNAR 0x05d0U // GE Medical Systems Lunar
#define UHS_VID_BRAINBOXES 0x05d1U // Brainboxes, Ltd
#define UHS_VID_WAVE_SYSTEMS 0x05d2U // Wave Systems Corp.
#define UHS_VID_TOHOKU_RICOH 0x05d3U // Tohoku Ricoh Co., Ltd
#define UHS_VID_SUPER_GATE_TECHNOLOGY 0x05d5U // Super Gate Technology Co., Ltd
#define UHS_VID_PHILIPS_SEMICONDUCTORS_CICT 0x05d6U // Philips Semiconductors, CICT
#define UHS_VID_THOMAS_AND_BETTS 0x05d7U // Thomas & Betts Corp.
#define UHS_VID_ULTIMA_ELECTRONICS 0x05d8U // Ultima Electronics Corp.
#define UHS_VID_AXIOHM_TRANSACTION_SOLUTIONS 0x05d9U // Axiohm Transaction Solutions
#define UHS_VID_MICROTEK_INTERNATIONAL 0x05daU // Microtek International, Inc.
#define UHS_VID_SUN_CORP_SUNTAC_UNKNOWN 0x05dbU // Sun Corp. (Suntac?)
#define UHS_VID_LEXAR_MEDIA 0x05dcU // Lexar Media, Inc.
#define UHS_VID_DELTA_ELECTRONICS 0x05ddU // Delta Electronics, Inc.
#define UHS_VID_SILICON_VISION 0x05dfU // Silicon Vision, Inc.
#define UHS_VID_SYMBOL_TECHNOLOGIES 0x05e0U // Symbol Technologies
#define UHS_VID_SYNTEK_SEMICONDUCTOR 0x05e1U // Syntek Semiconductor Co., Ltd
#define UHS_VID_ELECVISION 0x05e2U // ElecVision, Inc.
#define UHS_VID_GENESYS_LOGIC 0x05e3U // Genesys Logic, Inc.
#define UHS_VID_RED_WING 0x05e4U // Red Wing Corp.
#define UHS_VID_FUJI_ELECTRIC 0x05e5U // Fuji Electric Co., Ltd
#define UHS_VID_KEITHLEY_INSTRUMENTS 0x05e6U // Keithley Instruments
#define UHS_VID_ICC 0x05e8U // ICC, Inc.
#define UHS_VID_KAWASAKI_LSI 0x05e9U // Kawasaki LSI
#define UHS_VID_FFC 0x05ebU // FFC, Ltd
#define UHS_VID_COM21 0x05ecU // COM21, Inc.
#define UHS_VID_CYTECHINFO 0x05eeU // Cytechinfo Inc.
#define UHS_VID_AVB_INC_ANKO_UNKNOWN_ 0x05efU // AVB, Inc. [anko?]
#define UHS_VID_CANOPUS 0x05f0U // Canopus Co., Ltd
#define UHS_VID_COMPASS_COMMUNICATIONS 0x05f1U // Compass Communications
#define UHS_VID_DEXIN 0x05f2U // Dexin Corp., Ltd
#define UHS_VID_PI_ENGINEERING 0x05f3U // PI Engineering, Inc.
#define UHS_VID_UNIXTAR_TECHNOLOGY 0x05f5U // Unixtar Technology, Inc.
#define UHS_VID_AOC_INTERNATIONAL 0x05f6U // AOC International
#define UHS_VID_RFC_DISTRIBUTIONS_PTE 0x05f7U // RFC Distribution(s) PTE, Ltd
#define UHS_VID_PSC_SCANNING 0x05f9U // PSC Scanning, Inc.
#define UHS_VID_SIEMENS_TELECOMMUNICATIONS_SYSTEMS 0x05faU // Siemens Telecommunications Systems, Ltd
#define UHS_VID_HARMAN 0x05fcU // Harman
#define UHS_VID_INTERACT 0x05fdU // InterAct, Inc.
#define UHS_VID_CHIC_TECHNOLOGY 0x05feU // Chic Technology Corp.
#define UHS_VID_LECROY 0x05ffU // LeCroy Corp.
#define UHS_VID_BARCO_DISPLAY_SYSTEMS 0x0600U // Barco Display Systems
#define UHS_VID_JAZZ_HIPSTER 0x0601U // Jazz Hipster Corp.
#define UHS_VID_VISTA_IMAGING 0x0602U // Vista Imaging, Inc.
#define UHS_VID_NOVATEK_MICROELECTRONICS 0x0603U // Novatek Microelectronics Corp.
#define UHS_VID_JEAN 0x0604U // Jean Co., Ltd
#define UHS_VID_ANCHOR_CANDC 0x0605U // Anchor C&C Co., Ltd
#define UHS_VID_ROYAL_INFORMATION_ELECTRONICS 0x0606U // Royal Information Electronics Co., Ltd
#define UHS_VID_BRIDGE_INFORMATION 0x0607U // Bridge Information Co., Ltd
#define UHS_VID_GENRAD_ADS 0x0608U // Genrad Ads
#define UHS_VID_SMK_MANUFACTURING 0x0609U // SMK Manufacturing, Inc.
#define UHS_VID_WORTHINGTON_DATA_SOLUTIONS 0x060aU // Worthington Data Solutions, Inc.
#define UHS_VID_SOLID_YEAR 0x060bU // Solid Year
#define UHS_VID_EEH_DATALINK 0x060cU // EEH Datalink GmbH
#define UHS_VID_AUCTOR 0x060dU // Auctor Corp.
#define UHS_VID_TRANSMONDE_TECHNOLOGIES 0x060eU // Transmonde Technologies, Inc.
#define UHS_VID_JOINSOON_ELECTRONICS_MFG 0x060fU // Joinsoon Electronics Mfg. Co., Ltd
#define UHS_VID_COSTAR_ELECTRONICS 0x0610U // Costar Electronics, Inc.
#define UHS_VID_TOTOKU_ELECTRIC 0x0611U // Totoku Electric Co., Ltd
#define UHS_VID_TRANSACT_TECHNOLOGIES 0x0613U // TransAct Technologies, Inc.
#define UHS_VID_BIO_RAD_LABORATORIES 0x0614U // Bio-Rad Laboratories
#define UHS_VID_QUABBIN_WIRE_AND_CABLE 0x0615U // Quabbin Wire & Cable Co., Inc.
#define UHS_VID_FUTURE_TECHNO_DESIGNS_PVT 0x0616U // Future Techno Designs PVT, Ltd
#define UHS_VID_SWISS_FEDERAL_INSITUTE_OF_TECHNOLOGY 0x0617U // Swiss Federal Insitute of Technology
#define UHS_VID_MACALLY 0x0618U // MacAlly
#define UHS_VID_SEIKO_INSTRUMENTS 0x0619U // Seiko Instruments, Inc.
#define UHS_VID_VERIDICOM_INTERNATIONAL 0x061aU // Veridicom International, Inc.
#define UHS_VID_PROMPTUS_COMMUNICATIONS 0x061bU // Promptus Communications, Inc.
#define UHS_VID_ACT_LABS 0x061cU // Act Labs, Ltd
#define UHS_VID_QUATECH 0x061dU // Quatech, Inc.
#define UHS_VID_NISSEI_ELECTRIC 0x061eU // Nissei Electric Co.
#define UHS_VID_ALARIS 0x0620U // Alaris, Inc.
#define UHS_VID_ODU_STECKVERBINDUNGSSYSTEME_GMBH_AND_CO_KG 0x0621U // ODU-Steckverbindungssysteme GmbH & Co. KG
#define UHS_VID_IOTECH 0x0622U // Iotech, Inc.
#define UHS_VID_LITTELFUSE 0x0623U // Littelfuse, Inc.
#define UHS_VID_AVOCENT 0x0624U // Avocent Corp.
#define UHS_VID_TIMEDIA_TECHNOLOGY 0x0625U // TiMedia Technology Co., Ltd
#define UHS_VID_NIPPON_SYSTEMS_DEVELOPMENT 0x0626U // Nippon Systems Development Co., Ltd
#define UHS_VID_ADOMAX_TECHNOLOGY 0x0627U // Adomax Technology Co., Ltd
#define UHS_VID_TASKING_SOFTWARE 0x0628U // Tasking Software, Inc.
#define UHS_VID_ZIDA_TECHNOLOGIES 0x0629U // Zida Technologies, Ltd
#define UHS_VID_CREATIVE_LABS 0x062aU // Creative Labs
#define UHS_VID_GREATLINK_ELECTRONICS_TAIWAN 0x062bU // Greatlink Electronics Taiwan, Ltd
#define UHS_VID_INSTITUTE_FOR_INFORMATION_INDUSTRY 0x062cU // Institute for Information Industry
#define UHS_VID_TAIWAN_TAI_HAO_ENTERPRISES 0x062dU // Taiwan Tai-Hao Enterprises Co., Ltd
#define UHS_VID_MAINSUPER_ENTERPRISES 0x062eU // Mainsuper Enterprises Co., Ltd
#define UHS_VID_SIN_SHENG_TERMINAL_AND_MACHINE 0x062fU // Sin Sheng Terminal & Machine, Inc.
#define UHS_VID_JUJO_ELECTRONICS 0x0631U // JUJO Electronics Corp.
#define UHS_VID_CYRIX 0x0633U // Cyrix Corp.
#define UHS_VID_MICRON_TECHNOLOGY 0x0634U // Micron Technology, Inc.
#define UHS_VID_METHODE_ELECTRONICS 0x0635U // Methode Electronics, Inc.
#define UHS_VID_SIERRA_IMAGING 0x0636U // Sierra Imaging, Inc.
#define UHS_VID_AVISION 0x0638U // Avision, Inc.
#define UHS_VID_CHRONTEL 0x0639U // Chrontel, Inc.
#define UHS_VID_TECHWIN 0x063aU // Techwin Corp.
#define UHS_VID_TAUGAGREINING_HF_1 0x063bU // Taugagreining HF
#define UHS_VID_YAMAICHI_ELECTRONICS_CO_LTD_SAKURA 0x063cU // Yamaichi Electronics Co., Ltd (Sakura)
#define UHS_VID_FONG_KAI_INDUSTRIAL 0x063dU // Fong Kai Industrial Co., Ltd
#define UHS_VID_REALMEDIA_TECHNOLOGY 0x063eU // RealMedia Technology, Inc.
#define UHS_VID_NEW_TECHNOLOGY_CABLE 0x063fU // New Technology Cable, Ltd
#define UHS_VID_HITEX_DEVELOPMENT_TOOLS 0x0640U // Hitex Development Tools
#define UHS_VID_WOODS_INDUSTRIES 0x0641U // Woods Industries, Inc.
#define UHS_VID_VIA_MEDICAL 0x0642U // VIA Medical Corp.
#define UHS_VID_TEAC 0x0644U // TEAC Corp.
#define UHS_VID_WHO_UNKNOWN_VISION_SYSTEMS 0x0645U // Who? Vision Systems, Inc.
#define UHS_VID_UMAX 0x0646U // UMAX
#define UHS_VID_ACTON_RESEARCH 0x0647U // Acton Research Corp.
#define UHS_VID_INSIDE_OUT_NETWORKS 0x0648U // Inside Out Networks
#define UHS_VID_WELI_SCIENCE 0x0649U // Weli Science Co., Ltd
#define UHS_VID_ANALOG_DEVICES_INC_WHITE_MOUNTAIN_DSP 0x064bU // Analog Devices, Inc. (White Mountain DSP)
#define UHS_VID_JI_HAW_INDUSTRIAL 0x064cU // Ji-Haw Industrial Co., Ltd
#define UHS_VID_TRITECH_MICROELECTRONICS 0x064dU // TriTech Microelectronics, Ltd
#define UHS_VID_SUYIN 0x064eU // Suyin Corp.
#define UHS_VID_WIBU_SYSTEMS_AG 0x064fU // WIBU-Systems AG
#define UHS_VID_DYNAPRO_SYSTEMS 0x0650U // Dynapro Systems
#define UHS_VID_LIKOM_TECHNOLOGY_SDN_BHD 0x0651U // Likom Technology Sdn. Bhd.
#define UHS_VID_STARGATE_SOLUTIONS 0x0652U // Stargate Solutions, Inc.
#define UHS_VID_CNF 0x0653U // CNF, Inc.
#define UHS_VID_GRANITE_MICROSYSTEMS 0x0654U // Granite Microsystems, Inc.
#define UHS_VID_SPACE_SHUTTLE_HI_TECH 0x0655U // Space Shuttle Hi-Tech Co., Ltd
#define UHS_VID_GLORY_MARK_ELECTRONIC 0x0656U // Glory Mark Electronic, Ltd
#define UHS_VID_TEKCON_ELECTRONICS 0x0657U // Tekcon Electronics Corp.
#define UHS_VID_SIGMA_DESIGNS 0x0658U // Sigma Designs, Inc.
#define UHS_VID_AETHRA 0x0659U // Aethra
#define UHS_VID_OPTOELECTRONICS 0x065aU // Optoelectronics Co., Ltd
#define UHS_VID_TRACEWELL_SYSTEMS 0x065bU // Tracewell Systems
#define UHS_VID_SILICON_GRAPHICS_1 0x065eU // Silicon Graphics
#define UHS_VID_GOOD_WAY_TECHNOLOGY_CO_LTD_AND_GWC_TECHNOLOGY 0x065fU // Good Way Technology Co., Ltd & GWC technology Inc.
#define UHS_VID_TSAY_E_BVI_INTERNATIONAL 0x0660U // TSAY-E (BVI) International, Inc.
#define UHS_VID_HAMAMATSU_PHOTONICS_KK 0x0661U // Hamamatsu Photonics K.K.
#define UHS_VID_KANSAI_ELECTRIC 0x0662U // Kansai Electric Co., Ltd
#define UHS_VID_TOPMAX_ELECTRONIC 0x0663U // Topmax Electronic Co., Ltd
#define UHS_VID_ETANDT_TECHNOLOGY 0x0664U // ET&T Technology Co., Ltd.
#define UHS_VID_CYPRESS_SEMICONDUCTOR_1 0x0665U // Cypress Semiconductor
#define UHS_VID_AIWA 0x0667U // Aiwa Co., Ltd
#define UHS_VID_WORDWAND 0x0668U // WordWand
#define UHS_VID_OCE_PRINTING_SYSTEMS 0x0669U // Oce' Printing Systems GmbH
#define UHS_VID_TOTAL_TECHNOLOGIES 0x066aU // Total Technologies, Ltd
#define UHS_VID_LINKSYS 0x066bU // Linksys, Inc.
#define UHS_VID_ENTREGA 0x066dU // Entrega, Inc.
#define UHS_VID_ACER_SEMICONDUCTOR_AMERICA 0x066eU // Acer Semiconductor America, Inc.
#define UHS_VID_SIGMATEL 0x066fU // SigmaTel, Inc.
#define UHS_VID_SEQUEL_IMAGING 0x0670U // Sequel Imaging
#define UHS_VID_LABTEC 0x0672U // Labtec, Inc.
#define UHS_VID_HCL 0x0673U // HCL
#define UHS_VID_KEY_MOUSE_ELECTRONIC_ENTERPRISE 0x0674U // Key Mouse Electronic Enterprise Co., Ltd
#define UHS_VID_DRAYTEK 0x0675U // DrayTek Corp.
#define UHS_VID_TELES_AG 0x0676U // Teles AG
#define UHS_VID_AIWA_1 0x0677U // Aiwa Co., Ltd
#define UHS_VID_ACARD_TECHNOLOGY 0x0678U // ACard Technology Corp.
#define UHS_VID_PROLIFIC_TECHNOLOGY 0x067bU // Prolific Technology, Inc.
#define UHS_VID_EFFICIENT_NETWORKS 0x067cU // Efficient Networks, Inc.
#define UHS_VID_HOHNER 0x067dU // Hohner Corp.
#define UHS_VID_INTERMEC_TECHNOLOGIES 0x067eU // Intermec Technologies Corp.
#define UHS_VID_VIRATA 0x067fU // Virata, Ltd
#define UHS_VID_REALTEK_SEMICONDUCTOR_CORP_CPP_DIV_AVANCE_LOGIC 0x0680U // Realtek Semiconductor Corp., CPP Div. (Avance Logic)
#define UHS_VID_SIEMENS_INFORMATION_AND_COMMUNICATION_PRODUCTS 0x0681U // Siemens Information and Communication Products
#define UHS_VID_VICTOR_COMPANY_OF_JAPAN_1 0x0682U // Victor Company of Japan, Ltd
#define UHS_VID_ACTIONTEC_ELECTRONICS 0x0684U // Actiontec Electronics, Inc.
#define UHS_VID_ZD_INCORPORATED 0x0685U // ZD Incorporated
#define UHS_VID_MINOLTA 0x0686U // Minolta Co., Ltd
#define UHS_VID_PERTECH 0x068aU // Pertech, Inc.
#define UHS_VID_POTRANS_INTERNATIONAL 0x068bU // Potrans International, Inc.
#define UHS_VID_CH_PRODUCTS 0x068eU // CH Products, Inc.
#define UHS_VID_GOLDEN_BRIDGE_ELECTECH 0x0690U // Golden Bridge Electech, Inc.
#define UHS_VID_HAGIWARA_SYS_COM 0x0693U // Hagiwara Sys-Com Co., Ltd
#define UHS_VID_LEGO_GROUP 0x0694U // Lego Group
#define UHS_VID_CHUNTEX_CTX 0x0698U // Chuntex (CTX)
#define UHS_VID_TEKTRONIX 0x0699U // Tektronix, Inc.
#define UHS_VID_ASKEY_COMPUTER 0x069aU // Askey Computer Corp.
#define UHS_VID_THOMSON 0x069bU // Thomson, Inc.
#define UHS_VID_HUGHES_NETWORK_SYSTEMS_HNS 0x069dU // Hughes Network Systems (HNS)
#define UHS_VID_WELCAT 0x069eU // Welcat Inc.
#define UHS_VID_ALLIED_DATA_TECHNOLOGIES_BV 0x069fU // Allied Data Technologies BV
#define UHS_VID_TOPRO_TECHNOLOGY 0x06a2U // Topro Technology, Inc.
#define UHS_VID_SAITEK_PLC 0x06a3U // Saitek PLC
#define UHS_VID_XIAMEN_DOOWELL_ELECTRON 0x06a4U // Xiamen Doowell Electron Co., Ltd
#define UHS_VID_DIVIO 0x06a5U // Divio
#define UHS_VID_MICROSTORE 0x06a7U // MicroStore, Inc.
#define UHS_VID_TOPAZ_SYSTEMS 0x06a8U // Topaz Systems, Inc.
#define UHS_VID_WESTELL 0x06a9U // Westell
#define UHS_VID_SYSGRATION 0x06aaU // Sysgration, Ltd
#define UHS_VID_FUJITSU_LABORATORIES_OF_AMERICA 0x06acU // Fujitsu Laboratories of America, Inc.
#define UHS_VID_GREATLAND_ELECTRONICS_TAIWAN 0x06adU // Greatland Electronics Taiwan, Ltd
#define UHS_VID_PROFESSIONAL_MULTIMEDIA_TESTING_CENTRE 0x06aeU // Professional Multimedia Testing Centre
#define UHS_VID_HARTING_INC_OF_NORTH_AMERICA 0x06afU // Harting, Inc. of North America
#define UHS_VID_PIXELA 0x06b8U // Pixela Corp.
#define UHS_VID_ALCATEL_TELECOM 0x06b9U // Alcatel Telecom
#define UHS_VID_SMOOTH_CORD_AND_CONNECTOR 0x06baU // Smooth Cord & Connector Co., Ltd
#define UHS_VID_EDA 0x06bbU // EDA, Inc.
#define UHS_VID_OKI_DATA 0x06bcU // Oki Data Corp.
#define UHS_VID_AGFA_GEVAERT_NV 0x06bdU // AGFA-Gevaert NV
#define UHS_VID_AME_OPTIMEDIA_TECHNOLOGY 0x06beU // AME Optimedia Technology Co., Ltd
#define UHS_VID_LEOCO 0x06bfU // Leoco Corp.
#define UHS_VID_PHIDGETS_INC_FORMERLY_GLAB 0x06c2U // Phidgets Inc. (formerly GLAB)
#define UHS_VID_BIZLINK_INTERNATIONAL 0x06c4U // Bizlink International Corp.
#define UHS_VID_HAGENUK 0x06c5U // Hagenuk, GmbH
#define UHS_VID_INFOWAVE_SOFTWARE 0x06c6U // Infowave Software, Inc.
#define UHS_VID_SIIG 0x06c8U // SIIG, Inc.
#define UHS_VID_TAXAN_EUROPE 0x06c9U // Taxan (Europe), Ltd
#define UHS_VID_NEWER_TECHNOLOGY 0x06caU // Newer Technology, Inc.
#define UHS_VID_SYNAPTICS 0x06cbU // Synaptics, Inc.
#define UHS_VID_TERAYON_COMMUNICATION_SYSTEMS 0x06ccU // Terayon Communication Systems
#define UHS_VID_KEYSPAN 0x06cdU // Keyspan
#define UHS_VID_CONTEC 0x06ceU // Contec
#define UHS_VID_SPHERONVR_AG 0x06cfU // SpheronVR AG
#define UHS_VID_LAPLINK 0x06d0U // LapLink, Inc.
#define UHS_VID_DAEWOO_ELECTRONICS_1 0x06d1U // Daewoo Electronics Co., Ltd
#define UHS_VID_MITSUBISHI_ELECTRIC 0x06d3U // Mitsubishi Electric Corp.
#define UHS_VID_CISCO_SYSTEMS_1 0x06d4U // Cisco Systems
#define UHS_VID_TOSHIBA 0x06d5U // Toshiba
#define UHS_VID_AASHIMA_TECHNOLOGY_BV 0x06d6U // Aashima Technology B.V.
#define UHS_VID_NETWORK_COMPUTING_DEVICES_NCD 0x06d7U // Network Computing Devices (NCD)
#define UHS_VID_TECHNICAL_MARKETING_RESEARCH 0x06d8U // Technical Marketing Research, Inc.
#define UHS_VID_PHOENIXTEC_POWER 0x06daU // Phoenixtec Power Co., Ltd
#define UHS_VID_PARADYNE 0x06dbU // Paradyne
#define UHS_VID_FOXLINK_IMAGE_TECHNOLOGY 0x06dcU // Foxlink Image Technology Co., Ltd
#define UHS_VID_HEISEI_ELECTRONICS 0x06deU // Heisei Electronics Co., Ltd
#define UHS_VID_MULTI_TECH_SYSTEMS 0x06e0U // Multi-Tech Systems, Inc.
#define UHS_VID_ADS_TECHNOLOGIES 0x06e1U // ADS Technologies, Inc.
#define UHS_VID_ALCATEL_MICROELECTRONICS 0x06e4U // Alcatel Microelectronics
#define UHS_VID_TIGER_JET_NETWORK 0x06e6U // Tiger Jet Network, Inc.
#define UHS_VID_SIRIUS_TECHNOLOGIES 0x06eaU // Sirius Technologies
#define UHS_VID_PC_EXPERT_TECH 0x06ebU // PC Expert Tech. Co., Ltd
#define UHS_VID_IAC_GEOMETRISCHE_INGENIEURS_BV 0x06efU // I.A.C. Geometrische Ingenieurs B.V.
#define UHS_VID_TNC_INDUSTRIAL 0x06f0U // T.N.C Industrial Co., Ltd
#define UHS_VID_OPCODE_SYSTEMS 0x06f1U // Opcode Systems, Inc.
#define UHS_VID_EMINE_TECHNOLOGY 0x06f2U // Emine Technology Co.
#define UHS_VID_WINTREND_TECHNOLOGY 0x06f6U // Wintrend Technology Co., Ltd
#define UHS_VID_WAILLY_TECHNOLOGY 0x06f7U // Wailly Technology Ltd
#define UHS_VID_GUILLEMOT 0x06f8U // Guillemot Corp.
#define UHS_VID_ASYST_ELECTRONIC_DOO 0x06f9U // ASYST electronic d.o.o.
#define UHS_VID_HSD_SRL 0x06faU // HSD S.r.L
#define UHS_VID_MOTOROLA_SEMICONDUCTOR_PRODUCTS_SECTOR 0x06fcU // Motorola Semiconductor Products Sector
#define UHS_VID_BOSTON_ACOUSTICS 0x06fdU // Boston Acoustics
#define UHS_VID_GALLANT_COMPUTER 0x06feU // Gallant Computer, Inc.
#define UHS_VID_SUPERCOMAL_WIRE_AND_CABLE_SDN_BHD 0x0701U // Supercomal Wire & Cable SDN. BHD.
#define UHS_VID_BVTECH_INDUSTRY 0x0703U // Bvtech Industry, Inc.
#define UHS_VID_NKK 0x0705U // NKK Corp.
#define UHS_VID_ARIEL 0x0706U // Ariel Corp.
#define UHS_VID_STANDARD_MICROSYSTEMS_2 0x0707U // Standard Microsystems Corp.
#define UHS_VID_PUTERCOM 0x0708U // Putercom Co., Ltd
#define UHS_VID_SILICON_SYSTEMS_LTD_SSL 0x0709U // Silicon Systems, Ltd (SSL)
#define UHS_VID_OKI_ELECTRIC_INDUSTRY 0x070aU // Oki Electric Industry Co., Ltd
#define UHS_VID_COMOSS_ELECTRONIC 0x070dU // Comoss Electronic Co., Ltd
#define UHS_VID_EXCEL_CELL_ELECTRONIC 0x070eU // Excel Cell Electronic Co., Ltd
#define UHS_VID_CONNECT_TECH 0x0710U // Connect Tech, Inc.
#define UHS_VID_MAGIC_CONTROL_TECHNOLOGY 0x0711U // Magic Control Technology Corp.
#define UHS_VID_INTERVAL_RESEARCH 0x0713U // Interval Research Corp.
#define UHS_VID_NEWMOTION 0x0714U // NewMotion, Inc.
#define UHS_VID_ZNK 0x0717U // ZNK Corp.
#define UHS_VID_IMATION 0x0718U // Imation Corp.
#define UHS_VID_TREMON_ENTERPRISES 0x0719U // Tremon Enterprises Co., Ltd
#define UHS_VID_DOMAIN_TECHNOLOGIES 0x071bU // Domain Technologies, Inc.
#define UHS_VID_XIONICS_DOCUMENT_TECHNOLOGIES 0x071cU // Xionics Document Technologies, Inc.
#define UHS_VID_EICON_NETWORKS 0x071dU // Eicon Networks Corp.
#define UHS_VID_ARISTON_TECHNOLOGIES 0x071eU // Ariston Technologies
#define UHS_VID_CENTILLIUM_COMMUNICATIONS 0x0723U // Centillium Communications Corp.
#define UHS_VID_VANGUARD_INTERNATIONAL_SEMICONDUCTOR_AMERICA 0x0726U // Vanguard International Semiconductor-America
#define UHS_VID_AMITM 0x0729U // Amitm
#define UHS_VID_SUNIX 0x072eU // Sunix Co., Ltd
#define UHS_VID_ADVANCED_CARD_SYSTEMS 0x072fU // Advanced Card Systems, Ltd
#define UHS_VID_SUSTEEN 0x0731U // Susteen, Inc.
#define UHS_VID_GOLDFULL_ELECTRONICS_AND_TELECOMMUNICATIONS 0x0732U // Goldfull Electronics & Telecommunications Corp.
#define UHS_VID_VIEWQUEST_TECHNOLOGIES 0x0733U // ViewQuest Technologies, Inc.
#define UHS_VID_LASAT_COMMUNICATIONS_AS 0x0734U // Lasat Communications A/S
#define UHS_VID_ASUSCOM_NETWORK 0x0735U // Asuscom Network
#define UHS_VID_LOROM_INDUSTRIAL 0x0736U // Lorom Industrial Co., Ltd
#define UHS_VID_MAD_CATZ 0x0738U // Mad Catz, Inc.
#define UHS_VID_CHAPLET_SYSTEMS 0x073aU // Chaplet Systems, Inc.
#define UHS_VID_SUNCOM_TECHNOLOGIES 0x073bU // Suncom Technologies
#define UHS_VID_INDUSTRIAL_ELECTRONIC_ENGINEERS 0x073cU // Industrial Electronic Engineers, Inc.
#define UHS_VID_EUTRON_SPA 0x073dU // Eutron S.p.a.
#define UHS_VID_NEC_1 0x073eU // NEC, Inc.
#define UHS_VID_STOLLMANN 0x0742U // Stollmann
#define UHS_VID_SYNTECH_INFORMATION 0x0745U // Syntech Information Co., Ltd
#define UHS_VID_ONKYO 0x0746U // Onkyo Corp.
#define UHS_VID_LABWAY 0x0747U // Labway Corp.
#define UHS_VID_STRONG_MAN_ENTERPRISE 0x0748U // Strong Man Enterprise Co., Ltd
#define UHS_VID_EVER_ELECTRONICS 0x0749U // EVer Electronics Corp.
#define UHS_VID_MING_FORTUNE_INDUSTRY 0x074aU // Ming Fortune Industry Co., Ltd
#define UHS_VID_POLESTAR_TECH 0x074bU // Polestar Tech. Corp.
#define UHS_VID_C_C_C_GROUP_PLC 0x074cU // C-C-C Group PLC
#define UHS_VID_MICRONAS 0x074dU // Micronas GmbH
#define UHS_VID_DIGITAL_STREAM 0x074eU // Digital Stream Corp.
#define UHS_VID_AUREAL_SEMICONDUCTOR 0x0755U // Aureal Semiconductor
#define UHS_VID_NETWORK_TECHNOLOGIES 0x0757U // Network Technologies, Inc.
#define UHS_VID_SOPHISTICATED_CIRCUITS 0x075bU // Sophisticated Circuits, Inc.
#define UHS_VID_MIDIMAN 0x0763U // Midiman
#define UHS_VID_CYBER_POWER_SYSTEM 0x0764U // Cyber Power System, Inc.
#define UHS_VID_X_RITE 0x0765U // X-Rite, Inc.
#define UHS_VID_JESS_LINK_PRODUCTS 0x0766U // Jess-Link Products Co., Ltd
#define UHS_VID_TOKHEIM 0x0767U // Tokheim Corp.
#define UHS_VID_CAMTEL_TECHNOLOGY 0x0768U // Camtel Technology Corp.
#define UHS_VID_SURECOM_TECHNOLOGY 0x0769U // Surecom Technology Corp.
#define UHS_VID_SMART_TECHNOLOGY_ENABLERS 0x076aU // Smart Technology Enablers, Inc.
#define UHS_VID_OMNIKEY_AG 0x076bU // OmniKey AG
#define UHS_VID_PARTNER_TECH 0x076cU // Partner Tech
#define UHS_VID_DENSO 0x076dU // Denso Corp.
#define UHS_VID_KUAN_TECH_ENTERPRISE 0x076eU // Kuan Tech Enterprise Co., Ltd
#define UHS_VID_JHEN_VEI_ELECTRONIC 0x076fU // Jhen Vei Electronic Co., Ltd
#define UHS_VID_WELCH_ALLYN_INC__MEDICAL_DIVISION 0x0770U // Welch Allyn, Inc - Medical Division
#define UHS_VID_OBSERVATOR_INSTRUMENTS_BV 0x0771U // Observator Instruments BV
#define UHS_VID_YOUR_DATA_OUR_CARE 0x0772U // Your data Our Care
#define UHS_VID_AMTRAN_TECHNOLOGY 0x0774U // AmTRAN Technology Co., Ltd
#define UHS_VID_LONGSHINE_ELECTRONICS 0x0775U // Longshine Electronics Corp.
#define UHS_VID_INALWAYS 0x0776U // Inalways Corp.
#define UHS_VID_COMDA_ENTERPRISE 0x0777U // Comda Enterprise Corp.
#define UHS_VID_VOLEX 0x0778U // Volex, Inc.
#define UHS_VID_FAIRCHILD_SEMICONDUCTOR 0x0779U // Fairchild Semiconductor
#define UHS_VID_SANKYO_SEIKI_MFG 0x077aU // Sankyo Seiki Mfg. Co., Ltd
#define UHS_VID_LINKSYS_1 0x077bU // Linksys
#define UHS_VID_FORWARD_ELECTRONICS 0x077cU // Forward Electronics Co., Ltd
#define UHS_VID_GRIFFIN_TECHNOLOGY 0x077dU // Griffin Technology
#define UHS_VID_WELL_EXCELLENT_AND_MOST 0x077fU // Well Excellent & Most Corp.
#define UHS_VID_SAGEM_MONETEL 0x0780U // Sagem Monetel GmbH
#define UHS_VID_SANDISK 0x0781U // SanDisk Corp.
#define UHS_VID_TRACKERBALL 0x0782U // Trackerball
#define UHS_VID_C3PO 0x0783U // C3PO
#define UHS_VID_VIVITAR 0x0784U // Vivitar, Inc.
#define UHS_VID_NTT_ME 0x0785U // NTT-ME
#define UHS_VID_LOGITEC 0x0789U // Logitec Corp.
#define UHS_VID_HAPP_CONTROLS 0x078bU // Happ Controls, Inc.
#define UHS_VID_GTCOCALCOMP 0x078cU // GTCO/CalComp
#define UHS_VID_BRINCOM 0x078eU // Brincom, Inc.
#define UHS_VID_PRO_IMAGE_MANUFACTURING 0x0790U // Pro-Image Manufacturing Co., Ltd
#define UHS_VID_COPARTNER_WIRE_AND_CABLE_MFG 0x0791U // Copartner Wire and Cable Mfg. Corp.
#define UHS_VID_AXIS_COMMUNICATIONS 0x0792U // Axis Communications AB
#define UHS_VID_WHA_YU_INDUSTRIAL 0x0793U // Wha Yu Industrial Co., Ltd
#define UHS_VID_ABL_ELECTRONICS 0x0794U // ABL Electronics Corp.
#define UHS_VID_REALCHIP 0x0795U // RealChip, Inc.
#define UHS_VID_CERTICOM 0x0796U // Certicom Corp.
#define UHS_VID_GRANDTECH_SEMICONDUCTOR 0x0797U // Grandtech Semiconductor Corp.
#define UHS_VID_OPTELEC 0x0798U // Optelec
#define UHS_VID_ALTERA 0x0799U // Altera
#define UHS_VID_SAGEM 0x079bU // Sagem
#define UHS_VID_ALFADATA_COMPUTER 0x079dU // Alfadata Computer Corp.
#define UHS_VID_DIGICOM_SPA 0x07a1U // Digicom S.p.A.
#define UHS_VID_NATIONAL_TECHNICAL_SYSTEMS 0x07a2U // National Technical Systems
#define UHS_VID_ONNTO 0x07a3U // Onnto Corp.
#define UHS_VID_BE 0x07a4U // Be, Inc.
#define UHS_VID_ADMTEK 0x07a6U // ADMtek, Inc.
#define UHS_VID_COREGA_KK 0x07aaU // Corega K.K.
#define UHS_VID_FREECOM_TECHNOLOGIES 0x07abU // Freecom Technologies
#define UHS_VID_MICROTECH 0x07afU // Microtech
#define UHS_VID_TRUST_TECHNOLOGIES 0x07b0U // Trust Technologies
#define UHS_VID_IMP 0x07b1U // IMP, Inc.
#define UHS_VID_MOTOROLA_BCS 0x07b2U // Motorola BCS, Inc.
#define UHS_VID_PLUSTEK 0x07b3U // Plustek, Inc.
#define UHS_VID_OLYMPUS_OPTICAL 0x07b4U // Olympus Optical Co., Ltd
#define UHS_VID_MEGA_WORLD_INTERNATIONAL 0x07b5U // Mega World International, Ltd
#define UHS_VID_MARUBUN 0x07b6U // Marubun Corp.
#define UHS_VID_TIME_INTERCONNECT 0x07b7U // TIME Interconnect, Ltd
#define UHS_VID_ABOCOM_SYSTEMS 0x07b8U // AboCom Systems Inc
#define UHS_VID_CANON_COMPUTER_SYSTEMS 0x07bcU // Canon Computer Systems, Inc.
#define UHS_VID_WEBGEAR 0x07bdU // Webgear, Inc.
#define UHS_VID_VERIDICOM 0x07beU // Veridicom
#define UHS_VID_CODE_MERCENARIES_HARD_UND_SOFTWARE 0x07c0U // Code Mercenaries Hard- und Software GmbH
#define UHS_VID_KEISOKUGIKEN 0x07c1U // Keisokugiken
#define UHS_VID_DATAFAB_SYSTEMS 0x07c4U // Datafab Systems, Inc.
#define UHS_VID_APG_CASH_DRAWER 0x07c5U // APG Cash Drawer
#define UHS_VID_SHAREWAVE 0x07c6U // ShareWave, Inc.
#define UHS_VID_POWERTECH_INDUSTRIAL 0x07c7U // Powertech Industrial Co., Ltd
#define UHS_VID_BUG 0x07c8U // B.U.G., Inc.
#define UHS_VID_ALLIED_TELESYN_INTERNATIONAL 0x07c9U // Allied Telesyn International
#define UHS_VID_AVERMEDIA_TECHNOLOGIES 0x07caU // AVerMedia Technologies, Inc.
#define UHS_VID_KINGMAX_TECHNOLOGY 0x07cbU // Kingmax Technology, Inc.
#define UHS_VID_CARRY_COMPUTER_ENG 0x07ccU // Carry Computer Eng., Co., Ltd
#define UHS_VID_ELEKTOR 0x07cdU // Elektor
#define UHS_VID_CASIO_COMPUTER 0x07cfU // Casio Computer Co., Ltd
#define UHS_VID_DAZZLE 0x07d0U // Dazzle
#define UHS_VID_D_LINK_SYSTEM 0x07d1U // D-Link System
#define UHS_VID_APTIO_PRODUCTS 0x07d2U // Aptio Products, Inc.
#define UHS_VID_CYBERDATA 0x07d3U // Cyberdata Corp.
#define UHS_VID_RADIANT_SYSTEMS 0x07d5U // Radiant Systems
#define UHS_VID_GCC_TECHNOLOGIES 0x07d7U // GCC Technologies, Inc.
#define UHS_VID_ARASAN_CHIP_SYSTEMS 0x07daU // Arasan Chip Systems
#define UHS_VID_DIAMOND_MULTIMEDIA 0x07deU // Diamond Multimedia
#define UHS_VID_DAVID_ELECTRONICS 0x07dfU // David Electronics Co., Ltd
#define UHS_VID_AMBIENT_TECHNOLOGIES 0x07e1U // Ambient Technologies, Inc.
#define UHS_VID_ELMEG_GMBH_AND 0x07e2U // Elmeg GmbH & Co., Ltd
#define UHS_VID_PLANEX_COMMUNICATIONS 0x07e3U // Planex Communications, Inc.
#define UHS_VID_MOVADO_ENTERPRISE 0x07e4U // Movado Enterprise Co., Ltd
#define UHS_VID_QPS 0x07e5U // QPS, Inc.
#define UHS_VID_ALLIED_CABLE 0x07e6U // Allied Cable Corp.
#define UHS_VID_MIRVO_TOYS 0x07e7U // Mirvo Toys, Inc.
#define UHS_VID_LABSYSTEMS 0x07e8U // Labsystems
#define UHS_VID_IWATSU_ELECTRIC 0x07eaU // Iwatsu Electric Co., Ltd
#define UHS_VID_DOUBLE_H_TECHNOLOGY 0x07ebU // Double-H Technology Co., Ltd
#define UHS_VID_TAIYO_ELECTRIC_WIRE_AND_CABLE 0x07ecU // Taiyo Electric Wire & Cable Co., Ltd
#define UHS_VID_TOREX_RETAIL_FORMERLY_LOGWARE 0x07eeU // Torex Retail (formerly Logware)
#define UHS_VID_STSN 0x07efU // STSN
#define UHS_VID_MICROCOMPUTER_APPLICATIONS 0x07f2U // Microcomputer Applications, Inc.
#define UHS_VID_CIRCUIT_ASSEMBLY 0x07f6U // Circuit Assembly Corp.
#define UHS_VID_CENTURY 0x07f7U // Century Corp.
#define UHS_VID_DOTOP_TECHNOLOGY 0x07f9U // Dotop Technology, Inc.
#define UHS_VID_DRAYTEK_1 0x07faU // DrayTek Corp.
#define UHS_VID_MARK_OF_THE_UNICORN 0x07fdU // Mark of the Unicorn
#define UHS_VID_UNKNOWN_2 0x07ffU // Unknown
#define UHS_VID_MAGTEK 0x0801U // MagTek
#define UHS_VID_MAKO_TECHNOLOGIES 0x0802U // Mako Technologies, LLC
#define UHS_VID_ZOOM_TELEPHONICS 0x0803U // Zoom Telephonics, Inc.
#define UHS_VID_GENICOM_TECHNOLOGY 0x0809U // Genicom Technology, Inc.
#define UHS_VID_EVERMUCH_TECHNOLOGY 0x080aU // Evermuch Technology Co., Ltd
#define UHS_VID_CROSS_MATCH_TECHNOLOGIES 0x080bU // Cross Match Technologies
#define UHS_VID_DATALOGIC_SPA 0x080cU // Datalogic S.p.A.
#define UHS_VID_TECO_IMAGE_SYSTEMS 0x080dU // Teco Image Systems Co., Ltd
#define UHS_VID_PERSONAL_COMMUNICATION_SYSTEMS 0x0810U // Personal Communication Systems, Inc.
#define UHS_VID_MATTEL 0x0813U // Mattel, Inc.
#define UHS_VID_ELICENSER 0x0819U // eLicenser
#define UHS_VID_MG_LOGIC 0x081aU // MG Logic
#define UHS_VID_INDIGITA 0x081bU // Indigita Corp.
#define UHS_VID_MIPSYS 0x081cU // Mipsys
#define UHS_VID_ALPHASMART 0x081eU // AlphaSmart, Inc.
#define UHS_VID_REUDO 0x0822U // Reudo Corp.
#define UHS_VID_GC_PROTRONICS 0x0825U // GC Protronics
#define UHS_VID_DATA_TRANSIT 0x0826U // Data Transit
#define UHS_VID_BROADLOGIC 0x0827U // BroadLogic, Inc.
#define UHS_VID_SATO 0x0828U // Sato Corp.
#define UHS_VID_DIRECTV_BROADBAND_INC_TELOCITY 0x0829U // DirecTV Broadband, Inc. (Telocity)
#define UHS_VID_HANDSPRING 0x082dU // Handspring
#define UHS_VID_PALM 0x0830U // Palm, Inc.
#define UHS_VID_KOUWELL_ELECTRONICS 0x0832U // Kouwell Electronics Corp.
#define UHS_VID_SOURCENEXT 0x0833U // Sourcenext Corp.
#define UHS_VID_ACTION_STAR_ENTERPRISE 0x0835U // Action Star Enterprise Co., Ltd
#define UHS_VID_TREKSTOR 0x0836U // TrekStor
#define UHS_VID_SAMSUNG_TECHWIN 0x0839U // Samsung Techwin Co., Ltd
#define UHS_VID_ACCTON_TECHNOLOGY 0x083aU // Accton Technology Corp.
#define UHS_VID_GLOBAL_VILLAGE 0x083fU // Global Village
#define UHS_VID_ARGOSY_RESEARCH 0x0840U // Argosy Research, Inc.
#define UHS_VID_RIOPORTCOM 0x0841U // Rioport.com, Inc.
#define UHS_VID_WELLAND_INDUSTRIAL 0x0844U // Welland Industrial Co., Ltd
#define UHS_VID_NETGEAR 0x0846U // NetGear, Inc.
#define UHS_VID_MINTON_OPTIC_INDUSTRY 0x084dU // Minton Optic Industry Co., Inc.
#define UHS_VID_KB_GEAR 0x084eU // KB Gear
#define UHS_VID_EMPEG 0x084fU // Empeg
#define UHS_VID_FAST_POINT_TECHNOLOGIES 0x0850U // Fast Point Technologies, Inc.
#define UHS_VID_MACRONIX_INTERNATIONAL 0x0851U // Macronix International Co., Ltd
#define UHS_VID_CSEM 0x0852U // CSEM
#define UHS_VID_TOPRE_CORPORATION 0x0853U // Topre Corporation
#define UHS_VID_ACTIVEWIRE 0x0854U // ActiveWire, Inc.
#define UHS_VID_BANDB_ELECTRONICS 0x0856U // B&B Electronics
#define UHS_VID_HITACHI_MAXELL 0x0858U // Hitachi Maxell, Ltd
#define UHS_VID_MINOLTA_SYSTEMS_LABORATORY 0x0859U // Minolta Systems Laboratory, Inc.
#define UHS_VID_XIRCOM 0x085aU // Xircom
#define UHS_VID_COLORVISION 0x085cU // ColorVision, Inc.
#define UHS_VID_TELETROL_SYSTEMS 0x0862U // Teletrol Systems, Inc.
#define UHS_VID_FILANET 0x0863U // Filanet Corp.
#define UHS_VID_NETGEAR_1 0x0864U // NetGear, Inc.
#define UHS_VID_DATA_TRANSLATION 0x0867U // Data Translation, Inc.
#define UHS_VID_EMAGIC_SOFT_UND_HARDWARE 0x086aU // Emagic Soft- und Hardware GmbH
#define UHS_VID_DETEWE__DEUTSCHE_TELEPHONWERKE_AG_AND 0x086cU // DeTeWe - Deutsche Telephonwerke AG & Co.
#define UHS_VID_SYSTEM_TALKS 0x086eU // System TALKS, Inc.
#define UHS_VID_MEC_IMEX 0x086fU // MEC IMEX, Inc.
#define UHS_VID_METRICOM 0x0870U // Metricom
#define UHS_VID_SANDISK_1 0x0871U // SanDisk, Inc.
#define UHS_VID_XPEED 0x0873U // Xpeed, Inc.
#define UHS_VID_A_TEC_SUBSYSTEM 0x0874U // A-Tec Subsystem, Inc.
#define UHS_VID_COMTROL 0x0879U // Comtrol Corp.
#define UHS_VID_ADESSOKBTEK_AMERICA 0x087cU // Adesso/Kbtek America, Inc.
#define UHS_VID_JATON 0x087dU // Jaton Corp.
#define UHS_VID_FUJITSU_COMPUTER_PRODUCTS_OF_AMERICA 0x087eU // Fujitsu Computer Products of America
#define UHS_VID_QUALCORE_LOGIC 0x087fU // QualCore Logic Inc.
#define UHS_VID_APT_TECHNOLOGIES 0x0880U // APT Technologies, Inc.
#define UHS_VID_RECORDING_INDUSTRY_ASSOCIATION_OF_AMERICA_RIAA 0x0883U // Recording Industry Association of America (RIAA)
#define UHS_VID_BOCA_RESEARCH 0x0885U // Boca Research, Inc.
#define UHS_VID_XAC_AUTOMATION 0x0886U // XAC Automation Corp.
#define UHS_VID_HANNSTAR_ELECTRONICS 0x0887U // Hannstar Electronics Corp.
#define UHS_VID_TECHTOOLS 0x088aU // TechTools
#define UHS_VID_MASSWORKS 0x088bU // MassWorks, Inc.
#define UHS_VID_SWECOIN 0x088cU // Swecoin AB
#define UHS_VID_ILOK 0x088eU // iLok
#define UHS_VID_DIOGRAPHY 0x0892U // DioGraphy, Inc.
#define UHS_VID_TSI_INCORPORATED 0x0894U // TSI Incorporated
#define UHS_VID_LAUTERBACH 0x0897U // Lauterbach
#define UHS_VID_UNITED_TECHNOLOGIES_RESEARCH_CNTR 0x089cU // United Technologies Research Cntr.
#define UHS_VID_ICRON_TECHNOLOGIES 0x089dU // Icron Technologies Corp.
#define UHS_VID_NST 0x089eU // NST Co., Ltd
#define UHS_VID_PRIMEX_AEROSPACE 0x089fU // Primex Aerospace Co.
#define UHS_VID_E9 0x08a5U // e9, Inc.
#define UHS_VID_TOSHIBA_TEC 0x08a6U // Toshiba TEC
#define UHS_VID_ANDREA_ELECTRONICS 0x08a8U // Andrea Electronics
#define UHS_VID_CWAV 0x08a9U // CWAV Inc.
#define UHS_VID_MACRAIGOR_SYSTEMS 0x08acU // Macraigor Systems LLC
#define UHS_VID_MACALLY_MACE_GROUP 0x08aeU // Macally (Mace Group, Inc.)
#define UHS_VID_METROHM 0x08b0U // Metrohm
#define UHS_VID_SORENSON_VISION 0x08b4U // Sorenson Vision, Inc.
#define UHS_VID_NATSU 0x08b7U // NATSU
#define UHS_VID_J_GORDON_ELECTRONIC_DESIGN 0x08b8U // J. Gordon Electronic Design, Inc.
#define UHS_VID_RADIOSHACK_CORP_TANDY 0x08b9U // RadioShack Corp. (Tandy)
#define UHS_VID_TEXAS_INSTRUMENTS_1 0x08bbU // Texas Instruments
#define UHS_VID_CITIZEN_WATCH 0x08bdU // Citizen Watch Co., Ltd
#define UHS_VID_PRECISE_BIOMETRICS 0x08c3U // Precise Biometrics
#define UHS_VID_PROXIM 0x08c4U // Proxim, Inc.
#define UHS_VID_KEY_NICE_ENTERPRISE 0x08c7U // Key Nice Enterprise Co., Ltd
#define UHS_VID_2WIRE 0x08c8U // 2Wire, Inc.
#define UHS_VID_NIPPON_TELEGRAPH_AND_TELEPHONE 0x08c9U // Nippon Telegraph and Telephone Corp.
#define UHS_VID_AIPTEK_INTERNATIONAL 0x08caU // Aiptek International, Inc.
#define UHS_VID_JUE_HSUN_IND 0x08cdU // Jue Hsun Ind. Corp.
#define UHS_VID_LONG_WELL_ELECTRONICS 0x08ceU // Long Well Electronics Corp.
#define UHS_VID_PRODUCTIVITY_ENHANCEMENT_PRODUCTS 0x08cfU // Productivity Enhancement Products
#define UHS_VID_SMARTBRIDGES 0x08d1U // smartBridges, Inc.
#define UHS_VID_VIRTUAL_INK 0x08d3U // Virtual Ink
#define UHS_VID_FUJITSU_SIEMENS_COMPUTERS 0x08d4U // Fujitsu Siemens Computers
#define UHS_VID_IXXAT_AUTOMATION 0x08d8U // IXXAT Automation GmbH
#define UHS_VID_INCREMENT_P 0x08d9U // Increment P Corp.
#define UHS_VID_BILLIONTON_SYSTEMS 0x08ddU // Billionton Systems, Inc.
#define UHS_VID__UNKNOWN 0x08deU // ?
#define UHS_VID_SPYRUS 0x08dfU // Spyrus, Inc.
#define UHS_VID_OLITEC 0x08e3U // Olitec, Inc.
#define UHS_VID_PIONEER 0x08e4U // Pioneer Corp.
#define UHS_VID_LITRONIC 0x08e5U // Litronic
#define UHS_VID_GEMALTO_WAS_GEMPLUS 0x08e6U // Gemalto (was Gemplus)
#define UHS_VID_PAN_INTERNATIONAL_WIRE_AND_CABLE 0x08e7U // Pan-International Wire & Cable
#define UHS_VID_INTEGRATED_MEMORY_LOGIC 0x08e8U // Integrated Memory Logic
#define UHS_VID_EXTENDED_SYSTEMS 0x08e9U // Extended Systems, Inc.
#define UHS_VID_ERICSSON_INC_BLUE_RIDGE_LABS 0x08eaU // Ericsson, Inc., Blue Ridge Labs
#define UHS_VID_M_SYSTEMS_FLASH_DISK_PIONEERS 0x08ecU // M-Systems Flash Disk Pioneers
#define UHS_VID_MEDIATEK 0x08edU // MediaTek Inc.
#define UHS_VID_CCSIHESSO 0x08eeU // CCSI/Hesso
#define UHS_VID_COREX_TECHNOLOGIES 0x08f0U // Corex Technologies
#define UHS_VID_CTI_ELECTRONICS 0x08f1U // CTI Electronics Corp.
#define UHS_VID_GOTOP_INFORMATION 0x08f2U // Gotop Information Inc.
#define UHS_VID_SYSTEC 0x08f5U // SysTec Co., Ltd
#define UHS_VID_LOGIC_3_INTERNATIONAL 0x08f6U // Logic 3 International, Ltd
#define UHS_VID_VERNIER 0x08f7U // Vernier
#define UHS_VID_KEEN_TOP_INTERNATIONAL_ENTERPRISE 0x08f8U // Keen Top International Enterprise Co., Ltd
#define UHS_VID_WIPRO_TECHNOLOGIES 0x08f9U // Wipro Technologies
#define UHS_VID_CAERE 0x08faU // Caere
#define UHS_VID_SOCKET_COMMUNICATIONS 0x08fbU // Socket Communications
#define UHS_VID_SICON_CABLE_TECHNOLOGY 0x08fcU // Sicon Cable Technology Co., Ltd
#define UHS_VID_DIGIANSWER_AS 0x08fdU // Digianswer A/S
#define UHS_VID_AUTHENTEC 0x08ffU // AuthenTec, Inc.
#define UHS_VID_PINNACLE_SYSTEMS 0x0900U // Pinnacle Systems, Inc.
#define UHS_VID_VST_TECHNOLOGIES 0x0901U // VST Technologies
#define UHS_VID_FARADAY_TECHNOLOGY 0x0906U // Faraday Technology Corp.
#define UHS_VID_SIEMENS_AG 0x0908U // Siemens AG
#define UHS_VID_AUDIO_TECHNICA 0x0909U // Audio-Technica Corp.
#define UHS_VID_TRUMPION_MICROELECTRONICS 0x090aU // Trumpion Microelectronics, Inc.
#define UHS_VID_NEUROSMITH 0x090bU // Neurosmith
#define UHS_VID_SILICON_MOTION_INC__TAIWAN_FORMERLY_FEIYA_TECHNOLOGY 0x090cU // Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.)
#define UHS_VID_MULTIPORT_COMPUTER_VERTRIEBS 0x090dU // Multiport Computer Vertriebs GmbH
#define UHS_VID_SHINING_TECHNOLOGY 0x090eU // Shining Technology, Inc.
#define UHS_VID_FUJITSU_DEVICES 0x090fU // Fujitsu Devices, Inc.
#define UHS_VID_ALATION_SYSTEMS 0x0910U // Alation Systems, Inc.
#define UHS_VID_PHILIPS_SPEECH_PROCESSING 0x0911U // Philips Speech Processing
#define UHS_VID_VOQUETTE 0x0912U // Voquette, Inc.
#define UHS_VID_GLOBESPAN 0x0915U // GlobeSpan, Inc.
#define UHS_VID_SMARTDISK 0x0917U // SmartDisk Corp.
#define UHS_VID_TIGER_ELECTRONICS 0x0919U // Tiger Electronics
#define UHS_VID_GARMIN_INTERNATIONAL 0x091eU // Garmin International
#define UHS_VID_ECHELON 0x0920U // Echelon Co.
#define UHS_VID_GOHUBS 0x0921U // GoHubs, Inc.
#define UHS_VID_DYMO_COSTAR 0x0922U // Dymo-CoStar Corp.
#define UHS_VID_IC_MEDIA 0x0923U // IC Media Corp.
#define UHS_VID_XEROX 0x0924U // Xerox
#define UHS_VID_LAKEVIEW_RESEARCH 0x0925U // Lakeview Research
#define UHS_VID_SUMMUS 0x0927U // Summus, Ltd
#define UHS_VID_PLX_TECHNOLOGY_INC_FORMERLY_OXFORD_SEMICONDUCTOR 0x0928U // PLX Technology, Inc. (formerly Oxford Semiconductor, Ltd)
#define UHS_VID_AMERICAN_BIOMETRIC 0x0929U // American Biometric Co.
#define UHS_VID_TOSHIBA_INFORMATION_AND_INDUSTRIAL_SYS_AND_SERVICES 0x092aU // Toshiba Information & Industrial Sys. And Services
#define UHS_VID_SENA_TECHNOLOGIES 0x092bU // Sena Technologies, Inc.
#define UHS_VID_NORTHERN_EMBEDDED_SCIENCECAVNEX 0x092fU // Northern Embedded Science/CAVNEX
#define UHS_VID_TOSHIBA_1 0x0930U // Toshiba Corp.
#define UHS_VID_HARMONIC_DATA_SYSTEMS 0x0931U // Harmonic Data Systems, Ltd
#define UHS_VID_CRESCENTEC 0x0932U // Crescentec Corp.
#define UHS_VID_QUANTUM 0x0933U // Quantum Corp.
#define UHS_VID_SPIRENT_COMMUNICATIONS 0x0934U // Spirent Communications
#define UHS_VID_NUTESLA 0x0936U // NuTesla
#define UHS_VID_LUMBERG 0x0939U // Lumberg, Inc.
#define UHS_VID_PIXART_IMAGING 0x093aU // Pixart Imaging, Inc.
#define UHS_VID_PLEXTOR 0x093bU // Plextor Corp.
#define UHS_VID_INTREPID_CONTROL_SYSTEMS 0x093cU // Intrepid Control Systems, Inc.
#define UHS_VID_INNOSYNC 0x093dU // InnoSync, Inc.
#define UHS_VID_JST_MFG 0x093eU // J.S.T. Mfg. Co., Ltd
#define UHS_VID_OLYMPIA_TELECOM_VERTRIEBS 0x093fU // Olympia Telecom Vertriebs GmbH
#define UHS_VID_JAPAN_STORAGE_BATTERY 0x0940U // Japan Storage Battery Co., Ltd
#define UHS_VID_PHOTOBIT 0x0941U // Photobit Corp.
#define UHS_VID_I2GOCOM 0x0942U // i2Go.com, LLC
#define UHS_VID_HCL_TECHNOLOGIES_INDIA_PRIVATE 0x0943U // HCL Technologies India Private, Ltd
#define UHS_VID_KORG 0x0944U // KORG, Inc.
#define UHS_VID_PASCO_SCIENTIFIC 0x0945U // Pasco Scientific
#define UHS_VID_KRONAUER_MUSIC_IN_DIGITAL 0x0948U // Kronauer music in digital
#define UHS_VID_LINKUP_SYSTEMS 0x094bU // Linkup Systems Corp.
#define UHS_VID_CABLE_TELEVISION_LABORATORIES 0x094dU // Cable Television Laboratories
#define UHS_VID_YANO 0x094fU // Yano
#define UHS_VID_KINGSTON_TECHNOLOGY 0x0951U // Kingston Technology
#define UHS_VID_RPM_SYSTEMS 0x0954U // RPM Systems Corp.
#define UHS_VID_NVIDIA 0x0955U // NVidia Corp.
#define UHS_VID_BSQUARE 0x0956U // BSquare Corp.
#define UHS_VID_AGILENT_TECHNOLOGIES 0x0957U // Agilent Technologies, Inc.
#define UHS_VID_COMPULINK_RESEARCH 0x0958U // CompuLink Research, Inc.
#define UHS_VID_COLOGNE_CHIP_AG 0x0959U // Cologne Chip AG
#define UHS_VID_PORTSMITH 0x095aU // Portsmith
#define UHS_VID_MEDIALOGIC 0x095bU // Medialogic Corp.
#define UHS_VID_K_TEC_ELECTRONICS 0x095cU // K-Tec Electronics
#define UHS_VID_POLYCOM 0x095dU // Polycom, Inc.
#define UHS_VID_ACER_NEWEB 0x0967U // Acer NeWeb Corp.
#define UHS_VID_CATALYST_ENTERPRISES 0x0968U // Catalyst Enterprises, Inc.
#define UHS_VID_FEITIAN_TECHNOLOGIES 0x096eU // Feitian Technologies, Inc.
#define UHS_VID_GRETAG_MACBETH_AG 0x0971U // Gretag-Macbeth AG
#define UHS_VID_SCHLUMBERGER 0x0973U // Schlumberger
#define UHS_VID_DATAGRAPHIX_A_BUSINESS_UNIT_OF_ANACOMP 0x0974U // Datagraphix, a business unit of Anacomp
#define UHS_VID_OLE_COMMUNICATIONS 0x0975U // OL'E Communications, Inc.
#define UHS_VID_ADIRONDACK_WIRE_AND_CABLE 0x0976U // Adirondack Wire & Cable
#define UHS_VID_LIGHTSURF_TECHNOLOGIES 0x0977U // Lightsurf Technologies
#define UHS_VID_BECKHOFF 0x0978U // Beckhoff GmbH
#define UHS_VID_JEILIN_TECHNOLOGY 0x0979U // Jeilin Technology Corp., Ltd
#define UHS_VID_MINDS_AT_WORK 0x097aU // Minds At Work LLC
#define UHS_VID_KNUDSEN_ENGINEERING 0x097bU // Knudsen Engineering, Ltd
#define UHS_VID_MARUNIX 0x097cU // Marunix Co., Ltd
#define UHS_VID_ROSUN_TECHNOLOGIES 0x097dU // Rosun Technologies, Inc.
#define UHS_VID_BIOPAC_SYSTEMS 0x097eU // Biopac Systems Inc.
#define UHS_VID_BARUN_ELECTRONICS 0x097fU // Barun Electronics Co., Ltd
#define UHS_VID_OAK_TECHNOLOGY_1 0x0981U // Oak Technology, Ltd
#define UHS_VID_APRICORN 0x0984U // Apricorn
#define UHS_VID_CAB_PRODUKTTECHNIK_GMBH_AND_CO_KG 0x0985U // cab Produkttechnik GmbH & Co KG
#define UHS_VID_MATSUSHITA_ELECTRIC_WORKS 0x0986U // Matsushita Electric Works, Ltd.
#define UHS_VID_VITANA 0x098cU // Vitana Corp.
#define UHS_VID_INDESIGN 0x098dU // INDesign
#define UHS_VID_INTEGRATED_INTELLECTUAL_PROPERTY 0x098eU // Integrated Intellectual Property, Inc.
#define UHS_VID_KENWOOD_TMI 0x098fU // Kenwood TMI Corp.
#define UHS_VID_GEMSTAR_EBOOK_GROUP 0x0993U // Gemstar eBook Group, Ltd
#define UHS_VID_INTEGRATED_TELECOM_EXPRESS 0x0996U // Integrated Telecom Express, Inc.
#define UHS_VID_ZIPPY_TECHNOLOGY 0x099aU // Zippy Technology Corp.
#define UHS_VID_PAIRGAIN_TECHNOLOGIES 0x09a3U // PairGain Technologies
#define UHS_VID_CONTECH_RESEARCH 0x09a4U // Contech Research, Inc.
#define UHS_VID_VCON_TELECOMMUNICATIONS 0x09a5U // VCON Telecommunications
#define UHS_VID_POINCHIPS 0x09a6U // Poinchips
#define UHS_VID_DATA_TRANSMISSION_NETWORK 0x09a7U // Data Transmission Network Corp.
#define UHS_VID_LIN_SHIUNG_ENTERPRISE 0x09a8U // Lin Shiung Enterprise Co., Ltd
#define UHS_VID_SMART_CARD_TECHNOLOGIES 0x09a9U // Smart Card Technologies Co., Ltd
#define UHS_VID_INTERSIL 0x09aaU // Intersil Corp.
#define UHS_VID_JAPAN_CASH_MACHINE 0x09abU // Japan Cash Machine Co., Ltd.
#define UHS_VID_TRIPP_LITE 0x09aeU // Tripp Lite
#define UHS_VID_FRANKLIN_ELECTRONIC_PUBLISHERS 0x09b2U // Franklin Electronic Publishers, Inc.
#define UHS_VID_ALTIUS_SOLUTIONS 0x09b3U // Altius Solutions, Inc.
#define UHS_VID_MDS_TELEPHONE_SYSTEMS 0x09b4U // MDS Telephone Systems
#define UHS_VID_CELLTRIX_TECHNOLOGY 0x09b5U // Celltrix Technology Co., Ltd
#define UHS_VID_GRUNDIG 0x09bcU // Grundig
#define UHS_VID_MYSMARTCOM 0x09beU // MySmart.Com
#define UHS_VID_AUERSWALD_GMBH_AND_CO_KG 0x09bfU // Auerswald GmbH & Co. KG
#define UHS_VID_GENPIX_ELECTRONICS 0x09c0U // Genpix Electronics, LLC
#define UHS_VID_ARRIS_INTERACTIVE 0x09c1U // Arris Interactive LLC
#define UHS_VID_NISCA 0x09c2U // Nisca Corp.
#define UHS_VID_ACTIVCARD 0x09c3U // ActivCard, Inc.
#define UHS_VID_ACTISYS 0x09c4U // ACTiSYS Corp.
#define UHS_VID_MEMORY 0x09c5U // Memory Corp.
#define UHS_VID_BMC_MESSSYSTEME 0x09caU // BMC Messsysteme GmbH
#define UHS_VID_WORKBIT 0x09ccU // Workbit Corp.
#define UHS_VID_PSION_DACOM_HOME_NETWORKS 0x09cdU // Psion Dacom Home Networks, Ltd
#define UHS_VID_CITY_ELECTRONICS 0x09ceU // City Electronics, Ltd
#define UHS_VID_ELECTRONICS_TESTING_CENTER_TAIWAN 0x09cfU // Electronics Testing Center, Taiwan
#define UHS_VID_NEOMAGIC 0x09d1U // NeoMagic, Inc.
#define UHS_VID_VREELIN_ENGINEERING 0x09d2U // Vreelin Engineering, Inc.
#define UHS_VID_COM_ONE 0x09d3U // Com One
#define UHS_VID_NOVATEL_WIRELESS 0x09d7U // Novatel Wireless
#define UHS_VID_KRF_TECH 0x09d9U // KRF Tech, Ltd
#define UHS_VID_A4TECH 0x09daU // A4Tech Co., Ltd.
#define UHS_VID_MEASUREMENT_COMPUTING 0x09dbU // Measurement Computing Corp.
#define UHS_VID_AIMEX 0x09dcU // Aimex Corp.
#define UHS_VID_FELLOWES 0x09ddU // Fellowes, Inc.
#define UHS_VID_ADDONICS_TECHNOLOGIES 0x09dfU // Addonics Technologies Corp.
#define UHS_VID_INTELLON 0x09e1U // Intellon Corp.
#define UHS_VID_JO_DAN_INTERNATIONAL 0x09e5U // Jo-Dan International, Inc.
#define UHS_VID_SILUTIA 0x09e6U // Silutia, Inc.
#define UHS_VID_REAL_3D 0x09e7U // Real 3D, Inc.
#define UHS_VID_AKAI_PROFESSIONAL_MI 0x09e8U // AKAI Professional M.I. Corp.
#define UHS_VID_CHEN_SOURCE 0x09e9U // Chen-Source, Inc.
#define UHS_VID_IM_NETWORKS 0x09ebU // IM Networks, Inc.
#define UHS_VID_XITEL 0x09efU // Xitel
#define UHS_VID_GOFLIGHT 0x09f3U // GoFlight, Inc.
#define UHS_VID_ARESCOM 0x09f5U // AresCom
#define UHS_VID_ROCKETCHIPS 0x09f6U // RocketChips, Inc.
#define UHS_VID_EDU_SCIENCE_HK 0x09f7U // Edu-Science (H.K.), Ltd
#define UHS_VID_SOFTCONNEX_TECHNOLOGIES 0x09f8U // SoftConnex Technologies, Inc.
#define UHS_VID_BAY_ASSOCIATES 0x09f9U // Bay Associates
#define UHS_VID_MTEK_VISION 0x09faU // Mtek Vision
#define UHS_VID_ALTERA_1 0x09fbU // Altera
#define UHS_VID_GAIN_TECHNOLOGY 0x09ffU // Gain Technology Corp.
#define UHS_VID_LIQUID_AUDIO 0x0a00U // Liquid Audio
#define UHS_VID_VIA 0x0a01U // ViA, Inc.
#define UHS_VID_UNKNOWN_MANUFACTURER 0x0a05U // Unknown Manufacturer
#define UHS_VID_ONTRAK_CONTROL_SYSTEMS 0x0a07U // Ontrak Control Systems Inc.
#define UHS_VID_CYBEX_COMPUTER_PRODUCTS 0x0a0bU // Cybex Computer Products Co.
#define UHS_VID_SERVERGY 0x0a0dU // Servergy, Inc
#define UHS_VID_XENTEC 0x0a11U // Xentec, Inc.
#define UHS_VID_CAMBRIDGE_SILICON_RADIO 0x0a12U // Cambridge Silicon Radio, Ltd
#define UHS_VID_TELEBYTE 0x0a13U // Telebyte, Inc.
#define UHS_VID_SPACELABS_MEDICAL 0x0a14U // Spacelabs Medical, Inc.
#define UHS_VID_SCALAR 0x0a15U // Scalar Corp.
#define UHS_VID_TREK_TECHNOLOGY_S_PTE 0x0a16U // Trek Technology (S) PTE, Ltd
#define UHS_VID_PENTAX 0x0a17U // Pentax Corp.
#define UHS_VID_HEIDELBERGER_DRUCKMASCHINEN_AG 0x0a18U // Heidelberger Druckmaschinen AG
#define UHS_VID_HUA_GENG_TECHNOLOGIES 0x0a19U // Hua Geng Technologies, Inc.
#define UHS_VID_MEDTRONIC_PHYSIO_CONTROL 0x0a21U // Medtronic Physio Control Corp.
#define UHS_VID_CENTURY_SEMICONDUCTOR_USA 0x0a22U // Century Semiconductor USA, Inc.
#define UHS_VID_DATACARD_GROUP 0x0a27U // Datacard Group
#define UHS_VID_AK_MODUL_BUS_COMPUTER 0x0a2cU // AK-Modul-Bus Computer GmbH
#define UHS_VID_TG3_ELECTRONICS 0x0a34U // TG3 Electronics, Inc.
#define UHS_VID_RADIKAL_TECHNOLOGIES 0x0a35U // Radikal Technologies
#define UHS_VID_GILAT_SATELLITE_NETWORKS 0x0a39U // Gilat Satellite Networks, Ltd
#define UHS_VID_PENTAMEDIA 0x0a3aU // PentaMedia Co., Ltd
#define UHS_VID_NTT_DOCOMO 0x0a3cU // NTT DoCoMo, Inc.
#define UHS_VID_VARO_VISION 0x0a3dU // Varo Vision
#define UHS_VID_SWISSONIC_AG 0x0a3fU // Swissonic AG
#define UHS_VID_BOCA_SYSTEMS 0x0a43U // Boca Systems, Inc.
#define UHS_VID_DAVICOM_SEMICONDUCTOR 0x0a46U // Davicom Semiconductor, Inc.
#define UHS_VID_HIROSE_ELECTRIC 0x0a47U // Hirose Electric
#define UHS_VID_IO_INTERCONNECT 0x0a48U // I/O Interconnect
#define UHS_VID_PLOYTEC 0x0a4aU // Ploytec GmbH
#define UHS_VID_FUJITSU_MEDIA_DEVICES 0x0a4bU // Fujitsu Media Devices, Ltd
#define UHS_VID_COMPUTEX 0x0a4cU // Computex Co., Ltd
#define UHS_VID_EVOLUTION_ELECTRONICS 0x0a4dU // Evolution Electronics, Ltd
#define UHS_VID_STEINBERG_SOFT_UND_HARDWARE 0x0a4eU // Steinberg Soft-und Hardware GmbH
#define UHS_VID_LITTON_SYSTEMS 0x0a4fU // Litton Systems, Inc.
#define UHS_VID_MIMAKI_ENGINEERING 0x0a50U // Mimaki Engineering Co., Ltd
#define UHS_VID_SONY_ELECTRONICS 0x0a51U // Sony Electronics, Inc.
#define UHS_VID_JEBSEE_ELECTRONICS 0x0a52U // Jebsee Electronics Co., Ltd
#define UHS_VID_PORTABLE_PERIPHERAL 0x0a53U // Portable Peripheral Co., Ltd
#define UHS_VID_ELECTRONICS_FOR_IMAGING 0x0a5aU // Electronics For Imaging, Inc.
#define UHS_VID_EASICS_NV 0x0a5bU // EAsics NV
#define UHS_VID_BROADCOM 0x0a5cU // Broadcom Corp.
#define UHS_VID_DIATREND 0x0a5dU // Diatrend Corp.
#define UHS_VID_ZEBRA 0x0a5fU // Zebra
#define UHS_VID_MPMAN 0x0a62U // MPMan
#define UHS_VID_CLEARCUBE_TECHNOLOGY 0x0a66U // ClearCube Technology
#define UHS_VID_MEDELI_ELECTRONICS 0x0a67U // Medeli Electronics Co., Ltd
#define UHS_VID_COMAIDE 0x0a68U // Comaide Corp.
#define UHS_VID_CHROMA_ATE 0x0a69U // Chroma ate, Inc.
#define UHS_VID_GREEN_HOUSE 0x0a6bU // Green House Co., Ltd
#define UHS_VID_INTEGRATED_CIRCUIT_SYSTEMS 0x0a6cU // Integrated Circuit Systems, Inc.
#define UHS_VID_UPS_MANUFACTURING 0x0a6dU // UPS Manufacturing
#define UHS_VID_BENWIN 0x0a6eU // Benwin
#define UHS_VID_CORE_TECHNOLOGY 0x0a6fU // Core Technology, Inc.
#define UHS_VID_INTERNATIONAL_GAME_TECHNOLOGY 0x0a70U // International Game Technology
#define UHS_VID_VIPCOLOR_TECHNOLOGIES_USA 0x0a71U // VIPColor Technologies USA, Inc.
#define UHS_VID_SANWA_DENSHI 0x0a72U // Sanwa Denshi
#define UHS_VID_MACKIE_DESIGNS 0x0a73U // Mackie Designs
#define UHS_VID_NSTL 0x0a7dU // NSTL, Inc.
#define UHS_VID_OCTAGON_SYSTEMS 0x0a7eU // Octagon Systems Corp.
#define UHS_VID_REXON_TECHNOLOGY 0x0a80U // Rexon Technology Corp., Ltd
#define UHS_VID_CHESEN_ELECTRONICS 0x0a81U // Chesen Electronics Corp.
#define UHS_VID_SYSCAN 0x0a82U // Syscan
#define UHS_VID_NEXTCOMM 0x0a83U // NextComm, Inc.
#define UHS_VID_MAUI_INNOVATIVE_PERIPHERALS 0x0a84U // Maui Innovative Peripherals
#define UHS_VID_IDEXX_LABS 0x0a85U // Idexx Labs
#define UHS_VID_NITGEN 0x0a86U // NITGen Co., Ltd
#define UHS_VID_AKTIV 0x0a89U // Aktiv
#define UHS_VID_PICTURETEL 0x0a8dU // Picturetel
#define UHS_VID_JAPAN_AVIATION_ELECTRONICS_INDUSTRY 0x0a8eU // Japan Aviation Electronics Industry, Ltd
#define UHS_VID_CANDY_TECHNOLOGY 0x0a90U // Candy Technology Co., Ltd
#define UHS_VID_GLOBLINK_TECHNOLOGY 0x0a91U // Globlink Technology, Inc.
#define UHS_VID_EGO_SYSTEMS 0x0a92U // EGO SYStems, Inc.
#define UHS_VID_C_TECHNOLOGIES 0x0a93U // C Technologies AB
#define UHS_VID_INTERSENSE 0x0a94U // Intersense
#define UHS_VID_LAVA_COMPUTER_MFG 0x0aa3U // Lava Computer Mfg., Inc.
#define UHS_VID_DEVELCO_ELEKTRONIK 0x0aa4U // Develco Elektronik
#define UHS_VID_FIRST_INTERNATIONAL_DIGITAL 0x0aa5U // First International Digital
#define UHS_VID_PERCEPTION_DIGITAL 0x0aa6U // Perception Digital, Ltd
#define UHS_VID_WINCOR_NIXDORF_INTERNATIONAL 0x0aa7U // Wincor Nixdorf International GmbH
#define UHS_VID_TRIGEM_COMPUTER 0x0aa8U // TriGem Computer, Inc.
#define UHS_VID_BAROMTEC 0x0aa9U // Baromtec Co.
#define UHS_VID_JAPAN_CBM 0x0aaaU // Japan CBM Corp.
#define UHS_VID_VISION_SHAPE_EUROPE 0x0aabU // Vision Shape Europe SA
#define UHS_VID_ICOMPRESSION 0x0aacU // iCompression, Inc.
#define UHS_VID_ROHDE_AND_SCHWARZ_GMBH_AND_CO_KG 0x0aadU // Rohde & Schwarz GmbH & Co. KG
#define UHS_VID_NEC_INFRONTIA_CORP_NITSUKO 0x0aaeU // NEC infrontia Corp. (Nitsuko)
#define UHS_VID_DIGITALWAY 0x0aafU // Digitalway Co., Ltd
#define UHS_VID_ARROW_STRONG_ELECTRONICS 0x0ab0U // Arrow Strong Electronics Co., Ltd
#define UHS_VID_FEIG_ELECTRONIC 0x0ab1U // FEIG ELECTRONIC GmbH
#define UHS_VID_ELLISYS 0x0abaU // Ellisys
#define UHS_VID_STEREO_LINK 0x0abeU // Stereo-Link
#define UHS_VID_DIOLAN 0x0abfU // Diolan
#define UHS_VID_SANYO_SEMICONDUCTOR_COMPANY_MICRO 0x0ac3U // Sanyo Semiconductor Company Micro
#define UHS_VID_LECO 0x0ac4U // Leco Corp.
#define UHS_VID_I_AND_C 0x0ac5U // I & C Corp.
#define UHS_VID_SINGING_ELECTRONS 0x0ac6U // Singing Electrons, Inc.
#define UHS_VID_PANWEST 0x0ac7U // Panwest Corp.
#define UHS_VID_Z_STAR_MICROELECTRONICS 0x0ac8U // Z-Star Microelectronics Corp.
#define UHS_VID_MICRO_SOLUTIONS 0x0ac9U // Micro Solutions, Inc.
#define UHS_VID_OPEN_NETWORKS 0x0acaU // OPEN Networks Ltd
#define UHS_VID_KOGA_ELECTRONICS 0x0accU // Koga Electronics Co.
#define UHS_VID_ID_TECH 0x0acdU // ID Tech
#define UHS_VID_ZYDAS 0x0aceU // ZyDAS
#define UHS_VID_INTOTO 0x0acfU // Intoto, Inc.
#define UHS_VID_INTELLIX 0x0ad0U // Intellix Corp.
#define UHS_VID_REMOTEC_TECHNOLOGY 0x0ad1U // Remotec Technology, Ltd
#define UHS_VID_SERVICE_AND_QUALITY_TECHNOLOGY 0x0ad2U // Service & Quality Technology Co., Ltd
#define UHS_VID_DATA_ENCRYPTION_SYSTEMS 0x0adaU // Data Encryption Systems Ltd.
#define UHS_VID_ALLION_COMPUTER 0x0ae3U // Allion Computer, Inc.
#define UHS_VID_TAITO 0x0ae4U // Taito Corp.
#define UHS_VID_NEODYM_SYSTEMS 0x0ae7U // Neodym Systems, Inc.
#define UHS_VID_SYSTEM_SUPPORT 0x0ae8U // System Support Co., Ltd
#define UHS_VID_NORTH_SHORE_CIRCUIT_DESIGN_LLP 0x0ae9U // North Shore Circuit Design L.L.P.
#define UHS_VID_SCIESSENCE 0x0aeaU // SciEssence, LLC
#define UHS_VID_TTP_COMMUNICATIONS 0x0aebU // TTP Communications, Ltd
#define UHS_VID_NEODIO_TECHNOLOGIES 0x0aecU // Neodio Technologies Corp.
#define UHS_VID_OPTION 0x0af0U // Option
#define UHS_VID_SILVER_I 0x0af6U // Silver I Co., Ltd
#define UHS_VID_B2C2 0x0af7U // B2C2, Inc.
#define UHS_VID_HAMA 0x0af9U // Hama, Inc.
#define UHS_VID_DMC 0x0afaU // DMC Co., Ltd.
#define UHS_VID_ZAPTRONIX 0x0afcU // Zaptronix Ltd
#define UHS_VID_TATENO_DENNOU 0x0afdU // Tateno Dennou, Inc.
#define UHS_VID_CUMMINS_ENGINE 0x0afeU // Cummins Engine Co.
#define UHS_VID_JUMP_ZONE_NETWORK_PRODUCTS 0x0affU // Jump Zone Network Products, Inc.
#define UHS_VID_INGENICO 0x0b00U // INGENICO
#define UHS_VID_ASUSTEK_COMPUTER 0x0b05U // ASUSTek Computer, Inc.
#define UHS_VID_DATAMAX_ONEIL 0x0b0bU // Datamax-O'Neil
#define UHS_VID_TODOS 0x0b0cU // Todos AB
#define UHS_VID_PROJECTLAB 0x0b0dU // ProjectLab
#define UHS_VID_GN_NETCOM 0x0b0eU // GN Netcom
#define UHS_VID_AVID_TECHNOLOGY 0x0b0fU // AVID Technology
#define UHS_VID_PCALLY 0x0b10U // Pcally
#define UHS_VID_I_TECH_SOLUTIONS 0x0b11U // I Tech Solutions Co., Ltd
#define UHS_VID_ELECTRONIC_WARFARE_ASSOC_INC_EWA 0x0b1eU // Electronic Warfare Assoc., Inc. (EWA)
#define UHS_VID_INSYDE_SOFTWARE 0x0b1fU // Insyde Software Corp.
#define UHS_VID_TRANSDIMENSION 0x0b20U // TransDimension, Inc.
#define UHS_VID_YOKOGAWA_ELECTRIC 0x0b21U // Yokogawa Electric Corp.
#define UHS_VID_JAPAN_SYSTEM_DEVELOPMENT 0x0b22U // Japan System Development Co., Ltd
#define UHS_VID_PAN_ASIA_ELECTRONICS 0x0b23U // Pan-Asia Electronics Co., Ltd
#define UHS_VID_LINK_EVOLUTION 0x0b24U // Link Evolution Corp.
#define UHS_VID_RITEK 0x0b27U // Ritek Corp.
#define UHS_VID_KENWOOD 0x0b28U // Kenwood Corp.
#define UHS_VID_VILLAGE_CENTER 0x0b2cU // Village Center, Inc.
#define UHS_VID_PNY_TECHNOLOGIES 0x0b30U // PNY Technologies, Inc.
#define UHS_VID_CONTOUR_DESIGN 0x0b33U // Contour Design, Inc.
#define UHS_VID_HITACHI_ULSI_SYSTEMS 0x0b37U // Hitachi ULSI Systems Co., Ltd
#define UHS_VID_GEAR_HEAD 0x0b38U // Gear Head
#define UHS_VID_OMNIDIRECTIONAL_CONTROL_TECHNOLOGY 0x0b39U // Omnidirectional Control Technology, Inc.
#define UHS_VID_IPAXESS 0x0b3aU // IPaxess
#define UHS_VID_TEKRAM_TECHNOLOGY 0x0b3bU // Tekram Technology Co., Ltd
#define UHS_VID_OLIVETTI_TECHCENTER 0x0b3cU // Olivetti Techcenter
#define UHS_VID_KIKUSUI_ELECTRONICS 0x0b3eU // Kikusui Electronics Corp.
#define UHS_VID_HAL 0x0b41U // Hal Corp.
#define UHS_VID_PLAYCOM 0x0b43U // Play.com, Inc.
#define UHS_VID_SPORTBUGCOM 0x0b47U // Sportbug.com, Inc.
#define UHS_VID_TECHNOTREND_AG 0x0b48U // TechnoTrend AG
#define UHS_VID_ASCII 0x0b49U // ASCII Corp.
#define UHS_VID_PINE 0x0b4bU // Pine Corp. Ltd.
#define UHS_VID_GRAPHTEC_AMERICA 0x0b4dU // Graphtec America, Inc.
#define UHS_VID_MUSICAL_ELECTRONICS 0x0b4eU // Musical Electronics, Ltd
#define UHS_VID_DUMPRIES 0x0b50U // Dumpries Co., Ltd
#define UHS_VID_COMFORT_KEYBOARD 0x0b51U // Comfort Keyboard Co.
#define UHS_VID_COLORADO_MICRODISPLAY 0x0b52U // Colorado MicroDisplay, Inc.
#define UHS_VID_SINBON_ELECTRONICS 0x0b54U // Sinbon Electronics Co., Ltd
#define UHS_VID_TYI_SYSTEMS 0x0b56U // TYI Systems, Ltd
#define UHS_VID_BEIJING_HANWANGTECHNOLOGY 0x0b57U // Beijing HanwangTechnology Co., Ltd
#define UHS_VID_LAKE_COMMUNICATIONS 0x0b59U // Lake Communications, Ltd
#define UHS_VID_COREL 0x0b5aU // Corel Corp.
#define UHS_VID_GREEN_ELECTRONICS 0x0b5fU // Green Electronics Co., Ltd
#define UHS_VID_NSINE 0x0b60U // Nsine, Ltd
#define UHS_VID_NEC_VIEWTECHNOLOGY 0x0b61U // NEC Viewtechnology, Ltd
#define UHS_VID_ORANGE_MICRO 0x0b62U // Orange Micro, Inc.
#define UHS_VID_ADLINK_TECHNOLOGY 0x0b63U // ADLink Technology, Inc.
#define UHS_VID_WONDERFUL_WIRE_CABLE 0x0b64U // Wonderful Wire Cable Co., Ltd
#define UHS_VID_EXPERT_MAGNETICS 0x0b65U // Expert Magnetics Corp.
#define UHS_VID_CYBIKO 0x0b66U // Cybiko Inc.
#define UHS_VID_FAIRBANKS_SCALES 0x0b67U // Fairbanks Scales
#define UHS_VID_CACHEVISION 0x0b69U // CacheVision
#define UHS_VID_MAXIM_INTEGRATED_PRODUCTS 0x0b6aU // Maxim Integrated Products
#define UHS_VID_NAGANO_JAPAN_RADIO 0x0b6fU // Nagano Japan Radio Co., Ltd
#define UHS_VID_PORTALPLAYER 0x0b70U // PortalPlayer, Inc.
#define UHS_VID_SHIN_EI_SANGYO 0x0b71U // SHIN-EI Sangyo Co., Ltd
#define UHS_VID_EMBEDDED_WIRELESS_TECHNOLOGY 0x0b72U // Embedded Wireless Technology Co., Ltd
#define UHS_VID_COMPUTONE 0x0b73U // Computone Corp.
#define UHS_VID_ROLAND_DG 0x0b75U // Roland DG Corp.
#define UHS_VID_SUNRISE_TELECOM 0x0b79U // Sunrise Telecom, Inc.
#define UHS_VID_ZEEVO 0x0b7aU // Zeevo, Inc.
#define UHS_VID_TAIKO_DENKI 0x0b7bU // Taiko Denki Co., Ltd
#define UHS_VID_ITRAN_COMMUNICATIONS 0x0b7cU // ITRAN Communications, Ltd
#define UHS_VID_ASTRODESIGN 0x0b7dU // Astrodesign, Inc.
#define UHS_VID_ID3_TECHNOLOGIES 0x0b81U // id3 Technologies
#define UHS_VID_REXTRON_TECHNOLOGY 0x0b84U // Rextron Technology, Inc.
#define UHS_VID_ELKAT_ELECTRONICS_SDN_BHD 0x0b85U // Elkat Electronics, Sdn., Bhd.
#define UHS_VID_EXPUTER_SYSTEMS 0x0b86U // Exputer Systems, Inc.
#define UHS_VID_PLUS_ONE_I_AND_T 0x0b87U // Plus-One I & T, Inc.
#define UHS_VID_SIGMA_KOKI_CO_LTD_TECHNOLOGY_CENTER 0x0b88U // Sigma Koki Co., Ltd, Technology Center
#define UHS_VID_ADVANCED_DIGITAL_BROADCAST 0x0b89U // Advanced Digital Broadcast, Ltd
#define UHS_VID_SMART_TECHNOLOGIES 0x0b8cU // SMART Technologies Inc.
#define UHS_VID_ASIX_ELECTRONICS 0x0b95U // ASIX Electronics Corp.
#define UHS_VID_SEWON_TELECOM 0x0b96U // Sewon Telecom
#define UHS_VID_O2_MICRO 0x0b97U // O2 Micro, Inc.
#define UHS_VID_PLAYMATES_TOYS 0x0b98U // Playmates Toys, Inc.
#define UHS_VID_AUDIO_INTERNATIONAL 0x0b99U // Audio International, Inc.
#define UHS_VID_DIPL_ING_STEFAN_KUNDE 0x0b9bU // Dipl.-Ing. Stefan Kunde
#define UHS_VID_SOFTPROTEC 0x0b9dU // Softprotec Co.
#define UHS_VID_CHIPPO_TECHNOLOGIES 0x0b9fU // Chippo Technologies
#define UHS_VID_US_ROBOTICS 0x0bafU // U.S. Robotics
#define UHS_VID_CONCORD_CAMERA 0x0bb0U // Concord Camera Corp.
#define UHS_VID_INFINILINK 0x0bb1U // Infinilink Corp.
#define UHS_VID_AMBIT_MICROSYSTEMS 0x0bb2U // Ambit Microsystems Corp.
#define UHS_VID_OFUJI_TECHNOLOGY 0x0bb3U // Ofuji Technology
#define UHS_VID_HTC_HIGH_TECH_COMPUTER 0x0bb4U // HTC (High Tech Computer Corp.)
#define UHS_VID_MURATA_MANUFACTURING 0x0bb5U // Murata Manufacturing Co., Ltd
#define UHS_VID_NETWORK_ALCHEMY 0x0bb6U // Network Alchemy
#define UHS_VID_JOYTECH_COMPUTER 0x0bb7U // Joytech Computer Co., Ltd
#define UHS_VID_HITACHI_SEMICONDUCTOR_AND_DEVICES_SALES 0x0bb8U // Hitachi Semiconductor and Devices Sales Co., Ltd
#define UHS_VID_EIGER_MANDC 0x0bb9U // Eiger M&C Co., Ltd
#define UHS_VID_ZACCESS_SYSTEMS 0x0bbaU // ZAccess Systems
#define UHS_VID_GENERAL_METERS 0x0bbbU // General Meters Corp.
#define UHS_VID_ASSISTIVE_TECHNOLOGY 0x0bbcU // Assistive Technology, Inc.
#define UHS_VID_SYSTEM_CONNECTION 0x0bbdU // System Connection, Inc.
#define UHS_VID_KNILINK_TECHNOLOGY 0x0bc0U // Knilink Technology, Inc.
#define UHS_VID_FUW_YNG_ELECTRONICS 0x0bc1U // Fuw Yng Electronics Co., Ltd
#define UHS_VID_SEAGATE_RSS 0x0bc2U // Seagate RSS LLC
#define UHS_VID_IPWIRELESS 0x0bc3U // IPWireless, Inc.
#define UHS_VID_MICROCUBE 0x0bc4U // Microcube Corp.
#define UHS_VID_JCN 0x0bc5U // JCN Co., Ltd
#define UHS_VID_EXWAY 0x0bc6U // ExWAY, Inc.
#define UHS_VID_X10_WIRELESS_TECHNOLOGY 0x0bc7U // X10 Wireless Technology, Inc.
#define UHS_VID_TELMAX_COMMUNICATIONS 0x0bc8U // Telmax Communications
#define UHS_VID_ECI_TELECOM 0x0bc9U // ECI Telecom, Ltd
#define UHS_VID_STARTEK_ENGINEERING 0x0bcaU // Startek Engineering, Inc.
#define UHS_VID_PERFECT_TECHNIC_ENTERPRISE 0x0bcbU // Perfect Technic Enterprise Co., Ltd
#define UHS_VID_ANDREW_PARGETER_AND_ASSOCIATES 0x0bd7U // Andrew Pargeter & Associates
#define UHS_VID_REALTEK_SEMICONDUCTOR 0x0bdaU // Realtek Semiconductor Corp.
#define UHS_VID_ERICSSON_BUSINESS_MOBILE_NETWORKS_BV 0x0bdbU // Ericsson Business Mobile Networks BV
#define UHS_VID_Y_MEDIA 0x0bdcU // Y Media Corp.
#define UHS_VID_ORANGE_PCS 0x0bddU // Orange PCS
#define UHS_VID_KANDA_TSUSHIN_KOGYO 0x0be2U // Kanda Tsushin Kogyo Co., Ltd
#define UHS_VID_TOYO 0x0be3U // TOYO Corp.
#define UHS_VID_ELKA_INTERNATIONAL 0x0be4U // Elka International, Ltd
#define UHS_VID_DOME_IMAGING_SYSTEMS 0x0be5U // DOME imaging systems, Inc.
#define UHS_VID_DONG_GUAN_HUMEN_WONDERFUL_WIRE_CABLE_FACTORY 0x0be6U // Dong Guan Humen Wonderful Wire Cable Factory
#define UHS_VID_MEI 0x0bedU // MEI
#define UHS_VID_LTK_INDUSTRIES 0x0beeU // LTK Industries, Ltd
#define UHS_VID_WAY2CALL_COMMUNICATIONS 0x0befU // Way2Call Communications
#define UHS_VID_PACE_MICRO_TECHNOLOGY_PLC 0x0bf0U // Pace Micro Technology PLC
#define UHS_VID_INTRACOM 0x0bf1U // Intracom S.A.
#define UHS_VID_KONEXX 0x0bf2U // Konexx
#define UHS_VID_ADDONICS_TECHNOLOGIES_1 0x0bf6U // Addonics Technologies, Inc.
#define UHS_VID_SUNNY_GIKEN 0x0bf7U // Sunny Giken, Inc.
#define UHS_VID_FUJITSU_SIEMENS_COMPUTERS_1 0x0bf8U // Fujitsu Siemens Computers
#define UHS_VID_KVASER 0x0bfdU // Kvaser AB
#define UHS_VID_MOTO_DEVELOPMENT_GROUP 0x0c04U // MOTO Development Group, Inc.
#define UHS_VID_APPIAN_GRAPHICS 0x0c05U // Appian Graphics
#define UHS_VID_HASBRO_GAMES 0x0c06U // Hasbro Games, Inc.
#define UHS_VID_INFINITE_DATA_STORAGE 0x0c07U // Infinite Data Storage, Ltd
#define UHS_VID_AGATE 0x0c08U // Agate
#define UHS_VID_COMJET_INFORMATION_SYSTEM 0x0c09U // Comjet Information System
#define UHS_VID_HIGHPOINT_TECHNOLOGIES 0x0c0aU // Highpoint Technologies, Inc.
#define UHS_VID_DURA_MICRO_INC_ACOMDATA 0x0c0bU // Dura Micro, Inc. (Acomdata)
#define UHS_VID_ZEROPLUS 0x0c12U // Zeroplus
#define UHS_VID_IRIS_GRAPHICS 0x0c15U // Iris Graphics
#define UHS_VID_GYRATION 0x0c16U // Gyration, Inc.
#define UHS_VID_CYBERBOARD_AS 0x0c17U // Cyberboard A/S
#define UHS_VID_SYNERTEK_KOREA 0x0c18U // SynerTek Korea, Inc.
#define UHS_VID_CYBERPIXIE 0x0c19U // cyberPIXIE, Inc.
#define UHS_VID_SILICON_MOTION 0x0c1aU // Silicon Motion, Inc.
#define UHS_VID_MIPS_TECHNOLOGIES 0x0c1bU // MIPS Technologies
#define UHS_VID_HANG_ZHOU_SILAN_ELECTRONICS 0x0c1cU // Hang Zhou Silan Electronics Co., Ltd
#define UHS_VID_TALLY_PRINTER 0x0c22U // Tally Printer Corp.
#define UHS_VID_LERNOUT__HAUSPIE 0x0c23U // Lernout + Hauspie
#define UHS_VID_TAIYO_YUDEN 0x0c24U // Taiyo Yuden
#define UHS_VID_SAMPO 0x0c25U // Sampo Corp.
#define UHS_VID_PROLIFIC_TECHNOLOGY_1 0x0c26U // Prolific Technology Inc.
#define UHS_VID_RFIDEAS 0x0c27U // RFIDeas, Inc
#define UHS_VID_METROLOGIC_INSTRUMENTS 0x0c2eU // Metrologic Instruments
#define UHS_VID_EAGLETRON 0x0c35U // Eagletron, Inc.
#define UHS_VID_E_INK 0x0c36U // E Ink Corp.
#define UHS_VID_EDIGITAL 0x0c37U // e.Digital
#define UHS_VID_DER_AN_ELECTRIC_WIRE_AND_CABLE 0x0c38U // Der An Electric Wire & Cable Co., Ltd
#define UHS_VID_IFR 0x0c39U // IFR
#define UHS_VID_FURUI_PRECISE_COMPONENT_KUNSHAN 0x0c3aU // Furui Precise Component (Kunshan) Co., Ltd
#define UHS_VID_KOMATSU 0x0c3bU // Komatsu, Ltd
#define UHS_VID_RADIUS 0x0c3cU // Radius Co., Ltd
#define UHS_VID_INNOCOM 0x0c3dU // Innocom, Inc.
#define UHS_VID_NEXTCELL 0x0c3eU // Nextcell, Inc.
#define UHS_VID_MOTOROLA_IDEN 0x0c44U // Motorola iDEN
#define UHS_VID_MICRODIA 0x0c45U // Microdia
#define UHS_VID_WAVERIDER_COMMUNICATIONS 0x0c46U // WaveRider Communications, Inc.
#define UHS_VID_ALGE_TIMING 0x0c4aU // ALGE-TIMING GmbH
#define UHS_VID_REINER_SCT_KARTENSYSTEME 0x0c4bU // Reiner SCT Kartensysteme GmbH
#define UHS_VID_NEEDHAMS_ELECTRONICS 0x0c4cU // Needham's Electronics
#define UHS_VID_SEALEVEL_SYSTEMS 0x0c52U // Sealevel Systems, Inc.
#define UHS_VID_VIEWPLUS 0x0c53U // ViewPLUS, Inc.
#define UHS_VID_GLORY 0x0c54U // Glory, Ltd
#define UHS_VID_SPECTRUM_DIGITAL 0x0c55U // Spectrum Digital, Inc.
#define UHS_VID_BILLION_BRIGHT 0x0c56U // Billion Bright, Ltd
#define UHS_VID_IMAGINATIVE_DESIGN_OPERATION 0x0c57U // Imaginative Design Operation Co., Ltd
#define UHS_VID_VIDAR_SYSTEMS 0x0c58U // Vidar Systems Corp.
#define UHS_VID_DONG_GUAN_SHINKO_WIRE 0x0c59U // Dong Guan Shinko Wire Co., Ltd
#define UHS_VID_TRS_INTERNATIONAL_MFG 0x0c5aU // TRS International Mfg., Inc.
#define UHS_VID_XYTRONIX_RESEARCH_AND_DESIGN 0x0c5eU // Xytronix Research & Design
#define UHS_VID_APOGEE_ELECTRONICS 0x0c60U // Apogee Electronics Corp.
#define UHS_VID_CHANT_SINCERE 0x0c62U // Chant Sincere Co., Ltd
#define UHS_VID_TOKO 0x0c63U // Toko, Inc.
#define UHS_VID_SIGNALITY_SYSTEM_ENGINEERING 0x0c64U // Signality System Engineering Co., Ltd
#define UHS_VID_EMINENCE_ENTERPRISE 0x0c65U // Eminence Enterprise Co., Ltd
#define UHS_VID_REXON_ELECTRONICS 0x0c66U // Rexon Electronics Corp.
#define UHS_VID_CONCEPT_TELECOM 0x0c67U // Concept Telecom, Ltd
#define UHS_VID_ACS 0x0c6aU // ACS
#define UHS_VID_JETI_TECHNISCHE_INSTRUMENTE 0x0c6cU // JETI Technische Instrumente GmbH
#define UHS_VID_MCT_ELEKTRONIKLADEN 0x0c70U // MCT Elektronikladen
#define UHS_VID_PEAK_SYSTEM 0x0c72U // PEAK System
#define UHS_VID_OPTRONIC_LABORATORIES 0x0c74U // Optronic Laboratories Inc.
#define UHS_VID_JMTEK 0x0c76U // JMTek, LLC.
#define UHS_VID_SIPIX_GROUP 0x0c77U // Sipix Group, Ltd
#define UHS_VID_DETTO 0x0c78U // Detto Corp.
#define UHS_VID_NUCONNEX_TECHNOLOGIES_PTE 0x0c79U // NuConnex Technologies Pte., Ltd
#define UHS_VID_WING_SPAN_ENTERPRISE 0x0c7aU // Wing-Span Enterprise Co., Ltd
#define UHS_VID_NDA_TECHNOLOGIES 0x0c86U // NDA Technologies, Inc.
#define UHS_VID_KYOCERA_WIRELESS 0x0c88U // Kyocera Wireless Corp.
#define UHS_VID_HONDA_TSUSHIN_KOGYO 0x0c89U // Honda Tsushin Kogyo Co., Ltd
#define UHS_VID_PATHWAY_CONNECTIVITY 0x0c8aU // Pathway Connectivity, Inc.
#define UHS_VID_WAVEFLY 0x0c8bU // Wavefly Corp.
#define UHS_VID_COACTIVE_NETWORKS 0x0c8cU // Coactive Networks
#define UHS_VID_TEMPO 0x0c8dU // Tempo
#define UHS_VID_CESSCOM 0x0c8eU // Cesscom Co., Ltd
#define UHS_VID_APPLIED_MICROSYSTEMS 0x0c8fU // Applied Microsystems
#define UHS_VID_CRYPTERA 0x0c94U // Cryptera
#define UHS_VID_BERKSHIRE_PRODUCTS 0x0c98U // Berkshire Products, Inc.
#define UHS_VID_INNOCHIPS 0x0c99U // Innochips Co., Ltd
#define UHS_VID_HANWOOL_ROBOTICS 0x0c9aU // Hanwool Robotics Corp.
#define UHS_VID_JOBIN_YVON 0x0c9bU // Jobin Yvon, Inc.
#define UHS_VID_SEMTEK 0x0c9dU // SemTek
#define UHS_VID_ZYFER 0x0ca2U // Zyfer
#define UHS_VID_SEGA 0x0ca3U // Sega Corp.
#define UHS_VID_STANDT_INSTRUMENT 0x0ca4U // ST&T Instrument Corp.
#define UHS_VID_BAE_SYSTEMS_CANADA 0x0ca5U // BAE Systems Canada, Inc.
#define UHS_VID_CASTLES_TECHNOLOGY 0x0ca6U // Castles Technology Co., Ltd
#define UHS_VID_INFORMATION_SYSTEMS_LABORATORIES 0x0ca7U // Information Systems Laboratories
#define UHS_VID_MOTOROLA_CGISS 0x0cadU // Motorola CGISS
#define UHS_VID_ASCOM_BUSINESS_SYSTEMS 0x0caeU // Ascom Business Systems, Ltd
#define UHS_VID_BUSLINK 0x0cafU // Buslink
#define UHS_VID_FLYING_PIG_SYSTEMS 0x0cb0U // Flying Pig Systems
#define UHS_VID_INNOVONICS 0x0cb1U // Innovonics, Inc.
#define UHS_VID_CELESTIX_NETWORKS_PTE 0x0cb6U // Celestix Networks, Pte., Ltd
#define UHS_VID_SINGATRON_ENTERPRISE 0x0cb7U // Singatron Enterprise Co., Ltd
#define UHS_VID_OPTICIS 0x0cb8U // Opticis Co., Ltd
#define UHS_VID_TRUST_ELECTRONIC_SHANGHAI 0x0cbaU // Trust Electronic (Shanghai) Co., Ltd
#define UHS_VID_SHANGHAI_DARONG_ELECTRONICS 0x0cbbU // Shanghai Darong Electronics Co., Ltd
#define UHS_VID_PALMAX_TECHNOLOGY 0x0cbcU // Palmax Technology Co., Ltd
#define UHS_VID_PENTEL_CO_LTD_ELECTRONICS_EQUIPMENT_DIV 0x0cbdU // Pentel Co., Ltd (Electronics Equipment Div.)
#define UHS_VID_KERYX_TECHNOLOGIES 0x0cbeU // Keryx Technologies, Inc.
#define UHS_VID_UNION_GENIUS_COMPUTER 0x0cbfU // Union Genius Computer Co., Ltd
#define UHS_VID_KUON_YI_INDUSTRIAL 0x0cc0U // Kuon Yi Industrial Corp.
#define UHS_VID_GIVEN_IMAGING 0x0cc1U // Given Imaging, Ltd
#define UHS_VID_TIMEX 0x0cc2U // Timex Corp.
#define UHS_VID_RIMAGE 0x0cc3U // Rimage Corp.
#define UHS_VID_EMSYS 0x0cc4U // emsys GmbH
#define UHS_VID_SENDO 0x0cc5U // Sendo
#define UHS_VID_INTERMAGIC 0x0cc6U // Intermagic Corp.
#define UHS_VID_KONTRON_MEDICAL_AG 0x0cc7U // Kontron Medical AG
#define UHS_VID_TECHNOTOOLS 0x0cc8U // Technotools Corp.
#define UHS_VID_BROADMAX_TECHNOLOGIES 0x0cc9U // BroadMAX Technologies, Inc.
#define UHS_VID_AMPHENOL 0x0ccaU // Amphenol
#define UHS_VID_SKNET 0x0ccbU // SKNet Co., Ltd
#define UHS_VID_DOMEX_TECHNOLOGY 0x0cccU // Domex Technology Corp.
#define UHS_VID_TERRATEC_ELECTRONIC 0x0ccdU // TerraTec Electronic GmbH
#define UHS_VID_BANG_OLUFSEN 0x0cd4U // Bang Olufsen
#define UHS_VID_LABJACK_CORPORATION 0x0cd5U // LabJack Corporation
#define UHS_VID_NEWCHIP_SRL 0x0cd7U // NewChip S.r.l.
#define UHS_VID_JS_DIGITECH 0x0cd8U // JS Digitech, Inc.
#define UHS_VID_HITACHI_SHIN_DIN_CABLE 0x0cd9U // Hitachi Shin Din Cable, Ltd
#define UHS_VID_Z_COM 0x0cdeU // Z-Com
#define UHS_VID_VALIDATION_TECHNOLOGIES_INTERNATIONAL 0x0ce5U // Validation Technologies International
#define UHS_VID_PICO_TECHNOLOGY 0x0ce9U // Pico Technology
#define UHS_VID_E_CONN_ELECTRONIC 0x0cf1U // e-Conn Electronic Co., Ltd
#define UHS_VID_ENE_TECHNOLOGY 0x0cf2U // ENE Technology, Inc.
#define UHS_VID_ATHEROS_COMMUNICATIONS 0x0cf3U // Atheros Communications, Inc.
#define UHS_VID_FOMTEX 0x0cf4U // Fomtex Corp.
#define UHS_VID_CELLINK 0x0cf5U // Cellink Co., Ltd
#define UHS_VID_COMPUCABLE 0x0cf6U // Compucable Corp.
#define UHS_VID_ISHONI_NETWORKS 0x0cf7U // ishoni Networks
#define UHS_VID_CLARISYS 0x0cf8U // Clarisys, Inc.
#define UHS_VID_CENTRAL_SYSTEM_RESEARCH 0x0cf9U // Central System Research Co., Ltd
#define UHS_VID_INVISO 0x0cfaU // Inviso, Inc.
#define UHS_VID_MINOLTA_QMS 0x0cfcU // Minolta-QMS, Inc.
#define UHS_VID_SAFA_MEDIA 0x0cffU // SAFA MEDIA Co., Ltd.
#define UHS_VID_TELOS_EDV_SYSTEMENTWICKLUNG 0x0d06U // telos EDV Systementwicklung GmbH
#define UHS_VID_UTSTARCOM 0x0d08U // UTStarcom
#define UHS_VID_CONTEMPORARY_CONTROLS 0x0d0bU // Contemporary Controls
#define UHS_VID_ASTRON_ELECTRONICS 0x0d0cU // Astron Electronics Co., Ltd
#define UHS_VID_MKNET 0x0d0dU // MKNet Corp.
#define UHS_VID_HYBRID_NETWORKS 0x0d0eU // Hybrid Networks, Inc.
#define UHS_VID_FENG_SHIN_CABLE 0x0d0fU // Feng Shin Cable Co., Ltd
#define UHS_VID_ELASTIC_NETWORKS 0x0d10U // Elastic Networks
#define UHS_VID_MASPRO_DENKOH 0x0d11U // Maspro Denkoh Corp.
#define UHS_VID_HANSOL_ELECTRONICS 0x0d12U // Hansol Electronics, Inc.
#define UHS_VID_BMF 0x0d13U // BMF Corp.
#define UHS_VID_ARRAY_COMM 0x0d14U // Array Comm, Inc.
#define UHS_VID_ONSTREAM_BV 0x0d15U // OnStream b.v.
#define UHS_VID_HI_TOUCH_IMAGING_TECHNOLOGIES 0x0d16U // Hi-Touch Imaging Technologies Co., Ltd
#define UHS_VID_NALTEC 0x0d17U // NALTEC, Inc.
#define UHS_VID_COAXMEDIA 0x0d18U // coaXmedia
#define UHS_VID_HANK_CONNECTION_INDUSTRIAL 0x0d19U // Hank Connection Industrial Co., Ltd
#define UHS_VID_NXP 0x0d28U // NXP
#define UHS_VID_LEO_HUI_ELECTRIC_WIRE_AND_CABLE 0x0d32U // Leo Hui Electric Wire & Cable Co., Ltd
#define UHS_VID_AIRSPEAK 0x0d33U // AirSpeak, Inc.
#define UHS_VID_REARDEN_STEEL_TECHNOLOGIES 0x0d34U // Rearden Steel Technologies
#define UHS_VID_DAH_KUN 0x0d35U // Dah Kun Co., Ltd
#define UHS_VID_POSIFLEX_TECHNOLOGIES 0x0d3aU // Posiflex Technologies, Inc.
#define UHS_VID_SRI_CABLE_TECHNOLOGY 0x0d3cU // Sri Cable Technology, Ltd
#define UHS_VID_TANGTOP_TECHNOLOGY 0x0d3dU // Tangtop Technology Co., Ltd
#define UHS_VID_FITCOM 0x0d3eU // Fitcom, inc.
#define UHS_VID_MTS_SYSTEMS 0x0d3fU // MTS Systems Corp.
#define UHS_VID_ASCOR 0x0d40U // Ascor, Inc.
#define UHS_VID_TA_YUN_TERMINALS_INDUSTRIAL 0x0d41U // Ta Yun Terminals Industrial Co., Ltd
#define UHS_VID_FULL_DER 0x0d42U // Full Der Co., Ltd
#define UHS_VID_KOBIL_SYSTEMS 0x0d46U // Kobil Systems GmbH
#define UHS_VID_PROMETHEAN_LIMITED 0x0d48U // Promethean Limited
#define UHS_VID_MAXTOR 0x0d49U // Maxtor
#define UHS_VID_NF 0x0d4aU // NF Corp.
#define UHS_VID_GRAPE_SYSTEMS 0x0d4bU // Grape Systems, Inc.
#define UHS_VID_TEDAS_AG 0x0d4cU // Tedas AG
#define UHS_VID_COHERENT 0x0d4dU // Coherent, Inc.
#define UHS_VID_AGERE_SYSTEMS_NETHERLAND_BV 0x0d4eU // Agere Systems Netherland BV
#define UHS_VID_EADS_AIRBUS_FRANCE 0x0d4fU // EADS Airbus France
#define UHS_VID_CLEWARE 0x0d50U // Cleware GmbH
#define UHS_VID_VOLEX_ASIA_PTE 0x0d51U // Volex (Asia) Pte., Ltd
#define UHS_VID_HMI 0x0d53U // HMI Co., Ltd
#define UHS_VID_HOLON 0x0d54U // Holon Corp.
#define UHS_VID_ASKA_TECHNOLOGIES 0x0d55U // ASKA Technologies, Inc.
#define UHS_VID_AVLAB_TECHNOLOGY 0x0d56U // AVLAB Technology, Inc.
#define UHS_VID_SOLOMON_MICROTECH 0x0d57U // Solomon Microtech, Ltd
#define UHS_VID_SMC_NETWORKS 0x0d5cU // SMC Networks, Inc.
#define UHS_VID_MYACOM 0x0d5eU // Myacom, Ltd
#define UHS_VID_CSI 0x0d5fU // CSI, Inc.
#define UHS_VID_IVL_TECHNOLOGIES 0x0d60U // IVL Technologies, Ltd
#define UHS_VID_MEILU_ELECTRONICS_SHENZHEN 0x0d61U // Meilu Electronics (Shenzhen) Co., Ltd
#define UHS_VID_DARFON_ELECTRONICS 0x0d62U // Darfon Electronics Corp.
#define UHS_VID_FRITZ_GEGAUF_AG 0x0d63U // Fritz Gegauf AG
#define UHS_VID_DXG_TECHNOLOGY 0x0d64U // DXG Technology Corp.
#define UHS_VID_KMJP 0x0d65U // KMJP Co., Ltd
#define UHS_VID_TMT 0x0d66U // TMT
#define UHS_VID_ADVANET 0x0d67U // Advanet, Inc.
#define UHS_VID_SUPER_LINK_ELECTRONICS 0x0d68U // Super Link Electronics Co., Ltd
#define UHS_VID_NSI 0x0d69U // NSI
#define UHS_VID_MEGAPOWER_INTERNATIONAL 0x0d6aU // Megapower International Corp.
#define UHS_VID_AND_OR_LOGIC 0x0d6bU // And-Or Logic
#define UHS_VID_TRY_COMPUTER 0x0d70U // Try Computer Co., Ltd
#define UHS_VID_HIRAKAWA_HEWTECH 0x0d71U // Hirakawa Hewtech Corp.
#define UHS_VID_WINMATE_COMMUNICATION 0x0d72U // Winmate Communication, Inc.
#define UHS_VID_HITS_COMMUNICATIONS 0x0d73U // Hit's Communications, Inc.
#define UHS_VID_MFP_KOREA 0x0d76U // MFP Korea, Inc.
#define UHS_VID_POWER_SENTRYNEWPOINT 0x0d77U // Power Sentry/Newpoint
#define UHS_VID_JAPAN_DISTRIBUTOR 0x0d78U // Japan Distributor Corp.
#define UHS_VID_MARX_DATENTECHNIK 0x0d7aU // MARX Datentechnik GmbH
#define UHS_VID_WELLCO_TECHNOLOGY 0x0d7bU // Wellco Technology Co., Ltd
#define UHS_VID_TAIWAN_LINE_TEK_ELECTRONIC 0x0d7cU // Taiwan Line Tek Electronic Co., Ltd
#define UHS_VID_PHISON_ELECTRONICS 0x0d7dU // Phison Electronics Corp.
#define UHS_VID_AMERICAN_COMPUTER_AND_DIGITAL_COMPONENTS 0x0d7eU // American Computer & Digital Components
#define UHS_VID_ESSENTIAL_REALITY 0x0d7fU // Essential Reality LLC
#define UHS_VID_HR_SILVINE_ELECTRONICS 0x0d80U // H.R. Silvine Electronics, Inc.
#define UHS_VID_TECHNOVISION 0x0d81U // TechnoVision
#define UHS_VID_THINK_OUTSIDE 0x0d83U // Think Outside, Inc.
#define UHS_VID_DOLBY_LABORATORIES 0x0d87U // Dolby Laboratories Inc.
#define UHS_VID_OZ_SOFTWARE 0x0d89U // Oz Software
#define UHS_VID_KING_JIM 0x0d8aU // King Jim Co., Ltd
#define UHS_VID_ASCOM_TELECOMMUNICATIONS 0x0d8bU // Ascom Telecommunications, Ltd
#define UHS_VID_C_MEDIA_ELECTRONICS 0x0d8cU // C-Media Electronics, Inc.
#define UHS_VID_PROMOTION_AND_DISPLAY_TECHNOLOGY 0x0d8dU // Promotion & Display Technology, Ltd
#define UHS_VID_GLOBAL_SUN_TECHNOLOGY 0x0d8eU // Global Sun Technology, Inc.
#define UHS_VID_PITNEY_BOWES 0x0d8fU // Pitney Bowes
#define UHS_VID_SURE_FIRE_ELECTRICAL 0x0d90U // Sure-Fire Electrical Corp.
#define UHS_VID_SKANHEX_TECHNOLOGY 0x0d96U // Skanhex Technology, Inc.
#define UHS_VID_SANTA_BARBARA_INSTRUMENT_GROUP 0x0d97U // Santa Barbara Instrument Group
#define UHS_VID_MARS_SEMICONDUCTOR 0x0d98U // Mars Semiconductor Corp.
#define UHS_VID_TRAZER_TECHNOLOGIES 0x0d99U // Trazer Technologies, Inc.
#define UHS_VID_RTX_TELECOM_AS 0x0d9aU // RTX Telecom AS
#define UHS_VID_TAT_SHING_ELECTRICAL 0x0d9bU // Tat Shing Electrical Co.
#define UHS_VID_CHEE_CHEN_HI_TECHNOLOGY 0x0d9cU // Chee Chen Hi-Technology Co., Ltd
#define UHS_VID_SANWA_SUPPLY 0x0d9dU // Sanwa Supply, Inc.
#define UHS_VID_AVAYA 0x0d9eU // Avaya
#define UHS_VID_POWERCOM 0x0d9fU // Powercom Co., Ltd
#define UHS_VID_DANGER_RESEARCH 0x0da0U // Danger Research
#define UHS_VID_SUZHOU_PETERS_PRECISE_INDUSTRIAL 0x0da1U // Suzhou Peter's Precise Industrial Co., Ltd
#define UHS_VID_LAND_INSTRUMENTS_INTERNATIONAL 0x0da2U // Land Instruments International, Ltd
#define UHS_VID_NIPPON_ELECTRO_SENSORY_DEVICES 0x0da3U // Nippon Electro-Sensory Devices Corp.
#define UHS_VID_POLAR_ELECTRO_OY 0x0da4U // Polar Electro Oy
#define UHS_VID_IOGEAR 0x0da7U // IOGear, Inc.
#define UHS_VID_SOFTDSP 0x0da8U // softDSP Co., Ltd
#define UHS_VID_CUBIG_GROUP 0x0dabU // Cubig Group
#define UHS_VID_WESTOVER_SCIENTIFIC 0x0dadU // Westover Scientific
#define UHS_VID_MICRO_STAR_INTERNATIONAL 0x0db0U // Micro Star International
#define UHS_VID_WEN_TE_ELECTRONICS 0x0db1U // Wen Te Electronics Co., Ltd
#define UHS_VID_SHIAN_HWI_PLUG_PARTS_PLASTIC_FACTORY 0x0db2U // Shian Hwi Plug Parts, Plastic Factory
#define UHS_VID_TEKRAM_TECHNOLOGY_1 0x0db3U // Tekram Technology Co., Ltd
#define UHS_VID_CHUNG_FU_CHEN_YEH_ENTERPRISE 0x0db4U // Chung Fu Chen Yeh Enterprise Corp.
#define UHS_VID_ACCESS_IS 0x0db5U // Access IS
#define UHS_VID_ELCON_SYSTEMTECHNIK 0x0db7U // ELCON Systemtechnik
#define UHS_VID_DIGIDESIGN 0x0dbaU // Digidesign
#define UHS_VID_AANDD_MEDICAL 0x0dbcU // A&D Medical
#define UHS_VID_JIUH_SHIUH_PRECISION_INDUSTRY 0x0dbeU // Jiuh Shiuh Precision Industry Co., Ltd
#define UHS_VID_JESS_LINK_INTERNATIONAL 0x0dbfU // Jess-Link International
#define UHS_VID_G7_SOLUTIONS_FORMERLY_GREAT_NOTIONS 0x0dc0U // G7 Solutions (formerly Great Notions)
#define UHS_VID_TAMAGAWA_SEIKI 0x0dc1U // Tamagawa Seiki Co., Ltd
#define UHS_VID_ATHENA_SMARTCARD_SOLUTIONS 0x0dc3U // Athena Smartcard Solutions, Inc.
#define UHS_VID_MACPOWER_PERIPHERALS 0x0dc4U // Macpower Peripherals, Ltd
#define UHS_VID_SDK 0x0dc5U // SDK Co., Ltd
#define UHS_VID_PRECISION_SQUARED_TECHNOLOGY 0x0dc6U // Precision Squared Technology Corp.
#define UHS_VID_FIRST_CABLE_LINE 0x0dc7U // First Cable Line, Inc.
#define UHS_VID_NETWORKFAB 0x0dcdU // NetworkFab Corp.
#define UHS_VID_ACCESS_SOLUTIONS 0x0dd0U // Access Solutions
#define UHS_VID_CONTEK_ELECTRONICS 0x0dd1U // Contek Electronics Co., Ltd
#define UHS_VID_POWER_QUOTIENT_INTERNATIONAL 0x0dd2U // Power Quotient International Co., Ltd
#define UHS_VID_MEDIAQ 0x0dd3U // MediaQ
#define UHS_VID_CUSTOM_ENGINEERING_SPA 0x0dd4U // Custom Engineering SPA
#define UHS_VID_CALIFORNIA_MICRO_DEVICES 0x0dd5U // California Micro Devices
#define UHS_VID_KOCOM 0x0dd7U // Kocom Co., Ltd
#define UHS_VID_NETAC_TECHNOLOGY 0x0dd8U // Netac Technology Co., Ltd
#define UHS_VID_HIGHSPEED_SURFING 0x0dd9U // HighSpeed Surfing
#define UHS_VID_INTEGRATED_CIRCUIT_SOLUTION 0x0ddaU // Integrated Circuit Solution, Inc.
#define UHS_VID_TAMARACK 0x0ddbU // Tamarack, Inc.
#define UHS_VID_DATELINK_TECHNOLOGY 0x0dddU // Datelink Technology Co., Ltd
#define UHS_VID_UBICOM 0x0ddeU // Ubicom, Inc.
#define UHS_VID_BD_CONSUMER_HEALTHCARE 0x0de0U // BD Consumer Healthcare
#define UHS_VID_USBMICRO 0x0de7U // USBmicro
#define UHS_VID_UTECH_ELECTRONIC_DG 0x0deaU // UTECH Electronic (D.G.) Co., Ltd.
#define UHS_VID_NOVASONICS 0x0dedU // Novasonics
#define UHS_VID_LIFETIME_MEMORY_PRODUCTS 0x0deeU // Lifetime Memory Products
#define UHS_VID_FULL_RISE_ELECTRONIC 0x0defU // Full Rise Electronic Co., Ltd
#define UHS_VID_NETANDSYS 0x0df4U // NET&SYS
#define UHS_VID_SITECOM_EUROPE_BV 0x0df6U // Sitecom Europe B.V.
#define UHS_VID_MOBILE_ACTION_TECHNOLOGY 0x0df7U // Mobile Action Technology, Inc.
#define UHS_VID_TOYO_COMMUNICATION_EQUIPMENT 0x0dfaU // Toyo Communication Equipment Co., Ltd
#define UHS_VID_GENERALTOUCH_TECHNOLOGY 0x0dfcU // GeneralTouch Technology Co., Ltd
#define UHS_VID_NIPPON_SYSTEMWARE 0x0e03U // Nippon Systemware Co., Ltd
#define UHS_VID_WINBEST_TECHNOLOGY 0x0e08U // Winbest Technology Co., Ltd
#define UHS_VID_AMIGO_TECHNOLOGY 0x0e0bU // Amigo Technology Inc.
#define UHS_VID_GESYTEC 0x0e0cU // Gesytec
#define UHS_VID_PICOQUANT 0x0e0dU // PicoQuant GmbH
#define UHS_VID_VMWARE 0x0e0fU // VMware, Inc.
#define UHS_VID_JMTEK_1 0x0e16U // JMTek, LLC
#define UHS_VID_WALEX_ELECTRONIC 0x0e17U // Walex Electronic, Ltd
#define UHS_VID_UNISYS_1 0x0e1aU // Unisys
#define UHS_VID_CREWAVE 0x0e1bU // Crewave
#define UHS_VID_PEGASUS_TECHNOLOGIES 0x0e20U // Pegasus Technologies Ltd.
#define UHS_VID_COWON_SYSTEMS 0x0e21U // Cowon Systems, Inc.
#define UHS_VID_SYMBIAN 0x0e22U // Symbian Ltd.
#define UHS_VID_LIOU_YUANE_ENTERPRISE 0x0e23U // Liou Yuane Enterprise Co., Ltd
#define UHS_VID_VINCHIP_SYSTEMS 0x0e25U // VinChip Systems, Inc.
#define UHS_VID_J_PHONE_EAST 0x0e26U // J-Phone East Co., Ltd
#define UHS_VID_HEARTMATH 0x0e30U // HeartMath LLC
#define UHS_VID_MICRO_COMPUTER_CONTROL 0x0e34U // Micro Computer Control Corp.
#define UHS_VID_3PEA_TECHNOLOGIES 0x0e35U // 3Pea Technologies, Inc.
#define UHS_VID_TIEPIE_ENGINEERING 0x0e36U // TiePie engineering
#define UHS_VID_STRATITEC 0x0e38U // Stratitec, Inc.
#define UHS_VID_SMART_MODULAR_TECHNOLOGIES 0x0e39U // Smart Modular Technologies, Inc.
#define UHS_VID_NEOSTAR_TECHNOLOGY 0x0e3aU // Neostar Technology Co., Ltd
#define UHS_VID_MANSELLA 0x0e3bU // Mansella, Ltd
#define UHS_VID_LINE6 0x0e41U // Line6, Inc.
#define UHS_VID_SUN_RISEFUL_TECHNOLOGY 0x0e44U // Sun-Riseful Technology Co., Ltd.
#define UHS_VID_JULIA 0x0e48U // Julia Corp., Ltd
#define UHS_VID_SHENZHEN_BAO_HING_ELECTRIC_WIRE_AND_CABLE_MFR 0x0e4aU // Shenzhen Bao Hing Electric Wire & Cable Mfr. Co.
#define UHS_VID_RADICA_GAMES 0x0e4cU // Radica Games, Ltd
#define UHS_VID_TECHNODATA_INTERWARE 0x0e50U // TechnoData Interware
#define UHS_VID_SPEED_DRAGON_MULTIMEDIA 0x0e55U // Speed Dragon Multimedia, Ltd
#define UHS_VID_KINGSTON_TECHNOLOGY_COMPANY 0x0e56U // Kingston Technology Company, Inc.
#define UHS_VID_ACTIVE 0x0e5aU // Active Co., Ltd
#define UHS_VID_UNION_POWER_INFORMATION_INDUSTRIAL 0x0e5bU // Union Power Information Industrial Co., Ltd
#define UHS_VID_BITLAND_INFORMATION_TECHNOLOGY 0x0e5cU // Bitland Information Technology Co., Ltd
#define UHS_VID_NELTRON_INDUSTRIAL 0x0e5dU // Neltron Industrial Co., Ltd
#define UHS_VID_CONWISE_TECHNOLOGY 0x0e5eU // Conwise Technology Co., Ltd.
#define UHS_VID_HAWKING_TECHNOLOGIES 0x0e66U // Hawking Technologies
#define UHS_VID_FOSSIL 0x0e67U // Fossil, Inc.
#define UHS_VID_MEGAWIN_TECHNOLOGY 0x0e6aU // Megawin Technology Co., Ltd
#define UHS_VID_LOGIC3 0x0e6fU // Logic3
#define UHS_VID_TOKYO_ELECTRONIC_INDUSTRY 0x0e70U // Tokyo Electronic Industry Co., Ltd
#define UHS_VID_HSI_CHIN_ELECTRONICS 0x0e72U // Hsi-Chin Electronics Co., Ltd
#define UHS_VID_TVS_ELECTRONICS 0x0e75U // TVS Electronics, Ltd
#define UHS_VID_ARCHOS 0x0e79U // Archos, Inc.
#define UHS_VID_ON_TECH_INDUSTRY 0x0e7bU // On-Tech Industry Co., Ltd
#define UHS_VID_GMATE 0x0e7eU // Gmate, Inc.
#define UHS_VID_CHING_TAI_ELECTRIC_WIRE_AND_CABLE 0x0e82U // Ching Tai Electric Wire & Cable Co., Ltd
#define UHS_VID_SHIN_AN_WIRE_AND_CABLE 0x0e83U // Shin An Wire & Cable Co.
#define UHS_VID_WELL_FORCE_ELECTRONIC 0x0e8cU // Well Force Electronic Co., Ltd
#define UHS_VID_MEDIATEK_1 0x0e8dU // MediaTek Inc.
#define UHS_VID_GREENASIA 0x0e8fU // GreenAsia Inc.
#define UHS_VID_WIEBETECH 0x0e90U // WiebeTech, LLC
#define UHS_VID_VTECH_ENGINEERING_CANADA 0x0e91U // VTech Engineering Canada, Ltd
#define UHS_VID_CS_GLORY_ENTERPRISE 0x0e92U // C's Glory Enterprise Co., Ltd
#define UHS_VID_EM_TECHNICS 0x0e93U // eM Technics Co., Ltd
#define UHS_VID_FUTURE_TECHNOLOGY 0x0e95U // Future Technology Co., Ltd
#define UHS_VID_APLUX_COMMUNICATIONS 0x0e96U // Aplux Communications, Ltd
#define UHS_VID_FINGERWORKS 0x0e97U // Fingerworks, Inc.
#define UHS_VID_ADVANCED_ANALOGIC_TECHNOLOGIES 0x0e98U // Advanced Analogic Technologies, Inc.
#define UHS_VID_PARALLEL_DICE 0x0e99U // Parallel Dice Co., Ltd
#define UHS_VID_TA_HSING_INDUSTRIES 0x0e9aU // TA HSING Industries, Ltd
#define UHS_VID_ADTEC 0x0e9bU // ADTEC Corp.
#define UHS_VID_STREAMZAP 0x0e9cU // Streamzap, Inc.
#define UHS_VID_TAMURA 0x0e9fU // Tamura Corp.
#define UHS_VID_OURS_TECHNOLOGY 0x0ea0U // Ours Technology, Inc.
#define UHS_VID_NIHON_COMPUTER 0x0ea6U // Nihon Computer Co., Ltd
#define UHS_VID_MSL_ENTERPRISES 0x0ea7U // MSL Enterprises Corp.
#define UHS_VID_CENDYNE 0x0ea8U // CenDyne, Inc.
#define UHS_VID_HUMAX_1 0x0eadU // Humax Co., Ltd
#define UHS_VID_NOVATECH 0x0eb0U // NovaTech
#define UHS_VID_WIS_TECHNOLOGIES 0x0eb1U // WIS Technologies, Inc.
#define UHS_VID_Y_S_ELECTRONIC 0x0eb2U // Y-S Electronic Co., Ltd
#define UHS_VID_SAINT_TECHNOLOGY 0x0eb3U // Saint Technology Corp.
#define UHS_VID_ENDOR_AG 0x0eb7U // Endor AG
#define UHS_VID_METTLER_TOLEDO 0x0eb8U // Mettler Toledo
#define UHS_VID_THERMO_FISHER_SCIENTIFIC 0x0ebbU // Thermo Fisher Scientific
#define UHS_VID_VWEB 0x0ebeU // VWeb Corp.
#define UHS_VID_OMEGA_TECHNOLOGY_OF_TAIWAN 0x0ebfU // Omega Technology of Taiwan, Inc.
#define UHS_VID_LHI_TECHNOLOGY_CHINA 0x0ec0U // LHI Technology (China) Co., Ltd
#define UHS_VID_ABIT_COMPUTER 0x0ec1U // Abit Computer Corp.
#define UHS_VID_SWEETRAY_INDUSTRIAL 0x0ec2U // Sweetray Industrial, Ltd
#define UHS_VID_AXELL 0x0ec3U // Axell Co., Ltd
#define UHS_VID_BALLRACING_DEVELOPMENTS 0x0ec4U // Ballracing Developments, Ltd
#define UHS_VID_GT_INFORMATION_SYSTEM 0x0ec5U // GT Information System Co., Ltd
#define UHS_VID_INNOVISION_MULTIMEDIA 0x0ec6U // InnoVISION Multimedia, Ltd
#define UHS_VID_THETA_LINK 0x0ec7U // Theta Link Corp.
#define UHS_VID_LITE_ON_IT 0x0ecdU // Lite-On IT Corp.
#define UHS_VID_TAISOL_ELECTRONICS 0x0eceU // TaiSol Electronics Co., Ltd
#define UHS_VID_PHOGENIX_IMAGING 0x0ecfU // Phogenix Imaging, LLC
#define UHS_VID_WINMAXGROUP 0x0ed1U // WinMaxGroup
#define UHS_VID_KYOTO_MICRO_COMPUTER 0x0ed2U // Kyoto Micro Computer Co., Ltd
#define UHS_VID_WING_TECH_ENTERPRISE 0x0ed3U // Wing-Tech Enterprise Co., Ltd
#define UHS_VID_FIBERBYTE 0x0ed5U // Fiberbyte
#define UHS_VID_NORIAKE_ITRON 0x0edaU // Noriake Itron Corp.
#define UHS_VID_E_MDT 0x0edfU // e-MDT Co., Ltd
#define UHS_VID_SHIMA_SEIKI_MFG 0x0ee0U // Shima Seiki Mfg., Ltd
#define UHS_VID_SAROTECH 0x0ee1U // Sarotech Co., Ltd
#define UHS_VID_AMI_SEMICONDUCTOR 0x0ee2U // AMI Semiconductor, Inc.
#define UHS_VID_COMTRUE_TECHNOLOGY 0x0ee3U // ComTrue Technology Corp.
#define UHS_VID_SUNRICH_TECHNOLOGY 0x0ee4U // Sunrich Technology, Ltd
#define UHS_VID_DIGITAL_STREAM_TECHNOLOGY 0x0eeeU // Digital Stream Technology, Inc.
#define UHS_VID_D_WAV_SCIENTIFIC 0x0eefU // D-WAV Scientific Co., Ltd
#define UHS_VID_HITACHI_CABLE 0x0ef0U // Hitachi Cable, Ltd
#define UHS_VID_AICHI_MICRO_INTELLIGENT 0x0ef1U // Aichi Micro Intelligent Corp.
#define UHS_VID_IO_MAGIC 0x0ef2U // I/O Magic Corp.
#define UHS_VID_LYNN_PRODUCTS 0x0ef3U // Lynn Products, Inc.
#define UHS_VID_DSI_DATOTECH 0x0ef4U // DSI Datotech
#define UHS_VID_POINTCHIPS 0x0ef5U // PointChips
#define UHS_VID_YIELD_MICROELECTRONICS 0x0ef6U // Yield Microelectronics Corp.
#define UHS_VID_SM_TECH_CO_LTD_TULIP 0x0ef7U // SM Tech Co., Ltd (Tulip)
#define UHS_VID_OASIS_SEMICONDUCTOR 0x0efdU // Oasis Semiconductor
#define UHS_VID_WEM_TECHNOLOGY 0x0efeU // Wem Technology, Inc.
#define UHS_VID_UNITEK_UPS_SYSTEMS 0x0f03U // Unitek UPS Systems
#define UHS_VID_VISUAL_FRONTIER_ENTERPRISE 0x0f06U // Visual Frontier Enterprise Co., Ltd
#define UHS_VID_CSL_WIRE_AND_PLUG_SHEN_ZHEN 0x0f08U // CSL Wire & Plug (Shen Zhen) Co.
#define UHS_VID_CAS 0x0f0cU // CAS Corp.
#define UHS_VID_HORI 0x0f0dU // Hori Co., Ltd
#define UHS_VID_ENERGY_FULL 0x0f0eU // Energy Full Corp.
#define UHS_VID_LD_DIDACTIC 0x0f11U // LD Didactic GmbH
#define UHS_VID_MARS_ENGINEERING 0x0f12U // Mars Engineering Corp.
#define UHS_VID_ACETEK_TECHNOLOGY 0x0f13U // Acetek Technology Co., Ltd
#define UHS_VID_INGENICO_1 0x0f14U // Ingenico
#define UHS_VID_FINGER_LAKES_INSTRUMENTATION 0x0f18U // Finger Lakes Instrumentation
#define UHS_VID_ORACOM 0x0f19U // Oracom Co., Ltd
#define UHS_VID_ONSET_COMPUTER 0x0f1bU // Onset Computer Corp.
#define UHS_VID_FUNAI_ELECTRIC 0x0f1cU // Funai Electric Co., Ltd
#define UHS_VID_IWILL 0x0f1dU // Iwill Corp.
#define UHS_VID_IOI_TECHNOLOGY 0x0f21U // IOI Technology Corp.
#define UHS_VID_SENIOR_INDUSTRIES 0x0f22U // Senior Industries, Inc.
#define UHS_VID_LEADER_TECH_MANUFACTURER 0x0f23U // Leader Tech Manufacturer Co., Ltd
#define UHS_VID_FLEX_P_INDUSTRIES_SND_BHD 0x0f24U // Flex-P Industries, Snd., Bhd.
#define UHS_VID_VIPOWER 0x0f2dU // ViPower, Inc.
#define UHS_VID_GENIALITY_MAPLE_TECHNOLOGY 0x0f2eU // Geniality Maple Technology Co., Ltd
#define UHS_VID_PRIVA_DESIGN_SERVICES 0x0f2fU // Priva Design Services
#define UHS_VID_JESS_TECHNOLOGY 0x0f30U // Jess Technology Co., Ltd
#define UHS_VID_CHRYSALIS_DEVELOPMENT 0x0f31U // Chrysalis Development
#define UHS_VID_YFC_BONEAGLE_ELECTRIC 0x0f32U // YFC-BonEagle Electric Co., Ltd
#define UHS_VID_KOKUYO 0x0f37U // Kokuyo Co., Ltd
#define UHS_VID_NIEN_YI_INDUSTRIAL 0x0f38U // Nien-Yi Industrial Corp.
#define UHS_VID_TG3_ELECTRONICS_1 0x0f39U // TG3 Electronics
#define UHS_VID_AIRPRIME_INCORPORATED 0x0f3dU // Airprime, Incorporated
#define UHS_VID_RDC_SEMICONDUCTOR 0x0f41U // RDC Semiconductor Co., Ltd
#define UHS_VID_NITAL_CONSULTING_SERVICES 0x0f42U // Nital Consulting Services, Inc.
#define UHS_VID_POLHEMUS 0x0f44U // Polhemus
#define UHS_VID_ST_JOHN_TECHNOLOGY 0x0f4bU // St. John Technology Co., Ltd
#define UHS_VID_WORLDWIDE_CABLE_OPTO 0x0f4cU // WorldWide Cable Opto Corp.
#define UHS_VID_MICROTUNE 0x0f4dU // Microtune, Inc.
#define UHS_VID_FREEDOM_SCIENTIFIC 0x0f4eU // Freedom Scientific
#define UHS_VID_WING_KEY_ELECTRICAL 0x0f52U // Wing Key Electrical Co., Ltd
#define UHS_VID_DONGGUAN_WHITE_HORSE_CABLE_FACTORY 0x0f53U // Dongguan White Horse Cable Factory, Ltd
#define UHS_VID_KAWAI_MUSICAL_INSTRUMENTS_MFG 0x0f54U // Kawai Musical Instruments Mfg. Co., Ltd
#define UHS_VID_AMBICOM 0x0f55U // AmbiCom, Inc.
#define UHS_VID_PRAIRIECOMM 0x0f5cU // Prairiecomm, Inc.
#define UHS_VID_NEWAGE_INTERNATIONAL 0x0f5dU // NewAge International, LLC
#define UHS_VID_KEY_TECHNOLOGY 0x0f5fU // Key Technology Corp.
#define UHS_VID_NTK 0x0f60U // NTK, Ltd
#define UHS_VID_VARIAN 0x0f61U // Varian, Inc.
#define UHS_VID_ACROX_TECHNOLOGIES 0x0f62U // Acrox Technologies Co., Ltd
#define UHS_VID_LEAPFROG_ENTERPRISES 0x0f63U // LeapFrog Enterprises
#define UHS_VID_KOBE_STEEL 0x0f68U // Kobe Steel, Ltd
#define UHS_VID_DIONEX 0x0f69U // Dionex Corp.
#define UHS_VID_VIBREN_TECHNOLOGIES 0x0f6aU // Vibren Technologies, Inc.
#define UHS_VID_INTELLIGENT_SYSTEMS 0x0f6eU // INTELLIGENT SYSTEMS
#define UHS_VID_DFI_1 0x0f73U // DFI
#define UHS_VID_GUNTERMANN_AND_DRUNCK 0x0f78U // Guntermann & Drunck GmbH
#define UHS_VID_DQ_TECHNOLOGY 0x0f7cU // DQ Technology, Inc.
#define UHS_VID_NETBOTZ 0x0f7dU // NetBotz, Inc.
#define UHS_VID_FLUKE 0x0f7eU // Fluke Corp.
#define UHS_VID_VTECH_HOLDINGS 0x0f88U // VTech Holdings, Ltd
#define UHS_VID_YAZAKI 0x0f8bU // Yazaki Corp.
#define UHS_VID_YOUNG_GENERATION_INTERNATIONAL 0x0f8cU // Young Generation International Corp.
#define UHS_VID_UNIWILL_COMPUTER 0x0f8dU // Uniwill Computer Corp.
#define UHS_VID_KINGNET_TECHNOLOGY 0x0f8eU // Kingnet Technology Co., Ltd
#define UHS_VID_SOMA_NETWORKS 0x0f8fU // Soma Networks
#define UHS_VID_CVILUX 0x0f97U // CviLux Corp.
#define UHS_VID_CYBERBANK 0x0f98U // CyberBank Corp.
#define UHS_VID_HYUN_WON 0x0f9cU // Hyun Won, Inc.
#define UHS_VID_LUCENT_TECHNOLOGIES_1 0x0f9eU // Lucent Technologies
#define UHS_VID_STARCONN_ELECTRONIC 0x0fa3U // Starconn Electronic Co., Ltd
#define UHS_VID_ATL_TECHNOLOGY 0x0fa4U // ATL Technology
#define UHS_VID_SOTEC 0x0fa5U // Sotec Co., Ltd
#define UHS_VID_EPOX_COMPUTER 0x0fa7U // Epox Computer Co., Ltd
#define UHS_VID_LOGIC_CONTROLS 0x0fa8U // Logic Controls, Inc.
#define UHS_VID_WINPOINT_ELECTRONIC 0x0fafU // Winpoint Electronic Corp.
#define UHS_VID_HAURTIAN_WIRE_AND_CABLE 0x0fb0U // Haurtian Wire & Cable Co., Ltd
#define UHS_VID_INCLOSE_DESIGN 0x0fb1U // Inclose Design, Inc.
#define UHS_VID_JUAN_CHERN_INDUSTRIAL 0x0fb2U // Juan-Chern Industrial Co., Ltd
#define UHS_VID_HEBER 0x0fb6U // Heber Ltd
#define UHS_VID_WISTRON 0x0fb8U // Wistron Corp.
#define UHS_VID_AACOM 0x0fb9U // AACom Corp.
#define UHS_VID_SAN_SHING_ELECTRONICS 0x0fbaU // San Shing Electronics Co., Ltd
#define UHS_VID_BITWISE_SYSTEMS 0x0fbbU // Bitwise Systems, Inc.
#define UHS_VID_MITAC_INTERNATINAL 0x0fc1U // Mitac Internatinal Corp.
#define UHS_VID_PLUG_AND_JACK_INDUSTRIAL 0x0fc2U // Plug and Jack Industrial, Inc.
#define UHS_VID_DELCOM_ENGINEERING 0x0fc5U // Delcom Engineering
#define UHS_VID_DATAPLUS_SUPPLIES 0x0fc6U // Dataplus Supplies, Inc.
#define UHS_VID_RESEARCH_IN_MOTION 0x0fcaU // Research In Motion, Ltd.
#define UHS_VID_SONY_ERICSSON_MOBILE_COMMUNICATIONS 0x0fceU // Sony Ericsson Mobile Communications AB
#define UHS_VID_DYNASTREAM_INNOVATIONS 0x0fcfU // Dynastream Innovations, Inc.
#define UHS_VID_TULIP_COMPUTERS_BV 0x0fd0U // Tulip Computers B.V.
#define UHS_VID_GIANT_ELECTRONICS 0x0fd1U // Giant Electronics Ltd.
#define UHS_VID_SEAC_BANCHE 0x0fd2U // Seac Banche
#define UHS_VID_TENOVIS_GMBH_AND_CO_KG 0x0fd4U // Tenovis GmbH & Co., KG
#define UHS_VID_DIRECT_ACCESS_TECHNOLOGY 0x0fd5U // Direct Access Technology, Inc.
#define UHS_VID_ELGATO_SYSTEMS 0x0fd9U // Elgato Systems GmbH
#define UHS_VID_QUANTEC_NETWORKS 0x0fdaU // Quantec Networks GmbH
#define UHS_VID_MICRO_PLUS 0x0fdcU // Micro Plus
#define UHS_VID_OREGON_SCIENTIFIC 0x0fdeU // Oregon Scientific
#define UHS_VID_OSTERHOUT_DESIGN_GROUP 0x0fe0U // Osterhout Design Group
#define UHS_VID_IN_TECH_ELECTRONICS 0x0fe4U // IN-Tech Electronics, Ltd
#define UHS_VID_GREENCONN_USA 0x0fe5U // Greenconn (U.S.A.), Inc.
#define UHS_VID_KONTRON_INDUSTRIAL_COMPUTER_SOURCE_ICS_ADVENT 0x0fe6U // Kontron (Industrial Computer Source / ICS Advent)
#define UHS_VID_DVICO 0x0fe9U // DVICO
#define UHS_VID_UNITED_COMPUTER_ACCESSORIES 0x0feaU // United Computer Accessories
#define UHS_VID_CRS_ELECTRONIC 0x0febU // CRS Electronic Co., Ltd
#define UHS_VID_UMC_ELECTRONICS 0x0fecU // UMC Electronics Co., Ltd
#define UHS_VID_ACCESS 0x0fedU // Access Co., Ltd
#define UHS_VID_XSIDO 0x0feeU // Xsido Corp.
#define UHS_VID_MJ_RESEARCH 0x0fefU // MJ Research, Inc.
#define UHS_VID_CORE_VALLEY 0x0ff6U // Core Valley Co., Ltd
#define UHS_VID_CHI_SHING_COMPUTER_ACCESSORIES 0x0ff7U // CHI SHING Computer Accessories Co., Ltd
#define UHS_VID_CLAVIA_DMI 0x0ffcU // Clavia DMI AB
#define UHS_VID_EARLYSENSE 0x0ffdU // EarlySense
#define UHS_VID_AOPEN 0x0fffU // Aopen, Inc.
#define UHS_VID_SPEED_TECH 0x1000U // Speed Tech Corp.
#define UHS_VID_RITRONICS_COMPONENTS_S_PTE 0x1001U // Ritronics Components (S) Pte., Ltd
#define UHS_VID_SIGMA 0x1003U // Sigma Corp.
#define UHS_VID_LG_ELECTRONICS 0x1004U // LG Electronics, Inc.
#define UHS_VID_APACER_TECHNOLOGY 0x1005U // Apacer Technology, Inc.
#define UHS_VID_IRIVER 0x1006U // iRiver, Ltd.
#define UHS_VID_EMUZED 0x1009U // Emuzed, Inc.
#define UHS_VID_AV_CHASEWAY 0x100aU // AV Chaseway, Ltd
#define UHS_VID_CHOU_CHIN_INDUSTRIAL 0x100bU // Chou Chin Industrial Co., Ltd
#define UHS_VID_NETOPIA 0x100dU // Netopia, Inc.
#define UHS_VID_FUKUDA_DENSHI 0x1010U // Fukuda Denshi Co., Ltd
#define UHS_VID_MOBILE_MEDIA_TECH 0x1011U // Mobile Media Tech.
#define UHS_VID_SDKM_FIBRES_WIRES_AND_CABLES_BERHAD 0x1012U // SDKM Fibres, Wires & Cables Berhad
#define UHS_VID_TST_TOUCHLESS_SENSOR_TECHNOLOGY_AG 0x1013U // TST-Touchless Sensor Technology AG
#define UHS_VID_DENSITRON_TECHNOLOGIES_PLC 0x1014U // Densitron Technologies PLC
#define UHS_VID_SOFTRONICS_PTY 0x1015U // Softronics Pty., Ltd
#define UHS_VID_XIAMEN_HUNGS_ENTERPRISE 0x1016U // Xiamen Hung's Enterprise Co., Ltd
#define UHS_VID_SPEEDY_INDUSTRIAL_SUPPLIES_PTE 0x1017U // Speedy Industrial Supplies, Pte., Ltd
#define UHS_VID_ELITEGROUP_COMPUTER_SYSTEMS_ECS 0x1019U // Elitegroup Computer Systems (ECS)
#define UHS_VID_LABTEC_1 0x1020U // Labtec
#define UHS_VID_SHINKO_SHOJI 0x1022U // Shinko Shoji Co., Ltd
#define UHS_VID_HYPER_PALTEK 0x1025U // Hyper-Paltek
#define UHS_VID_NEWLY 0x1026U // Newly Corp.
#define UHS_VID_TIME_DOMAIN 0x1027U // Time Domain
#define UHS_VID_INOVYS 0x1028U // Inovys Corp.
#define UHS_VID_ATLANTIC_COAST_TELESYS 0x1029U // Atlantic Coast Telesys
#define UHS_VID_RAMOS_TECHNOLOGY 0x102aU // Ramos Technology Co., Ltd
#define UHS_VID_INFOTRONIC_AMERICA 0x102bU // Infotronic America, Inc.
#define UHS_VID_ETOMS_ELECTRONICS 0x102cU // Etoms Electronics Corp.
#define UHS_VID_WINIC 0x102dU // Winic Corp.
#define UHS_VID_COMAX_TECHNOLOGY 0x1031U // Comax Technology, Inc.
#define UHS_VID_C_ONE_TECHNOLOGY 0x1032U // C-One Technology Corp.
#define UHS_VID_NUCAM 0x1033U // Nucam Corp.
#define UHS_VID_STEELSERIES_APS 0x1038U // SteelSeries ApS
#define UHS_VID_DEVOLO_AG 0x1039U // devolo AG
#define UHS_VID_PSA 0x103aU // PSA
#define UHS_VID_STANTON 0x103dU // Stanton
#define UHS_VID_ICREATE_TECHNOLOGIES 0x1043U // iCreate Technologies Corp.
#define UHS_VID_CHU_YUEN_ENTERPRISE 0x1044U // Chu Yuen Enterprise Co., Ltd
#define UHS_VID_WINBOND_ELECTRONICS_CORP_HEX_ 0x1046U // Winbond Electronics Corp. [hex]
#define UHS_VID_TARGUS_GROUP_INTERNATIONAL 0x1048U // Targus Group International
#define UHS_VID_MYLEX_BUSLOGIC 0x104bU // Mylex / Buslogic
#define UHS_VID_AMCO_TEC_INTERNATIONAL 0x104cU // AMCO TEC International, Inc.
#define UHS_VID_NEWPORT_CORPORATION 0x104dU // Newport Corporation
#define UHS_VID_WB_ELECTRONICS 0x104fU // WB Electronics
#define UHS_VID_YUBICOCOM 0x1050U // Yubico.com
#define UHS_VID_IMMANUEL_ELECTRONICS 0x1053U // Immanuel Electronics Co., Ltd
#define UHS_VID_BMS_INTERNATIONAL_BEHEER_NV 0x1054U // BMS International Beheer N.V.
#define UHS_VID_COMPLEX_MICRO_INTERCONNECTION 0x1055U // Complex Micro Interconnection Co., Ltd
#define UHS_VID_HSIN_CHEN_ENT 0x1056U // Hsin Chen Ent Co., Ltd
#define UHS_VID_ON_SEMICONDUCTOR 0x1057U // ON Semiconductor
#define UHS_VID_WESTERN_DIGITAL_TECHNOLOGIES 0x1058U // Western Digital Technologies, Inc.
#define UHS_VID_GIESECKE_AND_DEVRIENT 0x1059U // Giesecke & Devrient GmbH
#define UHS_VID_FOXCONN_INTERNATIONAL 0x105bU // Foxconn International, Inc.
#define UHS_VID_HONG_JI_ELECTRIC_WIRE_AND_CABLE_DONGGUAN 0x105cU // Hong Ji Electric Wire & Cable (Dongguan) Co., Ltd
#define UHS_VID_DELKIN_DEVICES 0x105dU // Delkin Devices, Inc.
#define UHS_VID_VALENCE_SEMICONDUCTOR_DESIGN 0x105eU // Valence Semiconductor Design, Ltd
#define UHS_VID_CHIN_SHONG_ENTERPRISE 0x105fU // Chin Shong Enterprise Co., Ltd
#define UHS_VID_EASTHOME_INDUSTRIAL 0x1060U // Easthome Industrial Co., Ltd
#define UHS_VID_MOTOROLA_ELECTRONICS_TAIWAN_LTD_HEX_ 0x1063U // Motorola Electronics Taiwan, Ltd [hex]
#define UHS_VID_CCYU_TECHNOLOGY 0x1065U // CCYU Technology
#define UHS_VID_LOYAL_LEGEND 0x106aU // Loyal Legend, Ltd
#define UHS_VID_CURITEL_COMMUNICATIONS 0x106cU // Curitel Communications, Inc.
#define UHS_VID_SAN_CHIEH_MANUFACTURING 0x106dU // San Chieh Manufacturing, Ltd
#define UHS_VID_CONECTL 0x106eU // ConectL
#define UHS_VID_MONEY_CONTROLS 0x106fU // Money Controls
#define UHS_VID_GCT_SEMICONDUCTOR 0x1076U // GCT Semiconductor, Inc.
#define UHS_VID_GATEWAY_1 0x107bU // Gateway, Inc.
#define UHS_VID_ARLEC_AUSTRALIA 0x107dU // Arlec Australia, Ltd
#define UHS_VID_MIDORIYA_ELECTRIC 0x107eU // Midoriya Electric Co., Ltd
#define UHS_VID_KIDZMOUSE 0x107fU // KidzMouse, Inc.
#define UHS_VID_SHIN_ETSUKAKEN 0x1082U // Shin-Etsukaken Co., Ltd
#define UHS_VID_CANON_ELECTRONICS 0x1083U // Canon Electronics, Inc.
#define UHS_VID_PANTECH 0x1084U // Pantech Co., Ltd
#define UHS_VID_CHLORIDE_POWER_PROTECTION 0x108aU // Chloride Power Protection
#define UHS_VID_GRAND_TEK_TECHNOLOGY 0x108bU // Grand-tek Technology Co., Ltd
#define UHS_VID_ROBERT_BOSCH 0x108cU // Robert Bosch GmbH
#define UHS_VID_LOTES 0x108eU // Lotes Co., Ltd.
#define UHS_VID_SURFACE_OPTICS 0x1099U // Surface Optics Corp.
#define UHS_VID_DATASOFT_SYSTEMS 0x109aU // DATASOFT Systems GmbH
#define UHS_VID_HISENSE 0x109bU // Hisense
#define UHS_VID_ESOL 0x109fU // eSOL Co., Ltd
#define UHS_VID_HIROTECH 0x10a0U // Hirotech, Inc.
#define UHS_VID_MITSUBISHI_MATERIALS 0x10a3U // Mitsubishi Materials Corp.
#define UHS_VID_SK_TELETECH 0x10a9U // SK Teletech Co., Ltd
#define UHS_VID_CABLES_TO_GO 0x10aaU // Cables To Go
#define UHS_VID_USI 0x10abU // USI Co., Ltd
#define UHS_VID_HONEYWELL 0x10acU // Honeywell, Inc.
#define UHS_VID_PRINCETON_TECHNOLOGY 0x10aeU // Princeton Technology Corp.
#define UHS_VID_LIEBERT 0x10afU // Liebert Corp.
#define UHS_VID_COMODO_PLX_UNKNOWN 0x10b5U // Comodo (PLX?)
#define UHS_VID_DIBCOM 0x10b8U // DiBcom
#define UHS_VID_TM_TECHNOLOGY 0x10bbU // TM Technology, Inc.
#define UHS_VID_DINGING_TECHNOLOGY 0x10bcU // Dinging Technology Co., Ltd
#define UHS_VID_TMT_TECHNOLOGY 0x10bdU // TMT Technology, Inc.
#define UHS_VID_SMARTHOME 0x10bfU // SmartHome
#define UHS_VID_UNIVERSAL_LASER_SYSTEMS 0x10c3U // Universal Laser Systems, Inc.
#define UHS_VID_CYGNAL_INTEGRATED_PRODUCTS 0x10c4U // Cygnal Integrated Products, Inc.
#define UHS_VID_SANEI_ELECTRIC 0x10c5U // Sanei Electric, Inc.
#define UHS_VID_INTEC 0x10c6U // Intec, Inc.
#define UHS_VID_ERATECH 0x10cbU // Eratech
#define UHS_VID_GBM_CONNECTOR 0x10ccU // GBM Connector Co., Ltd
#define UHS_VID_KYCON 0x10cdU // Kycon, Inc.
#define UHS_VID_SILICON_LABS 0x10ceU // Silicon Labs
#define UHS_VID_VELLEMAN_COMPONENTS 0x10cfU // Velleman Components, Inc.
#define UHS_VID_HOTTINGER_BALDWIN_MEASUREMENT 0x10d1U // Hottinger Baldwin Measurement
#define UHS_VID_RAYCOMPOSER__R_ADAMS 0x10d2U // RayComposer - R. Adams
#define UHS_VID_MAN_BOON_MANUFACTORY 0x10d4U // Man Boon Manufactory, Ltd
#define UHS_VID_UNI_CLASS_TECHNOLOGY 0x10d5U // Uni Class Technology Co., Ltd
#define UHS_VID_ACTIONS_SEMICONDUCTOR 0x10d6U // Actions Semiconductor Co., Ltd
#define UHS_VID_AUTHENEX 0x10deU // Authenex, Inc.
#define UHS_VID_IN_WIN_DEVELOPMENT 0x10dfU // In-Win Development, Inc.
#define UHS_VID_POST_OP_VIDEO 0x10e0U // Post-Op Video, Inc.
#define UHS_VID_CABLEPLUS 0x10e1U // CablePlus, Ltd
#define UHS_VID_NADA_ELECTRONICS 0x10e2U // Nada Electronics, Ltd
#define UHS_VID_VAST_TECHNOLOGIES 0x10ecU // Vast Technologies, Inc.
#define UHS_VID_NEXIO 0x10f0U // Nexio Co., Ltd
#define UHS_VID_IMPORTEK 0x10f1U // Importek
#define UHS_VID_TURTLE_BEACH 0x10f5U // Turtle Beach
#define UHS_VID_PICTOS_TECHNOLOGIES 0x10fbU // Pictos Technologies, Inc.
#define UHS_VID_ANUBIS_ELECTRONICS 0x10fdU // Anubis Electronics, Ltd
#define UHS_VID_THRANE_AND_THRANE 0x10feU // Thrane & Thrane
#define UHS_VID_VIRTOUCH 0x1100U // VirTouch, Ltd
#define UHS_VID_EASYPASS_INDUSTRIAL 0x1101U // EasyPass Industrial Co., Ltd
#define UHS_VID_BRIGHTCOM_TECHNOLOGIES 0x1108U // Brightcom Technologies, Ltd
#define UHS_VID_MOXA_TECHNOLOGIES 0x110aU // Moxa Technologies Co., Ltd.
#define UHS_VID_ANALOG_DEVICES_CANADA_LTD_ALLIED_TELESYN 0x1110U // Analog Devices Canada, Ltd (Allied Telesyn)
#define UHS_VID_PANDORA_INTERNATIONAL 0x1111U // Pandora International Ltd.
#define UHS_VID_YM_ELECTRIC 0x1112U // YM ELECTRIC CO., Ltd
#define UHS_VID_MEDION_AG 0x1113U // Medion AG
#define UHS_VID_VSO_ELECTRIC 0x111eU // VSO Electric Co., Ltd
#define UHS_VID_REDRAT 0x112aU // RedRat
#define UHS_VID_MASTER_HILL_ELECTRIC_WIRE_AND_CABLE 0x112eU // Master Hill Electric Wire and Cable Co., Ltd
#define UHS_VID_CELLON_INTERNATIONAL 0x112fU // Cellon International, Inc.
#define UHS_VID_TENX_TECHNOLOGY 0x1130U // Tenx Technology, Inc.
#define UHS_VID_INTEGRATED_SYSTEM_SOLUTION 0x1131U // Integrated System Solution Corp.
#define UHS_VID_TOSHIBA_CORP_DIGITAL_MEDIA_EQUIPMENT_HEX_ 0x1132U // Toshiba Corp., Digital Media Equipment [hex]
#define UHS_VID_CTS_ELECTRONINCS 0x1136U // CTS Electronincs
#define UHS_VID_ARIN_TECH 0x113cU // Arin Tech Co., Ltd
#define UHS_VID_MAPOWER_ELECTRONICS 0x113dU // Mapower Electronics Co., Ltd
#define UHS_VID_V_ONE_MULTIMEDIA_PTE 0x1141U // V One Multimedia, Pte., Ltd
#define UHS_VID_CYBERSCAN_TECHNOLOGIES 0x1142U // CyberScan Technologies, Inc.
#define UHS_VID_JAPAN_RADIO_COMPANY 0x1145U // Japan Radio Company
#define UHS_VID_SHIMANE_SANYO_ELECTRIC 0x1146U // Shimane SANYO Electric Co., Ltd.
#define UHS_VID_EVER_GREAT_ELECTRIC_WIRE_AND_CABLE 0x1147U // Ever Great Electric Wire and Cable Co., Ltd
#define UHS_VID_SPHAIRON_ACCESS_SYSTEMS 0x114bU // Sphairon Access Systems GmbH
#define UHS_VID_TINIUS_OLSEN_TESTING_MACHINE 0x114cU // Tinius Olsen Testing Machine Co., Inc.
#define UHS_VID_ALPHA_IMAGING_TECHNOLOGY 0x114dU // Alpha Imaging Technology Corp.
#define UHS_VID_WAVECOM 0x114fU // Wavecom
#define UHS_VID_SALIX_TECHNOLOGY 0x115bU // Salix Technology Co., Ltd.
#define UHS_VID_SECUGEN 0x1162U // Secugen Corp.
#define UHS_VID_DELORME_PUBLISHING 0x1163U // DeLorme Publishing, Inc.
#define UHS_VID_YUAN_HIGH_TECH_DEVELOPMENT 0x1164U // YUAN High-Tech Development Co., Ltd
#define UHS_VID_TELSON_ELECTRONICS 0x1165U // Telson Electronics Co., Ltd
#define UHS_VID_BANTAM_INTERACTIVE_TECHNOLOGIES 0x1166U // Bantam Interactive Technologies
#define UHS_VID_SALIENT_SYSTEMS 0x1167U // Salient Systems Corp.
#define UHS_VID_BIZCONN_INTERNATIONAL 0x1168U // BizConn International Corp.
#define UHS_VID_GIGASTORAGE 0x116eU // Gigastorage Corp.
#define UHS_VID_SILICON_10_TECHNOLOGY 0x116fU // Silicon 10 Technology Corp.
#define UHS_VID_SHENGYIH_STEEL_MOLD 0x1175U // Shengyih Steel Mold Co., Ltd
#define UHS_VID_SANTA_ELECTRONIC 0x117dU // Santa Electronic, Inc.
#define UHS_VID_JNC 0x117eU // JNC, Inc.
#define UHS_VID_VENTURE 0x1182U // Venture Corp., Ltd
#define UHS_VID_COMPAQ_COMPUTER_CORP_HEX_DIGITAL_DREAM_UNKNOWN 0x1183U // Compaq Computer Corp. [hex] (Digital Dream ?)
#define UHS_VID_KYOCERA_ELCO 0x1184U // Kyocera Elco Corp.
#define UHS_VID_BLOOMBERG_LP 0x1188U // Bloomberg L.P.
#define UHS_VID_ACER_COMMUNICATIONS_AND_MULTIMEDIA 0x1189U // Acer Communications & Multimedia
#define UHS_VID_YOU_YANG_TECHNOLOGY 0x118fU // You Yang Technology Co., Ltd
#define UHS_VID_TRIPACE 0x1190U // Tripace
#define UHS_VID_LOYALTY_FOUNDER_ENTERPRISE 0x1191U // Loyalty Founder Enterprise Co., Ltd
#define UHS_VID_YANKEE_ROBOTICS 0x1196U // Yankee Robotics, LLC
#define UHS_VID_TECHNOIMAGIA 0x1197U // Technoimagia Co., Ltd
#define UHS_VID_STARSHINE_TECHNOLOGY 0x1198U // StarShine Technology Corp.
#define UHS_VID_SIERRA_WIRELESS 0x1199U // Sierra Wireless, Inc.
#define UHS_VID_ZHAN_QI_TECHNOLOGY 0x119aU // ZHAN QI Technology Co., Ltd
#define UHS_VID_RUWIDO_AUSTRIA 0x119bU // ruwido austria GmbH
#define UHS_VID_CHIPCON_AS 0x11a0U // Chipcon AS
#define UHS_VID_TECHNOVAS 0x11a3U // Technovas Co., Ltd
#define UHS_VID_GLOBALMEDIA_GROUP 0x11aaU // GlobalMedia Group, LLC
#define UHS_VID_EXITO_ELECTRONICS 0x11abU // Exito Electronics Co., Ltd
#define UHS_VID_NIKE 0x11acU // Nike
#define UHS_VID_ATECH_FLASH_TECHNOLOGY 0x11b0U // ATECH FLASH TECHNOLOGY
#define UHS_VID_RANDD_INTERNATIONAL_NV 0x11beU // R&D International NV
#define UHS_VID_INMAX 0x11c5U // Inmax
#define UHS_VID_VERIFONE 0x11caU // VeriFone Inc
#define UHS_VID_TOPFIELD 0x11dbU // Topfield Co., Ltd.
#define UHS_VID_KI_TECHNOLOGY 0x11e6U // K.I. Technology Co. Ltd.
#define UHS_VID_SIEMENS_AG_1 0x11f5U // Siemens AG
#define UHS_VID_PROLIFIC 0x11f6U // Prolific
#define UHS_VID_ALCATEL_UNKNOWN 0x11f7U // Alcatel (?)
#define UHS_VID_TSC_AUTO_ID_TECHNOLOGY 0x1203U // TSC Auto ID Technology Co., Ltd
#define UHS_VID_INTERBIOMETRICS 0x1209U // InterBiometrics
#define UHS_VID_HUDSON_SOFT 0x120eU // Hudson Soft Co., Ltd
#define UHS_VID_MAGELLAN 0x120fU // Magellan
#define UHS_VID_DIGITECH 0x1210U // DigiTech
#define UHS_VID_JUNGSOFT 0x121eU // Jungsoft Co., Ltd
#define UHS_VID_UNKNOWN_MANUFACTURER_1 0x1221U // Unknown manufacturer
#define UHS_VID_SKYCABLE_ENTERPRISE 0x1223U // SKYCABLE ENTERPRISE. CO., LTD.
#define UHS_VID_DATAPAQ_LIMITED 0x1228U // Datapaq Limited
#define UHS_VID_CHIPIDEA_MICROELECTRONICA 0x1230U // Chipidea-Microelectronica, S.A.
#define UHS_VID_DENVER_ELECTRONICS 0x1233U // Denver Electronics
#define UHS_VID_BRAIN_ACTUATED_TECHNOLOGIES 0x1234U // Brain Actuated Technologies
#define UHS_VID_FOCUSRITE_NOVATION 0x1235U // Focusrite-Novation
#define UHS_VID_BELKIN 0x1241U // Belkin
#define UHS_VID_AIRVAST 0x124aU // AirVast
#define UHS_VID_NYKO_HONEY_BEE 0x124bU // Nyko (Honey Bee)
#define UHS_VID_MXI__MEMORY_EXPERTS_INTERNATIONAL 0x124cU // MXI - Memory Experts International, Inc.
#define UHS_VID_APOGEE 0x125cU // Apogee Inc.
#define UHS_VID_A_DATA_TECHNOLOGY 0x125fU // A-DATA Technology Co., Ltd.
#define UHS_VID_STANDARD_MICROSYSTEMS_3 0x1260U // Standard Microsystems Corp.
#define UHS_VID_COVIDIEN_ENERGY_BASED_DEVICES 0x1264U // Covidien Energy-based Devices
#define UHS_VID_PIRELLI_BROADBAND_SOLUTIONS 0x1266U // Pirelli Broadband Solutions
#define UHS_VID_LOGIC3_SPECTRAVIDEO_PLC 0x1267U // Logic3 / SpectraVideo plc
#define UHS_VID_ARISTOCRAT_TECHNOLOGIES 0x126cU // Aristocrat Technologies
#define UHS_VID_BEL_STEWART 0x126dU // Bel Stewart
#define UHS_VID_STROBE_DATA 0x126eU // Strobe Data, Inc.
#define UHS_VID_TWINMOS 0x126fU // TwinMOS
#define UHS_VID_ENSONIQ 0x1274U // Ensoniq
#define UHS_VID_XAXERO_MARINE_SOFTWARE_ENGINEERING 0x1275U // Xaxero Marine Software Engineering, Ltd.
#define UHS_VID_STARLIGHT_XPRESS 0x1278U // Starlight Xpress
#define UHS_VID_ZEBRIS_MEDICAL 0x1283U // zebris Medical GmbH
#define UHS_VID_MARVELL_SEMICONDUCTOR 0x1286U // Marvell Semiconductor, Inc.
#define UHS_VID_QUALCOMM_FLARION_TECHNOLOGIES_INC_LEADTEK_RESEARCH 0x1291U // Qualcomm Flarion Technologies, Inc. / Leadtek Research, Inc.
#define UHS_VID_INNOMEDIA_1 0x1292U // Innomedia
#define UHS_VID_BELKIN_COMPONENTS_HEX_ 0x1293U // Belkin Components [hex]
#define UHS_VID_RISO_KAGAKU 0x1294U // RISO KAGAKU CORP.
#define UHS_VID_CYBERTAN_TECHNOLOGY 0x129bU // CyberTAN Technology
#define UHS_VID_TRENDCHIP_TECHNOLOGIES 0x12a7U // Trendchip Technologies Corp.
#define UHS_VID_HONEY_BEE_ELECTRONIC_INTERNATIONAL 0x12abU // Honey Bee Electronic International Ltd.
#define UHS_VID_ZHEJIANG_XINYA_ELECTRONIC_TECHNOLOGY 0x12b8U // Zhejiang Xinya Electronic Technology Co., Ltd.
#define UHS_VID_E28 0x12b9U // E28
#define UHS_VID_LICENSED_BY_SONY_COMPUTER_ENTERTAINMENT_AMERICA 0x12baU // Licensed by Sony Computer Entertainment America
#define UHS_VID_GEMBIRD 0x12bdU // Gembird
#define UHS_VID_AUTOCUE_GROUP 0x12c4U // Autocue Group Ltd
#define UHS_VID_DEXIN_1 0x12cfU // DEXIN
#define UHS_VID_HUAWEI_TECHNOLOGIES 0x12d1U // Huawei Technologies Co., Ltd.
#define UHS_VID_LINE_TECH_INDUSTRIAL 0x12d2U // LINE TECH INDUSTRIAL CO., LTD.
#define UHS_VID_EMS_DR_THOMAS_WUENSCHE 0x12d6U // EMS Dr. Thomas Wuensche
#define UHS_VID_BETTER_WIRE_FACTORY 0x12d7U // BETTER WIRE FACTORY CO., LTD.
#define UHS_VID_ARANEUS_INFORMATION_SYSTEMS_OY 0x12d8U // Araneus Information Systems Oy
#define UHS_VID_WALDORF_MUSIC 0x12e6U // Waldorf Music GmbH
#define UHS_VID_TAPWAVE 0x12efU // Tapwave, Inc.
#define UHS_VID_DYNAMIC_SYSTEM_ELECTRONICS 0x12f5U // Dynamic System Electronics Corp.
#define UHS_VID_MEMOREX_PRODUCTS 0x12f7U // Memorex Products, Inc.
#define UHS_VID_AIN_COMM_TECHNOLOGY 0x12fdU // AIN Comm. Technology Co., Ltd
#define UHS_VID_FASCINATING_ELECTRONICS 0x12ffU // Fascinating Electronics, Inc.
#define UHS_VID_TRANSCEND_INFORMATION 0x1307U // Transcend Information, Inc.
#define UHS_VID_SHUTTLE_1 0x1308U // Shuttle, Inc.
#define UHS_VID_ROPER 0x1310U // Roper
#define UHS_VID_ICS_ELECTRONICS 0x1312U // ICS Electronics
#define UHS_VID_THORLABS 0x1313U // ThorLabs
#define UHS_VID_NATURAL_POINT 0x131dU // Natural Point
#define UHS_VID_ENVARA 0x132aU // Envara Inc.
#define UHS_VID_KONICA_MINOLTA 0x132bU // Konica Minolta
#define UHS_VID_KEMPER_DIGITAL 0x133eU // Kemper Digital GmbH
#define UHS_VID_MOBILITY 0x1342U // Mobility
#define UHS_VID_CITIZEN_SYSTEMS 0x1343U // Citizen Systems
#define UHS_VID_SINO_LITE_TECHNOLOGY 0x1345U // Sino Lite Technology Corp.
#define UHS_VID_MORAVIAN_INSTRUMENTS 0x1347U // Moravian Instruments
#define UHS_VID_KATSURAGAWA_ELECTRIC 0x1348U // Katsuragawa Electric Co., Ltd.
#define UHS_VID_PANJIT_INTERNATIONAL 0x134cU // PanJit International Inc.
#define UHS_VID_DIGBYS_BITPILE_INC_DBA_D_BIT 0x134eU // Digby's Bitpile, Inc. DBA D Bit
#define UHS_VID_PANDE_MICROCOMPUTER_SYSTEMS 0x1357U // P&E Microcomputer Systems
#define UHS_VID_CONTROL_DEVELOPMENT 0x135fU // Control Development Inc.
#define UHS_VID_SEGGER 0x1366U // SEGGER
#define UHS_VID_STEC 0x136bU // STEC
#define UHS_VID_ANDOR_TECHNOLOGY 0x136eU // Andor Technology Ltd.
#define UHS_VID_SWISSBIT 0x1370U // Swissbit
#define UHS_VID_CNET_TECHNOLOGY 0x1371U // CNet Technology Inc.
#define UHS_VID_VIMTRON_ELECTRONICS 0x1376U // Vimtron Electronics Co., Ltd.
#define UHS_VID_SCAPS 0x137bU // SCAPS GmbH
#define UHS_VID_NETGEAR_2 0x1385U // Netgear, Inc
#define UHS_VID_VALIDITY_SENSORS 0x138aU // Validity Sensors, Inc.
#define UHS_VID_JUNGO 0x138eU // Jungo LTD
#define UHS_VID_TOMTOM_BV 0x1390U // TOMTOM B.V.
#define UHS_VID_IDEALTEK 0x1391U // IdealTEK, Inc.
#define UHS_VID_SENNHEISER_COMMUNICATIONS 0x1395U // Sennheiser Communications
#define UHS_VID_BEHRINGER_INTERNATIONAL 0x1397U // BEHRINGER International GmbH
#define UHS_VID_Q_TEC 0x1398U // Q-tec
#define UHS_VID_BALTECH 0x13adU // Baltech
#define UHS_VID_PERKINELMER_OPTOELECTRONICS 0x13b0U // PerkinElmer Optoelectronics
#define UHS_VID_LINKSYS_2 0x13b1U // Linksys
#define UHS_VID_ALESIS 0x13b2U // Alesis
#define UHS_VID_NIPPON_DICS 0x13b3U // Nippon Dics Co., Ltd.
#define UHS_VID_PCPLAY 0x13baU // PCPlay
#define UHS_VID_RICOH_PRINTING_SYSTEMS 0x13beU // Ricoh Printing Systems, Ltd.
#define UHS_VID_JYETAI_PRECISION_INDUSTRIAL 0x13caU // JyeTai Precision Industrial Co., Ltd.
#define UHS_VID_WISAIR 0x13cfU // Wisair Ltd.
#define UHS_VID_TECHSAN_ELECTRONICS 0x13d0U // Techsan Electronics Co., Ltd.
#define UHS_VID_A_MAX_TECHNOLOGY_MACAO_COMMERCIAL_OFFSHORE 0x13d1U // A-Max Technology Macao Commercial Offshore Co. Ltd.
#define UHS_VID_SHARK_MULTIMEDIA_1 0x13d2U // Shark Multimedia
#define UHS_VID_IMC_NETWORKS 0x13d3U // IMC Networks
#define UHS_VID_GUIDANCE_SOFTWARE 0x13d7U // Guidance Software, Inc.
#define UHS_VID_ALEREON 0x13dcU // ALEREON, INC.
#define UHS_VID_ITECH_DYNAMIC_LIMITED 0x13ddU // i.Tech Dynamic Limited
#define UHS_VID_KAIBO_WIRE_AND_CABLE_SHENZHEN 0x13e1U // Kaibo Wire & Cable (Shenzhen) Co., Ltd.
#define UHS_VID_RANE 0x13e5U // Rane
#define UHS_VID_TECHNOSCOPE 0x13e6U // TechnoScope Co., Ltd.
#define UHS_VID_HENGSTLER 0x13eaU // Hengstler
#define UHS_VID_ZYDACRON 0x13ecU // Zydacron
#define UHS_VID_MOSART 0x13eeU // MosArt
#define UHS_VID_INITIO_CORPORATION 0x13fdU // Initio Corporation
#define UHS_VID_KINGSTON_TECHNOLOGY_COMPANY_1 0x13feU // Kingston Technology Company Inc.
#define UHS_VID_AXXION_GROUP 0x1400U // Axxion Group Corp.
#define UHS_VID_BOWE_BELL_AND_HOWELL 0x1402U // Bowe Bell & Howell
#define UHS_VID_SITRONIX 0x1403U // Sitronix
#define UHS_VID_IDS_IMAGING_DEVELOPMENT_SYSTEMS 0x1409U // IDS Imaging Development Systems GmbH
#define UHS_VID_TELECHIPS 0x140eU // Telechips, Inc.
#define UHS_VID_NOVATEL_WIRELESS_1 0x1410U // Novatel Wireless
#define UHS_VID_NAM_TAI_EANDE_PRODUCTS_LTD_OR_OMNIVISION_TECHNOLOGIES 0x1415U // Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc.
#define UHS_VID_ABILITY_ENTERPRISE 0x1419U // ABILITY ENTERPRISE CO., LTD.
#define UHS_VID_SENSOR_TECHNOLOGY 0x1421U // Sensor Technology
#define UHS_VID_VEGA_TECHNOLOGIES_INDUSTRIAL_AUSTRIA 0x1429U // Vega Technologies Industrial (Austria) Co.
#define UHS_VID_THALES_E_TRANSACTIONS 0x142aU // Thales E-Transactions
#define UHS_VID_ARBITER_SYSTEMS 0x142bU // Arbiter Systems, Inc.
#define UHS_VID_REDOCTANE 0x1430U // RedOctane
#define UHS_VID_PERTECH_RESOURCES 0x1431U // Pertech Resources, Inc.
#define UHS_VID_WISTRON_NEWEB 0x1435U // Wistron NeWeb
#define UHS_VID_DENALI_SOFTWARE 0x1436U // Denali Software, Inc.
#define UHS_VID_ALTEK_CORPORATION 0x143cU // Altek Corporation
#define UHS_VID_DIGILENT 0x1443U // Digilent
#define UHS_VID_XJGROUP 0x1446U // X.J.GROUP
#define UHS_VID_RADIO_SHACK 0x1453U // Radio Shack
#define UHS_VID_EXTENDING_WIRE_AND_CABLE 0x1456U // Extending Wire & Cable Co., Ltd.
#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER_1 0x1457U // First International Computer, Inc.
#define UHS_VID_TRUST 0x145fU // Trust
#define UHS_VID_TATUNG 0x1460U // Tatung Co.
#define UHS_VID_STACCATO_COMMUNICATIONS 0x1461U // Staccato Communications
#define UHS_VID_MICRO_STAR_INTERNATIONAL_1 0x1462U // Micro Star International
#define UHS_VID_HUAWEI_3COM 0x1472U // Huawei-3Com
#define UHS_VID_FORMOSA_INDUSTRIAL_COMPUTING 0x147aU // Formosa Industrial Computing, Inc.
#define UHS_VID_UPEK 0x147eU // Upek
#define UHS_VID_HAMA_GMBH_AND_CO_KG 0x147fU // Hama GmbH & Co., KG
#define UHS_VID_VAILLANT 0x1482U // Vaillant
#define UHS_VID_ELSA_AG_HEX_ 0x1484U // Elsa AG [hex]
#define UHS_VID_SILICOM_1 0x1485U // Silicom
#define UHS_VID_DSP_GROUP 0x1487U // DSP Group, Ltd.
#define UHS_VID_EVATRONIX 0x148eU // EVATRONIX SA
#define UHS_VID_RALINK_TECHNOLOGY 0x148fU // Ralink Technology, Corp.
#define UHS_VID_FUTRONIC_TECHNOLOGY 0x1491U // Futronic Technology Co. Ltd.
#define UHS_VID_SUUNTO 0x1493U // Suunto
#define UHS_VID_PANSTRONG_COMPANY 0x1497U // Panstrong Company Ltd.
#define UHS_VID_MICROTEK_INTERNATIONAL_1 0x1498U // Microtek International Inc.
#define UHS_VID_IMAGINATION_TECHNOLOGIES 0x149aU // Imagination Technologies
#define UHS_VID_WIDEVIEW_TECHNOLOGY 0x14aaU // WideView Technology Inc.
#define UHS_VID_CTK_CORPORATION 0x14adU // CTK Corporation
#define UHS_VID_PRINTRONIX 0x14aeU // Printronix Inc.
#define UHS_VID_ATP_ELECTRONICS 0x14afU // ATP Electronics Inc.
#define UHS_VID_STARTECHCOM 0x14b0U // StarTech.com Ltd.
#define UHS_VID_RALINK_TECHNOLOGY_1 0x14b2U // Ralink Technology, Corp.
#define UHS_VID_ROCKWELL_AUTOMATION 0x14c0U // Rockwell Automation, Inc.
#define UHS_VID_GEMLIGHT_COMPUTER 0x14c2U // Gemlight Computer, Ltd
#define UHS_VID_ZYTRONIC 0x14c8U // Zytronic
#define UHS_VID_SUPER_TOP 0x14cdU // Super Top
#define UHS_VID_JAMER_INDUSTRIES 0x14d8U // JAMER INDUSTRIES CO., LTD.
#define UHS_VID_RARITAN_COMPUTER 0x14ddU // Raritan Computer, Inc.
#define UHS_VID_WINRADIO_COMMUNICATIONS 0x14e0U // WiNRADiO Communications
#define UHS_VID_DIALOGUE_TECHNOLOGY 0x14e1U // Dialogue Technology Corp.
#define UHS_VID_SAIN_INFORMATION_AND_COMMUNICATIONS 0x14e5U // SAIN Information & Communications Co., Ltd.
#define UHS_VID_PLANEX_COMMUNICATIONS_1 0x14eaU // Planex Communications
#define UHS_VID_SHURE 0x14edU // Shure Inc.
#define UHS_VID_TECHNISAT_DIGITAL 0x14f7U // TechniSat Digital GmbH
#define UHS_VID_ELLISYS_1 0x1500U // Ellisys
#define UHS_VID_PINE_TUM_ENTERPRISE 0x1501U // Pine-Tum Enterprise Co., Ltd.
#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER_2 0x1509U // First International Computer, Inc.
#define UHS_VID_MEDMOBILE 0x1513U // medMobile
#define UHS_VID_ACTEL 0x1514U // Actel
#define UHS_VID_COMPUSA 0x1516U // CompUSA
#define UHS_VID_CHESHIRE_ENGINEERING 0x1518U // Cheshire Engineering Corp.
#define UHS_VID_COMNEON 0x1519U // Comneon
#define UHS_VID_BITWIRE 0x1520U // Bitwire Corp.
#define UHS_VID_ENE_TECHNOLOGY_1 0x1524U // ENE Technology Inc
#define UHS_VID_SILICON_PORTALS 0x1527U // Silicon Portals
#define UHS_VID_UBIQUAM 0x1529U // UBIQUAM Co., Ltd.
#define UHS_VID_THESYCON_SYSTEMSOFTWARE_AND_CONSULTING 0x152aU // Thesycon Systemsoftware & Consulting GmbH
#define UHS_VID_MIR_SRL 0x152bU // MIR Srl
#define UHS_VID_JMICRON_TECHNOLOGY_CORP_JMICRON_USA_TECHNOLOGY 0x152dU // JMicron Technology Corp. / JMicron USA Technology Corp.
#define UHS_VID_LG_HLDS 0x152eU // LG (HLDS)
#define UHS_VID_RAZER_USA 0x1532U // Razer USA, Ltd
#define UHS_VID_TERRATEC_ELECTRONIC_1 0x153bU // TerraTec Electronic GmbH
#define UHS_VID_U_BLOX_AG 0x1546U // U-Blox AG
#define UHS_VID_SG_INTEC_LTD_AND_CO_KG 0x1547U // SG Intec Ltd & Co KG
#define UHS_VID_CELECTRONIC 0x154aU // Celectronic GmbH
#define UHS_VID_PNY 0x154bU // PNY
#define UHS_VID_CONNECTCOUNTY_HOLDINGS_BERHAD 0x154dU // ConnectCounty Holdings Berhad
#define UHS_VID_DANDM_HOLDINGS_INC_DENONMARANTZ 0x154eU // D&M Holdings, Inc. (Denon/Marantz)
#define UHS_VID_SNBC 0x154fU // SNBC CO., Ltd
#define UHS_VID_PROLINK_MICROSYSTEMS 0x1554U // Prolink Microsystems Corp.
#define UHS_VID_OQO 0x1557U // OQO
#define UHS_VID_SUNF_PU_TECHNOLOGY 0x1568U // Sunf Pu Technology Co., Ltd
#define UHS_VID_QUANTUM_CORPORATION 0x156fU // Quantum Corporation
#define UHS_VID_ALLTOP_TECHNOLOGY 0x1570U // ALLTOP TECHNOLOGY CO., LTD.
#define UHS_VID_KETRON_SRL 0x157bU // Ketron SRL
#define UHS_VID_TRENDNET 0x157eU // TRENDnet
#define UHS_VID_FIBERLINE 0x1582U // Fiberline
#define UHS_VID_SMA_TECHNOLOGIE_AG 0x1587U // SMA Technologie AG
#define UHS_VID_OAKLEY 0x158dU // Oakley Inc.
#define UHS_VID_JDS_UNIPHASE_CORPORATION_JDSU 0x158eU // JDS Uniphase Corporation (JDSU)
#define UHS_VID_KUNSHAN_GUOJI_ELECTRONICS 0x1598U // Kunshan Guoji Electronics Co., Ltd.
#define UHS_VID_FREESCALE_SEMICONDUCTOR 0x15a2U // Freescale Semiconductor, Inc.
#define UHS_VID_AFATECH_TECHNOLOGIES 0x15a4U // Afatech Technologies, Inc.
#define UHS_VID_TEAMS_POWER_LIMITED 0x15a8U // Teams Power Limited
#define UHS_VID_GEMTEK 0x15a9U // Gemtek
#define UHS_VID_GEARWAY_ELECTRONICS_DONG_GUAN 0x15aaU // Gearway Electronics (Dong Guan) Co., Ltd.
#define UHS_VID_VMWARE_1 0x15adU // VMware Inc.
#define UHS_VID_OLIMEX 0x15baU // Olimex Ltd.
#define UHS_VID_XL_IMAGING 0x15c0U // XL Imaging
#define UHS_VID_SOUNDGRAPH 0x15c2U // SoundGraph Inc.
#define UHS_VID_ADVANCE_MULTIMEDIA_INTERNET_TECHNOLOGY_INC_AMIT 0x15c5U // Advance Multimedia Internet Technology Inc. (AMIT)
#define UHS_VID_LABORATOIRES_MXM 0x15c6U // Laboratoires MXM
#define UHS_VID_KTF_TECHNOLOGIES 0x15c8U // KTF Technologies
#define UHS_VID_D_BOX_TECHNOLOGIES 0x15c9U // D-Box Technologies
#define UHS_VID_TEXTECH_INTERNATIONAL 0x15caU // Textech International Ltd.
#define UHS_VID_COULOMB_ELECTRONICS 0x15d5U // Coulomb Electronics Ltd.
#define UHS_VID_TRUST_INTERNATIONAL_BV_1 0x15d9U // Trust International B.V.
#define UHS_VID_HYNIX_SEMICONDUCTOR 0x15dcU // Hynix Semiconductor Inc.
#define UHS_VID_SEONG_JI_INDUSTRIAL 0x15e0U // Seong Ji Industrial Co., Ltd.
#define UHS_VID_RSA 0x15e1U // RSA
#define UHS_VID_NUMARK 0x15e4U // Numark
#define UHS_VID_SOHOWARE 0x15e8U // SohoWare
#define UHS_VID_PACIFIC_DIGITAL 0x15e9U // Pacific Digital Corp.
#define UHS_VID_BELCARRA_TECHNOLOGIES 0x15ecU // Belcarra Technologies Corp.
#define UHS_VID_HANFTEK 0x15f4U // HanfTek
#define UHS_VID_TASCAM 0x1604U // Tascam
#define UHS_VID_UMAX_1 0x1606U // Umax
#define UHS_VID_INSIDE_OUT_NETWORKS_HEX_ 0x1608U // Inside Out Networks [hex]
#define UHS_VID_VIA_TECHNOLOGIES_1 0x160aU // VIA Technologies, Inc.
#define UHS_VID_INRO 0x160eU // INRO
#define UHS_VID_AMOI_ELECTRONICS 0x1614U // Amoi Electronics
#define UHS_VID_SONY_1 0x1617U // Sony Corp.
#define UHS_VID_L_AND_K_PRECISION_TECHNOLOGY 0x1619U // L & K Precision Technology Co., Ltd.
#define UHS_VID_WIONICS_RESEARCH 0x1621U // Wionics Research
#define UHS_VID_STONESTREET_ONE 0x1628U // Stonestreet One, Inc.
#define UHS_VID_AIRGO_NETWORKS 0x162aU // Airgo Networks Inc.
#define UHS_VID_WIQUEST_COMMUNICATIONS 0x162fU // WiQuest Communications, Inc.
#define UHS_VID_2WIRE_1 0x1630U // 2Wire, Inc.
#define UHS_VID_GOOD_WAY_TECHNOLOGY 0x1631U // Good Way Technology
#define UHS_VID_ENTREGA_HEX_ 0x1645U // Entrega [hex]
#define UHS_VID_SOFTEC_MICROSYSTEMS 0x1649U // SofTec Microsystems
#define UHS_VID_CHIPX 0x164aU // ChipX
#define UHS_VID_MATRIX_VISION 0x164cU // Matrix Vision GmbH
#define UHS_VID_STRUCK_INNOVATIVE_SYSTEME 0x1657U // Struck Innovative Systeme GmbH
#define UHS_VID_FRONTIER_DESIGN_GROUP 0x165bU // Frontier Design Group
#define UHS_VID_KONDO_KAGAKU 0x165cU // Kondo Kagaku
#define UHS_VID_CREATIX_POLYMEDIA 0x1660U // Creatix Polymedia GmbH
#define UHS_VID_GIGA_TMS 0x1667U // GIGA-TMS INC.
#define UHS_VID_ACTIONTEC_ELECTRONICS_INC_HEX_ 0x1668U // Actiontec Electronics, Inc. [hex]
#define UHS_VID_PIKRON_LTD_HEX_ 0x1669U // PiKRON Ltd. [hex]
#define UHS_VID_CLIPSAL 0x166aU // Clipsal
#define UHS_VID_CHINA_HUADA_INTEGRATED_CIRCUIT_DESIGN_GROUP_CO_LTD_CIDC_GROUP 0x1677U // China Huada Integrated Circuit Design (Group) Co., Ltd. (CIDC Group)
#define UHS_VID_TOTAL_PHASE 0x1679U // Total Phase
#define UHS_VID_GOLDEN_BRIDGE_ELECTECH_1 0x1680U // Golden Bridge Electech Inc.
#define UHS_VID_PREVO_TECHNOLOGIES 0x1681U // Prevo Technologies, Inc.
#define UHS_VID_MAXWISE_PRODUCTION_ENTERPRISE 0x1682U // Maxwise Production Enterprise Ltd.
#define UHS_VID_GODSPEED_COMPUTER 0x1684U // Godspeed Computer Corp.
#define UHS_VID_DELOCK 0x1685U // Delock
#define UHS_VID_ZOOM_CORPORATION 0x1686U // ZOOM Corporation
#define UHS_VID_KINGMAX_DIGITAL 0x1687U // Kingmax Digital Inc.
#define UHS_VID_SAAB 0x1688U // Saab AB
#define UHS_VID_RAZER_USA_1 0x1689U // Razer USA, Ltd
#define UHS_VID_ATHEROS_COMMUNICATIONS_1 0x168cU // Atheros Communications
#define UHS_VID_ASKEY_COMPUTER_CORP_HEX_ 0x1690U // Askey Computer Corp. [hex]
#define UHS_VID_HITACHI_VIDEO_AND_INFORMATION_SYSTEM 0x1696U // Hitachi Video and Information System, Inc.
#define UHS_VID_VTEC_TEST 0x1697U // VTec Test, Inc.
#define UHS_VID_SHENZHEN_ZHENGERYA_CABLE 0x16a5U // Shenzhen Zhengerya Cable Co., Ltd.
#define UHS_VID_UNIGRAF 0x16a6U // Unigraf
#define UHS_VID_GLOBAL_SUN_TECHNOLOGY_1 0x16abU // Global Sun Technology
#define UHS_VID_DONGGUAN_CHINGLUNG_WIRE_AND_CABLE 0x16acU // Dongguan ChingLung Wire & Cable Co., Ltd.
#define UHS_VID_ISTATION 0x16b4U // iStation
#define UHS_VID_PERSENTEC 0x16b5U // Persentec, Inc.
#define UHS_VID_VAN_OOIJEN_TECHNISCHE_INFORMATICA 0x16c0U // Van Ooijen Technische Informatica
#define UHS_VID_WIRELESS_CABLES 0x16caU // Wireless Cables, Inc.
#define UHS_VID_SILEX_TECHNOLOGY 0x16ccU // silex technology, Inc.
#define UHS_VID_MCS 0x16d0U // MCS
#define UHS_VID_SUPREMA 0x16d1U // Suprema Inc.
#define UHS_VID_FRONTLINE_TEST_EQUIPMENT 0x16d3U // Frontline Test Equipment, Inc.
#define UHS_VID_ANYDATA_CORPORATION 0x16d5U // AnyDATA Corporation
#define UHS_VID_JABLOCOM_SRO 0x16d6U // JABLOCOM s.r.o.
#define UHS_VID_CMOTECH 0x16d8U // CMOTECH Co., Ltd.
#define UHS_VID_WIENER_PLEIN_AND_BAUS 0x16dcU // Wiener, Plein & Baus
#define UHS_VID_KING_BILLION_ELECTRONICS 0x16dfU // King Billion Electronics Co., Ltd.
#define UHS_VID_GN_RESOUND_AS 0x16f0U // GN ReSound A/S
#define UHS_VID_FUTURELOGIC 0x16f5U // Futurelogic Inc.
#define UHS_VID_BLUEVIEW_TECHNOLOGIES 0x1706U // BlueView Technologies, Inc.
#define UHS_VID_ARTIMI 0x1707U // ARTIMI
#define UHS_VID_SWISSONIC 0x170bU // Swissonic
#define UHS_VID_AVNERA 0x170dU // Avnera
#define UHS_VID_LEICA_MICROSYSTEMS 0x1711U // Leica Microsystems
#define UHS_VID_MEYER_INSTRUMENTS_MIS 0x1724U // Meyer Instruments (MIS)
#define UHS_VID_VITESSE_SEMICONDUCTOR 0x1725U // Vitesse Semiconductor
#define UHS_VID_AXESSTEL 0x1726U // Axesstel, Inc.
#define UHS_VID_WALTOP_INTERNATIONAL 0x172fU // Waltop International Corp.
#define UHS_VID_CELLINK_TECHNOLOGY 0x1733U // Cellink Technology Co., Ltd
#define UHS_VID_CANON_IMAGING_SYSTEM_TECHNOLOGIES 0x1736U // CANON IMAGING SYSTEM TECHNOLOGIES INC.
#define UHS_VID_LINKSYS_3 0x1737U // Linksys
#define UHS_VID_QSENN 0x173dU // QSENN
#define UHS_VID_SENAO 0x1740U // Senao
#define UHS_VID_GENERAL_ATOMICS 0x1743U // General Atomics
#define UHS_VID_MQP_ELECTRONICS 0x1748U // MQP Electronics
#define UHS_VID_ASMEDIA_TECHNOLOGY 0x174cU // ASMedia Technology Inc.
#define UHS_VID_SYNTEK 0x174fU // Syntek
#define UHS_VID_GERTEC_TELECOMUNICACOES_LTDA 0x1753U // GERTEC Telecomunicacoes Ltda.
#define UHS_VID_ENENSYS_TECHNOLOGIES 0x1756U // ENENSYS Technologies
#define UHS_VID_LUCIDPORT_TECHNOLOGY 0x1759U // LucidPort Technology, Inc.
#define UHS_VID_ASUSTEK_COMPUTER_INC_WRONG_ID 0x1761U // ASUSTek Computer, Inc. (wrong ID)
#define UHS_VID_SYSTEM_LEVEL_SOLUTIONS 0x1772U // System Level Solutions, Inc.
#define UHS_VID_AROWANA 0x1776U // Arowana
#define UHS_VID_SWEEX 0x177fU // Sweex
#define UHS_VID_MULTIPLE_VENDORS 0x1781U // Multiple Vendors
#define UHS_VID_SPREADTRUM_COMMUNICATIONS 0x1782U // Spreadtrum Communications Inc.
#define UHS_VID_TOPSEED_TECHNOLOGY 0x1784U // TopSeed Technology Corp.
#define UHS_VID_ATI_AIB 0x1787U // ATI AIB
#define UHS_VID_SHENZHEN_LITKCONN_TECHNOLOGY 0x1788U // ShenZhen Litkconn Technology Co., Ltd.
#define UHS_VID_PRINTREX 0x1796U // Printrex, Inc.
#define UHS_VID_JALCO 0x1797U // JALCO CO., LTD.
#define UHS_VID_THALES_NORWAY_AS 0x1799U // Thales Norway A/S
#define UHS_VID_RICAVISION_INTERNATIONAL 0x179dU // Ricavision International, Inc.
#define UHS_VID_SAMSON_TECHNOLOGIES 0x17a0U // Samson Technologies Corp.
#define UHS_VID_CONCEPT2 0x17a4U // Concept2
#define UHS_VID_ADVANCED_CONNECTION_TECHNOLOGY 0x17a5U // Advanced Connection Technology Inc.
#define UHS_VID_MICOMSOFT 0x17a7U // MICOMSOFT CO., LTD.
#define UHS_VID_KAMSTRUP_AS 0x17a8U // Kamstrup A/S
#define UHS_VID_GREY_INNOVATION 0x17b3U // Grey Innovation
#define UHS_VID_LUNATONE 0x17b5U // Lunatone
#define UHS_VID_SAURIS 0x17baU // SAURIS GmbH
#define UHS_VID_SINGIM_INTERNATIONAL 0x17c3U // Singim International Corp.
#define UHS_VID_NATIVE_INSTRUMENTS 0x17ccU // Native Instruments
#define UHS_VID_HIP_HING_CABLE_AND_PLUG_MFY 0x17cfU // Hip Hing Cable & Plug Mfy. Ltd.
#define UHS_VID_SANFORD_LP 0x17d0U // Sanford L.P.
#define UHS_VID_KOREA_TECHTRON 0x17d3U // Korea Techtron Co., Ltd.
#define UHS_VID_DISPLAYLINK 0x17e9U // DisplayLink
#define UHS_VID_CORNICE 0x17ebU // Cornice, Inc.
#define UHS_VID_LENOVO 0x17efU // Lenovo
#define UHS_VID_WAVESENSE 0x17f4U // WaveSense
#define UHS_VID_KK_ROCKY 0x17f5U // K.K. Rocky
#define UHS_VID_UNICOMP 0x17f6U // Unicomp, Inc
#define UHS_VID_ADVANTECH 0x1809U // Advantech
#define UHS_VID_TWINHAN 0x1822U // Twinhan
#define UHS_VID_GWO_JINN_INDUSTRIES 0x1831U // Gwo Jinn Industries Co., Ltd.
#define UHS_VID_HUIZHOU_SHENGHUA_INDUSTRIAL 0x1832U // Huizhou Shenghua Industrial Co., Ltd.
#define UHS_VID_VIVOPHONE 0x183dU // VIVOphone
#define UHS_VID_VAISALA 0x1843U // Vaisala
#define UHS_VID_ASROCK_INCORPORATION 0x1849U // ASRock Incorporation
#define UHS_VID_GYROCOM_CANDC 0x1852U // GYROCOM C&C Co., LTD
#define UHS_VID_MEMORY_DEVICES 0x1854U // Memory Devices Ltd.
#define UHS_VID_COMPRO 0x185bU // Compro
#define UHS_VID_TECH_TECHNOLOGY_INDUSTRIAL_COMPANY 0x1861U // Tech Technology Industrial Company
#define UHS_VID_TERIDIAN_SEMICONDUCTOR 0x1862U // Teridian Semiconductor Corp.
#define UHS_VID_NEXIO_1 0x1870U // Nexio Co., Ltd
#define UHS_VID_AVEO_TECHNOLOGY 0x1871U // Aveo Technology Corp.
#define UHS_VID_NAVILOCK 0x1873U // Navilock
#define UHS_VID_ALIENWARE_CORPORATION 0x187cU // Alienware Corporation
#define UHS_VID_SIANO_MOBILE_SILICON 0x187fU // Siano Mobile Silicon
#define UHS_VID_VAST_TECHNOLOGIES_1 0x1892U // Vast Technologies, Inc.
#define UHS_VID_TOPSEED 0x1894U // Topseed
#define UHS_VID_EVERTOP_WIRE_CABLE 0x1897U // Evertop Wire Cable Co.
#define UHS_VID_3SHAPE_AS 0x189fU // 3Shape A/S
#define UHS_VID_CSSN 0x18a4U // CSSN
#define UHS_VID_VERBATIM 0x18a5U // Verbatim, Ltd
#define UHS_VID_PETALYNX 0x18b1U // Petalynx
#define UHS_VID_E3C_TECHNOLOGIES 0x18b4U // e3C Technologies
#define UHS_VID_MIKKON_TECHNOLOGY_LIMITED 0x18b6U // Mikkon Technology Limited
#define UHS_VID_ZOTEK_ELECTRONIC 0x18b7U // Zotek Electronic Co., Ltd.
#define UHS_VID_AMIT_TECHNOLOGY 0x18c5U // AMIT Technology, Inc.
#define UHS_VID_ECAMM 0x18cdU // Ecamm
#define UHS_VID_GOOGLE 0x18d1U // Google Inc.
#define UHS_VID_STARLINE_INTERNATIONAL_GROUP_LIMITED 0x18d5U // Starline International Group Limited
#define UHS_VID_KABA 0x18d9U // Kaba
#define UHS_VID_LKC_TECHNOLOGIES 0x18dcU // LKC Technologies, Inc.
#define UHS_VID_PLANON_SYSTEM_SOLUTIONS 0x18ddU // Planon System Solutions Inc.
#define UHS_VID_FITIPOWER_INTEGRATED_TECHNOLOGY 0x18e3U // Fitipower Integrated Technology Inc
#define UHS_VID_QCOM 0x18e8U // Qcom
#define UHS_VID_MATROX_GRAPHICS 0x18eaU // Matrox Graphics, Inc.
#define UHS_VID_ARKMICRO_TECHNOLOGIES 0x18ecU // Arkmicro Technologies Inc.
#define UHS_VID_FINEARCH 0x18fdU // FineArch Inc.
#define UHS_VID_GEMBIRD_1 0x1908U // GEMBIRD
#define UHS_VID_MOTOROLA_GSG 0x190dU // Motorola GSG
#define UHS_VID_ALCO_DIGITAL_DEVICES_LIMITED 0x1914U // Alco Digital Devices Limited
#define UHS_VID_NORDIC_SEMICONDUCTOR_ASA 0x1915U // Nordic Semiconductor ASA
#define UHS_VID_FITLINXX 0x1923U // FitLinxx
#define UHS_VID_NEXTWINDOW 0x1926U // NextWindow
#define UHS_VID_AVAGO_TECHNOLOGIES_PTE 0x192fU // Avago Technologies, Pte.
#define UHS_VID_SHENZHEN_XIANHE_TECHNOLOGY 0x1930U // Shenzhen Xianhe Technology Co., Ltd.
#define UHS_VID_NINGBO_BROAD_TELECOMMUNICATION 0x1931U // Ningbo Broad Telecommunication Co., Ltd.
#define UHS_VID_FEATURE_INTEGRATION_TECHNOLOGY_INC_FINTEK 0x1934U // Feature Integration Technology Inc. (Fintek)
#define UHS_VID_DREAM_LINK 0x1941U // Dream Link
#define UHS_VID_SENSORAY 0x1943U // Sensoray Co., Inc.
#define UHS_VID_LAB126 0x1949U // Lab126, Inc.
#define UHS_VID_PRESONUS_AUDIO_ELECTRONICS 0x194fU // PreSonus Audio Electronics, Inc.
#define UHS_VID_HYPERSTONE_AG 0x1951U // Hyperstone AG
#define UHS_VID_IRONKEY 0x1953U // Ironkey Inc.
#define UHS_VID_RADIIENT_TECHNOLOGIES 0x1954U // Radiient Technologies
#define UHS_VID_ITRON_TECHNOLOGY_IONE 0x195dU // Itron Technology iONE
#define UHS_VID_UNIDEN_CORPORATION 0x1965U // Uniden Corporation
#define UHS_VID_CASIO_HITACHI_MOBILE_COMMUNICATIONS 0x1967U // CASIO HITACHI Mobile Communications Co., Ltd.
#define UHS_VID_WISPRO_TECHNOLOGY 0x196bU // Wispro Technology Inc.
#define UHS_VID_DANE_ELEC_CORP_USA 0x1970U // Dane-Elec Corp. USA
#define UHS_VID_DONGGUAN_GUNEETAL_WIRE_AND_CABLE 0x1975U // Dongguan Guneetal Wire & Cable Co., Ltd.
#define UHS_VID_CHIPSBRAND_MICROELECTRONICS_HK 0x1976U // Chipsbrand Microelectronics (HK) Co., Ltd.
#define UHS_VID_T_LOGIC 0x1977U // T-Logic
#define UHS_VID_LEUZE_ELECTRONIC 0x197dU // Leuze electronic
#define UHS_VID_NUCONN_TECHNOLOGY 0x1989U // Nuconn Technology Corp.
#define UHS_VID_BECEEM_COMMUNICATIONS 0x198fU // Beceem Communications Inc.
#define UHS_VID_ACRON_PRECISION_INDUSTRIAL 0x1990U // Acron Precision Industrial Co., Ltd.
#define UHS_VID_TRILLIUM_TECHNOLOGY_PTY 0x1995U // Trillium Technology Pty. Ltd.
#define UHS_VID_PIXELINK 0x1996U // PixeLINK
#define UHS_VID_MICROSTRAIN 0x199bU // MicroStrain, Inc.
#define UHS_VID_THE_IMAGING_SOURCE_EUROPE 0x199eU // The Imaging Source Europe GmbH
#define UHS_VID_BENICA_CORPORATION 0x199fU // Benica Corporation
#define UHS_VID_BIFORST_TECHNOLOGY 0x19a8U // Biforst Technology Inc.
#define UHS_VID_BODELIN 0x19abU // Bodelin
#define UHS_VID_S_LIFE 0x19afU // S Life
#define UHS_VID_BATRONIX 0x19b2U // Batronix
#define UHS_VID_CELESTRON 0x19b4U // Celestron
#define UHS_VID_B_AND_W_GROUP 0x19b5U // B & W Group
#define UHS_VID_INFOTECH_LOGISTIC 0x19b6U // Infotech Logistic, LLC
#define UHS_VID_DATA_ROBOTICS 0x19b9U // Data Robotics
#define UHS_VID_FUTUBA 0x19c2U // Futuba
#define UHS_VID_MINDTRIBE 0x19caU // Mindtribe
#define UHS_VID_PARROT 0x19cfU // Parrot SA
#define UHS_VID_ZTE_WCDMA_TECHNOLOGIES_MSM 0x19d2U // ZTE WCDMA Technologies MSM
#define UHS_VID_KFI_PRINTERS 0x19dbU // KFI Printers
#define UHS_VID_WEIDUAN_ELECTRONIC_ACCESSORY_SZ 0x19e1U // WeiDuan Electronic Accessory (S.Z.) Co., Ltd.
#define UHS_VID_INDUSTRIAL_TECHNOLOGY_RESEARCH_INSTITUTE 0x19e8U // Industrial Technology Research Institute
#define UHS_VID_PAK_HENG_TECHNOLOGY_SHENZHEN 0x19efU // Pak Heng Technology (Shenzhen) Co., Ltd.
#define UHS_VID_RODE_MICROPHONES 0x19f7U // RODE Microphones
#define UHS_VID_GAMPAQ_COLTD 0x19faU // Gampaq Co.Ltd
#define UHS_VID_DYNEX 0x19ffU // Dynex
#define UHS_VID_BELLWOOD_INTERNATIONAL 0x1a08U // Bellwood International, Inc.
#define UHS_VID_USB_IF_NON_WORKSHOP 0x1a0aU // USB-IF non-workshop
#define UHS_VID_KES 0x1a12U // KES Co., Ltd.
#define UHS_VID_VEHO 0x1a1dU // Veho
#define UHS_VID_AMPHENOL_EAST_ASIA 0x1a25U // Amphenol East Asia Ltd.
#define UHS_VID_SEAGATE_BRANDED_SOLUTIONS 0x1a2aU // Seagate Branded Solutions
#define UHS_VID_CHINA_RESOURCE_SEMICO 0x1a2cU // China Resource Semico Co., Ltd
#define UHS_VID_QUANTA_MICROSYSTEMS 0x1a32U // Quanta Microsystems, Inc.
#define UHS_VID_ACRUX 0x1a34U // ACRUX
#define UHS_VID_BIWIN_TECHNOLOGY 0x1a36U // Biwin Technology Ltd.
#define UHS_VID_TERMINUS_TECHNOLOGY 0x1a40U // Terminus Technology Inc.
#define UHS_VID_ACTION_ELECTRONICS 0x1a41U // Action Electronics Co., Ltd.
#define UHS_VID_VASCO_DATA_SECURITY_INTERNATIONAL 0x1a44U // VASCO Data Security International
#define UHS_VID_SILICON_IMAGE 0x1a4aU // Silicon Image
#define UHS_VID_SAFEBOOT_INTERNATIONAL_BV 0x1a4bU // SafeBoot International B.V.
#define UHS_VID_TANDBERG_DATA 0x1a5aU // Tandberg Data
#define UHS_VID_ABBOTT_DIABETES_CARE 0x1a61U // Abbott Diabetes Care
#define UHS_VID_SPANSION 0x1a6aU // Spansion Inc.
#define UHS_VID_SAMYOUNG_ELECTRONICS 0x1a6dU // SamYoung Electronics Co., Ltd
#define UHS_VID_GLOBAL_UNICHIP 0x1a6eU // Global Unichip Corp.
#define UHS_VID_SAGEM_ORGA 0x1a6fU // Sagem Orga GmbH
#define UHS_VID_PHYSIK_INSTRUMENTE 0x1a72U // Physik Instrumente
#define UHS_VID_BAYER_HEALTH_CARE 0x1a79U // Bayer Health Care LLC
#define UHS_VID_LUMBERG_CONNECT_GMBH_AND_CO_KG 0x1a7bU // Lumberg Connect GmbH & Co. KG
#define UHS_VID_EVOLUENT 0x1a7cU // Evoluent
#define UHS_VID_HOLTEK_SEMICONDUCTOR_1 0x1a81U // Holtek Semiconductor, Inc.
#define UHS_VID_QINHENG_ELECTRONICS 0x1a86U // QinHeng Electronics
#define UHS_VID_DYNALITH_SYSTEMS 0x1a89U // Dynalith Systems Co., Ltd.
#define UHS_VID_SGS_TAIWAN 0x1a8bU // SGS Taiwan Ltd.
#define UHS_VID_BANDRICH 0x1a8dU // BandRich, Inc.
#define UHS_VID_LEICA_CAMERA_AG 0x1a98U // Leica Camera AG
#define UHS_VID_DATA_DRIVE_THRU 0x1aa4U // Data Drive Thru, Inc.
#define UHS_VID_UBEACON_TECHNOLOGIES 0x1aa5U // UBeacon Technologies, Inc.
#define UHS_VID_EFORTUNE_TECHNOLOGY 0x1aa6U // eFortune Technology Corp.
#define UHS_VID_KEETOUCH 0x1aadU // KeeTouch
#define UHS_VID_RIGOL_TECHNOLOGIES 0x1ab1U // Rigol Technologies
#define UHS_VID_SALCOMP_PLC 0x1acbU // Salcomp Plc
#define UHS_VID_MIDIPLUS 0x1accU // Midiplus Co, Ltd.
#define UHS_VID_DESAY_WIRE 0x1ad1U // Desay Wire Co., Ltd.
#define UHS_VID_APS 0x1ad4U // APS
#define UHS_VID_SEL_C662_SERIAL_CABLE 0x1adbU // SEL C662 Serial Cable
#define UHS_VID_IC_DESIGN_REINHARD_GOTTINGER 0x1ae4U // ic-design Reinhard Gottinger GmbH
#define UHS_VID_X_TENSIONS 0x1ae7U // X-TENSIONS
#define UHS_VID_HIGH_TOP_PRECISION_ELECTRONIC 0x1aedU // High Top Precision Electronic Co., Ltd.
#define UHS_VID_CONNTECH_ELECTRONIC_SUZHOU_CORPORATION 0x1aefU // Conntech Electronic (Suzhou) Corporation
#define UHS_VID_CONNECT_ONE 0x1af1U // Connect One Ltd.
#define UHS_VID_A_EBERLE_GMBH_AND_CO_KG 0x1afeU // A. Eberle GmbH & Co. KG
#define UHS_VID_MEILHAUS_ELECTRONIC 0x1b04U // Meilhaus Electronic GmbH
#define UHS_VID_BLUTRONICS_SRL 0x1b0eU // BLUTRONICS S.r.l.
#define UHS_VID_CORSAIR 0x1b1cU // Corsair
#define UHS_VID_MSTAR_SEMICONDUCTOR 0x1b20U // MStar Semiconductor, Inc.
#define UHS_VID_WILINX 0x1b22U // WiLinx Corp.
#define UHS_VID_CELLEX_POWER_PRODUCTS 0x1b26U // Cellex Power Products, Inc.
#define UHS_VID_CURRENT_ELECTRONICS 0x1b27U // Current Electronics Inc.
#define UHS_VID_NAVISIS 0x1b28U // NAVIsis Inc.
#define UHS_VID_UGOBE_LIFE_FORMS 0x1b32U // Ugobe Life Forms, Inc.
#define UHS_VID_VIXS_SYSTEMS 0x1b36U // ViXS Systems, Inc.
#define UHS_VID_IPASSION_TECHNOLOGY 0x1b3bU // iPassion Technology Inc.
#define UHS_VID_GENERALPLUS_TECHNOLOGY 0x1b3fU // Generalplus Technology Inc.
#define UHS_VID_ENERGIZER_HOLDINGS 0x1b47U // Energizer Holdings, Inc.
#define UHS_VID_PLASTRON_PRECISION 0x1b48U // Plastron Precision Co., Ltd.
#define UHS_VID_ARH 0x1b52U // ARH Inc.
#define UHS_VID_KS_TERMINALS 0x1b59U // K.S. Terminals Inc.
#define UHS_VID_CHAO_ZHOU_KAI_YUAN_ELECTRIC 0x1b5aU // Chao Zhou Kai Yuan Electric Co., Ltd.
#define UHS_VID_THE_HONG_KONG_STANDARDS_AND_TESTING_CENTRE 0x1b65U // The Hong Kong Standards and Testing Centre Ltd.
#define UHS_VID_FUSHICAI 0x1b71U // Fushicai
#define UHS_VID_ATERGI_TECHNOLOGY 0x1b72U // ATERGI TECHNOLOGY CO., LTD.
#define UHS_VID_FRESCO_LOGIC 0x1b73U // Fresco Logic
#define UHS_VID_OVISLINK 0x1b75U // Ovislink Corp.
#define UHS_VID_LEGEND_SILICON 0x1b76U // Legend Silicon Corp.
#define UHS_VID_AFATECH 0x1b80U // Afatech
#define UHS_VID_DONGGUAN_GUANSHANG_ELECTRONICS 0x1b86U // Dongguan Guanshang Electronics Co., Ltd.
#define UHS_VID_SHENMING_ELECTRON_DONG_GUAN 0x1b88U // ShenMing Electron (Dong Guan) Co., Ltd.
#define UHS_VID_ALTIUM_LIMITED 0x1b8cU // Altium Limited
#define UHS_VID_E_MOVE_TECHNOLOGY 0x1b8dU // e-MOVE Technology Co., Ltd.
#define UHS_VID_AMLOGIC 0x1b8eU // Amlogic, Inc.
#define UHS_VID_MA_LABS 0x1b8fU // MA LABS, Inc.
#define UHS_VID_N_TRIG 0x1b96U // N-Trig
#define UHS_VID_YMAX_COMMUNICATIONS 0x1b98U // YMax Communications Corp.
#define UHS_VID_SHENZHEN_YUANCHUAN_ELECTRONIC 0x1b99U // Shenzhen Yuanchuan Electronic
#define UHS_VID_JINQ_CHERN_ENTERPRISE 0x1ba1U // JINQ CHERN ENTERPRISE CO., LTD.
#define UHS_VID_LITE_METALS_AND_PLASTIC_SHENZHEN 0x1ba2U // Lite Metals & Plastic (Shenzhen) Co., Ltd.
#define UHS_VID_EMBER_CORPORATION 0x1ba4U // Ember Corporation
#define UHS_VID_ABILIS_SYSTEMS 0x1ba6U // Abilis Systems
#define UHS_VID_CHINA_TELECOMMUNICATION_TECHNOLOGY_LABS 0x1ba8U // China Telecommunication Technology Labs
#define UHS_VID_HARMONIX_MUSIC 0x1badU // Harmonix Music
#define UHS_VID_VUZIX_CORPORATION 0x1baeU // Vuzix Corporation
#define UHS_VID_T_AND_A_MOBILE_PHONES 0x1bbbU // T & A Mobile Phones
#define UHS_VID_FORD_MOTOR 0x1bc4U // Ford Motor Co.
#define UHS_VID_AVIXE_TECHNOLOGY_CHINA 0x1bc5U // AVIXE Technology (China) Ltd.
#define UHS_VID_TELIT_WIRELESS_SOLUTIONS 0x1bc7U // Telit Wireless Solutions
#define UHS_VID_CONTAC_CABLE_INDUSTRIAL_LIMITED 0x1bceU // Contac Cable Industrial Limited
#define UHS_VID_SUNPLUS_INNOVATION_TECHNOLOGY 0x1bcfU // Sunplus Innovation Technology Inc.
#define UHS_VID_HANGZHOU_RIYUE_ELECTRONIC 0x1bd0U // Hangzhou Riyue Electronic Co., Ltd.
#define UHS_VID_BG_SYSTEMS 0x1bd5U // BG Systems, Inc.
#define UHS_VID_P_TWO_INDUSTRIES 0x1bdeU // P-TWO INDUSTRIES, INC.
#define UHS_VID_SHENZHEN_TONGYUAN_NETWORK_COMMUNICATION_CABLES 0x1befU // Shenzhen Tongyuan Network-Communication Cables Co., Ltd
#define UHS_VID_REALVISION 0x1bf0U // RealVision Inc.
#define UHS_VID_EXTRANET_SYSTEMS 0x1bf5U // Extranet Systems Inc.
#define UHS_VID_ORIENT_SEMICONDUCTOR_ELECTRONICS 0x1bf6U // Orient Semiconductor Electronics, Ltd.
#define UHS_VID_TOUCHPACK 0x1bfdU // TouchPack
#define UHS_VID_KRETON_CORPORATION 0x1c02U // Kreton Corporation
#define UHS_VID_QNAP_SYSTEM 0x1c04U // QNAP System Inc.
#define UHS_VID_IONICS_EMS 0x1c0cU // Ionics EMS, Inc.
#define UHS_VID_RELM_WIRELESS 0x1c0dU // Relm Wireless
#define UHS_VID_LANTERRA_INDUSTRIAL 0x1c10U // Lanterra Industrial Co., Ltd.
#define UHS_VID_ALECTRONIC_LIMITED 0x1c13U // ALECTRONIC LIMITED
#define UHS_VID_DATEL_ELECTRONICS 0x1c1aU // Datel Electronics Ltd.
#define UHS_VID_VOLKSWAGEN_OF_AMERICA 0x1c1bU // Volkswagen of America, Inc.
#define UHS_VID_GOLDVISH 0x1c1fU // Goldvish S.A.
#define UHS_VID_FUJI_ELECTRIC_DEVICE_TECHNOLOGY 0x1c20U // Fuji Electric Device Technology Co., Ltd.
#define UHS_VID_ADDMM 0x1c21U // ADDMM LLC
#define UHS_VID_ZHONGSHAN_CHIANG_YU_ELECTRIC 0x1c22U // ZHONGSHAN CHIANG YU ELECTRIC CO., LTD.
#define UHS_VID_SHANGHAI_HAIYING_ELECTRONICS 0x1c26U // Shanghai Haiying Electronics Co., Ltd.
#define UHS_VID_HUIYANG_D_AND_S_CABLE 0x1c27U // HuiYang D & S Cable Co., Ltd.
#define UHS_VID_ELSTER 0x1c29U // Elster GmbH
#define UHS_VID_LS_CABLE 0x1c31U // LS Cable Ltd.
#define UHS_VID_SPRINGCARD 0x1c34U // SpringCard
#define UHS_VID_AUTHORIZER_TECHNOLOGIES 0x1c37U // Authorizer Technologies, Inc.
#define UHS_VID_NONIN_MEDICAL 0x1c3dU // NONIN MEDICAL INC.
#define UHS_VID_WEP_PERIPHERALS 0x1c3eU // Wep Peripherals
#define UHS_VID_EZPROTOTYPES 0x1c40U // EZPrototypes
#define UHS_VID_CHERNG_WEEI_TECHNOLOGY 0x1c49U // Cherng Weei Technology Corp.
#define UHS_VID_SIGMA_MICRO 0x1c4fU // SiGma Micro
#define UHS_VID_PHILIPS_AND_LITE_ON_DIGITAL_SOLUTIONS_CORPORATION 0x1c6bU // Philips & Lite-ON Digital Solutions Corporation
#define UHS_VID_SKYDIGITAL 0x1c6cU // Skydigital Inc.
#define UHS_VID_AMT 0x1c73U // AMT
#define UHS_VID_KAETAT_INDUSTRIAL 0x1c77U // Kaetat Industrial Co., Ltd.
#define UHS_VID_DATASCOPE 0x1c78U // Datascope Corp.
#define UHS_VID_UNIGEN_CORPORATION 0x1c79U // Unigen Corporation
#define UHS_VID_LIGHTUNING_TECHNOLOGY 0x1c7aU // LighTuning Technology Inc.
#define UHS_VID_LUXSHARE_PRECISION_INDUSTRY_SHENZHEN 0x1c7bU // LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD.
#define UHS_VID_SCHOMAECKER 0x1c83U // Schomaecker GmbH
#define UHS_VID_2N_TELEKOMUNIKACE_AS 0x1c87U // 2N TELEKOMUNIKACE a.s.
#define UHS_VID_SOMAGIC 0x1c88U // Somagic, Inc.
#define UHS_VID_HONGKONG_WEIDIDA_ELECTRON_LIMITED 0x1c89U // HONGKONG WEIDIDA ELECTRON LIMITED
#define UHS_VID_ASTRON_INTERNATIONAL 0x1c8eU // ASTRON INTERNATIONAL CORP.
#define UHS_VID_ALPINE_ELECTRONICS 0x1c98U // ALPINE ELECTRONICS, INC.
#define UHS_VID_OMEGA_TECHNOLOGY 0x1c9eU // OMEGA TECHNOLOGY
#define UHS_VID_ACCARIO 0x1ca0U // ACCARIO Inc.
#define UHS_VID_SYMWAVE 0x1ca1U // Symwave
#define UHS_VID_KINSTONE 0x1cacU // Kinstone
#define UHS_VID_ACES_ELECTRONIC 0x1cb3U // Aces Electronic Co., Ltd.
#define UHS_VID_OPEX_CORPORATION 0x1cb4U // OPEX CORPORATION
#define UHS_VID_IDEACOM_TECHNOLOGY 0x1cb6U // IdeaCom Technology Inc.
#define UHS_VID_LUMINARY_MICRO 0x1cbeU // Luminary Micro Inc.
#define UHS_VID_FORTAT_SKYMARK_INDUSTRIAL_COMPANY 0x1cbfU // FORTAT SKYMARK INDUSTRIAL COMPANY
#define UHS_VID_PLANTSENSE 0x1cc0U // PlantSense
#define UHS_VID_NEXTWAVE_BROADBAND 0x1ccaU // NextWave Broadband Inc.
#define UHS_VID_BODATONG_TECHNOLOGY_SHENZHEN 0x1ccdU // Bodatong Technology (Shenzhen) Co., Ltd.
#define UHS_VID_ADP_CORPORATION 0x1cd4U // adp corporation
#define UHS_VID_FIRECOMMS 0x1cd5U // Firecomms Ltd.
#define UHS_VID_ANTONIO_PRECISE_PRODUCTS_MANUFACTORY 0x1cd6U // Antonio Precise Products Manufactory Ltd.
#define UHS_VID_TELECOMMUNICATIONS_TECHNOLOGY_ASSOCIATION_TTA 0x1cdeU // Telecommunications Technology Association (TTA)
#define UHS_VID_WONTEN_TECHNOLOGY 0x1cdfU // WonTen Technology Co., Ltd.
#define UHS_VID_EDIMAX_TECHNOLOGY 0x1ce0U // EDIMAX TECHNOLOGY CO., LTD.
#define UHS_VID_AMPHENOL_KAE 0x1ce1U // Amphenol KAE
#define UHS_VID_DRESDEN_ELEKTRONIK 0x1cf1U // Dresden Elektronik
#define UHS_VID_ANDES_TECHNOLOGY_CORPORATION 0x1cfcU // ANDES TECHNOLOGY CORPORATION
#define UHS_VID_FLEXTRONICS_DIGITAL_DESIGN_JAPAN 0x1cfdU // Flextronics Digital Design Japan, LTD.
#define UHS_VID_ICON 0x1d03U // iCON
#define UHS_VID_SOLID_MOTION 0x1d07U // Solid-Motion
#define UHS_VID_NINGBO_HENTEK_DRAGON_ELECTRONICS 0x1d08U // NINGBO HENTEK DRAGON ELECTRONICS CO., LTD.
#define UHS_VID_TECHFAITH_WIRELESS_TECHNOLOGY_LIMITED 0x1d09U // TechFaith Wireless Technology Limited
#define UHS_VID_JOHNSON_CONTROLS_INC_THE_AUTOMOTIVE_BUSINESS_UNIT 0x1d0aU // Johnson Controls, Inc. The Automotive Business Unit
#define UHS_VID_HAN_HUA_CABLE_AND_WIRE_TECHNOLOGY_JX 0x1d0bU // HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD.
#define UHS_VID_SONIX_TECHNOLOGY 0x1d0fU // Sonix Technology Co., Ltd.
#define UHS_VID_ALPHA_SAT_TECHNOLOGY_LIMITED 0x1d14U // ALPHA-SAT TECHNOLOGY LIMITED
#define UHS_VID_C_THRU_MUSIC 0x1d17U // C-Thru Music Ltd.
#define UHS_VID_DEXATEK_TECHNOLOGY 0x1d19U // Dexatek Technology Ltd.
#define UHS_VID_DIOSTECH 0x1d1fU // Diostech Co., Ltd.
#define UHS_VID_SAMTACK 0x1d20U // SAMTACK INC.
#define UHS_VID_ASUS 0x1d27U // ASUS
#define UHS_VID_DREAM_CHEEKY 0x1d34U // Dream Cheeky
#define UHS_VID_TOUCH 0x1d45U // Touch
#define UHS_VID_PEGATRON_CORPORATION 0x1d4dU // PEGATRON CORPORATION
#define UHS_VID_OPENMOKO 0x1d50U // OpenMoko, Inc.
#define UHS_VID_XENTA 0x1d57U // Xenta
#define UHS_VID_SMARTRONIX 0x1d5bU // Smartronix, Inc.
#define UHS_VID_LINUX_FOUNDATION 0x1d6bU // Linux Foundation
#define UHS_VID_CITIZEN 0x1d90U // Citizen
#define UHS_VID_ACTIONS_MICROELECTRONICS 0x1de1U // Actions Microelectronics Co.
#define UHS_VID_QUALCOMM_OPTION 0x1e0eU // Qualcomm / Option
#define UHS_VID_POINT_GREY_RESEARCH 0x1e10U // Point Grey Research, Inc.
#define UHS_VID_MIRION_TECHNOLOGIES_DOSIMETRY_SERVICES_DIVISION 0x1e17U // Mirion Technologies Dosimetry Services Division
#define UHS_VID_LUMENSION_SECURITY 0x1e1dU // Lumension Security
#define UHS_VID_INVIA 0x1e1fU // INVIA
#define UHS_VID_FESTO_AG_AND_CO_KG 0x1e29U // Festo AG & Co. KG
#define UHS_VID_CHIPSBANK_MICROELECTRONICS_1 0x1e3dU // Chipsbank Microelectronics Co., Ltd
#define UHS_VID_CLEVERSCOPE 0x1e41U // Cleverscope
#define UHS_VID_CUBETERNET 0x1e4eU // Cubeternet
#define UHS_VID_TYPEMATRIX 0x1e54U // TypeMatrix
#define UHS_VID_TREKSTOR_GMBH_AND_CO_KG 0x1e68U // TrekStor GmbH & Co. KG
#define UHS_VID_NZXT 0x1e71U // NZXT
#define UHS_VID_COBY_ELECTRONICS_CORPORATION 0x1e74U // Coby Electronics Corporation
#define UHS_VID_ROCCAT 0x1e7dU // ROCCAT
#define UHS_VID_NUCORE_TECHNOLOGY 0x1ebbU // NuCORE Technology, Inc.
#define UHS_VID_AIRTIES_WIRELESS_NETWORKS 0x1edaU // AirTies Wireless Networks
#define UHS_VID_BLACKMAGIC_DESIGN 0x1edbU // Blackmagic design
#define UHS_VID_ONDA_COMMUNICATION_SPA 0x1ee8U // ONDA COMMUNICATION S.p.a.
#define UHS_VID_EADS_DEUTSCHLAND 0x1ef6U // EADS Deutschland GmbH
#define UHS_VID_CAL_COMP 0x1f28U // Cal-Comp
#define UHS_VID_ONDA_UNVERIFIED 0x1f3aU // Onda (unverified)
#define UHS_VID_THE_NEAT_COMPANY 0x1f44U // The Neat Company
#define UHS_VID_H_TRONIC 0x1f48U // H-TRONIC GmbH
#define UHS_VID_G_TEK_ELECTRONICS_GROUP 0x1f4dU // G-Tek Electronics Group
#define UHS_VID_ALIPH 0x1f6fU // Aliph
#define UHS_VID_INNOSTOR_TECHNOLOGY_CORPORATION 0x1f75U // Innostor Technology Corporation
#define UHS_VID_TANDBERG 0x1f82U // TANDBERG
#define UHS_VID_ALERE 0x1f84U // Alere, Inc.
#define UHS_VID_STANTUM 0x1f87U // Stantum
#define UHS_VID_UBIQUITI_NETWORKS 0x1f9bU // Ubiquiti Networks, Inc.
#define UHS_VID_SAMSUNG_OPTO_ELECTRONCS 0x1fabU // Samsung Opto-Electroncs Co., Ltd.
#define UHS_VID_DELPHIN_TECHNOLOGY_AG 0x1fbdU // Delphin Technology AG
#define UHS_VID_NXP_SEMICONDUCTORS 0x1fc9U // NXP Semiconductors
#define UHS_VID_ILX_LIGHTWAVE_CORPORATION 0x1fdeU // ILX Lightwave Corporation
#define UHS_VID_VERTEX_WIRELESS 0x1fe7U // Vertex Wireless Co., Ltd.
#define UHS_VID_CVT_ELECTRONICSCOLTD 0x1ff7U // CVT Electronics.Co.,Ltd
#define UHS_VID_IDEOFY 0x1fffU // Ideofy Inc.
#define UHS_VID_D_LINK 0x2001U // D-Link Corp.
#define UHS_VID_DAP_TECHNOLOGIES 0x2002U // DAP Technologies
#define UHS_VID_DETECTOMAT 0x2003U // detectomat
#define UHS_VID_RELOOP 0x200cU // Reloop
#define UHS_VID_PCTV_SYSTEMS 0x2013U // PCTV Systems
#define UHS_VID_PLANEX_1 0x2019U // PLANEX
#define UHS_VID_ENCORE_ELECTRONICS 0x203dU // Encore Electronics Inc.
#define UHS_VID_HAUPPAUGE 0x2040U // Hauppauge
#define UHS_VID_TEXAS_INSTRUMENTS_2 0x2047U // Texas Instruments
#define UHS_VID_NANO_RIVER_TECHNOLOGY 0x2058U // Nano River Technology
#define UHS_VID_TAICANG_TANDW_ELECTRONICS 0x2077U // Taicang T&W Electronics Co. Ltd
#define UHS_VID_BARNES_AND_NOBLE 0x2080U // Barnes & Noble
#define UHS_VID_SIMPASS 0x2086U // SIMPASS
#define UHS_VID_CANDO 0x2087U // Cando
#define UHS_VID_CLAY_LOGIC 0x20a0U // Clay Logic
#define UHS_VID_XMOS 0x20b1U // XMOS Ltd
#define UHS_VID_HANVON 0x20b3U // Hanvon
#define UHS_VID_QI_HARDWARE 0x20b7U // Qi Hardware
#define UHS_VID_MINICIRCUITS 0x20ceU // Minicircuits
#define UHS_VID_SIMTEC_ELECTRONICS 0x20dfU // Simtec Electronics
#define UHS_VID_NET_NEW_ELECTRONIC_TECHNOLOGY 0x20f1U // NET New Electronic Technology GmbH
#define UHS_VID_TRENDNET_1 0x20f4U // TRENDnet
#define UHS_VID_XIMEA 0x20f7U // XIMEA
#define UHS_VID_RT_SYSTEMS 0x2100U // RT Systems
#define UHS_VID_ACTIONSTAR 0x2101U // ActionStar
#define UHS_VID_VIA_LABS 0x2109U // VIA Labs, Inc.
#define UHS_VID_SOFTKINETIC 0x2113U // Softkinetic
#define UHS_VID_ADVANCED_SILICON 0x2149U // Advanced Silicon S.A.
#define UHS_VID_CREATIVE_UNKNOWN 0x2162U // Creative (?)
#define UHS_VID_GW_INSTEK 0x2184U // GW Instek
#define UHS_VID_EMOTIV_SYSTEMS_PTY 0x21a1U // Emotiv Systems Pty. Ltd.
#define UHS_VID_AGECODAGIS_SARL 0x21d6U // Agecodagis SARL
#define UHS_VID_MACALLY_1 0x2222U // MacAlly
#define UHS_VID_SAMWOO_ENTERPRISE 0x2227U // SAMWOO Enterprise
#define UHS_VID_SILICON_MOTION_1 0x2232U // Silicon Motion
#define UHS_VID_RADIOSHACK_CORPORATION 0x2233U // RadioShack Corporation
#define UHS_VID_KOBO 0x2237U // Kobo Inc.
#define UHS_VID_MORPHO 0x225dU // Morpho
#define UHS_VID_8D_TECHNOLOGIES 0x228dU // 8D Technologies inc.
#define UHS_VID_PIE_DIGITAL 0x22a6U // Pie Digital, Inc.
#define UHS_VID_MOTOROLA_PCS 0x22b8U // Motorola PCS
#define UHS_VID_ETURBOTOUCH_TECHNOLOGY 0x22b9U // eTurboTouch Technology, Inc.
#define UHS_VID_TECHNOLOGY_INNOVATION_HOLDINGS 0x22baU // Technology Innovation Holdings, Ltd
#define UHS_VID_PINNACLE_SYSTEMS_1 0x2304U // Pinnacle Systems, Inc.
#define UHS_VID_SHINING_TECHNOLOGIES_INC_HEX_ 0x2318U // Shining Technologies, Inc. [hex]
#define UHS_VID_ARDUINO 0x2341U // Arduino SA
#define UHS_VID_PUMATRONIX_LTDA 0x2373U // Pumatronix Ltda
#define UHS_VID_DIGITALWAY_1 0x2375U // Digit@lway, Inc.
#define UHS_VID_SANHO_DIGITAL_ELECTRONICS 0x2406U // SANHO Digital Electronics Co., Ltd.
#define UHS_VID_AESSENT_TECHNOLOGY 0x2443U // Aessent Technology Ltd
#define UHS_VID_TRIPP_LITE_1 0x2478U // Tripp-Lite
#define UHS_VID_MAXXTER 0x248aU // Maxxter
#define UHS_VID_M2TECH_SRL 0x249cU // M2Tech s.r.l.
#define UHS_VID_PARATRONIC 0x24e1U // Paratronic
#define UHS_VID_TWINMOS_1 0x2632U // TwinMOS
#define UHS_VID_XSENS 0x2639U // Xsens
#define UHS_VID_ELECTRONICS_FOR_IMAGING_INC_HEX_ 0x2650U // Electronics For Imaging, Inc. [hex]
#define UHS_VID_SUNDTEK 0x2659U // Sundtek
#define UHS_VID_BASLER_AG 0x2676U // Basler AG
#define UHS_VID_CITIZEN_1 0x2730U // Citizen
#define UHS_VID_DIGITALWAY_2 0x2735U // DigitalWay
#define UHS_VID_NHJ 0x2770U // NHJ, Ltd
#define UHS_VID_THINGM 0x27b8U // ThingM
#define UHS_VID_ASUSTEK_COMPUTER_1 0x2821U // ASUSTek Computer Inc.
#define UHS_VID_TOPTRONIC_INDUSTRIAL 0x2899U // Toptronic Industrial Co., Ltd
#define UHS_VID_DRACALRAPHNET_TECHNOLOGIES 0x289bU // Dracal/Raphnet technologies
#define UHS_VID_JOLLA_OY 0x2931U // Jolla Oy
#define UHS_VID_DOG_HUNTER_AG 0x2a03U // dog hunter AG
#define UHS_VID_RTD_EMBEDDED_TECHNOLOGIES 0x2a37U // RTD Embedded Technologies, Inc.
#define UHS_VID_MEIZU 0x2a45U // Meizu Corp.
#define UHS_VID_PLANEX_COMMUNICATIONS_2 0x2c02U // Planex Communications
#define UHS_VID_DOLPHIN_PERIPHERALS 0x2c1aU // Dolphin Peripherals
#define UHS_VID_FUJITSU_1 0x2fb2U // Fujitsu, Ltd
#define UHS_VID_EAGLETRON_1 0x3125U // Eagletron
#define UHS_VID_NAVINI_NETWORKS 0x3136U // Navini Networks
#define UHS_VID_WHANAM_ELECTRONICS 0x3176U // Whanam Electronics Co., Ltd
#define UHS_VID_LINK_INSTRUMENTS 0x3195U // Link Instruments
#define UHS_VID_VIDZMEDIA_PTE 0x3275U // VidzMedia Pte Ltd
#define UHS_VID_INLINE 0x3333U // InLine
#define UHS_VID_AEI 0x3334U // AEI
#define UHS_VID_YAKUMO 0x3340U // Yakumo
#define UHS_VID_LEAGUER_MICROELECTRONICS_LME 0x3344U // Leaguer Microelectronics (LME)
#define UHS_VID_MICRO_STAR 0x3504U // Micro Star
#define UHS_VID_POWER_QUOTIENT_INTERNATIONAL_1 0x3538U // Power Quotient International Co., Ltd
#define UHS_VID_DIVA 0x3579U // DIVA
#define UHS_VID_SHARKOON 0x357dU // Sharkoon
#define UHS_VID_INVIBRO 0x3636U // InVibro
#define UHS_VID_WEM 0x3838U // WEM
#define UHS_VID_NATIONAL_INSTRUMENTS 0x3923U // National Instruments Corp.
#define UHS_VID_I_O_DATA 0x40bbU // I-O Data
#define UHS_VID_I_ROCKS 0x4101U // i-rocks
#define UHS_VID_IRIVER_1 0x4102U // iRiver, Ltd.
#define UHS_VID_DELL_COMPUTER_1 0x413cU // Dell Computer Corp.
#define UHS_VID_USBEST_TECHNOLOGY 0x4146U // USBest Technology
#define UHS_VID_TARGUS 0x4168U // Targus
#define UHS_VID_USB_DESIGN_BY_EXAMPLE 0x4242U // USB Design by Example
#define UHS_VID_GOPRO 0x4255U // GoPro
#define UHS_VID_BROADCOM_1 0x4317U // Broadcom Corp.
#define UHS_VID_WINCHIPHEAD 0x4348U // WinChipHead
#define UHS_VID_SHUTTLE_2 0x4572U // Shuttle, Inc.
#define UHS_VID_PANRAM 0x4586U // Panram
#define UHS_VID_EMS_PRODUCTION 0x4670U // EMS Production
#define UHS_VID_MIDITECH 0x4752U // Miditech
#define UHS_VID_GW_INSTEK_1 0x4757U // GW Instek
#define UHS_VID_ACEECA 0x4766U // Aceeca
#define UHS_VID_MEMOREX 0x4855U // Memorex
#define UHS_VID_SIMPLETECH 0x4971U // SimpleTech
#define UHS_VID_MUSICAL_FIDELITY 0x4d46U // Musical Fidelity
#define UHS_VID_GRANDTEC 0x5032U // Grandtec
#define UHS_VID_LINKSYS_UNKNOWN 0x5041U // Linksys (?)
#define UHS_VID_AVERATEC_UNKNOWN 0x50c2U // Averatec (?)
#define UHS_VID_SWEEX_1 0x5173U // Sweex
#define UHS_VID_I_TETRA 0x5219U // I-Tetra
#define UHS_VID_OWON 0x5345U // Owon
#define UHS_VID_SATOSHILABS 0x534cU // SatoshiLabs
#define UHS_VID_MEYER_INSTRUMENTS_MIS_1 0x5354U // Meyer Instruments (MIS)
#define UHS_VID_TRANSMETA 0x544dU // Transmeta Corp.
#define UHS_VID_UC_LOGIC_TECHNOLOGY 0x5543U // UC-Logic Technology Corp.
#define UHS_VID_EPIPHAN_SYSTEMS 0x5555U // Epiphan Systems Inc.
#define UHS_VID_ONSPEC_ELECTRONIC 0x55aaU // OnSpec Electronic, Inc.
#define UHS_VID_GOTVIEW 0x5654U // Gotview
#define UHS_VID_UNI_TREND_GROUP_LIMITED 0x5656U // Uni-Trend Group Limited
#define UHS_VID_IRTOUCHSYSTEMS 0x595aU // IRTOUCHSYSTEMS Co. Ltd.
#define UHS_VID_ACER_2 0x5986U // Acer, Inc
#define UHS_VID_NONOLITH_LABS 0x59e3U // Nonolith Labs
#define UHS_VID_ZINWELL 0x5a57U // Zinwell
#define UHS_VID_BEHOLDER_INTERNATIONAL 0x6000U // Beholder International Ltd.
#define UHS_VID_INGENIC_SEMICONDUCTOR 0x601aU // Ingenic Semiconductor Ltd.
#define UHS_VID_SITECOM 0x6189U // Sitecom
#define UHS_VID_LIGHTINGSOFT_AG 0x6244U // LightingSoft AG
#define UHS_VID_TWINHAN_TECHNOLOGY 0x6253U // TwinHan Technology Co., Ltd
#define UHS_VID_CORELOGIC 0x636cU // CoreLogic, Inc.
#define UHS_VID_UNKNOWN_SONY_UNKNOWN 0x6472U // Unknown (Sony?)
#define UHS_VID_ARKMICRO_TECHNOLOGIES_1 0x6547U // Arkmicro Technologies Inc.
#define UHS_VID_IRTOUCHSYSTEMS_1 0x6615U // IRTOUCHSYSTEMS Co. Ltd.
#define UHS_VID_PROTOTYPE_PRODUCT_VENDOR_ID 0x6666U // Prototype product Vendor ID
#define UHS_VID_WISEGROUP 0x6677U // WiseGroup, Ltd.
#define UHS_VID_3COM_1 0x6891U // 3Com
#define UHS_VID_OPERA1 0x695cU // Opera1
#define UHS_VID_YEALINK_NETWORK_TECHNOLOGY 0x6993U // Yealink Network Technology Co., Ltd.
#define UHS_VID_SHANGHAI_JUJO_ELECTRONICS 0x6a75U // Shanghai Jujo Electronics Co., Ltd
#define UHS_VID_CME_CENTRAL_MUSIC 0x7104U // CME (Central Music Co.)
#define UHS_VID_STACKFOUNDRY 0x726cU // StackFoundry LLC
#define UHS_VID_TBS_TECHNOLOGIES_CHINA 0x734cU // TBS Technologies China
#define UHS_VID_BEIJING_STONE_TECHNOLOGY 0x7373U // Beijing STONE Technology Co. Ltd.
#define UHS_VID_EDIMAX_TECHNOLOGY_1 0x7392U // Edimax Technology Co., Ltd
#define UHS_VID_INTEL_1 0x8086U // Intel Corp.
#define UHS_VID_INTEL_2 0x8087U // Intel Corp.
#define UHS_VID_VIRTUALBOX 0x80eeU // VirtualBox
#define UHS_VID_KEIO 0x8282U // Keio
#define UHS_VID_EGO_SYSTEMS_1 0x8341U // EGO Systems, Inc.
#define UHS_VID_TRANSCEND_INFORMATION_1 0x8564U // Transcend Information, Inc.
#define UHS_VID_INTENSO_GMBG 0x8644U // Intenso GmbG
#define UHS_VID_CH_PRODUCTS_1 0x8e06U // CH Products, Inc.
#define UHS_VID_SITECOM_1 0x9016U // Sitecom
#define UHS_VID_TEVII_TECHNOLOGY 0x9022U // TeVii Technology Ltd.
#define UHS_VID_GEOLAB 0x9148U // GeoLab, Ltd
#define UHS_VID_MOSCHIP_SEMICONDUCTOR 0x9710U // MosChip Semiconductor
#define UHS_VID_BESTMEDIA_CD_RECORDABLE_GMBH_AND_CO_KG 0x9849U // Bestmedia CD Recordable GmbH & Co. KG
#define UHS_VID_ODEON 0x9999U // Odeon
#define UHS_VID_GRANDTEC_1 0x99faU // Grandtec
#define UHS_VID_J_WESTHUES 0x9ac4U // J. Westhues
#define UHS_VID_MARVELL_SEMICONDUCTOR_1 0x9e88U // Marvell Semiconductor, Inc.
#define UHS_VID_ANMO_ELECTRONICS_CORP_DINO_LITE_UNKNOWN 0xa128U // AnMo Electronics Corp. / Dino-Lite (?)
#define UHS_VID_ANMO_ELECTRONICS_CORPORATION 0xa168U // AnMo Electronics Corporation
#define UHS_VID_ASIX 0xa600U // Asix
#define UHS_VID_3COM_2 0xa727U // 3Com
#define UHS_VID_MXT 0xaaaaU // MXT
#define UHS_VID_UNKNOWN_3 0xabcdU // Unknown
#define UHS_VID_BLUE_MICROPHONES 0xb58eU // Blue Microphones
#define UHS_VID_CARD_DEVICE_EXPERT 0xc216U // Card Device Expert Co., LTD
#define UHS_VID_KEIL_SOFTWARE_1 0xc251U // Keil Software, Inc.
#define UHS_VID_CACE_TECHNOLOGIES 0xcaceU // CACE Technologies Inc.
#define UHS_VID_SMART_TECHNOLOGY_INDUSTRIAL 0xcd12U // SMART TECHNOLOGY INDUSTRIAL LTD.
#define UHS_VID_ULTIMARC 0xd208U // Ultimarc
#define UHS_VID_ULTIMARC_1 0xd209U // Ultimarc
#define UHS_VID_LOGILINK 0xd904U // LogiLink
#define UHS_VID_XORCOM 0xe4e4U // Xorcom Ltd.
#define UHS_VID_MAKINGTHINGS 0xeb03U // MakingThings
#define UHS_VID_EMPIA_TECHNOLOGY 0xeb1aU // eMPIA Technology, Inc.
#define UHS_VID_KWORLD 0xeb2aU // KWorld
#define UHS_VID_SMART_TECHNOLOGY_INDUSTRIAL_1 0xef18U // SMART TECHNOLOGY INDUSTRIAL LTD.
#define UHS_VID_HEWLETT_PACKARD_1 0xf003U // Hewlett Packard
#define UHS_VID_LEAP_MOTION 0xf182U // Leap Motion
#define UHS_VID_ATTEN_ELECTRONICS_SIGLENT_TECHNOLOGIES 0xf4ecU // Atten Electronics / Siglent Technologies
#define UHS_VID_SHENZHEN_SIGLENT 0xf4edU // Shenzhen Siglent Co., Ltd.
#define UHS_VID_HAMA_1 0xf766U // Hama
#define UHS_VID_CONRAD_ELECTRONIC_SE 0xfc08U // Conrad Electronic SE
#define UHS_VID_FNK_TECH 0xffeeU // FNK Tech
#endif

View file

@ -0,0 +1,336 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(_UHS_host_h_) || defined(USBCORE_H)
#error "Never include UHS_UsbCore.h directly; include UHS_Host.h instead"
#else
#define USBCORE_H
#ifndef UHS_HOST_MAX_INTERFACE_DRIVERS
#define UHS_HOST_MAX_INTERFACE_DRIVERS 0x10U // Default maximum number of USB interface drivers
#endif
#if !defined(SYSTEM_OR_SPECIAL_YIELD)
#define SYSTEM_OR_SPECIAL_YIELD(...) VOID0
#endif
#if !defined(SYSTEM_OR_SPECIAL_YIELD_FROM_ISR)
#define SYSTEM_OR_SPECIAL_YIELD_FROM_ISR(...) SYSTEM_OR_SPECIAL_YIELD
#endif
// As we make extensions to a target interface add to UHS_HOST_MAX_INTERFACE_DRIVERS
// This offset gets calculated for supporting wide subclasses, such as HID, BT, etc.
#define UHS_HID_INDEX (UHS_HOST_MAX_INTERFACE_DRIVERS + 1)
/* Common setup data constant combinations */
//get descriptor request type
#define UHS_bmREQ_GET_DESCR (USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE)
//set request type for all but 'set feature' and 'set interface'
#define UHS_bmREQ_SET (USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE)
//get interface request type
#define UHS_bmREQ_CL_GET_INTF (USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE)
// D7 data transfer direction (0 - host-to-device, 1 - device-to-host)
// D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved)
// D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved)
// TO-DO: Use the python script to generate these.
// TO-DO: Add _all_ subclasses here.
// USB Device Classes, Subclasses and Protocols
////////////////////////////////////////////////////////////////////////////////
// Use Class Info in the Interface Descriptors
#define UHS_USB_CLASS_USE_CLASS_INFO 0x00U
////////////////////////////////////////////////////////////////////////////////
// Audio
#define UHS_USB_CLASS_AUDIO 0x01U
// Subclasses
#define UHS_USB_SUBCLASS_AUDIOCONTROL 0x01U
#define UHS_USB_SUBCLASS_AUDIOSTREAMING 0x02U
#define UHS_USB_SUBCLASS_MIDISTREAMING 0x03U
////////////////////////////////////////////////////////////////////////////////
// Communications and CDC Control
#define UHS_USB_CLASS_COM_AND_CDC_CTRL 0x02U
////////////////////////////////////////////////////////////////////////////////
// HID
#define UHS_USB_CLASS_HID 0x03U
// Subclasses
#define UHS_HID_BOOT_SUBCLASS 0x01U
// Protocols
#define UHS_HID_PROTOCOL_HIDBOOT_KEYBOARD 0x01U
#define UHS_HID_PROTOCOL_HIDBOOT_MOUSE 0x02U
////////////////////////////////////////////////////////////////////////////////
// Physical
#define UHS_USB_CLASS_PHYSICAL 0x05U
////////////////////////////////////////////////////////////////////////////////
// Image
#define UHS_USB_CLASS_IMAGE 0x06U
////////////////////////////////////////////////////////////////////////////////
// Printer
#define UHS_USB_CLASS_PRINTER 0x07U
////////////////////////////////////////////////////////////////////////////////
// Mass Storage
#define UHS_USB_CLASS_MASS_STORAGE 0x08
// Subclasses
#define UHS_BULK_SUBCLASS_SCSI_NOT_REPORTED 0x00U // De facto use
#define UHS_BULK_SUBCLASS_RBC 0x01U
#define UHS_BULK_SUBCLASS_ATAPI 0x02U // MMC-5 (ATAPI)
#define UHS_BULK_SUBCLASS_OBSOLETE1 0x03U // Was QIC-157
#define UHS_BULK_SUBCLASS_UFI 0x04U // Specifies how to interface Floppy Disk Drives to USB
#define UHS_BULK_SUBCLASS_OBSOLETE2 0x05U // Was SFF-8070i
#define UHS_BULK_SUBCLASS_SCSI 0x06U // SCSI Transparent Command Set
#define UHS_BULK_SUBCLASS_LSDFS 0x07U // Specifies how host has to negotiate access before trying SCSI
#define UHS_BULK_SUBCLASS_IEEE1667 0x08U
// Protocols
#define UHS_STOR_PROTO_CBI 0x00U // CBI (with command completion interrupt)
#define UHS_STOR_PROTO_CBI_NO_INT 0x01U // CBI (without command completion interrupt)
#define UHS_STOR_PROTO_OBSOLETE 0x02U
#define UHS_STOR_PROTO_BBB 0x50U // Bulk Only Transport
#define UHS_STOR_PROTO_UAS 0x62U
////////////////////////////////////////////////////////////////////////////////
// Hub
#define UHS_USB_CLASS_HUB 0x09U
////////////////////////////////////////////////////////////////////////////////
// CDC-Data
#define UHS_USB_CLASS_CDC_DATA 0x0AU
////////////////////////////////////////////////////////////////////////////////
// Smart-Card
#define UHS_USB_CLASS_SMART_CARD 0x0BU
////////////////////////////////////////////////////////////////////////////////
// Content Security
#define UHS_USB_CLASS_CONTENT_SECURITY 0x0DU
////////////////////////////////////////////////////////////////////////////////
// Video
#define UHS_USB_CLASS_VIDEO 0x0EU
////////////////////////////////////////////////////////////////////////////////
// Personal Healthcare
#define UHS_USB_CLASS_PERSONAL_HEALTH 0x0FU
////////////////////////////////////////////////////////////////////////////////
// Diagnostic Device
#define UHS_USB_CLASS_DIAGNOSTIC_DEVICE 0xDCU
////////////////////////////////////////////////////////////////////////////////
// Wireless Controller
#define UHS_USB_CLASS_WIRELESS_CTRL 0xE0U
////////////////////////////////////////////////////////////////////////////////
// Miscellaneous
#define UHS_USB_CLASS_MISC 0xEFU
////////////////////////////////////////////////////////////////////////////////
// Application Specific
#define UHS_USB_CLASS_APP_SPECIFIC 0xFEU
////////////////////////////////////////////////////////////////////////////////
// Vendor Specific
#define UHS_USB_CLASS_VENDOR_SPECIFIC 0xFFU
////////////////////////////////////////////////////////////////////////////////
/* USB state machine states */
#define UHS_USB_HOST_STATE_MASK 0xF0U
// Configure states, MSN == 0 --------------------------V
#define UHS_USB_HOST_STATE_DETACHED 0x00U
#define UHS_USB_HOST_STATE_DEBOUNCE 0x01U
#define UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE 0x02U
#define UHS_USB_HOST_STATE_RESET_NOT_COMPLETE 0x03U
#define UHS_USB_HOST_STATE_WAIT_SOF 0x04U
#define UHS_USB_HOST_STATE_WAIT_BUS_READY 0x05U
#define UHS_USB_HOST_STATE_RESET_DEVICE 0x0AU
#define UHS_USB_HOST_STATE_CONFIGURING 0x0CU // Looks like "CO"nfig (backwards)
#define UHS_USB_HOST_STATE_CONFIGURING_DONE 0x0DU // Looks like "DO"one (backwards)
#define UHS_USB_HOST_STATE_CHECK 0x0EU
#define UHS_USB_HOST_STATE_ILLEGAL 0x0FU // Foo
// Run states, MSN != 0 --------------------------------V
#define UHS_USB_HOST_STATE_RUNNING 0x60U // Looks like "GO"
#define UHS_USB_HOST_STATE_IDLE 0x1DU // Looks like "ID"le
#define UHS_USB_HOST_STATE_ERROR 0xF0U // Looks like "FO"o
#define UHS_USB_HOST_STATE_INITIALIZE 0x10U // Looks like "I"nit
// Host SE result codes.
// Common SE results are stored in the low nybble, all interface drivers understand these plus 0x1f.
// Extended SE results are 0x10-0x1e. SE code only understands these internal to the hardware.
// Values > 0x1F are driver or other internal error conditions.
// Return these result codes from your host controller driver to match the error condition
// ALL Non-zero values are errors.
// Values not listed in this table are not handled in the base class, or any host driver.
#define UHS_HOST_ERROR_NONE 0x00U // No error
#define UHS_HOST_ERROR_BUSY 0x01U // transfer pending
#define UHS_HOST_ERROR_BADREQ 0x02U // Transfer Launch Request was bad
#define UHS_HOST_ERROR_DMA 0x03U // DMA was too short, or too long
#define UHS_HOST_ERROR_NAK 0x04U // Peripheral returned NAK
#define UHS_HOST_ERROR_STALL 0x05U // Peripheral returned STALL
#define UHS_HOST_ERROR_TOGERR 0x06U // Toggle error/ISO over-underrun
#define UHS_HOST_ERROR_WRONGPID 0x07U // Received wrong Packet ID
#define UHS_HOST_ERROR_BADBC 0x08U // Byte count is bad
#define UHS_HOST_ERROR_PIDERR 0x09U // Received Packet ID is corrupted
#define UHS_HOST_ERROR_BADRQ 0x0AU // Packet error. Increase max packet.
#define UHS_HOST_ERROR_CRC 0x0BU // USB CRC was incorrect
#define UHS_HOST_ERROR_KERR 0x0CU // K-state instead of response, usually indicates wrong speed
#define UHS_HOST_ERROR_JERR 0x0DU // J-state instead of response, usually indicates wrong speed
#define UHS_HOST_ERROR_TIMEOUT 0x0EU // Device did not respond in time
#define UHS_HOST_ERROR_BABBLE 0x0FU // Line noise/unexpected data
#define UHS_HOST_ERROR_MEM_LAT 0x10U // Error caused by memory latency.
#define UHS_HOST_ERROR_NYET 0x11U // OUT transfer accepted with NYET
// Addressing error codes
#define ADDR_ERROR_INVALID_INDEX 0xA0U
#define ADDR_ERROR_INVALID_ADDRESS 0xA1U
// Common Interface Driver error codes
#define UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED 0xD1U // Driver doesn't support the device or interfaces
#define UHS_HOST_ERROR_DEVICE_INIT_INCOMPLETE 0xD2U // Init partially finished, but died.
#define UHS_HOST_ERROR_CANT_REGISTER_DEVICE_CLASS 0xD3U // There was no driver for the interface requested.
#define UHS_HOST_ERROR_ADDRESS_POOL_FULL 0xD4U // No addresses left in the address pool.
#define UHS_HOST_ERROR_HUB_ADDRESS_OVERFLOW 0xD5U // No hub addresses left. The maximum is 7.
#define UHS_HOST_ERROR_NO_ADDRESS_IN_POOL 0xD6U // Address was not allocated in the pool, thus not found.
#define UHS_HOST_ERROR_NULL_EPINFO 0xD7U // The supplied endpoint was NULL, indicates a bug or other problem.
#define UHS_HOST_ERROR_BAD_ARGUMENT 0xD8U // Indicates a range violation bug.
#define UHS_HOST_ERROR_DEVICE_DRIVER_BUSY 0xD9U // The interface driver is busy or out buffer is full, try again later.
#define UHS_HOST_ERROR_BAD_MAX_PACKET_SIZE 0xDAU // The maximum packet size was exceeded. Try again with smaller size.
#define UHS_HOST_ERROR_NO_ENDPOINT_IN_TABLE 0xDBU // The endpoint could not be found in the endpoint table.
#define UHS_HOST_ERROR_UNPLUGGED 0xDEU // Someone removed the USB device, or Vbus was turned off.
#define UHS_HOST_ERROR_NOMEM 0xDFU // Out Of Memory.
// Control request stream errors
#define UHS_HOST_ERROR_FailGetDevDescr 0xE1U
#define UHS_HOST_ERROR_FailSetDevTblEntry 0xE2U
#define UHS_HOST_ERROR_FailGetConfDescr 0xE3U
#define UHS_HOST_ERROR_END_OF_STREAM 0xEFU
// Host base class specific Error codes
#define UHS_HOST_ERROR_NOT_IMPLEMENTED 0xFEU
#define UHS_HOST_ERROR_TRANSFER_TIMEOUT 0xFFU
// SEI interaction defaults
#define UHS_HOST_TRANSFER_MAX_MS 10000 // USB transfer timeout in ms, per section 9.2.6.1 of USB 2.0 spec
#define UHS_HOST_TRANSFER_RETRY_MAXIMUM 3 // 3 retry limit for a transfer
#define UHS_HOST_DEBOUNCE_DELAY_MS 500 // settle delay in milliseconds
#define UHS_HUB_RESET_DELAY_MS 20 // hub port reset delay, 10ms recomended, but can be up to 20ms
//
// We only provide the minimum needed information for enumeration.
// Interface drivers should be able to set up what is needed with nothing more.
// A driver needs to know the following information:
// 1: address on the USB network, parent and port (aka UsbDeviceAddress)
// 2: endpoints
// 3: vid:pid, class, subclass, protocol
//
struct ENDPOINT_INFO {
uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN).
uint8_t bmAttributes; // Endpoint transfer type.
uint16_t wMaxPacketSize; // Maximum packet size.
uint8_t bInterval; // Polling interval in frames.
} __attribute__((packed));
struct INTERFACE_INFO {
uint8_t bInterfaceNumber;
uint8_t bAlternateSetting;
uint8_t numep;
uint8_t klass;
uint8_t subklass;
uint8_t protocol;
ENDPOINT_INFO epInfo[16];
} __attribute__((packed));
struct ENUMERATION_INFO {
uint16_t vid;
uint16_t pid;
uint16_t bcdDevice;
uint8_t klass;
uint8_t subklass;
uint8_t protocol;
uint8_t bMaxPacketSize0;
uint8_t currentconfig;
uint8_t parent;
uint8_t port;
uint8_t address;
INTERFACE_INFO interface;
} __attribute__((packed));
/* USB Setup Packet Structure */
typedef struct {
// offset description
// 0 Bit-map of request type
union {
uint8_t bmRequestType;
struct {
uint8_t recipient : 5; // Recipient of the request
uint8_t type : 2; // Type of request
uint8_t direction : 1; // Direction of data transfer
} __attribute__((packed));
} ReqType_u;
// 1 Request
uint8_t bRequest;
// 2 Depends on bRequest
union {
uint16_t wValue;
struct {
uint8_t wValueLo;
uint8_t wValueHi;
} __attribute__((packed));
} wVal_u;
// 4 Depends on bRequest
uint16_t wIndex;
// 6 Depends on bRequest
uint16_t wLength;
// 8 bytes total
} __attribute__((packed)) SETUP_PKT, *PSETUP_PKT;
// little endian :-) 8 8 8 8 16 16
#define mkSETUP_PKT8(bmReqType, bRequest, wValLo, wValHi, wInd, total) ((uint64_t)(((uint64_t)(bmReqType)))|(((uint64_t)(bRequest))<<8)|(((uint64_t)(wValLo))<<16)|(((uint64_t)(wValHi))<<24)|(((uint64_t)(wInd))<<32)|(((uint64_t)(total)<<48)))
#define mkSETUP_PKT16(bmReqType, bRequest, wVal, wInd, total) ((uint64_t)(((uint64_t)(bmReqType)))|(((uint64_t)(bRequest))<<8)|(((uint64_t)(wVal ))<<16) |(((uint64_t)(wInd))<<32)|(((uint64_t)(total)<<48)))
// Big endian -- but we aren't able to use this :-/
//#define mkSETUP_PKT8(bmReqType, bRequest, wValLo, wValHi, wInd, total) ((uint64_t)(((uint64_t)(bmReqType))<<56)|(((uint64_t)(bRequest))<<48)|(((uint64_t)(wValLo))<<40)|(((uint64_t)(wValHi))<<32)|(((uint64_t)(wInd))<<16)|((uint64_t)(total)))
//#define mkSETUP_PKT16(bmReqType, bRequest, wVal, wInd, total) ((uint64_t)(((uint64_t)(bmReqType))<<56)|(((uint64_t)(bRequest))<<48) |(((uint64_t)(wVal))<<32) |(((uint64_t)(wInd))<<16)|((uint64_t)(total)))
#endif /* USBCORE_H */

View file

@ -0,0 +1,248 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(_UHS_host_h_) || defined(__ADDRESS_H__)
#error "Never include UHS_address.h directly; include UHS_Usb.h instead"
#else
#define __ADDRESS_H__
/* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */
/* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */
#define UHS_USB_NAK_MAX_POWER 14 // NAK binary order maximum value
#define UHS_USB_NAK_DEFAULT 13 // default 16K-1 NAKs before giving up
#define UHS_USB_NAK_NOWAIT 1 // Single NAK stops transfer
#define UHS_USB_NAK_NONAK 0 // Do not count NAKs, stop retrying after USB Timeout. Try not to use this.
#define bmUSB_DEV_ADDR_PORT 0x07
#define bmUSB_DEV_ADDR_PARENT 0x78
#define bmUSB_DEV_ADDR_HUB 0x40
// TODO: embed parent?
struct UHS_EpInfo {
uint8_t epAddr; // Endpoint address
uint8_t bIface;
uint16_t maxPktSize; // Maximum packet size
union {
uint8_t epAttribs;
struct {
uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise
uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise
uint8_t bmNeedPing : 1; // 1 == ping protocol needed for next out packet
uint8_t bmNakPower : 5; // Binary order for NAK_LIMIT value
} __attribute__((packed));
};
} __attribute__((packed));
// TODO: embed parent address and port into epinfo struct,
// and nuke this address stupidity.
// This is a compact scheme. Should also support full spec.
// This produces a 7 hub limit, 49 devices + 7 hubs, 56 total.
//
// 7 6 5 4 3 2 1 0
// ---------------------------------
// | | H | P | P | P | A | A | A |
// ---------------------------------
//
// H - if 1 the address is a hub address
// P - parent hub number
// A - port number of parent
//
struct UHS_DeviceAddress {
union {
struct {
uint8_t bmAddress : 3; // port number
uint8_t bmParent : 3; // parent hub address
uint8_t bmHub : 1; // hub flag
uint8_t bmReserved : 1; // reserved, must be zero
} __attribute__((packed));
uint8_t devAddress;
};
} __attribute__((packed));
struct UHS_Device {
volatile UHS_EpInfo *epinfo[UHS_HOST_MAX_INTERFACE_DRIVERS]; // endpoint info pointer
UHS_DeviceAddress address;
uint8_t epcount; // number of endpoints
uint8_t speed; // indicates device speed
} __attribute__((packed));
typedef void (*UsbDeviceHandleFunc)(UHS_Device *pdev);
class AddressPool {
UHS_EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device
// In order to avoid hub address duplication, this should use bits
uint8_t hubCounter; // hub counter
UHS_Device thePool[UHS_HOST_MAX_INTERFACE_DRIVERS];
// Initializes address pool entry
void UHS_NI InitEntry(uint8_t index) {
thePool[index].address.devAddress = 0;
thePool[index].epcount = 1;
thePool[index].speed = 0;
for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) {
thePool[index].epinfo[i] = &dev0ep;
}
};
// Returns thePool index for a given address
uint8_t UHS_NI FindAddressIndex(uint8_t address = 0) {
for(uint8_t i = 1; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) {
if(thePool[i].address.devAddress == address)
return i;
}
return 0;
};
// Returns thePool child index for a given parent
uint8_t UHS_NI FindChildIndex(UHS_DeviceAddress addr, uint8_t start = 1) {
for(uint8_t i = (start < 1 || start >= UHS_HOST_MAX_INTERFACE_DRIVERS) ? 1 : start; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) {
if(thePool[i].address.bmParent == addr.bmAddress)
return i;
}
return 0;
};
// Frees address entry specified by index parameter
void UHS_NI FreeAddressByIndex(uint8_t index) {
// Zero field is reserved and should not be affected
if(index == 0)
return;
UHS_DeviceAddress uda = thePool[index].address;
// If a hub was switched off all port addresses should be freed
if(uda.bmHub == 1) {
for(uint8_t i = 1; (i = FindChildIndex(uda, i));)
FreeAddressByIndex(i);
// FIXME: use BIT MASKS
// If the hub had the last allocated address, hubCounter should be decremented
if(hubCounter == uda.bmAddress)
hubCounter--;
}
InitEntry(index);
}
void InitAllAddresses(void) {
for(uint8_t i = 1; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) InitEntry(i);
hubCounter = 0;
};
public:
AddressPool() {
hubCounter = 0;
// Zero address is reserved
InitEntry(0);
thePool[0].epinfo[0] = &dev0ep;
dev0ep.epAddr = 0;
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
dev0ep.maxPktSize = 0x40; //starting at 0x40 and work down
#else
dev0ep.maxPktSize = 0x08;
#endif
dev0ep.epAttribs = 0; //set DATA0/1 toggles to 0
dev0ep.bmNakPower = UHS_USB_NAK_MAX_POWER;
InitAllAddresses();
};
// Returns a pointer to a specified address entry
UHS_Device* UHS_NI GetUsbDevicePtr(uint8_t addr) {
if(!addr)
return thePool;
uint8_t index = FindAddressIndex(addr);
return (!index) ? NULL : &thePool[index];
};
// Allocates new address
uint8_t UHS_NI AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 1) {
/* if (parent != 0 && port == 0)
USB_HOST_SERIAL.println("PRT:0"); */
UHS_DeviceAddress _parent;
_parent.devAddress = parent;
if(_parent.bmReserved || port > 7)
//if(parent > 127 || port > 7)
return 0;
// FIXME: use BIT MASKS
if(is_hub && hubCounter == 7)
return 0;
// finds first empty address entry starting from one
uint8_t index = FindAddressIndex(0);
if(!index) // if empty entry is not found
return 0;
UHS_DeviceAddress addr;
addr.devAddress = port;
addr.bmParent = _parent.bmAddress;
// FIXME: use BIT MASKS
if(is_hub) {
hubCounter++;
addr.bmHub = 1;
addr.bmAddress = hubCounter;
}
thePool[index].address = addr;
#if DEBUG_PRINTF_EXTRA_HUGE
#if defined(UHS_DEBUG_USB_ADDRESS)
printf("Address: %x (%x.%x.%x)\r\n", addr.devAddress, addr.bmHub, addr.bmParent, addr.bmAddress);
#endif
#endif
return thePool[index].address.devAddress;
};
void UHS_NI FreeAddress(uint8_t addr) {
// if the root hub is disconnected all the addresses should be initialized
if(addr == 0x41) {
InitAllAddresses();
return;
}
uint8_t index = FindAddressIndex(addr);
FreeAddressByIndex(index);
};
};
#endif // __ADDRESS_H__

View file

@ -0,0 +1,70 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(_usb_h_) || defined(__HEXDUMP_H__)
#error "Never include UHS_hexdump.h directly; include UHS_Usb.h instead"
#else
#define __HEXDUMP_H__
extern int UsbDEBUGlvl;
template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
class HexDumper : public BASE_CLASS {
uint8_t byteCount;
OFFSET_TYPE byteTotal;
public:
HexDumper() : byteCount(0), byteTotal(0) {
};
void Initialize(void) {
byteCount = 0;
byteTotal = 0;
};
virtual void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset);
};
template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
void HexDumper<BASE_CLASS, LEN_TYPE, OFFSET_TYPE>::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset) {
if(UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug.
for(LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) {
if(!byteCount) {
PrintHex<OFFSET_TYPE > (byteTotal, 0x80);
E_Notify(PSTR(": "), 0x80);
}
PrintHex<uint8_t > (pbuf[j], 0x80);
E_Notify(PSTR(" "), 0x80);
if(byteCount == 15) {
E_Notify(PSTR("\r\n"), 0x80);
byteCount = 0xFF;
}
}
}
}
#endif // __HEXDUMP_H__

View file

@ -0,0 +1,111 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
/* USB functions */
#ifndef _UHS_host_h_
#define _UHS_host_h_
// WARNING: Do not change the order of includes, or stuff will break!
#include <inttypes.h>
#include <stddef.h>
#include <stdio.h>
#include <stdint.h>
#if DISABLED(USE_UHS3_USB)
#include <ISR_safe_memory.h>
#include <Wire.h>
#include <SPI.h>
#include <UHS_ByteBuffer.h>
#endif
#include "UHS_macros.h"
// None of these should ever be directly included by a driver, or a user's sketch.
#include "../dyn_SWI/dyn_SWI.h"
#include "UHS_USB_IDs.h"
#include "UHS_settings.h"
#include "UHS_usb_ch9.h"
#include "UHS_UsbCore.h"
#include "UHS_address.h"
#include "UHS_usbhost.h"
#include "UHS_printhex.h"
#include "UHS_message.h"
// Load system components as required
#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_LOADED)
#include "UHS_util_INLINE.h"
#include "UHS_host_INLINE.h"
#include "UHS_printf_HELPER.h"
#if defined(LOAD_USB_HOST_SHIELD)
#include "USB_HOST_SHIELD/USB_HOST_SHIELD.h"
#endif
#if defined(LOAD_UHS_KINETIS_FS_HOST) && !defined(UHS_KINETIS_FS_HOST_LOADED)
#include "UHS_KINETIS_FS_HOST/UHS_KINETIS_FS_HOST.h"
#endif
#if defined(LOAD_UHS_KINETIS_EHCI) && !defined(UHS_KINETIS_EHCI_LOADED)
#include "UHS_KINETIS_EHCI/UHS_KINETIS_EHCI.h"
#endif
// Load USB drivers and multiplexers
#if defined(LOAD_UHS_HUB)
#include "UHS_HUB/UHS_HUB.h"
#endif // HUB loaded
#if defined(LOAD_UHS_BULK_STORAGE)
#include "UHS_BULK_STORAGE/UHS_BULK_STORAGE.h"
#endif
#if defined(LOAD_GENERIC_STORAGE)
#include "../UHS_FS/UHS_FS.h"
#endif
// Add BT and optionally HID if directed to do so
#if defined(LOAD_UHS_BT)
#include "UHS_BT/UHS_BT.h"
#endif // BT and optionally HID loaded
// Add HID
#if defined(LOAD_UHS_HID)
#include "UHS_HID/UHS_HID.h"
#endif // HID loaded
// Add CDC multiplexers (currently only ACM)
#if defined(LOAD_UHS_CDC_ACM) || defined(LOAD_UHS_CDC_ACM_FTDI) || defined(LOAD_UHS_CDC_ACM_PROLIFIC) || defined(LOAD_UHS_CDC_ACM_XR21B1411)
#include "UHS_CDC/UHS_CDC.h"
#endif // CDC loaded
#if defined(LOAD_UHS_ADK)
#include "UHS_ADK/UHS_ADK.h"
#endif
#if defined(LOAD_UHS_MIDI)
#include "UHS_MIDI/UHS_MIDI.h"
#endif
#endif // System code loaded
#endif // _UHS_host_h_

View file

@ -0,0 +1,1224 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_LOADED)
#define USB_HOST_SYSTEM_LOADED
#ifndef DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST
#define DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST 0
#endif
#if DEBUG_PRINTF_EXTRA_HUGE
#if DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST
#define HOST_DEBUG(...) printf(__VA_ARGS__)
#else
#define HOST_DEBUG(...) VOID0
#endif
#else
#define HOST_DEBUG(...) VOID0
#endif
UHS_EpInfo* UHS_USB_HOST_BASE::getEpInfoEntry(uint8_t addr, uint8_t ep) {
UHS_Device *p = addrPool.GetUsbDevicePtr(addr);
if(!p || !p->epinfo)
return NULL;
UHS_EpInfo *pep;
for(uint8_t j = 0; j < UHS_HOST_MAX_INTERFACE_DRIVERS; j++) {
pep = (UHS_EpInfo *)(p->epinfo[j]);
for(uint8_t i = 0; i < p->epcount; i++) {
if((pep)->epAddr == ep) {
HOST_DEBUG("ep entry for interface %d ep %d max packet size = %d\r\n", pep->bIface, ep, pep->maxPktSize);
return pep;
}
pep++;
}
}
return NULL;
}
/**
* Sets a device table entry for a device.
* Each device is different and has different number of endpoints.
* This function plugs endpoint record structure, defined in application, to devtable
*
* @param addr device address
* @param epcount how many endpoints
* @param eprecord pointer to the endpoint structure
* @return Zero for success, or error code
*/
uint8_t UHS_USB_HOST_BASE::setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t epcount, volatile UHS_EpInfo* eprecord) {
if(!eprecord)
return UHS_HOST_ERROR_BAD_ARGUMENT;
UHS_Device *p = addrPool.GetUsbDevicePtr(addr);
if(!p)
return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL;
p->address.devAddress = addr;
p->epinfo[iface] = eprecord;
p->epcount = epcount;
return 0;
}
/**
* sets all enpoint addresses to zero.
* Sets all max packet sizes to defaults
* Clears all endpoint attributes
* Sets bmNakPower to USB_NAK_DEFAULT
* Sets binterface to zero.
* Sets bNumEP to zero.
* Sets bAddress to zero.
* Clears qNextPollTime and sets bPollEnable to false.
*
* @param maxep How many endpoints to initialize
* @param device pointer to the device driver instance (this)
*
*/
void UHS_USB_HOST_BASE::DeviceDefaults(uint8_t maxep, UHS_USBInterface *interface) {
for(uint8_t i = 0; i < maxep; i++) {
interface->epInfo[i].epAddr = 0;
interface->epInfo[i].maxPktSize = (i) ? 0 : 8;
interface->epInfo[i].epAttribs = 0;
interface->epInfo[i].bmNakPower = UHS_USB_NAK_DEFAULT;
}
interface->pUsb->GetAddressPool()->FreeAddress(interface->bAddress);
interface->bIface = 0;
interface->bNumEP = 1;
interface->bAddress = 0;
interface->qNextPollTime = 0;
interface->bPollEnable = false;
}
/**
* Perform a bus reset to the port of the connected device
*
* @param parent index to Parent
* @param port what port on the parent
* @param address address of the device
* @return Zero for success, or error code
*/
uint8_t UHS_USB_HOST_BASE::doSoftReset(uint8_t parent, uint8_t port, uint8_t address) {
uint8_t rcode = 0;
if(parent == 0) {
// Send a bus reset on the root interface.
doHostReset();
} else {
// reset parent port
devConfig[parent]->ResetHubPort(port);
}
//
// Many devices require a delay before setting the address here...
// We loop upon fails for up to 2 seconds instead.
// Most devices will be happy without a retry.
//
uint8_t retries = 0;
if(address) {
do {
rcode = setAddr(0, address);
if(!rcode) break;
retries++;
sof_delay(10);
} while(retries < 200);
HOST_DEBUG("%i retries.\r\n", retries);
} else {
#if DEBUG_PRINTF_EXTRA_HUGE
printf("\r\ndoSoftReset called with address == 0.\r\n");
#endif
}
return rcode;
}
/*
* Pseudo code so you may understand the code flow.
*
* reset; (happens at the lower level)
* GetDevDescr();
* reset;
* If there are no configuration descriptors {
* //
* // Note: I know of no device that does this.
* // I suppose there could be one though.
* //
* try to enumerate.
* } else {
* last success count = 0
* best config = 0
* for each configuration descriptor {
* for each interface descriptor {
* get the endpoint descriptors for this interface.
* Check to see if a driver can handle this interface.
* If it can, add 1 to the success count.
* }
* if success count > last success count {
* best config = current config
* last success count = success count
* }
* }
* set the device config to the best config
* for each best config interface descriptor {
* initialize driver that can handle this interface config
* }
* }
*
* NOTES:
* 1: We do not need to save toggle states anymore and have not
* needed to for some time, because the lower level driver
* actually corrects wrong toggles on-the-fly for us.
*
* 2: We always do a second reset, since this stupid bug is
* actually part of the specification documents that I
* have found all over the net. Even Linux does it, and
* many devices actually EXPECT this behavior. Some devices
* will not enumerate without it. For devices that do not
* need it, the additional reset is harmless. Here is an
* example of one of these documents, see page Five:
* http://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf
*
*
*/
/**
* Enumerates interfaces on devices
*
* @param parent index to Parent
* @param port what port on the parent
* @param speed the speed of the device
* @return Zero for success, or error code
*/
uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t speed) {
//uint8_t bAddress = 0;
HOST_DEBUG("\r\n\r\n\r\nConfiguring: parent = %i, port = %i, speed = %i\r\n", parent, port, speed);
uint8_t rcode = 0;
uint8_t retries = 0;
uint8_t numinf = 0;
uint8_t configs;
UHS_Device *p = NULL;
//EpInfo epInfo; // cap at 16, this should be fairly reasonable.
ENUMERATION_INFO ei;
uint8_t bestconf = 0;
uint8_t bestsuccess = 0;
uint8_t devConfigIndex;
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
const uint8_t biggest = 0x40;
// wrap in {} to throw away the 64 byte buffer when we are done with it
{
uint8_t buf[biggest];
USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR *>(buf);
#else
const uint8_t biggest = 18;
uint8_t buf[biggest];
USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR *>(buf);
USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
#endif
//for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) {
// if((devConfig[devConfigIndex]->bAddress) && (!devConfig[devConfigIndex]->bPollEnable)) {
// devConfig[devConfigIndex]->bAddress = 0;
// }
//}
// Serial.print("HOST USB Host @ 0x");
// Serial.println((uint32_t)this, HEX);
// Serial.print("HOST USB Host Address Pool @ 0x");
// Serial.println((uint32_t)GetAddressPool(), HEX);
sof_delay(200);
p = addrPool.GetUsbDevicePtr(0);
if(!p) {
HOST_DEBUG("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n");
return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL;
}
p->speed = speed;
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
p->epinfo[0][0].maxPktSize = 0x40; // Windows bug is expected.
// poison data
// udd->bMaxPacketSize0 = 0U;
#else
p->epinfo[0][0].maxPktSize = 0x08; // USB Spec, start small, work your way up.
#endif
again:
memset((void *)buf, 0, biggest);
HOST_DEBUG("\r\n\r\nConfiguring PktSize 0x%2.2x, rcode: 0x%2.2x, retries %i,\r\n", p->epinfo[0][0].maxPktSize, rcode, retries);
rcode = getDevDescr(0, biggest, (uint8_t*)buf);
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
if(rcode || udd->bMaxPacketSize0 < 8)
#else
if(rcode)
#endif
{
if(rcode == UHS_HOST_ERROR_JERR && retries < 4) {
//
// Some devices return JERR when plugged in.
// Attempts to reinitialize the device usually works.
//
// I have a hub that will refuse to work and acts like
// this unless external power is supplied.
// So this may not always work, and you may be fooled.
//
sof_delay(100);
retries++;
goto again;
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
} else if(((rcode == UHS_HOST_ERROR_DMA || rcode == UHS_HOST_ERROR_MEM_LAT) && retries < 4) || (udd->bMaxPacketSize0 < 8 && !rcode)) {
if(p->epinfo[0][0].maxPktSize > 8 && rcode == UHS_HOST_ERROR_DMA) p->epinfo[0][0].maxPktSize = p->epinfo[0][0].maxPktSize >> 1;
#else
} else if((rcode == UHS_HOST_ERROR_DMA || rcode == UHS_HOST_ERROR_MEM_LAT) && retries < 4) {
if(p->epinfo[0][0].maxPktSize < 32) p->epinfo[0][0].maxPktSize = p->epinfo[0][0].maxPktSize << 1;
#endif
HOST_DEBUG("Configuring error: 0x%2.2x UHS_HOST_ERROR_DMA. Retry with maxPktSize: %i\r\n", rcode, p->epinfo[0][0].maxPktSize);
doSoftReset(parent, port, 0);
retries++;
sof_delay(200);
goto again;
}
HOST_DEBUG("Configuring error: 0x%2.2x Can't get USB_DEVICE_DESCRIPTOR\r\n", rcode);
return rcode;
}
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
ei.address = addrPool.AllocAddress(parent, false, port);
if(!ei.address) {
return UHS_HOST_ERROR_ADDRESS_POOL_FULL;
}
p = addrPool.GetUsbDevicePtr(ei.address);
// set to 1 if you suspect address table corruption.
#if 0
if(!p) {
return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL;
}
#endif
p->speed = speed;
rcode = doSoftReset(parent, port, ei.address);
if(rcode) {
addrPool.FreeAddress(ei.address);
HOST_DEBUG("Configuring error: %2.2x Can't set USB INTERFACE ADDRESS\r\n", rcode);
return rcode;
}
{ // the { } wrapper saves on stack.
HOST_DEBUG("DevDescr 2nd poll, bMaxPacketSize0:%u\r\n", udd->bMaxPacketSize0);
UHS_EpInfo dev1ep;
dev1ep.maxPktSize = udd->bMaxPacketSize0;
dev1ep.epAddr = 0;
dev1ep.epAttribs = 0;
dev1ep.bmNakPower = UHS_USB_NAK_MAX_POWER;
p->address.devAddress = ei.address;
p->epcount = 1;
p->epinfo[0] = &dev1ep;
sof_delay(10);
memset((void *)buf, 0, biggest);
rcode = getDevDescr(ei.address, 18, (uint8_t*)buf);
if(rcode) HOST_DEBUG("getDevDescr err: 0x%x \r\n", rcode);
addrPool.FreeAddress(ei.address);
if(rcode && rcode != UHS_HOST_ERROR_DMA) {
return rcode;
}
sof_delay(10);
}
#endif
ei.vid = udd->idVendor;
ei.pid = udd->idProduct;
ei.bcdDevice = udd->bcdDevice;
ei.klass = udd->bDeviceClass;
ei.subklass = udd->bDeviceSubClass;
ei.protocol = udd->bDeviceProtocol;
ei.bMaxPacketSize0 = udd->bMaxPacketSize0;
ei.currentconfig = 0;
ei.parent = parent;
ei.port = port;
configs = udd->bNumConfigurations;
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
} // unwrapped, old large buf now invalid and discarded.
uint8_t buf[18];
USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
#endif
ei.address = addrPool.AllocAddress(parent, IsHub(ei.klass), port);
if(!ei.address) {
return UHS_HOST_ERROR_ADDRESS_POOL_FULL;
}
p = addrPool.GetUsbDevicePtr(ei.address);
// set to 1 if you suspect address table corruption.
#if 0
if(!p) {
return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL;
}
#endif
p->speed = speed;
rcode = doSoftReset(parent, port, ei.address);
if(rcode) {
addrPool.FreeAddress(ei.address);
HOST_DEBUG("Configuring error: %2.2x Can't set USB INTERFACE ADDRESS\r\n", rcode);
return rcode;
}
if(configs < 1) {
HOST_DEBUG("No interfaces?!\r\n");
addrPool.FreeAddress(ei.address);
// rcode = TestInterface(&ei);
// Not implemented (yet)
rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED;
} else {
HOST_DEBUG("configs: %i\r\n", configs);
for(uint8_t conf = 0; (!rcode) && (conf < configs); conf++) {
// read the config descriptor into a buffer.
rcode = getConfDescr(ei.address, sizeof (USB_CONFIGURATION_DESCRIPTOR), conf, buf);
if(rcode) {
HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR\r\n", rcode);
rcode = UHS_HOST_ERROR_FailGetConfDescr;
continue;
}
ei.currentconfig = conf;
numinf = ucd->bNumInterfaces; // Does _not_ include alternates!
HOST_DEBUG("CONFIGURATION: %i, bNumInterfaces %i, wTotalLength %i\r\n", conf, numinf, ucd->wTotalLength);
uint8_t success = 0;
uint16_t inf = 0;
uint8_t data[ei.bMaxPacketSize0];
UHS_EpInfo *pep;
pep = ctrlReqOpen(ei.address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei.currentconfig, USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data);
if(!pep) {
rcode = UHS_HOST_ERROR_NULL_EPINFO;
continue;
}
uint16_t left;
uint16_t read;
uint8_t offset;
rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset);
if(rcode) {
HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode);
break;
}
for(; (numinf) && (!rcode); inf++) {
// iterate for each interface on this config
rcode = getNextInterface(&ei, pep, data, &left, &read, &offset);
if(rcode == UHS_HOST_ERROR_END_OF_STREAM) {
HOST_DEBUG("USB_INTERFACE END OF STREAM\r\n");
ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei.bMaxPacketSize0, data);
rcode = 0;
break;
}
if(rcode) {
HOST_DEBUG("Configuring error: %2.2x Can't close USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode);
continue;
}
rcode = TestInterface(&ei);
if(!rcode) success++;
rcode = 0;
}
if(!inf) {
rcode = TestInterface(&ei);
if(!rcode) success++;
rcode = 0;
}
if(success > bestsuccess) {
bestconf = conf;
bestsuccess = success;
}
}
if(!bestsuccess) rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED;
}
if(!rcode) {
rcode = getConfDescr(ei.address, sizeof (USB_CONFIGURATION_DESCRIPTOR), bestconf, buf);
if(rcode) {
HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR\r\n", rcode);
rcode = UHS_HOST_ERROR_FailGetConfDescr;
}
}
if(!rcode) {
bestconf++;
ei.currentconfig = bestconf;
numinf = ucd->bNumInterfaces; // Does _not_ include alternates!
HOST_DEBUG("CONFIGURATION: %i, bNumInterfaces %i, wTotalLength %i\r\n", bestconf, numinf, ucd->wTotalLength);
if(!rcode) {
HOST_DEBUG("Best configuration is %i, enumerating interfaces.\r\n", bestconf);
uint16_t inf = 0;
uint8_t data[ei.bMaxPacketSize0];
UHS_EpInfo *pep;
pep = ctrlReqOpen(ei.address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei.currentconfig - 1, USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data);
if(!pep) {
rcode = UHS_HOST_ERROR_NULL_EPINFO;
} else {
uint16_t left;
uint16_t read;
uint8_t offset;
rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset);
if(rcode) {
HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode);
} else {
for(; (numinf) && (!rcode); inf++) {
// iterate for each interface on this config
rcode = getNextInterface(&ei, pep, data, &left, &read, &offset);
if(rcode == UHS_HOST_ERROR_END_OF_STREAM) {
ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei.bMaxPacketSize0, data);
rcode = 0;
break;
}
if(rcode) {
HOST_DEBUG("Configuring error: %2.2x Can't close USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode);
continue;
}
if(enumerateInterface(&ei) == UHS_HOST_MAX_INTERFACE_DRIVERS) {
HOST_DEBUG("No interface driver for this interface.");
} else {
HOST_DEBUG("Interface Configured\r\n");
}
}
}
}
} else {
HOST_DEBUG("Configuring error: %2.2x Can't set USB_INTERFACE_CONFIG stream.\r\n", rcode);
}
}
if(!rcode) {
rcode = setConf(ei.address, bestconf);
if(rcode) {
HOST_DEBUG("Configuring error: %2.2x Can't set Configuration.\r\n", rcode);
addrPool.FreeAddress(ei.address);
} else {
for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) {
HOST_DEBUG("Driver %i ", devConfigIndex);
if(!devConfig[devConfigIndex]) {
HOST_DEBUG("no driver at this index.\r\n");
continue; // no driver
}
HOST_DEBUG("@ %2.2x ", devConfig[devConfigIndex]->bAddress);
if(devConfig[devConfigIndex]->bAddress) {
if(!devConfig[devConfigIndex]->bPollEnable) {
HOST_DEBUG("Initialize\r\n");
rcode = devConfig[devConfigIndex]->Finalize();
rcode = devConfig[devConfigIndex]->Start();
if(!rcode) {
HOST_DEBUG("Total endpoints = (%i)%i\r\n", p->epcount, devConfig[devConfigIndex]->bNumEP);
} else {
break;
}
} else {
HOST_DEBUG("Already initialized.\r\n");
continue; // consumed
}
} else {
HOST_DEBUG("Skipped\r\n");
}
}
#if 0 // defined(UHS_HID_LOADED)
// Now do HID
#endif
}
} else {
addrPool.FreeAddress(ei.address);
}
return rcode;
}
/**
* Removes a device from the tables
*
* @param addr address of the device
* @return nothing
*/
void UHS_USB_HOST_BASE::ReleaseDevice(uint8_t addr) {
if(addr) {
#if 0 // defined(UHS_HID_LOADED)
// Release any HID children
UHS_HID_Release(this, addr);
#endif
for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) {
if(!devConfig[i]) continue;
if(devConfig[i]->bAddress == addr) {
devConfig[i]->Release();
break;
}
}
}
}
/**
* Gets the device descriptor, or part of it from endpoint Zero.
*
* @param addr Address of the device
* @param nbytes how many bytes to return
* @param dataptr pointer to the data to return
* @return status of the request, zero is success.
*/
uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr) {
return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes), nbytes, dataptr));
}
/**
* Gets the config descriptor, or part of it from endpoint Zero.
*
* @param addr Address of the device
* @param nbytes how many bytes to return
* @param conf index to descriptor to return
* @param dataptr ointer to the data to return
* @return status of the request, zero is success.
*/
uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes), nbytes, dataptr));
}
/**
* Get the string descriptor from a device
*
* @param addr Address of the device
* @param ns
* @param index
* @param langid language ID
* @param dataptr pointer to the data to return
* @return status of the request, zero is success.
*/
uint8_t UHS_USB_HOST_BASE::getStrDescr(uint8_t addr, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns), ns, dataptr));
}
//
//set address
//
/**
* Set the address of a device to a new address via endpoint Zero.
*
* @param oldaddr current address
* @param newaddr new address
* @return status of the request, zero is success.
*/
uint8_t UHS_USB_HOST_BASE::setAddr(uint8_t oldaddr, uint8_t newaddr) {
uint8_t rcode = ctrlReq(oldaddr, mkSETUP_PKT8(UHS_bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000), 0x0000, NULL);
sof_delay(300); // Older spec says you should wait at least 200ms
return rcode;
}
//
//set configuration
//
/**
* Set the configuration for the device to use via endpoint Zero.
*
* @param addr Address of the device
* @param conf_value configuration index value
* @return status of the request, zero is success.
*/
uint8_t UHS_USB_HOST_BASE::setConf(uint8_t addr, uint8_t conf_value) {
return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000), 0x0000, NULL));
}
/* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */
/**
* Writes data to an interface pipe
*
* @param addr Address of the device
* @param ep Endpoint of the pipe
* @param nbytes number of bytes to transfer
* @param data pointer to buffer to hold transfer
* @return zero for success or error code
*/
uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) {
UHS_EpInfo *pep = NULL;
uint16_t nak_limit = 0;
HOST_DEBUG("outTransfer: addr: 0x%2.2x ep: 0x%2.2x nbytes: 0x%4.4x data: 0x%p\r\n", addr, ep, nbytes, data);
uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit);
HOST_DEBUG("outTransfer: SetAddress 0x%2.2x\r\n", rcode);
if(!rcode)
rcode = OutTransfer(pep, nak_limit, nbytes, data);
return rcode;
};
/**
* Reads data from an interface pipe
*
* @param addr Address of the device
* @param ep Endpoint of the pipe
* @param nbytesptr number of bytes to transfer
* @param data pointer to buffer to hold transfer
* @return zero for success or error code
*/
uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data) {
UHS_EpInfo *pep = NULL;
uint16_t nak_limit = 0;
uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit);
// if(rcode) {
// USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81);
// USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81);
// USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81);
// return rcode;
// }
if(!rcode)
rcode = InTransfer(pep, nak_limit, nbytesptr, data);
return rcode;
}
/**
* Initialize the descriptor stream, works much like opening a file.
*
* @param ei
* @param ucd
* @param pep
* @param data
* @param left
* @param read
* @param offset
* @return zero for success or error code
*/
uint8_t UHS_USB_HOST_BASE::initDescrStream(ENUMERATION_INFO *ei, USB_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset) {
if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT;
if(!pep) return UHS_HOST_ERROR_NULL_EPINFO;
*left = ucd->wTotalLength;
*read = 0;
*offset = 1;
uint8_t rcode;
pep->maxPktSize = ei->bMaxPacketSize0;
rcode = getone(pep, left, read, data, offset);
return rcode;
}
uint8_t UHS_USB_HOST_BASE::getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset) {
uint16_t remain;
uint8_t ty;
uint8_t rcode = UHS_HOST_ERROR_END_OF_STREAM;
uint8_t *ptr;
uint8_t epc = 0;
ei->interface.numep = 0;
ei->interface.klass = 0;
ei->interface.subklass = 0;
ei->interface.protocol = 0;
while(*left + *read) {
remain = data[*offset]; // bLength
while(remain < 2) {
rcode = getone(pep, left, read, data, offset);
if(rcode)
return rcode;
remain = data[*offset];
}
rcode = getone(pep, left, read, data, offset);
if(rcode)
return rcode;
ty = data[*offset]; // bDescriptorType
HOST_DEBUG("bLength: %i ", remain);
HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty);
remain--;
if(ty == USB_DESCRIPTOR_INTERFACE) {
HOST_DEBUG("INTERFACE DESCRIPTOR FOUND\r\n");
ptr = (uint8_t *)(&(ei->interface.bInterfaceNumber));
for(int i = 0; i < 6; i++) {
rcode = getone(pep, left, read, data, offset);
if(rcode)
return rcode;
*ptr = data[*offset];
ptr++;
}
rcode = getone(pep, left, read, data, offset);
if(rcode)
return rcode;
// Now at iInterface
// Get endpoints.
HOST_DEBUG("Getting %i endpoints\r\n", ei->interface.numep);
while(epc < ei->interface.numep) {
rcode = getone(pep, left, read, data, offset);
if(rcode) {
HOST_DEBUG("ENDPOINT DESCRIPTOR DIED WAY EARLY\r\n");
return rcode;
}
remain = data[*offset]; // bLength
while(remain < 2) {
rcode = getone(pep, left, read, data, offset);
if(rcode)
return rcode;
remain = data[*offset];
}
rcode = getone(pep, left, read, data, offset);
if(rcode) {
HOST_DEBUG("ENDPOINT DESCRIPTOR DIED EARLY\r\n");
return rcode;
}
ty = data[*offset]; // bDescriptorType
HOST_DEBUG("bLength: %i ", remain);
HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty);
remain -= 2;
if(ty == USB_DESCRIPTOR_ENDPOINT) {
HOST_DEBUG("ENDPOINT DESCRIPTOR: %i\r\n", epc);
ptr = (uint8_t *)(&(ei->interface.epInfo[epc].bEndpointAddress));
for(unsigned int i = 0; i< sizeof (ENDPOINT_INFO); i++) {
rcode = getone(pep, left, read, data, offset);
if(rcode) {
HOST_DEBUG("ENDPOINT DESCRIPTOR DIED LATE\r\n");
return rcode;
}
*ptr = data[*offset];
ptr++;
remain--;
}
epc++;
HOST_DEBUG("ENDPOINT DESCRIPTOR OK\r\n");
}
rcode = eat(pep, left, read, data, offset, &remain);
if(rcode) {
HOST_DEBUG("ENDPOINT DESCRIPTOR DIED EATING\r\n");
return rcode;
}
remain = 0;
}
remain = 1;
// queue ahead, but do not report if error.
rcode = eat(pep, left, read, data, offset, &remain);
if(!ei->interface.numep && rcode) {
return rcode;
}
HOST_DEBUG("ENDPOINT DESCRIPTORS FILLED\r\n");
return 0;
} else {
rcode = eat(pep, left, read, data, offset, &remain);
if(rcode)
return rcode;
}
rcode = UHS_HOST_ERROR_END_OF_STREAM;
}
return rcode;
}
uint8_t UHS_USB_HOST_BASE::seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_CONFIGURATION_DESCRIPTOR *ucd) {
if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT;
uint8_t data[ei->bMaxPacketSize0];
UHS_EpInfo *pep;
pep = ctrlReqOpen(ei->address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei->currentconfig,
USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data);
if(!pep) return UHS_HOST_ERROR_NULL_EPINFO;
uint16_t left = ucd->wTotalLength;
uint8_t cinf = 0;
uint8_t ty;
uint8_t epc = 0;
uint16_t remain = ucd->bLength;
uint16_t read = 0;
uint8_t offset = remain;
uint8_t *ptr;
uint8_t rcode;
ei->interface.numep = 0;
ei->interface.klass = 0;
ei->interface.subklass = 0;
ei->interface.protocol = 0;
pep->maxPktSize = ei->bMaxPacketSize0;
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
HOST_DEBUG("\r\nGetting interface: %i\r\n", inf);
inf++;
while(cinf != inf && (left + read)) {
//HOST_DEBUG("getInterface: cinf: %i inf: %i left: %i read: %i offset: %i remain %i\r\n", cinf, inf, left, read, offset, remain);
// Go past current descriptor
HOST_DEBUG("Skip: %i\r\n", remain);
rcode = eat(pep, &left, &read, data, &offset, &remain);
if(rcode)
return rcode;
remain = data[offset]; // bLength
while(remain < 2) {
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
remain = data[offset];
}
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
ty = data[offset]; // bDescriptorType
HOST_DEBUG("bLength: %i ", remain);
HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty);
remain--;
if(ty == USB_DESCRIPTOR_INTERFACE) {
HOST_DEBUG("INTERFACE DESCRIPTOR: %i\r\n", cinf);
cinf++;
if(cinf == inf) {
// Get the interface descriptor information.
ptr = (uint8_t *)(&(ei->interface.bInterfaceNumber));
for(int i = 0; i < 6; i++) {
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
*ptr = data[offset];
ptr++;
}
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
// Now at iInterface
remain = 0;
// Get endpoints.
HOST_DEBUG("Getting %i endpoints\r\n", ei->interface.numep);
while(epc < ei->interface.numep) {
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
remain = data[offset]; // bLength
while(remain < 2) {
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
remain = data[offset];
}
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
ty = data[offset]; // bDescriptorType
HOST_DEBUG("bLength: %i ", remain);
HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty);
remain--;
if(ty == USB_DESCRIPTOR_ENDPOINT) {
HOST_DEBUG("ENDPOINT DESCRIPTOR: %i\r\n", epc);
ptr = (uint8_t *)(&(ei->interface.epInfo[epc].bEndpointAddress));
for(unsigned int i = 0; i< sizeof (ENDPOINT_INFO); i++) {
rcode = getone(pep, &left, &read, data, &offset);
if(rcode)
return rcode;
*ptr = data[offset];
ptr++;
}
epc++;
remain = 0;
} else {
rcode = eat(pep, &left, &read, data, &offset, &remain);
if(rcode)
return rcode;
remain = 0;
}
}
}
}
}
return ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei->bMaxPacketSize0, data);
}
uint8_t UHS_USB_HOST_BASE::getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset) {
uint8_t rcode = 0;
*offset += 1;
if(*offset < *read) {
return 0;
} else if(*left > 0) {
// uint16_t num = *left;
uint16_t num = pep->maxPktSize;
if(num > *left) num = *left;
*offset = 0;
rcode = ctrlReqRead(pep, left, read, num, dataptr);
if(rcode == 0) {
if(*read == 0) {
rcode = UHS_HOST_ERROR_END_OF_STREAM;
} else if(*read < num) *left = 0;
}
} else {
rcode = UHS_HOST_ERROR_END_OF_STREAM;
}
return rcode;
}
uint8_t UHS_USB_HOST_BASE::eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum) {
uint8_t rcode = 0;
HOST_DEBUG("eating %i\r\n", *yum);
while(*yum) {
*yum -= 1;
rcode = getone(pep, left, read, dataptr, offset);
if(rcode) break;
}
return rcode;
}
uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr) {
//bool direction = bmReqType & 0x80; //request direction, IN or OUT
uint8_t rcode = 0;
// Serial.println("");
UHS_EpInfo *pep = ctrlReqOpen(addr, Request, dataptr);
if(!pep) {
HOST_DEBUG("ctrlReq1: ERROR_NULL_EPINFO addr: %d\r\n", addr);
return UHS_HOST_ERROR_NULL_EPINFO;
}
uint8_t rt = (uint8_t)(Request & 0xFFU);
// Serial.println("Opened");
uint16_t left = (uint16_t)(Request >> 48) /*total*/;
if(dataptr != NULL) {
//data stage
if((rt & 0x80) == 0x80) {
//IN transfer
while(left) {
// Bytes read into buffer
uint16_t read = nbytes;
HOST_DEBUG("ctrlReq2: left: %i, read:%i, nbytes %i\r\n", left, read, nbytes);
rcode = ctrlReqRead(pep, &left, &read, nbytes, dataptr);
#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE
HOST_DEBUG("RESULT: 0x%2.2x 0x%2.2x 0x%2.2x 0x%8.8lx%8.8lx\r\n", rcode, addr, read, (uint32_t)((Request>>32)&0xfffffffflu), (uint32_t)(Request&0xfffffffflu));
// Should only be used for GET_DESCRIPTOR USB_DESCRIPTOR_DEVICE
constexpr uint32_t req_match = ((uint32_t)USB_DESCRIPTOR_DEVICE << 24) |
((uint32_t)USB_REQUEST_GET_DESCRIPTOR << 8);
const uint32_t req_found = Request & 0xFF00FF00ul;
if(!addr && read && (req_found == req_match)) {
HOST_DEBUG("ctrlReq3: acceptBuffer sz %i nbytes %i left %i\n\r", read, nbytes, left);
left = 0;
rcode = UHS_HOST_ERROR_NONE;
break;
}
#endif
if(rcode) {
return rcode;
}
}
} else {
// OUT transfer
rcode = OutTransfer(pep, 0, nbytes, dataptr);
}
if(rcode) {
//return error
return ( rcode);
}
}
// Serial.println("Close Phase");
// Serial.flush();
// Status stage
rcode = ctrlReqClose(pep, rt, left, nbytes, dataptr);
// Serial.println("Closed");
return rcode;
}
uint8_t UHS_USB_HOST_BASE::EPClearHalt(uint8_t addr, uint8_t ep) {
return ctrlReq(addr, mkSETUP_PKT8(USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT, USB_REQUEST_CLEAR_FEATURE, USB_FEATURE_ENDPOINT_HALT, 0, ep, 0), 0, NULL);
}
uint8_t UHS_USB_HOST_BASE::TestInterface(ENUMERATION_INFO *ei) {
uint8_t devConfigIndex;
uint8_t rcode = 0;
HOST_DEBUG("TestInterface VID:%4.4x PID:%4.4x Class:%2.2x Subclass:%2.2x Protocol %2.2x\r\n", ei->vid, ei->pid, ei->klass, ei->subklass, ei->protocol);
HOST_DEBUG("Interface data: Class:%2.2x Subclass:%2.2x Protocol %2.2x, number of endpoints %i\r\n", ei->interface.klass, ei->interface.subklass, ei->interface.subklass, ei->interface.numep);
HOST_DEBUG("Parent: %2.2x, bAddress: %2.2x\r\n", ei->parent, ei->address);
for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) {
if(!devConfig[devConfigIndex]) {
HOST_DEBUG("No driver at index %i\r\n", devConfigIndex);
continue; // no driver
}
if(devConfig[devConfigIndex]->bAddress) {
HOST_DEBUG("Driver %i is already consumed @ %2.2x\r\n", devConfigIndex, devConfig[devConfigIndex]->bAddress);
continue; // consumed
}
if(devConfig[devConfigIndex]->OKtoEnumerate(ei)) {
HOST_DEBUG("Driver %i supports this interface\r\n", devConfigIndex);
break;
}
}
if(devConfigIndex == UHS_HOST_MAX_INTERFACE_DRIVERS) {
rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED;
#if 0 // defined(UHS_HID_LOADED)
// Check HID here, if it is, then lie
if(ei->klass == UHS_USB_CLASS_HID) {
devConfigIndex = UHS_HID_INDEX; // for debugging, otherwise this has no use.
rcode = 0;
}
#endif
}
if(!rcode) HOST_DEBUG("Driver %i can be used for this interface\r\n", devConfigIndex);
else HOST_DEBUG("No driver for this interface.\r\n");
return rcode;
};
uint8_t UHS_USB_HOST_BASE::enumerateInterface(ENUMERATION_INFO *ei) {
uint8_t devConfigIndex;
HOST_DEBUG("AttemptConfig: parent = %i, port = %i\r\n", ei->parent, ei->port);
#if 0 // defined(UHS_HID_LOADED)
// Check HID here, if it is, then lie
if(ei->klass == UHS_USB_CLASS_HID || ei->interface.klass == UHS_USB_CLASS_HID) {
UHS_HID_SetUSBInterface(this, ENUMERATION_INFO * ei);
devConfigIndex = UHS_HID_INDEX;
} else
#endif
for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) {
if(!devConfig[devConfigIndex]) {
HOST_DEBUG("No driver at index %i\r\n", devConfigIndex);
continue; // no driver
}
if(devConfig[devConfigIndex]->bAddress) {
HOST_DEBUG("Driver %i is already consumed @ %2.2x\r\n", devConfigIndex, devConfig[devConfigIndex]->bAddress);
continue; // consumed
}
if(devConfig[devConfigIndex]->OKtoEnumerate(ei)) {
HOST_DEBUG("Driver %i supports this interface\r\n", devConfigIndex);
if(!devConfig[devConfigIndex]->SetInterface(ei)) break;
else devConfigIndex = UHS_HOST_MAX_INTERFACE_DRIVERS;
}
}
return devConfigIndex;
};
////////////////////////////////////////////////////////////////////////////////
// Vendor Specific Interface Class
////////////////////////////////////////////////////////////////////////////////
#if 0
/**
* Might go away, depends on if it is useful, or not.
*
* @param ei Enumeration information
* @return true if this interface driver can handle this interface description
*/
bool UHS_NI UHS_VSI::OKtoEnumerate(ENUMERATION_INFO *ei) {
return (
(ei->subklass == UHS_USB_CLASS_VENDOR_SPECIFIC) ||
(ei->interface.subklass == UHS_USB_CLASS_VENDOR_SPECIFIC)
);
}
/**
* Copy the entire ENUMERATION_INFO structure
* @param ei Enumeration information
* @return 0
*/
uint8_t UHS_NI UHS_VSI::SetInterface(ENUMERATION_INFO *ei) {
bNumEP = 1;
bAddress = ei->address;
eInfo.address = ei->address;
eInfo.bMaxPacketSize0 = ei->bMaxPacketSize0;
eInfo.currentconfig = ei->currentconfig;
eInfo.interface.bAlternateSetting = ei->interface.bAlternateSetting;
eInfo.interface.bInterfaceNumber = ei->interface.bInterfaceNumber;
eInfo.interface.numep = ei->interface.numep;
eInfo.interface.protocol = ei->interface.protocol;
eInfo.interface.subklass = ei->interface.subklass;
eInfo.klass = ei->klass;
eInfo.parent = ei->parent;
eInfo.pid = ei->pid;
eInfo.port = ei->port;
eInfo.protocol = ei->protocol;
eInfo.subklass = ei->subklass;
eInfo.vid = ei->vid;
for(uint8_t i = 0; i < eInfo.interface.numep; i++) {
eInfo.interface.epInfo[i].bEndpointAddress = ei->interface.epInfo[i].bEndpointAddress;
eInfo.interface.epInfo[i].bInterval = ei->interface.epInfo[i].bInterval;
eInfo.interface.epInfo[i].bmAttributes = ei->interface.epInfo[i].bmAttributes;
eInfo.interface.epInfo[i].wMaxPacketSize = ei->interface.epInfo[i].wMaxPacketSize;
}
return 0;
}
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#if 0
/* TO-DO: Move this silliness to a NONE driver.
* When we have a generic NONE driver we can:
* o Extract ALL device information to help users with a new device.
* o Use an unknown device from a sketch, kind of like usblib does.
* This will aid in making more drivers in a faster way.
*/
uint8_t UHS_USB_HOST_BASE::DefaultAddressing(uint8_t parent, uint8_t port, uint8_t speed) {
uint8_t rcode;
UHS_Device *p0 = NULL, *p = NULL;
// Get pointer to pseudo device with address 0 assigned
p0 = addrPool.GetUsbDevicePtr(0);
if(!p0)
return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL;
if(!p0->epinfo)
return UHS_HOST_ERROR_NULL_EPINFO;
p0->speed = speed;
// Allocate new address according to device class
uint8_t bAddress = addrPool.AllocAddress(parent, false, port);
if(!bAddress)
return UHS_HOST_ERROR_ADDRESS_POOL_FULL;
p = addrPool.GetUsbDevicePtr(bAddress);
if(!p)
return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL;
p->speed = speed;
// Assign new address to the device
rcode = setAddr(0, bAddress);
if(rcode) {
addrPool.FreeAddress(bAddress);
bAddress = 0;
return rcode;
}
return 0;
}
#endif
#else
#error "Never include UHS_host_INLINE.h, include UHS_host.h instead"
#endif

View file

@ -0,0 +1,393 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(MACROS_H)
#define MACROS_H
#include "macro_logic.h"
/*
* Universal Arduino(tm) "IDE" fixups.
*/
// Just in case...
#ifndef SERIAL_PORT_MONITOR
#define SERIAL_PORT_MONITOR Serial
#endif
#ifndef INT16_MIN
#define INT16_MIN -32768
#endif
// require 10607+
#if defined(ARDUINO) && ARDUINO >=10607
// nop :-)
#else
#error "Arduino version too old, and must be at least 1.6.7"
#endif
// Nuke screwed up macro junk from the IDE.
#ifdef __cplusplus
#if defined(true)
#undef true
#endif
#if defined(false)
#undef false
#endif
#endif
#if !defined(UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE)
#if !defined(UHS_BIG_FLASH)
#if defined(FLASHEND) && defined(FLASHSTART)
#if (FLASHEND - FLASHSTART) > 0x0FFFFU
#define UHS_BIG_FLASH 1
#else
#define UHS_BIG_FLASH 0
#endif
#elif defined(__PIC32_FLASH_SIZE)
#if __PIC32_FLASH_SIZE > 511
#define UHS_BIG_FLASH 1
#else
#define UHS_BIG_FLASH 0
#endif
#elif defined(FLASHEND) && !defined(FLASHSTART)
// Assumes flash starts at 0x00000, is this a safe assumption?
// 192K + should be OK
#if FLASHEND > 0x02FFFFU
#define UHS_BIG_FLASH 1
#else
#define UHS_BIG_FLASH 0
#endif
#elif defined(IFLASH_SIZE)
#if IFLASH_SIZE > 0x0FFFFU
#define UHS_BIG_FLASH 1
#else
#define UHS_BIG_FLASH 0
#endif
#elif defined(ESP8266)
#define UHS_BIG_FLASH 1
#define SYSTEM_OR_SPECIAL_YIELD(...) yield()
#elif defined(__arm__) && defined(CORE_TEENSY)
#define UHS_BIG_FLASH 1
#elif defined(ARDUINO_spresense_ast)
#define UHS_BIG_FLASH 1
#else
// safe default
#warning Small flash?
#define UHS_BIG_FLASH 0
#endif
#endif
#if UHS_BIG_FLASH
#define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 1
#else
#define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 0
#endif
#endif
#if defined(__arm__) && defined(CORE_TEENSY)
#define UHS_PIN_WRITE(p, v) digitalWriteFast(p, v)
#define UHS_PIN_READ(p) digitalReadFast(p)
#endif
// TODO: Fast inline code for AVR and SAM based microcontrollers
// This can be done pretty easily.
// For now, this will just work out-of-the-box.
#if !defined(UHS_PIN_WRITE)
#define UHS_PIN_WRITE(p, v) digitalWrite(p, v)
#endif
#if !defined(UHS_PIN_READ)
#define UHS_PIN_READ(p) digitalRead(p)
#endif
#if defined( __PIC32MX__ ) && !defined(interrupts) // compiling with Microchip XC32 compiler
#define interrupts() __builtin_enable_interrupts()
#edfine noInterrupts() __builtin_disable_interrupts()
#endif
#if !defined(ARDUINO_SAMD_ZERO)
#if defined(ARDUINO_AVR_ADK)
#define UHS_GET_DPI(x) (x == 54 ? 6 : digitalPinToInterrupt(x))
#else
#define UHS_GET_DPI(x) digitalPinToInterrupt(x)
#endif
#else
#define UHS_GET_DPI(x) (x)
#endif
#ifndef __AVR__
#ifndef __PGMSPACE_H_
// This define should prevent reading the system pgmspace.h if included elsewhere
// This is not normally needed.
#define __PGMSPACE_H_ 1
#endif
#ifndef PROGMEM
#define PROGMEM
#endif
#ifndef PGM_P
#define PGM_P const char *
#endif
#ifndef PSTR
#define PSTR(str) (str)
#endif
#ifndef F
#define F(str) (str)
#endif
#ifndef _SFR_BYTE
#define _SFR_BYTE(n) (n)
#endif
#ifndef memchr_P
#define memchr_P(str, c, len) memchr((str), (c), (len))
#endif
#ifndef memcmp_P
#define memcmp_P(a, b, n) memcmp((a), (b), (n))
#endif
#ifndef memcpy_P
#define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
#endif
#ifndef memmem_P
#define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen))
#endif
#ifndef memrchr_P
#define memrchr_P(str, val, len) memrchr((str), (val), (len))
#endif
#ifndef strcat_P
#define strcat_P(dest, src) strcat((dest), (src))
#endif
#ifndef strchr_P
#define strchr_P(str, c) strchr((str), (c))
#endif
#ifndef strchrnul_P
#define strchrnul_P(str, c) strchrnul((str), (c))
#endif
#ifndef strcmp_P
#define strcmp_P(a, b) strcmp((a), (b))
#endif
#ifndef strcpy_P
#define strcpy_P(dest, src) strcpy((dest), (src))
#endif
#ifndef strcasecmp_P
#define strcasecmp_P(a, b) strcasecmp((a), (b))
#endif
#ifndef strcasestr_P
#define strcasestr_P(a, b) strcasestr((a), (b))
#endif
#ifndef strlcat_P
#define strlcat_P(dest, src, len) strlcat((dest), (src), (len))
#endif
#ifndef strlcpy_P
#define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len))
#endif
#ifndef strlen_P
#define strlen_P(s) strlen((const char *)(s))
#endif
#ifndef strnlen_P
#define strnlen_P(str, len) strnlen((str), (len))
#endif
#ifndef strncmp_P
#define strncmp_P(a, b, n) strncmp((a), (b), (n))
#endif
#ifndef strncasecmp_P
#define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n))
#endif
#ifndef strncat_P
#define strncat_P(a, b, n) strncat((a), (b), (n))
#endif
#ifndef strncpy_P
#define strncpy_P(a, b, n) strncmp((a), (b), (n))
#endif
#ifndef strpbrk_P
#define strpbrk_P(str, chrs) strpbrk((str), (chrs))
#endif
#ifndef strrchr_P
#define strrchr_P(str, c) strrchr((str), (c))
#endif
#ifndef strsep_P
#define strsep_P(strp, delim) strsep((strp), (delim))
#endif
#ifndef strspn_P
#define strspn_P(str, chrs) strspn((str), (chrs))
#endif
#ifndef strstr_P
#define strstr_P(a, b) strstr((a), (b))
#endif
#ifndef sprintf_P
#define sprintf_P(s, ...) sprintf((s), __VA_ARGS__)
#endif
#ifndef vfprintf_P
#define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__)
#endif
#ifndef printf_P
#define printf_P(...) printf(__VA_ARGS__)
#endif
#ifndef snprintf_P
#define snprintf_P(s, n, ...) ((s), (n), __VA_ARGS__)
#endif
#ifndef vsprintf_P
#define vsprintf_P(s, ...) ((s),__VA_ARGS__)
#endif
#ifndef vsnprintf_P
#define vsnprintf_P(s, n, ...) ((s), (n),__VA_ARGS__)
#endif
#ifndef fprintf_P
#define fprintf_P(s, ...) ((s), __VA_ARGS__)
#endif
#ifndef pgm_read_byte
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
#endif
#ifndef pgm_read_word
#define pgm_read_word(addr) (*(const unsigned short *)(addr))
#endif
#ifndef pgm_read_dword
#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
#endif
#ifndef pgm_read_float
#define pgm_read_float(addr) (*(const float *)(addr))
#endif
#ifndef pgm_read_byte_near
#define pgm_read_byte_near(addr) pgm_read_byte(addr)
#endif
#ifndef pgm_read_word_near
#define pgm_read_word_near(addr) pgm_read_word(addr)
#endif
#ifndef pgm_read_dword_near
#define pgm_read_dword_near(addr) pgm_read_dword(addr)
#endif
#ifndef pgm_read_float_near
#define pgm_read_float_near(addr) pgm_read_float(addr)
#endif
#ifndef pgm_read_byte_far
#define pgm_read_byte_far(addr) pgm_read_byte(addr)
#endif
#ifndef pgm_read_word_far
#define pgm_read_word_far(addr) pgm_read_word(addr)
#endif
#ifndef pgm_read_dword_far
#define pgm_read_dword_far(addr) pgm_read_dword(addr)
#endif
#ifndef pgm_read_float_far
#define pgm_read_float_far(addr) pgm_read_float(addr)
#endif
#ifndef pgm_read_pointer
#define pgm_read_pointer
#endif
#endif
////////////////////////////////////////////////////////////////////////////////
// HANDY MACROS
////////////////////////////////////////////////////////////////////////////////
// Atmoically set/clear single bits using bitbands.
// Believe it or not, this boils down to a constant,
// and is less code than using |= &= operators.
// Bonus, it makes code easier to read too.
// Bitbanding is a wonderful thing.
#define BITNR(i) (i&0x1?0:i&0x2?1:i&0x4?2:i&0x8?3:i&0x10?4:i&0x20?5:i&0x40?6:i&0x80?7:i&0x100?8:i&0x200?9:i&0x400?10:i&0x800?11:i&0x1000?12:i&0x2000?13:i&0x4000?14:i&0x8000?15:i&0x10000?16:i&0x20000?17:i&0x40000?18:i&0x80000?19:i&0x100000?20:i&0x200000?21:i&0x400000?22:i&0x800000?23:i&0x1000000?24:i&0x2000000?25:i&0x4000000?26:i&0x8000000?27:i&0x10000000?28:i&0x20000000?29:i&0x40000000?30:i&0x80000000?31:32)
#define UHS_KIO_BITBAND_ADDR(r, i) (((uint32_t)&(r) - 0x40000000) * 32 + (i) * 4 + 0x42000000)
#define UHS_KIO_SETBIT_ATOMIC(r, m) (*(uint32_t *)UHS_KIO_BITBAND_ADDR((r), BITNR((m)))) = 1
#define UHS_KIO_CLRBIT_ATOMIC(r, m) (*(uint32_t *)UHS_KIO_BITBAND_ADDR((r), BITNR((m)))) = 0
#define VALUE_BETWEEN(v,l,h) (((v)>(l)) && ((v)<(h)))
#define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h)))
#define output_pgm_message(wa,fp,mp,el) wa = &mp, fp((char *)pgm_read_pointer(wa), el)
#define output_if_between(v,l,h,wa,fp,mp,el) if(VALUE_BETWEEN(v,l,h)) output_pgm_message(wa,fp,mp[v-(l+1)],el);
#define UHS_SWAP_VALUES(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))
#ifndef __BYTE_GRABBING_DEFINED__
#define __BYTE_GRABBING_DEFINED__ 1
#ifdef BROKEN_OPTIMIZER_LITTLE_ENDIAN
// Note: Use this if your compiler generates horrible assembler!
#define UHS_UINT8_BYTE0(__usi__) (((uint8_t *)&(__usi__))[0])
#define UHS_UINT8_BYTE1(__usi__) (((uint8_t *)&(__usi__))[1])
#define UHS_UINT8_BYTE2(__usi__) (((uint8_t *)&(__usi__))[2])
#define UHS_UINT8_BYTE3(__usi__) (((uint8_t *)&(__usi__))[3])
#define UHS_UINT8_BYTE4(__usi__) (((uint8_t *)&(__usi__))[4])
#define UHS_UINT8_BYTE5(__usi__) (((uint8_t *)&(__usi__))[5])
#define UHS_UINT8_BYTE6(__usi__) (((uint8_t *)&(__usi__))[6])
#define UHS_UINT8_BYTE7(__usi__) (((uint8_t *)&(__usi__))[7])
#else
// Note: The cast alone to uint8_t is actually enough.
// GCC throws out the "& 0xff", and the size is no different.
// Some compilers need it.
#define UHS_UINT8_BYTE0(__usi__) ((uint8_t)((__usi__) & 0xff ))
#define UHS_UINT8_BYTE1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xff))
#define UHS_UINT8_BYTE2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xff))
#define UHS_UINT8_BYTE3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xff))
#define UHS_UINT8_BYTE4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xff))
#define UHS_UINT8_BYTE5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xff))
#define UHS_UINT8_BYTE6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xff))
#define UHS_UINT8_BYTE7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xff))
#endif
#define UHS_UINT16_SET_BYTE1(__usi__) ((uint16_t)(__usi__) << 8)
#define UHS_UINT32_SET_BYTE1(__usi__) ((uint32_t)(__usi__) << 8)
#define UHS_UINT64_SET_BYTE1(__usi__) ((uint64_t)(__usi__) << 8)
#define UHS_UINT32_SET_BYTE2(__usi__) ((uint32_t)(__usi__) << 16)
#define UHS_UINT64_SET_BYTE2(__usi__) ((uint64_t)(__usi__) << 16)
#define UHS_UINT32_SET_BYTE3(__usi__) ((uint32_t)(__usi__) << 24)
#define UHS_UINT64_SET_BYTE3(__usi__) ((uint64_t)(__usi__) << 24)
#define UHS_UINT64_SET_BYTE4(__usi__) ((uint64_t)(__usi__) << 32)
#define UHS_UINT64_SET_BYTE5(__usi__) ((uint64_t)(__usi__) << 40)
#define UHS_UINT64_SET_BYTE6(__usi__) ((uint64_t)(__usi__) << 48)
#define UHS_UINT64_SET_BYTE7(__usi__) ((uint64_t)(__usi__) << 56)
// These are the smallest and fastest ways I have found so far in pure C/C++.
#define UHS_BYTES_TO_UINT16(__usc1__,__usc0__) ((uint16_t)((uint16_t)(__usc0__) | (uint16_t)UHS_UINT16_SET_BYTE1(__usc1__)))
#define UHS_BYTES_TO_UINT32(__usc3__,__usc2__,__usc1__,__usc0__) ((uint32_t)((uint32_t)(__usc0__) | UHS_UINT32_SET_BYTE1(__usc1__) | UHS_UINT32_SET_BYTE2(__usc2__) | UHS_UINT32_SET_BYTE3(__usc3__)))
#define UHS_BYTES_TO_UINT64(__usc7__,__usc6__,__usc5__,__usc4__,__usc3__,__usc2__,__usc1__,__usc0__) ((uint64_t)((uint64_t)__usc0__ | UHS_UINT64_SET_BYTE1(__usc1__) | UHS_UINT64_SET_BYTE2(__usc2__) | UHS_UINT64_SET_BYTE3(__usc3__) | UHS_UINT64_SET_BYTE4(__usc4__) | UHS_UINT64_SET_BYTE5(__usc5__) | UHS_UINT64_SET_BYTE6(__usc6__) | UHS_UINT64_SET_BYTE7(__usc7__)))
#endif
/*
* Debug macros.
* Useful when porting from UHS2.
* Do not use these for any new code.
* Change to better debugging after port is completed.
* Strings are stored in progmem (flash) instead of RAM.
*/
#define USBTRACE1(s,l) (Notify(PSTR(s), l))
#define USBTRACE(s) (USBTRACE1((s), 0x80)); USB_HOST_SERIAL.flush()
#define USBTRACE3(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l), Notify(PSTR("\r\n"), l))
#define USBTRACE3X(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l))
#define USBTRACE2(s,r) (USBTRACE3((s),(r),0x80)); USB_HOST_SERIAL.flush()
#define USBTRACE2X(s,r) (USBTRACE3X((s),(r),0x80)); USB_HOST_SERIAL.flush()
#define VOID0 ((void)0)
#if !defined(NOTUSED)
#define NOTUSED(...) __VA_ARGS__ __attribute__((unused))
#endif
#endif /* MACROS_H */

View file

@ -0,0 +1,91 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(_UHS_host_h_) || defined(__MESSAGE_H__)
#error "Never include UHS_message.h directly; include UHS_Usb.h instead"
#else
#define __MESSAGE_H__
extern int UsbDEBUGlvl;
void E_Notify(char const * msg, int lvl);
void E_Notify(uint8_t b, int lvl);
void E_NotifyStr(char const * msg, int lvl);
void E_Notifyc(char c, int lvl);
#ifdef DEBUG_USB_HOST
#define Notify E_Notify
#define NotifyStr E_NotifyStr
#define Notifyc E_Notifyc
void NotifyFailGetDevDescr(uint8_t reason);
void NotifyFailSetDevTblEntry(uint8_t reason);
void NotifyFailGetConfDescr(uint8_t reason);
void NotifyFailSetConfDescr(uint8_t reason);
void NotifyFailGetDevDescr(void);
void NotifyFailSetDevTblEntry(void);
void NotifyFailGetConfDescr(void);
void NotifyFailSetConfDescr(void);
void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID);
void NotifyFail(uint8_t rcode);
#else
#define Notify(...) VOID0
#define NotifyStr(...) VOID0
#define Notifyc(...) VOID0
#define NotifyFailGetDevDescr(...) VOID0
#define NotifyFailSetDevTblEntry(...) VOID0
#define NotifyFailGetConfDescr(...) VOID0
#define NotifyFailGetDevDescr(...) VOID0
#define NotifyFailSetDevTblEntry(...) VOID0
#define NotifyFailGetConfDescr(...) VOID0
#define NotifyFailSetConfDescr(...) VOID0
#define NotifyFailUnknownDevice(...) VOID0
#define NotifyFail(...) VOID0
#endif
#ifdef DEBUG_USB_HOST
template <class ERROR_TYPE> void ErrorMessage(uint8_t level, char const * msg, ERROR_TYPE rcode = 0) {
Notify(msg, level);
Notify(PSTR(": "), level);
D_PrintHex<ERROR_TYPE > (rcode, level);
Notify(PSTR("\r\n"), level);
#else
template <class ERROR_TYPE> void ErrorMessage(NOTUSED(uint8_t level), NOTUSED(char const * msg), ERROR_TYPE rcode = 0) {
(void)rcode;
#endif
}
#ifdef DEBUG_USB_HOST
template <class ERROR_TYPE> void ErrorMessage(char const * msg, ERROR_TYPE rcode = 0) {
Notify(msg, 0x80);
Notify(PSTR(": "), 0x80);
D_PrintHex<ERROR_TYPE > (rcode, 0x80);
Notify(PSTR("\r\n"), 0x80);
#else
template <class ERROR_TYPE> void ErrorMessage(NOTUSED(char const * msg), ERROR_TYPE rcode = 0) {
(void)rcode;
#endif
}
#endif // __MESSAGE_H__

View file

@ -0,0 +1,201 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#ifndef UHS_PRINTF_HELPER_H
#define UHS_PRINTF_HELPER_H
#if defined(LOAD_UHS_PRINTF_HELPER)
#include <Arduino.h>
#ifdef true
#undef true
#endif
#ifdef false
#undef false
#endif
#if !defined(STDIO_IS_OK_TO_USE_AS_IS)
#if defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_SAM_DUE) || defined(ARDUINO_spresense_ast)
// STDIO patching not required.
#define STDIO_IS_OK_TO_USE_AS_IS
#endif
#endif
#if !defined(STDIO_IS_OK_TO_USE_AS_IS)
// We need to patch STDIO so it can be used.
#ifndef SERIAL_PORT_MONITOR
// Some don't define this.
#define SERIAL_PORT_MONITOR Serial
#endif
#ifndef SERIAL_PORT_HARDWARE
// Some don't define this.
#define SERIAL_PORT_HARDWARE SERIAL_PORT_MONITOR
#endif
#ifndef USB_HOST_SERIAL
#if defined(SERIAL_PORT_USBVIRTUAL) && defined(LOAD_UHS_KINETIS_FS_HOST)
#define USB_HOST_SERIAL SERIAL_PORT_HARDWARE
#else
#define USB_HOST_SERIAL SERIAL_PORT_MONITOR
#endif
#endif
#if !defined(NOTUSED)
#define NOTUSED(...) __VA_ARGS__ __attribute__((unused))
#endif
#ifndef __AVR__
#ifndef printf_P
#define printf_P(...) printf(__VA_ARGS__)
#endif
#endif
#if defined(ARDUINO_ARCH_PIC32)
/*
* For printf() output with pic32 Arduino
*/
extern "C" {
void _mon_putc(char s) {
USB_HOST_SERIAL.write(s);
}
int _mon_getc() {
while(!USB_HOST_SERIAL.available());
return USB_HOST_SERIAL.read();
}
}
#elif defined(__AVR__)
extern "C" {
static FILE tty_stdio;
static FILE tty_stderr;
static int NOTUSED(tty_stderr_putc(char c, NOTUSED(FILE *t)));
static int NOTUSED(tty_stderr_flush(NOTUSED(FILE *t)));
static int NOTUSED(tty_std_putc(char c, NOTUSED(FILE *t)));
static int NOTUSED(tty_std_getc(NOTUSED(FILE *t)));
static int NOTUSED(tty_std_flush(NOTUSED(FILE *t)));
static int tty_stderr_putc(char c, NOTUSED(FILE *t)) {
USB_HOST_SERIAL.write(c);
return 0;
}
static int tty_stderr_flush(NOTUSED(FILE *t)) {
USB_HOST_SERIAL.flush();
return 0;
}
static int tty_std_putc(char c, NOTUSED(FILE *t)) {
USB_HOST_SERIAL.write(c);
return 0;
}
static int tty_std_getc(NOTUSED(FILE *t)) {
while(!USB_HOST_SERIAL.available());
return USB_HOST_SERIAL.read();
}
static int tty_std_flush(NOTUSED(FILE *t)) {
USB_HOST_SERIAL.flush();
return 0;
}
}
#elif defined(CORE_TEENSY)
extern "C" {
int _write(int fd, const char *ptr, int len) {
int j;
for(j = 0; j < len; j++) {
if(fd == 1)
USB_HOST_SERIAL.write(*ptr++);
else if(fd == 2)
USB_HOST_SERIAL.write(*ptr++);
}
return len;
}
int _read(int fd, char *ptr, int len) {
if(len > 0 && fd == 0) {
while(!USB_HOST_SERIAL.available());
*ptr = USB_HOST_SERIAL.read();
return 1;
}
return 0;
}
#include <sys/stat.h>
int _fstat(int fd, struct stat *st) {
memset(st, 0, sizeof (*st));
st->st_mode = S_IFCHR;
st->st_blksize = 1024;
return 0;
}
int _isatty(int fd) {
return (fd < 3) ? 1 : 0;
}
}
#else
#error no STDIO
#endif // defined(ARDUINO_ARCH_PIC32)
#if defined(__AVR__)
// The only wierdo in the bunch...
void UHS_AVR_printf_HELPER_init(void) {
// Set up stdio/stderr
tty_stdio.put = tty_std_putc;
tty_stdio.get = tty_std_getc;
tty_stdio.flags = _FDEV_SETUP_RW;
tty_stdio.udata = 0;
tty_stderr.put = tty_stderr_putc;
tty_stderr.get = NULL;
tty_stderr.flags = _FDEV_SETUP_WRITE;
tty_stderr.udata = 0;
stdout = &tty_stdio;
stdin = &tty_stdio;
stderr = &tty_stderr;
}
#define UHS_printf_HELPER_init() UHS_AVR_printf_HELPER_init()
#endif
#endif /* STDIO_IS_OK_TO_USE_AS_IS */
#endif /* load.... */
#if !defined(UHS_printf_HELPER_init)
#define UHS_printf_HELPER_init() (void(0))
#endif
#endif /* UHS_PRINTF_HELPER_H */

View file

@ -0,0 +1,96 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(_UHS_host_h_) || defined(__PRINTHEX_H__)
#error "Never include UHS_printhex.h directly; include UHS_Usb.h instead"
#else
#define __PRINTHEX_H__
void E_Notifyc(char c, int lvl);
template <class T>
void PrintHex(T val, int lvl) {
int num_nibbles = sizeof (T) * 2;
do {
char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
if(v > 57) v += 7;
E_Notifyc(v, lvl);
} while(--num_nibbles);
}
template <class T>
void PrintBin(T val, int lvl) {
for(T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1)
if(val & mask)
E_Notifyc('1', lvl);
else
E_Notifyc('0', lvl);
}
template <class T>
void SerialPrintHex(T val) {
int num_nibbles = sizeof (T) * 2;
do {
char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
if(v > 57) v += 7;
USB_HOST_SERIAL.print(v);
} while(--num_nibbles);
}
template <class T>
void PrintHex2(Print *prn, T val) {
T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2));
while(mask > 1) {
if(val < mask)
prn->print("0");
mask >>= 4;
}
prn->print((T)val, HEX);
}
#ifdef DEBUG_USB_HOST
template <class T> void D_PrintHex(T val, int lvl) {
PrintHex<T > (val, lvl);
#else
template <class T> void D_PrintHex(NOTUSED(T val), NOTUSED(int lvl)) {
#endif
}
#ifdef DEBUG_USB_HOST
template <class T> void D_PrintBin(T val, int lvl) {
PrintBin<T > (val, lvl);
#else
template <class T> void D_PrintBin(NOTUSED(T val), NOTUSED(int lvl)) {
#endif
}
#endif // __PRINTHEX_H__

View file

@ -0,0 +1,141 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#ifndef UHS_SETTINGS_H
#define UHS_SETTINGS_H
// TO-DO: Move specific settings to modules which use them.
////////////////////////////////////////////////////////////////////////////////
// Define any of these options at the top of your sketch to override
// the defaults contained herewith. Do NOT do modifications here.
// Individual Components have their own settings.
//
// Macro | Settings and notes | Default
// -----------------------------+-----------------------+-----------------------
// | Any class that does |
// USB_HOST_SERIAL | text streaming | SERIAL_PORT_MONITOR
// | e.g. Serial2 |
// -----------------------------+-----------------------+-----------------------
// ENABLE_UHS_DEBUGGING | 0 = off, 1 = on | 0
// -----------------------------+-----------------------+-----------------------
// | 0 = off, 1 = on |
// | Caution! Can make |
// DEBUG_PRINTF_EXTRA_HUGE | program too large! | 0
// | Other modules depend |
// | on this setting. |
// -----------------------------+-----------------------+-----------------------
// USE_UHS_BLACK_WIDDOW | 0 = no, 1 = yes | 0
// -----------------------------+-----------------------+-----------------------
// ENABLE_WII_IR_CAMERA | 0 = no, 1 = yes | 0
// -----------------------------^-----------------------^-----------------------
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// DEBUGGING
////////////////////////////////////////////////////////////////////////////////
#ifndef USB_HOST_SERIAL
#if defined(SERIAL_PORT_USBVIRTUAL) && defined(LOAD_UHS_KINETIS_FS_HOST)
#define USB_HOST_SERIAL SERIAL_PORT_HARDWARE
#else
#define USB_HOST_SERIAL SERIAL_PORT_MONITOR
#endif
#endif
#ifndef ENABLE_UHS_DEBUGGING
#define ENABLE_UHS_DEBUGGING 0
#endif
#ifndef DEBUG_PRINTF_EXTRA_HUGE
#define DEBUG_PRINTF_EXTRA_HUGE 0
#endif
////////////////////////////////////////////////////////////////////////////////
// Manual board activation
////////////////////////////////////////////////////////////////////////////////
/* Set this to 1 if you are using a Black Widdow */
#ifndef USE_UHS_BLACK_WIDDOW
#define USE_UHS_BLACK_WIDDOW 0
#endif
////////////////////////////////////////////////////////////////////////////////
// Wii IR camera
////////////////////////////////////////////////////////////////////////////////
/* Set this to 1 to activate code for the Wii IR camera */
#ifndef ENABLE_WII_IR_CAMERA
#define ENABLE_WII_IR_CAMERA 0
#endif
////////////////////////////////////////////////////////////////////////////////
// Set to 1 to use the faster spi4teensy3 driver. (not used yet))
////////////////////////////////////////////////////////////////////////////////
#ifndef USE_SPI4TEENSY3
#define USE_SPI4TEENSY3 0
#endif
////////////////////////////////////////////////////////////////////////////////
// AUTOMATIC Settings
////////////////////////////////////////////////////////////////////////////////
// No user serviceable parts below this line.
// DO NOT change anything below here unless you are a developer!
#if defined(__GNUC__) && defined(__AVR__)
#ifndef GCC_VERSION
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif
#if GCC_VERSION < 40602 // Test for GCC < 4.6.2
#ifdef PROGMEM
#undef PROGMEM
#define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4
#ifdef PSTR
#undef PSTR
#define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) // Copied from pgmspace.h in avr-libc source
#endif
#endif
#endif
#endif
#if !defined(DEBUG_USB_HOST) && ENABLE_UHS_DEBUGGING
#define DEBUG_USB_HOST
#endif
#if !defined(WIICAMERA) && ENABLE_WII_IR_CAMERA
#define WIICAMERA
#endif
#define UHS_SLEEP_MS(v) pUsb->sof_delay(v)
#ifndef UHS_NI
#define UHS_NI __attribute__((noinline))
#endif
#endif /* SETTINGS_H */

View file

@ -0,0 +1,222 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(_UHS_host_h_) || defined(_UHS_ch9_h_)
#error "Never include UHS_usb_ch9.h directly; include UHS_Usb.h instead"
#else
/* USB chapter 9 structures */
#define _UHS_ch9_h_
/* Misc.USB constants */
#define DEV_DESCR_LEN 18 //device descriptor length
#define CONF_DESCR_LEN 9 //configuration descriptor length
#define INTR_DESCR_LEN 9 //interface descriptor length
#define EP_DESCR_LEN 7 //endpoint descriptor length
/* Standard Device Requests */
#define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS
#define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE
#define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE
#define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS
#define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR
#define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR
#define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION
#define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION
#define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE
#define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE
#define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME
/* Wireless USB Device Requests */
#define USB_REQ_SET_ENCRYPTION 0x0D
#define USB_REQ_GET_ENCRYPTION 0x0E
#define USB_REQ_RPIPE_ABORT 0x0E
#define USB_REQ_SET_HANDSHAKE 0x0F
#define USB_REQ_RPIPE_RESET 0x0F
#define USB_REQ_GET_HANDSHAKE 0x10
#define USB_REQ_SET_CONNECTION 0x11
#define USB_REQ_SET_SECURITY_DATA 0x12
#define USB_REQ_GET_SECURITY_DATA 0x13
#define USB_REQ_SET_WUSB_DATA 0x14
#define USB_REQ_LOOPBACK_DATA_WRITE 0x15
#define USB_REQ_LOOPBACK_DATA_READ 0x16
#define USB_REQ_SET_INTERFACE_DS 0x17
/* USB feature flags */
#define USB_DEVICE_SELF_POWERED 0 /* (read only) */
#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */
#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */
#define USB_DEVICE_BATTERY 2 /* (wireless) */
#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */
#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/
#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */
#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */
#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */
#define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt
#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up
#define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode
/* OTG SET FEATURE Constants */
#define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP
#define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP
#define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP
/* Setup Data Constants */
#define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer
#define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer
#define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard
#define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class
#define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor
#define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device
#define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface
#define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint
#define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other
#define USB_SETUP_RECIPIENT_PORT 0x04 // Wireless USB 1.0
#define USB_SETUP_RECIPIENT_RPIPE 0x05 // Wireless USB 1.0
/* USB descriptors */
#define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor.
#define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor.
#define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor.
#define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor.
#define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor.
#define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier.
#define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration.
#define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power.
#define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor.
#define USB_DESCRIPTOR_DEBUG 0x0a
#define USB_DESCRIPTOR_INTERFACE_ASSOCIATION 0x0b
#define USB_DESCRIPTOR_SECURITY 0x0c
#define USB_DESCRIPTOR_KEY 0x0d
#define USB_DESCRIPTOR_ENCRYPTION_TYPE 0x0e
#define USB_DESCRIPTOR_BOS 0x0f
#define USB_DESCRIPTOR_DEVICE_CAPABILITY 0x10
#define USB_DESCRIPTOR_WIRELESS_ENDPOINT_COMP 0x11
#define USB_DESCRIPTOR_WIRE_ADAPTER 0x21
#define USB_DESCRIPTOR_RPIPE 0x22
#define USB_DESCRIPTOR_CS_RADIO_CONTROL 0x23
#define USB_DESCRIPTOR_SS_ENDPOINT_COMP 0x30
#define USB_HID_DESCRIPTOR 0x21
// Conventional codes for class-specific descriptors. "Common Class" Spec (3.11)
#define USB_DESCRIPTOR_CS_DEVICE 0x21
#define USB_DESCRIPTOR_CS_CONFIG 0x22
#define USB_DESCRIPTOR_CS_STRING 0x23
#define USB_DESCRIPTOR_CS_INTERFACE 0x24
#define USB_DESCRIPTOR_CS_ENDPOINT 0x25
/* USB Endpoint Transfer Types */
#define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint.
#define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint.
#define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint.
#define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint.
#define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes
#define USB_TRANSFER_DIRECTION_IN 0x80 // Indicate direction is IN
/* Standard Feature Selectors for CLEAR_FEATURE Requests */
#define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient
#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient
#define USB_FEATURE_TEST_MODE 2 // Device recipient
/* descriptor data structures */
/* Device descriptor structure */
typedef struct {
uint8_t bLength; // Length of this descriptor.
uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE).
uint16_t bcdUSB; // USB Spec Release Number (BCD).
uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF).
uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0.
uint16_t idVendor; // Vendor ID (assigned by the USB-IF).
uint16_t idProduct; // Product ID (assigned by the manufacturer).
uint16_t bcdDevice; // Device release number (BCD).
uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer.
uint8_t iProduct; // Index of String Descriptor describing the product.
uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number.
uint8_t bNumConfigurations; // Number of possible configurations.
} __attribute__((packed)) USB_DEVICE_DESCRIPTOR;
/* Configuration descriptor structure */
typedef struct {
uint8_t bLength; // Length of this descriptor.
uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION).
uint16_t wTotalLength; // Total length of all descriptors for this configuration.
uint8_t bNumInterfaces; // Number of interfaces in this configuration.
uint8_t bConfigurationValue; // Value of this configuration (1 based).
uint8_t iConfiguration; // Index of String Descriptor describing the configuration.
uint8_t bmAttributes; // Configuration characteristics.
uint8_t bMaxPower; // Maximum power consumed by this configuration.
} __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR;
/* Interface descriptor structure */
typedef struct {
uint8_t bLength; // Length of this descriptor.
uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE).
uint8_t bInterfaceNumber; // Number of this interface (0 based).
uint8_t bAlternateSetting; // Value of this alternate interface setting.
uint8_t bNumEndpoints; // Number of endpoints in this interface.
uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF).
uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
uint8_t iInterface; // Index of String Descriptor describing the interface.
} __attribute__((packed)) USB_INTERFACE_DESCRIPTOR;
/* Endpoint descriptor structure */
typedef struct {
uint8_t bLength; // Length of this descriptor.
uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT).
uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN).
uint8_t bmAttributes; // Endpoint transfer type.
uint16_t wMaxPacketSize; // Maximum packet size.
uint8_t bInterval; // Polling interval in frames.
} __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR;
/* HID descriptor */
/*
typedef struct {
uint8_t bLength;
uint8_t bDescriptorType;
uint16_t bcdHID; // HID class specification release
uint8_t bCountryCode;
uint8_t bNumDescriptors; // Number of additional class specific descriptors
uint8_t bDescrType; // Type of class descriptor
uint16_t wDescriptorLength; // Total size of the Report descriptor
} __attribute__((packed)) USB_HID_DESCRIPTOR;
*/
typedef struct {
uint8_t bDescrType; // Type of class descriptor
uint16_t wDescriptorLength; // Total size of the Report descriptor
} __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE;
#endif // _ch9_h_

View file

@ -0,0 +1,452 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(_UHS_host_h_)
#error "Never include UHS_usbhost.h directly; include UHS_host.h instead"
#else
#if !defined(_USBHOST_H_)
#define _USBHOST_H_
// Very early prototypes
#if defined(UHS_LOAD_BT)
void UHS_BT_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei);
void UHS_BT_ScanUninitialized(UHS_USB_HOST_BASE *host);
void UHS_BT_Poll(UHS_USB_HOST_BASE *host);
#endif
#if defined(UHS_LOAD_HID)
void UHS_HID_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei);
void UHS_HID_ScanUninitialized(UHS_USB_HOST_BASE *host);
void UHS_HID_Poll(UHS_USB_HOST_BASE *host);
#endif
//#if defined(LOAD_UHS_CDC_ACM) || defined(LOAD_UHS_CDC_ACM_FTDI) || defined(LOAD_UHS_CDC_ACM_PROLIFIC) || defined(LOAD_UHS_CDC_ACM_XR21B1411)
//void UHS_CDC_ACM_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei);
//void UHS_CDC_ACM_ScanUninitialized(UHS_USB_HOST_BASE *host);
//void UHS_CDC_ACM_Poll(UHS_USB_HOST_BASE *host);
//#endif
class UHS_USBInterface; // forward class declaration
// enumerator to turn the VBUS on/off
typedef enum {
vbus_on = 0,
vbus_off = 1
} VBUS_t;
// All host SEI use this base class
class UHS_USB_HOST_BASE {
public:
AddressPool addrPool;
UHS_USBInterface* devConfig[UHS_HOST_MAX_INTERFACE_DRIVERS];
volatile uint8_t usb_error;
volatile uint8_t usb_task_state;
volatile uint8_t usb_task_polling_disabled;
volatile uint8_t usb_host_speed;
volatile uint8_t hub_present;
UHS_USB_HOST_BASE(void) {
for(uint16_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) {
devConfig[i] = NULL;
}
usb_task_polling_disabled = 0;
usb_task_state = UHS_USB_HOST_STATE_INITIALIZE; //set up state machine
usb_host_speed = 0;
usb_error = 0;
};
/////////////////////////////////////////////
//
// Virtual methods that interface to the SIE
// Overriding each is mandatory.
//
/////////////////////////////////////////////
/**
* Delay for x milliseconds
* Override if your controller provides an SOF IRQ, which may involve
* some sort of reentrant ISR or workaround with interrupts enabled.
*
* @param x how many milliseconds to delay
* @return true if delay completed without a state change, false if delay aborted
*/
virtual bool UHS_NI sof_delay(uint16_t x) {
if(!(usb_task_state & UHS_USB_HOST_STATE_MASK)) return false;
uint8_t current_state = usb_task_state;
while(current_state == usb_task_state && x--) {
delay(1);
}
return (current_state == usb_task_state);
};
virtual UHS_EpInfo * UHS_NI ctrlReqOpen(NOTUSED(uint8_t addr), NOTUSED(uint64_t Request), NOTUSED(uint8_t* dataptr)) {
return NULL;
};
virtual void UHS_NI vbusPower(NOTUSED(VBUS_t state)) {
};
virtual void UHS_NI Task(void) {
};
virtual uint8_t UHS_NI SetAddress(NOTUSED(uint8_t addr), NOTUSED(uint8_t ep), NOTUSED(UHS_EpInfo **ppep), NOTUSED(uint16_t &nak_limit)) {
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual uint8_t UHS_NI OutTransfer(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t nak_limit), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *data)) {
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual uint8_t UHS_NI InTransfer(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t nak_limit), NOTUSED(uint16_t *nbytesptr), NOTUSED(uint8_t *data)) {
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual uint8_t UHS_NI ctrlReqClose(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint8_t bmReqType), NOTUSED(uint16_t left), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *dataptr)) {
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual uint8_t UHS_NI ctrlReqRead(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t *left), NOTUSED(uint16_t *read), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *dataptr)) {
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual uint8_t UHS_NI dispatchPkt(NOTUSED(uint8_t token), NOTUSED(uint8_t ep), NOTUSED(uint16_t nak_limit)) {
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual uint8_t UHS_NI init(void) {
return 0;
};
virtual void UHS_NI doHostReset(void) {
};
virtual int16_t UHS_NI Init(NOTUSED(int16_t mseconds)) {
return -1;
};
virtual int16_t UHS_NI Init(void) {
return Init(INT16_MIN);
};
virtual uint8_t hwlPowerUp(void) {
/* This is for machine specific support to enable/power up the USB HW to operate*/
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual uint8_t hwPowerDown(void) {
/* This is for machine specific support to disable/powerdown the USB Hw */
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
virtual bool IsHub(uint8_t klass) {
return (klass == UHS_USB_CLASS_HUB);
};
virtual void UHS_NI suspend_host(void) {
// Used on MCU that lack control of IRQ priority (AVR).
// Suspends ISRs, for critical code. IRQ will be serviced after it is resumed.
// NOTE: you must track the state yourself!
};
virtual void UHS_NI resume_host(void) {
// Used on MCU that lack control of IRQ priority (AVR).
// Resumes ISRs.
// NOTE: you must track the state yourself!
};
/////////////////////////////////////////////
//
// Built-ins, No need to override
//
/////////////////////////////////////////////
// these two probably will go away, and won't be used, TBD
inline void Poll_Others(void) {
#if defined(UHS_LOAD_BT)
UHS_BT_Poll(this);
#endif
#if defined(UHS_LOAD_HID)
UHS_HID_Poll(this);
#endif
}
inline void DisablePoll(void) {
noInterrupts();
usb_task_polling_disabled++;
DDSB();
interrupts();
}
inline void EnablePoll(void) {
noInterrupts();
usb_task_polling_disabled--;
DDSB();
interrupts();
}
uint8_t UHS_NI seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_CONFIGURATION_DESCRIPTOR *ucd);
uint8_t UHS_NI setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t epcount, volatile UHS_EpInfo* eprecord_ptr);
uint8_t UHS_NI EPClearHalt(uint8_t addr, uint8_t ep);
uint8_t UHS_NI ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr);
uint8_t UHS_NI getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr);
uint8_t UHS_NI getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr);
uint8_t UHS_NI setAddr(uint8_t oldaddr, uint8_t newaddr);
uint8_t UHS_NI setConf(uint8_t addr, uint8_t conf_value);
uint8_t UHS_NI getStrDescr(uint8_t addr, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr);
void UHS_NI ReleaseDevice(uint8_t addr);
uint8_t UHS_NI Configuring(uint8_t parent, uint8_t port, uint8_t speed);
void UHS_NI DeviceDefaults(uint8_t maxep, UHS_USBInterface *device);
UHS_EpInfo* UHS_NI getEpInfoEntry(uint8_t addr, uint8_t ep);
inline uint8_t getUsbTaskState(void) {
return ( usb_task_state);
};
inline AddressPool* GetAddressPool(void) {
return &addrPool;
};
int UHS_NI RegisterDeviceClass(UHS_USBInterface *pdev) {
for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) {
if(!devConfig[i]) {
devConfig[i] = pdev;
return i;
}
}
//return UHS_HOST_ERROR_CANT_REGISTER_DEVICE_CLASS;
return -1;
};
#if 0
inline void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) {
addrPool.ForEachUsbDevice(pfunc);
};
#endif
uint8_t TestInterface(ENUMERATION_INFO *ei);
uint8_t enumerateInterface(ENUMERATION_INFO *ei);
uint8_t getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset);
uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset);
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data);
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data);
uint8_t doSoftReset(uint8_t parent, uint8_t port, uint8_t address);
uint8_t getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset);
uint8_t eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum);
};
// All device interface drivers use this subclass
class UHS_USBInterface {
public:
UHS_USB_HOST_BASE *pUsb; // Parent USB host
volatile uint8_t bNumEP; // total number of EP in this interface
volatile UHS_EpInfo epInfo[16]; // This is a stub, override in the driver.
volatile uint8_t bAddress; // address of the device
volatile uint8_t bConfNum; // configuration number
volatile uint8_t bIface; // interface value
volatile bool bPollEnable; // poll enable flag, operating status
volatile uint32_t qNextPollTime; // next poll time
/**
* Resets interface driver to unused state. You should override this in
* your driver if it requires extra class variable cleanup.
*/
virtual void DriverDefaults(void) {
printf("Default driver defaults.\r\n");
pUsb->DeviceDefaults(bNumEP, this);
};
/**
* Checks if this interface is supported.
* Executed called when new devices are connected.
*
* @param ei
* @return true if the interface is supported
*/
virtual bool OKtoEnumerate(NOTUSED(ENUMERATION_INFO *ei)) {
return false;
};
/**
* Configures any needed endpoint information for an interface.
* You must provide this in your driver.
* Executed when new devices are connected and OKtoEnumerate()
* returned true.
*
* @param ei
* @return zero on success
*/
virtual uint8_t SetInterface(NOTUSED(ENUMERATION_INFO *ei)) {
return UHS_HOST_ERROR_NOT_IMPLEMENTED;
};
/**
* Interface specific additional setup and enumeration that
* can't occur when the descriptor stream is open.
* Also used for collection of unclaimed interfaces, to link to the master.
*
* @return zero on success
*/
virtual uint8_t Finalize(void) {
return 0;
};
/**
* Executed after interface is finalized but, before polling has started.
*
* @return 0 on success
*/
virtual uint8_t OnStart(void) {
return 0;
};
/**
* Start interface polling
* @return
*/
virtual uint8_t Start(void) {
uint8_t rcode = OnStart();
if(!rcode) bPollEnable = true;
return rcode;
};
/**
* Executed before anything else in Release().
*
*/
virtual void OnRelease(void) {
return;
};
/**
* Release resources when device is disconnected.
* Normally this does not need to be overridden.
*/
virtual void Release(void) {
OnRelease();
DriverDefaults();
return;
};
/**
* Executed After driver polls.
* Can be used when there is an important change detected during polling
* and you want to handle it elsewhere.
* Examples:
* Media status change for bulk, e.g. ready, not-ready, media changed, door opened.
* Button state/joystick position/etc changes on a HID device.
* Flow control status change on a communication device, e.g. CTS on serial
*/
virtual void OnPoll(void) {
return;
};
/**
* Poll interface driver. You should override this in your driver if you
* require polling faster or slower than every 100 milliseconds, or your
* driver requires special housekeeping.
*/
virtual void Poll() {
OnPoll();
qNextPollTime = millis() + 100;
};
virtual bool UHS_NI Polling(void) {
return bPollEnable;
}
/**
* This is only for a hub.
* @param port
*/
virtual void ResetHubPort(NOTUSED(uint8_t port)) {
return;
};
#if 0
/**
*
* @return true if this interface is Vendor Specific.
*/
virtual bool IsVSI() {
return false;
}
#endif
};
#if 0
/**
*
* Vendor Specific interface class.
* This is used by a partner interface.
* It can also be used to force-enumerate an interface that
* can use this interface directly.
* You can also add an instance of this class within the interface constructor
* if you expect the interface.
*
* If this is not needed, it may be removed. Nothing I have written needs this.
* Let me know if it is not required, then IsVSI method can also be shit-canned.
* -- AJK
*/
class UHS_VSI : public UHS_USBInterface {
public:
volatile UHS_EpInfo epInfo[1];
volatile ENUMERATION_INFO eInfo;
UHS_VSI(UHS_USB_HOST_BASE *p);
bool OKtoEnumerate(ENUMERATION_INFO *ei);
uint8_t SetInterface(ENUMERATION_INFO *ei);
virtual void DriverDefaults(void);
virtual void Release(void);
uint8_t GetAddress(void) {
return bAddress;
};
virtual bool IsVSI() {
return true;
}
};
#endif
#endif //_USBHOST_H_
#endif

View file

@ -0,0 +1,129 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_UTIL_LOADED)
#define USB_HOST_SYSTEM_UTIL_LOADED
// 0x80 is the default (i.e. trace) to turn off set this global to something lower.
// this allows for 126 other debugging levels.
// TO-DO: Allow assignment to a different serial port by software
int UsbDEBUGlvl = 0x80;
void E_Notifyc(char c, int lvl) {
if(UsbDEBUGlvl < lvl) return;
#if defined(ARDUINO) && ARDUINO >=100
USB_HOST_SERIAL.print(c);
#else
USB_HOST_SERIAL.print(c, BYTE);
#endif
//USB_HOST_SERIAL.flush();
}
void E_Notify(char const * msg, int lvl) {
if(UsbDEBUGlvl < lvl) return;
if(!msg) return;
char c;
while((c = pgm_read_byte(msg++))) E_Notifyc(c, lvl);
}
void E_NotifyStr(char const * msg, int lvl) {
if(UsbDEBUGlvl < lvl) return;
if(!msg) return;
char c;
while((c = *msg++)) E_Notifyc(c, lvl);
}
void E_Notify(uint8_t b, int lvl) {
if(UsbDEBUGlvl < lvl) return;
#if defined(ARDUINO) && ARDUINO >=100
USB_HOST_SERIAL.print(b);
#else
USB_HOST_SERIAL.print(b, DEC);
#endif
}
void E_Notify(double d, int lvl) {
if(UsbDEBUGlvl < lvl) return;
USB_HOST_SERIAL.print(d);
}
#ifdef DEBUG_USB_HOST
void NotifyFailGetDevDescr(void) {
Notify(PSTR("\r\ngetDevDescr "), 0x80);
}
void NotifyFailSetDevTblEntry(void) {
Notify(PSTR("\r\nsetDevTblEn "), 0x80);
}
void NotifyFailGetConfDescr(void) {
Notify(PSTR("\r\ngetConf "), 0x80);
}
void NotifyFailSetConfDescr(void) {
Notify(PSTR("\r\nsetConf "), 0x80);
}
void NotifyFailGetDevDescr(uint8_t reason) {
NotifyFailGetDevDescr();
NotifyFail(reason);
}
void NotifyFailSetDevTblEntry(uint8_t reason) {
NotifyFailSetDevTblEntry();
NotifyFail(reason);
}
void NotifyFailGetConfDescr(uint8_t reason) {
NotifyFailGetConfDescr();
NotifyFail(reason);
}
void NotifyFailSetConfDescr(uint8_t reason) {
NotifyFailSetConfDescr();
NotifyFail(reason);
}
void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) {
Notify(PSTR("\r\nUnknown Device Connected - VID: "), 0x80);
D_PrintHex<uint16_t > (VID, 0x80);
Notify(PSTR(" PID: "), 0x80);
D_PrintHex<uint16_t > (PID, 0x80);
}
void NotifyFail(uint8_t rcode) {
D_PrintHex<uint8_t > (rcode, 0x80);
Notify(PSTR("\r\n"), 0x80);
}
#endif
#else
#error "Never include UHS_util_INLINE.h, include UHS_host.h instead"
#endif

View file

@ -0,0 +1,226 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(USB_HOST_SHIELD_H) || defined(_max3421e_h_)
#error "Never include UHS_max3421e.h directly; include USB_HOST_SHIELD.h instead"
#else
#define _max3421e_h_
/* MAX3421E register/bit names and bitmasks */
#define SE0 0
#define SE1 1
#define FSHOST 2
#define LSHOST 3
/* MAX3421E command byte format: rrrrr0wa where 'r' is register number */
//
// MAX3421E Registers in HOST mode.
//
#define rRCVFIFO 0x08 // Receive FIFO Register
#define rSNDFIFO 0x10 // Send FIFO Register
#define rSUDFIFO 0x20 // Set Up Data FIFO Register
#define rRCVBC 0x30 // Receive FIFO Byte Count Register
#define rSNDBC 0x38 // Send FIFO Byte Count Register
// USB Interrupt Request Status (USBIRQ)
#define rUSBIRQ 0x68 // USB Interrupt Request Register
#define bmVBUSIRQ 0x40 // Vbus Present Interrupt Request
#define bmNOVBUSIRQ 0x20 // Vbus Absent Interrupt Request
#define bmOSCOKIRQ 0x01 // Oscillator OK Interrupt Request
// USB Interrupt Request Control (USBIEN)
#define rUSBIEN 0x70 // USB Interrupt Request Enable Register
#define bmVBUSIE bmVBUSIRQ // Vbus Present Interrupt Request Enable
#define bmNOVBUSIE bmNOVBUSIRQ // Vbus Absent Interrupt Request Enable
#define bmOSCOKIE bmOSCOKIRQ // Oscillator OK Interrupt Request Enable
// (USBCTL)
#define rUSBCTL 0x78 //15<<3
#define bmCHIPRES 0x20 //b5
#define bmPWRDOWN 0x10 //b4
// (CPUCTL)
#define rCPUCTL 0x80 //16<<3
#define bmPUSLEWID1 0x80 //b7
#define bmPULSEWID0 0x40 //b6
#define bmIE 0x01 //b0
// bmPUSLEWID1 bmPULSEWID0 Pulse width
// 0 0 10.6uS
// 0 1 5.3uS
// 1 0 2.6uS
// 1 1 1.3uS
#define PUSLEWIDTH10_6 (0)
#define PUSLEWIDTH5_3 (bmPULSEWID0)
#define PUSLEWIDTH2_6 (bmPUSLEWID1)
#define PUSLEWIDTH1_3 (bmPULSEWID0 | bmPUSLEWID1)
// (PINCTL)
#define rPINCTL 0x88 //17<<3
#define bmFDUPSPI 0x10 //b4
#define bmINTLEVEL 0x08 //b3
#define bmPOSINT 0x04 //b2
#define bmGPXB 0x02 //b1
#define bmGPXA 0x01 //b0
// GPX pin selections
#define GPX_OPERATE 0x00 //
#define GPX_VBDET 0x01 //
#define GPX_BUSACT 0x02 //
#define GPX_SOF 0x03 //
#define rREVISION 0x90 //18<<3
// (IOPINS1)
#define rIOPINS1 0xa0 //20<<3
#define bmGPOUT0 0x01 //
#define bmGPOUT1 0x02 //
#define bmGPOUT2 0x04 //
#define bmGPOUT3 0x08 //
#define bmGPIN0 0x10 //
#define bmGPIN1 0x20 //
#define bmGPIN2 0x40 //
#define bmGPIN3 0x80 //
// (IOPINS2)
#define rIOPINS2 0xa8 //21<<3
#define bmGPOUT4 0x01 //
#define bmGPOUT5 0x02 //
#define bmGPOUT6 0x04 //
#define bmGPOUT7 0x08 //
#define bmGPIN4 0x10 //
#define bmGPIN5 0x20 //
#define bmGPIN6 0x40 //
#define bmGPIN7 0x80 //
// (GPINIRQ)
#define rGPINIRQ 0xb0 //22<<3
#define bmGPINIRQ0 0x01 //
#define bmGPINIRQ1 0x02 //
#define bmGPINIRQ2 0x04 //
#define bmGPINIRQ3 0x08 //
#define bmGPINIRQ4 0x10 //
#define bmGPINIRQ5 0x20 //
#define bmGPINIRQ6 0x40 //
#define bmGPINIRQ7 0x80 //
// (GPINIEN)
#define rGPINIEN 0xb8 //23<<3
#define bmGPINIEN0 0x01 //
#define bmGPINIEN1 0x02 //
#define bmGPINIEN2 0x04 //
#define bmGPINIEN3 0x08 //
#define bmGPINIEN4 0x10 //
#define bmGPINIEN5 0x20 //
#define bmGPINIEN6 0x40 //
#define bmGPINIEN7 0x80 //
// (GPINPOL)
#define rGPINPOL 0xc0 //24<<3
#define bmGPINPOL0 0x01 //
#define bmGPINPOL1 0x02 //
#define bmGPINPOL2 0x04 //
#define bmGPINPOL3 0x08 //
#define bmGPINPOL4 0x10 //
#define bmGPINPOL5 0x20 //
#define bmGPINPOL6 0x40 //
#define bmGPINPOL7 0x80 //
//
// If any data transfer errors occur, the HXFRDNIRQ asserts, while the RCVDAVIRQ does not.
//
// The CPU clears the SNDBAVIRQ by writing the SNDBC register.
// The CPU should never directly clear the SNDBAVIRQ bit.
// Host Interrupt Request Status (HIRQ)
#define rHIRQ 0xc8 // Host Interrupt Request Register
#define bmBUSEVENTIRQ 0x01 // BUS Reset Done or BUS Resume Interrupt Request
#define bmRWUIRQ 0x02 // Remote Wakeup Interrupt Request
#define bmRCVDAVIRQ 0x04 // Receive FIFO Data Available Interrupt Request
#define bmSNDBAVIRQ 0x08 // Send Buffer Available Interrupt Request
#define bmSUSDNIRQ 0x10 // Suspend operation Done Interrupt Request
#define bmCONDETIRQ 0x20 // Peripheral Connect/Disconnect Interrupt Request
#define bmFRAMEIRQ 0x40 // Frame Generator Interrupt Request
#define bmHXFRDNIRQ 0x80 // Host Transfer Done Interrupt Request
// IRQs that are OK for the CPU to clear
#define ICLRALLBITS (bmBUSEVENTIRQ | bmRWUIRQ | bmRCVDAVIRQ | bmSUSDNIRQ | bmCONDETIRQ | bmFRAMEIRQ | bmHXFRDNIRQ)
// Host Interrupt Request Control (HIEN)
#define rHIEN 0xd0 //
#define bmBUSEVENTIE bmBUSEVENTIRQ // BUS Reset Done or BUS Resume Interrupt Request Enable
#define bmRWUIE bmRWUIRQ // Remote Wakeup Interrupt Request Enable
#define bmRCVDAVIE bmRCVDAVIRQ // Receive FIFO Data Available Interrupt Request Enable
#define bmSNDBAVIE bmSNDBAVIRQ // Send Buffer Available Interrupt Request Enable
#define bmSUSDNIE bmSUSDNIRQ // Suspend operation Done Interrupt Request Enable
#define bmCONDETIE bmCONDETIRQ // Peripheral Connect/Disconnect Interrupt Request Enable
#define bmFRAMEIE bmFRAMEIRQ // Frame Generator Interrupt Request Enable
#define bmHXFRDNIE bmHXFRDNIRQ // Host Transfer Done Interrupt Request Enable
// (MODE))
#define rMODE 0xd8 //27<<3
#define bmHOST 0x01 //
#define bmLOWSPEED 0x02 //
#define bmHUBPRE 0x04 //
#define bmSOFKAENAB 0x08 //
#define bmSEPIRQ 0x10 //
#define bmDELAYISO 0x20 //
#define bmDMPULLDN 0x40 //
#define bmDPPULLDN 0x80 //
#define rPERADDR 0xe0 //28<<3
// (HCTL)
#define rHCTL 0xe8 //29<<3
#define bmBUSRST 0x01 //
#define bmFRMRST 0x02 //
#define bmSAMPLEBUS 0x04 //
#define bmSIGRSM 0x08 //
#define bmRCVTOG0 0x10 //
#define bmRCVTOG1 0x20 //
#define bmSNDTOG0 0x40 //
#define bmSNDTOG1 0x80 //
// Host transfer (HXFR)
#define rHXFR 0xf0 //30<<3
/* Host transfer token values for writing the HXFR register (R30) */
/* OR this bit field with the endpoint number in bits 3:0 */
#define MAX3421E_tokSETUP 0x10 // HS=0, ISO=0, OUTNIN=0, SETUP=1
#define MAX3421E_tokIN 0x00 // HS=0, ISO=0, OUTNIN=0, SETUP=0
#define MAX3421E_tokOUT 0x20 // HS=0, ISO=0, OUTNIN=1, SETUP=0
#define MAX3421E_tokINHS 0x80 // HS=1, ISO=0, OUTNIN=0, SETUP=0
#define MAX3421E_tokOUTHS 0xA0 // HS=1, ISO=0, OUTNIN=1, SETUP=0
#define MAX3421E_tokISOIN 0x40 // HS=0, ISO=1, OUTNIN=0, SETUP=0
#define MAX3421E_tokISOOUT 0x60 // HS=0, ISO=1, OUTNIN=1, SETUP=0
// (HRSL)
#define rHRSL 0xf8 //31<<3
#define bmRCVTOGRD 0x10 //
#define bmSNDTOGRD 0x20 //
#define bmKSTATUS 0x40 //
#define bmJSTATUS 0x80 //
#define bmSE0 0x00 //SE0 - disconnect state
#define bmSE1 0xc0 //SE1 - illegal state
#define MODE_FS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmSOFKAENAB)
#define MODE_LS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmLOWSPEED|bmSOFKAENAB)
#endif //_max3421e_h_

View file

@ -0,0 +1,519 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#ifndef USB_HOST_SHIELD_H
#define USB_HOST_SHIELD_H
// uncomment to get 'printf' console debugging. NOT FOR UNO!
//#define DEBUG_PRINTF_EXTRA_HUGE_USB_HOST_SHIELD
#ifdef LOAD_USB_HOST_SHIELD
#include "UHS_max3421e.h"
#include <SPI.h>
#if !defined(SPI_HAS_TRANSACTION)
#error "Your SPI library installation is too old."
#else
#if !defined(SPI_ATOMIC_VERSION)
#warning "Your SPI library installation lacks 'SPI_ATOMIC_VERSION'. Please complain to the maintainer."
#elif SPI_ATOMIC_VERSION < 1
#error "Your SPI library installation is too old."
#endif
#endif
#if DEBUG_PRINTF_EXTRA_HUGE
#ifdef DEBUG_PRINTF_EXTRA_HUGE_USB_HOST_SHIELD
#define MAX_HOST_DEBUG(...) printf_P(__VA_ARGS__)
#else
#define MAX_HOST_DEBUG(...) VOID0
#endif
#else
#define MAX_HOST_DEBUG(...) VOID0
#endif
#if !defined(USB_HOST_SHIELD_USE_ISR)
#if defined(USE_MULTIPLE_APP_API)
#define USB_HOST_SHIELD_USE_ISR 0
#else
#define USB_HOST_SHIELD_USE_ISR 1
#endif
#else
#define USB_HOST_SHIELD_USE_ISR 1
#endif
#if !USB_HOST_SHIELD_USE_ISR
#error NOISR Polled mode _NOT SUPPORTED YET_
//
// Polled defaults
//
#if defined(BOARD_BLACK_WIDDOW)
#define UHS_MAX3421E_SS_ 6
#define UHS_MAX3421E_INT_ 3
#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
#if EXT_RAM
// Teensy++ 2.0 with XMEM2
#define UHS_MAX3421E_SS_ 20
#define UHS_MAX3421E_INT_ 7
#else
#define UHS_MAX3421E_SS_ 9
#define UHS_MAX3421E_INT_ 8
#endif
#define UHS_MAX3421E_SPD
#elif defined(ARDUINO_AVR_ADK)
#define UHS_MAX3421E_SS_ 53
#define UHS_MAX3421E_INT_ 54
#elif defined(ARDUINO_AVR_BALANDUINO)
#define UHS_MAX3421E_SS_ 20
#define UHS_MAX3421E_INT_ 19
#else
#define UHS_MAX3421E_SS_ 10
#define UHS_MAX3421E_INT_ 9
#endif
#else
#if defined(ARDUINO_ARCH_PIC32)
// PIC32 only allows edge interrupts, isn't that lovely? We'll emulate it...
#if CHANGE < 2
#error core too old.
#endif
#define IRQ_IS_EDGE 0
#ifndef digitalPinToInterrupt
// great, this isn't implemented.
#warning digitalPinToInterrupt is not defined, complain here https://github.com/chipKIT32/chipKIT-core/issues/114
#if defined(_BOARD_UNO_) || defined(_BOARD_UC32_)
#define digitalPinToInterrupt(p) ((p) == 2 ? 1 : ((p) == 7 ? 2 : ((p) == 8 ? 3 : ((p) == 35 ? 4 : ((p) == 38 ? 0 : NOT_AN_INTERRUPT)))))
#warning digitalPinToInterrupt is now defined until this is taken care of.
#else
#error digitalPinToInterrupt not defined for your board, complain here https://github.com/chipKIT32/chipKIT-core/issues/114
#endif
#endif
#else
#define IRQ_IS_EDGE 0
#endif
// More stupidity from our friends @ Sony...
#if defined(ARDUINO_spresense_ast)
#if !defined(NOT_AN_INTERRUPT)
#define NOT_AN_INTERRUPT -1
#endif
#endif
// SAMD uses an enum for this instead of a define. Isn't that just dandy?
#if !defined(NOT_AN_INTERRUPT) && !defined(ARDUINO_ARCH_SAMD)
#warning NOT_AN_INTERRUPT not defined, possible problems ahead.
#warning If NOT_AN_INTERRUPT is an enum or something else, complain to UHS30 developers on github.
#warning Otherwise complain to your board core developer/maintainer.
#define NOT_AN_INTERRUPT -1
#endif
//
// Interrupt defaults. Int0 or Int1
//
#ifdef BOARD_BLACK_WIDDOW
#error "HELP! Please send us an email, I don't know the values for Int0 and Int1 on the Black Widow board!"
#elif defined(ARDUINO_AVR_ADK)
#define UHS_MAX3421E_SS_ 53
#define UHS_MAX3421E_INT_ 54
#elif defined(ARDUINO_spresense_ast)
#define UHS_MAX3421E_SS_ 21
#define UHS_MAX3421E_INT_ 20
#define SPIclass SPI5
//#define UHS_MAX3421E_SPD 100000
#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
// TO-DO!
#if EXT_RAM
// Teensy++ 2.0 with XMEM2
#define UHS_MAX3421E_SS_ 20
#define UHS_MAX3421E_INT_ 7
#else
#define UHS_MAX3421E_SS_ 9
#define UHS_MAX3421E_INT_ 8
#endif
#elif defined(ARDUINO_AVR_BALANDUINO)
#error "ISR mode is currently not supported on the Balanduino. Please set USB_HOST_SHIELD_USE_ISR to 0."
#else
#define UHS_MAX3421E_SS_ 10
#ifdef __AVR__
#if defined(__AVR_ATmega32U4__)
#define INT_FOR_PIN2 1
#define INT_FOR_PIN3 0
#else
// Everybody else???
#define INT_FOR_PIN2 0
#define INT_FOR_PIN3 1
#endif
#define UHS_MAX3421E_INT_ 3
#else
// Non-avr
#if defined(ARDUINO_ARCH_PIC32)
// UNO32 External Interrupts:
// Pin 38 (INT0), Pin 2 (INT1), Pin 7 (INT2), Pin 8 (INT3), Pin 35 (INT4)
#define UHS_MAX3421E_INT_ 7
#else
#define UHS_MAX3421E_INT_ 9
#endif
#endif
#endif
#endif
#if defined(NO_AUTO_SPEED)
// Ugly details section...
// MAX3421E characteristics
// SPI Serial - Clock Input. An external SPI master supplies SCLK with frequencies up to 26MHz. The
// logic level is referenced to the voltage on VL. Data is clocked into the SPI slave inter face on the
// rising edge of SCLK. Data is clocked out of the SPI slave interface on the falling edge of SCLK.
// Serial Clock (SCLK) Period 38.4ns minimum. 17ns minimum pulse width. VL >2.5V
// SCLK Fall to MISO Propagation Delay 14.2ns
// SCLK Fall to MOSI Propagation Delay 14.2ns
// SCLK Fall to MOSI Drive 3.5ns
// Theoretical deadline for reply 17.7ns
// 26MHz 38.4615ns period <-- MAX3421E theoretical maximum
#if !defined(UHS_MAX3421E_SPD)
#if defined(ARDUINO_SAMD_ZERO)
// Zero violates spec early, needs a long setup time, or doesn't like high latency.
#define UHS_MAX3421E_SPD 10000000
#elif defined(ARDUINO_ARCH_PIC32)
// PIC MX 5/6/7 characteristics
// 25MHZ 40ns period <-- PIC MX 5/6/7 theoretical maximum
// pulse width minimum Tsclk/2ns
// Trise/fall 10ns maximum. 5ns is typical but not guaranteed.
// Tsetup minimum for MISO 10ns.
// We are in violation by 7.7ns @ 25MHz due to latency alone.
// Even reading at end of data cycle, we only have a 2.3ns window.
// This is too narrow to to compensate for capacitance, trace lengths, and noise.
// 17.7ns + 10ns = 27.7ns
// 18MHz fits and has enough slack time to compensate for capacitance, trace lengths, and noise.
// For high speeds the SMP bit is recommended too, which samples at the end instead of the middle.
// 20Mhz seems to work.
#define UHS_MAX3421E_SPD 20000000
#else
#define UHS_MAX3421E_SPD 25000000
#endif
#endif
#else
// We start at 25MHz, and back down until hardware can take it.
// Of course, SPI library can adjust this for us too.
// Why not 26MHz? Because I have not found any MCU board that
// can actually go that fast without problems.
// Could be a shield limitation too.
#if !defined(UHS_MAX3421E_SPD)
#define UHS_MAX3421E_SPD 25000000
#endif
#endif
#ifndef UHS_MAX3421E_INT
#define UHS_MAX3421E_INT UHS_MAX3421E_INT_
#endif
#ifndef UHS_MAX3421E_SS
#define UHS_MAX3421E_SS UHS_MAX3421E_SS_
#endif
// NOTE: On the max3421e the irq enable and irq bits are in the same position.
// IRQs used if CPU polls
#define ENIBITSPOLLED (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE)
// IRQs used if CPU is interrupted
#define ENIBITSISR (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE /* | bmRCVDAVIRQ | bmSNDBAVIRQ | bmHXFRDNIRQ */ )
#if !USB_HOST_SHIELD_USE_ISR
#define IRQ_CHECK_MASK (ENIBITSPOLLED & ICLRALLBITS)
#define IRQ_IS_EDGE 0
#else
#define IRQ_CHECK_MASK (ENIBITSISR & ICLRALLBITS)
#endif
#if IRQ_IS_EDGE
// Note: UNO32 Interrupts can only be RISING, or FALLING.
// This poses an interesting problem, since we want to use a LOW level.
// The MAX3421E provides for pulse width control for an IRQ.
// We do need to watch the timing on this, as a second IRQ could cause
// a missed IRQ, since we read the level of the line to check if the IRQ
// is actually for this chip. The only other alternative is to add a capacitor
// and an NPN transistor, and use two lines. We can try this first, though.
// Worse case, we can ignore reading the pin for verification on UNO32.
// Too bad there is no minimum low width setting.
//
// Single Clear First Second Clear first Clear last
// IRQ Single IRQ IRQ Second active pending IRQ
// | | | | | |
// V V V V V V
// _____ _________ _ _ _______
// |______| |______| |______| |______________|
//
#define IRQ_SENSE FALLING
#if defined(ARDUINO_ARCH_PIC32)
//#define bmPULSEWIDTH PUSLEWIDTH10_6
#define bmPULSEWIDTH 0
#define bmIRQ_SENSE 0
#else
#define bmPULSEWIDTH PUSLEWIDTH1_3
#define bmIRQ_SENSE 0
#endif
#else
#if !defined(IRQ_SENSE)
#define IRQ_SENSE LOW
#endif
#if !defined(bmPULSEWIDTH)
#define bmPULSEWIDTH 0
#endif
#if !defined(bmIRQ_SENSE)
#define bmIRQ_SENSE bmINTLEVEL
#endif
#endif
class MAX3421E_HOST :
public UHS_USB_HOST_BASE
#if defined(SWI_IRQ_NUM)
, public dyn_SWI
#endif
{
// TO-DO: move these into the parent class.
volatile uint8_t vbusState;
volatile uint16_t sof_countdown;
// TO-DO: pack into a struct/union and use one byte
volatile bool busevent;
volatile bool sofevent;
volatile bool counted;
volatile bool condet;
volatile bool doingreset;
#ifdef USB_HOST_MANUAL_POLL
volatile bool frame_irq_enabled = false;
bool enable_frame_irq(bool enable) {
const bool prev_state = frame_irq_enabled;
if(prev_state != enable) {
if(enable)
regWr(rHIEN, regRd(rHIEN) | bmFRAMEIE);
else
regWr(rHIEN, regRd(rHIEN) & ~bmFRAMEIE);
frame_irq_enabled = enable;
}
return prev_state;
}
#endif
public:
SPISettings MAX3421E_SPI_Settings;
uint8_t ss_pin;
uint8_t irq_pin;
// Will use the defaults UHS_MAX3421E_SS, UHS_MAX3421E_INT and speed
UHS_NI MAX3421E_HOST(void) {
sof_countdown = 0;
busevent = false;
doingreset = false;
sofevent = false;
condet = false;
ss_pin = UHS_MAX3421E_SS;
irq_pin = UHS_MAX3421E_INT;
MAX3421E_SPI_Settings = SPISettings(UHS_MAX3421E_SPD, MSBFIRST, SPI_MODE0);
hub_present = 0;
};
// Will use user supplied pins, and UHS_MAX3421E_SPD
UHS_NI MAX3421E_HOST(uint8_t pss, uint8_t pirq) {
sof_countdown = 0;
busevent = false;
doingreset = false;
sofevent = false;
condet = false;
ss_pin = pss;
irq_pin = pirq;
MAX3421E_SPI_Settings = SPISettings(UHS_MAX3421E_SPD, MSBFIRST, SPI_MODE0);
hub_present = 0;
};
// Will use user supplied pins, and speed
UHS_NI MAX3421E_HOST(uint8_t pss, uint8_t pirq, uint32_t pspd) {
sof_countdown = 0;
doingreset = false;
busevent = false;
sofevent = false;
condet = false;
ss_pin = pss;
irq_pin = pirq;
MAX3421E_SPI_Settings = SPISettings(pspd, MSBFIRST, SPI_MODE0);
hub_present = 0;
};
virtual bool UHS_NI sof_delay(uint16_t x) {
#ifdef USB_HOST_MANUAL_POLL
const bool saved_irq_state = enable_frame_irq(true);
#endif
sof_countdown = x;
while((sof_countdown != 0) && !condet) {
SYSTEM_OR_SPECIAL_YIELD();
#if !USB_HOST_SHIELD_USE_ISR
Task();
#endif
}
#ifdef USB_HOST_MANUAL_POLL
enable_frame_irq(saved_irq_state);
#endif
// Serial.println("...Wake");
return (!condet);
};
virtual UHS_EpInfo *ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t* dataptr);
virtual void UHS_NI vbusPower(VBUS_t state) {
regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE) | (uint8_t)(state));
};
void UHS_NI Task(void);
virtual uint8_t SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo **ppep, uint16_t &nak_limit);
virtual uint8_t OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data);
virtual uint8_t InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data);
virtual uint8_t ctrlReqClose(UHS_EpInfo *pep, uint8_t bmReqType, uint16_t left, uint16_t nbytes, uint8_t *dataptr);
virtual uint8_t ctrlReqRead(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint16_t nbytes, uint8_t *dataptr);
virtual uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit);
void UHS_NI ReleaseChildren(void) {
for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++)
if(devConfig[i])
devConfig[i]->Release();
hub_present = 0;
};
virtual bool IsHub(uint8_t klass) {
if(klass == UHS_USB_CLASS_HUB) {
hub_present = bmHUBPRE;
return true;
}
return false;
};
virtual void VBUS_changed(void);
virtual void UHS_NI doHostReset(void) {
#if USB_HOST_SHIELD_USE_ISR
// Enable interrupts
noInterrupts();
#endif
doingreset = true;
busevent = true;
regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet.
regWr(rHCTL, bmBUSRST); //issue bus reset
#if USB_HOST_SHIELD_USE_ISR
DDSB();
// Enable interrupts
interrupts();
#endif
while(busevent) {
DDSB();
SYSTEM_OR_SPECIAL_YIELD();
}
#endif
#if USB_HOST_SHIELD_USE_ISR
// Enable interrupts
noInterrupts();
#endif
#ifdef USB_HOST_MANUAL_POLL
enable_frame_irq(true);
#endif
sofevent = true;
#if USB_HOST_SHIELD_USE_ISR
DDSB();
// Enable interrupts
interrupts();
#endif
// Wait for SOF
while(sofevent) {
}
#if USB_HOST_SHIELD_USE_ISR
// Enable interrupts
noInterrupts();
#endif
doingreset = false;
#if USB_HOST_SHIELD_USE_ISR
DDSB();
// Enable interrupts
interrupts();
};
int16_t UHS_NI Init(int16_t mseconds);
int16_t UHS_NI Init(void) {
return Init(INT16_MIN);
};
void ISRTask(void);
void ISRbottom(void);
void busprobe(void);
uint16_t reset(void);
// MAX3421e specific
void regWr(uint8_t reg, uint8_t data);
void gpioWr(uint8_t data);
uint8_t regRd(uint8_t reg);
uint8_t gpioRd(void);
uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
// ARM/NVIC specific, used to emulate reentrant ISR.
#if defined(SWI_IRQ_NUM)
void dyn_SWISR(void) {
ISRbottom();
};
#endif
virtual void UHS_NI suspend_host(void) {
// Used on MCU that lack control of IRQ priority (AVR).
// Suspends ISRs, for critical code. IRQ will be serviced after it is resumed.
// NOTE: you must track the state yourself!
#if defined(__AVR__)
noInterrupts();
detachInterrupt(UHS_GET_DPI(irq_pin));
interrupts();
#endif
};
virtual void UHS_NI resume_host(void);
};
#if !defined(SPIclass)
#define SPIclass SPI
#endif
#if !defined(USB_HOST_SHIELD_LOADED)
#include "USB_HOST_SHIELD_INLINE.h"
#endif
#else
#error "define LOAD_USB_HOST_SHIELD in your sketch, never include USB_HOST_SHIELD.h in a driver."
#endif
#endif /* USB_HOST_SHIELD_H */

View file

@ -0,0 +1,1003 @@
/* Copyright (C) 2015-2016 Andrew J. Kroll
and
Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as publishe7d by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if defined(USB_HOST_SHIELD_H) && !defined(USB_HOST_SHIELD_LOADED)
#define USB_HOST_SHIELD_LOADED
#include <Arduino.h>
#if !defined(digitalPinToInterrupt)
#error digitalPinToInterrupt not defined, complain to your board maintainer.
#endif
#if USB_HOST_SHIELD_USE_ISR
// allow two slots. this makes the maximum allowed shield count TWO
// for AVRs this is limited to pins 2 and 3 ONLY
// for all other boards, one odd and one even pin number is allowed.
static MAX3421E_HOST *ISReven;
static MAX3421E_HOST *ISRodd;
static void UHS_NI call_ISReven(void) {
ISReven->ISRTask();
}
static void UHS_NI call_ISRodd(void) {
UHS_PIN_WRITE(LED_BUILTIN, HIGH);
ISRodd->ISRTask();
}
#endif
void UHS_NI MAX3421E_HOST::resume_host(void) {
// Used on MCU that lack control of IRQ priority (AVR).
// Resumes ISRs.
// NOTE: you must track the state yourself!
#if defined(__AVR__)
noInterrupts();
if(irq_pin & 1) {
ISRodd = this;
attachInterrupt(UHS_GET_DPI(irq_pin), call_ISRodd, IRQ_SENSE);
} else {
ISReven = this;
attachInterrupt(UHS_GET_DPI(irq_pin), call_ISReven, IRQ_SENSE);
}
interrupts();
#endif
}
/* write single byte into MAX3421e register */
void UHS_NI MAX3421E_HOST::regWr(uint8_t reg, uint8_t data) {
SPIclass.beginTransaction(MAX3421E_SPI_Settings);
MARLIN_UHS_WRITE_SS(LOW);
SPIclass.transfer(reg | 0x02);
SPIclass.transfer(data);
MARLIN_UHS_WRITE_SS(HIGH);
SPIclass.endTransaction();
}
/* multiple-byte write */
/* returns a pointer to memory position after last written */
uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
SPIclass.beginTransaction(MAX3421E_SPI_Settings);
MARLIN_UHS_WRITE_SS(LOW);
SPIclass.transfer(reg | 0x02);
//printf("%2.2x :", reg);
while(nbytes) {
SPIclass.transfer(*data_p);
//printf("%2.2x ", *data_p);
nbytes--;
data_p++; // advance data pointer
}
MARLIN_UHS_WRITE_SS(HIGH);
SPIclass.endTransaction();
//printf("\r\n");
return (data_p);
}
/* GPIO write */
/*GPIO byte is split between 2 registers, so two writes are needed to write one byte */
/* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */
void UHS_NI MAX3421E_HOST::gpioWr(uint8_t data) {
regWr(rIOPINS1, data);
data >>= 4;
regWr(rIOPINS2, data);
return;
}
/* single host register read */
uint8_t UHS_NI MAX3421E_HOST::regRd(uint8_t reg) {
SPIclass.beginTransaction(MAX3421E_SPI_Settings);
MARLIN_UHS_WRITE_SS(LOW);
SPIclass.transfer(reg);
uint8_t rv = SPIclass.transfer(0);
MARLIN_UHS_WRITE_SS(HIGH);
SPIclass.endTransaction();
return (rv);
}
/* multiple-byte register read */
/* returns a pointer to a memory position after last read */
uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
SPIclass.beginTransaction(MAX3421E_SPI_Settings);
MARLIN_UHS_WRITE_SS(LOW);
SPIclass.transfer(reg);
while(nbytes) {
*data_p++ = SPIclass.transfer(0);
nbytes--;
}
MARLIN_UHS_WRITE_SS(HIGH);
SPIclass.endTransaction();
return ( data_p);
}
/* GPIO read. See gpioWr for explanation */
/* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */
uint8_t UHS_NI MAX3421E_HOST::gpioRd(void) {
uint8_t gpin = 0;
gpin = regRd(rIOPINS2); //pins 4-7
gpin &= 0xf0; //clean lower nibble
gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation.
return ( gpin);
}
/* reset MAX3421E. Returns number of microseconds it took for PLL to stabilize after reset
or zero if PLL haven't stabilized in 65535 cycles */
uint16_t UHS_NI MAX3421E_HOST::reset(void) {
uint16_t i = 0;
// Initiate chip reset
regWr(rUSBCTL, bmCHIPRES);
regWr(rUSBCTL, 0x00);
int32_t now;
uint32_t expires = micros() + 65535;
// Enable full-duplex SPI so we can read rUSBIRQ
regWr(rPINCTL, bmFDUPSPI);
while((int32_t)(micros() - expires) < 0L) {
if((regRd(rUSBIRQ) & bmOSCOKIRQ)) {
break;
}
}
now = (int32_t)(micros() - expires);
if(now < 0L) {
i = 65535 + now; // Note this subtracts, as now is negative
}
return (i);
}
void UHS_NI MAX3421E_HOST::VBUS_changed(void) {
/* modify USB task state because Vbus changed or unknown */
uint8_t speed = 1;
//printf("\r\n\r\n\r\n\r\nSTATE %2.2x -> ", usb_task_state);
switch(vbusState) {
case LSHOST: // Low speed
speed = 0;
// Intentional fall-through
case FSHOST: // Full speed
// Start device initialization if we are not initializing
// Resets to the device cause an IRQ
// usb_task_state == UHS_USB_HOST_STATE_RESET_NOT_COMPLETE;
//if((usb_task_state & UHS_USB_HOST_STATE_MASK) != UHS_USB_HOST_STATE_DETACHED) {
ReleaseChildren();
if(!doingreset) {
if(usb_task_state == UHS_USB_HOST_STATE_RESET_NOT_COMPLETE) {
usb_task_state = UHS_USB_HOST_STATE_WAIT_BUS_READY;
} else if(usb_task_state != UHS_USB_HOST_STATE_WAIT_BUS_READY) {
usb_task_state = UHS_USB_HOST_STATE_DEBOUNCE;
}
}
sof_countdown = 0;
break;
case SE1: //illegal state
sof_countdown = 0;
doingreset = false;
ReleaseChildren();
usb_task_state = UHS_USB_HOST_STATE_ILLEGAL;
break;
case SE0: //disconnected
default:
sof_countdown = 0;
doingreset = false;
ReleaseChildren();
usb_task_state = UHS_USB_HOST_STATE_IDLE;
break;
}
usb_host_speed = speed;
//printf("0x%2.2x\r\n\r\n\r\n\r\n", usb_task_state);
return;
};
/**
* Probe bus to determine device presence and speed,
* then switch host to detected speed.
*/
void UHS_NI MAX3421E_HOST::busprobe(void) {
uint8_t bus_sample;
uint8_t tmpdata;
bus_sample = regRd(rHRSL); //Get J,K status
bus_sample &= (bmJSTATUS | bmKSTATUS); //zero the rest of the byte
switch(bus_sample) { //start full-speed or low-speed host
case(bmJSTATUS):
// Serial.println("J");
if((regRd(rMODE) & bmLOWSPEED) == 0) {
regWr(rMODE, MODE_FS_HOST); // start full-speed host
vbusState = FSHOST;
} else {
regWr(rMODE, MODE_LS_HOST); // start low-speed host
vbusState = LSHOST;
}
#ifdef USB_HOST_MANUAL_POLL
enable_frame_irq(true);
#endif
tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation
regWr(rHIRQ, bmFRAMEIRQ); // see data sheet.
regWr(rMODE, tmpdata);
break;
case(bmKSTATUS):
// Serial.println("K");
if((regRd(rMODE) & bmLOWSPEED) == 0) {
regWr(rMODE, MODE_LS_HOST); // start low-speed host
vbusState = LSHOST;
} else {
regWr(rMODE, MODE_FS_HOST); // start full-speed host
vbusState = FSHOST;
}
#ifdef USB_HOST_MANUAL_POLL
enable_frame_irq(true);
#endif
tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation
regWr(rHIRQ, bmFRAMEIRQ); // see data sheet.
regWr(rMODE, tmpdata);
break;
case(bmSE1): //illegal state
// Serial.println("I");
regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST);
vbusState = SE1;
// sofevent = false;
break;
case(bmSE0): //disconnected state
// Serial.println("D");
regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST);
vbusState = SE0;
// sofevent = false;
break;
}//end switch( bus_sample )
}
/**
* Initialize USB hardware, turn on VBUS
*
* @param mseconds Delay energizing VBUS after mseconds, A value of INT16_MIN means no delay.
* @return 0 on success, -1 on error
*/
int16_t UHS_NI MAX3421E_HOST::Init(int16_t mseconds) {
usb_task_state = UHS_USB_HOST_STATE_INITIALIZE; //set up state machine
// Serial.print("MAX3421E 'this' USB Host @ 0x");
// Serial.println((uint32_t)this, HEX);
// Serial.print("MAX3421E 'this' USB Host Address Pool @ 0x");
// Serial.println((uint32_t)GetAddressPool(), HEX);
Init_dyn_SWI();
UHS_printf_HELPER_init();
noInterrupts();
#ifdef ARDUINO_AVR_ADK
// For Mega ADK, which has a Max3421e on-board,
// set MAX_RESET to output mode, and then set it to HIGH
// PORTJ bit 2
if(irq_pin == 54) {
DDRJ |= 0x04; // output
PORTJ |= 0x04; // HIGH
}
#endif
SPIclass.begin();
#ifdef ARDUINO_AVR_ADK
if(irq_pin == 54) {
DDRE &= ~0x20; // input
PORTE |= 0x20; // pullup
} else
#endif
pinMode(irq_pin, INPUT_PULLUP);
//UHS_PIN_WRITE(irq_pin, HIGH);
pinMode(ss_pin, OUTPUT);
MARLIN_UHS_WRITE_SS(HIGH);
#ifdef USB_HOST_SHIELD_TIMING_PIN
pinMode(USB_HOST_SHIELD_TIMING_PIN, OUTPUT);
// My counter/timer can't work on an inverted gate signal
// so we gate using a high pulse -- AJK
UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, LOW);
#endif
interrupts();
#if USB_HOST_SHIELD_USE_ISR
int intr = digitalPinToInterrupt(irq_pin);
if(intr == NOT_AN_INTERRUPT) {
#if defined(ARDUINO_AVR_ADK)
if(irq_pin == 54)
intr = 6;
else
#endif
return (-2);
}
SPIclass.usingInterrupt(intr);
#else
SPIclass.usingInterrupt(255);
#endif
#if !defined(NO_AUTO_SPEED)
// test to get to reset acceptance.
uint32_t spd = UHS_MAX3421E_SPD;
again:
MAX3421E_SPI_Settings = SPISettings(spd, MSBFIRST, SPI_MODE0);
if(reset() == 0) {
MAX_HOST_DEBUG(PSTR("Fail SPI speed %lu\r\n"), spd);
if(spd > 1999999) {
spd -= 1000000;
goto again;
}
return (-1);
} else {
// reset passes, does 64k?
uint8_t sample_wr = 0;
uint8_t sample_rd = 0;
uint8_t gpinpol_copy = regRd(rGPINPOL);
for(uint16_t j = 0; j < 65535; j++) {
regWr(rGPINPOL, sample_wr);
sample_rd = regRd(rGPINPOL);
if(sample_rd != sample_wr) {
MAX_HOST_DEBUG(PSTR("Fail SPI speed %lu\r\n"), spd);
if(spd > 1999999) {
spd -= 1000000;
goto again;
}
return (-1);
}
sample_wr++;
}
regWr(rGPINPOL, gpinpol_copy);
}
MAX_HOST_DEBUG(PSTR("Pass SPI speed %lu\r\n"), spd);
#endif
if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
MAX_HOST_DEBUG(PSTR("OSCOKIRQ hasn't asserted in time"));
return ( -1);
}
/* MAX3421E - full-duplex SPI, interrupt kind, vbus off */
regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE | GPX_VBDET));
// Delay a minimum of 1 second to ensure any capacitors are drained.
// 1 second is required to make sure we do not smoke a Microdrive!
if(mseconds != INT16_MIN) {
if(mseconds < 1000) mseconds = 1000;
delay(mseconds); // We can't depend on SOF timer here.
}
regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
// Enable interrupts on the MAX3421e
regWr(rHIEN, IRQ_CHECK_MASK);
// Enable interrupt pin on the MAX3421e, set pulse width for edge
regWr(rCPUCTL, (bmIE | bmPULSEWIDTH));
/* check if device is connected */
regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
busprobe(); //check if anything is connected
VBUS_changed();
// GPX pin on. This is done here so that a change is detected if we have a switch connected.
/* MAX3421E - full-duplex SPI, interrupt kind, vbus on */
regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE));
regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet.
regWr(rHCTL, bmBUSRST); // issue bus reset to force generate yet another possible IRQ
#if USB_HOST_SHIELD_USE_ISR
// Attach ISR to service IRQ from MAX3421e
noInterrupts();
if(irq_pin & 1) {
ISRodd = this;
attachInterrupt(UHS_GET_DPI(irq_pin), call_ISRodd, IRQ_SENSE);
} else {
ISReven = this;
attachInterrupt(UHS_GET_DPI(irq_pin), call_ISReven, IRQ_SENSE);
}
interrupts();
#endif
//printf("\r\nrPINCTL 0x%2.2X\r\n", rPINCTL);
//printf("rCPUCTL 0x%2.2X\r\n", rCPUCTL);
//printf("rHIEN 0x%2.2X\r\n", rHIEN);
//printf("irq_pin %i\r\n", irq_pin);
return 0;
}
/**
* Setup UHS_EpInfo structure
*
* @param addr USB device address
* @param ep Endpoint
* @param ppep pointer to the pointer to a valid UHS_EpInfo structure
* @param nak_limit how many NAKs before aborting
* @return 0 on success
*/
uint8_t UHS_NI MAX3421E_HOST::SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo **ppep, uint16_t &nak_limit) {
UHS_Device *p = addrPool.GetUsbDevicePtr(addr);
if(!p)
return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL;
if(!p->epinfo)
return UHS_HOST_ERROR_NULL_EPINFO;
*ppep = getEpInfoEntry(addr, ep);
if(!*ppep)
return UHS_HOST_ERROR_NO_ENDPOINT_IN_TABLE;
nak_limit = (0x0001UL << (((*ppep)->bmNakPower > UHS_USB_NAK_MAX_POWER) ? UHS_USB_NAK_MAX_POWER : (*ppep)->bmNakPower));
nak_limit--;
/*
USBTRACE2("\r\nAddress: ", addr);
USBTRACE2(" EP: ", ep);
USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower);
USBTRACE2(" NAK Limit: ", nak_limit);
USBTRACE("\r\n");
*/
regWr(rPERADDR, addr); //set peripheral address
uint8_t mode = regRd(rMODE);
//Serial.print("\r\nMode: ");
//Serial.println( mode, HEX);
//Serial.print("\r\nLS: ");
//Serial.println(p->speed, HEX);
// Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise
regWr(rMODE, (p->speed) ? mode & ~(bmHUBPRE | bmLOWSPEED) : mode | bmLOWSPEED | hub_present);
return 0;
}
/**
* Receive a packet
*
* @param pep pointer to a valid UHS_EpInfo structure
* @param nak_limit how many NAKs before aborting
* @param nbytesptr pointer to maximum number of bytes of data to receive
* @param data pointer to data buffer
* @return 0 on success
*/
uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data) {
uint8_t rcode = 0;
uint8_t pktsize;
uint16_t nbytes = *nbytesptr;
MAX_HOST_DEBUG(PSTR("Requesting %i bytes "), nbytes);
uint8_t maxpktsize = pep->maxPktSize;
*nbytesptr = 0;
regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
// use a 'break' to exit this loop
while(1) {
rcode = dispatchPkt(MAX3421E_tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS.
#if 0
// This issue should be resolved now.
if(rcode == UHS_HOST_ERROR_TOGERR) {
//MAX_HOST_DEBUG(PSTR("toggle wrong\r\n"));
// yes, we flip it wrong here so that next time it is actually correct!
pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
continue;
}
#endif
if(rcode) {
//MAX_HOST_DEBUG(PSTR(">>>>>>>> Problem! dispatchPkt %2.2x\r\n"), rcode);
break; //should be 0, indicating ACK. Else return error code.
}
/* check for RCVDAVIRQ and generate error if not present */
/* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */
if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) {
//MAX_HOST_DEBUG(PSTR(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n"));
rcode = 0xf0; //receive error
break;
}
pktsize = regRd(rRCVBC); //number of received bytes
MAX_HOST_DEBUG(PSTR("Got %i bytes \r\n"), pktsize);
if(pktsize > nbytes) { //certain devices send more than asked
//MAX_HOST_DEBUG(PSTR(">>>>>>>> Warning: wanted %i bytes but got %i.\r\n"), nbytes, pktsize);
pktsize = nbytes;
}
int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr);
if(mem_left < 0)
mem_left = 0;
data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data);
regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer
*nbytesptr += pktsize; // add this packet's byte count to total transfer length
/* The transfer is complete under two conditions: */
/* 1. The device sent a short packet (L.T. maxPacketSize) */
/* 2. 'nbytes' have been transferred. */
if((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) // have we transferred 'nbytes' bytes?
{
// Save toggle value
pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0;
//MAX_HOST_DEBUG(PSTR("\r\n"));
rcode = 0;
break;
} // if
} //while( 1 )
return ( rcode);
}
/**
* Transmit a packet
*
* @param pep pointer to a valid UHS_EpInfo structure
* @param nak_limit how many NAKs before aborting
* @param nbytes number of bytes of data to send
* @param data pointer to data buffer
* @return 0 on success
*/
uint8_t UHS_NI MAX3421E_HOST::OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) {
uint8_t rcode = UHS_HOST_ERROR_NONE;
uint8_t retry_count;
uint8_t *data_p = data; //local copy of the data pointer
uint16_t bytes_tosend;
uint16_t nak_count;
uint16_t bytes_left = nbytes;
uint8_t maxpktsize = pep->maxPktSize;
if(maxpktsize < 1 || maxpktsize > 64)
return UHS_HOST_ERROR_BAD_MAX_PACKET_SIZE;
unsigned long timeout = millis() + UHS_HOST_TRANSFER_MAX_MS;
regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
while(bytes_left) {
SYSTEM_OR_SPECIAL_YIELD();
retry_count = 0;
nak_count = 0;
bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left;
bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO
regWr(rSNDBC, bytes_tosend); //set number of bytes
regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet
while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ
regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
rcode = (regRd(rHRSL) & 0x0f);
while(rcode && ((long)(millis() - timeout) < 0L)) {
switch(rcode) {
case UHS_HOST_ERROR_NAK:
nak_count++;
if(nak_limit && (nak_count == nak_limit))
goto breakout;
break;
case UHS_HOST_ERROR_TIMEOUT:
retry_count++;
if(retry_count == UHS_HOST_TRANSFER_RETRY_MAXIMUM)
goto breakout;
break;
case UHS_HOST_ERROR_TOGERR:
// yes, we flip it wrong here so that next time it is actually correct!
pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
break;
default:
goto breakout;
}//switch( rcode
/* process NAK according to Host out NAK bug */
regWr(rSNDBC, 0);
regWr(rSNDFIFO, *data_p);
regWr(rSNDBC, bytes_tosend);
regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet
while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ
regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
rcode = (regRd(rHRSL) & 0x0f);
SYSTEM_OR_SPECIAL_YIELD();
}//while( rcode && ....
bytes_left -= bytes_tosend;
data_p += bytes_tosend;
}//while( bytes_left...
breakout:
pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle
return ( rcode); //should be 0 in all cases
}
/**
* Send the actual packet.
*
* @param token
* @param ep Endpoint
* @param nak_limit how many NAKs before aborting, 0 == exit after timeout
* @return 0 on success, 0xFF indicates NAK timeout. @see
*/
/* Assumes peripheral address is set and relevant buffer is loaded/empty */
/* If NAK, tries to re-send up to nak_limit times */
/* If nak_limit == 0, do not count NAKs, exit after timeout */
/* If bus timeout, re-sends up to USB_RETRY_LIMIT times */
/* return codes 0x00-0x0f are HRSLT( 0x00 being success ), 0xff means timeout */
uint8_t UHS_NI MAX3421E_HOST::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) {
unsigned long timeout = millis() + UHS_HOST_TRANSFER_MAX_MS;
uint8_t tmpdata;
uint8_t rcode = UHS_HOST_ERROR_NONE;
uint8_t retry_count = 0;
uint16_t nak_count = 0;
for(;;) {
regWr(rHXFR, (token | ep)); //launch the transfer
while((long)(millis() - timeout) < 0L) //wait for transfer completion
{
SYSTEM_OR_SPECIAL_YIELD();
tmpdata = regRd(rHIRQ);
if(tmpdata & bmHXFRDNIRQ) {
regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt
//rcode = 0x00;
break;
}//if( tmpdata & bmHXFRDNIRQ
}//while ( millis() < timeout
rcode = (regRd(rHRSL) & 0x0f); //analyze transfer result
switch(rcode) {
case UHS_HOST_ERROR_NAK:
nak_count++;
if(nak_limit && (nak_count == nak_limit))
return (rcode);
delayMicroseconds(200);
break;
case UHS_HOST_ERROR_TIMEOUT:
retry_count++;
if(retry_count == UHS_HOST_TRANSFER_RETRY_MAXIMUM)
return (rcode);
break;
default:
return (rcode);
}//switch( rcode
}
}
//
// NULL is error, we don't need to know the reason.
//
UHS_EpInfo * UHS_NI MAX3421E_HOST::ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t *dataptr) {
uint8_t rcode;
UHS_EpInfo *pep = NULL;
uint16_t nak_limit = 0;
rcode = SetAddress(addr, 0, &pep, nak_limit);
if(!rcode) {
bytesWr(rSUDFIFO, 8, (uint8_t*)(&Request)); //transfer to setup packet FIFO
rcode = dispatchPkt(MAX3421E_tokSETUP, 0, nak_limit); //dispatch packet
if(!rcode) {
if(dataptr != NULL) {
if(((Request)/* bmReqType*/ & 0x80) == 0x80) {
pep->bmRcvToggle = 1; //bmRCVTOG1;
} else {
pep->bmSndToggle = 1; //bmSNDTOG1;
}
}
} else {
pep = NULL;
}
}
return pep;
}
uint8_t UHS_NI MAX3421E_HOST::ctrlReqRead(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint16_t nbytes, uint8_t *dataptr) {
*read = 0;
uint16_t nak_limit = 0;
MAX_HOST_DEBUG(PSTR("ctrlReqRead left: %i\r\n"), *left);
if(*left) {
again:
*read = nbytes;
uint8_t rcode = InTransfer(pep, nak_limit, read, dataptr);
if(rcode == UHS_HOST_ERROR_TOGERR) {
// yes, we flip it wrong here so that next time it is actually correct!
pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
goto again;
}
if(rcode) {
MAX_HOST_DEBUG(PSTR("ctrlReqRead ERROR: %2.2x, left: %i, read %i\r\n"), rcode, *left, *read);
return rcode;
}
*left -= *read;
MAX_HOST_DEBUG(PSTR("ctrlReqRead left: %i, read %i\r\n"), *left, *read);
}
return 0;
}
uint8_t UHS_NI MAX3421E_HOST::ctrlReqClose(UHS_EpInfo *pep, uint8_t bmReqType, uint16_t left, uint16_t nbytes, uint8_t *dataptr) {
uint8_t rcode = 0;
//MAX_HOST_DEBUG(PSTR("Closing"));
if(((bmReqType & 0x80) == 0x80) && pep && left && dataptr) {
MAX_HOST_DEBUG(PSTR("ctrlReqRead Sinking %i\r\n"), left);
// If reading, sink the rest of the data.
while(left) {
uint16_t read = nbytes;
rcode = InTransfer(pep, 0, &read, dataptr);
if(rcode == UHS_HOST_ERROR_TOGERR) {
// yes, we flip it wrong here so that next time it is actually correct!
pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
continue;
}
if(rcode) break;
left -= read;
if(read < nbytes) break;
}
}
if(!rcode) {
// Serial.println("Dispatching");
rcode = dispatchPkt(((bmReqType & 0x80) == 0x80) ? MAX3421E_tokOUTHS : MAX3421E_tokINHS, 0, 0); //GET if direction
// } else {
// Serial.println("Bypassed Dispatch");
}
return rcode;
}
/**
* Bottom half of the ISR task
*/
void UHS_NI MAX3421E_HOST::ISRbottom(void) {
uint8_t x;
// Serial.print("Enter ");
// Serial.print((uint32_t)this,HEX);
// Serial.print(" ");
// Serial.println(usb_task_state, HEX);
DDSB();
if(condet) {
VBUS_changed();
#if USB_HOST_SHIELD_USE_ISR
noInterrupts();
#endif
condet = false;
#if USB_HOST_SHIELD_USE_ISR
interrupts();
#endif
}
switch(usb_task_state) {
case UHS_USB_HOST_STATE_INITIALIZE:
// should never happen...
MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_INITIALIZE\r\n"));
busprobe();
VBUS_changed();
break;
case UHS_USB_HOST_STATE_DEBOUNCE:
MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_DEBOUNCE\r\n"));
// This seems to not be needed. The host controller has debounce built in.
sof_countdown = UHS_HOST_DEBOUNCE_DELAY_MS;
usb_task_state = UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE;
break;
case UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE:
MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE\r\n"));
if(!sof_countdown) usb_task_state = UHS_USB_HOST_STATE_RESET_DEVICE;
break;
case UHS_USB_HOST_STATE_RESET_DEVICE:
MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_RESET_DEVICE\r\n"));
busevent = true;
usb_task_state = UHS_USB_HOST_STATE_RESET_NOT_COMPLETE;
regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet.
regWr(rHCTL, bmBUSRST); // issue bus reset
break;
case UHS_USB_HOST_STATE_RESET_NOT_COMPLETE:
MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_RESET_NOT_COMPLETE\r\n"));
if(!busevent) usb_task_state = UHS_USB_HOST_STATE_WAIT_BUS_READY;
break;
case UHS_USB_HOST_STATE_WAIT_BUS_READY:
MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_WAIT_BUS_READY\r\n"));
usb_task_state = UHS_USB_HOST_STATE_CONFIGURING;
break; // don't fall through
case UHS_USB_HOST_STATE_CONFIGURING:
usb_task_state = UHS_USB_HOST_STATE_CHECK;
x = Configuring(0, 1, usb_host_speed);
usb_error = x;
if(usb_task_state == UHS_USB_HOST_STATE_CHECK) {
if(x) {
MAX_HOST_DEBUG(PSTR("Error 0x%2.2x"), x);
if(x == UHS_HOST_ERROR_JERR) {
usb_task_state = UHS_USB_HOST_STATE_IDLE;
} else if(x != UHS_HOST_ERROR_DEVICE_INIT_INCOMPLETE) {
usb_error = x;
usb_task_state = UHS_USB_HOST_STATE_ERROR;
}
} else
usb_task_state = UHS_USB_HOST_STATE_CONFIGURING_DONE;
}
break;
case UHS_USB_HOST_STATE_CHECK:
// Serial.println((uint32_t)__builtin_return_address(0), HEX);
break;
case UHS_USB_HOST_STATE_CONFIGURING_DONE:
usb_task_state = UHS_USB_HOST_STATE_RUNNING;
break;
#ifdef USB_HOST_MANUAL_POLL
case UHS_USB_HOST_STATE_RUNNING:
case UHS_USB_HOST_STATE_ERROR:
case UHS_USB_HOST_STATE_IDLE:
case UHS_USB_HOST_STATE_ILLEGAL:
enable_frame_irq(false);
break;
#else
case UHS_USB_HOST_STATE_RUNNING:
Poll_Others();
for(x = 0; (usb_task_state == UHS_USB_HOST_STATE_RUNNING) && (x < UHS_HOST_MAX_INTERFACE_DRIVERS); x++) {
if(devConfig[x]) {
if(devConfig[x]->bPollEnable) devConfig[x]->Poll();
}
}
// fall thru
#endif
default:
// Do nothing
break;
} // switch( usb_task_state )
DDSB();
#if USB_HOST_SHIELD_USE_ISR
if(condet) {
VBUS_changed();
noInterrupts();
condet = false;
interrupts();
}
#endif
#ifdef USB_HOST_SHIELD_TIMING_PIN
// My counter/timer can't work on an inverted gate signal
// so we gate using a high pulse -- AJK
UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, LOW);
#endif
//usb_task_polling_disabled--;
EnablePoll();
DDSB();
}
/* USB main task. Services the MAX3421e */
#if !USB_HOST_SHIELD_USE_ISR
void UHS_NI MAX3421E_HOST::ISRTask(void) {
}
void UHS_NI MAX3421E_HOST::Task(void)
#else
void UHS_NI MAX3421E_HOST::Task(void) {
#ifdef USB_HOST_MANUAL_POLL
if(usb_task_state == UHS_USB_HOST_STATE_RUNNING) {
noInterrupts();
for(uint8_t x = 0; x < UHS_HOST_MAX_INTERFACE_DRIVERS; x++)
if(devConfig[x] && devConfig[x]->bPollEnable)
devConfig[x]->Poll();
interrupts();
}
#endif
}
void UHS_NI MAX3421E_HOST::ISRTask(void)
#endif
{
DDSB();
#if !defined(SWI_IRQ_NUM)
suspend_host();
#if USB_HOST_SHIELD_USE_ISR
// Enable interrupts
interrupts();
#endif
#endif
counted = false;
if(!MARLIN_UHS_READ_IRQ()) {
uint8_t HIRQALL = regRd(rHIRQ); //determine interrupt source
uint8_t HIRQ = HIRQALL & IRQ_CHECK_MASK;
uint8_t HIRQ_sendback = 0x00;
if((HIRQ & bmCONDETIRQ) || (HIRQ & bmBUSEVENTIRQ)) {
MAX_HOST_DEBUG
(PSTR("\r\nBEFORE CDIRQ %s BEIRQ %s resetting %s state 0x%2.2x\r\n"),
(HIRQ & bmCONDETIRQ) ? "T" : "F",
(HIRQ & bmBUSEVENTIRQ) ? "T" : "F",
doingreset ? "T" : "F",
usb_task_state
);
}
// ALWAYS happens BEFORE or WITH CONDETIRQ
if(HIRQ & bmBUSEVENTIRQ) {
HIRQ_sendback |= bmBUSEVENTIRQ;
if(!doingreset) condet = true;
busprobe();
busevent = false;
}
if(HIRQ & bmCONDETIRQ) {
HIRQ_sendback |= bmCONDETIRQ;
if(!doingreset) condet = true;
busprobe();
}
#if 1
if((HIRQ & bmCONDETIRQ) || (HIRQ & bmBUSEVENTIRQ)) {
MAX_HOST_DEBUG
(PSTR("\r\nAFTER CDIRQ %s BEIRQ %s resetting %s state 0x%2.2x\r\n"),
(HIRQ & bmCONDETIRQ) ? "T" : "F",
(HIRQ & bmBUSEVENTIRQ) ? "T" : "F",
doingreset ? "T" : "F",
usb_task_state
);
}
#endif
if(HIRQ & bmFRAMEIRQ) {
HIRQ_sendback |= bmFRAMEIRQ;
if(sof_countdown) {
sof_countdown--;
counted = true;
}
sofevent = false;
}
//MAX_HOST_DEBUG(PSTR("\r\n%s%s%s\r\n"),
// sof_countdown ? "T" : "F",
// counted ? "T" : "F",
// usb_task_polling_disabled? "T" : "F");
DDSB();
regWr(rHIRQ, HIRQ_sendback);
#if !defined(SWI_IRQ_NUM)
resume_host();
#if USB_HOST_SHIELD_USE_ISR
// Disable interrupts
noInterrupts();
#endif
#endif
if(!sof_countdown && !counted && !usb_task_polling_disabled) {
DisablePoll();
//usb_task_polling_disabled++;
#ifdef USB_HOST_SHIELD_TIMING_PIN
// My counter/timer can't work on an inverted gate signal
// so we gate using a high pulse -- AJK
UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, HIGH);
#endif
#if defined(SWI_IRQ_NUM)
// MAX_HOST_DEBUG(PSTR("--------------- Doing SWI ----------------"));
exec_SWI(this);
#else
#if USB_HOST_SHIELD_USE_ISR
// Enable interrupts
interrupts();
#endif /* USB_HOST_SHIELD_USE_ISR */
ISRbottom();
#endif /* SWI_IRQ_NUM */
}
}
}
#if 0
DDSB();
#endif
#else
#error "Never include USB_HOST_SHIELD_INLINE.h, include UHS_host.h instead"
#endif

View file

@ -0,0 +1,153 @@
/*
* File: macro_logic.h
* Author: root
*
* Created on December 22, 2018, 4:49 AM
*
* To test:
* gcc -DAJK_TEST_MACRO_LOGIC -E macro_logic.h
*
*/
#ifndef MACRO_LOGIC_H
#define MACRO_LOGIC_H
#define AJK_CAT(a, ...) AJK_PRIMITIVE_CAT(a, __VA_ARGS__)
#define AJK_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b)
#define AJK_COMPL_0 1
#define AJK_COMPL_1 0
#define AJK_BITAND(x) AJK_PRIMITIVE_CAT(AJK_BITAND_, x)
#define AJK_BITAND_0(y) 0
#define AJK_BITAND_1(y) y
#define AJK_INC(x) AJK_PRIMITIVE_CAT(AJK_INC_, x)
#define AJK_INC_0 1
#define AJK_INC_1 2
#define AJK_INC_2 3
#define AJK_INC_3 4
#define AJK_INC_4 5
#define AJK_INC_5 6
#define AJK_INC_6 7
#define AJK_INC_7 8
#define AJK_INC_8 9
#define AJK_INC_9 10
#define AJK_INC_10 10
#define AJK_DEC(x) AJK_PRIMITIVE_CAT(AJK_DEC_, x)
#define AJK_DEC_0 0
#define AJK_DEC_1 0
#define AJK_DEC_2 1
#define AJK_DEC_3 2
#define AJK_DEC_4 3
#define AJK_DEC_5 4
#define AJK_DEC_6 5
#define AJK_DEC_7 6
#define AJK_DEC_8 7
#define AJK_DEC_9 8
#define AJK_DEC_10 9
#define AJK_CHECK_N(x, n, ...) n
#define AJK_CHECK(...) AJK_CHECK_N(__VA_ARGS__, 0,)
#define AJK_PROBE(x) x, 1,
#define AJK_IS_PAREN(x) AJK_CHECK(AJK_IS_PAREN_PROBE x)
#define AJK_IS_PAREN_PROBE(...) AJK_PROBE(~)
#define AJK_NOT(x) AJK_CHECK(AJK_PRIMITIVE_CAT(AJK_NOT_, x))
#define AJK_NOT_0 AJK_PROBE(~)
#define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b)
#define AJK_COMPL_0 1
#define AJK_COMPL_1 0
#define AJK_BOOL(x) AJK_COMPL(AJK_NOT(x))
#define AJK_IIF(c) AJK_PRIMITIVE_CAT(AJK_IIF_, c)
#define AJK_IIF_0(t, ...) __VA_ARGS__
#define AJK_IIF_1(t, ...) t
#define AJK_IF(c) AJK_IIF(AJK_BOOL(c))
#define AJK_EAT(...)
#define AJK_EXPAND(...) __VA_ARGS__
#define AJK_WHEN(c) AJK_IF(c)(AJK_EXPAND, AJK_EAT)
#define AJK_EMPTY()
#define AJK_DEFER(id) id AJK_EMPTY()
#define AJK_OBSTRUCT(id) id AJK_DEFER(AJK_EMPTY)()
#define AJK_EVAL(...) AJK_EVAL1(AJK_EVAL1(AJK_EVAL1(__VA_ARGS__)))
#define AJK_EVAL1(...) AJK_EVAL2(AJK_EVAL2(AJK_EVAL2(__VA_ARGS__)))
#define AJK_EVAL2(...) AJK_EVAL3(AJK_EVAL3(AJK_EVAL3(__VA_ARGS__)))
#define AJK_EVAL3(...) AJK_EVAL4(AJK_EVAL4(AJK_EVAL4(__VA_ARGS__)))
#define AJK_EVAL4(...) AJK_EVAL5(AJK_EVAL5(AJK_EVAL5(__VA_ARGS__)))
#define AJK_EVAL5(...) __VA_ARGS__
#define AJK_REPEAT(AJK_count, AJK_macro, ...) \
AJK_WHEN(AJK_count) \
( \
AJK_OBSTRUCT(AJK_REPEAT_INDIRECT) () \
( \
AJK_DEC(AJK_count), AJK_macro, __VA_ARGS__ \
) \
AJK_OBSTRUCT(AJK_macro) \
( \
AJK_DEC(AJK_count), __VA_ARGS__ \
) \
)
#define AJK_REPEAT_INDIRECT() AJK_REPEAT
#define AJK_WHILE(AJK_pred, AJK_op, ...) \
IF(AJK_pred(__VA_ARGS__)) \
( \
AJK_OBSTRUCT(AJK_WHILE_INDIRECT) () \
( \
AJK_pred, AJK_op, AJK_op(__VA_ARGS__) \
), \
__VA_ARGS__ \
)
#define AJK_WHILE_INDIRECT() AJK_WHILE
#define AJK_PRIMITIVE_COMPARE(x, y) AJK_IS_PAREN \
( \
AJK_COMPARE_ ## x ( AJK_COMPARE_ ## y) (()) \
)
#define AJK_IS_COMPARABLE(x) AJK_IS_PAREN( AJK_CAT(AJK_COMPARE_, x) (()) )
#define AJK_NOT_EQUAL(x, y) \
AJK_IIF(AJK_BITAND(AJK_IS_COMPARABLE(x))(AJK_IS_COMPARABLE(y)) ) \
( \
AJK_PRIMITIVE_COMPARE, \
1 AJK_EAT \
)(x, y)
#define AJK_EQUAL(x, y) AJK_COMPL(AJK_NOT_EQUAL(x, y))
#define AJK_COMMA() ,
#define AJK_COMMA_IF(n) AJK_IF(n)(AJK_COMMA, AJK_EAT)()
#define AJK_COMMA_VAR(AJK_count, AJK_v) AJK_COMMA_IF(AJK_count) AJK_v ## AJK_count
#define AJK_MAKE_LIST(AJK_v, AJK_count) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_COMMA_VAR, AJK_v))
#define AJK_FUN(AJK_count, AJK_v, AJK_args, AJK_body) AJK_v ## AJK_count (AJK_args) { AJK_body(AJK_count) }
#define AJK_MAKE_FUNS(AJK_v, AJK_args, AJK_count, AJK_body) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_FUN, AJK_v, AJK_args, AJK_body))
#if defined(AJK_TEST_MACRO_LOGIC)
#define BODY(AJKindex) some(C, statement); contaning(a, test[AJKindex]);
#define ZERO_TIMES_TEST 0
#define THREE_TIMES_TEST 3
blank > AJK_MAKE_LIST(VARIABLE_, ZERO_TIMES_TEST) < because zero repeats
Make 3 comma separated indexed variables : AJK_MAKE_LIST(VARIABLE_, THREE_TIMES_TEST)
Make 3 bogus function bodies
AJK_MAKE_FUNS(unsigned Cfunc,(arg1, arg2),3,BODY)
#endif
#endif /* MACRO_LOGIC_H */

View file

@ -0,0 +1,246 @@
/*
* File: SWI_INLINE.h
* Author: xxxajk@gmail.com
*
* Created on December 5, 2014, 9:40 AM
*
* This is the actual library.
* There are no 'c' or 'cpp' files.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifdef DYN_SWI_H
#ifndef SWI_INLINE_H
#define SWI_INLINE_H
#ifndef SWI_MAXIMUM_ALLOWED
#define SWI_MAXIMUM_ALLOWED 4
#endif
#if defined(__arm__) || defined(ARDUINO_ARCH_PIC32)
static char dyn_SWI_initied = 0;
static dyn_SWI* dyn_SWI_LIST[SWI_MAXIMUM_ALLOWED];
static dyn_SWI* dyn_SWI_EXEC[SWI_MAXIMUM_ALLOWED];
#if defined(__arm__)
#if defined(__USE_CMSIS_VECTORS__)
extern "C" {
void (*_VectorsRam[VECTORTABLE_SIZE])(void)__attribute__((aligned(VECTORTABLE_ALIGNMENT)));
}
#else
__attribute__((always_inline)) static inline void __DSB(void) {
__asm__ volatile ("dsb");
}
#endif // defined(__USE_CMSIS_VECTORS__)
#else // defined(__arm__)
__attribute__((always_inline)) static inline void __DSB(void) {
__asm__ volatile ("sync" : : : "memory");
}
#endif // defined(__arm__)
/**
* Execute queued class ISR routines.
*/
#if defined(ARDUINO_ARCH_PIC32)
static p32_regset *ifs = ((p32_regset *) & IFS0) + (SWI_IRQ_NUM / 32); //interrupt flag register set
static p32_regset *iec = ((p32_regset *) & IEC0) + (SWI_IRQ_NUM / 32); //interrupt enable control reg set
static uint32_t swibit = 1 << (SWI_IRQ_NUM % 32);
void
#if defined(__PIC32MZXX__)
__attribute__((nomips16,at_vector(SWI_VECTOR),interrupt(SWI_IPL)))
#else
__attribute__((interrupt(),nomips16))
#endif
softISR(void) {
#else
#if defined(ARDUINO_spresense_ast)
unsigned int softISR(void) {
#else
void softISR(void) {
#endif
#endif
//
// TO-DO: Perhaps limit to 8, and inline this?
//
// Make a working copy, while clearing the queue.
noInterrupts();
#if defined(ARDUINO_ARCH_PIC32)
//ifs->clr = swibit;
#endif
for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) {
dyn_SWI_EXEC[i] = dyn_SWI_LIST[i];
dyn_SWI_LIST[i] = NULL;
}
__DSB();
interrupts();
// Execute each class SWI
for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) {
if(dyn_SWI_EXEC[i]) {
#if defined(__DYN_SWI_DEBUG_LED__)
digitalWrite(__DYN_SWI_DEBUG_LED__, HIGH);
#endif
dyn_SWI_EXEC[i]->dyn_SWISR();
#if defined(__DYN_SWI_DEBUG_LED__)
digitalWrite(__DYN_SWI_DEBUG_LED__, LOW);
#endif
}
}
#if defined(ARDUINO_ARCH_PIC32)
noInterrupts();
if(!dyn_SWI_EXEC[0]) ifs->clr = swibit;
interrupts();
#endif
#if defined(ARDUINO_spresense_ast)
return 0;
#endif
}
#define DDSB() __DSB()
#endif
#if defined(__arm__)
#ifndef interruptsStatus
#define interruptsStatus() __interruptsStatus()
static inline unsigned char __interruptsStatus(void) __attribute__((always_inline, unused));
static inline unsigned char __interruptsStatus(void) {
unsigned int primask;
asm volatile ("mrs %0, primask" : "=r" (primask));
if(primask) return 0;
return 1;
}
#endif
/**
* Initialize the Dynamic (class) Software Interrupt
*/
static void Init_dyn_SWI(void) {
if(!dyn_SWI_initied) {
#if defined(__USE_CMSIS_VECTORS__)
uint32_t *X_Vectors = (uint32_t*)SCB->VTOR;
for(int i = 0; i < VECTORTABLE_SIZE; i++) {
_VectorsRam[i] = reinterpret_cast<void (*)()>(X_Vectors[i]); /* copy vector table to RAM */
}
/* relocate vector table */
noInterrupts();
SCB->VTOR = reinterpret_cast<uint32_t>(&_VectorsRam);
DDSB();
interrupts();
#endif
#if !defined(ARDUINO_spresense_ast)
for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) dyn_SWI_LIST[i] = NULL;
noInterrupts();
_VectorsRam[SWI_IRQ_NUM + 16] = reinterpret_cast<void (*)()>(softISR);
DDSB();
interrupts();
NVIC_SET_PRIORITY(SWI_IRQ_NUM, 255);
NVIC_ENABLE_IRQ(SWI_IRQ_NUM);
#endif
#if defined(__DYN_SWI_DEBUG_LED__)
pinMode(__DYN_SWI_DEBUG_LED__, OUTPUT);
digitalWrite(__DYN_SWI_DEBUG_LED__, LOW);
#endif
dyn_SWI_initied = 1;
}
}
/**
*
* @param klass class that extends dyn_SWI
* @return 0 on queue full, else returns queue position (ones based)
*/
int exec_SWI(const dyn_SWI* klass) {
int rc = 0;
uint8_t irestore = interruptsStatus();
// Allow use from inside a critical section...
// ... and prevent races if also used inside an ISR
noInterrupts();
for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) {
if(!dyn_SWI_LIST[i]) {
rc = 1 + i; // Success!
dyn_SWI_LIST[i] = (dyn_SWI*)klass;
#if !defined(ARDUINO_spresense_ast)
if(!NVIC_GET_PENDING(SWI_IRQ_NUM)) NVIC_SET_PENDING(SWI_IRQ_NUM);
#else
// Launch 1-shot timer as an emulated SWI
// Hopefully the value of Zero is legal.
// 1 microsecond latency would suck!
attachTimerInterrupt(softISR, 100);
#endif
DDSB();
break;
}
}
// Restore interrupts, if they were on.
if(irestore) interrupts();
return rc;
}
#elif defined(ARDUINO_ARCH_PIC32)
/**
* Initialize the Dynamic (class) Software Interrupt
*/
static void Init_dyn_SWI(void) {
if(!dyn_SWI_initied) {
uint32_t sreg = disableInterrupts();
setIntVector(SWI_VECTOR, softISR);
setIntPriority(SWI_VECTOR, 1, 1); // Lowest priority, ever.
ifs->clr = swibit;
iec->clr = swibit;
iec->set = swibit;
restoreInterrupts(sreg);
#if defined(__DYN_SWI_DEBUG_LED__)
pinMode(__DYN_SWI_DEBUG_LED__, OUTPUT);
UHS_PIN_WRITE(__DYN_SWI_DEBUG_LED__, LOW);
#endif
}
}
/**
*
* @param klass class that extends dyn_SWI
* @return 0 on queue full, else returns queue position (ones based)
*/
int exec_SWI(const dyn_SWI* klass) {
int rc = 0;
uint32_t sreg = disableInterrupts();
for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) {
if(!dyn_SWI_LIST[i]) {
rc = 1 + i; // Success!
dyn_SWI_LIST[i] = (dyn_SWI*)klass;
if(!(ifs->reg & swibit)) ifs->set = swibit;
;
break;
}
}
restoreInterrupts(sreg);
return rc;
}
#endif /* defined(__arm__) */
#endif /* SWI_INLINE_H */
#else
#error "Never include SWI_INLINE.h directly, include dyn_SWI.h instead"
#endif

View file

@ -0,0 +1,172 @@
/*
* File: dyn_SWI.h
* Author: xxxajk@gmail.com
*
* Created on December 5, 2014, 9:12 AM
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DYN_SWI_H
#define DYN_SWI_H
#if defined(__arm__) || defined(ARDUINO_ARCH_PIC32)
#if defined(ARDUINO_ARCH_PIC32)
#include <p32xxxx.h>
#endif
#ifdef __cplusplus
#if defined(true)
#undef true
#endif
#if defined(false)
#undef false
#endif
#endif
#if defined(ARDUINO_spresense_ast)
#define SWI_IRQ_NUM 666 // because this board is totally evil.
#elif defined(ARDUINO_ARCH_PIC32)
#ifndef SWI_IRQ_NUM
#if defined(_DSPI0_IPL_ISR)
#define SWI_IPL _DSPI0_IPL_ISR
#define SWI_VECTOR _DSPI0_ERR_IRQ
#define SWI_IRQ_NUM _DSPI0_ERR_IRQ
#elif defined(_PMP_ERROR_IRQ)
#define SWI_IRQ_NUM _PMP_ERROR_IRQ
#define SWI_VECTOR _PMP_VECTOR
#else
#error SWI_IRQ_NUM and SWI_VECTOR need a definition
#endif
#ifdef __cplusplus
extern "C"
{
void
#if defined(__PIC32MZXX__)
__attribute__((nomips16,at_vector(SWI_VECTOR),interrupt(SWI_IPL)))
#else
__attribute__((interrupt(),nomips16))
#endif
softISR(void);
}
#endif
#endif
#elif !defined(NVIC_NUM_INTERRUPTS)
// Assume CMSIS
#define __USE_CMSIS_VECTORS__
#if defined(NUMBER_OF_INT_VECTORS)
#define NVIC_NUM_INTERRUPTS (NUMBER_OF_INT_VECTORS-16)
#else
#define NVIC_NUM_INTERRUPTS ((int)PERIPH_COUNT_IRQn)
#endif
#define VECTORTABLE_SIZE (NVIC_NUM_INTERRUPTS+16)
#define VECTORTABLE_ALIGNMENT (0x100ul)
#define NVIC_GET_ACTIVE(n) NVIC_GetActive((IRQn_Type)n)
#define NVIC_GET_PENDING(n) NVIC_GetPendingIRQ((IRQn_Type)n)
#define NVIC_SET_PENDING(n) NVIC_SetPendingIRQ((IRQn_Type)n)
#define NVIC_ENABLE_IRQ(n) NVIC_EnableIRQ((IRQn_Type)n)
#define NVIC_SET_PRIORITY(n ,p) NVIC_SetPriority((IRQn_Type)n, (uint32_t) p)
//extern "C" {
// extern uint32_t _VectorsRam[VECTORTABLE_SIZE] __attribute__((aligned(VECTORTABLE_ALIGNMENT)));
//}
#ifndef SWI_IRQ_NUM
#if defined(__SAM3X8E__) && defined(_VARIANT_ARDUINO_DUE_X_)
// DUE
// Choices available:
// HSMCI_IRQn Multimedia Card Interface (HSMCI)
// EMAC_IRQn Ethernet MAC (EMAC)
// EMAC is not broken out on the official DUE, but is on clones.
// SPI0_IRQn Serial Peripheral Interface (SPI0)
// SPI0_IRQn seems to be the best choice, as long as nobody uses an ISR based master
#define SWI_IRQ_NUM SPI0_IRQn
#elif defined(ARDUINO_SAMD_ZERO)
// Just use sercom4's unused IRQ vector.
#define SWI_IRQ_NUM I2S_IRQn
//#define SWI_IRQ_NUM SERCOM4_IRQn
#endif
#endif
#ifndef SWI_IRQ_NUM
#error SWI_IRQ_NUM not defined (CMSIS)
#endif
#elif defined(CORE_TEENSY)
#ifndef NVIC_GET_ACTIVE
#define NVIC_GET_ACTIVE(n) (*((volatile uint32_t *)0xE000E300 + ((n) >> 5)) & (1 << ((n) & 31)))
#endif
#ifndef NVIC_GET_PENDING
#define NVIC_GET_PENDING(n) (*((volatile uint32_t *)0xE000E200 + ((n) >> 5)) & (1 << ((n) & 31)))
#ifndef SWI_IRQ_NUM
#if defined(__MK20DX256__)
#define SWI_IRQ_NUM 17
#elif defined(__MK20DX128__)
#define SWI_IRQ_NUM 5
#elif defined(__MKL26Z64__)
#define SWI_IRQ_NUM 4
#elif defined(__MK66FX1M0__)
#define SWI_IRQ_NUM 30
#elif defined(__MK64FX512__)
#define SWI_IRQ_NUM 30
#elif defined(__IMXRT1052__) || defined(__IMXRT1062__)
#define SWI_IRQ_NUM 71
#else
#error Do not know how to relocate IRQ vectors for this pjrc product
#endif
#endif
#endif
#else // Not CMSIS or PJRC CORE_TEENSY or PIC32 or SPRESENSE
#error Do not know how to relocate IRQ vectors or perform SWI
#endif // SWI_IRQ_NUM
#ifndef SWI_IRQ_NUM
#error SWI_IRQ_NUM not defined
#else
/**
* Use this class to extend your class, in order to provide
* a C++ context callable SWI.
*/
class dyn_SWI {
public:
/**
* Override this method with your code.
*/
virtual void dyn_SWISR(void) {
};
};
extern int exec_SWI(const dyn_SWI* klass);
#include "SWI_INLINE.h"
// IMPORTANT! Define this so that you do NOT end up with a NULL stub!
#define SWI_NO_STUB
#endif /* SWI_IRQ_NUM */
#endif /* __arm__ */
// if no SWI for CPU (e.g. AVR) make a void stub.
#ifndef SWI_NO_STUB
#define Init_dyn_SWI() (void(0))
#if !defined(DDSB)
#define DDSB() (void(0))
#endif
#endif
#endif /* DYN_SWI_H */

View file

@ -1,187 +0,0 @@
diff -Naur /home/aleph/Downloads/USB_Host_Shield_2.0-master/masstorage.cpp lib/masstorage.cpp
--- /home/aleph/Downloads/USB_Host_Shield_2.0-master/masstorage.cpp 2018-09-21 10:19:36.107502252 -0600
+++ lib/masstorage.cpp 2018-09-21 09:46:19.620175519 -0600
@@ -24,6 +24,8 @@
#include "masstorage.h"
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
+
const uint8_t BulkOnly::epDataInIndex = 1;
const uint8_t BulkOnly::epDataOutIndex = 2;
const uint8_t BulkOnly::epInterruptInIndex = 3;
@@ -796,6 +798,9 @@
buf[i] = 0x00;
}
WriteOk[lun] = true;
+ #if ENABLED(USB_FLASH_DRIVE_SUPPORT) && defined(SKIP_WRITE_PROTECT)
+ return 0;
+ #endif
uint8_t rc = ModeSense6(lun, 0, 0x3f, 0, 192, buf);
if(!rc) {
WriteOk[lun] = ((buf[2] & 0x80) == 0);
@@ -1271,3 +1276,5 @@
return MASS_ERR_NOT_IMPLEMENTED;
#endif
}
+
+#endif // USB_FLASH_DRIVE_SUPPORT
\ No newline at end of file
diff -Naur /home/aleph/Downloads/USB_Host_Shield_2.0-master/message.cpp lib/message.cpp
--- /home/aleph/Downloads/USB_Host_Shield_2.0-master/message.cpp 2018-09-21 10:20:15.995647957 -0600
+++ lib/message.cpp 2018-09-19 07:43:46.520339375 -0600
@@ -23,6 +23,9 @@
*/
#include "Usb.h"
+
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
+
// 0x80 is the default (i.e. trace) to turn off set this global to something lower.
// this allows for 126 other debugging levels.
// TO-DO: Allow assignment to a different serial port by software
@@ -120,4 +123,6 @@
D_PrintHex<uint8_t > (rcode, 0x80);
Notify(PSTR("\r\n"), 0x80);
}
-#endif
+#endif // DEBUG_USB_HOST
+
+#endif // USB_FLASH_DRIVE_SUPPORT
\ No newline at end of file
diff -Naur /home/aleph/Downloads/USB_Host_Shield_2.0-master/parsetools.cpp lib/parsetools.cpp
--- /home/aleph/Downloads/USB_Host_Shield_2.0-master/parsetools.cpp 2018-09-21 10:21:16.215867769 -0600
+++ lib/parsetools.cpp 2018-09-19 07:43:46.520339375 -0600
@@ -23,6 +23,8 @@
*/
#include "Usb.h"
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
+
bool MultiByteValueParser::Parse(uint8_t **pp, uint16_t *pcntdn) {
if(!pBuf) {
Notify(PSTR("Buffer pointer is NULL!\r\n"), 0x80);
@@ -72,3 +74,5 @@
}
return true;
}
+
+#endif // USB_FLASH_DRIVE_SUPPORT
\ No newline at end of file
diff -Naur /home/aleph/Downloads/USB_Host_Shield_2.0-master/settings.h lib/settings.h
--- /home/aleph/Downloads/USB_Host_Shield_2.0-master/settings.h 2018-09-21 10:22:21.792106872 -0600
+++ lib/settings.h 2018-09-21 10:01:53.383594081 -0600
@@ -25,7 +25,21 @@
#ifndef USB_HOST_SHIELD_SETTINGS_H
#define USB_HOST_SHIELD_SETTINGS_H
#include "macros.h"
-
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
+ ////////////////////////////////////////////////////////////////////////////////
+ /* Added by Bill Greiman to speed up mass storage initialization with USB
+ * flash drives and simple USB hard drives.
+ * Disable this by defining DELAY(x) to be delay(x).
+ */
+ #define delay(x) if((x) < 200) safe_delay(x)
+ /* Almost all USB flash drives and simple USB hard drives fail the write
+ * protect test and add 20 - 30 seconds to USB init. Set SKIP_WRITE_PROTECT
+ * to nonzero to skip the test and assume the drive is writable.
+ */
+ #define SKIP_WRITE_PROTECT 1
+ /* Since Marlin only cares about USB flash drives, we only need one LUN. */
+ #define MASS_MAX_SUPPORTED_LUN 1
+#endif
////////////////////////////////////////////////////////////////////////////////
// SPI Configuration
////////////////////////////////////////////////////////////////////////////////
@@ -45,6 +59,10 @@
* multiple serial ports are available.
* For example Serial3.
*/
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
+ #define USB_HOST_SERIAL MYSERIAL0
+#endif
+
#ifndef USB_HOST_SERIAL
#define USB_HOST_SERIAL Serial
#endif
@@ -99,7 +117,7 @@
// No user serviceable parts below this line.
// DO NOT change anything below here unless you are a developer!
-#include "version_helper.h"
+//#include "version_helper.h"
#if defined(__GNUC__) && defined(__AVR__)
#ifndef GCC_VERSION
@@ -149,7 +167,6 @@
#else
#define USING_SPI4TEENSY3 0
#endif
-
#if ((defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)) || defined(__ARDUINO_X86__) || ARDUINO >= 10600) && !USING_SPI4TEENSY3
#include <SPI.h> // Use the Arduino SPI library for the Arduino Due, Intel Galileo 1 & 2, Intel Edison or if the SPI library with transaction is available
#endif
diff -Naur /home/aleph/Downloads/USB_Host_Shield_2.0-master/UsbCore.h lib/UsbCore.h
--- /home/aleph/Downloads/USB_Host_Shield_2.0-master/UsbCore.h 2018-09-21 10:23:09.348280107 -0600
+++ lib/UsbCore.h 2018-09-19 07:43:46.520339375 -0600
@@ -32,7 +32,10 @@
//#define USB_METHODS_INLINE
/* shield pins. First parameter - SS pin, second parameter - INT pin */
-#ifdef BOARD_BLACK_WIDDOW
+
+#if defined(__MARLIN_H__)
+typedef MAX3421e MAX3421E; // Marlin redefines this class in "../usb_host.h"
+#elif defined(BOARD_BLACK_WIDDOW)
typedef MAX3421e<P6, P3> MAX3421E; // Black Widow
#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
#if EXT_RAM
diff -Naur /home/aleph/Downloads/USB_Host_Shield_2.0-master/Usb.cpp lib/Usb.cpp
--- /home/aleph/Downloads/USB_Host_Shield_2.0-master/Usb.cpp 2018-09-21 10:23:20.732321559 -0600
+++ lib/Usb.cpp 2018-09-19 07:43:46.520339375 -0600
@@ -25,6 +25,8 @@
#include "Usb.h"
+#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
+
static uint8_t usb_error = 0;
static uint8_t usb_task_state;
@@ -825,3 +827,4 @@
}
#endif // defined(USB_METHODS_INLINE)
+#endif // USB_FLASH_DRIVE_SUPPORT
diff -Naur /home/aleph/Downloads/USB_Host_Shield_2.0-master/Usb.h lib/Usb.h
--- /home/aleph/Downloads/USB_Host_Shield_2.0-master/Usb.h 2018-09-21 10:23:33.756368972 -0600
+++ lib/Usb.h 2018-09-19 07:43:46.520339375 -0600
@@ -25,6 +25,8 @@
#ifndef _usb_h_
#define _usb_h_
+#include "../../../Marlin.h"
+
// WARNING: Do not change the order of includes, or stuff will break!
#include <inttypes.h>
#include <stddef.h>
@@ -34,13 +36,15 @@
#include "settings.h"
#include "printhex.h"
#include "message.h"
+
#include "hexdump.h"
-#include "sink_parser.h"
+//#include "sink_parser.h"
#include "max3421e.h"
#include "address.h"
-#include "avrpins.h"
+//#include "avrpins.h"
#include "usb_ch9.h"
-#include "usbhost.h"
+//#include "usbhost.h"
+#include "../usb_host.h"
#include "UsbCore.h"
#include "parsetools.h"
#include "confdescparser.h"

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is required for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1021,17 +1021,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1022,17 +1022,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1026,17 +1026,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1017,17 +1017,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1017,17 +1017,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1017,17 +1017,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1017,17 +1017,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1022,17 +1022,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1022,17 +1022,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1002,17 +1002,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1023,17 +1023,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1023,17 +1023,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1019,17 +1019,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1017,17 +1017,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1014,17 +1014,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1017,17 +1017,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1017,17 +1017,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1031,17 +1031,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1020,17 +1020,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1018,17 +1018,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**

View file

@ -1019,17 +1019,31 @@
* equivalent MAX3421E breakout board. The USB thumb drive will appear
* to Marlin as an SD card.
*
* The MAX3421E must be assigned the same pins as the SD card reader, with
* The MAX3421E can be assigned the same pins as the SD card reader, with
* the following pin mapping:
*
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
* INT --> SD_DETECT_PIN
* INT --> SD_DETECT_PIN [1]
* SS --> SDSS
*
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
*/
//#define USB_FLASH_DRIVE_SUPPORT
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
#define USB_CS_PIN SDSS
#define USB_INTR_PIN SD_DETECT_PIN
/**
* USB Host Shield Library
*
* - UHS2 uses no interrupts and has been production-tested
* on a LulzBot TAZ Pro with a 32-bit Archim board.
*
* - UHS3 is newer code with better USB compatibility. But it
* is less tested and is known to interfere with Servos.
* [1] This requires USB_INTR_PIN to be interrupt-capable.
*/
//#define USE_UHS3_USB
#endif
/**