max4146x_comp

Dependencies:   MAX14690

Files at this revision

API Documentation at this revision

Comitter:
sdivarci
Date:
Sun Oct 25 20:10:02 2020 +0000
Commit message:
sdivarci

Changed in this revision

USBDevice/USBAudio/USBAudio.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBAudio/USBAudio.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBAudio/USBAudio_Types.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/devdrv_usb_function_api.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function_version.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_api.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dataio.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dma.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_intrn.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_lib.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_api.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_global.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sig.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sub.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_api.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dataio.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dma.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_intrn.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_lib.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_api.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_global.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sig.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sub.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb_function_setting.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/devdrv_usb_function_api.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function_version.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_api.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dataio.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dma.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_intrn.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_lib.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_api.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_global.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sig.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sub.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_api.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dataio.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dma.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_intrn.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_lib.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_api.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_global.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sig.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sub.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb_function_setting.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usb.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbd.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbh.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbhal.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbtypes.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/inc/usbconfig.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbd.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbdep.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbdint.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbhal.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbtimer.c Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBDescriptor.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBDevice.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBDevice.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBDevice_Types.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints_EFM32.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints_KL25Z.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints_LPC11U.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints_LPC17_LPC23.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints_Maxim.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints_RZ_A1H.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBEndpoints_STM32F4.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_EFM32.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_KL25Z.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_LPC11U.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_LPC17.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_LPC40.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_Maxim.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_RZ_A1H.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBHAL_STM32F4.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBDevice/USBRegs_STM32.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBHID.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBHID.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBHID_Types.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBKeyboard.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBKeyboard.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBMouse.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBMouse.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBMouseKeyboard.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBHID/USBMouseKeyboard.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBMIDI/MIDIMessage.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBMIDI/USBMIDI.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBMIDI/USBMIDI.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBMSD/USBMSD.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBMSD/USBMSD.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBSerial/CircBuffer.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBSerial/USBCDC.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBSerial/USBCDC.h Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBSerial/USBSerial.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBSerial/USBSerial.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
max32630fthr/MAX14690.lib Show annotated file Show diff for this revision Revisions of this file
max32630fthr/max32630fthr.cpp Show annotated file Show diff for this revision Revisions of this file
max32630fthr/max32630fthr.h Show annotated file Show diff for this revision Revisions of this file
max4146x/Max41460_regs.h Show annotated file Show diff for this revision Revisions of this file
max4146x/Max41461_2_regs.h Show annotated file Show diff for this revision Revisions of this file
max4146x/Max41463_4_regs.h Show annotated file Show diff for this revision Revisions of this file
max4146x/Max4146x.cpp Show annotated file Show diff for this revision Revisions of this file
max4146x/Max4146x.h Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBAudio/USBAudio.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,618 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBAudio.h"
+#include "USBAudio_Types.h"
+
+
+
+USBAudio::USBAudio(uint32_t frequency_in, uint8_t channel_nb_in, uint32_t frequency_out, uint8_t channel_nb_out, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
+    mute = 0;
+    volCur = 0x0080;
+    volMin = 0x0000;
+    volMax = 0x0100;
+    volRes = 0x0004;
+    available = false;
+
+    FREQ_IN = frequency_in;
+    FREQ_OUT = frequency_out;
+
+    this->channel_nb_in = channel_nb_in;
+    this->channel_nb_out = channel_nb_out;
+
+    // stereo -> *2, mono -> *1
+    PACKET_SIZE_ISO_IN = (FREQ_IN / 500) * channel_nb_in;
+    PACKET_SIZE_ISO_OUT = (FREQ_OUT / 500) * channel_nb_out;
+
+    // STEREO -> left and right
+    channel_config_in = (channel_nb_in == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
+    channel_config_out = (channel_nb_out == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
+
+    SOF_handler = false;
+
+    buf_stream_out = NULL;
+    buf_stream_in = NULL;
+
+    interruptOUT = false;
+    writeIN = false;
+    interruptIN = false;
+    available = false;
+
+    volume = 0;
+
+    // connect the device
+    USBDevice::connect();
+}
+
+bool USBAudio::read(uint8_t * buf) {
+    buf_stream_in = buf;
+    SOF_handler = false;
+    while (!available || !SOF_handler);
+    available = false;
+    return true;
+}
+
+bool USBAudio::readNB(uint8_t * buf) {
+    buf_stream_in = buf;
+    SOF_handler = false;
+    while (!SOF_handler);
+    if (available) {
+        available = false;
+        buf_stream_in = NULL;
+        return true;
+    }
+    return false;
+}
+
+bool USBAudio::readWrite(uint8_t * buf_read, uint8_t * buf_write) {
+    buf_stream_in = buf_read;
+    SOF_handler = false;
+    writeIN = false;
+    if (interruptIN) {
+        USBDevice::writeNB(EP3IN, buf_write, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
+    } else {
+        buf_stream_out = buf_write;
+    }
+    while (!available);
+    if (interruptIN) {
+        while (!writeIN);
+    }
+    while (!SOF_handler);
+    return true;
+}
+
+
+bool USBAudio::write(uint8_t * buf) {
+    writeIN = false;
+    SOF_handler = false;
+    if (interruptIN) {
+        USBDevice::writeNB(EP3IN, buf, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
+    } else {
+        buf_stream_out = buf;
+    }
+    while (!SOF_handler);
+    if (interruptIN) {
+        while (!writeIN);
+    }
+    return true;
+}
+
+
+float USBAudio::getVolume() {
+    return (mute) ? 0.0 : volume;
+}
+
+
+bool USBAudio::EPISO_OUT_callback() {
+    uint32_t size = 0;
+    interruptOUT = true;
+    if (buf_stream_in != NULL) {
+        readEP(EP3OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN);
+        available = true;
+        buf_stream_in = NULL;
+    }
+    readStart(EP3OUT, PACKET_SIZE_ISO_IN);
+    return false;
+}
+
+
+bool USBAudio::EPISO_IN_callback() {
+    interruptIN = true;
+    writeIN = true;
+    return true;
+}
+
+
+
+// Called in ISR context on each start of frame
+void USBAudio::SOF(int frameNumber) {
+    uint32_t size = 0;
+
+    if (!interruptOUT) {
+        // read the isochronous endpoint
+        if (buf_stream_in != NULL) {
+            if (USBDevice::readEP_NB(EP3OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN)) {
+                if (size) {
+                    available = true;
+                    readStart(EP3OUT, PACKET_SIZE_ISO_IN);
+                    buf_stream_in = NULL;
+                }
+            }
+        }
+    }
+
+    if (!interruptIN) {
+        // write if needed
+        if (buf_stream_out != NULL) {
+            USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream_out, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
+            buf_stream_out = NULL;
+        }
+    }
+
+    SOF_handler = true;
+}
+
+
+// Called in ISR context
+// Set configuration. Return false if the configuration is not supported.
+bool USBAudio::USBCallback_setConfiguration(uint8_t configuration) {
+    if (configuration != DEFAULT_CONFIGURATION) {
+        return false;
+    }
+
+    // Configure isochronous endpoint
+    realiseEndpoint(EP3OUT, PACKET_SIZE_ISO_IN, ISOCHRONOUS);
+    realiseEndpoint(EP3IN, PACKET_SIZE_ISO_OUT, ISOCHRONOUS);
+
+    // activate readings on this endpoint
+    readStart(EP3OUT, PACKET_SIZE_ISO_IN);
+    return true;
+}
+
+
+// Called in ISR context
+// Set alternate setting. Return false if the alternate setting is not supported
+bool USBAudio::USBCallback_setInterface(uint16_t interface, uint8_t alternate) {
+    if (interface == 0 && alternate == 0) {
+        return true;
+    }
+    if (interface == 1 && (alternate == 0 || alternate == 1)) {
+        return true;
+    }
+    if (interface == 2 && (alternate == 0 || alternate == 1)) {
+        return true;
+    }
+    return false;
+}
+
+
+
+// Called in ISR context
+// Called by USBDevice on Endpoint0 request
+// This is used to handle extensions to standard requests and class specific requests.
+// Return true if class handles this request
+bool USBAudio::USBCallback_request() {
+    bool success = false;
+    CONTROL_TRANSFER * transfer = getTransferPtr();
+
+    // Process class-specific requests
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
+
+        // Feature Unit: Interface = 0, ID = 2
+        if (transfer->setup.wIndex == 0x0200) {
+
+            // Master Channel
+            if ((transfer->setup.wValue & 0xff) == 0) {
+
+                switch (transfer->setup.wValue >> 8) {
+                    case MUTE_CONTROL:
+                        switch (transfer->setup.bRequest) {
+                            case REQUEST_GET_CUR:
+                                transfer->remaining = 1;
+                                transfer->ptr = &mute;
+                                transfer->direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+
+                            case REQUEST_SET_CUR:
+                                transfer->remaining = 1;
+                                transfer->notify = true;
+                                transfer->direction = HOST_TO_DEVICE;
+                                success = true;
+                                break;
+                            default:
+                                break;
+                        }
+                        break;
+                    case VOLUME_CONTROL:
+                        switch (transfer->setup.bRequest) {
+                            case REQUEST_GET_CUR:
+                                transfer->remaining = 2;
+                                transfer->ptr = (uint8_t *)&volCur;
+                                transfer->direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case REQUEST_GET_MIN:
+                                transfer->remaining = 2;
+                                transfer->ptr = (uint8_t *)&volMin;
+                                transfer->direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case REQUEST_GET_MAX:
+                                transfer->remaining = 2;
+                                transfer->ptr = (uint8_t *)&volMax;
+                                transfer->direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case REQUEST_GET_RES:
+                                transfer->remaining = 2;
+                                transfer->ptr = (uint8_t *)&volRes;
+                                transfer->direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+
+                            case REQUEST_SET_CUR:
+                                transfer->remaining = 2;
+                                transfer->notify = true;
+                                transfer->direction = HOST_TO_DEVICE;
+                                success = true;
+                                break;
+                            case REQUEST_SET_MIN:
+                                transfer->remaining = 2;
+                                transfer->notify = true;
+                                transfer->direction = HOST_TO_DEVICE;
+                                success = true;
+                                break;
+                            case REQUEST_SET_MAX:
+                                transfer->remaining = 2;
+                                transfer->notify = true;
+                                transfer->direction = HOST_TO_DEVICE;
+                                success = true;
+                                break;
+                            case REQUEST_SET_RES:
+                                transfer->remaining = 2;
+                                transfer->notify = true;
+                                transfer->direction = HOST_TO_DEVICE;
+                                success = true;
+                                break;
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+    }
+    return success;
+}
+
+
+// Called in ISR context when a data OUT stage has been performed
+void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {
+    if ((length == 1) || (length == 2)) {
+        uint16_t data = (length == 1) ? *buf : *((uint16_t *)buf);
+        CONTROL_TRANSFER * transfer = getTransferPtr();
+        switch (transfer->setup.wValue >> 8) {
+            case MUTE_CONTROL:
+                switch (transfer->setup.bRequest) {
+                    case REQUEST_SET_CUR:
+                        mute = data & 0xff;
+                        updateVol.call();
+                        break;
+                    default:
+                        break;
+                }
+                break;
+            case VOLUME_CONTROL:
+                switch (transfer->setup.bRequest) {
+                    case REQUEST_SET_CUR:
+                        volCur = data;
+                        volume = (float)volCur/(float)volMax;
+                        updateVol.call();
+                        break;
+                    default:
+                        break;
+                }
+                break;
+            default:
+                break;
+        }
+    }
+}
+
+
+
+#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
+                               + (5 * INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1) \
+                               + (2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
+                               + (1 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \
+                               + (2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
+                               + (2 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (2 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
+                               + (2 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
+                               + (2 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
+
+#define TOTAL_CONTROL_INTF_LENGTH    (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1 + \
+                                      2*INPUT_TERMINAL_DESCRIPTOR_LENGTH     + \
+                                      FEATURE_UNIT_DESCRIPTOR_LENGTH    + \
+                                      2*OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)
+
+uint8_t * USBAudio::configurationDesc() {
+    static uint8_t configDescriptor[] = {
+        // Configuration 1
+        CONFIGURATION_DESCRIPTOR_LENGTH,        // bLength
+        CONFIGURATION_DESCRIPTOR,               // bDescriptorType
+        LSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (LSB)
+        MSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (MSB)
+        0x03,                                   // bNumInterfaces
+        DEFAULT_CONFIGURATION,                  // bConfigurationValue
+        0x00,                                   // iConfiguration
+        0x80,                                   // bmAttributes
+        50,                                     // bMaxPower
+
+        // Interface 0, Alternate Setting 0, Audio Control
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x00,                                   // bInterfaceNumber
+        0x00,                                   // bAlternateSetting
+        0x00,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOCONTROL,                  // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
+
+
+        // Audio Control Interface
+        CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1,// bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_HEADER,                         // bDescriptorSubtype
+        LSB(0x0100),                            // bcdADC (LSB)
+        MSB(0x0100),                            // bcdADC (MSB)
+        LSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength
+        MSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength
+        0x02,                                   // bInCollection
+        0x01,                                   // baInterfaceNr
+        0x02,                                   // baInterfaceNr
+
+        // Audio Input Terminal (Speaker)
+        INPUT_TERMINAL_DESCRIPTOR_LENGTH,       // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_INPUT_TERMINAL,                 // bDescriptorSubtype
+        0x01,                                   // bTerminalID
+        LSB(TERMINAL_USB_STREAMING),            // wTerminalType
+        MSB(TERMINAL_USB_STREAMING),            // wTerminalType
+        0x00,                                   // bAssocTerminal
+        channel_nb_in,                          // bNrChannels
+        (uint8_t)(LSB(channel_config_in)),                 // wChannelConfig
+        (uint8_t)(MSB(channel_config_in)),                 // wChannelConfig
+        0x00,                                   // iChannelNames
+        0x00,                                   // iTerminal
+
+        // Audio Feature Unit (Speaker)
+        FEATURE_UNIT_DESCRIPTOR_LENGTH,         // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_FEATURE_UNIT,                   // bDescriptorSubtype
+        0x02,                                   // bUnitID
+        0x01,                                   // bSourceID
+        0x01,                                   // bControlSize
+        CONTROL_MUTE |
+        CONTROL_VOLUME,                         // bmaControls(0)
+        0x00,                                   // bmaControls(1)
+        0x00,                                   // iTerminal
+
+        // Audio Output Terminal (Speaker)
+        OUTPUT_TERMINAL_DESCRIPTOR_LENGTH,      // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_OUTPUT_TERMINAL,                // bDescriptorSubtype
+        0x03,                                   // bTerminalID
+        LSB(TERMINAL_SPEAKER),                  // wTerminalType
+        MSB(TERMINAL_SPEAKER),                  // wTerminalType
+        0x00,                                   // bAssocTerminal
+        0x02,                                   // bSourceID
+        0x00,                                   // iTerminal
+
+
+        // Audio Input Terminal (Microphone)
+        INPUT_TERMINAL_DESCRIPTOR_LENGTH,       // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_INPUT_TERMINAL,                 // bDescriptorSubtype
+        0x04,                                   // bTerminalID
+        LSB(TERMINAL_MICROPHONE),               // wTerminalType
+        MSB(TERMINAL_MICROPHONE),               // wTerminalType
+        0x00,                                   // bAssocTerminal
+        channel_nb_out,                         // bNrChannels
+        (uint8_t)(LSB(channel_config_out)),                // wChannelConfig
+        (uint8_t)(MSB(channel_config_out)),                // wChannelConfig
+        0x00,                                   // iChannelNames
+        0x00,                                   // iTerminal
+
+        // Audio Output Terminal (Microphone)
+        OUTPUT_TERMINAL_DESCRIPTOR_LENGTH,      // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_OUTPUT_TERMINAL,                // bDescriptorSubtype
+        0x05,                                   // bTerminalID
+        LSB(TERMINAL_USB_STREAMING),            // wTerminalType
+        MSB(TERMINAL_USB_STREAMING),            // wTerminalType
+        0x00,                                   // bAssocTerminal
+        0x04,                                   // bSourceID
+        0x00,                                   // iTerminal
+
+
+
+
+
+
+        // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x01,                                   // bInterfaceNumber
+        0x00,                                   // bAlternateSetting
+        0x00,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
+
+        // Interface 1, Alternate Setting 1, Audio Streaming - Operational
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x01,                                   // bInterfaceNumber
+        0x01,                                   // bAlternateSetting
+        0x01,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
+
+        // Audio Streaming Interface
+        STREAMING_INTERFACE_DESCRIPTOR_LENGTH,  // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        STREAMING_GENERAL,                      // bDescriptorSubtype
+        0x01,                                   // bTerminalLink
+        0x00,                                   // bDelay
+        LSB(FORMAT_PCM),                        // wFormatTag
+        MSB(FORMAT_PCM),                        // wFormatTag
+
+        // Audio Type I Format
+        FORMAT_TYPE_I_DESCRIPTOR_LENGTH,        // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        STREAMING_FORMAT_TYPE,                  // bDescriptorSubtype
+        FORMAT_TYPE_I,                          // bFormatType
+        channel_nb_in,                          // bNrChannels
+        0x02,                                   // bSubFrameSize
+        16,                                     // bBitResolution
+        0x01,                                   // bSamFreqType
+        (uint8_t)(LSB(FREQ_IN)),                           // tSamFreq
+        (uint8_t)((FREQ_IN >> 8) & 0xff),                  // tSamFreq
+        (uint8_t)((FREQ_IN >> 16) & 0xff),                 // tSamFreq
+
+        // Endpoint - Standard Descriptor
+        ENDPOINT_DESCRIPTOR_LENGTH + 2,         // bLength
+        ENDPOINT_DESCRIPTOR,                    // bDescriptorType
+        PHY_TO_DESC(EPISO_OUT),                 // bEndpointAddress
+        E_ISOCHRONOUS,                          // bmAttributes
+        (uint8_t)(LSB(PACKET_SIZE_ISO_IN)),                   // wMaxPacketSize
+        (uint8_t)(MSB(PACKET_SIZE_ISO_IN)),                   // wMaxPacketSize
+        0x01,                                   // bInterval
+        0x00,                                   // bRefresh
+        0x00,                                   // bSynchAddress
+
+        // Endpoint - Audio Streaming
+        STREAMING_ENDPOINT_DESCRIPTOR_LENGTH,   // bLength
+        ENDPOINT_DESCRIPTOR_TYPE,               // bDescriptorType
+        ENDPOINT_GENERAL,                       // bDescriptor
+        0x00,                                   // bmAttributes
+        0x00,                                   // bLockDelayUnits
+        LSB(0x0000),                            // wLockDelay
+        MSB(0x0000),                            // wLockDelay
+
+
+
+
+
+
+
+        // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x02,                                   // bInterfaceNumber
+        0x00,                                   // bAlternateSetting
+        0x00,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
+
+        // Interface 1, Alternate Setting 1, Audio Streaming - Operational
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x02,                                   // bInterfaceNumber
+        0x01,                                   // bAlternateSetting
+        0x01,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
+
+        // Audio Streaming Interface
+        STREAMING_INTERFACE_DESCRIPTOR_LENGTH,  // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        SUBCLASS_AUDIOCONTROL,                  // bDescriptorSubtype
+        0x05,                                   // bTerminalLink (output terminal microphone)
+        0x01,                                   // bDelay
+        0x01,                                   // wFormatTag
+        0x00,                                   // wFormatTag
+
+        // Audio Type I Format
+        FORMAT_TYPE_I_DESCRIPTOR_LENGTH,        // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        SUBCLASS_AUDIOSTREAMING,                // bDescriptorSubtype
+        FORMAT_TYPE_I,                          // bFormatType
+        channel_nb_out,                         // bNrChannels
+        0x02,                                   // bSubFrameSize
+        0x10,                                   // bBitResolution
+        0x01,                                   // bSamFreqType
+        (uint8_t)(LSB(FREQ_OUT)),                          // tSamFreq
+        (uint8_t)((FREQ_OUT >> 8) & 0xff),                 // tSamFreq
+        (uint8_t)((FREQ_OUT >> 16) & 0xff),                // tSamFreq
+
+        // Endpoint - Standard Descriptor
+        ENDPOINT_DESCRIPTOR_LENGTH + 2,         // bLength
+        ENDPOINT_DESCRIPTOR,                    // bDescriptorType
+        PHY_TO_DESC(EPISO_IN),                  // bEndpointAddress
+        E_ISOCHRONOUS,                          // bmAttributes
+        (uint8_t)(LSB(PACKET_SIZE_ISO_OUT)),                   // wMaxPacketSize
+        (uint8_t)(MSB(PACKET_SIZE_ISO_OUT)),                   // wMaxPacketSize
+        0x01,                                   // bInterval
+        0x00,                                   // bRefresh
+        0x00,                                   // bSynchAddress
+
+        // Endpoint - Audio Streaming
+        STREAMING_ENDPOINT_DESCRIPTOR_LENGTH,   // bLength
+        ENDPOINT_DESCRIPTOR_TYPE,               // bDescriptorType
+        ENDPOINT_GENERAL,                       // bDescriptor
+        0x00,                                   // bmAttributes
+        0x00,                                   // bLockDelayUnits
+        LSB(0x0000),                            // wLockDelay
+        MSB(0x0000),                            // wLockDelay
+
+        // Terminator
+        0                                       // bLength
+    };
+    return configDescriptor;
+}
+
+uint8_t * USBAudio::stringIinterfaceDesc() {
+    static uint8_t stringIinterfaceDescriptor[] = {
+        0x0c,                           //bLength
+        STRING_DESCRIPTOR,              //bDescriptorType 0x03
+        'A',0,'u',0,'d',0,'i',0,'o',0   //bString iInterface - Audio
+    };
+    return stringIinterfaceDescriptor;
+}
+
+uint8_t * USBAudio::stringIproductDesc() {
+    static uint8_t stringIproductDescriptor[] = {
+        0x16,                                                       //bLength
+        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
+        'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
+    };
+    return stringIproductDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBAudio/USBAudio.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,287 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBAudio_H
+#define USBAudio_H
+
+/* These headers are included for child class. */
+#include "USBEndpoints.h"
+#include "USBDescriptor.h"
+#include "USBDevice_Types.h"
+
+#include "USBDevice.h"
+
+
+/**
+* USBAudio example
+*
+* @code
+* #include "mbed.h"
+* #include "USBAudio.h"
+*
+* Serial pc(USBTX, USBRX);
+*
+* // frequency: 48 kHz
+* #define FREQ 48000
+*
+* // 1 channel: mono
+* #define NB_CHA 1
+*
+* // length of an audio packet: each ms, we receive 48 * 16bits ->48 * 2 bytes. as there is one channel, the length will be 48 * 2 * 1
+* #define AUDIO_LENGTH_PACKET 48 * 2 * 1
+*
+* // USBAudio
+* USBAudio audio(FREQ, NB_CHA);
+*
+* int main() {
+*    int16_t buf[AUDIO_LENGTH_PACKET/2];
+*
+*    while (1) {
+*        // read an audio packet
+*        audio.read((uint8_t *)buf);
+*
+*
+*        // print packet received
+*        pc.printf("recv: ");
+*        for(int i = 0; i < AUDIO_LENGTH_PACKET/2; i++) {
+*            pc.printf("%d ", buf[i]);
+*        }
+*        pc.printf("\r\n");
+*    }
+* }
+* @endcode
+*/
+class USBAudio: public USBDevice {
+public:
+
+    /**
+    * Constructor
+    *
+    * @param frequency_in frequency in Hz (default: 48000)
+    * @param channel_nb_in channel number (1 or 2) (default: 1)
+    * @param frequency_out frequency in Hz (default: 8000)
+    * @param channel_nb_out_in channel number (1 or 2) (default: 1)
+    * @param vendor_id Your vendor_id
+    * @param product_id Your product_id
+    * @param product_release Your preoduct_release
+    */
+    USBAudio(uint32_t frequency_in = 48000, uint8_t channel_nb_in = 1, uint32_t frequency_out = 8000, uint8_t channel_nb_out = 1, uint16_t vendor_id = 0x7bb8, uint16_t product_id = 0x1111, uint16_t product_release = 0x0100);
+
+    /**
+    * Get current volume between 0.0 and 1.0
+    *
+    * @returns volume
+    */
+    float getVolume();
+
+    /**
+    * Read an audio packet. During a frame, only a single reading (you can't write and read an audio packet during the same frame)can be done using this method. Warning: Blocking
+    *
+    * @param buf pointer on a buffer which will be filled with an audio packet
+    *
+    * @returns true if successfull
+    */
+    bool read(uint8_t * buf);
+
+    /**
+    * Try to read an audio packet. During a frame, only a single reading (you can't write and read an audio packet during the same frame)can be done using this method. Warning: Non Blocking
+    *
+    * @param buf pointer on a buffer which will be filled if an audio packet is available
+    *
+    * @returns true if successfull
+    */
+    bool readNB(uint8_t * buf);
+
+    /**
+    * Write an audio packet. During a frame, only a single writing (you can't write and read an audio packet during the same frame)can be done using this method.
+    *
+    * @param buf pointer on the audio packet which will be sent
+    * @returns true if successful
+    */
+    bool write(uint8_t * buf);
+
+    /**
+    * Write and read an audio packet at the same time (on the same frame)
+    *
+    * @param buf_read pointer on a buffer which will be filled with an audio packet
+    * @param buf_write pointer on the audio packet which will be sent
+    * @returns true if successful
+    */
+    bool readWrite(uint8_t * buf_read, uint8_t * buf_write);
+
+
+    /** attach a handler to update the volume
+     *
+     * @param function Function to attach
+     *
+     */
+    void attach(void(*fptr)(void)) {
+        updateVol.attach(fptr);
+    }
+
+    /** Attach a nonstatic void/void member function to update the volume
+     *
+     * @param tptr Object pointer
+     * @param mptr Member function pointer
+     *
+     */
+    template<typename T>
+    void attach(T *tptr, void(T::*mptr)(void)) {
+        updateVol.attach(tptr, mptr);
+    }
+
+
+protected:
+
+    /*
+    * Called by USBDevice layer. Set configuration of the device.
+    * For instance, you can add all endpoints that you need on this function.
+    *
+    * @param configuration Number of the configuration
+    * @returns true if class handles this request
+    */
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);
+
+    /*
+    * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
+    * This is used to handle extensions to standard requests
+    * and class specific requests
+    *
+    * @returns true if class handles this request
+    */
+    virtual bool USBCallback_request();
+
+    /*
+    * Get string product descriptor
+    *
+    * @returns pointer to the string product descriptor
+    */
+    virtual uint8_t * stringIproductDesc();
+
+    /*
+    * Get string interface descriptor
+    *
+    * @returns pointer to the string interface descriptor
+    */
+    virtual uint8_t * stringIinterfaceDesc();
+
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc();
+
+    /*
+     * Called by USBDevice layer. Set interface/alternate of the device.
+     *
+     * @param interface Number of the interface to be configured
+     * @param alternate Number of the alternate to be configured
+     * @returns true if class handles this request
+     */
+    virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate);
+
+    /*
+    * Called by USBDevice on Endpoint0 request completion
+    * if the 'notify' flag has been set to true. Warning: Called in ISR context
+    *
+    * In this case it is used to indicate that a HID report has
+    * been received from the host on endpoint 0
+    *
+    * @param buf buffer received on endpoint 0
+    * @param length length of this buffer
+    */
+    virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length);
+
+    /*
+    * Callback called on each Start of Frame event
+    */
+    virtual void SOF(int frameNumber);
+
+    /*
+    * Callback called when a packet is received
+    */
+    virtual bool EPISO_OUT_callback();
+
+    /*
+    * Callback called when a packet has been sent
+    */
+    virtual bool EPISO_IN_callback();
+
+private:
+
+    // stream available ?
+    volatile bool available;
+
+    // interrupt OUT has been received
+    volatile bool interruptOUT;
+
+    // interrupt IN has been received
+    volatile bool interruptIN;
+
+    // audio packet has been written
+    volatile bool writeIN;
+
+    // FREQ
+    uint32_t FREQ_OUT;
+    uint32_t FREQ_IN;
+
+    // size of the maximum packet for the isochronous endpoint
+    uint32_t PACKET_SIZE_ISO_IN;
+    uint32_t PACKET_SIZE_ISO_OUT;
+
+    // mono, stereo,...
+    uint8_t channel_nb_in;
+    uint8_t channel_nb_out;
+
+    // channel config: master, left, right
+    uint8_t channel_config_in;
+    uint8_t channel_config_out;
+
+    // mute state
+    uint8_t mute;
+
+    // Volume Current Value
+    uint16_t volCur;
+
+    // Volume Minimum Value
+    uint16_t volMin;
+
+    // Volume Maximum Value
+    uint16_t volMax;
+
+    // Volume Resolution
+    uint16_t volRes;
+
+    // Buffer containing one audio packet (to be read)
+    volatile uint8_t * buf_stream_in;
+
+    // Buffer containing one audio packet (to be written)
+    volatile uint8_t * buf_stream_out;
+
+    // callback to update volume
+    FunctionPointer updateVol;
+
+    // boolean showing that the SOF handler has been called. Useful for readNB.
+    volatile bool SOF_handler;
+
+    volatile float volume;
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBAudio/USBAudio_Types.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,97 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBAUDIO_TYPES_H
+#define USBAUDIO_TYPES_H
+
+
+#define DEFAULT_CONFIGURATION (1)
+
+// Audio Request Codes
+#define REQUEST_SET_CUR     0x01
+#define REQUEST_GET_CUR     0x81
+#define REQUEST_SET_MIN     0x02
+#define REQUEST_GET_MIN     0x82
+#define REQUEST_SET_MAX     0x03
+#define REQUEST_GET_MAX     0x83
+#define REQUEST_SET_RES     0x04
+#define REQUEST_GET_RES     0x84
+
+#define MUTE_CONTROL        0x01
+#define VOLUME_CONTROL      0x02
+
+
+// Audio Descriptor Sizes
+#define CONTROL_INTERFACE_DESCRIPTOR_LENGTH       0x09
+#define STREAMING_INTERFACE_DESCRIPTOR_LENGTH     0x07
+#define INPUT_TERMINAL_DESCRIPTOR_LENGTH          0x0C
+#define OUTPUT_TERMINAL_DESCRIPTOR_LENGTH         0x09
+#define FEATURE_UNIT_DESCRIPTOR_LENGTH            0x09
+#define STREAMING_ENDPOINT_DESCRIPTOR_LENGTH      0x07
+
+// Audio Format Type Descriptor Sizes
+#define FORMAT_TYPE_I_DESCRIPTOR_LENGTH   0x0b
+
+#define AUDIO_CLASS                       0x01
+#define SUBCLASS_AUDIOCONTROL             0x01
+#define SUBCLASS_AUDIOSTREAMING           0x02
+
+// Audio Descriptor Types
+#define INTERFACE_DESCRIPTOR_TYPE         0x24
+#define ENDPOINT_DESCRIPTOR_TYPE          0x25
+
+// Audio Control Interface Descriptor Subtypes
+#define CONTROL_HEADER                    0x01
+#define CONTROL_INPUT_TERMINAL            0x02
+#define CONTROL_OUTPUT_TERMINAL           0x03
+#define CONTROL_FEATURE_UNIT              0x06
+
+// USB Terminal Types
+#define TERMINAL_USB_STREAMING            0x0101
+
+// Predefined Audio Channel Configuration Bits
+// Mono
+#define CHANNEL_M                         0x0000
+#define CHANNEL_L                         0x0001  /* Left Front */
+#define CHANNEL_R                         0x0002  /* Right Front */
+
+// Feature Unit Control Bits
+#define CONTROL_MUTE                      0x0001
+#define CONTROL_VOLUME                    0x0002
+
+// Input Terminal Types
+#define TERMINAL_MICROPHONE               0x0201
+
+// Output Terminal Types
+#define TERMINAL_SPEAKER                  0x0301
+#define TERMINAL_HEADPHONES               0x0302
+
+// Audio Streaming Interface Descriptor Subtypes
+#define STREAMING_GENERAL                 0x01
+#define STREAMING_FORMAT_TYPE             0x02
+
+// Audio Data Format Type I Codes
+#define FORMAT_PCM                        0x0001
+
+// Audio Format Types
+#define FORMAT_TYPE_I                     0x01
+
+// Audio Endpoint Descriptor Subtypes
+#define ENDPOINT_GENERAL                  0x01
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/devdrv_usb_function_api.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,365 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : devdrv_usb_function_api.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB_FUNCTION_API_H
+#define USB_FUNCTION_API_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <MBRZA1H.h>
+#include "r_typedefs.h"
+#include "usb0_function_api.h"
+#include "usb1_function_api.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+typedef struct
+{
+    uint32_t fifo;
+    uint32_t buffer;
+    uint32_t bytes;
+    uint32_t dir;
+    uint32_t size;
+} USB_FUNCTION_DMA_t;
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define USBFCLOCK_X1_48MHZ                          (0x0000u)       /* USB_X1_48MHz */
+#define USBFCLOCK_EXTAL_12MHZ                       (0x0004u)       /* EXTAL_12MHz  */
+
+#define DEVDRV_USBF_ON                              (1)
+#define DEVDRV_USBF_OFF                             (0)
+#define DEVDRV_USBF_YES                             (1)
+#define DEVDRV_USBF_NO                              (0)
+
+#define DEVDRV_USBF_STALL                           (-2)
+
+#define DEVDRV_USBF_WRITEEND                        (0)
+#define DEVDRV_USBF_WRITESHRT                       (1)
+#define DEVDRV_USBF_WRITING                         (2)
+#define DEVDRV_USBF_WRITEDMA                        (3)
+
+#define DEVDRV_USBF_FIFOERROR                       (0xffff)
+
+#define DEVDRV_USBF_PIPE_IDLE                       (0x00)
+#define DEVDRV_USBF_PIPE_WAIT                       (0x01)
+#define DEVDRV_USBF_PIPE_DONE                       (0x02)
+#define DEVDRV_USBF_PIPE_NORES                      (0x03)
+#define DEVDRV_USBF_PIPE_STALL                      (0x04)
+
+#define DEVDRV_USBF_PID_NAK                         (0x0000u)
+#define DEVDRV_USBF_PID_BUF                         (0x0001u)
+#define DEVDRV_USBF_PID_STALL                       (0x0002u)
+#define DEVDRV_USBF_PID_STALL2                      (0x0003u)
+
+#define USB_FUNCTION_NON_SPEED                      (0)
+#define USB_FUNCTION_LOW_SPEED                      (1)
+#define USB_FUNCTION_FULL_SPEED                     (2)
+#define USB_FUNCTION_HIGH_SPEED                     (3)
+
+#define USB_FUNCTION_READEND                        (0)
+#define USB_FUNCTION_READSHRT                       (1)
+#define USB_FUNCTION_READING                        (2)
+#define USB_FUNCTION_READOVER                       (3)
+#define USB_FUNCTION_READZERO                       (4)
+
+#define USB_FUNCTION_MAX_PIPE_NO                    (15u)
+#define USB_FUNCTION_PIPE0                          (0)
+#define USB_FUNCTION_PIPE1                          (1)
+#define USB_FUNCTION_PIPE2                          (2)
+#define USB_FUNCTION_PIPE3                          (3)
+#define USB_FUNCTION_PIPE4                          (4)
+#define USB_FUNCTION_PIPE5                          (5)
+#define USB_FUNCTION_PIPE6                          (6)
+#define USB_FUNCTION_PIPE7                          (7)
+#define USB_FUNCTION_PIPE8                          (8)
+#define USB_FUNCTION_PIPE9                          (9)
+#define USB_FUNCTION_PIPEA                          (10)
+#define USB_FUNCTION_PIPEB                          (11)
+#define USB_FUNCTION_PIPEC                          (12)
+#define USB_FUNCTION_PIPED                          (13)
+#define USB_FUNCTION_PIPEE                          (14)
+#define USB_FUNCTION_PIPEF                          (15)
+
+#define USB_FUNCTION_ISO                            (0xc000u)
+#define USB_FUNCTION_INTERRUPT                      (0x8000u)
+#define USB_FUNCTION_BULK                           (0x4000u)
+
+#define USB_FUNCTION_NONE                           (0x0000u)
+#define USB_FUNCTON_BFREFIELD                       (0x0400u)
+#define USB_FUNCTION_BFREON                         (0x0400u)
+#define USB_FUNCTION_BFREOFF                        (0x0000u)
+#define USB_FUNCTION_DBLBFIELD                      (0x0200u)
+#define USB_FUNCTION_DBLBON                         (0x0200u)
+#define USB_FUNCTION_DBLBOFF                        (0x0000u)
+#define USB_FUNCTION_CNTMDFIELD                     (0x0100u)
+#define USB_FUNCTION_CNTMDON                        (0x0100u)
+#define USB_FUNCTION_CNTMDOFF                       (0x0000u)
+#define USB_FUNCTION_SHTNAKON                       (0x0080u)
+#define USB_FUNCTION_SHTNAKOFF                      (0x0000u)
+#define USB_FUNCTION_DIRFIELD                       (0x0010u)
+#define USB_FUNCTION_DIR_P_OUT                      (0x0000u)
+#define USB_FUNCTION_DIR_P_IN                       (0x0010u)
+#define USB_FUNCTION_EPNUMFIELD                     (0x000fu)
+#define USB_FUNCTION_MAX_EP_NO                      (15u)
+#define USB_FUNCTION_EP0                            (0u)
+#define USB_FUNCTION_EP1                            (1u)
+#define USB_FUNCTION_EP2                            (2u)
+#define USB_FUNCTION_EP3                            (3u)
+#define USB_FUNCTION_EP4                            (4u)
+#define USB_FUNCTION_EP5                            (5u)
+#define USB_FUNCTION_EP6                            (6u)
+#define USB_FUNCTION_EP7                            (7u)
+#define USB_FUNCTION_EP8                            (8u)
+#define USB_FUNCTION_EP9                            (9u)
+#define USB_FUNCTION_EP10                           (10u)
+#define USB_FUNCTION_EP11                           (11u)
+#define USB_FUNCTION_EP12                           (12u)
+#define USB_FUNCTION_EP13                           (13u)
+#define USB_FUNCTION_EP14                           (14u)
+#define USB_FUNCTION_EP15                           (15u)
+
+#define USB_FUNCTION_EPTABLE_LENGTH                 (5u)
+
+#define USB_FUNCTION_CUSE                           (0)
+#define USB_FUNCTION_D0USE                          (1)
+#define USB_FUNCTION_D0DMA                          (2)
+#define USB_FUNCTION_D1USE                          (3)
+#define USB_FUNCTION_D1DMA                          (4)
+
+#define USB_FUNCTION_CFIFO_USE                      (0x0000)
+#define USB_FUNCTION_D0FIFO_USE                     (0x1000)
+#define USB_FUNCTION_D1FIFO_USE                     (0x2000)
+#define USB_FUNCTION_D0FIFO_DMA                     (0x5000)
+#define USB_FUNCTION_D1FIFO_DMA                     (0x6000)
+
+#define USB_FUNCTION_BUF2FIFO                       (0)
+#define USB_FUNCTION_FIFO2BUF                       (1)
+
+#define USB_FUNCTION_DVST_POWERED                   (0x0001)
+#define USB_FUNCTION_DVST_DEFAULT                   (0x0002)
+#define USB_FUNCTION_DVST_ADDRESS                   (0x0003)
+#define USB_FUNCTION_DVST_CONFIGURED                (0x0004)
+#define USB_FUNCTION_DVST_SUSPEND                   (0x0005)
+#define USB_FUNCTION_DVST_CONFIGURED_SUSPEND        (0x0006)
+
+#define USB_FUNCTION_FUNCTION_TEST_SELECT           (0xff00u)
+#define USB_FUNCTION_FUNCTION_TEST_J                (0x0100u)
+#define USB_FUNCTION_FUNCTION_TEST_K                (0x0200u)
+#define USB_FUNCTION_FUNCTION_TEST_SE0_NAK          (0x0300u)
+#define USB_FUNCTION_FUNCTION_TEST_PACKET           (0x0400u)
+#define USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE     (0x0500u)
+#define USB_FUNCTION_FUNCTION_TEST_STSelectors      (0x0600u)
+#define USB_FUNCTION_FUNCTION_TEST_Reserved         (0x4000u)
+#define USB_FUNCTION_FUNCTION_TEST_VSTModes         (0xc000u)
+
+#define USB_FUNCTION_DT_TYPE                        (0xff00u)
+#define USB_FUNCTION_DT_INDEX                       (0xff)
+#define USB_FUNCTION_DT_DEVICE                      (0x01)
+#define USB_FUNCTION_DT_CONFIGURATION               (0x02)
+#define USB_FUNCTION_DT_STRING                      (0x03)
+#define USB_FUNCTION_DT_INTERFACE                   (0x04)
+#define USB_FUNCTION_DT_ENDPOINT                    (0x05)
+#define USB_FUNCTION_DT_DEVICE_QUALIFIER            (0x06)
+#define USB_FUNCTION_DT_OTHER_SPEED_CONFIGURATION   (0x07)
+#define USB_FUNCTION_DT_INTERFACE_POWER             (0x08)
+
+#define USB_FUNCTION_CF_RESERVED                    (0x80)
+#define USB_FUNCTION_CF_SELF                        (0x40)
+#define USB_FUNCTION_CF_RWUP                        (0x20)
+#define USB_FUNCTION_CF_NORWUP                      (0x00)
+#define USB_FUNCTION_EP_ERROR                       (0xff)
+
+#define USB_FUNCTION_EP_OUT                         (0x00)
+#define USB_FUNCTION_EP_IN                          (0x80)
+#define USB_FUNCTION_EP_CNTRL                       (0x00)
+#define USB_FUNCTION_EP_ISO                         (0x01)
+#define USB_FUNCTION_EP_BULK                        (0x02)
+#define USB_FUNCTION_EP_INT                         (0x03)
+
+#define USB_FUNCTION_STANDARD_REQUEST               (0x0000u)
+#define USB_FUNCTION_CLASS_REQUEST                  (0x0020u)
+#define USB_FUNCTION_VENDOR_REQUEST                 (0x0040u)
+#define USB_FUNCTION_DEVICE_REQUEST                 (0x0000u)
+#define USB_FUNCTION_INTERFACE_REQUEST              (0x0001u)
+#define USB_FUNCTION_ENDPOINT_REQUEST               (0x0002u)
+
+#define USB_FUNCTION_GETSTATUS_BUSPOWERD            (0x0000u)
+#define USB_FUNCTION_GETSTATUS_SELFPOWERD           (0x0001u)
+#define USB_FUNCTION_GETSTATUS_REMOTEWAKEUP         (0x0002u)
+#define USB_FUNCTION_GETSTATUS_NOTHALT              (0x0000u)
+#define USB_FUNCTION_GETSTATUS_HALT                 (0x0001u)
+
+#define USB_FUNCTION_FEATURE_ENDPOINT_HALT          (0x0000u)
+#define USB_FUNCTION_FEATURE_REMOTE_WAKEUP          (0x0001u)
+#define USB_FUNCTION_FEATURE_TEST_MODE              (0x0002u)
+
+#define USB_FUNCTION_bRequest                       (0xff00u)       /* b15-8:bRequest */
+#define USB_FUNCTION_bmRequestType                  (0x00ffu)       /* b7-0: bmRequestType */
+#define USB_FUNCTION_bmRequestTypeDir               (0x0080u)       /* b7  : Data transfer direction */
+#define USB_FUNCTION_bmRequestTypeType              (0x0060u)       /* b6-5: Type */
+#define USB_FUNCTION_bmRequestTypeRecip             (0x001fu)       /* b4-0: Recipient */
+
+
+/*******************************************************************************
+Variable Externs
+*******************************************************************************/
+
+
+/*******************************************************************************
+Functions Prototypes
+*******************************************************************************/
+#if 0
+void     R_USB_api_function_init(uint16_t root, uint8_t int_level, uint16_t mode, uint16_t clockmode);
+uint16_t R_USB_api_function_IsConfigured(uint16_t root);
+uint16_t R_USB_api_function_CtrlReadStart(uint16_t root, uint32_t size, uint8_t *data);
+void     R_USB_api_function_CtrlWriteStart(uint16_t root, uint32_t size, uint8_t *data);
+uint16_t R_USB_api_function_start_send_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t R_USB_api_function_check_pipe_status(uint16_t root, uint16_t pipe, uint32_t *size);
+void     R_USB_api_function_clear_pipe_status(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_start_receive_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data);
+void     R_USB_api_function_set_pid_buf(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_pid_nak(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_pid_stall(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_clear_pid_stall(uint16_t root, uint16_t pipe);
+uint16_t R_USB_api_function_get_pid(uint16_t root, uint16_t pipe);
+int32_t  R_USB_api_function_check_stall(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_sqclr(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_sqset(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_csclr(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_curpipe(uint16_t root, uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     R_USB_api_function_clear_brdy_sts(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_clear_bemp_sts(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_clear_nrdy_sts(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_enable_brdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_disable_brdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_enable_bemp_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_disable_bemp_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_enable_nrdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_disable_nrdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_stop_transfer(uint16_t root, uint16_t pipe);
+#endif
+
+#ifdef USB0_FUNCTION_API_H
+void     usb0_function_interrupt(uint32_t int_sense);
+void     usb0_function_dma_interrupt_d0fifo(uint32_t int_sense);
+void     usb0_function_dma_interrupt_d1fifo(uint32_t int_sense);
+
+void     usb0_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_ResetDescriptor(uint16_t mode);
+
+IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid(void);
+IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid(void);
+void     Userdef_USB_usb0_function_attach(void);
+void     Userdef_USB_usb0_function_detach(void);
+void     Userdef_USB_usb0_function_delay_1ms(void);
+void     Userdef_USB_usb0_function_delay_xms(uint32_t msec);
+void     Userdef_USB_usb0_function_delay_10us(uint32_t usec);
+void     Userdef_USB_usb0_function_delay_500ns(void);
+void     Userdef_USB_usb0_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc);
+uint32_t Userdef_USB_usb0_function_stop_dma0(void);
+uint32_t Userdef_USB_usb0_function_stop_dma1(void);
+
+void     usb0_function_stop_transfer(uint16_t pipe);
+void     usb0_function_enable_brdy_int(uint16_t pipe);
+void     usb0_function_disable_brdy_int(uint16_t pipe);
+void     usb0_function_enable_bemp_int(uint16_t pipe);
+void     usb0_function_disable_bemp_int(uint16_t pipe);
+void     usb0_function_enable_nrdy_int(uint16_t pipe);
+void     usb0_function_disable_nrdy_int(uint16_t pipe);
+#endif
+
+#ifdef  USB1_FUNCTION_API_H
+void     usb1_function_interrupt(uint32_t int_sense);
+void     usb1_function_dma_interrupt_d0fifo(uint32_t int_sense);
+void     usb1_function_dma_interrupt_d1fifo(uint32_t int_sense);
+
+void     usb1_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_ResetDescriptor(uint16_t mode);
+
+IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid(void);
+IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid(void);
+void     Userdef_USB_usb1_function_attach(void);
+void     Userdef_USB_usb1_function_detach(void);
+void     Userdef_USB_usb1_function_delay_1ms(void);
+void     Userdef_USB_usb1_function_delay_xms(uint32_t msec);
+void     Userdef_USB_usb1_function_delay_10us(uint32_t usec);
+void     Userdef_USB_usb1_function_delay_500ns(void);
+void     Userdef_USB_usb1_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc);
+uint32_t Userdef_USB_usb1_function_stop_dma0(void);
+uint32_t Userdef_USB_usb1_function_stop_dma1(void);
+
+void     usb1_function_stop_transfer(uint16_t pipe);
+void     usb1_function_enable_brdy_int(uint16_t pipe);
+void     usb1_function_disable_brdy_int(uint16_t pipe);
+void     usb1_function_enable_bemp_int(uint16_t pipe);
+void     usb1_function_disable_bemp_int(uint16_t pipe);
+void     usb1_function_enable_nrdy_int(uint16_t pipe);
+void     usb1_function_disable_nrdy_int(uint16_t pipe);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* USB_FUNCTION_API_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,143 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb_function.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB_FUNCTION_H
+#define USB_FUNCTION_H
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "rza_io_regrw.h"
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define USB_FUNCTION_ALT_NO         (255)
+#define USB_FUNCTION_ALT_SET        (0xff)
+
+#define USB_FUNCTION_BITUPLLE       (0x0002u)
+#define USB_FUNCTION_BITUCKSEL      (0x0004u)
+#define USB_FUNCTION_BITBWAIT       (0x003fu)
+
+#define USB_FUNCTION_BUSWAIT_02     (0x0000u)
+#define USB_FUNCTION_BUSWAIT_03     (0x0001u)
+#define USB_FUNCTION_BUSWAIT_04     (0x0002u)
+#define USB_FUNCTION_BUSWAIT_05     (0x0003u)
+#define USB_FUNCTION_BUSWAIT_06     (0x0004u)
+#define USB_FUNCTION_BUSWAIT_07     (0x0005u)
+#define USB_FUNCTION_BUSWAIT_08     (0x0006u)
+#define USB_FUNCTION_BUSWAIT_09     (0x0007u)
+#define USB_FUNCTION_BUSWAIT_10     (0x0008u)
+#define USB_FUNCTION_BUSWAIT_11     (0x0009u)
+#define USB_FUNCTION_BUSWAIT_12     (0x000au)
+#define USB_FUNCTION_BUSWAIT_13     (0x000bu)
+#define USB_FUNCTION_BUSWAIT_14     (0x000cu)
+#define USB_FUNCTION_BUSWAIT_15     (0x000du)
+#define USB_FUNCTION_BUSWAIT_16     (0x000eu)
+#define USB_FUNCTION_BUSWAIT_17     (0x000fu)
+
+#define USB_FUNCTION_BITRESUME      (0x0020u)
+#define USB_FUNCTION_BITUACT        (0x0010u)
+#define USB_FUNCTION_HSPROC         (0x0004u)
+#define USB_FUNCTION_HSMODE         (0x0003u)
+#define USB_FUNCTION_FSMODE         (0x0002u)
+#define USB_FUNCTION_LSMODE         (0x0001u)
+#define USB_FUNCTION_UNDECID        (0x0000u)
+
+#define USB_FUNCTION_BITRCNT        (0x8000u)
+#define USB_FUNCTION_BITDREQE       (0x1000u)
+#define USB_FUNCTION_BITMBW         (0x0c00u)
+#define USB_FUNCTION_BITMBW_8       (0x0000u)
+#define USB_FUNCTION_BITMBW_16      (0x0400u)
+#define USB_FUNCTION_BITMBW_32      (0x0800u)
+#define USB_FUNCTION_BITBYTE_LITTLE (0x0000u)
+#define USB_FUNCTION_BITBYTE_BIG    (0x0100u)
+#define USB_FUNCTION_BITISEL        (0x0020u)
+#define USB_FUNCTION_BITCURPIPE     (0x000fu)
+
+#define USB_FUNCTION_CFIFO_READ     (0x0000u)
+#define USB_FUNCTION_CFIFO_WRITE    (0x0020u)
+
+#define USB_FUNCTION_BITBVAL        (0x8000u)
+#define USB_FUNCTION_BITBCLR        (0x4000u)
+#define USB_FUNCTION_BITFRDY        (0x2000u)
+#define USB_FUNCTION_BITDTLN        (0x0fffu)
+
+#define USB_FUNCTION_BITVBSE        (0x8000u)
+#define USB_FUNCTION_BITRSME        (0x4000u)
+#define USB_FUNCTION_BITSOFE        (0x2000u)
+#define USB_FUNCTION_BITDVSE        (0x1000u)
+#define USB_FUNCTION_BITCTRE        (0x0800u)
+#define USB_FUNCTION_BITVBINT       (0x8000u)
+#define USB_FUNCTION_BITRESM        (0x4000u)
+#define USB_FUNCTION_BITSOFR        (0x2000u)
+#define USB_FUNCTION_BITDVST        (0x1000u)
+#define USB_FUNCTION_BITCTRT        (0x0800u)
+
+#define USB_FUNCTION_BITBEMPE       (0x0400u)
+#define USB_FUNCTION_BITNRDYE       (0x0200u)
+#define USB_FUNCTION_BITBRDYE       (0x0100u)
+#define USB_FUNCTION_BITBEMP        (0x0400u)
+#define USB_FUNCTION_BITNRDY        (0x0200u)
+#define USB_FUNCTION_BITBRDY        (0x0100u)
+
+#define USB_FUNCTION_BITDVSQ        (0x0070u)
+#define USB_FUNCTION_BITDVSQS       (0x0030u)
+#define USB_FUNCTION_DS_SPD_CNFG    (0x0070u)
+#define USB_FUNCTION_DS_SPD_ADDR    (0x0060u)
+#define USB_FUNCTION_DS_SPD_DFLT    (0x0050u)
+#define USB_FUNCTION_DS_SPD_POWR    (0x0040u)
+#define USB_FUNCTION_DS_CNFG        (0x0030u)
+#define USB_FUNCTION_DS_ADDS        (0x0020u)
+#define USB_FUNCTION_DS_DFLT        (0x0010u)
+#define USB_FUNCTION_DS_POWR        (0x0000u)
+#define USB_FUNCTION_BITVALID       (0x0008u)
+#define USB_FUNCTION_BITCTSQ        (0x0007u)
+#define USB_FUNCTION_CS_SQER        (0x0006u)
+#define USB_FUNCTION_CS_WRND        (0x0005u)
+#define USB_FUNCTION_CS_WRSS        (0x0004u)
+#define USB_FUNCTION_CS_WRDS        (0x0003u)
+#define USB_FUNCTION_CS_RDSS        (0x0002u)
+#define USB_FUNCTION_CS_RDDS        (0x0001u)
+#define USB_FUNCTION_CS_IDST        (0x0000u)
+
+#define USB_FUNCTION_PIPExBUF       (64u)
+
+#define USB_FUNCTION_D0FIFO         (0)
+#define USB_FUNCTION_D1FIFO         (1)
+#define USB_FUNCTION_DMA_READY      (0)
+#define USB_FUNCTION_DMA_BUSY       (1)
+#define USB_FUNCTION_DMA_BUSYEND    (2)
+
+#define USB_FUNCTION_FIFO_USE       (0x7000)
+
+#endif /* USB_FUNCTION_FUNCTION_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function_version.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,32 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb_function_version.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+
+#define USB_FUNCTION_LOCAL_Rev  "VER080_140709"
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,171 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB0_FUNCTION_H
+#define USB0_FUNCTION_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "devdrv_usb_function_api.h"
+#include "usb_function.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern const uint16_t       g_usb0_function_bit_set[];
+extern uint32_t             g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint8_t              *g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+extern uint16_t             g_usb0_function_PipeIgnore[];
+extern uint16_t             g_usb0_function_PipeTbl[];
+extern uint16_t             g_usb0_function_pipe_status[];
+extern uint32_t             g_usb0_function_PipeDataSize[];
+
+extern USB_FUNCTION_DMA_t   g_usb0_function_DmaInfo[];
+extern uint16_t             g_usb0_function_DmaPipe[];
+extern uint16_t             g_usb0_function_DmaBval[];
+extern uint16_t             g_usb0_function_DmaStatus[];
+
+extern uint16_t             g_usb0_function_CtrZeroLengthFlag;
+
+extern uint16_t             g_usb0_function_ConfigNum;
+extern uint16_t             g_usb0_function_Alternate[USB_FUNCTION_ALT_NO];
+extern uint16_t             g_usb0_function_RemoteWakeupFlag;
+extern uint16_t             g_usb0_function_TestModeFlag;
+extern uint16_t             g_usb0_function_TestModeSelectors;
+
+extern uint16_t             g_usb0_function_ReqType;
+extern uint16_t             g_usb0_function_ReqTypeType;
+extern uint16_t             g_usb0_function_ReqTypeRecip;
+extern uint16_t             g_usb0_function_ReqRequest;
+extern uint16_t             g_usb0_function_ReqValue;
+extern uint16_t             g_usb0_function_ReqIndex;
+extern uint16_t             g_usb0_function_ReqLength;
+
+extern uint16_t             g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+extern uint16_t             g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+/* ==== common ==== */
+void     usb0_function_dma_stop_d0(uint16_t pipe, uint32_t remain);
+void     usb0_function_dma_stop_d1(uint16_t pipe, uint32_t remain);
+uint16_t usb0_function_is_hispeed(void);
+uint16_t usb0_function_is_hispeed_enable(void);
+uint16_t usb0_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb0_function_write_buffer(uint16_t pipe);
+uint16_t usb0_function_write_buffer_c(uint16_t pipe);
+uint16_t usb0_function_write_buffer_d0(uint16_t pipe);
+uint16_t usb0_function_write_buffer_d1(uint16_t pipe);
+void     usb0_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb0_function_read_buffer(uint16_t pipe);
+uint16_t usb0_function_read_buffer_c(uint16_t pipe);
+uint16_t usb0_function_read_buffer_d0(uint16_t pipe);
+uint16_t usb0_function_read_buffer_d1(uint16_t pipe);
+uint16_t usb0_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb0_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb0_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc);
+uint16_t usb0_function_get_mbw(uint32_t trncount, uint32_t dtptr);
+uint16_t usb0_function_read_dma(uint16_t pipe);
+void     usb0_function_brdy_int(uint16_t status, uint16_t int_enb);
+void     usb0_function_nrdy_int(uint16_t status, uint16_t int_enb);
+void     usb0_function_bemp_int(uint16_t status, uint16_t int_enb);
+void     usb0_function_setting_interrupt(uint8_t level);
+void     usb0_function_reset_module(uint16_t clockmode);
+uint16_t usb0_function_get_buf_size(uint16_t pipe);
+uint16_t usb0_function_get_mxps(uint16_t pipe);
+void     usb0_function_clear_brdy_sts(uint16_t pipe);
+void     usb0_function_clear_bemp_sts(uint16_t pipe);
+void     usb0_function_clear_nrdy_sts(uint16_t pipe);
+void     usb0_function_set_pid_buf(uint16_t pipe);
+void     usb0_function_set_pid_nak(uint16_t pipe);
+void     usb0_function_set_pid_stall(uint16_t pipe);
+void     usb0_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb0_function_get_pid(uint16_t pipe);
+void     usb0_function_set_sqclr(uint16_t pipe);
+void     usb0_function_set_sqset(uint16_t pipe);
+void     usb0_function_set_csclr(uint16_t pipe);
+void     usb0_function_aclrm(uint16_t pipe);
+void     usb0_function_set_aclrm(uint16_t pipe);
+void     usb0_function_clr_aclrm(uint16_t pipe);
+uint16_t usb0_function_get_sqmon(uint16_t pipe);
+uint16_t usb0_function_get_inbuf(uint16_t pipe);
+
+/* ==== function ==== */
+void     usb0_function_init_status(void);
+void     usb0_function_InitModule(uint16_t mode);
+uint16_t usb0_function_CheckVBUStaus(void);
+void     usb0_function_USB_FUNCTION_Attach(void);
+void     usb0_function_USB_FUNCTION_Detach(void);
+void     usb0_function_USB_FUNCTION_BusReset(void);
+void     usb0_function_USB_FUNCTION_Resume(void);
+void     usb0_function_USB_FUNCTION_Suspend(void);
+void     usb0_function_USB_FUNCTION_TestMode(void);
+void     usb0_function_ResetDCP(void);
+void     usb0_function_ResetEP(uint16_t num);
+uint16_t usb0_function_EpToPipe(uint16_t ep);
+void     usb0_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num);
+uint16_t usb0_function_GetConfigNum(void);
+uint16_t usb0_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num);
+uint16_t usb0_function_CheckRemoteWakeup(void);
+void     usb0_function_clear_alt(void);
+void     usb0_function_clear_pipe_tbl(void);
+void     usb0_function_clear_ep_table_index(void);
+uint16_t usb0_function_GetInterfaceNum(uint16_t num);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* USB0_FUNCTION_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_api.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,104 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_api.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB0_FUNCTION_API_H
+#define USB0_FUNCTION_API_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Variable Externs
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void     usb0_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode);
+uint16_t usb0_api_function_IsConfigured(void);
+uint16_t usb0_function_GetDeviceState(void);
+uint16_t usb0_api_function_CtrlReadStart(uint32_t size, uint8_t *data);
+void     usb0_api_function_CtrlWriteStart(uint32_t size, uint8_t *data);
+uint16_t usb0_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb0_api_function_check_pipe_status(uint16_t pipe, uint32_t *size);
+void     usb0_api_function_clear_pipe_status(uint16_t pipe);
+void     usb0_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+void     usb0_api_function_set_pid_buf(uint16_t pipe);
+void     usb0_api_function_set_pid_nak(uint16_t pipe);
+void     usb0_api_function_set_pid_stall(uint16_t pipe);
+void     usb0_api_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb0_api_function_get_pid(uint16_t pipe);
+int32_t  usb0_api_function_check_stall(uint16_t pipe);
+void     usb0_api_function_set_sqclr(uint16_t pipe);
+void     usb0_api_function_set_sqset(uint16_t pipe);
+void     usb0_api_function_set_csclr(uint16_t pipe);
+void     usb0_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb0_api_function_clear_brdy_sts(uint16_t pipe);
+void     usb0_api_function_clear_bemp_sts(uint16_t pipe);
+void     usb0_api_function_clear_nrdy_sts(uint16_t pipe);
+
+void     usb0_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB0_FUNCTION_API_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dmacdrv.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB0_FUNCTION_DMACDRV_H
+#define USB0_FUNCTION_DMACDRV_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+typedef struct dmac_transinfo
+{
+    uint32_t src_addr;      /* Transfer source address                */
+    uint32_t dst_addr;      /* Transfer destination address           */
+    uint32_t count;         /* Transfer byte count                    */
+    uint32_t src_size;      /* Transfer source data size              */
+    uint32_t dst_size;      /* Transfer destination data size         */
+    uint32_t saddr_dir;     /* Transfer source address direction      */
+    uint32_t daddr_dir;     /* Transfer destination address direction */
+} dmac_transinfo_t;
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+/* ==== Transfer specification of the sample program ==== */
+#define DMAC_SAMPLE_SINGLE          (0)     /* Single transfer                   */
+#define DMAC_SAMPLE_CONTINUATION    (1)     /* Continuous transfer (use REN bit) */
+
+/* ==== DMA modes ==== */
+#define DMAC_MODE_REGISTER          (0)     /* Register mode */
+#define DMAC_MODE_LINK              (1)     /* Link mode     */
+
+/* ==== Transfer requests ==== */
+#define DMAC_REQ_MODE_EXT           (0)     /* External request                   */
+#define DMAC_REQ_MODE_PERI          (1)     /* On-chip peripheral module request  */
+#define DMAC_REQ_MODE_SOFT          (2)     /* Auto-request (request by software) */
+
+/* ==== DMAC transfer sizes ==== */
+#define DMAC_TRANS_SIZE_8           (0)     /* 8 bits    */
+#define DMAC_TRANS_SIZE_16          (1)     /* 16 bits   */
+#define DMAC_TRANS_SIZE_32          (2)     /* 32 bits   */
+#define DMAC_TRANS_SIZE_64          (3)     /* 64 bits   */
+#define DMAC_TRANS_SIZE_128         (4)     /* 128 bits  */
+#define DMAC_TRANS_SIZE_256         (5)     /* 256 bits  */
+#define DMAC_TRANS_SIZE_512         (6)     /* 512 bits  */
+#define DMAC_TRANS_SIZE_1024        (7)     /* 1024 bits */
+
+/* ==== Address increment for transferring ==== */
+#define DMAC_TRANS_ADR_NO_INC       (1)     /* Not increment */
+#define DMAC_TRANS_ADR_INC          (0)     /* Increment     */
+
+/* ==== Method for detecting DMA request ==== */
+#define DMAC_REQ_DET_FALL           (0)     /* Falling edge detection */
+#define DMAC_REQ_DET_RISE           (1)     /* Rising edge detection  */
+#define DMAC_REQ_DET_LOW            (2)     /* Low level detection    */
+#define DMAC_REQ_DET_HIGH           (3)     /* High level detection   */
+
+/* ==== Request Direction ==== */
+#define DMAC_REQ_DIR_SRC            (0)     /* DMAREQ is the source/ DMAACK is active when reading      */
+#define DMAC_REQ_DIR_DST            (1)     /* DMAREQ is the destination/ DMAACK is active when writing */
+
+/* ==== Descriptors ==== */
+#define DMAC_DESC_HEADER            (0)     /* Header              */
+#define DMAC_DESC_SRC_ADDR          (1)     /* Source Address      */
+#define DMAC_DESC_DST_ADDR          (2)     /* Destination Address */
+#define DMAC_DESC_COUNT             (3)     /* Transaction Byte    */
+#define DMAC_DESC_CHCFG             (4)     /* Channel Confg       */
+#define DMAC_DESC_CHITVL            (5)     /* Channel Interval    */
+#define DMAC_DESC_CHEXT             (6)     /* Channel Extension   */
+#define DMAC_DESC_LINK_ADDR         (7)     /* Link Address        */
+
+/* ==== On-chip peripheral module requests ===== */
+typedef enum dmac_request_factor
+{
+    DMAC_REQ_USB0_DMA0_TX,      /* USB_0 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA0_RX,      /* USB_0 channel 0 receive FIFO full              */
+    DMAC_REQ_USB0_DMA1_TX,      /* USB_0 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA1_RX,      /* USB_0 channel 1 receive FIFO full              */
+    DMAC_REQ_USB1_DMA0_TX,      /* USB_1 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA0_RX,      /* USB_1 channel 0 receive FIFO full              */
+    DMAC_REQ_USB1_DMA1_TX,      /* USB_1 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA1_RX,      /* USB_1 channel 1 receive FIFO full              */
+} dmac_request_factor_t;
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void usb0_function_DMAC1_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb0_function_DMAC1_Open(uint32_t req);
+void usb0_function_DMAC1_Close(uint32_t *remain);
+void usb0_function_DMAC1_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+void usb0_function_DMAC2_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb0_function_DMAC2_Open(uint32_t req);
+void usb0_function_DMAC2_Close(uint32_t *remain);
+void usb0_function_DMAC2_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB0_FUNCTION_DMACDRV_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dataio.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2933 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dataio.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static uint16_t g_usb0_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)];
+
+static void     usb0_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static uint16_t usb0_function_read_dma_d0(uint16_t pipe);
+static uint16_t usb0_function_read_dma_d1(uint16_t pipe);
+static uint16_t usb0_function_write_dma_d0(uint16_t pipe);
+static uint16_t usb0_function_write_dma_d1(uint16_t pipe);
+
+static void     usb0_function_read_c_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_write_c_fifo(uint16_t Pipe, uint16_t count);
+static void     usb0_function_read_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_write_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_read_d1_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_write_d1_fifo(uint16_t pipe, uint16_t count);
+
+static void     usb0_function_clear_transaction_counter(uint16_t pipe);
+static void     usb0_function_set_transaction_counter(uint16_t pipe, uint32_t count);
+
+static uint32_t usb0_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr);
+
+static uint16_t usb0_function_set_dfacc_d0(uint16_t mbw, uint32_t count);
+static uint16_t usb0_function_set_dfacc_d1(uint16_t mbw, uint32_t count);
+
+
+/*******************************************************************************
+* Function Name: usb0_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t  pipe    ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t usefifo;
+    uint16_t mbw;
+
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    usb0_function_clear_bemp_sts(pipe);
+    usb0_function_clear_brdy_sts(pipe);
+    usb0_function_clear_nrdy_sts(pipe);
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+        case USB_FUNCTION_D0FIFO_DMA:
+            usefifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+        case USB_FUNCTION_D1FIFO_DMA:
+            usefifo = USB_FUNCTION_D1USE;
+        break;
+
+        default:
+            usefifo = USB_FUNCTION_CUSE;
+        break;
+    };
+
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_clear_transaction_counter(pipe);
+
+    usb0_function_aclrm(pipe);
+
+    status = usb0_function_write_buffer(pipe);
+
+    if (status != DEVDRV_USBF_FIFOERROR)
+    {
+        usb0_function_set_pid_buf(pipe);
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer
+* Description  : Writes data in the buffer allocated in the pipe specified by
+*              : the argument. The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer (uint16_t pipe)
+{
+    uint16_t status;
+    uint16_t usefifo;
+
+    g_usb0_function_PipeIgnore[pipe] = 0;
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            status = usb0_function_write_buffer_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            status = usb0_function_write_buffer_d1(pipe);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            status = usb0_function_write_dma_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            status = usb0_function_write_dma_d1(pipe);
+        break;
+
+        default:
+            status = usb0_function_write_buffer_c(pipe);
+        break;
+    };
+
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITING:                       /* Continue of data write */
+            usb0_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            usb0_function_enable_brdy_int(pipe);        /* Enable Ready Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEEND:                      /* End of data write */
+        case DEVDRV_USBF_WRITESHRT:                     /* End of data write */
+            usb0_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb0_function_clear_nrdy_sts(pipe);
+            usb0_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            /* for last transfer */
+            usb0_function_enable_bemp_int(pipe);        /* Enable Empty Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEDMA:                      /* DMA write */
+            usb0_function_clear_nrdy_sts(pipe);
+            usb0_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                     /* FIFO access status */
+        default:
+            usb0_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb0_function_disable_bemp_int(pipe);       /* Disable Empty Interrupt */
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer_c
+* Description  : Writes data in the buffer allocated in the pipe specified in
+*              : the argument. Writes data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    if (g_usb0_function_CtrZeroLengthFlag == 1)
+    {
+        g_usb0_function_CtrZeroLengthFlag = 0;                  /* Zero Length Packet Flag CLR */
+        return DEVDRV_USBF_WRITEEND;
+    }
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    }
+    else
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+    }
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb0_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb0_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb0_function_write_c_fifo(pipe, (uint16_t)count);
+
+    if (g_usb0_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb0_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB200.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0)
+        {
+            USB200.CFIFOCTR = USB_FUNCTION_BITBVAL;             /* Short Packet */
+            g_usb0_function_CtrZeroLengthFlag = 1;              /* Zero Length Packet Flag */
+        }
+    }
+    else
+    {
+        g_usb0_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb0_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb0_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb0_function_write_d0_fifo(pipe, (uint16_t)count);
+
+    if (g_usb0_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb0_function_data_count[pipe] = 0;
+        if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb0_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb0_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb0_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb0_function_write_d1_fifo(pipe, (uint16_t)count);
+
+    if (g_usb0_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb0_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb0_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D0FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma().
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_write_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb0_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb0_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;
+
+        if ((count % size) != 0)
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 1;
+        }
+        else
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;
+        }
+
+        dfacc = usb0_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb0_function_data_count[pipe]    = 0;
+        g_usb0_function_data_pointer[pipe] += count;
+        status = DEVDRV_USBF_WRITEDMA;                              /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_dma_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D1FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma().
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_write_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc=0;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb0_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb0_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;
+        if ((count % size) != 0)
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 1;
+        }
+        else
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;
+        }
+
+        dfacc = usb0_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb0_function_data_count[pipe]    = 0;
+        g_usb0_function_data_pointer[pipe] += count;
+
+        status = DEVDRV_USBF_WRITEDMA;                             /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb0_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t usefifo;
+
+    usb0_function_clear_bemp_sts(pipe);
+    usb0_function_clear_brdy_sts(pipe);
+    usb0_function_clear_nrdy_sts(pipe);
+
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb0_function_start_receive_trns_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb0_function_start_receive_trns_d1(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            usb0_function_start_receive_dma_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            usb0_function_start_receive_dma_d1(pipe, size, data);
+        break;
+
+        default:
+            usb0_function_start_receive_trns_c(pipe, size, data);
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_trns_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+*              : When storing data in the buffer allocated in the pipe specified in the
+*              : argument, BRDY interrupt is generated to read data
+*              : in the interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = size;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
+    USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    usb0_function_enable_nrdy_int(pipe);
+    usb0_function_enable_brdy_int(pipe);
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_trns_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data in the
+*              : interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = size;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    usb0_function_enable_nrdy_int(pipe);
+    usb0_function_enable_brdy_int(pipe);
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_trns_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = size;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    usb0_function_enable_nrdy_int(pipe);
+    usb0_function_enable_brdy_int(pipe);
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_dma_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = 0;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb0_function_read_dma(pipe);
+
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_dma_d1
+* Description  : Read data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = 0;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb0_function_read_dma(pipe);
+
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Uses FIF0 set in the pipe definition table.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb0_function_PipeIgnore[pipe] = 0;
+
+    if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+    {
+        status = usb0_function_read_buffer_d0(pipe);
+    }
+    else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+    {
+        status = usb0_function_read_buffer_d1(pipe);
+    }
+    else
+    {
+        status = usb0_function_read_buffer_c(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb0_function_disable_brdy_int(pipe);
+            g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            g_usb0_function_pipe_status[pipe]   = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+            {
+                USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+            {
+                USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else
+            {
+                USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+            }
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            g_usb0_function_pipe_status[pipe]   = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb0_function_data_count[pipe];
+    }
+    else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+    }
+    else
+    {
+        usb0_function_read_c_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb0_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb0_function_data_count[pipe];
+    }
+    else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb0_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb0_function_read_d0_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb0_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer_d1
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb0_function_data_count[pipe];
+    }
+    else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb0_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb0_function_read_d1_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb0_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_dma
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO or D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_dma (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb0_function_PipeIgnore[pipe] = 0;
+    if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+    {
+        status = usb0_function_read_dma_d0(pipe);
+    }
+    else
+    {
+        status = usb0_function_read_dma_d1(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READZERO:                                     /* End of data read */
+            usb0_function_disable_brdy_int(pipe);
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb0_function_disable_brdy_int(pipe);
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            }
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            }
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_read_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+    uint16_t pipebuf_size;
+
+    g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb0_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb0_function_data_count[pipe];
+        }
+        else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb0_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb0_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;        /* not use in read operation */
+        g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;           /* not use in read operation */
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D0FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb0_function_data_count[pipe]   -= count;
+        g_usb0_function_data_pointer[pipe] += count;
+        g_usb0_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_dma_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by DMA transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_read_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc=0;
+    uint16_t pipebuf_size;
+
+    g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb0_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb0_function_data_count[pipe];
+        }
+        else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb0_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb0_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;        /* not use in read operation */
+        g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;           /* not use in read operation */
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D1FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb0_function_data_count[pipe]   -= count;
+        g_usb0_function_data_pointer[pipe] += count;
+        g_usb0_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_change_fifo_port
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument. After allocating FIF0, waits in the software
+*              : till the corresponding pipe becomes ready.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : DEVDRV_USBF_FIFOERROR         ; Error
+*              : Others            ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value
+*******************************************************************************/
+uint16_t usb0_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    usb0_function_set_curpipe(pipe, fifosel, isel, mbw);
+
+    for (loop = 0; loop < 4; loop++)
+    {
+        switch (fifosel)
+        {
+            case USB_FUNCTION_CUSE:
+                buffer = USB200.CFIFOCTR;
+            break;
+
+            case USB_FUNCTION_D0USE:
+            case USB_FUNCTION_D0DMA:
+                buffer = USB200.D0FIFOCTR;
+            break;
+
+            case USB_FUNCTION_D1USE:
+            case USB_FUNCTION_D1DMA:
+                buffer = USB200.D1FIFOCTR;
+            break;
+
+            default:
+                buffer = 0;
+            break;
+        }
+
+        if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY)
+        {
+            return buffer;
+        }
+
+        loop2 = 25;
+        while (loop2-- > 0)
+        {
+            /* wait */
+        }
+    }
+
+    return DEVDRV_USBF_FIFOERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_curpipe
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    g_usb0_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB200.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB200.D0FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB200.D1FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_curpipe2
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+*              : uint16_t dfacc     ; DFACC Access mode
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc)
+{
+    uint16_t buffer;
+    uint32_t loop;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+    uint32_t dummy;
+#endif
+    volatile uint32_t loop2;
+
+    g_usb0_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB200.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB200.D0FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB200.D0FIFO.UINT32;
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB200.D1FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB200.D1FIFO.UINT32;
+                loop = dummy;                   // avoid warning.
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_c_fifo
+* Description  : Writes data in CFIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_write_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB200.CFIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB200.CFIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB200.CFIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_c_fifo
+* Description  : Reads data from CFIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_read_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb0_function_data_pointer[pipe] = USB200.CFIFO.UINT8[HH];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT16[H];
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT32;
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_d0_fifo
+* Description  : Writes data in D0FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_write_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB200.D0FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB200.D0FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB200.D0FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_d0_fifo
+* Description  : Reads data from D0FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating DOFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_read_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb0_function_data_pointer[pipe] = USB200.D0FIFO.UINT8[HH];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT16[H];
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT32;
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_d1_fifo
+* Description  : Writes data in D1FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_write_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB200.D1FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB200.D1FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB200.D1FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_d1_fifo
+* Description  : Reads data from D1FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_read_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb0_function_data_pointer[pipe] = USB200.D1FIFO.UINT8[HH];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT16[H];
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT32;
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_com_get_dmasize
+* Description  : Calculates access width of DMA transfer by the argument to
+*              : return as the Return Value.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : DMA transfer size    : 0   8bit
+*              :                      : 1  16bit
+*              :                      : 2  32bit
+*******************************************************************************/
+static uint32_t usb0_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+
+    if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0))
+    {
+        /*  When transfer byte count is odd         */
+        /* or transfer data area is 8-bit alignment */
+        size = 0;           /* 8bit */
+    }
+    else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0))
+    {
+        /* When the transfer byte count is multiples of 2 */
+        /* or the transfer data area is 16-bit alignment */
+        size = 1;           /* 16bit */
+    }
+    else
+    {
+        /* When the transfer byte count is multiples of 4 */
+        /* or the transfer data area is 32-bit alignment */
+        size = 2;           /* 32bit */
+    }
+
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_mbw
+* Description  : Calculates access width of DMA to return the value set in MBW.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : FIFO transfer size   : USB_FUNCTION_BITMBW_8    8bit
+*              :                      : USB_FUNCTION_BITMBW_16  16bit
+*              :                      : USB_FUNCTION_BITMBW_32  32bit
+*******************************************************************************/
+uint16_t usb0_function_get_mbw (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+    uint16_t mbw;
+
+    size = usb0_function_com_get_dmasize(trncount, dtptr);
+
+    if (size == 0)
+    {
+        /* 8bit */
+        mbw = USB_FUNCTION_BITMBW_8;
+    }
+    else if (size == 1)
+    {
+        /* 16bit */
+        mbw = USB_FUNCTION_BITMBW_16;
+    }
+    else
+    {
+        /* 32bit */
+        mbw = USB_FUNCTION_BITMBW_32;
+    }
+
+    return mbw;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_transaction_counter
+* Description  : Sets transaction counter by the argument(PIPEnTRN).
+*              : Clears transaction before setting to enable transaction counter setting.
+* Arguments    : uint16_t pipe     ; Pipe number
+*              : uint32_t bsize    : Data transfer size
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_set_transaction_counter (uint16_t pipe, uint32_t bsize)
+{
+    uint16_t mxps;
+    uint16_t cnt;
+
+    if (bsize  == 0)
+    {
+        return;
+    }
+
+    mxps = usb0_function_get_mxps(pipe);            /* Max Packet Size */
+
+    if ((bsize % mxps) == 0)
+    {
+        cnt = (uint16_t)(bsize / mxps);
+    }
+    else
+    {
+        cnt = (uint16_t)((bsize / mxps) + 1);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE1TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE2TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE3TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE4TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE5TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE9TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEATRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEBTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPECTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEDTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEETRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEFTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_transaction_counter
+* Description  : Clears the transaction counter by the argument.
+*              : After executing this function, the transaction counter is invalid.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_transaction_counter (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_stop_transfer
+* Description  : Stops the USB transfer in the pipe specified by the argument.
+*              : After stopping the USB transfer, clears the buffer allocated in
+*              : the pipe.
+*              : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0;
+*              : invalid. After executing this function, BRDY/NRDY/BEMP interrupt
+*              : in the corresponding pipe becomes invalid. Sequence bit is also
+*              : cleared.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_stop_transfer (uint16_t pipe)
+{
+    uint16_t usefifo;
+    uint32_t remain;
+    uint16_t fifo;
+
+    usb0_function_set_pid_nak(pipe);
+
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1USE;
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            remain = Userdef_USB_usb0_function_stop_dma0();
+            usb0_function_dma_stop_d0(pipe, remain);
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0DMA;
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            remain = Userdef_USB_usb0_function_stop_dma1();
+            usb0_function_dma_stop_d1(pipe, remain);
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1DMA;
+        break;
+
+        default:
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.CFIFOCTR =  USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_CUSE;
+        break;
+    }
+
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16);
+
+    /* Interrupt of pipe set is disabled */
+    usb0_function_disable_brdy_int(pipe);
+    usb0_function_disable_nrdy_int(pipe);
+    usb0_function_disable_bemp_int(pipe);
+
+    usb0_function_aclrm(pipe);
+    usb0_function_set_csclr(pipe);
+
+    if ( g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT )
+    {
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+    }
+
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_dfacc_d0
+* Description  : Sets the DFACC setting value in D0FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb0_function_set_dfacc_d0 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+    return dfacc;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_dfacc_d1
+* Description  : Set the DFACC setting value in D1FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb0_function_set_dfacc_d1 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+
+    return dfacc;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dma.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,346 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dma.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static void usb0_function_dmaint(uint16_t fifo);
+static void usb0_function_dmaint_buf2fifo(uint16_t pipe);
+static void usb0_function_dmaint_fifo2buf(uint16_t pipe);
+
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_stop_d0
+* Description  : D0FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_stop_d0 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB200.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB200.D0FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain);
+            g_usb0_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_stop_d1
+* Description  : D1FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_stop_d1 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB200.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB200.D1FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain);
+            g_usb0_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_interrupt_d0fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb0_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_interrupt_d0fifo (uint32_t int_sense)
+{
+    usb0_function_dmaint(USB_FUNCTION_D0FIFO);
+    g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_interrupt_d1fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb0_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_interrupt_d1fifo (uint32_t int_sense)
+{
+    usb0_function_dmaint(USB_FUNCTION_D1FIFO);
+    g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dmaint
+* Description  : This function is DMA transfer end interrupt
+* Arguments    : uint16_t fifo  ; fifo number
+*              :                ;  USB_FUNCTION_D0FIFO
+*              :                ;  USB_FUNCTION_D1FIFO
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_dmaint (uint16_t fifo)
+{
+    uint16_t pipe;
+
+    pipe = g_usb0_function_DmaPipe[fifo];
+
+    if (g_usb0_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO)
+    {
+        usb0_function_dmaint_buf2fifo(pipe);
+    }
+    else
+    {
+        usb0_function_dmaint_fifo2buf(pipe);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dmaint_fifo2buf
+* Description  : Executes read completion from FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_dmaint_fifo2buf (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+    {
+        useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+        if (useport == USB_FUNCTION_D0FIFO_DMA)
+        {
+            remain = Userdef_USB_usb0_function_stop_dma0();
+            usb0_function_dma_stop_d0(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb0_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+        else
+        {
+            remain = Userdef_USB_usb0_function_stop_dma1();
+            usb0_function_dma_stop_d1(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb0_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dmaint_buf2fifo
+* Description  : Executes write completion in FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_dmaint_buf2fifo (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    if (useport == USB_FUNCTION_D0FIFO_DMA)
+    {
+        remain = Userdef_USB_usb0_function_stop_dma0();
+        usb0_function_dma_stop_d0(pipe, remain);
+
+        if (g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D0FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+    else
+    {
+        remain = Userdef_USB_usb0_function_stop_dma1();
+        usb0_function_dma_stop_d1(pipe, remain);
+
+        if (g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D1FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+
+    usb0_function_enable_bemp_int(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_intrn.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,249 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_intrn.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_brdy_int
+* Description  : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : According to the pipe that interrupt is generated in,
+*              : reads/writes buffer allocated in the pipe.
+*              : This function is executed in the BRDY interrupt handler.
+*              : This function clears BRDY interrupt status and BEMP interrupt
+*              : status.
+* Arguments    : uint16_t Status       ; BRDYSTS Register Value
+*              : uint16_t Int_enbl     ; BRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_brdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint32_t int_sense = 0;
+    uint16_t pipe;
+    uint16_t pipebit;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        pipebit = g_usb0_function_bit_set[pipe];
+
+        if ((status & pipebit) && (int_enb & pipebit))
+        {
+            USB200.BRDYSTS = (uint16_t)~pipebit;
+            USB200.BEMPSTS = (uint16_t)~pipebit;
+            if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb0_function_dma_interrupt_d0fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb0_function_read_dma(pipe);
+                    usb0_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb0_function_dma_interrupt_d1fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb0_function_read_dma(pipe);
+                    usb0_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else
+            {
+                if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0)
+                {
+                    usb0_function_read_buffer(pipe);
+                }
+                else
+                {
+                    usb0_function_write_buffer(pipe);
+                }
+            }
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_nrdy_int
+* Description  : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : Checks NRDY interrupt cause by PID. When the cause if STALL,
+*              : regards the pipe state as STALL and ends the processing.
+*              : Then the cause is not STALL, increments the error count to
+*              : communicate again. When the error count is 3, determines
+*              : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing.
+*              : This function is executed in the NRDY interrupt handler.
+*              : This function clears NRDY interrupt status.
+* Arguments    : uint16_t status       ; NRDYSTS Register Value
+*              : uint16_t int_enb      ; NRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb0_function_nrdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB200.NRDYSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe])
+        {
+            if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1)
+            {
+                if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT)
+                {
+                    pid = usb0_function_get_pid(pipe);
+                    if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+                    {
+                        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+                    }
+                    else
+                    {
+                        g_usb0_function_PipeIgnore[pipe]++;
+                        if (g_usb0_function_PipeIgnore[pipe] == 3)
+                        {
+                            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+                        }
+                        else
+                        {
+                            usb0_function_set_pid_buf(pipe);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                /* USB Function */
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_bemp_int
+* Description  : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9).
+* Arguments    : uint16_t status       ; BEMPSTS Register Value
+*              : uint16_t int_enb      ; BEMPENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb0_function_bemp_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+    uint16_t inbuf;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB200.BEMPSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe])
+        {
+            pid = usb0_function_get_pid(pipe);
+
+            if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+            {
+                g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+            }
+            else
+            {
+                inbuf = usb0_function_get_inbuf(pipe);
+
+                if (inbuf == 0)
+                {
+                    usb0_function_disable_bemp_int(pipe);
+                    usb0_function_set_pid_nak(pipe);
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+        }
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_lib.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2026 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_lib.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_brdy_int
+* Description  : Enables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_enable_brdy_int (uint16_t pipe)
+{
+    /* enable brdy interrupt */
+    USB200.BRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_disable_brdy_int
+* Description  : Disables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_disable_brdy_int (uint16_t pipe)
+{
+    /* disable brdy interrupt */
+    USB200.BRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_brdy_sts (uint16_t pipe)
+{
+    /* clear brdy status */
+    USB200.BRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_bemp_int
+* Description  : Enables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_enable_bemp_int (uint16_t pipe)
+{
+    /* enable bemp interrupt */
+    USB200.BEMPENB |= (uint16_t)g_usb0_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_disable_bemp_int
+* Description  : Disables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_disable_bemp_int (uint16_t pipe)
+{
+    /* disable bemp interrupt */
+    USB200.BEMPENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_bemp_sts (uint16_t pipe)
+{
+    /* clear bemp status */
+    USB200.BEMPSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_nrdy_int
+* Description  : Enables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : NRDY. Enables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_enable_nrdy_int (uint16_t pipe)
+{
+    /* enable nrdy interrupt */
+    USB200.NRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_disable_nrdy_int
+* Description  : Disables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : NRDY. Disables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_disable_nrdy_int (uint16_t pipe)
+{
+    /* disable nrdy interrupt */
+    USB200.NRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_nrdy_sts (uint16_t pipe)
+{
+    /* clear nrdy status */
+    USB200.NRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_is_hispeed
+* Description  : Returns the result of USB reset hand shake (RHST) as
+*              : return value.
+* Arguments    : none
+* Return Value : USB_FUNCTION_HIGH_SPEED    ; Hi-Speed
+*              : USB_FUNCTION_FULL_SPEED    ; Full-Speed
+*              : LOW_SPEED                  ; Low-Speed
+*              : USB_FUNCTION_NON_SPEED     ; error
+*******************************************************************************/
+uint16_t usb0_function_is_hispeed (void)
+{
+    uint16_t rhst;
+    uint16_t speed;
+
+    rhst = RZA_IO_RegRead_16(&USB200.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST);
+
+    if (rhst == USB_FUNCTION_HSMODE)
+    {
+        speed = USB_FUNCTION_HIGH_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_FSMODE)
+    {
+        speed = USB_FUNCTION_FULL_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_LSMODE)
+    {
+        speed = USB_FUNCTION_LOW_SPEED;
+    }
+    else
+    {
+        speed = USB_FUNCTION_NON_SPEED;
+    }
+
+    return speed;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_is_hispeed_enable
+* Description  : Returns the USB High-Speed connection enabled status as
+*              : return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Hi-Speed Enable
+*              : DEVDRV_USBF_NO   : Hi-Speed Disable
+*******************************************************************************/
+uint16_t usb0_function_is_hispeed_enable (void)
+{
+    uint16_t ret;
+
+    ret = DEVDRV_USBF_NO;
+
+    if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1)
+    {
+        ret = DEVDRV_USBF_YES;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_pid_buf (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb0_function_set_pid_nak(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_pid_nak (uint16_t pipe)
+{
+    uint16_t pid;
+    uint16_t pbusy;
+    uint32_t loop;
+
+    pid = usb0_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb0_function_set_pid_stall(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        for (loop = 0; loop < 200; loop++)
+        {
+            switch (pipe)
+            {
+                case USB_FUNCTION_PIPE0:
+                    pbusy = RZA_IO_RegRead_16(&USB200.DCPCTR,
+                                                USB_DCPCTR_PBUSY_SHIFT,
+                                                USB_DCPCTR_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE1:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE2:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE3:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE4:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE5:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE6:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE6CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE7:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE7CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE8:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE8CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE9:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                                USB_PIPEnCTR_9_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_9_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEA:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEB:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEC:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPED:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEE:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEF:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                default:
+                    pbusy   = 1;
+                break;
+            }
+
+            if (pbusy == 0)
+            {
+                break;
+            }
+            Userdef_USB_usb0_function_delay_500ns();
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_pid_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+    else
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_pid_stall (uint16_t pipe)
+{
+    usb0_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb0_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            pid = RZA_IO_RegRead_16(&USB200.DCPCTR,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE6CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE7CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE8CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            pid = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+            pid = 0;
+        break;
+    }
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_csclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                1,
+                                USB_DCPCTR_CSCLR_SHIFT,
+                                USB_DCPCTR_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_CSCLR_SHIFT,
+                                USB_PIPEnCTR_9_CSCLR);
+        break;
+
+        default:
+            /* PIPEA-F have not CSCLR */
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_sqclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQCLR_SHIFT,
+                                USB_DCPCTR_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQCLR_SHIFT,
+                                USB_PIPEnCTR_9_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_sqset (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQSET_SHIFT,
+                                USB_DCPCTR_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQSET_SHIFT,
+                                USB_PIPEnCTR_9_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_sqmon
+* Description  : Toggle bit of specified pipe is obtained
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : sqmon
+*******************************************************************************/
+uint16_t usb0_function_get_sqmon (uint16_t pipe)
+{
+    uint16_t sqmon;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            sqmon = RZA_IO_RegRead_16(&USB200.DCPCTR,
+                                        USB_DCPCTR_SQMON_SHIFT,
+                                        USB_DCPCTR_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE6CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE7CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE8CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                        USB_PIPEnCTR_9_SQMON_SHIFT,
+                                        USB_PIPEnCTR_9_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        default:
+            sqmon = 0;
+        break;
+    }
+
+    return sqmon;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_aclrm
+* Description  : The buffer of specified pipe is initialized
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb0_function_aclrm (uint16_t pipe)
+{
+    usb0_function_set_aclrm(pipe);
+    usb0_function_clr_aclrm(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clr_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clr_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                0,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_inbuf
+* Description  : Returns INBUFM of the pipe specified by the argument.
+* Arguments    : uint16_t pipe             ; Pipe Number
+* Return Value : inbuf
+*******************************************************************************/
+uint16_t usb0_function_get_inbuf (uint16_t pipe)
+{
+    uint16_t inbuf;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                    USB_PIPEnCTR_9_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_9_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        default:
+            inbuf = 0;
+        break;
+    }
+
+    return inbuf;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_setting_interrupt
+* Description  : Sets the USB module interrupt level.
+* Arguments    : uint8_t level ;interrupt level
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_setting_interrupt (uint8_t level)
+{
+    uint16_t d0fifo_dmaintid;
+    uint16_t d1fifo_dmaintid;
+
+    R_INTC_RegistIntFunc(INTC_ID_USBI0, usb0_function_interrupt);
+    R_INTC_SetPriority(INTC_ID_USBI0, level);
+    R_INTC_Enable(INTC_ID_USBI0);
+
+    d0fifo_dmaintid = Userdef_USB_usb0_function_d0fifo_dmaintid();
+
+    if (d0fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d0fifo_dmaintid, usb0_function_dma_interrupt_d0fifo);
+        R_INTC_SetPriority(d0fifo_dmaintid, level);
+        R_INTC_Enable(d0fifo_dmaintid);
+    }
+
+    d1fifo_dmaintid = Userdef_USB_usb0_function_d1fifo_dmaintid();
+
+    if (d1fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d1fifo_dmaintid, usb0_function_dma_interrupt_d1fifo);
+        R_INTC_SetPriority(d1fifo_dmaintid, level);
+        R_INTC_Enable(d1fifo_dmaintid);
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_reset_module
+* Description  : Initializes the USB module.
+*              : Enables providing clock to the USB module.
+*              : Sets USB bus wait register.
+* Arguments    : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+void usb0_function_reset_module (uint16_t clockmode)
+{
+    /* UPLLE bit is only USB0 */
+    if (RZA_IO_RegRead_16(&USB200.SYSCFG0,
+                                USB_SYSCFG_UPLLE_SHIFT,
+                                USB_SYSCFG_UPLLE) == 1)
+    {
+        if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode)
+        {
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            USB200.SYSCFG0 = 0;
+            USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+            Userdef_USB_usb0_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            Userdef_USB_usb0_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            0,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        USB200.SYSCFG0 = 0;
+        USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+        Userdef_USB_usb0_function_delay_xms(1);
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            1,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+    }
+
+    USB200.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_buf_size
+* Description  : Obtains pipe buffer size specified by the argument and
+*              : maximum packet size of the USB device in use.
+*              : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum
+*              : packet size of the USB device using the corresponding pipe.
+*              : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the
+*              : corresponding pipe is in continuous transfer mode,
+*              : obtains the buffer size allocated in the corresponcing pipe,
+*              : when incontinuous transfer, obtains maximum packet size.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Maximum packet size or buffer size
+*******************************************************************************/
+uint16_t usb0_function_get_buf_size (uint16_t pipe)
+{
+    uint16_t size;
+    uint16_t bufsize;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB200.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1)
+        {
+            bufsize = RZA_IO_RegRead_16(&g_usb0_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE);
+            size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF);
+        }
+        else
+        {
+            size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+        }
+    }
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_mxps
+* Description  : Obtains maximum packet size of the USB device using the pipe
+*              : specified by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Max Packet Size
+*******************************************************************************/
+uint16_t usb0_function_get_mxps (uint16_t pipe)
+{
+    uint16_t size;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB200.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+    }
+    return size;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_api.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,441 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_api.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+#include "dev_drv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_api_function_init
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint8_t  int_level ; interruput level
+*              : uint16_t mode      : Speed modes
+*              :                    :  USB_FUCNTION_HIGH_SPEED: High-speed device
+*              :                    :  USB_FUCNTION_FULL_SPEED: Full-speed device
+*              : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode)
+{
+    volatile uint8_t dummy_buf;
+
+    CPG.STBCR7  &= 0xfd;                        /* The clock of USB0 modules is permitted */
+    dummy_buf   = CPG.STBCR7;                   /* (Dummy read) */
+
+    usb0_function_setting_interrupt(int_level);
+
+    usb0_function_reset_module(clockmode);      /* reset USB module with setting tranciever */
+                                                /* and HSE=1                                */
+
+    usb0_function_init_status();                /* clear variables                          */
+
+    usb0_function_InitModule(mode);             /* select USB Function and Interrupt Enable */
+                                                /* Detect USB Device to attach or detach    */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_api_function_IsConfigured
+* Description  : Checks if the USB device is configured to return the result as
+*              : the return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Configured & Configured Suspend
+*              : DEVDRV_USBF_NO   : not Configured
+*******************************************************************************/
+uint16_t usb0_api_function_IsConfigured (void)
+{
+    uint16_t dvst;
+
+    dvst = usb0_function_GetDeviceState();
+
+    if ((dvst == USB_FUNCTION_DVST_CONFIGURED) ||
+        (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND))
+    {
+        return DEVDRV_USBF_YES;
+    }
+
+    return DEVDRV_USBF_NO;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_GetDeviceState
+* Description  : Returns the state of USB device.
+* Arguments    : none
+* Return Value : Device States
+*******************************************************************************/
+uint16_t usb0_function_GetDeviceState (void)
+{
+    uint16_t dvsq;
+    uint16_t dvst;
+
+    dvsq = USB200.INTSTS0;
+    switch(dvsq & USB_FUNCTION_BITDVSQ)
+    {
+        case USB_FUNCTION_DS_POWR:                      /* Power state *//* power-on */
+            dvst = USB_FUNCTION_DVST_POWERED;
+        break;
+
+        case USB_FUNCTION_DS_DFLT:                      /* Default state *//* bus-reset */
+            dvst = USB_FUNCTION_DVST_DEFAULT;
+        break;
+
+        case USB_FUNCTION_DS_ADDS:                      /* Address state */
+            dvst = USB_FUNCTION_DVST_ADDRESS;
+        break;
+
+        case USB_FUNCTION_DS_CNFG:                      /* Configured state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED;
+        break;
+
+        case USB_FUNCTION_DS_SPD_CNFG:                  /* Configured Suspend state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND;
+        break;
+
+        case USB_FUNCTION_DS_SPD_POWR:                  /* Power      Suspend state */
+        case USB_FUNCTION_DS_SPD_DFLT:                  /* Default    Suspend state */
+        case USB_FUNCTION_DS_SPD_ADDR:                  /* Address    Suspend state */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+
+        default:                                        /* error */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+    }
+
+    return dvst;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data data Address
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    usb0_function_start_receive_transfer(pipe, size, data);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t pipe     ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t *data     ; Data data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+
+    status = usb0_function_start_send_transfer(pipe, size, data);
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_check_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+*              : uint32_t *size     ; Data Size
+* Return Value : Pipe Status
+*******************************************************************************/
+uint16_t usb0_api_function_check_pipe_status (uint16_t pipe, uint32_t * size)
+{
+    if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE)
+    {
+        *size = g_usb0_function_PipeDataSize[pipe];
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_DONE;
+    }
+    else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES)
+    {
+        *size = 0;
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_NORES;
+    }
+    else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL)
+    {
+        *size = 0;
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_STALL;
+    }
+    else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR)
+    {
+        *size = 0;
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_FIFOERROR;
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    return g_usb0_function_pipe_status[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : Pipe Status
+*******************************************************************************/
+void usb0_api_function_clear_pipe_status (uint16_t pipe)
+{
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+    g_usb0_function_PipeDataSize[pipe] = 0;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_pid_buf (uint16_t pipe)
+{
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_pid_nak (uint16_t pipe)
+{
+    usb0_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_pid_stall (uint16_t pipe)
+{
+    usb0_function_set_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_pid_stall (uint16_t pipe)
+{
+    usb0_function_clear_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb0_api_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_check_stall
+* Description  :
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+int32_t usb0_api_function_check_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+
+    if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL)
+    {
+        return DEVDRV_USBF_STALL;
+    }
+
+    return DEVDRV_SUCCESS;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_sqclr (uint16_t pipe)
+{
+    usb0_function_set_sqclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_sqset (uint16_t pipe)
+{
+    usb0_function_set_sqset(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_csclr (uint16_t pipe)
+{
+    usb0_function_set_csclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_curpipe
+* Description  : Allocates FIF0 specifed by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    usb0_function_set_curpipe(pipe, fifosel, isel, mbw);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_brdy_sts (uint16_t pipe)
+{
+    usb0_function_clear_brdy_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_bemp_sts (uint16_t pipe)
+{
+    usb0_function_clear_bemp_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_nrdy_sts (uint16_t pipe)
+{
+    usb0_function_clear_nrdy_sts(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_controlrw.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_controlrw.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_api_function_CtrlReadStart
+* Description  : Executes the USB control read transfer.
+*              : USB host controller <- USB device
+* Arguments    : uint16_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND          ; End of data write
+*              : DEVDRV_USBF_WRITESHRT         ; End of short data write
+*              : DEVDRV_USBF_WRITING           ; Continue of data write
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO access error
+*******************************************************************************/
+uint16_t usb0_api_function_CtrlReadStart (uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb0_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0],
+                                 (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    status = usb0_function_write_buffer_c(USB_FUNCTION_PIPE0);
+
+    /* Peripheral Control sequence */
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITESHRT:                                     /* End of data write */
+        case DEVDRV_USBF_WRITEEND:                                      /* End of data write (not null) */
+        case DEVDRV_USBF_WRITING:                                       /* Continue of data write */
+            usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0);          /* Enable Empty Interrupt */
+            usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);              /* Set BUF */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access error */
+        break;
+
+        default:
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_CtrlWriteStart
+* Description  : Executes the USB control write transfer.
+*              : USB host controller -> USB device
+* Arguments    : uint16_t  size         ; Data Size
+*              : uint8_t  *data         ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_CtrlWriteStart (uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb0_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0],
+                                (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb0_function_enable_brdy_int(USB_FUNCTION_PIPE0);
+    usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_global.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,144 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_global.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+const uint16_t g_usb0_function_bit_set[16] =
+{
+    0x0001, 0x0002, 0x0004, 0x0008,
+    0x0010, 0x0020, 0x0040, 0x0080,
+    0x0100, 0x0200, 0x0400, 0x0800,
+    0x1000, 0x2000, 0x4000, 0x8000
+};
+
+uint32_t g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint8_t  * g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+uint16_t g_usb0_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint32_t g_usb0_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+USB_FUNCTION_DMA_t g_usb0_function_DmaInfo[2];
+uint16_t g_usb0_function_DmaPipe[2];
+uint16_t g_usb0_function_DmaBval[2];
+uint16_t g_usb0_function_DmaStatus[2];
+
+uint16_t g_usb0_function_CtrZeroLengthFlag;
+
+//uint16_t g_usb0_function_ConfigNum;
+//uint16_t g_usb0_function_Alternate[USB_FUNCTION_ALT_NO];
+//uint16_t g_usb0_function_RemoteWakeupFlag;
+uint16_t g_usb0_function_TestModeFlag;
+uint16_t g_usb0_function_TestModeSelectors;
+
+//uint16_t g_usb0_function_ReqType;
+//uint16_t g_usb0_function_ReqTypeType;
+//uint16_t g_usb0_function_ReqTypeRecip;
+//uint16_t g_usb0_function_ReqRequest;
+//uint16_t g_usb0_function_ReqValue;
+//uint16_t g_usb0_function_ReqIndex;
+//uint16_t g_usb0_function_ReqLength;
+
+//uint16_t g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+uint16_t g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+* Function Name: usb0_function_init_status
+* Description  : Initialization USB Sample Driver Variable.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_init_status (void)
+{
+    uint16_t pipe;
+
+    //g_usb0_function_ConfigNum         = 0;
+    //g_usb0_function_RemoteWakeupFlag  = DEVDRV_USBF_OFF;
+    g_usb0_function_TestModeFlag      = DEVDRV_USBF_OFF;
+    g_usb0_function_CtrZeroLengthFlag = 0;
+
+#if 0
+    usb0_function_clear_alt();
+#endif
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+        g_usb0_function_PipeDataSize[pipe] = 0;
+        g_usb0_function_data_count[pipe]   = 0;
+
+        /* pipe configuration in usb0_function_ResetEP() */
+        g_usb0_function_pipecfg[pipe]  = 0;
+        g_usb0_function_pipebuf[pipe]  = 0;
+        g_usb0_function_pipemaxp[pipe] = 0;
+        g_usb0_function_pipeperi[pipe] = 0;
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sig.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,330 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_sig.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb0_function_EnableINTModule(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_InitModule
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint16_t mode  ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode
+*              :                ; other                   ; Full-speed Mode
+* Return Value : none
+*******************************************************************************/
+void usb0_function_InitModule (uint16_t mode)
+{
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);           /* USB function */
+
+    /* USB module operation enabled     */
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    if (mode == USB_FUNCTION_HIGH_SPEED)
+    {
+        RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                            1,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);        /* Hi-Speed Mode */
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                            0,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);
+    }
+
+    /* for power-on                     */
+    if (usb0_function_CheckVBUStaus() == DEVDRV_USBF_ON)
+    {
+        usb0_function_EnableINTModule();            /* Interrupt Enable         */
+        usb0_function_USB_FUNCTION_Attach();        /* pull-up D+ and open D-   */
+    }
+    else
+    {
+        usb0_function_USB_FUNCTION_Detach();        /* USB Detach               */
+                                                    /* with Interrupt Enable    */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_CheckVBUStaus
+* Description  : Checks the USB-VBUS state to returns the connection state to
+*              : the USB host.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   VBUS ON
+*              : DEVDRV_USBF_OFF    :   VBUS OFF
+*******************************************************************************/
+uint16_t usb0_function_CheckVBUStaus (void)
+{
+    uint16_t buf1;
+    uint16_t buf2;
+    uint16_t buf3;
+
+    /* monitor VBUS pins */
+    do
+    {
+        buf1 = RZA_IO_RegRead_16(&USB200.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb0_function_delay_10us(1);
+        buf2 = RZA_IO_RegRead_16(&USB200.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb0_function_delay_10us(1);
+        buf3 = RZA_IO_RegRead_16(&USB200.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+    } while ((buf1 != buf2) || (buf2 != buf3));
+
+    if (buf1 == DEVDRV_USBF_OFF)
+    {
+        return DEVDRV_USBF_OFF;         /* detach */
+    }
+
+    return DEVDRV_USBF_ON;              /* attach */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Attach
+* Description  : Connects to the USB host controller.
+*              : This function pulls up D+.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_USB_FUNCTION_Attach (void)
+{
+    Userdef_USB_usb0_function_attach();
+
+    Userdef_USB_usb0_function_delay_xms(10);
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);      /* Pull-up D+ and open D- */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Detach
+* Description  : Disconnects from the USB host controller.
+*              : This function opens D+/D-.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_USB_FUNCTION_Detach (void)
+{
+    uint16_t pipe;
+
+    Userdef_USB_usb0_function_detach();
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE)
+        {
+            usb0_function_stop_transfer(pipe);
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);                  /* open D+ and D- */
+
+    /* Detach Recovery */
+    Userdef_USB_usb0_function_delay_500ns();                /* need 1us=500ns * 2 wait */
+    Userdef_USB_usb0_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+    Userdef_USB_usb0_function_delay_500ns();                /* need 100ns wait but 500ns S/W wait */
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);       /* soft reset module */
+    Userdef_USB_usb0_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    usb0_function_EnableINTModule();            /* Interrupt Enable */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_BusReset
+* Description  : This function is executed when the USB device is transitioned
+*              : to POWERD_STATE. Sets the device descriptor according to the
+*              : connection speed determined by the USB reset hand shake.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb0_function_USB_FUNCTION_BusReset (void)
+{
+    usb0_function_init_status();                                    /* memory clear */
+
+    if (usb0_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED)
+    {
+        usb0_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED);     /* Device Descriptor reset */
+    }
+    else
+    {
+        usb0_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED);     /* Device Descriptor reset */
+    }
+
+    usb0_function_ResetDCP();                                       /* Default Control PIPE reset */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Resume
+* Description  : This function is executed when the USB device detects a resume
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb0_function_USB_FUNCTION_Resume (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Suspend
+* Description  : This function is executed when the USB device detects a suspend
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb0_function_USB_FUNCTION_Suspend (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_TestMode
+* Description  : This function is executed when the USB device is transitioned U
+*              : to TEST_MODE by the USB standard request.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_USB_FUNCTION_TestMode (void)
+{
+    switch (g_usb0_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT)
+    {
+        case USB_FUNCTION_FUNCTION_TEST_J:
+        case USB_FUNCTION_FUNCTION_TEST_K:
+        case USB_FUNCTION_FUNCTION_TEST_SE0_NAK:
+        case USB_FUNCTION_FUNCTION_TEST_PACKET:
+            RZA_IO_RegWrite_16(&USB200.TESTMODE,
+                                (g_usb0_function_TestModeSelectors >> 8),
+                                USB_TESTMODE_UTST_SHIFT,
+                                USB_TESTMODE_UTST);
+        break;
+
+        case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE:
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_EnableINTModule
+* Description  : Enables USB interrupt.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_EnableINTModule (void)
+{
+    uint16_t buf;
+
+    buf  = USB200.INTENB0;
+    buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE |
+             USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE);
+    USB200.INTENB0 = buf;
+
+    usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sub.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,453 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_sub.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+#if 0
+extern const uint16_t *g_usb0_function_EndPntPtr[];
+extern uint8_t         g_usb0_function_DeviceDescriptor[];
+extern uint8_t        *g_usb0_function_ConfigurationPtr[];
+#endif
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_ResetDCP
+* Description  : Initializes the default control pipe(DCP).
+* Outline      : Reset default control pipe
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_ResetDCP (void)
+{
+    USB200.DCPCFG  = 0;
+#if 0
+    USB200.DCPMAXP = g_usb0_function_DeviceDescriptor[7];
+#else
+    USB200.DCPMAXP = 64;
+#endif
+
+    USB200.CFIFOSEL  = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB200.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB200.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_ResetEP
+* Description  : Initializes the end point.
+* Arguments    : uint16_t num          ; Configuration Number
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_ResetEP (uint16_t num)
+{
+    uint16_t   pipe;
+    uint16_t   ep;
+    uint16_t   index;
+    uint16_t   buf;
+    uint16_t * tbl;
+
+    tbl = (uint16_t *)(g_usb0_function_EndPntPtr[num - 1]);
+
+    for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        if (g_usb0_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR)
+        {
+            index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb0_function_EPTableIndex[ep]);
+            pipe  = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE);
+
+            g_usb0_function_PipeTbl[pipe] = (uint16_t)( ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) |
+                                                         ep                                             |
+                                                         (tbl[index + 0] & USB_FUNCTION_FIFO_USE)          );
+
+            if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT)
+            {
+                tbl[index + 1] |= USB_FUNCTION_SHTNAKON;
+#ifdef  __USB_DMA_BFRE_ENABLE__
+                /* this routine cannnot be perfomred if read operation is executed in buffer size */
+                if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) ||
+                    ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA))
+                {
+                    tbl[index + 1] |= USB_FUNCTION_BFREON;
+                }
+#endif
+            }
+
+            /* Interrupt Disable */
+            buf  = USB200.BRDYENB;
+            buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
+            USB200.BRDYENB = buf;
+            buf  = USB200.NRDYENB;
+            buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
+            USB200.NRDYENB = buf;
+            buf  = USB200.BEMPENB;
+            buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
+            USB200.BEMPENB = buf;
+
+            usb0_function_set_pid_nak(pipe);
+
+            /* CurrentPIPE Clear */
+            if (RZA_IO_RegRead_16(&USB200.CFIFOSEL,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB200.CFIFOSEL,
+                                    0,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB200.D0FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB200.D0FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB200.D1FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB200.D1FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            /* PIPE Configuration */
+            USB200.PIPESEL  = pipe;
+            USB200.PIPECFG  = tbl[index + 1];
+            USB200.PIPEBUF  = tbl[index + 2];
+            USB200.PIPEMAXP = tbl[index + 3];
+            USB200.PIPEPERI = tbl[index + 4];
+
+            g_usb0_function_pipecfg[pipe]  = tbl[index + 1];
+            g_usb0_function_pipebuf[pipe]  = tbl[index + 2];
+            g_usb0_function_pipemaxp[pipe] = tbl[index + 3];
+            g_usb0_function_pipeperi[pipe] = tbl[index + 4];
+
+            /* Buffer Clear */
+            usb0_function_set_sqclr(pipe);
+            usb0_function_aclrm(pipe);
+
+            /* init Global */
+            g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+            g_usb0_function_PipeDataSize[pipe] = 0;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_EpToPipe
+* Description  : Returns the pipe which end point specified by the argument is
+*              : allocated to.
+* Arguments    : uint16_t ep       ; Direction + Endpoint Number
+* Return Value : USB_FUNCTION_EP_ERROR         : Error
+*              : Others           : Pipe Number
+*******************************************************************************/
+uint16_t usb0_function_EpToPipe (uint16_t ep)
+{
+    uint16_t pipe;
+
+    for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((g_usb0_function_PipeTbl[pipe] & 0x00ff) == ep)
+        {
+            return pipe;
+        }
+    }
+
+    return USB_FUNCTION_EP_ERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_InitEPTable
+* Description  : Sets the end point by the Alternate setting value of the
+*              : configuration number and the interface number specified by the
+*              : argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+*              : uint16_t Alt_Num       ; Alternate Setting
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point_interface;
+    uint16_t   point_endpoint;
+    uint16_t   length;
+    uint16_t   start;
+    uint16_t   numbers;
+    uint16_t   endpoint;
+
+    ptr = (uint8_t *)g_usb0_function_ConfigurationPtr[Con_Num - 1];
+    point_interface = *ptr;
+    length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2));
+    ptr  += *ptr;
+    start   = 0;
+    numbers = 0;
+    point_endpoint = 0;
+
+    for (; point_interface < length;)
+    {
+        switch (*(ptr + 1))                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                     /* Interface */
+                if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num))
+                {
+                    numbers = *(ptr + 4);
+                }
+                else
+                {
+                    start  += *(ptr + 4);
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_ENDPOINT:                      /* Endpoint */
+                if (point_endpoint < numbers)
+                {
+                    endpoint = (uint16_t)(*(ptr + 2) & 0x0f);
+                    g_usb0_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint);
+                    ++point_endpoint;
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                        /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:                 /* Configuration */
+            case USB_FUNCTION_DT_STRING:                        /* String */
+            default:                                            /* Class, Vendor, else */
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_GetConfigNum
+* Description  : Returns the number of configuration referring to the number of
+*              : configuration described in the device descriptor.
+* Arguments    : none
+* Return Value : Number of possible configurations (bNumConfigurations).
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_GetConfigNum (void)
+{
+    return (uint16_t)g_usb0_function_DeviceDescriptor[17];
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_GetInterfaceNum
+* Description  : Returns the number of interface referring to the number of
+*              : interface described in the configuration descriptor.
+* Arguments    : uint16_t num       ; Configuration Number
+* Return Value : Number of this interface (bNumInterfaces).
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_GetInterfaceNum (uint16_t num)
+{
+    return (uint16_t)(*(g_usb0_function_ConfigurationPtr[num - 1] + 4));
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_GetAltNum
+* Description  : Returns the Alternate setting value of the configuration number
+*              : and the interface number specified by the argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+* Return Value : Value used to select this alternate setting(bAlternateSetting).
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point;
+    uint16_t   alt_num = 0;
+    uint16_t   length;
+
+    ptr = (uint8_t *)(g_usb0_function_ConfigurationPtr[Con_Num - 1]);
+    point = ptr[0];
+    ptr  += ptr[0];                                 /* InterfaceDescriptor[0] */
+    length  = (uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 2));
+    length |= (uint16_t)((uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8);
+
+    for (; point < length;)                                 /* Search Descriptor Table size */
+    {
+        switch (ptr[1])                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                 /* Interface */
+                if (Int_Num == ptr[2])
+                {
+                    alt_num = (uint16_t)ptr[3];             /* Alternate Number count */
+                }
+                point += ptr[0];
+                ptr += ptr[0];
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                    /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:             /* Configuration */
+            case USB_FUNCTION_DT_STRING:                    /* String */
+            case USB_FUNCTION_DT_ENDPOINT:                  /* Endpoint */
+            default:                                        /* Class, Vendor, else */
+                point += ptr[0];
+                ptr   += ptr[0];
+            break;
+        }
+    }
+    return alt_num;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_CheckRemoteWakeup
+* Description  : Returns the result of the remote wake up function is supported
+*              : or not referring to the configuration descriptor.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   Support Remote Wakeup
+*              : DEVDRV_USBF_OFF    :   not Support Remote Wakeup
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_CheckRemoteWakeup (void)
+{
+    uint8_t atr;
+
+    if (g_usb0_function_ConfigNum == 0)
+    {
+        return DEVDRV_USBF_OFF;
+    }
+
+    atr = *(g_usb0_function_ConfigurationPtr[g_usb0_function_ConfigNum - 1] + 7);
+
+    if (atr & USB_FUNCTION_CF_RWUP)
+    {
+        return DEVDRV_USBF_ON;
+    }
+
+    return DEVDRV_USBF_OFF;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_alt
+* Description  : Initializes the Alternate setting area.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_clear_alt (void)
+{
+    int i;
+
+    for (i = 0; i < USB_FUNCTION_ALT_NO; ++i)
+    {
+        g_usb0_function_Alternate[i] = 0;                           /* Alternate */
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_pipe_tbl
+* Description  : Initializes pipe definition table.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_pipe_tbl (void)
+{
+    int pipe;
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb0_function_PipeTbl[pipe] = 0;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_ep_table_index
+* Description  : Initializes the end point table index.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_clear_ep_table_index (void)
+{
+    int ep;
+
+    for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        g_usb0_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR;
+    }
+}
+#endif
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,698 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dmacdrv.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "rza_io_regrw.h"
+#include "usb0_function_dmacdrv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DMAC_INDEFINE   (255)       /* Macro definition when REQD bit is not used */
+
+/* ==== Request setting information for on-chip peripheral module ==== */
+typedef enum dmac_peri_req_reg_type
+{
+    DMAC_REQ_MID,
+    DMAC_REQ_RID,
+    DMAC_REQ_AM,
+    DMAC_REQ_LVL,
+    DMAC_REQ_REQD
+} dmac_peri_req_reg_type_t;
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+/* ==== Prototype declaration ==== */
+
+/* ==== Global variable ==== */
+/* On-chip peripheral module request setting table */
+static const uint8_t usb0_function_dmac_peri_req_init_table[8][5] =
+{
+    /* MID,RID,AM,LVL,REQD */
+    {32, 3, 2, 1, 1},    /* USB_0 channel 0 transmit FIFO empty */
+    {32, 3, 2, 1, 0},    /* USB_0 channel 0 receive FIFO full   */
+    {33, 3, 2, 1, 1},    /* USB_0 channel 1 transmit FIFO empty */
+    {33, 3, 2, 1, 0},    /* USB_0 channel 1 receive FIFO full   */
+    {34, 3, 2, 1, 1},    /* USB_1 channel 0 transmit FIFO empty */
+    {34, 3, 2, 1, 0},    /* USB_1 channel 0 receive FIFO full   */
+    {35, 3, 2, 1, 1},    /* USB_1 channel 1 transmit FIFO empty */
+    {35, 3, 2, 1, 0},    /* USB_1 channel 1 receive FIFO full   */
+};
+
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 1.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 1 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t *trans_info   : Setting information to DMAC register
+*              : uint32_t          dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t          continuation : Set continuous transfer to be valid
+*              :                                  after DMA transfer has been completed
+*              :             DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :             DMAC_SAMPLE_SINGLE       : Do not execute continuous transfer
+*              : uint32_t request_factor        : Factor for on-chip peripheral module request
+*              :             DMAC_REQ_OSTM0TINT       : OSTM_0 compare match
+*              :             DMAC_REQ_OSTM1TINT       : OSTM_1 compare match
+*              :             DMAC_REQ_TGI0A           : MTU2_0 input capture/compare match
+*              :                  :
+*              : uint32_t          req_direction: Setting value of CHCFG_n register REQD bit
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC1_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC1.N0SA_n = trans_info->src_addr;        /* Start address of transfer source      */
+        DMAC1.N0DA_n = trans_info->dst_addr;        /* Start address of transfer destination */
+        DMAC1.N0TB_n = trans_info->count;           /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC1_CHCFG_n_DAD_SHIFT,
+                            DMAC1_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC1_CHCFG_n_SAD_SHIFT,
+                            DMAC1_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC1_CHCFG_n_DDS_SHIFT,
+                            DMAC1_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC1_CHCFG_n_SDS_SHIFT,
+                            DMAC1_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_DMS_SHIFT,
+                            DMAC1_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_RSEL_SHIFT,
+                            DMAC1_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_SBE_SHIFT,
+                            DMAC1_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_DEM_SHIFT,
+                            DMAC1_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                1,
+                                DMAC1_CHCFG_n_REN_SHIFT,
+                                DMAC1_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                1,
+                                DMAC1_CHCFG_n_RSW_SHIFT,
+                                DMAC1_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                0,
+                                DMAC1_CHCFG_n_REN_SHIFT,
+                                DMAC1_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                0,
+                                DMAC1_CHCFG_n_RSW_SHIFT,
+                                DMAC1_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_TM_SHIFT,
+                            DMAC1_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            1,
+                            DMAC1_CHCFG_n_SEL_SHIFT,
+                            DMAC1_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            1,
+                            DMAC1_CHCFG_n_HIEN_SHIFT,
+                            DMAC1_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_LOEN_SHIFT,
+                            DMAC1_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC1_CHCFG_n_AM_SHIFT,
+                            DMAC1_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC1_CHCFG_n_LVL_SHIFT,
+                            DMAC1_CHCFG_n_LVL);
+
+        if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC1_CHCFG_n_REQD_SHIFT,
+                                DMAC1_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                req_direction,
+                                DMAC1_CHCFG_n_REQD_SHIFT,
+                                DMAC1_CHCFG_n_REQD);
+        }
+
+        RZA_IO_RegWrite_32(&DMAC01.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC01_DMARS_CH1_RID_SHIFT,
+                            DMAC01_DMARS_CH1_RID);
+        RZA_IO_RegWrite_32(&DMAC01.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC01_DMARS_CH1_MID_SHIFT,
+                            DMAC01_DMARS_CH1_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_Open
+* Description  : Enables DMAC channel 1 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb0_function_DMAC1_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_EN_SHIFT,
+                                DMAC1_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_TACT_SHIFT,
+                                DMAC1_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                            1,
+                            DMAC1_CHCTRL_n_SWRST_SHIFT,
+                            DMAC1_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC1.CHCTRL_n,
+                                DMAC1_CHCTRL_n_SWRST_SHIFT,
+                                DMAC1_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                            1,
+                            DMAC1_CHCTRL_n_SETEN_SHIFT,
+                            DMAC1_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                                1,
+                                DMAC1_CHCTRL_n_STG_SHIFT,
+                                DMAC1_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_Close
+* Description  : Aborts DMAC channel 1 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC1_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                        1,
+                        DMAC1_CHCTRL_n_CLREN_SHIFT,
+                        DMAC1_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_TACT_SHIFT,
+                                DMAC1_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_EN_SHIFT,
+                                DMAC1_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC1.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 1 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 1 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC1_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_SR_SHIFT,
+                                DMAC1_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC1.N0SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC1.N0DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC1.N0TB_n = count;       /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC1.N1SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC1.N1DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC1.N1TB_n = count;       /* Total transfer byte count             */
+     }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 2.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 2 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t * trans_info : Setting information to DMAC
+*              :                               : register
+*              : uint32_t dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t continuation : Set continuous transfer to be valid
+*              :                       : after DMA transfer has been completed
+*              :         DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :         DMAC_SAMPLE_SINGLE       : Do not execute continuous
+*              :                                  : transfer
+*              : uint32_t request_factor : Factor for on-chip peripheral module
+*              :                         : request
+*              :         DMAC_REQ_OSTM0TINT : OSTM_0 compare match
+*              :         DMAC_REQ_OSTM1TINT : OSTM_1 compare match
+*              :         DMAC_REQ_TGI0A     : MTU2_0 input capture/compare match
+*              :                 :
+*              : uint32_t req_direction : Setting value of CHCFG_n register
+*              :                        : REQD bit
+*******************************************************************************/
+void usb0_function_DMAC2_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC2.N0SA_n = trans_info->src_addr;        /* Start address of transfer source      */
+        DMAC2.N0DA_n = trans_info->dst_addr;        /* Start address of transfer destination */
+        DMAC2.N0TB_n = trans_info->count;           /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC2_CHCFG_n_DAD_SHIFT,
+                            DMAC2_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC2_CHCFG_n_SAD_SHIFT,
+                            DMAC2_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC2_CHCFG_n_DDS_SHIFT,
+                            DMAC2_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC2_CHCFG_n_SDS_SHIFT,
+                            DMAC2_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_DMS_SHIFT,
+                            DMAC2_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_RSEL_SHIFT,
+                            DMAC2_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_SBE_SHIFT,
+                            DMAC2_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_DEM_SHIFT,
+                            DMAC2_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                1,
+                                DMAC2_CHCFG_n_REN_SHIFT,
+                                DMAC2_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                1,
+                                DMAC2_CHCFG_n_RSW_SHIFT,
+                                DMAC2_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                0,
+                                DMAC2_CHCFG_n_REN_SHIFT,
+                                DMAC2_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                0,
+                                DMAC2_CHCFG_n_RSW_SHIFT,
+                                DMAC2_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_TM_SHIFT,
+                            DMAC2_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            2,
+                            DMAC2_CHCFG_n_SEL_SHIFT,
+                            DMAC2_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            1,
+                            DMAC2_CHCFG_n_HIEN_SHIFT,
+                            DMAC2_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_LOEN_SHIFT,
+                            DMAC2_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC2_CHCFG_n_AM_SHIFT,
+                            DMAC2_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC2_CHCFG_n_LVL_SHIFT,
+                            DMAC2_CHCFG_n_LVL);
+        if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC2_CHCFG_n_REQD_SHIFT,
+                                DMAC2_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                req_direction,
+                                DMAC2_CHCFG_n_REQD_SHIFT,
+                                DMAC2_CHCFG_n_REQD);
+        }
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC23_DMARS_CH2_RID_SHIFT,
+                            DMAC23_DMARS_CH2_RID);
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC23_DMARS_CH2_MID_SHIFT,
+                            DMAC23_DMARS_CH2_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_Open
+* Description  : Enables DMAC channel 2 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb0_function_DMAC2_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2,
+                                DMAC2_CHSTAT_n_EN_SHIFT,
+                                DMAC2_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2,
+                                DMAC2_CHSTAT_n_TACT_SHIFT,
+                                DMAC2_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                            1,
+                            DMAC2_CHCTRL_n_SWRST_SHIFT,
+                            DMAC2_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC2.CHCTRL_n,
+                                DMAC2_CHCTRL_n_SWRST_SHIFT,
+                                DMAC2_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                            1,
+                            DMAC2_CHCTRL_n_SETEN_SHIFT,
+                            DMAC2_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                                1,
+                                DMAC2_CHCTRL_n_STG_SHIFT,
+                                DMAC2_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_Close
+* Description  : Aborts DMAC channel 2 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC2_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                        1,
+                        DMAC2_CHCTRL_n_CLREN_SHIFT,
+                        DMAC2_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n,
+                                DMAC2_CHSTAT_n_TACT_SHIFT,
+                                DMAC2_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n,
+                                DMAC2_CHSTAT_n_EN_SHIFT,
+                                DMAC2_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC2.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 2 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 2 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC2_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC2.CHSTAT_n,
+                                DMAC2_CHSTAT_n_SR_SHIFT,
+                                DMAC2_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC2.N0SA_n = src_addr;     /* Start address of transfer source      */
+        DMAC2.N0DA_n = dst_addr;     /* Start address of transfer destination */
+        DMAC2.N0TB_n = count;        /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC2.N1SA_n = src_addr;     /* Start address of transfer source      */
+        DMAC2.N1DA_n = dst_addr;     /* Start address of transfer destination */
+        DMAC2.N1TB_n = count;        /* Total transfer byte count             */
+     }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,762 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_userdef.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "devdrv_usb_function_api.h"
+#include "usb0_function_dmacdrv.h"  /* common DMAC driver for USB */
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DUMMY_ACCESS OSTM0CNT
+
+/* #define CACHE_WRITEBACK */
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern int32_t io_cwb(unsigned long start, unsigned long end);
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb0_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void usb0_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void Userdef_USB_usb0_function_delay_10us_2(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_d0fifo_dmaintid
+* Description  : get D0FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D0FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_d1fifo_dmaintid
+* Description  : get D1FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D1FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_attach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_attach (void)
+{
+    printf("\n");
+    printf("channel 0 attach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_detach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_detach (void)
+{
+    printf("\n");
+    printf("channel 0 detach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_1ms
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_1ms (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /*
+     * Wait 1ms (Please change for your MCU).
+     */
+    for (i = 0; i < 1440; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_xms
+* Description  : Wait for the software in the period of time specified by the
+*              : argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t msec ; Wait Time (msec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_xms (uint32_t msec)
+{
+    volatile unsigned short i;
+
+    for (i = 0; i < msec; ++i)
+    {
+        Userdef_USB_usb0_function_delay_1ms();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_10us
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t usec ; Wait Time(x 10usec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_10us (uint32_t usec)
+{
+    volatile int i;
+
+    /* Wait 10us (Please change for your MCU) */
+    for (i = 0; i < usec; ++i)
+    {
+        Userdef_USB_usb0_function_delay_10us_2();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_10us_2
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void Userdef_USB_usb0_function_delay_10us_2 (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 1us (Please change for your MCU) */
+    for (i = 0; i < 14; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_500ns
+* Description  : Wait for software for 500ns.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_500ns (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 500ns (Please change for your MCU) */
+    /* Wait 500ns I clock 266MHz */
+    tmp = DUMMY_ACCESS;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_start_dma
+* Description  : Enables DMA transfer on the information specified by the argument.
+*              : Set DMAC register by this function to enable DMA transfer.
+*              : After executing this function, USB module is set to start DMA
+*              : transfer. DMA transfer should not wait for DMA transfer complete.
+* Arguments    : USB_FUNCTION_DMA_t *dma   : DMA parameter
+*              :  typedef struct{
+*              :      uint32_t fifo;    FIFO for using
+*              :      uint32_t buffer;  Start address of transfer source/destination
+*              :      uint32_t bytes;   Transfer size(Byte)
+*              :      uint32_t dir;     Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer)
+*              :      uint32_t size;    DMA transfer size
+*              :   } USB_FUNCTION_DMA_t;
+*              : uint16_t dfacc ; 0 : cycle steal mode
+*              :                  1 : 16byte continuous mode
+*              :                  2 : 32byte continuous mode
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc)
+{
+    uint32_t trncount;
+    uint32_t src;
+    uint32_t dst;
+    uint32_t size;
+    uint32_t dir;
+#ifdef CACHE_WRITEBACK
+    uint32_t ptr;
+#endif
+
+    trncount = dma->bytes;
+    dir      = dma->dir;
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        /* DxFIFO determination */
+        dst = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            src = (uint32_t)(&USB200.D0FIFO.UINT32);
+        }
+        else
+        {
+            src = (uint32_t)(&USB200.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            src += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB200.D0FIFO.UINT32);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB200.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            src += 3;       /* byte access */
+        }
+#endif
+    }
+    else
+    {
+        /* DxFIFO determination */
+        src = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+        }
+        else
+        {
+            dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            dst += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            dst += 3;       /* byte access  */
+        }
+#endif
+    }
+
+#ifdef CACHE_WRITEBACK
+    ptr = (uint32_t)dma->buffer;
+
+    if ((ptr & 0x20000000ul) == 0)
+    {
+        io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount);
+    }
+#endif
+
+    if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+    {
+        usb0_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+    else
+    {
+        usb0_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_dmac0
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB0_DMA0_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB0_DMA0_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb0_function_DMAC1_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb0_function_DMAC1_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb0_function_DMAC1_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC1 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_dmac1
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB0_DMA1_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB0_DMA1_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb0_function_DMAC2_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb0_function_DMAC1_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb0_function_DMAC2_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC2 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_stop_dma0
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D0_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb0_function_stop_dma0 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb0_function_DMAC1_Close(&remain);
+
+    return remain;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_stop_dma1
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D1_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb0_function_stop_dma1 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb0_function_DMAC2_Close(&remain);
+
+    return remain;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,171 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB1_FUNCTION_H
+#define USB1_FUNCTION_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "devdrv_usb_function_api.h"
+#include "usb_function.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern const uint16_t       g_usb1_function_bit_set[];
+extern uint32_t             g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint8_t              *g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+extern uint16_t             g_usb1_function_PipeIgnore[];
+extern uint16_t             g_usb1_function_PipeTbl[];
+extern uint16_t             g_usb1_function_pipe_status[];
+extern uint32_t             g_usb1_function_PipeDataSize[];
+
+extern USB_FUNCTION_DMA_t   g_usb1_function_DmaInfo[];
+extern uint16_t             g_usb1_function_DmaPipe[];
+extern uint16_t             g_usb1_function_DmaBval[];
+extern uint16_t             g_usb1_function_DmaStatus[];
+
+extern uint16_t             g_usb1_function_CtrZeroLengthFlag;
+
+extern uint16_t             g_usb1_function_ConfigNum;
+extern uint16_t             g_usb1_function_Alternate[USB_FUNCTION_ALT_NO];
+extern uint16_t             g_usb1_function_RemoteWakeupFlag;
+extern uint16_t             g_usb1_function_TestModeFlag;
+extern uint16_t             g_usb1_function_TestModeSelectors;
+
+extern uint16_t             g_usb1_function_ReqType;
+extern uint16_t             g_usb1_function_ReqTypeType;
+extern uint16_t             g_usb1_function_ReqTypeRecip;
+extern uint16_t             g_usb1_function_ReqRequest;
+extern uint16_t             g_usb1_function_ReqValue;
+extern uint16_t             g_usb1_function_ReqIndex;
+extern uint16_t             g_usb1_function_ReqLength;
+
+extern uint16_t             g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+extern uint16_t             g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+/* ==== common ==== */
+void     usb1_function_dma_stop_d0(uint16_t pipe, uint32_t remain);
+void     usb1_function_dma_stop_d1(uint16_t pipe, uint32_t remain);
+uint16_t usb1_function_is_hispeed(void);
+uint16_t usb1_function_is_hispeed_enable(void);
+uint16_t usb1_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb1_function_write_buffer(uint16_t pipe);
+uint16_t usb1_function_write_buffer_c(uint16_t pipe);
+uint16_t usb1_function_write_buffer_d0(uint16_t pipe);
+uint16_t usb1_function_write_buffer_d1(uint16_t pipe);
+void     usb1_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb1_function_read_buffer(uint16_t pipe);
+uint16_t usb1_function_read_buffer_c(uint16_t pipe);
+uint16_t usb1_function_read_buffer_d0(uint16_t pipe);
+uint16_t usb1_function_read_buffer_d1(uint16_t pipe);
+uint16_t usb1_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb1_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb1_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc);
+uint16_t usb1_function_get_mbw(uint32_t trncount, uint32_t dtptr);
+uint16_t usb1_function_read_dma(uint16_t pipe);
+void     usb1_function_brdy_int(uint16_t status, uint16_t int_enb);
+void     usb1_function_nrdy_int(uint16_t status, uint16_t int_enb);
+void     usb1_function_bemp_int(uint16_t status, uint16_t int_enb);
+void     usb1_function_setting_interrupt(uint8_t level);
+void     usb1_function_reset_module(uint16_t clockmode);
+uint16_t usb1_function_get_buf_size(uint16_t pipe);
+uint16_t usb1_function_get_mxps(uint16_t pipe);
+void     usb1_function_clear_brdy_sts(uint16_t pipe);
+void     usb1_function_clear_bemp_sts(uint16_t pipe);
+void     usb1_function_clear_nrdy_sts(uint16_t pipe);
+void     usb1_function_set_pid_buf(uint16_t pipe);
+void     usb1_function_set_pid_nak(uint16_t pipe);
+void     usb1_function_set_pid_stall(uint16_t pipe);
+void     usb1_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb1_function_get_pid(uint16_t pipe);
+void     usb1_function_set_sqclr(uint16_t pipe);
+void     usb1_function_set_sqset(uint16_t pipe);
+void     usb1_function_set_csclr(uint16_t pipe);
+void     usb1_function_aclrm(uint16_t pipe);
+void     usb1_function_set_aclrm(uint16_t pipe);
+void     usb1_function_clr_aclrm(uint16_t pipe);
+uint16_t usb1_function_get_sqmon(uint16_t pipe);
+uint16_t usb1_function_get_inbuf(uint16_t pipe);
+
+/* ==== function ==== */
+void     usb1_function_init_status(void);
+void     usb1_function_InitModule(uint16_t mode);
+uint16_t usb1_function_CheckVBUStaus(void);
+void     usb1_function_USB_FUNCTION_Attach(void);
+void     usb1_function_USB_FUNCTION_Detach(void);
+void     usb1_function_USB_FUNCTION_BusReset(void);
+void     usb1_function_USB_FUNCTION_Resume(void);
+void     usb1_function_USB_FUNCTION_Suspend(void);
+void     usb1_function_USB_FUNCTION_TestMode(void);
+void     usb1_function_ResetDCP(void);
+void     usb1_function_ResetEP(uint16_t num);
+uint16_t usb1_function_EpToPipe(uint16_t ep);
+void     usb1_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num);
+uint16_t usb1_function_GetConfigNum(void);
+uint16_t usb1_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num);
+uint16_t usb1_function_CheckRemoteWakeup(void);
+void     usb1_function_clear_alt(void);
+void     usb1_function_clear_pipe_tbl(void);
+void     usb1_function_clear_ep_table_index(void);
+uint16_t usb1_function_GetInterfaceNum(uint16_t num);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* USB1_FUNCTION_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_api.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,104 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_api.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB1_FUNCTION_API_H
+#define USB1_FUNCTION_API_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Variable Externs
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void     usb1_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode);
+uint16_t usb1_api_function_IsConfigured(void);
+uint16_t usb1_function_GetDeviceState(void);
+uint16_t usb1_api_function_CtrlReadStart(uint32_t size, uint8_t *data);
+void     usb1_api_function_CtrlWriteStart(uint32_t size, uint8_t *data);
+uint16_t usb1_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb1_api_function_check_pipe_status(uint16_t pipe, uint32_t *size);
+void     usb1_api_function_clear_pipe_status(uint16_t pipe);
+void     usb1_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+void     usb1_api_function_set_pid_buf(uint16_t pipe);
+void     usb1_api_function_set_pid_nak(uint16_t pipe);
+void     usb1_api_function_set_pid_stall(uint16_t pipe);
+void     usb1_api_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb1_api_function_get_pid(uint16_t pipe);
+int32_t  usb1_api_function_check_stall(uint16_t pipe);
+void     usb1_api_function_set_sqclr(uint16_t pipe);
+void     usb1_api_function_set_sqset(uint16_t pipe);
+void     usb1_api_function_set_csclr(uint16_t pipe);
+void     usb1_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb1_api_function_clear_brdy_sts(uint16_t pipe);
+void     usb1_api_function_clear_bemp_sts(uint16_t pipe);
+void     usb1_api_function_clear_nrdy_sts(uint16_t pipe);
+
+void     usb1_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB1_FUNCTION_API_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dmacdrv.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB1_FUNCTION_DMACDRV_H
+#define USB1_FUNCTION_DMACDRV_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+typedef struct dmac_transinfo
+{
+    uint32_t src_addr;      /* Transfer source address                */
+    uint32_t dst_addr;      /* Transfer destination address           */
+    uint32_t count;         /* Transfer byte count                    */
+    uint32_t src_size;      /* Transfer source data size              */
+    uint32_t dst_size;      /* Transfer destination data size         */
+    uint32_t saddr_dir;     /* Transfer source address direction      */
+    uint32_t daddr_dir;     /* Transfer destination address direction */
+} dmac_transinfo_t;
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+/* ==== Transfer specification of the sample program ==== */
+#define DMAC_SAMPLE_SINGLE          (0)     /* Single transfer                   */
+#define DMAC_SAMPLE_CONTINUATION    (1)     /* Continuous transfer (use REN bit) */
+
+/* ==== DMA modes ==== */
+#define DMAC_MODE_REGISTER          (0)     /* Register mode */
+#define DMAC_MODE_LINK              (1)     /* Link mode     */
+
+/* ==== Transfer requests ==== */
+#define DMAC_REQ_MODE_EXT           (0)     /* External request                   */
+#define DMAC_REQ_MODE_PERI          (1)     /* On-chip peripheral module request  */
+#define DMAC_REQ_MODE_SOFT          (2)     /* Auto-request (request by software) */
+
+/* ==== DMAC transfer sizes ==== */
+#define DMAC_TRANS_SIZE_8           (0)     /* 8 bits    */
+#define DMAC_TRANS_SIZE_16          (1)     /* 16 bits   */
+#define DMAC_TRANS_SIZE_32          (2)     /* 32 bits   */
+#define DMAC_TRANS_SIZE_64          (3)     /* 64 bits   */
+#define DMAC_TRANS_SIZE_128         (4)     /* 128 bits  */
+#define DMAC_TRANS_SIZE_256         (5)     /* 256 bits  */
+#define DMAC_TRANS_SIZE_512         (6)     /* 512 bits  */
+#define DMAC_TRANS_SIZE_1024        (7)     /* 1024 bits */
+
+/* ==== Address increment for transferring ==== */
+#define DMAC_TRANS_ADR_NO_INC       (1)     /* Not increment */
+#define DMAC_TRANS_ADR_INC          (0)     /* Increment     */
+
+/* ==== Method for detecting DMA request ==== */
+#define DMAC_REQ_DET_FALL           (0)     /* Falling edge detection */
+#define DMAC_REQ_DET_RISE           (1)     /* Rising edge detection  */
+#define DMAC_REQ_DET_LOW            (2)     /* Low level detection    */
+#define DMAC_REQ_DET_HIGH           (3)     /* High level detection   */
+
+/* ==== Request Direction ==== */
+#define DMAC_REQ_DIR_SRC            (0)     /* DMAREQ is the source/ DMAACK is active when reading      */
+#define DMAC_REQ_DIR_DST            (1)     /* DMAREQ is the destination/ DMAACK is active when writing */
+
+/* ==== Descriptors ==== */
+#define DMAC_DESC_HEADER            (0)     /* Header              */
+#define DMAC_DESC_SRC_ADDR          (1)     /* Source Address      */
+#define DMAC_DESC_DST_ADDR          (2)     /* Destination Address */
+#define DMAC_DESC_COUNT             (3)     /* Transaction Byte    */
+#define DMAC_DESC_CHCFG             (4)     /* Channel Confg       */
+#define DMAC_DESC_CHITVL            (5)     /* Channel Interval    */
+#define DMAC_DESC_CHEXT             (6)     /* Channel Extension   */
+#define DMAC_DESC_LINK_ADDR         (7)     /* Link Address        */
+
+/* ==== On-chip peripheral module requests ===== */
+typedef enum dmac_request_factor
+{
+    DMAC_REQ_USB0_DMA0_TX,      /* USB_0 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA0_RX,      /* USB_0 channel 0 receive FIFO full              */
+    DMAC_REQ_USB0_DMA1_TX,      /* USB_0 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA1_RX,      /* USB_0 channel 1 receive FIFO full              */
+    DMAC_REQ_USB1_DMA0_TX,      /* USB_1 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA0_RX,      /* USB_1 channel 0 receive FIFO full              */
+    DMAC_REQ_USB1_DMA1_TX,      /* USB_1 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA1_RX,      /* USB_1 channel 1 receive FIFO full              */
+} dmac_request_factor_t;
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void usb1_function_DMAC3_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb1_function_DMAC3_Open(uint32_t req);
+void usb1_function_DMAC3_Close(uint32_t *remain);
+void usb1_function_DMAC3_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+void usb1_function_DMAC4_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb1_function_DMAC4_Open(uint32_t req);
+void usb1_function_DMAC4_Close(uint32_t *remain);
+void usb1_function_DMAC4_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB1_FUNCTION_DMACDRV_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dataio.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2932 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dataio.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static uint16_t g_usb1_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)];
+
+static void     usb1_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static uint16_t usb1_function_read_dma_d0(uint16_t pipe);
+static uint16_t usb1_function_read_dma_d1(uint16_t pipe);
+static uint16_t usb1_function_write_dma_d0(uint16_t pipe);
+static uint16_t usb1_function_write_dma_d1(uint16_t pipe);
+
+static void     usb1_function_read_c_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_write_c_fifo(uint16_t Pipe, uint16_t count);
+static void     usb1_function_read_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_write_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_read_d1_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_write_d1_fifo(uint16_t pipe, uint16_t count);
+
+static void     usb1_function_clear_transaction_counter(uint16_t pipe);
+static void     usb1_function_set_transaction_counter(uint16_t pipe, uint32_t count);
+
+static uint32_t usb1_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr);
+
+static uint16_t usb1_function_set_dfacc_d0(uint16_t mbw, uint32_t count);
+static uint16_t usb1_function_set_dfacc_d1(uint16_t mbw, uint32_t count);
+
+
+/*******************************************************************************
+* Function Name: usb1_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t  pipe    ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t usefifo;
+    uint16_t mbw;
+
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    usb1_function_clear_bemp_sts(pipe);
+    usb1_function_clear_brdy_sts(pipe);
+    usb1_function_clear_nrdy_sts(pipe);
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+        case USB_FUNCTION_D0FIFO_DMA:
+            usefifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+        case USB_FUNCTION_D1FIFO_DMA:
+            usefifo = USB_FUNCTION_D1USE;
+        break;
+
+        default:
+            usefifo = USB_FUNCTION_CUSE;
+        break;
+    };
+
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_clear_transaction_counter(pipe);
+
+    usb1_function_aclrm(pipe);
+
+    status = usb1_function_write_buffer(pipe);
+
+    if (status != DEVDRV_USBF_FIFOERROR)
+    {
+        usb1_function_set_pid_buf(pipe);
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer
+* Description  : Writes data in the buffer allocated in the pipe specified by
+*              : the argument. The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer (uint16_t pipe)
+{
+    uint16_t status;
+    uint16_t usefifo;
+
+    g_usb1_function_PipeIgnore[pipe] = 0;
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            status = usb1_function_write_buffer_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            status = usb1_function_write_buffer_d1(pipe);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            status = usb1_function_write_dma_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            status = usb1_function_write_dma_d1(pipe);
+        break;
+
+        default:
+            status = usb1_function_write_buffer_c(pipe);
+        break;
+    };
+
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITING:                       /* Continue of data write */
+            usb1_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            usb1_function_enable_brdy_int(pipe);        /* Enable Ready Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEEND:                      /* End of data write */
+        case DEVDRV_USBF_WRITESHRT:                     /* End of data write */
+            usb1_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb1_function_clear_nrdy_sts(pipe);
+            usb1_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            /* for last transfer */
+            usb1_function_enable_bemp_int(pipe);        /* Enable Empty Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEDMA:                      /* DMA write */
+            usb1_function_clear_nrdy_sts(pipe);
+            usb1_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                     /* FIFO access status */
+        default:
+            usb1_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb1_function_disable_bemp_int(pipe);       /* Disable Empty Interrupt */
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer_c
+* Description  : Writes data in the buffer allocated in the pipe specified in
+*              : the argument. Writes data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    if (g_usb1_function_CtrZeroLengthFlag == 1)
+    {
+        g_usb1_function_CtrZeroLengthFlag = 0;                  /* Zero Length Packet Flag CLR */
+        return DEVDRV_USBF_WRITEEND;
+    }
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    }
+    else
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+    }
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb1_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb1_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb1_function_write_c_fifo(pipe, (uint16_t)count);
+
+    if (g_usb1_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb1_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB201.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0)
+        {
+            USB201.CFIFOCTR = USB_FUNCTION_BITBVAL;             /* Short Packet */
+            g_usb1_function_CtrZeroLengthFlag = 1;              /* Zero Length Packet Flag */
+        }
+    }
+    else
+    {
+        g_usb1_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb1_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb1_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb1_function_write_d0_fifo(pipe, (uint16_t)count);
+
+    if (g_usb1_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb1_function_data_count[pipe] = 0;
+        if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb1_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb1_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb1_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb1_function_write_d1_fifo(pipe, (uint16_t)count);
+
+    if (g_usb1_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb1_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb1_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D0FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma().
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_write_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb1_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb1_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;
+
+        if ((count % size) != 0)
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 1;
+        }
+        else
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;
+        }
+
+        dfacc = usb1_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb1_function_data_count[pipe]    = 0;
+        g_usb1_function_data_pointer[pipe] += count;
+        status = DEVDRV_USBF_WRITEDMA;                              /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_dma_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D1FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma().
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_write_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc=0;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb1_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb1_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;
+        if ((count % size) != 0)
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 1;
+        }
+        else
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;
+        }
+
+        dfacc = usb1_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb1_function_data_count[pipe]    = 0;
+        g_usb1_function_data_pointer[pipe] += count;
+
+        status = DEVDRV_USBF_WRITEDMA;                              /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb1_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t usefifo;
+
+    usb1_function_clear_bemp_sts(pipe);
+    usb1_function_clear_brdy_sts(pipe);
+    usb1_function_clear_nrdy_sts(pipe);
+
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb1_function_start_receive_trns_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb1_function_start_receive_trns_d1(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            usb1_function_start_receive_dma_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            usb1_function_start_receive_dma_d1(pipe, size, data);
+        break;
+
+        default:
+            usb1_function_start_receive_trns_c(pipe, size, data);
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_trns_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+*              : When storing data in the buffer allocated in the pipe specified in the
+*              : argument, BRDY interrupt is generated to read data
+*              : in the interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = size;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
+    USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    usb1_function_enable_nrdy_int(pipe);
+    usb1_function_enable_brdy_int(pipe);
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_trns_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data in the
+*              : interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = size;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    usb1_function_enable_nrdy_int(pipe);
+    usb1_function_enable_brdy_int(pipe);
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_trns_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = size;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    usb1_function_enable_nrdy_int(pipe);
+    usb1_function_enable_brdy_int(pipe);
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_dma_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = 0;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb1_function_read_dma(pipe);
+
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_dma_d1
+* Description  : Read data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = 0;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb1_function_read_dma(pipe);
+
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Uses FIF0 set in the pipe definition table.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb1_function_PipeIgnore[pipe] = 0;
+
+    if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+    {
+        status = usb1_function_read_buffer_d0(pipe);
+    }
+    else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+    {
+        status = usb1_function_read_buffer_d1(pipe);
+    }
+    else
+    {
+        status = usb1_function_read_buffer_c(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb1_function_disable_brdy_int(pipe);
+            g_usb1_function_PipeDataSize[pipe]   -= g_usb1_function_data_count[pipe];
+            g_usb1_function_pipe_status[pipe]     = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+            {
+                USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+            {
+                USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else
+            {
+                USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+            }
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe];
+            g_usb1_function_pipe_status[pipe]   = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb1_function_data_count[pipe];
+    }
+    else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+    }
+    else
+    {
+        usb1_function_read_c_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb1_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb1_function_data_count[pipe];
+    }
+    else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb1_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb1_function_read_d0_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb1_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer_d1
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb1_function_data_count[pipe];
+    }
+    else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb1_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb1_function_read_d1_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb1_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_dma
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO or D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_dma (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb1_function_PipeIgnore[pipe] = 0;
+    if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+    {
+        status = usb1_function_read_dma_d0(pipe);
+    }
+    else
+    {
+        status = usb1_function_read_dma_d1(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READZERO:                                     /* End of data read */
+            usb1_function_disable_brdy_int(pipe);
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb1_function_disable_brdy_int(pipe);
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe];
+            }
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe];
+            }
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_read_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+    uint16_t pipebuf_size;
+
+    g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb1_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb1_function_data_count[pipe];
+        }
+        else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb1_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb1_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;        /* not use in read operation */
+        g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;           /* not use in read operation */
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D0FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb1_function_data_count[pipe]   -= count;
+        g_usb1_function_data_pointer[pipe] += count;
+        g_usb1_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_dma_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by DMA transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_read_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+    uint16_t pipebuf_size;
+
+    g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb1_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb1_function_data_count[pipe];
+        }
+        else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb1_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb1_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;        /* not use in read operation */
+        g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;           /* not use in read operation */
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D1FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb1_function_data_count[pipe]   -= count;
+        g_usb1_function_data_pointer[pipe] += count;
+        g_usb1_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_change_fifo_port
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument. After allocating FIF0, waits in the software
+*              : till the corresponding pipe becomes ready.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : DEVDRV_USBF_FIFOERROR          ; Error
+*              : Others            ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value
+*******************************************************************************/
+uint16_t usb1_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    usb1_function_set_curpipe(pipe, fifosel, isel, mbw);
+
+    for (loop = 0; loop < 4; loop++)
+    {
+        switch (fifosel)
+        {
+            case USB_FUNCTION_CUSE:
+                buffer = USB201.CFIFOCTR;
+            break;
+
+            case USB_FUNCTION_D0USE:
+            case USB_FUNCTION_D0DMA:
+                buffer = USB201.D0FIFOCTR;
+            break;
+
+            case USB_FUNCTION_D1USE:
+            case USB_FUNCTION_D1DMA:
+                buffer = USB201.D1FIFOCTR;
+            break;
+
+            default:
+                buffer = 0;
+            break;
+        }
+
+        if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY)
+        {
+            return buffer;
+        }
+
+        loop2 = 25;
+        while (loop2-- > 0)
+        {
+            /* wait */
+        }
+    }
+
+    return DEVDRV_USBF_FIFOERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_curpipe
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    g_usb1_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB201.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB201.D0FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB201.D1FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_curpipe2
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+*              : uint16_t dfacc     ; DFACC Access mode
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc)
+{
+    uint16_t buffer;
+    uint32_t loop;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+    uint32_t dummy;
+#endif
+    volatile uint32_t loop2;
+
+    g_usb1_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB201.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB201.D0FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB201.D0FIFO.UINT32;
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB201.D1FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB201.D1FIFO.UINT32;
+                loop = dummy;                   // avoid warning.
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_c_fifo
+* Description  : Writes data in CFIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_write_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB201.CFIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB201.CFIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB201.CFIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_c_fifo
+* Description  : Reads data from CFIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_read_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb1_function_data_pointer[pipe] = USB201.CFIFO.UINT8[HH];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT16[H];
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT32;
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_d0_fifo
+* Description  : Writes data in D0FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_write_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB201.D0FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB201.D0FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB201.D0FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_d0_fifo
+* Description  : Reads data from D0FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating DOFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_read_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb1_function_data_pointer[pipe] = USB201.D0FIFO.UINT8[HH];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT16[H];
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT32;
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_d1_fifo
+* Description  : Writes data in D1FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_write_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB201.D1FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB201.D1FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB201.D1FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_d1_fifo
+* Description  : Reads data from D1FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_read_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb1_function_data_pointer[pipe] = USB201.D1FIFO.UINT8[HH];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT16[H];
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT32;
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_com_get_dmasize
+* Description  : Calculates access width of DMA transfer by the argument to
+*              : return as the Return Value.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : DMA transfer size    : 0   8bit
+*              :                      : 1  16bit
+*              :                      : 2  32bit
+*******************************************************************************/
+static uint32_t usb1_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+
+    if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0))
+    {
+        /*  When transfer byte count is odd         */
+        /* or transfer data area is 8-bit alignment */
+        size = 0;           /* 8bit */
+    }
+    else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0))
+    {
+        /* When the transfer byte count is multiples of 2 */
+        /* or the transfer data area is 16-bit alignment */
+        size = 1;           /* 16bit */
+    }
+    else
+    {
+        /* When the transfer byte count is multiples of 4 */
+        /* or the transfer data area is 32-bit alignment */
+        size = 2;           /* 32bit */
+    }
+
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_mbw
+* Description  : Calculates access width of DMA to return the value set in MBW.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : FIFO transfer size   : USB_FUNCTION_BITMBW_8    8bit
+*              :                      : USB_FUNCTION_BITMBW_16  16bit
+*              :                      : USB_FUNCTION_BITMBW_32  32bit
+*******************************************************************************/
+uint16_t usb1_function_get_mbw (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+    uint16_t mbw;
+
+    size = usb1_function_com_get_dmasize(trncount, dtptr);
+
+    if (size == 0)
+    {
+        /* 8bit */
+        mbw = USB_FUNCTION_BITMBW_8;
+    }
+    else if (size == 1)
+    {
+        /* 16bit */
+        mbw = USB_FUNCTION_BITMBW_16;
+    }
+    else
+    {
+        /* 32bit */
+        mbw = USB_FUNCTION_BITMBW_32;
+    }
+
+    return mbw;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_transaction_counter
+* Description  : Sets transaction counter by the argument(PIPEnTRN).
+*              : Clears transaction before setting to enable transaction counter setting.
+* Arguments    : uint16_t pipe     ; Pipe number
+*              : uint32_t bsize    : Data transfer size
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_set_transaction_counter (uint16_t pipe, uint32_t bsize)
+{
+    uint16_t mxps;
+    uint16_t cnt;
+
+    if (bsize  == 0)
+    {
+        return;
+    }
+
+    mxps = usb1_function_get_mxps(pipe);            /* Max Packet Size */
+
+    if ((bsize % mxps) == 0)
+    {
+        cnt = (uint16_t)(bsize / mxps);
+    }
+    else
+    {
+        cnt = (uint16_t)((bsize / mxps) + 1);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE1TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE2TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE3TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE4TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE5TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE9TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEATRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEBTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPECTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEDTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEETRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEFTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_transaction_counter
+* Description  : Clears the transaction counter by the argument.
+*              : After executing this function, the transaction counter is invalid.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_transaction_counter (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_stop_transfer
+* Description  : Stops the USB transfer in the pipe specified by the argument.
+*              : After stopping the USB transfer, clears the buffer allocated in
+*              : the pipe.
+*              : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0;
+*              : invalid. After executing this function, BRDY/NRDY/BEMP interrupt
+*              : in the corresponding pipe becomes invalid. Sequence bit is also
+*              : cleared.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_stop_transfer (uint16_t pipe)
+{
+    uint16_t usefifo;
+    uint32_t remain;
+    uint16_t fifo;
+
+    usb1_function_set_pid_nak(pipe);
+
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1USE;
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            remain = Userdef_USB_usb1_function_stop_dma0();
+            usb1_function_dma_stop_d0(pipe, remain);
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0DMA;
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            remain = Userdef_USB_usb1_function_stop_dma1();
+            usb1_function_dma_stop_d1(pipe, remain);
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1DMA;
+        break;
+
+        default:
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.CFIFOCTR =  USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_CUSE;
+        break;
+    }
+
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16);
+
+    /* Interrupt of pipe set is disabled */
+    usb1_function_disable_brdy_int(pipe);
+    usb1_function_disable_nrdy_int(pipe);
+    usb1_function_disable_bemp_int(pipe);
+
+    usb1_function_aclrm(pipe);
+    usb1_function_set_csclr(pipe);
+
+    if ( g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT )
+    {
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_dfacc_d0
+* Description  : Sets the DFACC setting value in D0FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb1_function_set_dfacc_d0 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+    return dfacc;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_dfacc_d1
+* Description  : Set the DFACC setting value in D1FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb1_function_set_dfacc_d1 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+
+    return dfacc;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dma.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,346 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dma.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static void usb1_function_dmaint(uint16_t fifo);
+static void usb1_function_dmaint_buf2fifo(uint16_t pipe);
+static void usb1_function_dmaint_fifo2buf(uint16_t pipe);
+
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_stop_d0
+* Description  : D0FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_stop_d0 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB201.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB201.D0FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain);
+            g_usb1_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_stop_d1
+* Description  : D1FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_stop_d1 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB201.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB201.D1FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain);
+            g_usb1_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_interrupt_d0fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb1_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_interrupt_d0fifo (uint32_t int_sense)
+{
+    usb1_function_dmaint(USB_FUNCTION_D0FIFO);
+    g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_interrupt_d1fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb1_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_interrupt_d1fifo (uint32_t int_sense)
+{
+    usb1_function_dmaint(USB_FUNCTION_D1FIFO);
+    g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dmaint
+* Description  : This function is DMA transfer end interrupt
+* Arguments    : uint16_t fifo  ; fifo number
+*              :                ;  USB_FUNCTION_D0FIFO
+*              :                ;  USB_FUNCTION_D1FIFO
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_dmaint (uint16_t fifo)
+{
+    uint16_t pipe;
+
+    pipe = g_usb1_function_DmaPipe[fifo];
+
+    if (g_usb1_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO)
+    {
+        usb1_function_dmaint_buf2fifo(pipe);
+    }
+    else
+    {
+        usb1_function_dmaint_fifo2buf(pipe);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dmaint_fifo2buf
+* Description  : Executes read completion from FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_dmaint_fifo2buf (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+    {
+        useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+        if (useport == USB_FUNCTION_D0FIFO_DMA)
+        {
+            remain = Userdef_USB_usb1_function_stop_dma0();
+            usb1_function_dma_stop_d0(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb1_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+        else
+        {
+            remain = Userdef_USB_usb1_function_stop_dma1();
+            usb1_function_dma_stop_d1(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb1_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dmaint_buf2fifo
+* Description  : Executes write completion in FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_dmaint_buf2fifo (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    if (useport == USB_FUNCTION_D0FIFO_DMA)
+    {
+        remain = Userdef_USB_usb1_function_stop_dma0();
+        usb1_function_dma_stop_d0(pipe, remain);
+
+        if (g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D0FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+    else
+    {
+        remain = Userdef_USB_usb1_function_stop_dma1();
+        usb1_function_dma_stop_d1(pipe, remain);
+
+        if (g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D1FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+
+    usb1_function_enable_bemp_int(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_intrn.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,249 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_intrn.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_brdy_int
+* Description  : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : According to the pipe that interrupt is generated in,
+*              : reads/writes buffer allocated in the pipe.
+*              : This function is executed in the BRDY interrupt handler.
+*              : This function clears BRDY interrupt status and BEMP interrupt
+*              : status.
+* Arguments    : uint16_t Status       ; BRDYSTS Register Value
+*              : uint16_t Int_enbl     ; BRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_brdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint32_t int_sense = 0;
+    uint16_t pipe;
+    uint16_t pipebit;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        pipebit = g_usb1_function_bit_set[pipe];
+
+        if ((status & pipebit) && (int_enb & pipebit))
+        {
+            USB201.BRDYSTS = (uint16_t)~pipebit;
+            USB201.BEMPSTS = (uint16_t)~pipebit;
+            if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb1_function_dma_interrupt_d0fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb1_function_read_dma(pipe);
+                    usb1_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb1_function_dma_interrupt_d1fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb1_function_read_dma(pipe);
+                    usb1_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else
+            {
+                if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0)
+                {
+                    usb1_function_read_buffer(pipe);
+                }
+                else
+                {
+                    usb1_function_write_buffer(pipe);
+                }
+            }
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_nrdy_int
+* Description  : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : Checks NRDY interrupt cause by PID. When the cause if STALL,
+*              : regards the pipe state as STALL and ends the processing.
+*              : Then the cause is not STALL, increments the error count to
+*              : communicate again. When the error count is 3, determines
+*              : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing.
+*              : This function is executed in the NRDY interrupt handler.
+*              : This function clears NRDY interrupt status.
+* Arguments    : uint16_t status       ; NRDYSTS Register Value
+*              : uint16_t int_enb      ; NRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb1_function_nrdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB201.NRDYSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe])
+        {
+            if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1)
+            {
+                if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT)
+                {
+                    pid = usb1_function_get_pid(pipe);
+                    if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+                    {
+                        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+                    }
+                    else
+                    {
+                        g_usb1_function_PipeIgnore[pipe]++;
+                        if (g_usb1_function_PipeIgnore[pipe] == 3)
+                        {
+                            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+                        }
+                        else
+                        {
+                            usb1_function_set_pid_buf(pipe);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                /* USB Function */
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_bemp_int
+* Description  : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9).
+* Arguments    : uint16_t status       ; BEMPSTS Register Value
+*              : uint16_t int_enb      ; BEMPENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb1_function_bemp_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+    uint16_t inbuf;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB201.BEMPSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe])
+        {
+            pid = usb1_function_get_pid(pipe);
+
+            if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+            {
+                g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+            }
+            else
+            {
+                inbuf = usb1_function_get_inbuf(pipe);
+
+                if (inbuf == 0)
+                {
+                    usb1_function_disable_bemp_int(pipe);
+                    usb1_function_set_pid_nak(pipe);
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+        }
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_lib.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2044 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_lib.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_brdy_int
+* Description  : Enables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_enable_brdy_int (uint16_t pipe)
+{
+    /* enable brdy interrupt */
+    USB201.BRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_disable_brdy_int
+* Description  : Disables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_disable_brdy_int (uint16_t pipe)
+{
+    /* disable brdy interrupt */
+    USB201.BRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_brdy_sts (uint16_t pipe)
+{
+    /* clear brdy status */
+    USB201.BRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_bemp_int
+* Description  : Enables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_enable_bemp_int (uint16_t pipe)
+{
+    /* enable bemp interrupt */
+    USB201.BEMPENB |= (uint16_t)g_usb1_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_disable_bemp_int
+* Description  : Disables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_disable_bemp_int (uint16_t pipe)
+{
+    /* disable bemp interrupt */
+    USB201.BEMPENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_bemp_sts (uint16_t pipe)
+{
+    /* clear bemp status */
+    USB201.BEMPSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_nrdy_int
+* Description  : Enables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : NRDY. Enables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_enable_nrdy_int (uint16_t pipe)
+{
+    /* enable nrdy interrupt */
+    USB201.NRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_disable_nrdy_int
+* Description  : Disables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : NRDY. Disables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_disable_nrdy_int (uint16_t pipe)
+{
+    /* disable nrdy interrupt */
+    USB201.NRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_nrdy_sts (uint16_t pipe)
+{
+    /* clear nrdy status */
+    USB201.NRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_is_hispeed
+* Description  : Returns the result of USB reset hand shake (RHST) as
+*              : return value.
+* Arguments    : none
+* Return Value : USB_FUNCTION_HIGH_SPEED    ; Hi-Speed
+*              : USB_FUNCTION_FULL_SPEED    ; Full-Speed
+*              : LOW_SPEED                  ; Low-Speed
+*              : USB_FUNCTION_NON_SPEED     ; error
+*******************************************************************************/
+uint16_t usb1_function_is_hispeed (void)
+{
+    uint16_t rhst;
+    uint16_t speed;
+
+    rhst = RZA_IO_RegRead_16(&USB201.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST);
+
+    if (rhst == USB_FUNCTION_HSMODE)
+    {
+        speed = USB_FUNCTION_HIGH_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_FSMODE)
+    {
+        speed = USB_FUNCTION_FULL_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_LSMODE)
+    {
+        speed = USB_FUNCTION_LOW_SPEED;
+    }
+    else
+    {
+        speed = USB_FUNCTION_NON_SPEED;
+    }
+
+    return speed;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_is_hispeed_enable
+* Description  : Returns the USB High-Speed connection enabled status as
+*              : return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Hi-Speed Enable
+*              : DEVDRV_USBF_NO   : Hi-Speed Disable
+*******************************************************************************/
+uint16_t usb1_function_is_hispeed_enable (void)
+{
+    uint16_t ret;
+
+    ret = DEVDRV_USBF_NO;
+
+    if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1)
+    {
+        ret = DEVDRV_USBF_YES;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_pid_buf (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb1_function_set_pid_nak(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_pid_nak (uint16_t pipe)
+{
+    uint16_t pid;
+    uint16_t pbusy;
+    uint32_t loop;
+
+    pid = usb1_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb1_function_set_pid_stall(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        for (loop = 0; loop < 200; loop++)
+        {
+            switch (pipe)
+            {
+                case USB_FUNCTION_PIPE0:
+                    pbusy = RZA_IO_RegRead_16(&USB201.DCPCTR,
+                                                USB_DCPCTR_PBUSY_SHIFT,
+                                                USB_DCPCTR_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE1:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE2:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE3:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE4:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE5:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE6:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE6CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE7:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE7CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE8:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE8CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE9:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                                USB_PIPEnCTR_9_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_9_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEA:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEB:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEC:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPED:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEE:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEF:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                default:
+                    pbusy   = 1;
+                break;
+            }
+
+            if (pbusy == 0)
+            {
+                break;
+            }
+            Userdef_USB_usb1_function_delay_500ns();
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_pid_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+    else
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_pid_stall (uint16_t pipe)
+{
+    usb1_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb1_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            pid = RZA_IO_RegRead_16(&USB201.DCPCTR,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE6CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE7CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE8CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            pid = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+            pid = 0;
+        break;
+    }
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_csclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                1,
+                                USB_DCPCTR_CSCLR_SHIFT,
+                                USB_DCPCTR_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_CSCLR_SHIFT,
+                                USB_PIPEnCTR_9_CSCLR);
+        break;
+
+        default:
+            /* PIPEA-F have not CSCLR */
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_sqclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQCLR_SHIFT,
+                                USB_DCPCTR_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQCLR_SHIFT,
+                                USB_PIPEnCTR_9_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_sqset (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQSET_SHIFT,
+                                USB_DCPCTR_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQSET_SHIFT,
+                                USB_PIPEnCTR_9_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_sqmon
+* Description  : Toggle bit of specified pipe is obtained
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : sqmon
+*******************************************************************************/
+uint16_t usb1_function_get_sqmon (uint16_t pipe)
+{
+    uint16_t sqmon;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            sqmon = RZA_IO_RegRead_16(&USB201.DCPCTR,
+                                        USB_DCPCTR_SQMON_SHIFT,
+                                        USB_DCPCTR_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE6CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE7CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE8CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                        USB_PIPEnCTR_9_SQMON_SHIFT,
+                                        USB_PIPEnCTR_9_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        default:
+            sqmon = 0;
+        break;
+    }
+
+    return sqmon;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_aclrm
+* Description  : The buffer of specified pipe is initialized
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb1_function_aclrm (uint16_t pipe)
+{
+    usb1_function_set_aclrm(pipe);
+    usb1_function_clr_aclrm(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clr_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clr_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                0,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_inbuf
+* Description  : Returns INBUFM of the pipe specified by the argument.
+* Arguments    : uint16_t pipe             ; Pipe Number
+* Return Value : inbuf
+*******************************************************************************/
+uint16_t usb1_function_get_inbuf (uint16_t pipe)
+{
+    uint16_t inbuf;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                    USB_PIPEnCTR_9_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_9_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        default:
+            inbuf = 0;
+        break;
+    }
+
+    return inbuf;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_setting_interrupt
+* Description  : Sets the USB module interrupt level.
+* Arguments    : uint8_t level
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_setting_interrupt (uint8_t level)
+{
+    uint16_t d0fifo_dmaintid;
+    uint16_t d1fifo_dmaintid;
+
+    R_INTC_RegistIntFunc(INTC_ID_USBI1, usb1_function_interrupt);
+    R_INTC_SetPriority(INTC_ID_USBI1, level);
+    R_INTC_Enable(INTC_ID_USBI1);
+
+    d0fifo_dmaintid = Userdef_USB_usb1_function_d0fifo_dmaintid();
+
+    if (d0fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d0fifo_dmaintid, usb1_function_dma_interrupt_d0fifo);
+        R_INTC_SetPriority(d0fifo_dmaintid, level);
+        R_INTC_Enable(d0fifo_dmaintid);
+    }
+
+    d1fifo_dmaintid = Userdef_USB_usb1_function_d1fifo_dmaintid();
+
+    if (d1fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d1fifo_dmaintid, usb1_function_dma_interrupt_d1fifo);
+        R_INTC_SetPriority(d1fifo_dmaintid, level);
+        R_INTC_Enable(d1fifo_dmaintid);
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_reset_module
+* Description  : Initializes the USB module.
+*              : Enables providing clock to the USB module.
+*              : Sets USB bus wait register.
+* Arguments    : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+void usb1_function_reset_module (uint16_t clockmode)
+{
+    /* UPLLE bit is only USB0 */
+    if (RZA_IO_RegRead_16(&USB200.SYSCFG0,
+                                USB_SYSCFG_UPLLE_SHIFT,
+                                USB_SYSCFG_UPLLE) == 1)
+    {
+        if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode)
+        {
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            USB201.SYSCFG0 = 0;
+            USB200.SYSCFG0 = 0;
+            USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+            Userdef_USB_usb1_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            Userdef_USB_usb1_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                            0,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            0,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        USB201.SYSCFG0 = 0;
+        USB200.SYSCFG0 = 0;
+        USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+        Userdef_USB_usb1_function_delay_xms(1);
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            1,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                            1,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+    }
+
+    USB201.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_buf_size
+* Description  : Obtains pipe buffer size specified by the argument and
+*              : maximum packet size of the USB device in use.
+*              : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum
+*              : packet size of the USB device using the corresponding pipe.
+*              : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the
+*              : corresponding pipe is in continuous transfer mode,
+*              : obtains the buffer size allocated in the corresponcing pipe,
+*              : when incontinuous transfer, obtains maximum packet size.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Maximum packet size or buffer size
+*******************************************************************************/
+uint16_t usb1_function_get_buf_size (uint16_t pipe)
+{
+    uint16_t size;
+    uint16_t bufsize;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB201.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1)
+        {
+            bufsize = RZA_IO_RegRead_16(&g_usb1_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE);
+            size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF);
+        }
+        else
+        {
+            size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+        }
+    }
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_mxps
+* Description  : Obtains maximum packet size of the USB device using the pipe
+*              : specified by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Max Packet Size
+*******************************************************************************/
+uint16_t usb1_function_get_mxps (uint16_t pipe)
+{
+    uint16_t size;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB201.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+    }
+    return size;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_api.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,441 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_api.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+#include "dev_drv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_api_function_init
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint8_t  int_level ; interruput level
+*              : uint16_t mode      : Speed modes
+*              :                    :  USB_FUCNTION_HIGH_SPEED: High-speed device
+*              :                    :  USB_FUCNTION_FULL_SPEED: Full-speed device
+*              : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode)
+{
+    volatile uint8_t dummy_buf;
+
+    CPG.STBCR7  &= 0xfc;                        /*The clock of USB0/1 modules is permitted  */
+    dummy_buf   = CPG.STBCR7;                   /* (Dummy read)                             */
+
+    usb1_function_setting_interrupt(int_level);
+
+    usb1_function_reset_module(clockmode);      /* reset USB module with setting tranciever */
+                                                /* and HSE=1                                */
+
+    usb1_function_init_status();                /* clear variables                          */
+
+    usb1_function_InitModule(mode);             /* select USB Function and Interrupt Enable */
+                                                /* Detect USB Device to attach or detach    */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_api_function_IsConfigured
+* Description  : Checks if the USB device is configured to return the result as
+*              : the return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Configured & Configured Suspend
+*              : DEVDRV_USBF_NO   : not Configured
+*******************************************************************************/
+uint16_t usb1_api_function_IsConfigured (void)
+{
+    uint16_t dvst;
+
+    dvst = usb1_function_GetDeviceState();
+
+    if ((dvst == USB_FUNCTION_DVST_CONFIGURED) ||
+        (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND))
+    {
+        return DEVDRV_USBF_YES;
+    }
+
+    return DEVDRV_USBF_NO;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_GetDeviceState
+* Description  : Returns the state of USB device.
+* Arguments    : none
+* Return Value : Device States
+*******************************************************************************/
+uint16_t usb1_function_GetDeviceState (void)
+{
+    uint16_t dvsq;
+    uint16_t dvst;
+
+    dvsq = USB201.INTSTS0;
+    switch (dvsq & USB_FUNCTION_BITDVSQ)
+    {
+        case USB_FUNCTION_DS_POWR:                      /* Power state *//* power-on */
+            dvst = USB_FUNCTION_DVST_POWERED;
+        break;
+
+        case USB_FUNCTION_DS_DFLT:                      /* Default state *//* bus-reset */
+            dvst = USB_FUNCTION_DVST_DEFAULT;
+        break;
+
+        case USB_FUNCTION_DS_ADDS:                      /* Address state */
+            dvst = USB_FUNCTION_DVST_ADDRESS;
+        break;
+
+        case USB_FUNCTION_DS_CNFG:                      /* Configured state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED;
+        break;
+
+        case USB_FUNCTION_DS_SPD_CNFG:                  /* Configured Suspend state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND;
+        break;
+
+        case USB_FUNCTION_DS_SPD_POWR:                  /* Power      Suspend state */
+        case USB_FUNCTION_DS_SPD_DFLT:                  /* Default    Suspend state */
+        case USB_FUNCTION_DS_SPD_ADDR:                  /* Address    Suspend state */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+
+        default:                                        /* error */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+    }
+
+    return dvst;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data data Address
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    usb1_function_start_receive_transfer(pipe, size, data);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t pipe     ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t *data     ; Data data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+
+    status = usb1_function_start_send_transfer(pipe, size, data);
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_check_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+*              : uint32_t *size     ; Data Size
+* Return Value : Pipe Status
+*******************************************************************************/
+uint16_t usb1_api_function_check_pipe_status (uint16_t pipe, uint32_t * size)
+{
+    if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE)
+    {
+        *size = g_usb1_function_PipeDataSize[pipe];
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_DONE;
+    }
+    else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES)
+    {
+        *size = 0;
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_NORES;
+    }
+    else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL)
+    {
+        *size = 0;
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_STALL;
+    }
+    else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR)
+    {
+        *size = 0;
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_FIFOERROR;
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    return g_usb1_function_pipe_status[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : Pipe Status
+*******************************************************************************/
+void usb1_api_function_clear_pipe_status (uint16_t pipe)
+{
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+    g_usb1_function_PipeDataSize[pipe] = 0;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_pid_buf (uint16_t pipe)
+{
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_pid_nak (uint16_t pipe)
+{
+    usb1_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_pid_stall (uint16_t pipe)
+{
+    usb1_function_set_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_pid_stall (uint16_t pipe)
+{
+    usb1_function_clear_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb1_api_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_check_stall
+* Description  :
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+int32_t usb1_api_function_check_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+
+    if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL)
+    {
+        return DEVDRV_USBF_STALL;
+    }
+
+    return DEVDRV_SUCCESS;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_sqclr (uint16_t pipe)
+{
+    usb1_function_set_sqclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_sqset (uint16_t pipe)
+{
+    usb1_function_set_sqset(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_csclr (uint16_t pipe)
+{
+    usb1_function_set_csclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_curpipe
+* Description  : Allocates FIF0 specifed by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    usb1_function_set_curpipe(pipe, fifosel, isel, mbw);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_brdy_sts (uint16_t pipe)
+{
+    usb1_function_clear_brdy_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_bemp_sts (uint16_t pipe)
+{
+    usb1_function_clear_bemp_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_nrdy_sts (uint16_t pipe)
+{
+    usb1_function_clear_nrdy_sts(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_controlrw.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_controlrw.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_api_function_CtrlReadStart
+* Description  : Executes the USB control read transfer.
+*              : USB host controller <- USB device
+* Arguments    : uint16_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND          ; End of data write
+*              : DEVDRV_USBF_WRITESHRT         ; End of short data write
+*              : DEVDRV_USBF_WRITING           ; Continue of data write
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO access error
+*******************************************************************************/
+uint16_t usb1_api_function_CtrlReadStart (uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb1_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0],
+                                    (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    status = usb1_function_write_buffer_c(USB_FUNCTION_PIPE0);
+
+    /* Peripheral Control sequence */
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITESHRT:                                     /* End of data write */
+        case DEVDRV_USBF_WRITEEND:                                      /* End of data write (not null) */
+        case DEVDRV_USBF_WRITING:                                       /* Continue of data write */
+            usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0);          /* Enable Empty Interrupt */
+            usb1_function_set_pid_buf(USB_FUNCTION_PIPE0);              /* Set BUF */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access error */
+        break;
+
+        default:
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_CtrlWriteStart
+* Description  : Executes the USB control write transfer.
+*              : USB host controller -> USB device
+* Arguments    : uint16_t  size         ; Data Size
+*              : uint8_t  *data         ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_CtrlWriteStart (uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb1_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0],
+                                    (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb1_function_enable_brdy_int(USB_FUNCTION_PIPE0);
+    usb1_function_set_pid_buf(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_global.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,144 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_global.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+const uint16_t g_usb1_function_bit_set[16] =
+{
+    0x0001, 0x0002, 0x0004, 0x0008,
+    0x0010, 0x0020, 0x0040, 0x0080,
+    0x0100, 0x0200, 0x0400, 0x0800,
+    0x1000, 0x2000, 0x4000, 0x8000
+};
+
+uint32_t g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint8_t  * g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+uint16_t g_usb1_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint32_t g_usb1_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+USB_FUNCTION_DMA_t g_usb1_function_DmaInfo[2];
+uint16_t g_usb1_function_DmaPipe[2];
+uint16_t g_usb1_function_DmaBval[2];
+uint16_t g_usb1_function_DmaStatus[2];
+
+uint16_t g_usb1_function_CtrZeroLengthFlag;
+
+//uint16_t g_usb1_function_ConfigNum;
+//uint16_t g_usb1_function_Alternate[USB_FUNCTION_ALT_NO];
+//uint16_t g_usb1_function_RemoteWakeupFlag;
+uint16_t g_usb1_function_TestModeFlag;
+uint16_t g_usb1_function_TestModeSelectors;
+
+//uint16_t g_usb1_function_ReqType;
+//uint16_t g_usb1_function_ReqTypeType;
+//uint16_t g_usb1_function_ReqTypeRecip;
+//uint16_t g_usb1_function_ReqRequest;
+//uint16_t g_usb1_function_ReqValue;
+//uint16_t g_usb1_function_ReqIndex;
+//uint16_t g_usb1_function_ReqLength;
+
+//uint16_t g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+uint16_t g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+* Function Name: usb1_function_init_status
+* Description  : Initialization USB Sample Driver Variable.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_init_status (void)
+{
+    uint16_t pipe;
+
+    //g_usb1_function_ConfigNum         = 0;
+    //g_usb1_function_RemoteWakeupFlag  = DEVDRV_USBF_OFF;
+    g_usb1_function_TestModeFlag      = DEVDRV_USBF_OFF;
+    g_usb1_function_CtrZeroLengthFlag = 0;
+
+#if 0
+    usb1_function_clear_alt();
+#endif
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+        g_usb1_function_PipeDataSize[pipe] = 0;
+        g_usb1_function_data_count[pipe]   = 0;
+
+        /* pipe configuration in usb1_function_ResetEP() */
+        g_usb1_function_pipecfg[pipe]  = 0;
+        g_usb1_function_pipebuf[pipe]  = 0;
+        g_usb1_function_pipemaxp[pipe] = 0;
+        g_usb1_function_pipeperi[pipe] = 0;
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sig.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,330 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_sig.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb1_function_EnableINTModule(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_InitModule
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint16_t mode  ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode
+*              :                ; other                   ; Full-speed Mode
+* Return Value : none
+*******************************************************************************/
+void usb1_function_InitModule (uint16_t mode)
+{
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);           /* USB function */
+
+    /* USB module operation enabled     */
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    if (mode == USB_FUNCTION_HIGH_SPEED)
+    {
+        RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                            1,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);        /* Hi-Speed Mode */
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                            0,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);
+    }
+
+    /* for power-on                     */
+    if (usb1_function_CheckVBUStaus() == DEVDRV_USBF_ON)
+    {
+        usb1_function_EnableINTModule();            /* Interrupt Enable */
+        usb1_function_USB_FUNCTION_Attach();        /* pull-up D+ and open D- */
+    }
+    else
+    {
+        usb1_function_USB_FUNCTION_Detach();        /* USB Detach */
+                                                    /* with Interrupt Enable */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_CheckVBUStaus
+* Description  : Checks the USB-VBUS state to returns the connection state to
+*              : the USB host.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   VBUS ON
+*              : DEVDRV_USBF_OFF   :   VBUS OFF
+*******************************************************************************/
+uint16_t usb1_function_CheckVBUStaus (void)
+{
+    uint16_t buf1;
+    uint16_t buf2;
+    uint16_t buf3;
+
+    /* monitor VBUS pins */
+    do
+    {
+        buf1 = RZA_IO_RegRead_16(&USB201.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb1_function_delay_10us(1);
+        buf2 = RZA_IO_RegRead_16(&USB201.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb1_function_delay_10us(1);
+        buf3 = RZA_IO_RegRead_16(&USB201.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+    } while ((buf1 != buf2) || (buf2 != buf3));
+
+    if (buf1 == DEVDRV_USBF_OFF)
+    {
+        return DEVDRV_USBF_OFF;        /* detach */
+    }
+
+    return DEVDRV_USBF_ON;             /* attach */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Attach
+* Description  : Connects to the USB host controller.
+*              : This function pulls up D+.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_USB_FUNCTION_Attach (void)
+{
+    Userdef_USB_usb1_function_attach();
+
+    Userdef_USB_usb1_function_delay_xms(10);
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);      /* Pull-up D+ and open D- */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Detach
+* Description  : Disconnects from the USB host controller.
+*              : This function opens D+/D-.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_USB_FUNCTION_Detach (void)
+{
+    uint16_t pipe;
+
+    Userdef_USB_usb1_function_detach();
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE)
+        {
+            usb1_function_stop_transfer(pipe);
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);      /* open D+ and D- */
+
+    /* Detach Recovery */
+    Userdef_USB_usb1_function_delay_500ns();                /* need 1us=500ns * 2 wait */
+    Userdef_USB_usb1_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+    Userdef_USB_usb1_function_delay_500ns();                /* need 100ns wait but 500ns S/W wait */
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);       /* soft reset module */
+    Userdef_USB_usb1_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    usb1_function_EnableINTModule();            /* Interrupt Enable */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_BusReset
+* Description  : This function is executed when the USB device is transitioned
+*              : to POWERD_STATE. Sets the device descriptor according to the
+*              : connection speed determined by the USB reset hand shake.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb1_function_USB_FUNCTION_BusReset (void)
+{
+    usb1_function_init_status();                                    /* memory clear */
+
+    if (usb1_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED)
+    {
+        usb1_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED);     /* Device Descriptor reset */
+    }
+    else
+    {
+        usb1_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED);     /* Device Descriptor reset */
+    }
+
+    usb1_function_ResetDCP();                                       /* Default Control PIPE reset */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Resume
+* Description  : This function is executed when the USB device detects a resume
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb1_function_USB_FUNCTION_Resume (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Suspend
+* Description  : This function is executed when the USB device detects a suspend
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb1_function_USB_FUNCTION_Suspend (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_TestMode
+* Description  : This function is executed when the USB device is transitioned U
+*              : to TEST_MODE by the USB standard request.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_USB_FUNCTION_TestMode (void)
+{
+    switch (g_usb1_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT)
+    {
+        case USB_FUNCTION_FUNCTION_TEST_J:
+        case USB_FUNCTION_FUNCTION_TEST_K:
+        case USB_FUNCTION_FUNCTION_TEST_SE0_NAK:
+        case USB_FUNCTION_FUNCTION_TEST_PACKET:
+            RZA_IO_RegWrite_16(&USB201.TESTMODE,
+                                (g_usb1_function_TestModeSelectors >> 8),
+                                USB_TESTMODE_UTST_SHIFT,
+                                USB_TESTMODE_UTST);
+        break;
+
+        case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE:
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_EnableINTModule
+* Description  : Enables USB interrupt.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_EnableINTModule (void)
+{
+    uint16_t buf;
+
+    buf  = USB201.INTENB0;
+    buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE |
+            USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE);
+    USB201.INTENB0 = buf;
+
+    usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sub.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,453 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_sub.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+#if 0
+extern const uint16_t *g_usb1_function_EndPntPtr[];
+extern uint8_t         g_usb1_function_DeviceDescriptor[];
+extern uint8_t        *g_usb1_function_ConfigurationPtr[];
+#endif
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_ResetDCP
+* Description  : Initializes the default control pipe(DCP).
+* Outline      : Reset default control pipe
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_ResetDCP (void)
+{
+    USB201.DCPCFG  = 0;
+#if 0
+    USB201.DCPMAXP = g_usb1_function_DeviceDescriptor[7];
+#else
+    USB201.DCPMAXP = 64;
+#endif
+
+    USB201.CFIFOSEL  = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB201.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB201.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_ResetEP
+* Description  : Initializes the end point.
+* Arguments    : uint16_t num          ; Configuration Number
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_ResetEP (uint16_t num)
+{
+    uint16_t   pipe;
+    uint16_t   ep;
+    uint16_t   index;
+    uint16_t   buf;
+    uint16_t * tbl;
+
+    tbl = (uint16_t *)(g_usb1_function_EndPntPtr[num - 1]);
+
+    for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        if (g_usb1_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR)
+        {
+            index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb1_function_EPTableIndex[ep]);
+            pipe  = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE);
+
+            g_usb1_function_PipeTbl[pipe] = (uint16_t)(((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) |
+                                                         ep                                            |
+                                                        (tbl[index + 0] & USB_FUNCTION_FIFO_USE));
+
+            if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT)
+            {
+                tbl[index + 1] |= USB_FUNCTION_SHTNAKON;
+#ifdef  __USB_DMA_BFRE_ENABLE__
+                /* this routine cannnot be perfomred if read operation is executed in buffer size */
+                if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) ||
+                    ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA))
+                {
+                    tbl[index + 1] |= USB_FUNCTION_BFREON;
+                }
+#endif
+            }
+
+            /* Interrupt Disable */
+            buf  = USB201.BRDYENB;
+            buf &= (uint16_t)~g_usb1_function_bit_set[pipe];
+            USB201.BRDYENB = buf;
+            buf  = USB201.NRDYENB;
+            buf &= (uint16_t)~g_usb1_function_bit_set[pipe];
+            USB201.NRDYENB = buf;
+            buf  = USB201.BEMPENB;
+            buf &= (uint16_t)~g_usb1_function_bit_set[pipe];
+            USB201.BEMPENB = buf;
+
+            usb1_function_set_pid_nak(pipe);
+
+            /* CurrentPIPE Clear */
+            if (RZA_IO_RegRead_16(&USB201.CFIFOSEL,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB201.CFIFOSEL,
+                                    0,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB201.D0FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB201.D0FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB201.D1FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB201.D1FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            /* PIPE Configuration */
+            USB201.PIPESEL  = pipe;
+            USB201.PIPECFG  = tbl[index + 1];
+            USB201.PIPEBUF  = tbl[index + 2];
+            USB201.PIPEMAXP = tbl[index + 3];
+            USB201.PIPEPERI = tbl[index + 4];
+
+            g_usb1_function_pipecfg[pipe]  = tbl[index + 1];
+            g_usb1_function_pipebuf[pipe]  = tbl[index + 2];
+            g_usb1_function_pipemaxp[pipe] = tbl[index + 3];
+            g_usb1_function_pipeperi[pipe] = tbl[index + 4];
+
+            /* Buffer Clear */
+            usb1_function_set_sqclr(pipe);
+            usb1_function_aclrm(pipe);
+
+            /* init Global */
+            g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+            g_usb1_function_PipeDataSize[pipe] = 0;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_EpToPipe
+* Description  : Returns the pipe which end point specified by the argument is
+*              : allocated to.
+* Arguments    : uint16_t ep       ; Direction + Endpoint Number
+* Return Value : USB_FUNCTION_EP_ERROR         : Error
+*              : Others           : Pipe Number
+*******************************************************************************/
+uint16_t usb1_function_EpToPipe (uint16_t ep)
+{
+    uint16_t pipe;
+
+    for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((g_usb1_function_PipeTbl[pipe] & 0x00ff) == ep)
+        {
+            return pipe;
+        }
+    }
+
+    return USB_FUNCTION_EP_ERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_InitEPTable
+* Description  : Sets the end point by the Alternate setting value of the
+*              : configuration number and the interface number specified by the
+*              : argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+*              : uint16_t Alt_Num       ; Alternate Setting
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point_interface;
+    uint16_t   point_endpoint;
+    uint16_t   length;
+    uint16_t   start;
+    uint16_t   numbers;
+    uint16_t   endpoint;
+
+    ptr = (uint8_t *)g_usb1_function_ConfigurationPtr[Con_Num - 1];
+    point_interface = *ptr;
+    length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2));
+    ptr  += *ptr;
+    start   = 0;
+    numbers = 0;
+    point_endpoint = 0;
+
+    for (; point_interface < length;)
+    {
+        switch (*(ptr + 1))                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                     /* Interface */
+                if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num))
+                {
+                    numbers = *(ptr + 4);
+                }
+                else
+                {
+                    start  += *(ptr + 4);
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_ENDPOINT:                      /* Endpoint */
+                if (point_endpoint < numbers)
+                {
+                    endpoint = (uint16_t)(*(ptr + 2) & 0x0f);
+                    g_usb1_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint);
+                    ++point_endpoint;
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                        /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:                 /* Configuration */
+            case USB_FUNCTION_DT_STRING:                        /* String */
+            default:                                            /* Class, Vendor, else */
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_GetConfigNum
+* Description  : Returns the number of configuration referring to the number of
+*              : configuration described in the device descriptor.
+* Arguments    : none
+* Return Value : Number of possible configurations (bNumConfigurations).
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_GetConfigNum (void)
+{
+    return (uint16_t)g_usb1_function_DeviceDescriptor[17];
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_GetInterfaceNum
+* Description  : Returns the number of interface referring to the number of
+*              : interface described in the configuration descriptor.
+* Arguments    : uint16_t num       ; Configuration Number
+* Return Value : Number of this interface (bNumInterfaces).
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_GetInterfaceNum (uint16_t num)
+{
+    return (uint16_t)(*(g_usb1_function_ConfigurationPtr[num - 1] + 4));
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_GetAltNum
+* Description  : Returns the Alternate setting value of the configuration number
+*              : and the interface number specified by the argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+* Return Value : Value used to select this alternate setting(bAlternateSetting).
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point;
+    uint16_t   alt_num = 0;
+    uint16_t   length;
+
+    ptr = (uint8_t *)(g_usb1_function_ConfigurationPtr[Con_Num - 1]);
+    point = ptr[0];
+    ptr  += ptr[0];                                 /* InterfaceDescriptor[0] */
+    length  = (uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 2));
+    length |= (uint16_t)((uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8);
+
+    for (; point < length;)                                 /* Search Descriptor Table size */
+    {
+        switch (ptr[1])                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                 /* Interface */
+                if (Int_Num == ptr[2])
+                {
+                    alt_num = (uint16_t)ptr[3];             /* Alternate Number count */
+                }
+                point += ptr[0];
+                ptr += ptr[0];
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                    /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:             /* Configuration */
+            case USB_FUNCTION_DT_STRING:                    /* String */
+            case USB_FUNCTION_DT_ENDPOINT:                  /* Endpoint */
+            default:                                        /* Class, Vendor, else */
+                point += ptr[0];
+                ptr   += ptr[0];
+            break;
+        }
+    }
+    return alt_num;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_CheckRemoteWakeup
+* Description  : Returns the result of the remote wake up function is supported
+*              : or not referring to the configuration descriptor.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   Support Remote Wakeup
+*              : DEVDRV_USBF_OFF    :   not Support Remote Wakeup
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_CheckRemoteWakeup (void)
+{
+    uint8_t atr;
+
+    if (g_usb1_function_ConfigNum == 0)
+    {
+        return DEVDRV_USBF_OFF;
+    }
+
+    atr = *(g_usb1_function_ConfigurationPtr[g_usb1_function_ConfigNum - 1] + 7);
+
+    if (atr & USB_FUNCTION_CF_RWUP)
+    {
+        return DEVDRV_USBF_ON;
+    }
+
+    return DEVDRV_USBF_OFF;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_alt
+* Description  : Initializes the Alternate setting area.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_clear_alt (void)
+{
+    int i;
+
+    for (i = 0; i < USB_FUNCTION_ALT_NO; ++i)
+    {
+        g_usb1_function_Alternate[i] = 0;                           /* Alternate */
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_pipe_tbl
+* Description  : Initializes pipe definition table.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_pipe_tbl (void)
+{
+    int pipe;
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb1_function_PipeTbl[pipe] = 0;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_ep_table_index
+* Description  : Initializes the end point table index.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_clear_ep_table_index (void)
+{
+    int ep;
+
+    for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        g_usb1_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR;
+    }
+}
+#endif
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,698 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dmacdrv.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "rza_io_regrw.h"
+#include "usb1_function_dmacdrv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DMAC_INDEFINE   (255)       /* Macro definition when REQD bit is not used */
+
+/* ==== Request setting information for on-chip peripheral module ==== */
+typedef enum dmac_peri_req_reg_type
+{
+    DMAC_REQ_MID,
+    DMAC_REQ_RID,
+    DMAC_REQ_AM,
+    DMAC_REQ_LVL,
+    DMAC_REQ_REQD
+} dmac_peri_req_reg_type_t;
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+/* ==== Prototype declaration ==== */
+
+/* ==== Global variable ==== */
+/* On-chip peripheral module request setting table */
+static const uint8_t usb1_function_dmac_peri_req_init_table[8][5] =
+{
+    /* MID,RID,AM,LVL,REQD */
+    {32, 3, 2, 1, 1},    /* USB_0 channel 0 transmit FIFO empty */
+    {32, 3, 2, 1, 0},    /* USB_0 channel 0 receive FIFO full   */
+    {33, 3, 2, 1, 1},    /* USB_0 channel 1 transmit FIFO empty */
+    {33, 3, 2, 1, 0},    /* USB_0 channel 1 receive FIFO full   */
+    {34, 3, 2, 1, 1},    /* USB_1 channel 0 transmit FIFO empty */
+    {34, 3, 2, 1, 0},    /* USB_1 channel 0 receive FIFO full   */
+    {35, 3, 2, 1, 1},    /* USB_1 channel 1 transmit FIFO empty */
+    {35, 3, 2, 1, 0},    /* USB_1 channel 1 receive FIFO full   */
+};
+
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 1.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 1 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t *trans_info   : Setting information to DMAC register
+*              : uint32_t          dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t          continuation : Set continuous transfer to be valid
+*              :                                  after DMA transfer has been completed
+*              :             DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :             DMAC_SAMPLE_SINGLE       : Do not execute continuous transfer
+*              : uint32_t request_factor        : Factor for on-chip peripheral module request
+*              :             DMAC_REQ_OSTM0TINT       : OSTM_0 compare match
+*              :             DMAC_REQ_OSTM1TINT       : OSTM_1 compare match
+*              :             DMAC_REQ_TGI0A           : MTU2_0 input capture/compare match
+*              :                  :
+*              : uint32_t          req_direction: Setting value of CHCFG_n register REQD bit
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC3_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC3.N0SA_n = trans_info->src_addr;         /* Start address of transfer source      */
+        DMAC3.N0DA_n = trans_info->dst_addr;         /* Start address of transfer destination */
+        DMAC3.N0TB_n = trans_info->count;            /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC3_CHCFG_n_DAD_SHIFT,
+                            DMAC3_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC3_CHCFG_n_SAD_SHIFT,
+                            DMAC3_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC3_CHCFG_n_DDS_SHIFT,
+                            DMAC3_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC3_CHCFG_n_SDS_SHIFT,
+                            DMAC3_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_DMS_SHIFT,
+                            DMAC3_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_RSEL_SHIFT,
+                            DMAC3_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_SBE_SHIFT,
+                            DMAC3_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_DEM_SHIFT,
+                            DMAC3_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                1,
+                                DMAC3_CHCFG_n_REN_SHIFT,
+                                DMAC3_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                1,
+                                DMAC3_CHCFG_n_RSW_SHIFT,
+                                DMAC3_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                0,
+                                DMAC3_CHCFG_n_REN_SHIFT,
+                                DMAC3_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                0,
+                                DMAC3_CHCFG_n_RSW_SHIFT,
+                                DMAC3_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_TM_SHIFT,
+                            DMAC3_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            3,
+                            DMAC3_CHCFG_n_SEL_SHIFT,
+                            DMAC3_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            1,
+                            DMAC3_CHCFG_n_HIEN_SHIFT,
+                            DMAC3_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_LOEN_SHIFT,
+                            DMAC3_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC3_CHCFG_n_AM_SHIFT,
+                            DMAC3_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC3_CHCFG_n_LVL_SHIFT,
+                            DMAC3_CHCFG_n_LVL);
+
+        if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC3_CHCFG_n_REQD_SHIFT,
+                                DMAC3_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                req_direction,
+                                DMAC3_CHCFG_n_REQD_SHIFT,
+                                DMAC3_CHCFG_n_REQD);
+        }
+
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC23_DMARS_CH3_RID_SHIFT,
+                            DMAC23_DMARS_CH3_RID);
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC23_DMARS_CH3_MID_SHIFT,
+                            DMAC23_DMARS_CH3_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_Open
+* Description  : Enables DMAC channel 3 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb1_function_DMAC3_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_EN_SHIFT,
+                                DMAC3_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_TACT_SHIFT,
+                                DMAC3_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                            1,
+                            DMAC3_CHCTRL_n_SWRST_SHIFT,
+                            DMAC3_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC3.CHCTRL_n,
+                                DMAC3_CHCTRL_n_SWRST_SHIFT,
+                                DMAC3_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                            1,
+                            DMAC3_CHCTRL_n_SETEN_SHIFT,
+                            DMAC3_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                                1,
+                                DMAC3_CHCTRL_n_STG_SHIFT,
+                                DMAC3_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_Close
+* Description  : Aborts DMAC channel 3 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC3_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                        1,
+                        DMAC3_CHCTRL_n_CLREN_SHIFT,
+                        DMAC3_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_TACT_SHIFT,
+                                DMAC3_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_EN_SHIFT,
+                                DMAC3_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC3.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 3 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 3 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC3_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_SR_SHIFT,
+                                DMAC3_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC3.N0SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC3.N0DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC3.N0TB_n = count;       /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC3.N1SA_n = src_addr;     /* Start address of transfer source      */
+        DMAC3.N1DA_n = dst_addr;     /* Start address of transfer destination */
+        DMAC3.N1TB_n = count;        /* Total transfer byte count             */
+     }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 2.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 2 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t * trans_info : Setting information to DMAC
+*              :                               : register
+*              : uint32_t dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t continuation : Set continuous transfer to be valid
+*              :                       : after DMA transfer has been completed
+*              :         DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :         DMAC_SAMPLE_SINGLE       : Do not execute continuous
+*              :                                  : transfer
+*              : uint32_t request_factor : Factor for on-chip peripheral module
+*              :                         : request
+*              :         DMAC_REQ_OSTM0TINT : OSTM_0 compare match
+*              :         DMAC_REQ_OSTM1TINT : OSTM_1 compare match
+*              :         DMAC_REQ_TGI0A     : MTU2_0 input capture/compare match
+*              :                 :
+*              : uint32_t req_direction : Setting value of CHCFG_n register
+*              :                        : REQD bit
+*******************************************************************************/
+void usb1_function_DMAC4_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC4.N0SA_n = trans_info->src_addr;        /* Start address of transfer source      */
+        DMAC4.N0DA_n = trans_info->dst_addr;        /* Start address of transfer destination */
+        DMAC4.N0TB_n = trans_info->count;           /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC4_CHCFG_n_DAD_SHIFT,
+                            DMAC4_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC4_CHCFG_n_SAD_SHIFT,
+                            DMAC4_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC4_CHCFG_n_DDS_SHIFT,
+                            DMAC4_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC4_CHCFG_n_SDS_SHIFT,
+                            DMAC4_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_DMS_SHIFT,
+                            DMAC4_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_RSEL_SHIFT,
+                            DMAC4_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_SBE_SHIFT,
+                            DMAC4_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_DEM_SHIFT,
+                            DMAC4_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                1,
+                                DMAC4_CHCFG_n_REN_SHIFT,
+                                DMAC4_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                1,
+                                DMAC4_CHCFG_n_RSW_SHIFT,
+                                DMAC4_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                0,
+                                DMAC4_CHCFG_n_REN_SHIFT,
+                                DMAC4_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                0,
+                                DMAC4_CHCFG_n_RSW_SHIFT,
+                                DMAC4_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_TM_SHIFT,
+                            DMAC4_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            4,
+                            DMAC4_CHCFG_n_SEL_SHIFT,
+                            DMAC4_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            1,
+                            DMAC4_CHCFG_n_HIEN_SHIFT,
+                            DMAC4_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_LOEN_SHIFT,
+                            DMAC4_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC4_CHCFG_n_AM_SHIFT,
+                            DMAC4_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC4_CHCFG_n_LVL_SHIFT,
+                            DMAC4_CHCFG_n_LVL);
+        if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC4_CHCFG_n_REQD_SHIFT,
+                                DMAC4_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                req_direction,
+                                DMAC4_CHCFG_n_REQD_SHIFT,
+                                DMAC4_CHCFG_n_REQD);
+        }
+        RZA_IO_RegWrite_32(&DMAC45.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC45_DMARS_CH4_RID_SHIFT,
+                            DMAC45_DMARS_CH4_RID);
+        RZA_IO_RegWrite_32(&DMAC45.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC45_DMARS_CH4_MID_SHIFT,
+                            DMAC45_DMARS_CH4_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_Open
+* Description  : Enables DMAC channel 4 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb1_function_DMAC4_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t  dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_EN_SHIFT,
+                                DMAC4_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_TACT_SHIFT,
+                                DMAC4_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                            1,
+                            DMAC4_CHCTRL_n_SWRST_SHIFT,
+                            DMAC4_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC4.CHCTRL_n,
+                                DMAC4_CHCTRL_n_SWRST_SHIFT,
+                                DMAC4_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                            1,
+                            DMAC4_CHCTRL_n_SETEN_SHIFT,
+                            DMAC4_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                                1,
+                                DMAC4_CHCTRL_n_STG_SHIFT,
+                                DMAC4_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_Close
+* Description  : Aborts DMAC channel 4 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC4_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                        1,
+                        DMAC4_CHCTRL_n_CLREN_SHIFT,
+                        DMAC4_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_TACT_SHIFT,
+                                DMAC4_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_EN_SHIFT,
+                                DMAC4_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC4.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 4 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 4 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC4_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_SR_SHIFT,
+                                DMAC4_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC4.N0SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC4.N0DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC4.N0TB_n = count;       /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC4.N1SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC4.N1DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC4.N1TB_n = count;       /* Total transfer byte count             */
+     }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,762 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_userdef.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "devdrv_usb_function_api.h"
+#include "usb1_function_dmacdrv.h"  /* common DMAC driver for USB */
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DUMMY_ACCESS OSTM0CNT
+
+/* #define CACHE_WRITEBACK */
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern int32_t io_cwb(unsigned long start, unsigned long end);
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb1_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void usb1_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void Userdef_USB_usb1_function_delay_10us_2(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_d0fifo_dmaintid
+* Description  : get D0FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D0FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_d1fifo_dmaintid
+* Description  : get D1FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D1FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_attach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_attach (void)
+{
+    printf("\n");
+    printf("channel 1 attach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_detach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_detach (void)
+{
+    printf("\n");
+    printf("channel 1 detach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_1ms
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_1ms (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /*
+     * Wait 1ms (Please change for your MCU).
+     */
+    for (i = 0; i < 1440; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_xms
+* Description  : Wait for the software in the period of time specified by the
+*              : argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t msec ; Wait Time (msec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_xms (uint32_t msec)
+{
+    volatile unsigned short i;
+
+    for (i = 0; i < msec; ++i)
+    {
+        Userdef_USB_usb1_function_delay_1ms();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_10us
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t usec ; Wait Time(x 10usec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_10us (uint32_t usec)
+{
+    volatile int i;
+
+    /* Wait 10us (Please change for your MCU) */
+    for (i = 0; i < usec; ++i)
+    {
+        Userdef_USB_usb1_function_delay_10us_2();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_10us_2
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void Userdef_USB_usb1_function_delay_10us_2 (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 1us (Please change for your MCU) */
+    for (i = 0; i < 14; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_500ns
+* Description  : Wait for software for 500ns.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_500ns (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 500ns (Please change for your MCU) */
+    /* Wait 500ns I clock 266MHz */
+    tmp = DUMMY_ACCESS;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_start_dma
+* Description  : Enables DMA transfer on the information specified by the argument.
+*              : Set DMAC register by this function to enable DMA transfer.
+*              : After executing this function, USB module is set to start DMA
+*              : transfer. DMA transfer should not wait for DMA transfer complete.
+* Arguments    : USB_FUNCTION_DMA_t *dma   : DMA parameter
+*              :  typedef struct{
+*              :      uint32_t fifo;    FIFO for using
+*              :      uint32_t buffer;  Start address of transfer source/destination
+*              :      uint32_t bytes;   Transfer size(Byte)
+*              :      uint32_t dir;     Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer)
+*              :      uint32_t size;    DMA transfer size
+*              :   } USB_FUNCTION_DMA_t;
+*              : uint16_t dfacc ; 0 : cycle steal mode
+*              :                  1 : 16byte continuous mode
+*              :                  2 : 32byte continuous mode
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc)
+{
+    uint32_t trncount;
+    uint32_t src;
+    uint32_t dst;
+    uint32_t size;
+    uint32_t dir;
+#ifdef CACHE_WRITEBACK
+    uint32_t ptr;
+#endif
+
+    trncount = dma->bytes;
+    dir      = dma->dir;
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        /* DxFIFO determination */
+        dst = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            src = (uint32_t)(&USB201.D0FIFO.UINT32);
+        }
+        else
+        {
+            src = (uint32_t)(&USB201.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            src += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB201.D0FIFO.UINT32);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB201.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            src += 3;       /* byte access */
+        }
+#endif
+    }
+    else
+    {
+        /* DxFIFO determination */
+        src = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+        }
+        else
+        {
+            dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            dst += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            dst += 3;       /* byte access  */
+        }
+#endif
+    }
+
+#ifdef CACHE_WRITEBACK
+    ptr = (uint32_t)dma->buffer;
+
+    if ((ptr & 0x20000000ul) == 0)
+    {
+        io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount);
+    }
+#endif
+
+    if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+    {
+        usb1_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+    else
+    {
+        usb1_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_dmac0
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB1_DMA0_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB1_DMA0_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb1_function_DMAC3_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb1_function_DMAC3_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb1_function_DMAC3_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC3 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_dmac1
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB1_DMA1_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB1_DMA1_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb1_function_DMAC4_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb1_function_DMAC4_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb1_function_DMAC4_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC4 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_stop_dma0
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D0_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb1_function_stop_dma0 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb1_function_DMAC3_Close(&remain);
+
+    return remain;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_stop_dma1
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D1_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb1_function_stop_dma1 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb1_function_DMAC4_Close(&remain);
+
+    return remain;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb_function_setting.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,173 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2014 - 2015 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+
+#ifndef USB_FUNCTION_SETTING_H
+#define USB_FUNCTION_SETTING_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define USB_FUNCTION_CH                       0
+#define USB_FUNCTION_HISPEED                  1
+
+#if (USB_FUNCTION_CH == 0)
+#include "usb0_function.h"
+#define USB20X                                USB200
+#define USBIX_IRQn                            USBI0_IRQn
+#define g_usbx_function_bit_set               g_usb0_function_bit_set
+#define g_usbx_function_PipeDataSize          g_usb0_function_PipeDataSize
+#define g_usbx_function_data_count            g_usb0_function_data_count
+#define g_usbx_function_PipeTbl               g_usb0_function_PipeTbl
+#define g_usbx_function_DmaStatus             g_usb0_function_DmaStatus
+#define g_usbx_function_pipecfg               g_usb0_function_pipecfg
+#define g_usbx_function_pipe_status           g_usb0_function_pipe_status
+#define g_usbx_function_data_pointer          g_usb0_function_data_pointer
+#define g_usbx_function_pipebuf               g_usb0_function_pipebuf
+#define g_usbx_function_pipemaxp              g_usb0_function_pipemaxp
+#define g_usbx_function_pipeperi              g_usb0_function_pipeperi
+#define g_usbx_function_TestModeFlag          g_usb0_function_TestModeFlag
+#define usbx_function_BRDYInterruptPIPE0      usb0_function_BRDYInterruptPIPE0
+#define usbx_function_BRDYInterrupt           usb0_function_BRDYInterrupt
+#define usbx_function_NRDYInterruptPIPE0      usb0_function_NRDYInterruptPIPE0
+#define usbx_function_NRDYInterrupt           usb0_function_NRDYInterrupt
+#define usbx_function_BEMPInterruptPIPE0      usb0_function_BEMPInterruptPIPE0
+#define usbx_function_BEMPInterrupt           usb0_function_BEMPInterrupt
+#define usbx_function_read_buffer_c           usb0_function_read_buffer_c
+#define usbx_function_set_pid_buf             usb0_function_set_pid_buf
+#define usbx_function_disable_brdy_int        usb0_function_disable_brdy_int
+#define usbx_function_set_pid_stall           usb0_function_set_pid_stall
+#define usbx_function_dma_interrupt_d0fifo    usb0_function_dma_interrupt_d0fifo
+#define usbx_function_read_dma                usb0_function_read_dma
+#define usbx_function_dma_interrupt_d1fifo    usb0_function_dma_interrupt_d1fifo
+#define usbx_function_write_buffer            usb0_function_write_buffer
+#define usbx_function_set_pid_nak             usb0_function_set_pid_nak
+#define usbx_function_get_mbw                 usb0_function_get_mbw
+#define usbx_function_set_curpipe             usb0_function_set_curpipe
+#define usbx_function_aclrm                   usb0_function_aclrm
+#define usbx_function_enable_nrdy_int         usb0_function_enable_nrdy_int
+#define usbx_function_enable_brdy_int         usb0_function_enable_brdy_int
+#define usbx_function_get_pid                 usb0_function_get_pid
+#define usbx_function_get_inbuf               usb0_function_get_inbuf
+#define usbx_function_disable_bemp_int        usb0_function_disable_bemp_int
+#define usbx_function_EpToPipe                usb0_function_EpToPipe
+#define usbx_function_clear_pipe_tbl          usb0_function_clear_pipe_tbl
+#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb0_function_d0fifo_dmaintid
+#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb0_function_d1fifo_dmaintid
+#define usbx_function_reset_module            usb0_function_reset_module
+#define usbx_function_init_status             usb0_function_init_status
+#define usbx_function_InitModule              usb0_function_InitModule
+#define usbx_function_clear_alt               usb0_function_clear_alt
+#define usbx_function_set_sqclr               usb0_function_set_sqclr
+#define usbx_api_function_CtrlWriteStart      usb0_api_function_CtrlWriteStart
+#define usbx_api_function_CtrlReadStart       usb0_api_function_CtrlReadStart
+#define usbx_function_write_buffer_c          usb0_function_write_buffer_c
+#define usbx_api_function_check_pipe_status   usb0_api_function_check_pipe_status
+#define usbx_api_function_set_pid_nak         usb0_api_function_set_pid_nak
+#define usbx_api_function_clear_pipe_status   usb0_api_function_clear_pipe_status
+#define usbx_api_function_start_receive_transfer usb0_api_function_start_receive_transfer
+#define usbx_function_read_buffer             usb0_function_read_buffer
+#define usbx_api_function_start_send_transfer usb0_api_function_start_send_transfer
+#define usbx_function_stop_transfer           usb0_function_stop_transfer
+#define usbx_function_clear_pid_stall         usb0_function_clear_pid_stall
+#define usbx_function_CheckVBUStaus           usb0_function_CheckVBUStaus
+#define usbx_function_USB_FUNCTION_Attach     usb0_function_USB_FUNCTION_Attach
+#define usbx_function_USB_FUNCTION_Detach     usb0_function_USB_FUNCTION_Detach
+#define usbx_function_is_hispeed              usb0_function_is_hispeed
+#define usbx_function_ResetDescriptor         usb0_function_ResetDescriptor
+#define usbx_function_USB_FUNCTION_Suspend    usb0_function_USB_FUNCTION_Suspend
+#define usbx_function_USB_FUNCTION_TestMode   usb0_function_USB_FUNCTION_TestMode
+#else
+#include "usb1_function.h"
+#define USB20X                                USB201
+#define USBIX_IRQn                            USBI1_IRQn
+#define g_usbx_function_bit_set               g_usb1_function_bit_set
+#define g_usbx_function_PipeDataSize          g_usb1_function_PipeDataSize
+#define g_usbx_function_data_count            g_usb1_function_data_count
+#define g_usbx_function_PipeTbl               g_usb1_function_PipeTbl
+#define g_usbx_function_DmaStatus             g_usb1_function_DmaStatus
+#define g_usbx_function_pipecfg               g_usb1_function_pipecfg
+#define g_usbx_function_pipe_status           g_usb1_function_pipe_status
+#define g_usbx_function_data_pointer          g_usb1_function_data_pointer
+#define g_usbx_function_pipebuf               g_usb1_function_pipebuf
+#define g_usbx_function_pipemaxp              g_usb1_function_pipemaxp
+#define g_usbx_function_pipeperi              g_usb1_function_pipeperi
+#define g_usbx_function_TestModeFlag          g_usb1_function_TestModeFlag
+#define usbx_function_BRDYInterruptPIPE0      usb1_function_BRDYInterruptPIPE0
+#define usbx_function_BRDYInterrupt           usb1_function_BRDYInterrupt
+#define usbx_function_NRDYInterruptPIPE0      usb1_function_NRDYInterruptPIPE0
+#define usbx_function_NRDYInterrupt           usb1_function_NRDYInterrupt
+#define usbx_function_BEMPInterruptPIPE0      usb1_function_BEMPInterruptPIPE0
+#define usbx_function_BEMPInterrupt           usb1_function_BEMPInterrupt
+#define usbx_function_read_buffer_c           usb1_function_read_buffer_c
+#define usbx_function_set_pid_buf             usb1_function_set_pid_buf
+#define usbx_function_disable_brdy_int        usb1_function_disable_brdy_int
+#define usbx_function_set_pid_stall           usb1_function_set_pid_stall
+#define usbx_function_dma_interrupt_d0fifo    usb1_function_dma_interrupt_d0fifo
+#define usbx_function_read_dma                usb1_function_read_dma
+#define usbx_function_dma_interrupt_d1fifo    usb1_function_dma_interrupt_d1fifo
+#define usbx_function_write_buffer            usb1_function_write_buffer
+#define usbx_function_set_pid_nak             usb1_function_set_pid_nak
+#define usbx_function_get_mbw                 usb1_function_get_mbw
+#define usbx_function_set_curpipe             usb1_function_set_curpipe
+#define usbx_function_aclrm                   usb1_function_aclrm
+#define usbx_function_enable_nrdy_int         usb1_function_enable_nrdy_int
+#define usbx_function_enable_brdy_int         usb1_function_enable_brdy_int
+#define usbx_function_get_pid                 usb1_function_get_pid
+#define usbx_function_get_inbuf               usb1_function_get_inbuf
+#define usbx_function_disable_bemp_int        usb1_function_disable_bemp_int
+#define usbx_function_EpToPipe                usb1_function_EpToPipe
+#define usbx_function_clear_pipe_tbl          usb1_function_clear_pipe_tbl
+#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb1_function_d0fifo_dmaintid
+#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb1_function_d1fifo_dmaintid
+#define usbx_function_reset_module            usb1_function_reset_module
+#define usbx_function_init_status             usb1_function_init_status
+#define usbx_function_InitModule              usb1_function_InitModule
+#define usbx_function_clear_alt               usb1_function_clear_alt
+#define usbx_function_set_sqclr               usb1_function_set_sqclr
+#define usbx_api_function_CtrlWriteStart      usb1_api_function_CtrlWriteStart
+#define usbx_api_function_CtrlReadStart       usb1_api_function_CtrlReadStart
+#define usbx_function_write_buffer_c          usb1_function_write_buffer_c
+#define usbx_api_function_check_pipe_status   usb1_api_function_check_pipe_status
+#define usbx_api_function_set_pid_nak         usb1_api_function_set_pid_nak
+#define usbx_api_function_clear_pipe_status   usb1_api_function_clear_pipe_status
+#define usbx_api_function_start_receive_transfer usb1_api_function_start_receive_transfer
+#define usbx_function_read_buffer             usb1_function_read_buffer
+#define usbx_api_function_start_send_transfer usb1_api_function_start_send_transfer
+#define usbx_function_stop_transfer           usb1_function_stop_transfer
+#define usbx_function_clear_pid_stall         usb1_function_clear_pid_stall
+#define usbx_function_CheckVBUStaus           usb1_function_CheckVBUStaus
+#define usbx_function_USB_FUNCTION_Attach     usb1_function_USB_FUNCTION_Attach
+#define usbx_function_USB_FUNCTION_Detach     usb1_function_USB_FUNCTION_Detach
+#define usbx_function_is_hispeed              usb1_function_is_hispeed
+#define usbx_function_ResetDescriptor         usb1_function_ResetDescriptor
+#define usbx_function_USB_FUNCTION_Suspend    usb1_function_USB_FUNCTION_Suspend
+#define usbx_function_USB_FUNCTION_TestMode   usb1_function_USB_FUNCTION_TestMode
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* USB_FUNCTION_SETTING_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/devdrv_usb_function_api.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,365 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : devdrv_usb_function_api.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB_FUNCTION_API_H
+#define USB_FUNCTION_API_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <VKRZA1H.h>
+#include "r_typedefs.h"
+#include "usb0_function_api.h"
+#include "usb1_function_api.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+typedef struct
+{
+    uint32_t fifo;
+    uint32_t buffer;
+    uint32_t bytes;
+    uint32_t dir;
+    uint32_t size;
+} USB_FUNCTION_DMA_t;
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define USBFCLOCK_X1_48MHZ                          (0x0000u)       /* USB_X1_48MHz */
+#define USBFCLOCK_EXTAL_12MHZ                       (0x0004u)       /* EXTAL_12MHz  */
+
+#define DEVDRV_USBF_ON                              (1)
+#define DEVDRV_USBF_OFF                             (0)
+#define DEVDRV_USBF_YES                             (1)
+#define DEVDRV_USBF_NO                              (0)
+
+#define DEVDRV_USBF_STALL                           (-2)
+
+#define DEVDRV_USBF_WRITEEND                        (0)
+#define DEVDRV_USBF_WRITESHRT                       (1)
+#define DEVDRV_USBF_WRITING                         (2)
+#define DEVDRV_USBF_WRITEDMA                        (3)
+
+#define DEVDRV_USBF_FIFOERROR                       (0xffff)
+
+#define DEVDRV_USBF_PIPE_IDLE                       (0x00)
+#define DEVDRV_USBF_PIPE_WAIT                       (0x01)
+#define DEVDRV_USBF_PIPE_DONE                       (0x02)
+#define DEVDRV_USBF_PIPE_NORES                      (0x03)
+#define DEVDRV_USBF_PIPE_STALL                      (0x04)
+
+#define DEVDRV_USBF_PID_NAK                         (0x0000u)
+#define DEVDRV_USBF_PID_BUF                         (0x0001u)
+#define DEVDRV_USBF_PID_STALL                       (0x0002u)
+#define DEVDRV_USBF_PID_STALL2                      (0x0003u)
+
+#define USB_FUNCTION_NON_SPEED                      (0)
+#define USB_FUNCTION_LOW_SPEED                      (1)
+#define USB_FUNCTION_FULL_SPEED                     (2)
+#define USB_FUNCTION_HIGH_SPEED                     (3)
+
+#define USB_FUNCTION_READEND                        (0)
+#define USB_FUNCTION_READSHRT                       (1)
+#define USB_FUNCTION_READING                        (2)
+#define USB_FUNCTION_READOVER                       (3)
+#define USB_FUNCTION_READZERO                       (4)
+
+#define USB_FUNCTION_MAX_PIPE_NO                    (15u)
+#define USB_FUNCTION_PIPE0                          (0)
+#define USB_FUNCTION_PIPE1                          (1)
+#define USB_FUNCTION_PIPE2                          (2)
+#define USB_FUNCTION_PIPE3                          (3)
+#define USB_FUNCTION_PIPE4                          (4)
+#define USB_FUNCTION_PIPE5                          (5)
+#define USB_FUNCTION_PIPE6                          (6)
+#define USB_FUNCTION_PIPE7                          (7)
+#define USB_FUNCTION_PIPE8                          (8)
+#define USB_FUNCTION_PIPE9                          (9)
+#define USB_FUNCTION_PIPEA                          (10)
+#define USB_FUNCTION_PIPEB                          (11)
+#define USB_FUNCTION_PIPEC                          (12)
+#define USB_FUNCTION_PIPED                          (13)
+#define USB_FUNCTION_PIPEE                          (14)
+#define USB_FUNCTION_PIPEF                          (15)
+
+#define USB_FUNCTION_ISO                            (0xc000u)
+#define USB_FUNCTION_INTERRUPT                      (0x8000u)
+#define USB_FUNCTION_BULK                           (0x4000u)
+
+#define USB_FUNCTION_NONE                           (0x0000u)
+#define USB_FUNCTON_BFREFIELD                       (0x0400u)
+#define USB_FUNCTION_BFREON                         (0x0400u)
+#define USB_FUNCTION_BFREOFF                        (0x0000u)
+#define USB_FUNCTION_DBLBFIELD                      (0x0200u)
+#define USB_FUNCTION_DBLBON                         (0x0200u)
+#define USB_FUNCTION_DBLBOFF                        (0x0000u)
+#define USB_FUNCTION_CNTMDFIELD                     (0x0100u)
+#define USB_FUNCTION_CNTMDON                        (0x0100u)
+#define USB_FUNCTION_CNTMDOFF                       (0x0000u)
+#define USB_FUNCTION_SHTNAKON                       (0x0080u)
+#define USB_FUNCTION_SHTNAKOFF                      (0x0000u)
+#define USB_FUNCTION_DIRFIELD                       (0x0010u)
+#define USB_FUNCTION_DIR_P_OUT                      (0x0000u)
+#define USB_FUNCTION_DIR_P_IN                       (0x0010u)
+#define USB_FUNCTION_EPNUMFIELD                     (0x000fu)
+#define USB_FUNCTION_MAX_EP_NO                      (15u)
+#define USB_FUNCTION_EP0                            (0u)
+#define USB_FUNCTION_EP1                            (1u)
+#define USB_FUNCTION_EP2                            (2u)
+#define USB_FUNCTION_EP3                            (3u)
+#define USB_FUNCTION_EP4                            (4u)
+#define USB_FUNCTION_EP5                            (5u)
+#define USB_FUNCTION_EP6                            (6u)
+#define USB_FUNCTION_EP7                            (7u)
+#define USB_FUNCTION_EP8                            (8u)
+#define USB_FUNCTION_EP9                            (9u)
+#define USB_FUNCTION_EP10                           (10u)
+#define USB_FUNCTION_EP11                           (11u)
+#define USB_FUNCTION_EP12                           (12u)
+#define USB_FUNCTION_EP13                           (13u)
+#define USB_FUNCTION_EP14                           (14u)
+#define USB_FUNCTION_EP15                           (15u)
+
+#define USB_FUNCTION_EPTABLE_LENGTH                 (5u)
+
+#define USB_FUNCTION_CUSE                           (0)
+#define USB_FUNCTION_D0USE                          (1)
+#define USB_FUNCTION_D0DMA                          (2)
+#define USB_FUNCTION_D1USE                          (3)
+#define USB_FUNCTION_D1DMA                          (4)
+
+#define USB_FUNCTION_CFIFO_USE                      (0x0000)
+#define USB_FUNCTION_D0FIFO_USE                     (0x1000)
+#define USB_FUNCTION_D1FIFO_USE                     (0x2000)
+#define USB_FUNCTION_D0FIFO_DMA                     (0x5000)
+#define USB_FUNCTION_D1FIFO_DMA                     (0x6000)
+
+#define USB_FUNCTION_BUF2FIFO                       (0)
+#define USB_FUNCTION_FIFO2BUF                       (1)
+
+#define USB_FUNCTION_DVST_POWERED                   (0x0001)
+#define USB_FUNCTION_DVST_DEFAULT                   (0x0002)
+#define USB_FUNCTION_DVST_ADDRESS                   (0x0003)
+#define USB_FUNCTION_DVST_CONFIGURED                (0x0004)
+#define USB_FUNCTION_DVST_SUSPEND                   (0x0005)
+#define USB_FUNCTION_DVST_CONFIGURED_SUSPEND        (0x0006)
+
+#define USB_FUNCTION_FUNCTION_TEST_SELECT           (0xff00u)
+#define USB_FUNCTION_FUNCTION_TEST_J                (0x0100u)
+#define USB_FUNCTION_FUNCTION_TEST_K                (0x0200u)
+#define USB_FUNCTION_FUNCTION_TEST_SE0_NAK          (0x0300u)
+#define USB_FUNCTION_FUNCTION_TEST_PACKET           (0x0400u)
+#define USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE     (0x0500u)
+#define USB_FUNCTION_FUNCTION_TEST_STSelectors      (0x0600u)
+#define USB_FUNCTION_FUNCTION_TEST_Reserved         (0x4000u)
+#define USB_FUNCTION_FUNCTION_TEST_VSTModes         (0xc000u)
+
+#define USB_FUNCTION_DT_TYPE                        (0xff00u)
+#define USB_FUNCTION_DT_INDEX                       (0xff)
+#define USB_FUNCTION_DT_DEVICE                      (0x01)
+#define USB_FUNCTION_DT_CONFIGURATION               (0x02)
+#define USB_FUNCTION_DT_STRING                      (0x03)
+#define USB_FUNCTION_DT_INTERFACE                   (0x04)
+#define USB_FUNCTION_DT_ENDPOINT                    (0x05)
+#define USB_FUNCTION_DT_DEVICE_QUALIFIER            (0x06)
+#define USB_FUNCTION_DT_OTHER_SPEED_CONFIGURATION   (0x07)
+#define USB_FUNCTION_DT_INTERFACE_POWER             (0x08)
+
+#define USB_FUNCTION_CF_RESERVED                    (0x80)
+#define USB_FUNCTION_CF_SELF                        (0x40)
+#define USB_FUNCTION_CF_RWUP                        (0x20)
+#define USB_FUNCTION_CF_NORWUP                      (0x00)
+#define USB_FUNCTION_EP_ERROR                       (0xff)
+
+#define USB_FUNCTION_EP_OUT                         (0x00)
+#define USB_FUNCTION_EP_IN                          (0x80)
+#define USB_FUNCTION_EP_CNTRL                       (0x00)
+#define USB_FUNCTION_EP_ISO                         (0x01)
+#define USB_FUNCTION_EP_BULK                        (0x02)
+#define USB_FUNCTION_EP_INT                         (0x03)
+
+#define USB_FUNCTION_STANDARD_REQUEST               (0x0000u)
+#define USB_FUNCTION_CLASS_REQUEST                  (0x0020u)
+#define USB_FUNCTION_VENDOR_REQUEST                 (0x0040u)
+#define USB_FUNCTION_DEVICE_REQUEST                 (0x0000u)
+#define USB_FUNCTION_INTERFACE_REQUEST              (0x0001u)
+#define USB_FUNCTION_ENDPOINT_REQUEST               (0x0002u)
+
+#define USB_FUNCTION_GETSTATUS_BUSPOWERD            (0x0000u)
+#define USB_FUNCTION_GETSTATUS_SELFPOWERD           (0x0001u)
+#define USB_FUNCTION_GETSTATUS_REMOTEWAKEUP         (0x0002u)
+#define USB_FUNCTION_GETSTATUS_NOTHALT              (0x0000u)
+#define USB_FUNCTION_GETSTATUS_HALT                 (0x0001u)
+
+#define USB_FUNCTION_FEATURE_ENDPOINT_HALT          (0x0000u)
+#define USB_FUNCTION_FEATURE_REMOTE_WAKEUP          (0x0001u)
+#define USB_FUNCTION_FEATURE_TEST_MODE              (0x0002u)
+
+#define USB_FUNCTION_bRequest                       (0xff00u)       /* b15-8:bRequest */
+#define USB_FUNCTION_bmRequestType                  (0x00ffu)       /* b7-0: bmRequestType */
+#define USB_FUNCTION_bmRequestTypeDir               (0x0080u)       /* b7  : Data transfer direction */
+#define USB_FUNCTION_bmRequestTypeType              (0x0060u)       /* b6-5: Type */
+#define USB_FUNCTION_bmRequestTypeRecip             (0x001fu)       /* b4-0: Recipient */
+
+
+/*******************************************************************************
+Variable Externs
+*******************************************************************************/
+
+
+/*******************************************************************************
+Functions Prototypes
+*******************************************************************************/
+#if 0
+void     R_USB_api_function_init(uint16_t root, uint8_t int_level, uint16_t mode, uint16_t clockmode);
+uint16_t R_USB_api_function_IsConfigured(uint16_t root);
+uint16_t R_USB_api_function_CtrlReadStart(uint16_t root, uint32_t size, uint8_t *data);
+void     R_USB_api_function_CtrlWriteStart(uint16_t root, uint32_t size, uint8_t *data);
+uint16_t R_USB_api_function_start_send_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t R_USB_api_function_check_pipe_status(uint16_t root, uint16_t pipe, uint32_t *size);
+void     R_USB_api_function_clear_pipe_status(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_start_receive_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data);
+void     R_USB_api_function_set_pid_buf(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_pid_nak(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_pid_stall(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_clear_pid_stall(uint16_t root, uint16_t pipe);
+uint16_t R_USB_api_function_get_pid(uint16_t root, uint16_t pipe);
+int32_t  R_USB_api_function_check_stall(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_sqclr(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_sqset(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_csclr(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_set_curpipe(uint16_t root, uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     R_USB_api_function_clear_brdy_sts(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_clear_bemp_sts(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_clear_nrdy_sts(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_enable_brdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_disable_brdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_enable_bemp_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_disable_bemp_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_enable_nrdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_disable_nrdy_int(uint16_t root, uint16_t pipe);
+void     R_USB_api_function_stop_transfer(uint16_t root, uint16_t pipe);
+#endif
+
+#ifdef USB0_FUNCTION_API_H
+void     usb0_function_interrupt(uint32_t int_sense);
+void     usb0_function_dma_interrupt_d0fifo(uint32_t int_sense);
+void     usb0_function_dma_interrupt_d1fifo(uint32_t int_sense);
+
+void     usb0_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_ResetDescriptor(uint16_t mode);
+
+IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid(void);
+IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid(void);
+void     Userdef_USB_usb0_function_attach(void);
+void     Userdef_USB_usb0_function_detach(void);
+void     Userdef_USB_usb0_function_delay_1ms(void);
+void     Userdef_USB_usb0_function_delay_xms(uint32_t msec);
+void     Userdef_USB_usb0_function_delay_10us(uint32_t usec);
+void     Userdef_USB_usb0_function_delay_500ns(void);
+void     Userdef_USB_usb0_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc);
+uint32_t Userdef_USB_usb0_function_stop_dma0(void);
+uint32_t Userdef_USB_usb0_function_stop_dma1(void);
+
+void     usb0_function_stop_transfer(uint16_t pipe);
+void     usb0_function_enable_brdy_int(uint16_t pipe);
+void     usb0_function_disable_brdy_int(uint16_t pipe);
+void     usb0_function_enable_bemp_int(uint16_t pipe);
+void     usb0_function_disable_bemp_int(uint16_t pipe);
+void     usb0_function_enable_nrdy_int(uint16_t pipe);
+void     usb0_function_disable_nrdy_int(uint16_t pipe);
+#endif
+
+#ifdef  USB1_FUNCTION_API_H
+void     usb1_function_interrupt(uint32_t int_sense);
+void     usb1_function_dma_interrupt_d0fifo(uint32_t int_sense);
+void     usb1_function_dma_interrupt_d1fifo(uint32_t int_sense);
+
+void     usb1_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_ResetDescriptor(uint16_t mode);
+
+IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid(void);
+IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid(void);
+void     Userdef_USB_usb1_function_attach(void);
+void     Userdef_USB_usb1_function_detach(void);
+void     Userdef_USB_usb1_function_delay_1ms(void);
+void     Userdef_USB_usb1_function_delay_xms(uint32_t msec);
+void     Userdef_USB_usb1_function_delay_10us(uint32_t usec);
+void     Userdef_USB_usb1_function_delay_500ns(void);
+void     Userdef_USB_usb1_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc);
+uint32_t Userdef_USB_usb1_function_stop_dma0(void);
+uint32_t Userdef_USB_usb1_function_stop_dma1(void);
+
+void     usb1_function_stop_transfer(uint16_t pipe);
+void     usb1_function_enable_brdy_int(uint16_t pipe);
+void     usb1_function_disable_brdy_int(uint16_t pipe);
+void     usb1_function_enable_bemp_int(uint16_t pipe);
+void     usb1_function_disable_bemp_int(uint16_t pipe);
+void     usb1_function_enable_nrdy_int(uint16_t pipe);
+void     usb1_function_disable_nrdy_int(uint16_t pipe);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* USB_FUNCTION_API_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,143 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb_function.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB_FUNCTION_H
+#define USB_FUNCTION_H
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "rza_io_regrw.h"
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define USB_FUNCTION_ALT_NO         (255)
+#define USB_FUNCTION_ALT_SET        (0xff)
+
+#define USB_FUNCTION_BITUPLLE       (0x0002u)
+#define USB_FUNCTION_BITUCKSEL      (0x0004u)
+#define USB_FUNCTION_BITBWAIT       (0x003fu)
+
+#define USB_FUNCTION_BUSWAIT_02     (0x0000u)
+#define USB_FUNCTION_BUSWAIT_03     (0x0001u)
+#define USB_FUNCTION_BUSWAIT_04     (0x0002u)
+#define USB_FUNCTION_BUSWAIT_05     (0x0003u)
+#define USB_FUNCTION_BUSWAIT_06     (0x0004u)
+#define USB_FUNCTION_BUSWAIT_07     (0x0005u)
+#define USB_FUNCTION_BUSWAIT_08     (0x0006u)
+#define USB_FUNCTION_BUSWAIT_09     (0x0007u)
+#define USB_FUNCTION_BUSWAIT_10     (0x0008u)
+#define USB_FUNCTION_BUSWAIT_11     (0x0009u)
+#define USB_FUNCTION_BUSWAIT_12     (0x000au)
+#define USB_FUNCTION_BUSWAIT_13     (0x000bu)
+#define USB_FUNCTION_BUSWAIT_14     (0x000cu)
+#define USB_FUNCTION_BUSWAIT_15     (0x000du)
+#define USB_FUNCTION_BUSWAIT_16     (0x000eu)
+#define USB_FUNCTION_BUSWAIT_17     (0x000fu)
+
+#define USB_FUNCTION_BITRESUME      (0x0020u)
+#define USB_FUNCTION_BITUACT        (0x0010u)
+#define USB_FUNCTION_HSPROC         (0x0004u)
+#define USB_FUNCTION_HSMODE         (0x0003u)
+#define USB_FUNCTION_FSMODE         (0x0002u)
+#define USB_FUNCTION_LSMODE         (0x0001u)
+#define USB_FUNCTION_UNDECID        (0x0000u)
+
+#define USB_FUNCTION_BITRCNT        (0x8000u)
+#define USB_FUNCTION_BITDREQE       (0x1000u)
+#define USB_FUNCTION_BITMBW         (0x0c00u)
+#define USB_FUNCTION_BITMBW_8       (0x0000u)
+#define USB_FUNCTION_BITMBW_16      (0x0400u)
+#define USB_FUNCTION_BITMBW_32      (0x0800u)
+#define USB_FUNCTION_BITBYTE_LITTLE (0x0000u)
+#define USB_FUNCTION_BITBYTE_BIG    (0x0100u)
+#define USB_FUNCTION_BITISEL        (0x0020u)
+#define USB_FUNCTION_BITCURPIPE     (0x000fu)
+
+#define USB_FUNCTION_CFIFO_READ     (0x0000u)
+#define USB_FUNCTION_CFIFO_WRITE    (0x0020u)
+
+#define USB_FUNCTION_BITBVAL        (0x8000u)
+#define USB_FUNCTION_BITBCLR        (0x4000u)
+#define USB_FUNCTION_BITFRDY        (0x2000u)
+#define USB_FUNCTION_BITDTLN        (0x0fffu)
+
+#define USB_FUNCTION_BITVBSE        (0x8000u)
+#define USB_FUNCTION_BITRSME        (0x4000u)
+#define USB_FUNCTION_BITSOFE        (0x2000u)
+#define USB_FUNCTION_BITDVSE        (0x1000u)
+#define USB_FUNCTION_BITCTRE        (0x0800u)
+#define USB_FUNCTION_BITVBINT       (0x8000u)
+#define USB_FUNCTION_BITRESM        (0x4000u)
+#define USB_FUNCTION_BITSOFR        (0x2000u)
+#define USB_FUNCTION_BITDVST        (0x1000u)
+#define USB_FUNCTION_BITCTRT        (0x0800u)
+
+#define USB_FUNCTION_BITBEMPE       (0x0400u)
+#define USB_FUNCTION_BITNRDYE       (0x0200u)
+#define USB_FUNCTION_BITBRDYE       (0x0100u)
+#define USB_FUNCTION_BITBEMP        (0x0400u)
+#define USB_FUNCTION_BITNRDY        (0x0200u)
+#define USB_FUNCTION_BITBRDY        (0x0100u)
+
+#define USB_FUNCTION_BITDVSQ        (0x0070u)
+#define USB_FUNCTION_BITDVSQS       (0x0030u)
+#define USB_FUNCTION_DS_SPD_CNFG    (0x0070u)
+#define USB_FUNCTION_DS_SPD_ADDR    (0x0060u)
+#define USB_FUNCTION_DS_SPD_DFLT    (0x0050u)
+#define USB_FUNCTION_DS_SPD_POWR    (0x0040u)
+#define USB_FUNCTION_DS_CNFG        (0x0030u)
+#define USB_FUNCTION_DS_ADDS        (0x0020u)
+#define USB_FUNCTION_DS_DFLT        (0x0010u)
+#define USB_FUNCTION_DS_POWR        (0x0000u)
+#define USB_FUNCTION_BITVALID       (0x0008u)
+#define USB_FUNCTION_BITCTSQ        (0x0007u)
+#define USB_FUNCTION_CS_SQER        (0x0006u)
+#define USB_FUNCTION_CS_WRND        (0x0005u)
+#define USB_FUNCTION_CS_WRSS        (0x0004u)
+#define USB_FUNCTION_CS_WRDS        (0x0003u)
+#define USB_FUNCTION_CS_RDSS        (0x0002u)
+#define USB_FUNCTION_CS_RDDS        (0x0001u)
+#define USB_FUNCTION_CS_IDST        (0x0000u)
+
+#define USB_FUNCTION_PIPExBUF       (64u)
+
+#define USB_FUNCTION_D0FIFO         (0)
+#define USB_FUNCTION_D1FIFO         (1)
+#define USB_FUNCTION_DMA_READY      (0)
+#define USB_FUNCTION_DMA_BUSY       (1)
+#define USB_FUNCTION_DMA_BUSYEND    (2)
+
+#define USB_FUNCTION_FIFO_USE       (0x7000)
+
+#endif /* USB_FUNCTION_FUNCTION_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function_version.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,32 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb_function_version.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+
+#define USB_FUNCTION_LOCAL_Rev  "VER080_140709"
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,171 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB0_FUNCTION_H
+#define USB0_FUNCTION_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "devdrv_usb_function_api.h"
+#include "usb_function.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern const uint16_t       g_usb0_function_bit_set[];
+extern uint32_t             g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint8_t              *g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+extern uint16_t             g_usb0_function_PipeIgnore[];
+extern uint16_t             g_usb0_function_PipeTbl[];
+extern uint16_t             g_usb0_function_pipe_status[];
+extern uint32_t             g_usb0_function_PipeDataSize[];
+
+extern USB_FUNCTION_DMA_t   g_usb0_function_DmaInfo[];
+extern uint16_t             g_usb0_function_DmaPipe[];
+extern uint16_t             g_usb0_function_DmaBval[];
+extern uint16_t             g_usb0_function_DmaStatus[];
+
+extern uint16_t             g_usb0_function_CtrZeroLengthFlag;
+
+extern uint16_t             g_usb0_function_ConfigNum;
+extern uint16_t             g_usb0_function_Alternate[USB_FUNCTION_ALT_NO];
+extern uint16_t             g_usb0_function_RemoteWakeupFlag;
+extern uint16_t             g_usb0_function_TestModeFlag;
+extern uint16_t             g_usb0_function_TestModeSelectors;
+
+extern uint16_t             g_usb0_function_ReqType;
+extern uint16_t             g_usb0_function_ReqTypeType;
+extern uint16_t             g_usb0_function_ReqTypeRecip;
+extern uint16_t             g_usb0_function_ReqRequest;
+extern uint16_t             g_usb0_function_ReqValue;
+extern uint16_t             g_usb0_function_ReqIndex;
+extern uint16_t             g_usb0_function_ReqLength;
+
+extern uint16_t             g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+extern uint16_t             g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+/* ==== common ==== */
+void     usb0_function_dma_stop_d0(uint16_t pipe, uint32_t remain);
+void     usb0_function_dma_stop_d1(uint16_t pipe, uint32_t remain);
+uint16_t usb0_function_is_hispeed(void);
+uint16_t usb0_function_is_hispeed_enable(void);
+uint16_t usb0_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb0_function_write_buffer(uint16_t pipe);
+uint16_t usb0_function_write_buffer_c(uint16_t pipe);
+uint16_t usb0_function_write_buffer_d0(uint16_t pipe);
+uint16_t usb0_function_write_buffer_d1(uint16_t pipe);
+void     usb0_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb0_function_read_buffer(uint16_t pipe);
+uint16_t usb0_function_read_buffer_c(uint16_t pipe);
+uint16_t usb0_function_read_buffer_d0(uint16_t pipe);
+uint16_t usb0_function_read_buffer_d1(uint16_t pipe);
+uint16_t usb0_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb0_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb0_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc);
+uint16_t usb0_function_get_mbw(uint32_t trncount, uint32_t dtptr);
+uint16_t usb0_function_read_dma(uint16_t pipe);
+void     usb0_function_brdy_int(uint16_t status, uint16_t int_enb);
+void     usb0_function_nrdy_int(uint16_t status, uint16_t int_enb);
+void     usb0_function_bemp_int(uint16_t status, uint16_t int_enb);
+void     usb0_function_setting_interrupt(uint8_t level);
+void     usb0_function_reset_module(uint16_t clockmode);
+uint16_t usb0_function_get_buf_size(uint16_t pipe);
+uint16_t usb0_function_get_mxps(uint16_t pipe);
+void     usb0_function_clear_brdy_sts(uint16_t pipe);
+void     usb0_function_clear_bemp_sts(uint16_t pipe);
+void     usb0_function_clear_nrdy_sts(uint16_t pipe);
+void     usb0_function_set_pid_buf(uint16_t pipe);
+void     usb0_function_set_pid_nak(uint16_t pipe);
+void     usb0_function_set_pid_stall(uint16_t pipe);
+void     usb0_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb0_function_get_pid(uint16_t pipe);
+void     usb0_function_set_sqclr(uint16_t pipe);
+void     usb0_function_set_sqset(uint16_t pipe);
+void     usb0_function_set_csclr(uint16_t pipe);
+void     usb0_function_aclrm(uint16_t pipe);
+void     usb0_function_set_aclrm(uint16_t pipe);
+void     usb0_function_clr_aclrm(uint16_t pipe);
+uint16_t usb0_function_get_sqmon(uint16_t pipe);
+uint16_t usb0_function_get_inbuf(uint16_t pipe);
+
+/* ==== function ==== */
+void     usb0_function_init_status(void);
+void     usb0_function_InitModule(uint16_t mode);
+uint16_t usb0_function_CheckVBUStaus(void);
+void     usb0_function_USB_FUNCTION_Attach(void);
+void     usb0_function_USB_FUNCTION_Detach(void);
+void     usb0_function_USB_FUNCTION_BusReset(void);
+void     usb0_function_USB_FUNCTION_Resume(void);
+void     usb0_function_USB_FUNCTION_Suspend(void);
+void     usb0_function_USB_FUNCTION_TestMode(void);
+void     usb0_function_ResetDCP(void);
+void     usb0_function_ResetEP(uint16_t num);
+uint16_t usb0_function_EpToPipe(uint16_t ep);
+void     usb0_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num);
+uint16_t usb0_function_GetConfigNum(void);
+uint16_t usb0_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num);
+uint16_t usb0_function_CheckRemoteWakeup(void);
+void     usb0_function_clear_alt(void);
+void     usb0_function_clear_pipe_tbl(void);
+void     usb0_function_clear_ep_table_index(void);
+uint16_t usb0_function_GetInterfaceNum(uint16_t num);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* USB0_FUNCTION_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_api.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,104 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_api.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB0_FUNCTION_API_H
+#define USB0_FUNCTION_API_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Variable Externs
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void     usb0_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode);
+uint16_t usb0_api_function_IsConfigured(void);
+uint16_t usb0_function_GetDeviceState(void);
+uint16_t usb0_api_function_CtrlReadStart(uint32_t size, uint8_t *data);
+void     usb0_api_function_CtrlWriteStart(uint32_t size, uint8_t *data);
+uint16_t usb0_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb0_api_function_check_pipe_status(uint16_t pipe, uint32_t *size);
+void     usb0_api_function_clear_pipe_status(uint16_t pipe);
+void     usb0_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+void     usb0_api_function_set_pid_buf(uint16_t pipe);
+void     usb0_api_function_set_pid_nak(uint16_t pipe);
+void     usb0_api_function_set_pid_stall(uint16_t pipe);
+void     usb0_api_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb0_api_function_get_pid(uint16_t pipe);
+int32_t  usb0_api_function_check_stall(uint16_t pipe);
+void     usb0_api_function_set_sqclr(uint16_t pipe);
+void     usb0_api_function_set_sqset(uint16_t pipe);
+void     usb0_api_function_set_csclr(uint16_t pipe);
+void     usb0_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb0_api_function_clear_brdy_sts(uint16_t pipe);
+void     usb0_api_function_clear_bemp_sts(uint16_t pipe);
+void     usb0_api_function_clear_nrdy_sts(uint16_t pipe);
+
+void     usb0_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb0_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB0_FUNCTION_API_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dmacdrv.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB0_FUNCTION_DMACDRV_H
+#define USB0_FUNCTION_DMACDRV_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+typedef struct dmac_transinfo
+{
+    uint32_t src_addr;      /* Transfer source address                */
+    uint32_t dst_addr;      /* Transfer destination address           */
+    uint32_t count;         /* Transfer byte count                    */
+    uint32_t src_size;      /* Transfer source data size              */
+    uint32_t dst_size;      /* Transfer destination data size         */
+    uint32_t saddr_dir;     /* Transfer source address direction      */
+    uint32_t daddr_dir;     /* Transfer destination address direction */
+} dmac_transinfo_t;
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+/* ==== Transfer specification of the sample program ==== */
+#define DMAC_SAMPLE_SINGLE          (0)     /* Single transfer                   */
+#define DMAC_SAMPLE_CONTINUATION    (1)     /* Continuous transfer (use REN bit) */
+
+/* ==== DMA modes ==== */
+#define DMAC_MODE_REGISTER          (0)     /* Register mode */
+#define DMAC_MODE_LINK              (1)     /* Link mode     */
+
+/* ==== Transfer requests ==== */
+#define DMAC_REQ_MODE_EXT           (0)     /* External request                   */
+#define DMAC_REQ_MODE_PERI          (1)     /* On-chip peripheral module request  */
+#define DMAC_REQ_MODE_SOFT          (2)     /* Auto-request (request by software) */
+
+/* ==== DMAC transfer sizes ==== */
+#define DMAC_TRANS_SIZE_8           (0)     /* 8 bits    */
+#define DMAC_TRANS_SIZE_16          (1)     /* 16 bits   */
+#define DMAC_TRANS_SIZE_32          (2)     /* 32 bits   */
+#define DMAC_TRANS_SIZE_64          (3)     /* 64 bits   */
+#define DMAC_TRANS_SIZE_128         (4)     /* 128 bits  */
+#define DMAC_TRANS_SIZE_256         (5)     /* 256 bits  */
+#define DMAC_TRANS_SIZE_512         (6)     /* 512 bits  */
+#define DMAC_TRANS_SIZE_1024        (7)     /* 1024 bits */
+
+/* ==== Address increment for transferring ==== */
+#define DMAC_TRANS_ADR_NO_INC       (1)     /* Not increment */
+#define DMAC_TRANS_ADR_INC          (0)     /* Increment     */
+
+/* ==== Method for detecting DMA request ==== */
+#define DMAC_REQ_DET_FALL           (0)     /* Falling edge detection */
+#define DMAC_REQ_DET_RISE           (1)     /* Rising edge detection  */
+#define DMAC_REQ_DET_LOW            (2)     /* Low level detection    */
+#define DMAC_REQ_DET_HIGH           (3)     /* High level detection   */
+
+/* ==== Request Direction ==== */
+#define DMAC_REQ_DIR_SRC            (0)     /* DMAREQ is the source/ DMAACK is active when reading      */
+#define DMAC_REQ_DIR_DST            (1)     /* DMAREQ is the destination/ DMAACK is active when writing */
+
+/* ==== Descriptors ==== */
+#define DMAC_DESC_HEADER            (0)     /* Header              */
+#define DMAC_DESC_SRC_ADDR          (1)     /* Source Address      */
+#define DMAC_DESC_DST_ADDR          (2)     /* Destination Address */
+#define DMAC_DESC_COUNT             (3)     /* Transaction Byte    */
+#define DMAC_DESC_CHCFG             (4)     /* Channel Confg       */
+#define DMAC_DESC_CHITVL            (5)     /* Channel Interval    */
+#define DMAC_DESC_CHEXT             (6)     /* Channel Extension   */
+#define DMAC_DESC_LINK_ADDR         (7)     /* Link Address        */
+
+/* ==== On-chip peripheral module requests ===== */
+typedef enum dmac_request_factor
+{
+    DMAC_REQ_USB0_DMA0_TX,      /* USB_0 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA0_RX,      /* USB_0 channel 0 receive FIFO full              */
+    DMAC_REQ_USB0_DMA1_TX,      /* USB_0 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA1_RX,      /* USB_0 channel 1 receive FIFO full              */
+    DMAC_REQ_USB1_DMA0_TX,      /* USB_1 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA0_RX,      /* USB_1 channel 0 receive FIFO full              */
+    DMAC_REQ_USB1_DMA1_TX,      /* USB_1 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA1_RX,      /* USB_1 channel 1 receive FIFO full              */
+} dmac_request_factor_t;
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void usb0_function_DMAC1_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb0_function_DMAC1_Open(uint32_t req);
+void usb0_function_DMAC1_Close(uint32_t *remain);
+void usb0_function_DMAC1_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+void usb0_function_DMAC2_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb0_function_DMAC2_Open(uint32_t req);
+void usb0_function_DMAC2_Close(uint32_t *remain);
+void usb0_function_DMAC2_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB0_FUNCTION_DMACDRV_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dataio.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2933 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dataio.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static uint16_t g_usb0_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)];
+
+static void     usb0_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb0_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static uint16_t usb0_function_read_dma_d0(uint16_t pipe);
+static uint16_t usb0_function_read_dma_d1(uint16_t pipe);
+static uint16_t usb0_function_write_dma_d0(uint16_t pipe);
+static uint16_t usb0_function_write_dma_d1(uint16_t pipe);
+
+static void     usb0_function_read_c_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_write_c_fifo(uint16_t Pipe, uint16_t count);
+static void     usb0_function_read_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_write_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_read_d1_fifo(uint16_t pipe, uint16_t count);
+static void     usb0_function_write_d1_fifo(uint16_t pipe, uint16_t count);
+
+static void     usb0_function_clear_transaction_counter(uint16_t pipe);
+static void     usb0_function_set_transaction_counter(uint16_t pipe, uint32_t count);
+
+static uint32_t usb0_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr);
+
+static uint16_t usb0_function_set_dfacc_d0(uint16_t mbw, uint32_t count);
+static uint16_t usb0_function_set_dfacc_d1(uint16_t mbw, uint32_t count);
+
+
+/*******************************************************************************
+* Function Name: usb0_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t  pipe    ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t usefifo;
+    uint16_t mbw;
+
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    usb0_function_clear_bemp_sts(pipe);
+    usb0_function_clear_brdy_sts(pipe);
+    usb0_function_clear_nrdy_sts(pipe);
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+        case USB_FUNCTION_D0FIFO_DMA:
+            usefifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+        case USB_FUNCTION_D1FIFO_DMA:
+            usefifo = USB_FUNCTION_D1USE;
+        break;
+
+        default:
+            usefifo = USB_FUNCTION_CUSE;
+        break;
+    };
+
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_clear_transaction_counter(pipe);
+
+    usb0_function_aclrm(pipe);
+
+    status = usb0_function_write_buffer(pipe);
+
+    if (status != DEVDRV_USBF_FIFOERROR)
+    {
+        usb0_function_set_pid_buf(pipe);
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer
+* Description  : Writes data in the buffer allocated in the pipe specified by
+*              : the argument. The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer (uint16_t pipe)
+{
+    uint16_t status;
+    uint16_t usefifo;
+
+    g_usb0_function_PipeIgnore[pipe] = 0;
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            status = usb0_function_write_buffer_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            status = usb0_function_write_buffer_d1(pipe);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            status = usb0_function_write_dma_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            status = usb0_function_write_dma_d1(pipe);
+        break;
+
+        default:
+            status = usb0_function_write_buffer_c(pipe);
+        break;
+    };
+
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITING:                       /* Continue of data write */
+            usb0_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            usb0_function_enable_brdy_int(pipe);        /* Enable Ready Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEEND:                      /* End of data write */
+        case DEVDRV_USBF_WRITESHRT:                     /* End of data write */
+            usb0_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb0_function_clear_nrdy_sts(pipe);
+            usb0_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            /* for last transfer */
+            usb0_function_enable_bemp_int(pipe);        /* Enable Empty Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEDMA:                      /* DMA write */
+            usb0_function_clear_nrdy_sts(pipe);
+            usb0_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                     /* FIFO access status */
+        default:
+            usb0_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb0_function_disable_bemp_int(pipe);       /* Disable Empty Interrupt */
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer_c
+* Description  : Writes data in the buffer allocated in the pipe specified in
+*              : the argument. Writes data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    if (g_usb0_function_CtrZeroLengthFlag == 1)
+    {
+        g_usb0_function_CtrZeroLengthFlag = 0;                  /* Zero Length Packet Flag CLR */
+        return DEVDRV_USBF_WRITEEND;
+    }
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    }
+    else
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+    }
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb0_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb0_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb0_function_write_c_fifo(pipe, (uint16_t)count);
+
+    if (g_usb0_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb0_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB200.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0)
+        {
+            USB200.CFIFOCTR = USB_FUNCTION_BITBVAL;             /* Short Packet */
+            g_usb0_function_CtrZeroLengthFlag = 1;              /* Zero Length Packet Flag */
+        }
+    }
+    else
+    {
+        g_usb0_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb0_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb0_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb0_function_write_d0_fifo(pipe, (uint16_t)count);
+
+    if (g_usb0_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb0_function_data_count[pipe] = 0;
+        if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb0_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_buffer_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_write_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb0_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb0_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb0_function_write_d1_fifo(pipe, (uint16_t)count);
+
+    if (g_usb0_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb0_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb0_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D0FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma().
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_write_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb0_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb0_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;
+
+        if ((count % size) != 0)
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 1;
+        }
+        else
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;
+        }
+
+        dfacc = usb0_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb0_function_data_count[pipe]    = 0;
+        g_usb0_function_data_pointer[pipe] += count;
+        status = DEVDRV_USBF_WRITEDMA;                              /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_dma_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D1FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma().
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_write_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc=0;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb0_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb0_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;
+        if ((count % size) != 0)
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 1;
+        }
+        else
+        {
+            g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;
+        }
+
+        dfacc = usb0_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb0_function_data_count[pipe]    = 0;
+        g_usb0_function_data_pointer[pipe] += count;
+
+        status = DEVDRV_USBF_WRITEDMA;                             /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb0_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t usefifo;
+
+    usb0_function_clear_bemp_sts(pipe);
+    usb0_function_clear_brdy_sts(pipe);
+    usb0_function_clear_nrdy_sts(pipe);
+
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb0_function_start_receive_trns_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb0_function_start_receive_trns_d1(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            usb0_function_start_receive_dma_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            usb0_function_start_receive_dma_d1(pipe, size, data);
+        break;
+
+        default:
+            usb0_function_start_receive_trns_c(pipe, size, data);
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_trns_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+*              : When storing data in the buffer allocated in the pipe specified in the
+*              : argument, BRDY interrupt is generated to read data
+*              : in the interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = size;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
+    USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    usb0_function_enable_nrdy_int(pipe);
+    usb0_function_enable_brdy_int(pipe);
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_trns_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data in the
+*              : interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = size;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    usb0_function_enable_nrdy_int(pipe);
+    usb0_function_enable_brdy_int(pipe);
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_trns_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = size;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    usb0_function_enable_nrdy_int(pipe);
+    usb0_function_enable_brdy_int(pipe);
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_dma_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = 0;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb0_function_read_dma(pipe);
+
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_start_receive_dma_d1
+* Description  : Read data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(pipe);
+    g_usb0_function_data_count[pipe]   = size;
+    g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb0_function_PipeIgnore[pipe]   = 0;
+
+    g_usb0_function_PipeDataSize[pipe] = 0;
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb0_function_get_mbw(size, (uint32_t)data);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb0_function_set_transaction_counter(pipe, size);
+
+    usb0_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb0_function_read_dma(pipe);
+
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb0_function_enable_nrdy_int(pipe);
+        usb0_function_enable_brdy_int(pipe);
+    }
+
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Uses FIF0 set in the pipe definition table.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb0_function_PipeIgnore[pipe] = 0;
+
+    if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+    {
+        status = usb0_function_read_buffer_d0(pipe);
+    }
+    else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+    {
+        status = usb0_function_read_buffer_d1(pipe);
+    }
+    else
+    {
+        status = usb0_function_read_buffer_c(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb0_function_disable_brdy_int(pipe);
+            g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            g_usb0_function_pipe_status[pipe]   = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+            {
+                USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+            {
+                USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else
+            {
+                USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+            }
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            g_usb0_function_pipe_status[pipe]   = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb0_function_data_count[pipe];
+    }
+    else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+    }
+    else
+    {
+        usb0_function_read_c_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb0_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb0_function_data_count[pipe];
+    }
+    else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb0_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb0_function_read_d0_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb0_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_buffer_d1
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+    buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb0_function_data_count[pipe];
+    }
+    else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb0_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb0_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb0_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb0_function_read_d1_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb0_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_dma
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO or D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb0_function_read_dma (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb0_function_PipeIgnore[pipe] = 0;
+    if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+    {
+        status = usb0_function_read_dma_d0(pipe);
+    }
+    else
+    {
+        status = usb0_function_read_dma_d1(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READZERO:                                     /* End of data read */
+            usb0_function_disable_brdy_int(pipe);
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb0_function_disable_brdy_int(pipe);
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            }
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
+            }
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb0_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_read_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+    uint16_t pipebuf_size;
+
+    g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb0_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb0_function_data_count[pipe];
+        }
+        else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb0_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb0_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;        /* not use in read operation */
+        g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;           /* not use in read operation */
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D0FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb0_function_data_count[pipe]   -= count;
+        g_usb0_function_data_pointer[pipe] += count;
+        g_usb0_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_dma_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by DMA transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb0_function_read_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc=0;
+    uint16_t pipebuf_size;
+
+    g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb0_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb0_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb0_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb0_function_data_count[pipe];
+        }
+        else if (g_usb0_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb0_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb0_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb0_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;        /* not use in read operation */
+        g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;           /* not use in read operation */
+
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
+        g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB200.D1FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb0_function_data_count[pipe]   -= count;
+        g_usb0_function_data_pointer[pipe] += count;
+        g_usb0_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_change_fifo_port
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument. After allocating FIF0, waits in the software
+*              : till the corresponding pipe becomes ready.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : DEVDRV_USBF_FIFOERROR         ; Error
+*              : Others            ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value
+*******************************************************************************/
+uint16_t usb0_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    usb0_function_set_curpipe(pipe, fifosel, isel, mbw);
+
+    for (loop = 0; loop < 4; loop++)
+    {
+        switch (fifosel)
+        {
+            case USB_FUNCTION_CUSE:
+                buffer = USB200.CFIFOCTR;
+            break;
+
+            case USB_FUNCTION_D0USE:
+            case USB_FUNCTION_D0DMA:
+                buffer = USB200.D0FIFOCTR;
+            break;
+
+            case USB_FUNCTION_D1USE:
+            case USB_FUNCTION_D1DMA:
+                buffer = USB200.D1FIFOCTR;
+            break;
+
+            default:
+                buffer = 0;
+            break;
+        }
+
+        if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY)
+        {
+            return buffer;
+        }
+
+        loop2 = 25;
+        while (loop2-- > 0)
+        {
+            /* wait */
+        }
+    }
+
+    return DEVDRV_USBF_FIFOERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_curpipe
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    g_usb0_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB200.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB200.D0FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB200.D1FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_curpipe2
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+*              : uint16_t dfacc     ; DFACC Access mode
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc)
+{
+    uint16_t buffer;
+    uint32_t loop;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+    uint32_t dummy;
+#endif
+    volatile uint32_t loop2;
+
+    g_usb0_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB200.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB200.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB200.D0FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB200.D0FIFO.UINT32;
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB200.D1FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB200.D1FIFO.UINT32;
+                loop = dummy;                   // avoid warning.
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB200.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_c_fifo
+* Description  : Writes data in CFIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_write_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB200.CFIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB200.CFIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB200.CFIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_c_fifo
+* Description  : Reads data from CFIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_read_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb0_function_data_pointer[pipe] = USB200.CFIFO.UINT8[HH];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT16[H];
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT32;
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_d0_fifo
+* Description  : Writes data in D0FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_write_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB200.D0FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB200.D0FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB200.D0FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_d0_fifo
+* Description  : Reads data from D0FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating DOFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_read_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb0_function_data_pointer[pipe] = USB200.D0FIFO.UINT8[HH];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT16[H];
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT32;
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_write_d1_fifo
+* Description  : Writes data in D1FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_write_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB200.D1FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB200.D1FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB200.D1FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_read_d1_fifo
+* Description  : Reads data from D1FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb0_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_read_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb0_function_data_pointer[pipe] = USB200.D1FIFO.UINT8[HH];
+            g_usb0_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT16[H];
+            g_usb0_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT32;
+            g_usb0_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_com_get_dmasize
+* Description  : Calculates access width of DMA transfer by the argument to
+*              : return as the Return Value.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : DMA transfer size    : 0   8bit
+*              :                      : 1  16bit
+*              :                      : 2  32bit
+*******************************************************************************/
+static uint32_t usb0_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+
+    if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0))
+    {
+        /*  When transfer byte count is odd         */
+        /* or transfer data area is 8-bit alignment */
+        size = 0;           /* 8bit */
+    }
+    else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0))
+    {
+        /* When the transfer byte count is multiples of 2 */
+        /* or the transfer data area is 16-bit alignment */
+        size = 1;           /* 16bit */
+    }
+    else
+    {
+        /* When the transfer byte count is multiples of 4 */
+        /* or the transfer data area is 32-bit alignment */
+        size = 2;           /* 32bit */
+    }
+
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_mbw
+* Description  : Calculates access width of DMA to return the value set in MBW.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : FIFO transfer size   : USB_FUNCTION_BITMBW_8    8bit
+*              :                      : USB_FUNCTION_BITMBW_16  16bit
+*              :                      : USB_FUNCTION_BITMBW_32  32bit
+*******************************************************************************/
+uint16_t usb0_function_get_mbw (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+    uint16_t mbw;
+
+    size = usb0_function_com_get_dmasize(trncount, dtptr);
+
+    if (size == 0)
+    {
+        /* 8bit */
+        mbw = USB_FUNCTION_BITMBW_8;
+    }
+    else if (size == 1)
+    {
+        /* 16bit */
+        mbw = USB_FUNCTION_BITMBW_16;
+    }
+    else
+    {
+        /* 32bit */
+        mbw = USB_FUNCTION_BITMBW_32;
+    }
+
+    return mbw;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_transaction_counter
+* Description  : Sets transaction counter by the argument(PIPEnTRN).
+*              : Clears transaction before setting to enable transaction counter setting.
+* Arguments    : uint16_t pipe     ; Pipe number
+*              : uint32_t bsize    : Data transfer size
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_set_transaction_counter (uint16_t pipe, uint32_t bsize)
+{
+    uint16_t mxps;
+    uint16_t cnt;
+
+    if (bsize  == 0)
+    {
+        return;
+    }
+
+    mxps = usb0_function_get_mxps(pipe);            /* Max Packet Size */
+
+    if ((bsize % mxps) == 0)
+    {
+        cnt = (uint16_t)(bsize / mxps);
+    }
+    else
+    {
+        cnt = (uint16_t)((bsize / mxps) + 1);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE1TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE2TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE3TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE4TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE5TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPE9TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEATRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEBTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPECTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEDTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEETRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB200.PIPEFTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_transaction_counter
+* Description  : Clears the transaction counter by the argument.
+*              : After executing this function, the transaction counter is invalid.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_transaction_counter (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_stop_transfer
+* Description  : Stops the USB transfer in the pipe specified by the argument.
+*              : After stopping the USB transfer, clears the buffer allocated in
+*              : the pipe.
+*              : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0;
+*              : invalid. After executing this function, BRDY/NRDY/BEMP interrupt
+*              : in the corresponding pipe becomes invalid. Sequence bit is also
+*              : cleared.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_stop_transfer (uint16_t pipe)
+{
+    uint16_t usefifo;
+    uint32_t remain;
+    uint16_t fifo;
+
+    usb0_function_set_pid_nak(pipe);
+
+    usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1USE;
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            remain = Userdef_USB_usb0_function_stop_dma0();
+            usb0_function_dma_stop_d0(pipe, remain);
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0DMA;
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            remain = Userdef_USB_usb0_function_stop_dma1();
+            usb0_function_dma_stop_d1(pipe, remain);
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1DMA;
+        break;
+
+        default:
+            usb0_function_clear_transaction_counter(pipe);
+            USB200.CFIFOCTR =  USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_CUSE;
+        break;
+    }
+
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16);
+
+    /* Interrupt of pipe set is disabled */
+    usb0_function_disable_brdy_int(pipe);
+    usb0_function_disable_nrdy_int(pipe);
+    usb0_function_disable_bemp_int(pipe);
+
+    usb0_function_aclrm(pipe);
+    usb0_function_set_csclr(pipe);
+
+    if ( g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT )
+    {
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+    }
+
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_dfacc_d0
+* Description  : Sets the DFACC setting value in D0FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb0_function_set_dfacc_d0 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+    return dfacc;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_dfacc_d1
+* Description  : Set the DFACC setting value in D1FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb0_function_set_dfacc_d1 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB200.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+
+    return dfacc;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dma.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,346 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dma.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static void usb0_function_dmaint(uint16_t fifo);
+static void usb0_function_dmaint_buf2fifo(uint16_t pipe);
+static void usb0_function_dmaint_fifo2buf(uint16_t pipe);
+
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_stop_d0
+* Description  : D0FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_stop_d0 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB200.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB200.D0FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain);
+            g_usb0_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_stop_d1
+* Description  : D1FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_stop_d1 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB200.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB200.D1FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain);
+            g_usb0_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_interrupt_d0fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb0_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_interrupt_d0fifo (uint32_t int_sense)
+{
+    usb0_function_dmaint(USB_FUNCTION_D0FIFO);
+    g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dma_interrupt_d1fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb0_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb0_function_dma_interrupt_d1fifo (uint32_t int_sense)
+{
+    usb0_function_dmaint(USB_FUNCTION_D1FIFO);
+    g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dmaint
+* Description  : This function is DMA transfer end interrupt
+* Arguments    : uint16_t fifo  ; fifo number
+*              :                ;  USB_FUNCTION_D0FIFO
+*              :                ;  USB_FUNCTION_D1FIFO
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_dmaint (uint16_t fifo)
+{
+    uint16_t pipe;
+
+    pipe = g_usb0_function_DmaPipe[fifo];
+
+    if (g_usb0_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO)
+    {
+        usb0_function_dmaint_buf2fifo(pipe);
+    }
+    else
+    {
+        usb0_function_dmaint_fifo2buf(pipe);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dmaint_fifo2buf
+* Description  : Executes read completion from FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_dmaint_fifo2buf (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+    {
+        useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+        if (useport == USB_FUNCTION_D0FIFO_DMA)
+        {
+            remain = Userdef_USB_usb0_function_stop_dma0();
+            usb0_function_dma_stop_d0(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb0_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+        else
+        {
+            remain = Userdef_USB_usb0_function_stop_dma1();
+            usb0_function_dma_stop_d1(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb0_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_dmaint_buf2fifo
+* Description  : Executes write completion in FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_dmaint_buf2fifo (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    if (useport == USB_FUNCTION_D0FIFO_DMA)
+    {
+        remain = Userdef_USB_usb0_function_stop_dma0();
+        usb0_function_dma_stop_d0(pipe, remain);
+
+        if (g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D0FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+    else
+    {
+        remain = Userdef_USB_usb0_function_stop_dma1();
+        usb0_function_dma_stop_d1(pipe, remain);
+
+        if (g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB200.D1FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+
+    usb0_function_enable_bemp_int(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_intrn.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,249 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_intrn.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_brdy_int
+* Description  : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : According to the pipe that interrupt is generated in,
+*              : reads/writes buffer allocated in the pipe.
+*              : This function is executed in the BRDY interrupt handler.
+*              : This function clears BRDY interrupt status and BEMP interrupt
+*              : status.
+* Arguments    : uint16_t Status       ; BRDYSTS Register Value
+*              : uint16_t Int_enbl     ; BRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_brdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint32_t int_sense = 0;
+    uint16_t pipe;
+    uint16_t pipebit;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        pipebit = g_usb0_function_bit_set[pipe];
+
+        if ((status & pipebit) && (int_enb & pipebit))
+        {
+            USB200.BRDYSTS = (uint16_t)~pipebit;
+            USB200.BEMPSTS = (uint16_t)~pipebit;
+            if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb0_function_dma_interrupt_d0fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb0_function_read_dma(pipe);
+                    usb0_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)
+            {
+                if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb0_function_dma_interrupt_d1fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb0_function_read_dma(pipe);
+                    usb0_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else
+            {
+                if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0)
+                {
+                    usb0_function_read_buffer(pipe);
+                }
+                else
+                {
+                    usb0_function_write_buffer(pipe);
+                }
+            }
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_nrdy_int
+* Description  : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : Checks NRDY interrupt cause by PID. When the cause if STALL,
+*              : regards the pipe state as STALL and ends the processing.
+*              : Then the cause is not STALL, increments the error count to
+*              : communicate again. When the error count is 3, determines
+*              : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing.
+*              : This function is executed in the NRDY interrupt handler.
+*              : This function clears NRDY interrupt status.
+* Arguments    : uint16_t status       ; NRDYSTS Register Value
+*              : uint16_t int_enb      ; NRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb0_function_nrdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB200.NRDYSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe])
+        {
+            if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1)
+            {
+                if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT)
+                {
+                    pid = usb0_function_get_pid(pipe);
+                    if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+                    {
+                        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+                    }
+                    else
+                    {
+                        g_usb0_function_PipeIgnore[pipe]++;
+                        if (g_usb0_function_PipeIgnore[pipe] == 3)
+                        {
+                            g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+                        }
+                        else
+                        {
+                            usb0_function_set_pid_buf(pipe);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                /* USB Function */
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_bemp_int
+* Description  : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9).
+* Arguments    : uint16_t status       ; BEMPSTS Register Value
+*              : uint16_t int_enb      ; BEMPENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb0_function_bemp_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+    uint16_t inbuf;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB200.BEMPSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe])
+        {
+            pid = usb0_function_get_pid(pipe);
+
+            if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+            {
+                g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+            }
+            else
+            {
+                inbuf = usb0_function_get_inbuf(pipe);
+
+                if (inbuf == 0)
+                {
+                    usb0_function_disable_bemp_int(pipe);
+                    usb0_function_set_pid_nak(pipe);
+                    g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+        }
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_lib.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2026 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_lib.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_brdy_int
+* Description  : Enables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_enable_brdy_int (uint16_t pipe)
+{
+    /* enable brdy interrupt */
+    USB200.BRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_disable_brdy_int
+* Description  : Disables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_disable_brdy_int (uint16_t pipe)
+{
+    /* disable brdy interrupt */
+    USB200.BRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_brdy_sts (uint16_t pipe)
+{
+    /* clear brdy status */
+    USB200.BRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_bemp_int
+* Description  : Enables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_enable_bemp_int (uint16_t pipe)
+{
+    /* enable bemp interrupt */
+    USB200.BEMPENB |= (uint16_t)g_usb0_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_disable_bemp_int
+* Description  : Disables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_disable_bemp_int (uint16_t pipe)
+{
+    /* disable bemp interrupt */
+    USB200.BEMPENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_bemp_sts (uint16_t pipe)
+{
+    /* clear bemp status */
+    USB200.BEMPSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_nrdy_int
+* Description  : Enables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : NRDY. Enables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_enable_nrdy_int (uint16_t pipe)
+{
+    /* enable nrdy interrupt */
+    USB200.NRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_disable_nrdy_int
+* Description  : Disables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : NRDY. Disables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_disable_nrdy_int (uint16_t pipe)
+{
+    /* disable nrdy interrupt */
+    USB200.NRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_nrdy_sts (uint16_t pipe)
+{
+    /* clear nrdy status */
+    USB200.NRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_is_hispeed
+* Description  : Returns the result of USB reset hand shake (RHST) as
+*              : return value.
+* Arguments    : none
+* Return Value : USB_FUNCTION_HIGH_SPEED    ; Hi-Speed
+*              : USB_FUNCTION_FULL_SPEED    ; Full-Speed
+*              : LOW_SPEED                  ; Low-Speed
+*              : USB_FUNCTION_NON_SPEED     ; error
+*******************************************************************************/
+uint16_t usb0_function_is_hispeed (void)
+{
+    uint16_t rhst;
+    uint16_t speed;
+
+    rhst = RZA_IO_RegRead_16(&USB200.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST);
+
+    if (rhst == USB_FUNCTION_HSMODE)
+    {
+        speed = USB_FUNCTION_HIGH_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_FSMODE)
+    {
+        speed = USB_FUNCTION_FULL_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_LSMODE)
+    {
+        speed = USB_FUNCTION_LOW_SPEED;
+    }
+    else
+    {
+        speed = USB_FUNCTION_NON_SPEED;
+    }
+
+    return speed;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_is_hispeed_enable
+* Description  : Returns the USB High-Speed connection enabled status as
+*              : return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Hi-Speed Enable
+*              : DEVDRV_USBF_NO   : Hi-Speed Disable
+*******************************************************************************/
+uint16_t usb0_function_is_hispeed_enable (void)
+{
+    uint16_t ret;
+
+    ret = DEVDRV_USBF_NO;
+
+    if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1)
+    {
+        ret = DEVDRV_USBF_YES;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_pid_buf (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb0_function_set_pid_nak(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_pid_nak (uint16_t pipe)
+{
+    uint16_t pid;
+    uint16_t pbusy;
+    uint32_t loop;
+
+    pid = usb0_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb0_function_set_pid_stall(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        for (loop = 0; loop < 200; loop++)
+        {
+            switch (pipe)
+            {
+                case USB_FUNCTION_PIPE0:
+                    pbusy = RZA_IO_RegRead_16(&USB200.DCPCTR,
+                                                USB_DCPCTR_PBUSY_SHIFT,
+                                                USB_DCPCTR_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE1:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE2:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE3:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE4:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE5:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE6:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE6CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE7:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE7CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE8:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE8CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE9:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                                USB_PIPEnCTR_9_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_9_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEA:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEB:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEC:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPED:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEE:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEF:
+                    pbusy = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                default:
+                    pbusy   = 1;
+                break;
+            }
+
+            if (pbusy == 0)
+            {
+                break;
+            }
+            Userdef_USB_usb0_function_delay_500ns();
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_pid_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+    else
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_pid_stall (uint16_t pipe)
+{
+    usb0_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb0_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            pid = RZA_IO_RegRead_16(&USB200.DCPCTR,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE6CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE7CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE8CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            pid = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            pid = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            pid = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+            pid = 0;
+        break;
+    }
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_csclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                1,
+                                USB_DCPCTR_CSCLR_SHIFT,
+                                USB_DCPCTR_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_CSCLR_SHIFT,
+                                USB_PIPEnCTR_9_CSCLR);
+        break;
+
+        default:
+            /* PIPEA-F have not CSCLR */
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_sqclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQCLR_SHIFT,
+                                USB_DCPCTR_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQCLR_SHIFT,
+                                USB_PIPEnCTR_9_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_sqset (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB200.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQSET_SHIFT,
+                                USB_DCPCTR_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQSET_SHIFT,
+                                USB_PIPEnCTR_9_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_sqmon
+* Description  : Toggle bit of specified pipe is obtained
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : sqmon
+*******************************************************************************/
+uint16_t usb0_function_get_sqmon (uint16_t pipe)
+{
+    uint16_t sqmon;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            sqmon = RZA_IO_RegRead_16(&USB200.DCPCTR,
+                                        USB_DCPCTR_SQMON_SHIFT,
+                                        USB_DCPCTR_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE6CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE7CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE8CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                        USB_PIPEnCTR_9_SQMON_SHIFT,
+                                        USB_PIPEnCTR_9_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            sqmon = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        default:
+            sqmon = 0;
+        break;
+    }
+
+    return sqmon;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_aclrm
+* Description  : The buffer of specified pipe is initialized
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb0_function_aclrm (uint16_t pipe)
+{
+    usb0_function_set_aclrm(pipe);
+    usb0_function_clr_aclrm(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_set_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb0_function_set_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clr_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clr_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB200.PIPE1CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB200.PIPE2CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB200.PIPE3CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB200.PIPE4CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB200.PIPE5CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB200.PIPE6CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB200.PIPE7CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB200.PIPE8CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB200.PIPE9CTR,
+                                0,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB200.PIPEACTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB200.PIPEBCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB200.PIPECCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB200.PIPEDCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB200.PIPEECTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB200.PIPEFCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_inbuf
+* Description  : Returns INBUFM of the pipe specified by the argument.
+* Arguments    : uint16_t pipe             ; Pipe Number
+* Return Value : inbuf
+*******************************************************************************/
+uint16_t usb0_function_get_inbuf (uint16_t pipe)
+{
+    uint16_t inbuf;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPE9CTR,
+                                    USB_PIPEnCTR_9_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_9_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            inbuf = RZA_IO_RegRead_16(&USB200.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        default:
+            inbuf = 0;
+        break;
+    }
+
+    return inbuf;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_setting_interrupt
+* Description  : Sets the USB module interrupt level.
+* Arguments    : uint8_t level ;interrupt level
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_setting_interrupt (uint8_t level)
+{
+    uint16_t d0fifo_dmaintid;
+    uint16_t d1fifo_dmaintid;
+
+    R_INTC_RegistIntFunc(INTC_ID_USBI0, usb0_function_interrupt);
+    R_INTC_SetPriority(INTC_ID_USBI0, level);
+    R_INTC_Enable(INTC_ID_USBI0);
+
+    d0fifo_dmaintid = Userdef_USB_usb0_function_d0fifo_dmaintid();
+
+    if (d0fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d0fifo_dmaintid, usb0_function_dma_interrupt_d0fifo);
+        R_INTC_SetPriority(d0fifo_dmaintid, level);
+        R_INTC_Enable(d0fifo_dmaintid);
+    }
+
+    d1fifo_dmaintid = Userdef_USB_usb0_function_d1fifo_dmaintid();
+
+    if (d1fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d1fifo_dmaintid, usb0_function_dma_interrupt_d1fifo);
+        R_INTC_SetPriority(d1fifo_dmaintid, level);
+        R_INTC_Enable(d1fifo_dmaintid);
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_reset_module
+* Description  : Initializes the USB module.
+*              : Enables providing clock to the USB module.
+*              : Sets USB bus wait register.
+* Arguments    : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+void usb0_function_reset_module (uint16_t clockmode)
+{
+    /* UPLLE bit is only USB0 */
+    if (RZA_IO_RegRead_16(&USB200.SYSCFG0,
+                                USB_SYSCFG_UPLLE_SHIFT,
+                                USB_SYSCFG_UPLLE) == 1)
+    {
+        if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode)
+        {
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            USB200.SYSCFG0 = 0;
+            USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+            Userdef_USB_usb0_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            Userdef_USB_usb0_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            0,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        USB200.SYSCFG0 = 0;
+        USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+        Userdef_USB_usb0_function_delay_xms(1);
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            1,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+    }
+
+    USB200.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_buf_size
+* Description  : Obtains pipe buffer size specified by the argument and
+*              : maximum packet size of the USB device in use.
+*              : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum
+*              : packet size of the USB device using the corresponding pipe.
+*              : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the
+*              : corresponding pipe is in continuous transfer mode,
+*              : obtains the buffer size allocated in the corresponcing pipe,
+*              : when incontinuous transfer, obtains maximum packet size.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Maximum packet size or buffer size
+*******************************************************************************/
+uint16_t usb0_function_get_buf_size (uint16_t pipe)
+{
+    uint16_t size;
+    uint16_t bufsize;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB200.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1)
+        {
+            bufsize = RZA_IO_RegRead_16(&g_usb0_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE);
+            size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF);
+        }
+        else
+        {
+            size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+        }
+    }
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_get_mxps
+* Description  : Obtains maximum packet size of the USB device using the pipe
+*              : specified by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Max Packet Size
+*******************************************************************************/
+uint16_t usb0_function_get_mxps (uint16_t pipe)
+{
+    uint16_t size;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB200.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+    }
+    return size;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_api.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,441 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_api.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+#include "dev_drv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_api_function_init
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint8_t  int_level ; interruput level
+*              : uint16_t mode      : Speed modes
+*              :                    :  USB_FUCNTION_HIGH_SPEED: High-speed device
+*              :                    :  USB_FUCNTION_FULL_SPEED: Full-speed device
+*              : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode)
+{
+    volatile uint8_t dummy_buf;
+
+    CPG.STBCR7  &= 0xfd;                        /* The clock of USB0 modules is permitted */
+    dummy_buf   = CPG.STBCR7;                   /* (Dummy read) */
+
+    usb0_function_setting_interrupt(int_level);
+
+    usb0_function_reset_module(clockmode);      /* reset USB module with setting tranciever */
+                                                /* and HSE=1                                */
+
+    usb0_function_init_status();                /* clear variables                          */
+
+    usb0_function_InitModule(mode);             /* select USB Function and Interrupt Enable */
+                                                /* Detect USB Device to attach or detach    */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_api_function_IsConfigured
+* Description  : Checks if the USB device is configured to return the result as
+*              : the return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Configured & Configured Suspend
+*              : DEVDRV_USBF_NO   : not Configured
+*******************************************************************************/
+uint16_t usb0_api_function_IsConfigured (void)
+{
+    uint16_t dvst;
+
+    dvst = usb0_function_GetDeviceState();
+
+    if ((dvst == USB_FUNCTION_DVST_CONFIGURED) ||
+        (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND))
+    {
+        return DEVDRV_USBF_YES;
+    }
+
+    return DEVDRV_USBF_NO;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_GetDeviceState
+* Description  : Returns the state of USB device.
+* Arguments    : none
+* Return Value : Device States
+*******************************************************************************/
+uint16_t usb0_function_GetDeviceState (void)
+{
+    uint16_t dvsq;
+    uint16_t dvst;
+
+    dvsq = USB200.INTSTS0;
+    switch(dvsq & USB_FUNCTION_BITDVSQ)
+    {
+        case USB_FUNCTION_DS_POWR:                      /* Power state *//* power-on */
+            dvst = USB_FUNCTION_DVST_POWERED;
+        break;
+
+        case USB_FUNCTION_DS_DFLT:                      /* Default state *//* bus-reset */
+            dvst = USB_FUNCTION_DVST_DEFAULT;
+        break;
+
+        case USB_FUNCTION_DS_ADDS:                      /* Address state */
+            dvst = USB_FUNCTION_DVST_ADDRESS;
+        break;
+
+        case USB_FUNCTION_DS_CNFG:                      /* Configured state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED;
+        break;
+
+        case USB_FUNCTION_DS_SPD_CNFG:                  /* Configured Suspend state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND;
+        break;
+
+        case USB_FUNCTION_DS_SPD_POWR:                  /* Power      Suspend state */
+        case USB_FUNCTION_DS_SPD_DFLT:                  /* Default    Suspend state */
+        case USB_FUNCTION_DS_SPD_ADDR:                  /* Address    Suspend state */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+
+        default:                                        /* error */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+    }
+
+    return dvst;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data data Address
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    usb0_function_start_receive_transfer(pipe, size, data);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t pipe     ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t *data     ; Data data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb0_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+
+    status = usb0_function_start_send_transfer(pipe, size, data);
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_check_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+*              : uint32_t *size     ; Data Size
+* Return Value : Pipe Status
+*******************************************************************************/
+uint16_t usb0_api_function_check_pipe_status (uint16_t pipe, uint32_t * size)
+{
+    if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE)
+    {
+        *size = g_usb0_function_PipeDataSize[pipe];
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_DONE;
+    }
+    else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES)
+    {
+        *size = 0;
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_NORES;
+    }
+    else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL)
+    {
+        *size = 0;
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_STALL;
+    }
+    else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR)
+    {
+        *size = 0;
+        g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_FIFOERROR;
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    return g_usb0_function_pipe_status[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : Pipe Status
+*******************************************************************************/
+void usb0_api_function_clear_pipe_status (uint16_t pipe)
+{
+    g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+    g_usb0_function_PipeDataSize[pipe] = 0;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_pid_buf (uint16_t pipe)
+{
+    usb0_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_pid_nak (uint16_t pipe)
+{
+    usb0_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_pid_stall (uint16_t pipe)
+{
+    usb0_function_set_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_pid_stall (uint16_t pipe)
+{
+    usb0_function_clear_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb0_api_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_check_stall
+* Description  :
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+int32_t usb0_api_function_check_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb0_function_get_pid(pipe);
+
+    if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL)
+    {
+        return DEVDRV_USBF_STALL;
+    }
+
+    return DEVDRV_SUCCESS;
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_sqclr (uint16_t pipe)
+{
+    usb0_function_set_sqclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_sqset (uint16_t pipe)
+{
+    usb0_function_set_sqset(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_csclr (uint16_t pipe)
+{
+    usb0_function_set_csclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_set_curpipe
+* Description  : Allocates FIF0 specifed by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    usb0_function_set_curpipe(pipe, fifosel, isel, mbw);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_brdy_sts (uint16_t pipe)
+{
+    usb0_function_clear_brdy_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_bemp_sts (uint16_t pipe)
+{
+    usb0_function_clear_bemp_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_clear_nrdy_sts (uint16_t pipe)
+{
+    usb0_function_clear_nrdy_sts(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_controlrw.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_controlrw.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_api_function_CtrlReadStart
+* Description  : Executes the USB control read transfer.
+*              : USB host controller <- USB device
+* Arguments    : uint16_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND          ; End of data write
+*              : DEVDRV_USBF_WRITESHRT         ; End of short data write
+*              : DEVDRV_USBF_WRITING           ; Continue of data write
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO access error
+*******************************************************************************/
+uint16_t usb0_api_function_CtrlReadStart (uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb0_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0],
+                                 (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    status = usb0_function_write_buffer_c(USB_FUNCTION_PIPE0);
+
+    /* Peripheral Control sequence */
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITESHRT:                                     /* End of data write */
+        case DEVDRV_USBF_WRITEEND:                                      /* End of data write (not null) */
+        case DEVDRV_USBF_WRITING:                                       /* Continue of data write */
+            usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0);          /* Enable Empty Interrupt */
+            usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);              /* Set BUF */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access error */
+        break;
+
+        default:
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb0_api_function_CtrlWriteStart
+* Description  : Executes the USB control write transfer.
+*              : USB host controller -> USB device
+* Arguments    : uint16_t  size         ; Data Size
+*              : uint8_t  *data         ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb0_api_function_CtrlWriteStart (uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb0_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb0_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0],
+                                (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb0_function_enable_brdy_int(USB_FUNCTION_PIPE0);
+    usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_global.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,144 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_global.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+const uint16_t g_usb0_function_bit_set[16] =
+{
+    0x0001, 0x0002, 0x0004, 0x0008,
+    0x0010, 0x0020, 0x0040, 0x0080,
+    0x0100, 0x0200, 0x0400, 0x0800,
+    0x1000, 0x2000, 0x4000, 0x8000
+};
+
+uint32_t g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint8_t  * g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+uint16_t g_usb0_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint32_t g_usb0_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+USB_FUNCTION_DMA_t g_usb0_function_DmaInfo[2];
+uint16_t g_usb0_function_DmaPipe[2];
+uint16_t g_usb0_function_DmaBval[2];
+uint16_t g_usb0_function_DmaStatus[2];
+
+uint16_t g_usb0_function_CtrZeroLengthFlag;
+
+//uint16_t g_usb0_function_ConfigNum;
+//uint16_t g_usb0_function_Alternate[USB_FUNCTION_ALT_NO];
+//uint16_t g_usb0_function_RemoteWakeupFlag;
+uint16_t g_usb0_function_TestModeFlag;
+uint16_t g_usb0_function_TestModeSelectors;
+
+//uint16_t g_usb0_function_ReqType;
+//uint16_t g_usb0_function_ReqTypeType;
+//uint16_t g_usb0_function_ReqTypeRecip;
+//uint16_t g_usb0_function_ReqRequest;
+//uint16_t g_usb0_function_ReqValue;
+//uint16_t g_usb0_function_ReqIndex;
+//uint16_t g_usb0_function_ReqLength;
+
+//uint16_t g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+uint16_t g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+* Function Name: usb0_function_init_status
+* Description  : Initialization USB Sample Driver Variable.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_init_status (void)
+{
+    uint16_t pipe;
+
+    //g_usb0_function_ConfigNum         = 0;
+    //g_usb0_function_RemoteWakeupFlag  = DEVDRV_USBF_OFF;
+    g_usb0_function_TestModeFlag      = DEVDRV_USBF_OFF;
+    g_usb0_function_CtrZeroLengthFlag = 0;
+
+#if 0
+    usb0_function_clear_alt();
+#endif
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+        g_usb0_function_PipeDataSize[pipe] = 0;
+        g_usb0_function_data_count[pipe]   = 0;
+
+        /* pipe configuration in usb0_function_ResetEP() */
+        g_usb0_function_pipecfg[pipe]  = 0;
+        g_usb0_function_pipebuf[pipe]  = 0;
+        g_usb0_function_pipemaxp[pipe] = 0;
+        g_usb0_function_pipeperi[pipe] = 0;
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sig.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,330 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_sig.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb0_function_EnableINTModule(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_InitModule
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint16_t mode  ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode
+*              :                ; other                   ; Full-speed Mode
+* Return Value : none
+*******************************************************************************/
+void usb0_function_InitModule (uint16_t mode)
+{
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);           /* USB function */
+
+    /* USB module operation enabled     */
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    if (mode == USB_FUNCTION_HIGH_SPEED)
+    {
+        RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                            1,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);        /* Hi-Speed Mode */
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                            0,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);
+    }
+
+    /* for power-on                     */
+    if (usb0_function_CheckVBUStaus() == DEVDRV_USBF_ON)
+    {
+        usb0_function_EnableINTModule();            /* Interrupt Enable         */
+        usb0_function_USB_FUNCTION_Attach();        /* pull-up D+ and open D-   */
+    }
+    else
+    {
+        usb0_function_USB_FUNCTION_Detach();        /* USB Detach               */
+                                                    /* with Interrupt Enable    */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_CheckVBUStaus
+* Description  : Checks the USB-VBUS state to returns the connection state to
+*              : the USB host.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   VBUS ON
+*              : DEVDRV_USBF_OFF    :   VBUS OFF
+*******************************************************************************/
+uint16_t usb0_function_CheckVBUStaus (void)
+{
+    uint16_t buf1;
+    uint16_t buf2;
+    uint16_t buf3;
+
+    /* monitor VBUS pins */
+    do
+    {
+        buf1 = RZA_IO_RegRead_16(&USB200.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb0_function_delay_10us(1);
+        buf2 = RZA_IO_RegRead_16(&USB200.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb0_function_delay_10us(1);
+        buf3 = RZA_IO_RegRead_16(&USB200.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+    } while ((buf1 != buf2) || (buf2 != buf3));
+
+    if (buf1 == DEVDRV_USBF_OFF)
+    {
+        return DEVDRV_USBF_OFF;         /* detach */
+    }
+
+    return DEVDRV_USBF_ON;              /* attach */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Attach
+* Description  : Connects to the USB host controller.
+*              : This function pulls up D+.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_USB_FUNCTION_Attach (void)
+{
+    Userdef_USB_usb0_function_attach();
+
+    Userdef_USB_usb0_function_delay_xms(10);
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);      /* Pull-up D+ and open D- */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Detach
+* Description  : Disconnects from the USB host controller.
+*              : This function opens D+/D-.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_USB_FUNCTION_Detach (void)
+{
+    uint16_t pipe;
+
+    Userdef_USB_usb0_function_detach();
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE)
+        {
+            usb0_function_stop_transfer(pipe);
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);                  /* open D+ and D- */
+
+    /* Detach Recovery */
+    Userdef_USB_usb0_function_delay_500ns();                /* need 1us=500ns * 2 wait */
+    Userdef_USB_usb0_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+    Userdef_USB_usb0_function_delay_500ns();                /* need 100ns wait but 500ns S/W wait */
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        0,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);       /* soft reset module */
+    Userdef_USB_usb0_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB200.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    usb0_function_EnableINTModule();            /* Interrupt Enable */
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_BusReset
+* Description  : This function is executed when the USB device is transitioned
+*              : to POWERD_STATE. Sets the device descriptor according to the
+*              : connection speed determined by the USB reset hand shake.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb0_function_USB_FUNCTION_BusReset (void)
+{
+    usb0_function_init_status();                                    /* memory clear */
+
+    if (usb0_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED)
+    {
+        usb0_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED);     /* Device Descriptor reset */
+    }
+    else
+    {
+        usb0_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED);     /* Device Descriptor reset */
+    }
+
+    usb0_function_ResetDCP();                                       /* Default Control PIPE reset */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Resume
+* Description  : This function is executed when the USB device detects a resume
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb0_function_USB_FUNCTION_Resume (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_Suspend
+* Description  : This function is executed when the USB device detects a suspend
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb0_function_USB_FUNCTION_Suspend (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_USB_FUNCTION_TestMode
+* Description  : This function is executed when the USB device is transitioned U
+*              : to TEST_MODE by the USB standard request.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_USB_FUNCTION_TestMode (void)
+{
+    switch (g_usb0_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT)
+    {
+        case USB_FUNCTION_FUNCTION_TEST_J:
+        case USB_FUNCTION_FUNCTION_TEST_K:
+        case USB_FUNCTION_FUNCTION_TEST_SE0_NAK:
+        case USB_FUNCTION_FUNCTION_TEST_PACKET:
+            RZA_IO_RegWrite_16(&USB200.TESTMODE,
+                                (g_usb0_function_TestModeSelectors >> 8),
+                                USB_TESTMODE_UTST_SHIFT,
+                                USB_TESTMODE_UTST);
+        break;
+
+        case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE:
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_EnableINTModule
+* Description  : Enables USB interrupt.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_EnableINTModule (void)
+{
+    uint16_t buf;
+
+    buf  = USB200.INTENB0;
+    buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE |
+             USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE);
+    USB200.INTENB0 = buf;
+
+    usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sub.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,453 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_sub.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb0_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+#if 0
+extern const uint16_t *g_usb0_function_EndPntPtr[];
+extern uint8_t         g_usb0_function_DeviceDescriptor[];
+extern uint8_t        *g_usb0_function_ConfigurationPtr[];
+#endif
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb0_function_ResetDCP
+* Description  : Initializes the default control pipe(DCP).
+* Outline      : Reset default control pipe
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_ResetDCP (void)
+{
+    USB200.DCPCFG  = 0;
+#if 0
+    USB200.DCPMAXP = g_usb0_function_DeviceDescriptor[7];
+#else
+    USB200.DCPMAXP = 64;
+#endif
+
+    USB200.CFIFOSEL  = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB200.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB200.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_ResetEP
+* Description  : Initializes the end point.
+* Arguments    : uint16_t num          ; Configuration Number
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_ResetEP (uint16_t num)
+{
+    uint16_t   pipe;
+    uint16_t   ep;
+    uint16_t   index;
+    uint16_t   buf;
+    uint16_t * tbl;
+
+    tbl = (uint16_t *)(g_usb0_function_EndPntPtr[num - 1]);
+
+    for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        if (g_usb0_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR)
+        {
+            index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb0_function_EPTableIndex[ep]);
+            pipe  = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE);
+
+            g_usb0_function_PipeTbl[pipe] = (uint16_t)( ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) |
+                                                         ep                                             |
+                                                         (tbl[index + 0] & USB_FUNCTION_FIFO_USE)          );
+
+            if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT)
+            {
+                tbl[index + 1] |= USB_FUNCTION_SHTNAKON;
+#ifdef  __USB_DMA_BFRE_ENABLE__
+                /* this routine cannnot be perfomred if read operation is executed in buffer size */
+                if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) ||
+                    ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA))
+                {
+                    tbl[index + 1] |= USB_FUNCTION_BFREON;
+                }
+#endif
+            }
+
+            /* Interrupt Disable */
+            buf  = USB200.BRDYENB;
+            buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
+            USB200.BRDYENB = buf;
+            buf  = USB200.NRDYENB;
+            buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
+            USB200.NRDYENB = buf;
+            buf  = USB200.BEMPENB;
+            buf &= (uint16_t)~g_usb0_function_bit_set[pipe];
+            USB200.BEMPENB = buf;
+
+            usb0_function_set_pid_nak(pipe);
+
+            /* CurrentPIPE Clear */
+            if (RZA_IO_RegRead_16(&USB200.CFIFOSEL,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB200.CFIFOSEL,
+                                    0,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB200.D0FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB200.D0FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB200.D1FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB200.D1FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            /* PIPE Configuration */
+            USB200.PIPESEL  = pipe;
+            USB200.PIPECFG  = tbl[index + 1];
+            USB200.PIPEBUF  = tbl[index + 2];
+            USB200.PIPEMAXP = tbl[index + 3];
+            USB200.PIPEPERI = tbl[index + 4];
+
+            g_usb0_function_pipecfg[pipe]  = tbl[index + 1];
+            g_usb0_function_pipebuf[pipe]  = tbl[index + 2];
+            g_usb0_function_pipemaxp[pipe] = tbl[index + 3];
+            g_usb0_function_pipeperi[pipe] = tbl[index + 4];
+
+            /* Buffer Clear */
+            usb0_function_set_sqclr(pipe);
+            usb0_function_aclrm(pipe);
+
+            /* init Global */
+            g_usb0_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+            g_usb0_function_PipeDataSize[pipe] = 0;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_EpToPipe
+* Description  : Returns the pipe which end point specified by the argument is
+*              : allocated to.
+* Arguments    : uint16_t ep       ; Direction + Endpoint Number
+* Return Value : USB_FUNCTION_EP_ERROR         : Error
+*              : Others           : Pipe Number
+*******************************************************************************/
+uint16_t usb0_function_EpToPipe (uint16_t ep)
+{
+    uint16_t pipe;
+
+    for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((g_usb0_function_PipeTbl[pipe] & 0x00ff) == ep)
+        {
+            return pipe;
+        }
+    }
+
+    return USB_FUNCTION_EP_ERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_InitEPTable
+* Description  : Sets the end point by the Alternate setting value of the
+*              : configuration number and the interface number specified by the
+*              : argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+*              : uint16_t Alt_Num       ; Alternate Setting
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point_interface;
+    uint16_t   point_endpoint;
+    uint16_t   length;
+    uint16_t   start;
+    uint16_t   numbers;
+    uint16_t   endpoint;
+
+    ptr = (uint8_t *)g_usb0_function_ConfigurationPtr[Con_Num - 1];
+    point_interface = *ptr;
+    length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2));
+    ptr  += *ptr;
+    start   = 0;
+    numbers = 0;
+    point_endpoint = 0;
+
+    for (; point_interface < length;)
+    {
+        switch (*(ptr + 1))                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                     /* Interface */
+                if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num))
+                {
+                    numbers = *(ptr + 4);
+                }
+                else
+                {
+                    start  += *(ptr + 4);
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_ENDPOINT:                      /* Endpoint */
+                if (point_endpoint < numbers)
+                {
+                    endpoint = (uint16_t)(*(ptr + 2) & 0x0f);
+                    g_usb0_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint);
+                    ++point_endpoint;
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                        /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:                 /* Configuration */
+            case USB_FUNCTION_DT_STRING:                        /* String */
+            default:                                            /* Class, Vendor, else */
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_GetConfigNum
+* Description  : Returns the number of configuration referring to the number of
+*              : configuration described in the device descriptor.
+* Arguments    : none
+* Return Value : Number of possible configurations (bNumConfigurations).
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_GetConfigNum (void)
+{
+    return (uint16_t)g_usb0_function_DeviceDescriptor[17];
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_GetInterfaceNum
+* Description  : Returns the number of interface referring to the number of
+*              : interface described in the configuration descriptor.
+* Arguments    : uint16_t num       ; Configuration Number
+* Return Value : Number of this interface (bNumInterfaces).
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_GetInterfaceNum (uint16_t num)
+{
+    return (uint16_t)(*(g_usb0_function_ConfigurationPtr[num - 1] + 4));
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_GetAltNum
+* Description  : Returns the Alternate setting value of the configuration number
+*              : and the interface number specified by the argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+* Return Value : Value used to select this alternate setting(bAlternateSetting).
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point;
+    uint16_t   alt_num = 0;
+    uint16_t   length;
+
+    ptr = (uint8_t *)(g_usb0_function_ConfigurationPtr[Con_Num - 1]);
+    point = ptr[0];
+    ptr  += ptr[0];                                 /* InterfaceDescriptor[0] */
+    length  = (uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 2));
+    length |= (uint16_t)((uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8);
+
+    for (; point < length;)                                 /* Search Descriptor Table size */
+    {
+        switch (ptr[1])                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                 /* Interface */
+                if (Int_Num == ptr[2])
+                {
+                    alt_num = (uint16_t)ptr[3];             /* Alternate Number count */
+                }
+                point += ptr[0];
+                ptr += ptr[0];
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                    /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:             /* Configuration */
+            case USB_FUNCTION_DT_STRING:                    /* String */
+            case USB_FUNCTION_DT_ENDPOINT:                  /* Endpoint */
+            default:                                        /* Class, Vendor, else */
+                point += ptr[0];
+                ptr   += ptr[0];
+            break;
+        }
+    }
+    return alt_num;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_CheckRemoteWakeup
+* Description  : Returns the result of the remote wake up function is supported
+*              : or not referring to the configuration descriptor.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   Support Remote Wakeup
+*              : DEVDRV_USBF_OFF    :   not Support Remote Wakeup
+*******************************************************************************/
+#if 0
+uint16_t usb0_function_CheckRemoteWakeup (void)
+{
+    uint8_t atr;
+
+    if (g_usb0_function_ConfigNum == 0)
+    {
+        return DEVDRV_USBF_OFF;
+    }
+
+    atr = *(g_usb0_function_ConfigurationPtr[g_usb0_function_ConfigNum - 1] + 7);
+
+    if (atr & USB_FUNCTION_CF_RWUP)
+    {
+        return DEVDRV_USBF_ON;
+    }
+
+    return DEVDRV_USBF_OFF;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_alt
+* Description  : Initializes the Alternate setting area.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_clear_alt (void)
+{
+    int i;
+
+    for (i = 0; i < USB_FUNCTION_ALT_NO; ++i)
+    {
+        g_usb0_function_Alternate[i] = 0;                           /* Alternate */
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_pipe_tbl
+* Description  : Initializes pipe definition table.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb0_function_clear_pipe_tbl (void)
+{
+    int pipe;
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb0_function_PipeTbl[pipe] = 0;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_clear_ep_table_index
+* Description  : Initializes the end point table index.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb0_function_clear_ep_table_index (void)
+{
+    int ep;
+
+    for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        g_usb0_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR;
+    }
+}
+#endif
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,698 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_dmacdrv.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "rza_io_regrw.h"
+#include "usb0_function_dmacdrv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DMAC_INDEFINE   (255)       /* Macro definition when REQD bit is not used */
+
+/* ==== Request setting information for on-chip peripheral module ==== */
+typedef enum dmac_peri_req_reg_type
+{
+    DMAC_REQ_MID,
+    DMAC_REQ_RID,
+    DMAC_REQ_AM,
+    DMAC_REQ_LVL,
+    DMAC_REQ_REQD
+} dmac_peri_req_reg_type_t;
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+/* ==== Prototype declaration ==== */
+
+/* ==== Global variable ==== */
+/* On-chip peripheral module request setting table */
+static const uint8_t usb0_function_dmac_peri_req_init_table[8][5] =
+{
+    /* MID,RID,AM,LVL,REQD */
+    {32, 3, 2, 1, 1},    /* USB_0 channel 0 transmit FIFO empty */
+    {32, 3, 2, 1, 0},    /* USB_0 channel 0 receive FIFO full   */
+    {33, 3, 2, 1, 1},    /* USB_0 channel 1 transmit FIFO empty */
+    {33, 3, 2, 1, 0},    /* USB_0 channel 1 receive FIFO full   */
+    {34, 3, 2, 1, 1},    /* USB_1 channel 0 transmit FIFO empty */
+    {34, 3, 2, 1, 0},    /* USB_1 channel 0 receive FIFO full   */
+    {35, 3, 2, 1, 1},    /* USB_1 channel 1 transmit FIFO empty */
+    {35, 3, 2, 1, 0},    /* USB_1 channel 1 receive FIFO full   */
+};
+
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 1.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 1 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t *trans_info   : Setting information to DMAC register
+*              : uint32_t          dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t          continuation : Set continuous transfer to be valid
+*              :                                  after DMA transfer has been completed
+*              :             DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :             DMAC_SAMPLE_SINGLE       : Do not execute continuous transfer
+*              : uint32_t request_factor        : Factor for on-chip peripheral module request
+*              :             DMAC_REQ_OSTM0TINT       : OSTM_0 compare match
+*              :             DMAC_REQ_OSTM1TINT       : OSTM_1 compare match
+*              :             DMAC_REQ_TGI0A           : MTU2_0 input capture/compare match
+*              :                  :
+*              : uint32_t          req_direction: Setting value of CHCFG_n register REQD bit
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC1_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC1.N0SA_n = trans_info->src_addr;        /* Start address of transfer source      */
+        DMAC1.N0DA_n = trans_info->dst_addr;        /* Start address of transfer destination */
+        DMAC1.N0TB_n = trans_info->count;           /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC1_CHCFG_n_DAD_SHIFT,
+                            DMAC1_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC1_CHCFG_n_SAD_SHIFT,
+                            DMAC1_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC1_CHCFG_n_DDS_SHIFT,
+                            DMAC1_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC1_CHCFG_n_SDS_SHIFT,
+                            DMAC1_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_DMS_SHIFT,
+                            DMAC1_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_RSEL_SHIFT,
+                            DMAC1_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_SBE_SHIFT,
+                            DMAC1_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_DEM_SHIFT,
+                            DMAC1_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                1,
+                                DMAC1_CHCFG_n_REN_SHIFT,
+                                DMAC1_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                1,
+                                DMAC1_CHCFG_n_RSW_SHIFT,
+                                DMAC1_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                0,
+                                DMAC1_CHCFG_n_REN_SHIFT,
+                                DMAC1_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                0,
+                                DMAC1_CHCFG_n_RSW_SHIFT,
+                                DMAC1_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_TM_SHIFT,
+                            DMAC1_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            1,
+                            DMAC1_CHCFG_n_SEL_SHIFT,
+                            DMAC1_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            1,
+                            DMAC1_CHCFG_n_HIEN_SHIFT,
+                            DMAC1_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            0,
+                            DMAC1_CHCFG_n_LOEN_SHIFT,
+                            DMAC1_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC1_CHCFG_n_AM_SHIFT,
+                            DMAC1_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC1_CHCFG_n_LVL_SHIFT,
+                            DMAC1_CHCFG_n_LVL);
+
+        if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC1_CHCFG_n_REQD_SHIFT,
+                                DMAC1_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC1.CHCFG_n,
+                                req_direction,
+                                DMAC1_CHCFG_n_REQD_SHIFT,
+                                DMAC1_CHCFG_n_REQD);
+        }
+
+        RZA_IO_RegWrite_32(&DMAC01.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC01_DMARS_CH1_RID_SHIFT,
+                            DMAC01_DMARS_CH1_RID);
+        RZA_IO_RegWrite_32(&DMAC01.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC01_DMARS_CH1_MID_SHIFT,
+                            DMAC01_DMARS_CH1_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_Open
+* Description  : Enables DMAC channel 1 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb0_function_DMAC1_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_EN_SHIFT,
+                                DMAC1_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_TACT_SHIFT,
+                                DMAC1_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                            1,
+                            DMAC1_CHCTRL_n_SWRST_SHIFT,
+                            DMAC1_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC1.CHCTRL_n,
+                                DMAC1_CHCTRL_n_SWRST_SHIFT,
+                                DMAC1_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                            1,
+                            DMAC1_CHCTRL_n_SETEN_SHIFT,
+                            DMAC1_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                                1,
+                                DMAC1_CHCTRL_n_STG_SHIFT,
+                                DMAC1_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_Close
+* Description  : Aborts DMAC channel 1 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC1_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n,
+                        1,
+                        DMAC1_CHCTRL_n_CLREN_SHIFT,
+                        DMAC1_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_TACT_SHIFT,
+                                DMAC1_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_EN_SHIFT,
+                                DMAC1_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC1.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC1_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 1 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 1 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC1_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC1.CHSTAT_n,
+                                DMAC1_CHSTAT_n_SR_SHIFT,
+                                DMAC1_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC1.N0SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC1.N0DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC1.N0TB_n = count;       /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC1.N1SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC1.N1DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC1.N1TB_n = count;       /* Total transfer byte count             */
+     }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 2.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 2 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t * trans_info : Setting information to DMAC
+*              :                               : register
+*              : uint32_t dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t continuation : Set continuous transfer to be valid
+*              :                       : after DMA transfer has been completed
+*              :         DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :         DMAC_SAMPLE_SINGLE       : Do not execute continuous
+*              :                                  : transfer
+*              : uint32_t request_factor : Factor for on-chip peripheral module
+*              :                         : request
+*              :         DMAC_REQ_OSTM0TINT : OSTM_0 compare match
+*              :         DMAC_REQ_OSTM1TINT : OSTM_1 compare match
+*              :         DMAC_REQ_TGI0A     : MTU2_0 input capture/compare match
+*              :                 :
+*              : uint32_t req_direction : Setting value of CHCFG_n register
+*              :                        : REQD bit
+*******************************************************************************/
+void usb0_function_DMAC2_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC2.N0SA_n = trans_info->src_addr;        /* Start address of transfer source      */
+        DMAC2.N0DA_n = trans_info->dst_addr;        /* Start address of transfer destination */
+        DMAC2.N0TB_n = trans_info->count;           /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC2_CHCFG_n_DAD_SHIFT,
+                            DMAC2_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC2_CHCFG_n_SAD_SHIFT,
+                            DMAC2_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC2_CHCFG_n_DDS_SHIFT,
+                            DMAC2_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC2_CHCFG_n_SDS_SHIFT,
+                            DMAC2_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_DMS_SHIFT,
+                            DMAC2_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_RSEL_SHIFT,
+                            DMAC2_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_SBE_SHIFT,
+                            DMAC2_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_DEM_SHIFT,
+                            DMAC2_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                1,
+                                DMAC2_CHCFG_n_REN_SHIFT,
+                                DMAC2_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                1,
+                                DMAC2_CHCFG_n_RSW_SHIFT,
+                                DMAC2_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                0,
+                                DMAC2_CHCFG_n_REN_SHIFT,
+                                DMAC2_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                0,
+                                DMAC2_CHCFG_n_RSW_SHIFT,
+                                DMAC2_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_TM_SHIFT,
+                            DMAC2_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            2,
+                            DMAC2_CHCFG_n_SEL_SHIFT,
+                            DMAC2_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            1,
+                            DMAC2_CHCFG_n_HIEN_SHIFT,
+                            DMAC2_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            0,
+                            DMAC2_CHCFG_n_LOEN_SHIFT,
+                            DMAC2_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC2_CHCFG_n_AM_SHIFT,
+                            DMAC2_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC2_CHCFG_n_LVL_SHIFT,
+                            DMAC2_CHCFG_n_LVL);
+        if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC2_CHCFG_n_REQD_SHIFT,
+                                DMAC2_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC2.CHCFG_n,
+                                req_direction,
+                                DMAC2_CHCFG_n_REQD_SHIFT,
+                                DMAC2_CHCFG_n_REQD);
+        }
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC23_DMARS_CH2_RID_SHIFT,
+                            DMAC23_DMARS_CH2_RID);
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC23_DMARS_CH2_MID_SHIFT,
+                            DMAC23_DMARS_CH2_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_Open
+* Description  : Enables DMAC channel 2 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb0_function_DMAC2_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2,
+                                DMAC2_CHSTAT_n_EN_SHIFT,
+                                DMAC2_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2,
+                                DMAC2_CHSTAT_n_TACT_SHIFT,
+                                DMAC2_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                            1,
+                            DMAC2_CHCTRL_n_SWRST_SHIFT,
+                            DMAC2_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC2.CHCTRL_n,
+                                DMAC2_CHCTRL_n_SWRST_SHIFT,
+                                DMAC2_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                            1,
+                            DMAC2_CHCTRL_n_SETEN_SHIFT,
+                            DMAC2_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                                1,
+                                DMAC2_CHCTRL_n_STG_SHIFT,
+                                DMAC2_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_Close
+* Description  : Aborts DMAC channel 2 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC2_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n,
+                        1,
+                        DMAC2_CHCTRL_n_CLREN_SHIFT,
+                        DMAC2_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n,
+                                DMAC2_CHSTAT_n_TACT_SHIFT,
+                                DMAC2_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n,
+                                DMAC2_CHSTAT_n_EN_SHIFT,
+                                DMAC2_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC2.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_DMAC2_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 2 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 2 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb0_function_DMAC2_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC2.CHSTAT_n,
+                                DMAC2_CHSTAT_n_SR_SHIFT,
+                                DMAC2_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC2.N0SA_n = src_addr;     /* Start address of transfer source      */
+        DMAC2.N0DA_n = dst_addr;     /* Start address of transfer destination */
+        DMAC2.N0TB_n = count;        /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC2.N1SA_n = src_addr;     /* Start address of transfer source      */
+        DMAC2.N1DA_n = dst_addr;     /* Start address of transfer destination */
+        DMAC2.N1TB_n = count;        /* Total transfer byte count             */
+     }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,762 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb0_function_userdef.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "devdrv_usb_function_api.h"
+#include "usb0_function_dmacdrv.h"  /* common DMAC driver for USB */
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DUMMY_ACCESS OSTM0CNT
+
+/* #define CACHE_WRITEBACK */
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern int32_t io_cwb(unsigned long start, unsigned long end);
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb0_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void usb0_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void Userdef_USB_usb0_function_delay_10us_2(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_d0fifo_dmaintid
+* Description  : get D0FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D0FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_d1fifo_dmaintid
+* Description  : get D1FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D1FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_attach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_attach (void)
+{
+    printf("\n");
+    printf("channel 0 attach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_detach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_detach (void)
+{
+    printf("\n");
+    printf("channel 0 detach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_1ms
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_1ms (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /*
+     * Wait 1ms (Please change for your MCU).
+     */
+    for (i = 0; i < 1440; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_xms
+* Description  : Wait for the software in the period of time specified by the
+*              : argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t msec ; Wait Time (msec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_xms (uint32_t msec)
+{
+    volatile unsigned short i;
+
+    for (i = 0; i < msec; ++i)
+    {
+        Userdef_USB_usb0_function_delay_1ms();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_10us
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t usec ; Wait Time(x 10usec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_10us (uint32_t usec)
+{
+    volatile int i;
+
+    /* Wait 10us (Please change for your MCU) */
+    for (i = 0; i < usec; ++i)
+    {
+        Userdef_USB_usb0_function_delay_10us_2();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_10us_2
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void Userdef_USB_usb0_function_delay_10us_2 (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 1us (Please change for your MCU) */
+    for (i = 0; i < 14; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_delay_500ns
+* Description  : Wait for software for 500ns.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_delay_500ns (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 500ns (Please change for your MCU) */
+    /* Wait 500ns I clock 266MHz */
+    tmp = DUMMY_ACCESS;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_start_dma
+* Description  : Enables DMA transfer on the information specified by the argument.
+*              : Set DMAC register by this function to enable DMA transfer.
+*              : After executing this function, USB module is set to start DMA
+*              : transfer. DMA transfer should not wait for DMA transfer complete.
+* Arguments    : USB_FUNCTION_DMA_t *dma   : DMA parameter
+*              :  typedef struct{
+*              :      uint32_t fifo;    FIFO for using
+*              :      uint32_t buffer;  Start address of transfer source/destination
+*              :      uint32_t bytes;   Transfer size(Byte)
+*              :      uint32_t dir;     Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer)
+*              :      uint32_t size;    DMA transfer size
+*              :   } USB_FUNCTION_DMA_t;
+*              : uint16_t dfacc ; 0 : cycle steal mode
+*              :                  1 : 16byte continuous mode
+*              :                  2 : 32byte continuous mode
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb0_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc)
+{
+    uint32_t trncount;
+    uint32_t src;
+    uint32_t dst;
+    uint32_t size;
+    uint32_t dir;
+#ifdef CACHE_WRITEBACK
+    uint32_t ptr;
+#endif
+
+    trncount = dma->bytes;
+    dir      = dma->dir;
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        /* DxFIFO determination */
+        dst = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            src = (uint32_t)(&USB200.D0FIFO.UINT32);
+        }
+        else
+        {
+            src = (uint32_t)(&USB200.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            src += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB200.D0FIFO.UINT32);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB200.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            src += 3;       /* byte access */
+        }
+#endif
+    }
+    else
+    {
+        /* DxFIFO determination */
+        src = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+        }
+        else
+        {
+            dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            dst += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB200.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB200.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB200.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB200.D1FIFO.UINT32);
+            }
+            dst += 3;       /* byte access  */
+        }
+#endif
+    }
+
+#ifdef CACHE_WRITEBACK
+    ptr = (uint32_t)dma->buffer;
+
+    if ((ptr & 0x20000000ul) == 0)
+    {
+        io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount);
+    }
+#endif
+
+    if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+    {
+        usb0_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+    else
+    {
+        usb0_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_dmac0
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB0_DMA0_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB0_DMA0_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb0_function_DMAC1_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb0_function_DMAC1_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb0_function_DMAC1_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC1 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: usb0_function_enable_dmac1
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb0_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB0_DMA1_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB0_DMA1_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb0_function_DMAC2_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb0_function_DMAC1_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb0_function_DMAC2_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC2 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_stop_dma0
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D0_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb0_function_stop_dma0 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb0_function_DMAC1_Close(&remain);
+
+    return remain;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb0_function_stop_dma1
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D1_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb0_function_stop_dma1 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb0_function_DMAC2_Close(&remain);
+
+    return remain;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,171 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB1_FUNCTION_H
+#define USB1_FUNCTION_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "devdrv_usb_function_api.h"
+#include "usb_function.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern const uint16_t       g_usb1_function_bit_set[];
+extern uint32_t             g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint8_t              *g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+extern uint16_t             g_usb1_function_PipeIgnore[];
+extern uint16_t             g_usb1_function_PipeTbl[];
+extern uint16_t             g_usb1_function_pipe_status[];
+extern uint32_t             g_usb1_function_PipeDataSize[];
+
+extern USB_FUNCTION_DMA_t   g_usb1_function_DmaInfo[];
+extern uint16_t             g_usb1_function_DmaPipe[];
+extern uint16_t             g_usb1_function_DmaBval[];
+extern uint16_t             g_usb1_function_DmaStatus[];
+
+extern uint16_t             g_usb1_function_CtrZeroLengthFlag;
+
+extern uint16_t             g_usb1_function_ConfigNum;
+extern uint16_t             g_usb1_function_Alternate[USB_FUNCTION_ALT_NO];
+extern uint16_t             g_usb1_function_RemoteWakeupFlag;
+extern uint16_t             g_usb1_function_TestModeFlag;
+extern uint16_t             g_usb1_function_TestModeSelectors;
+
+extern uint16_t             g_usb1_function_ReqType;
+extern uint16_t             g_usb1_function_ReqTypeType;
+extern uint16_t             g_usb1_function_ReqTypeRecip;
+extern uint16_t             g_usb1_function_ReqRequest;
+extern uint16_t             g_usb1_function_ReqValue;
+extern uint16_t             g_usb1_function_ReqIndex;
+extern uint16_t             g_usb1_function_ReqLength;
+
+extern uint16_t             g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+extern uint16_t             g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+extern uint16_t             g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+/* ==== common ==== */
+void     usb1_function_dma_stop_d0(uint16_t pipe, uint32_t remain);
+void     usb1_function_dma_stop_d1(uint16_t pipe, uint32_t remain);
+uint16_t usb1_function_is_hispeed(void);
+uint16_t usb1_function_is_hispeed_enable(void);
+uint16_t usb1_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb1_function_write_buffer(uint16_t pipe);
+uint16_t usb1_function_write_buffer_c(uint16_t pipe);
+uint16_t usb1_function_write_buffer_d0(uint16_t pipe);
+uint16_t usb1_function_write_buffer_d1(uint16_t pipe);
+void     usb1_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb1_function_read_buffer(uint16_t pipe);
+uint16_t usb1_function_read_buffer_c(uint16_t pipe);
+uint16_t usb1_function_read_buffer_d0(uint16_t pipe);
+uint16_t usb1_function_read_buffer_d1(uint16_t pipe);
+uint16_t usb1_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb1_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb1_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc);
+uint16_t usb1_function_get_mbw(uint32_t trncount, uint32_t dtptr);
+uint16_t usb1_function_read_dma(uint16_t pipe);
+void     usb1_function_brdy_int(uint16_t status, uint16_t int_enb);
+void     usb1_function_nrdy_int(uint16_t status, uint16_t int_enb);
+void     usb1_function_bemp_int(uint16_t status, uint16_t int_enb);
+void     usb1_function_setting_interrupt(uint8_t level);
+void     usb1_function_reset_module(uint16_t clockmode);
+uint16_t usb1_function_get_buf_size(uint16_t pipe);
+uint16_t usb1_function_get_mxps(uint16_t pipe);
+void     usb1_function_clear_brdy_sts(uint16_t pipe);
+void     usb1_function_clear_bemp_sts(uint16_t pipe);
+void     usb1_function_clear_nrdy_sts(uint16_t pipe);
+void     usb1_function_set_pid_buf(uint16_t pipe);
+void     usb1_function_set_pid_nak(uint16_t pipe);
+void     usb1_function_set_pid_stall(uint16_t pipe);
+void     usb1_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb1_function_get_pid(uint16_t pipe);
+void     usb1_function_set_sqclr(uint16_t pipe);
+void     usb1_function_set_sqset(uint16_t pipe);
+void     usb1_function_set_csclr(uint16_t pipe);
+void     usb1_function_aclrm(uint16_t pipe);
+void     usb1_function_set_aclrm(uint16_t pipe);
+void     usb1_function_clr_aclrm(uint16_t pipe);
+uint16_t usb1_function_get_sqmon(uint16_t pipe);
+uint16_t usb1_function_get_inbuf(uint16_t pipe);
+
+/* ==== function ==== */
+void     usb1_function_init_status(void);
+void     usb1_function_InitModule(uint16_t mode);
+uint16_t usb1_function_CheckVBUStaus(void);
+void     usb1_function_USB_FUNCTION_Attach(void);
+void     usb1_function_USB_FUNCTION_Detach(void);
+void     usb1_function_USB_FUNCTION_BusReset(void);
+void     usb1_function_USB_FUNCTION_Resume(void);
+void     usb1_function_USB_FUNCTION_Suspend(void);
+void     usb1_function_USB_FUNCTION_TestMode(void);
+void     usb1_function_ResetDCP(void);
+void     usb1_function_ResetEP(uint16_t num);
+uint16_t usb1_function_EpToPipe(uint16_t ep);
+void     usb1_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num);
+uint16_t usb1_function_GetConfigNum(void);
+uint16_t usb1_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num);
+uint16_t usb1_function_CheckRemoteWakeup(void);
+void     usb1_function_clear_alt(void);
+void     usb1_function_clear_pipe_tbl(void);
+void     usb1_function_clear_ep_table_index(void);
+uint16_t usb1_function_GetInterfaceNum(uint16_t num);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* USB1_FUNCTION_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_api.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,104 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_api.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB1_FUNCTION_API_H
+#define USB1_FUNCTION_API_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Variable Externs
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void     usb1_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode);
+uint16_t usb1_api_function_IsConfigured(void);
+uint16_t usb1_function_GetDeviceState(void);
+uint16_t usb1_api_function_CtrlReadStart(uint32_t size, uint8_t *data);
+void     usb1_api_function_CtrlWriteStart(uint32_t size, uint8_t *data);
+uint16_t usb1_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+uint16_t usb1_api_function_check_pipe_status(uint16_t pipe, uint32_t *size);
+void     usb1_api_function_clear_pipe_status(uint16_t pipe);
+void     usb1_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data);
+void     usb1_api_function_set_pid_buf(uint16_t pipe);
+void     usb1_api_function_set_pid_nak(uint16_t pipe);
+void     usb1_api_function_set_pid_stall(uint16_t pipe);
+void     usb1_api_function_clear_pid_stall(uint16_t pipe);
+uint16_t usb1_api_function_get_pid(uint16_t pipe);
+int32_t  usb1_api_function_check_stall(uint16_t pipe);
+void     usb1_api_function_set_sqclr(uint16_t pipe);
+void     usb1_api_function_set_sqset(uint16_t pipe);
+void     usb1_api_function_set_csclr(uint16_t pipe);
+void     usb1_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw);
+void     usb1_api_function_clear_brdy_sts(uint16_t pipe);
+void     usb1_api_function_clear_bemp_sts(uint16_t pipe);
+void     usb1_api_function_clear_nrdy_sts(uint16_t pipe);
+
+void     usb1_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+void     usb1_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB1_FUNCTION_API_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dmacdrv.h
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Description  : RZ/A1H R7S72100 USB Sample Program
+*******************************************************************************/
+#ifndef USB1_FUNCTION_DMACDRV_H
+#define USB1_FUNCTION_DMACDRV_H
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+typedef struct dmac_transinfo
+{
+    uint32_t src_addr;      /* Transfer source address                */
+    uint32_t dst_addr;      /* Transfer destination address           */
+    uint32_t count;         /* Transfer byte count                    */
+    uint32_t src_size;      /* Transfer source data size              */
+    uint32_t dst_size;      /* Transfer destination data size         */
+    uint32_t saddr_dir;     /* Transfer source address direction      */
+    uint32_t daddr_dir;     /* Transfer destination address direction */
+} dmac_transinfo_t;
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+/* ==== Transfer specification of the sample program ==== */
+#define DMAC_SAMPLE_SINGLE          (0)     /* Single transfer                   */
+#define DMAC_SAMPLE_CONTINUATION    (1)     /* Continuous transfer (use REN bit) */
+
+/* ==== DMA modes ==== */
+#define DMAC_MODE_REGISTER          (0)     /* Register mode */
+#define DMAC_MODE_LINK              (1)     /* Link mode     */
+
+/* ==== Transfer requests ==== */
+#define DMAC_REQ_MODE_EXT           (0)     /* External request                   */
+#define DMAC_REQ_MODE_PERI          (1)     /* On-chip peripheral module request  */
+#define DMAC_REQ_MODE_SOFT          (2)     /* Auto-request (request by software) */
+
+/* ==== DMAC transfer sizes ==== */
+#define DMAC_TRANS_SIZE_8           (0)     /* 8 bits    */
+#define DMAC_TRANS_SIZE_16          (1)     /* 16 bits   */
+#define DMAC_TRANS_SIZE_32          (2)     /* 32 bits   */
+#define DMAC_TRANS_SIZE_64          (3)     /* 64 bits   */
+#define DMAC_TRANS_SIZE_128         (4)     /* 128 bits  */
+#define DMAC_TRANS_SIZE_256         (5)     /* 256 bits  */
+#define DMAC_TRANS_SIZE_512         (6)     /* 512 bits  */
+#define DMAC_TRANS_SIZE_1024        (7)     /* 1024 bits */
+
+/* ==== Address increment for transferring ==== */
+#define DMAC_TRANS_ADR_NO_INC       (1)     /* Not increment */
+#define DMAC_TRANS_ADR_INC          (0)     /* Increment     */
+
+/* ==== Method for detecting DMA request ==== */
+#define DMAC_REQ_DET_FALL           (0)     /* Falling edge detection */
+#define DMAC_REQ_DET_RISE           (1)     /* Rising edge detection  */
+#define DMAC_REQ_DET_LOW            (2)     /* Low level detection    */
+#define DMAC_REQ_DET_HIGH           (3)     /* High level detection   */
+
+/* ==== Request Direction ==== */
+#define DMAC_REQ_DIR_SRC            (0)     /* DMAREQ is the source/ DMAACK is active when reading      */
+#define DMAC_REQ_DIR_DST            (1)     /* DMAREQ is the destination/ DMAACK is active when writing */
+
+/* ==== Descriptors ==== */
+#define DMAC_DESC_HEADER            (0)     /* Header              */
+#define DMAC_DESC_SRC_ADDR          (1)     /* Source Address      */
+#define DMAC_DESC_DST_ADDR          (2)     /* Destination Address */
+#define DMAC_DESC_COUNT             (3)     /* Transaction Byte    */
+#define DMAC_DESC_CHCFG             (4)     /* Channel Confg       */
+#define DMAC_DESC_CHITVL            (5)     /* Channel Interval    */
+#define DMAC_DESC_CHEXT             (6)     /* Channel Extension   */
+#define DMAC_DESC_LINK_ADDR         (7)     /* Link Address        */
+
+/* ==== On-chip peripheral module requests ===== */
+typedef enum dmac_request_factor
+{
+    DMAC_REQ_USB0_DMA0_TX,      /* USB_0 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA0_RX,      /* USB_0 channel 0 receive FIFO full              */
+    DMAC_REQ_USB0_DMA1_TX,      /* USB_0 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB0_DMA1_RX,      /* USB_0 channel 1 receive FIFO full              */
+    DMAC_REQ_USB1_DMA0_TX,      /* USB_1 channel 0 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA0_RX,      /* USB_1 channel 0 receive FIFO full              */
+    DMAC_REQ_USB1_DMA1_TX,      /* USB_1 channel 1 transmit FIFO empty            */
+    DMAC_REQ_USB1_DMA1_RX,      /* USB_1 channel 1 receive FIFO full              */
+} dmac_request_factor_t;
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+void usb1_function_DMAC3_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb1_function_DMAC3_Open(uint32_t req);
+void usb1_function_DMAC3_Close(uint32_t *remain);
+void usb1_function_DMAC3_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+void usb1_function_DMAC4_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation,
+                                        uint32_t request_factor, uint32_t req_direction);
+int32_t usb1_function_DMAC4_Open(uint32_t req);
+void usb1_function_DMAC4_Close(uint32_t *remain);
+void usb1_function_DMAC4_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* USB1_FUNCTION_DMACDRV_H */
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dataio.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2932 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dataio.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static uint16_t g_usb1_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)];
+
+static void     usb1_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data);
+static void     usb1_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data);
+static uint16_t usb1_function_read_dma_d0(uint16_t pipe);
+static uint16_t usb1_function_read_dma_d1(uint16_t pipe);
+static uint16_t usb1_function_write_dma_d0(uint16_t pipe);
+static uint16_t usb1_function_write_dma_d1(uint16_t pipe);
+
+static void     usb1_function_read_c_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_write_c_fifo(uint16_t Pipe, uint16_t count);
+static void     usb1_function_read_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_write_d0_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_read_d1_fifo(uint16_t pipe, uint16_t count);
+static void     usb1_function_write_d1_fifo(uint16_t pipe, uint16_t count);
+
+static void     usb1_function_clear_transaction_counter(uint16_t pipe);
+static void     usb1_function_set_transaction_counter(uint16_t pipe, uint32_t count);
+
+static uint32_t usb1_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr);
+
+static uint16_t usb1_function_set_dfacc_d0(uint16_t mbw, uint32_t count);
+static uint16_t usb1_function_set_dfacc_d1(uint16_t mbw, uint32_t count);
+
+
+/*******************************************************************************
+* Function Name: usb1_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t  pipe    ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t usefifo;
+    uint16_t mbw;
+
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    usb1_function_clear_bemp_sts(pipe);
+    usb1_function_clear_brdy_sts(pipe);
+    usb1_function_clear_nrdy_sts(pipe);
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+        case USB_FUNCTION_D0FIFO_DMA:
+            usefifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+        case USB_FUNCTION_D1FIFO_DMA:
+            usefifo = USB_FUNCTION_D1USE;
+        break;
+
+        default:
+            usefifo = USB_FUNCTION_CUSE;
+        break;
+    };
+
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_clear_transaction_counter(pipe);
+
+    usb1_function_aclrm(pipe);
+
+    status = usb1_function_write_buffer(pipe);
+
+    if (status != DEVDRV_USBF_FIFOERROR)
+    {
+        usb1_function_set_pid_buf(pipe);
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer
+* Description  : Writes data in the buffer allocated in the pipe specified by
+*              : the argument. The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer (uint16_t pipe)
+{
+    uint16_t status;
+    uint16_t usefifo;
+
+    g_usb1_function_PipeIgnore[pipe] = 0;
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            status = usb1_function_write_buffer_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            status = usb1_function_write_buffer_d1(pipe);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            status = usb1_function_write_dma_d0(pipe);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            status = usb1_function_write_dma_d1(pipe);
+        break;
+
+        default:
+            status = usb1_function_write_buffer_c(pipe);
+        break;
+    };
+
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITING:                       /* Continue of data write */
+            usb1_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            usb1_function_enable_brdy_int(pipe);        /* Enable Ready Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEEND:                      /* End of data write */
+        case DEVDRV_USBF_WRITESHRT:                     /* End of data write */
+            usb1_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb1_function_clear_nrdy_sts(pipe);
+            usb1_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+            /* for last transfer */
+            usb1_function_enable_bemp_int(pipe);        /* Enable Empty Interrupt */
+        break;
+
+        case DEVDRV_USBF_WRITEDMA:                      /* DMA write */
+            usb1_function_clear_nrdy_sts(pipe);
+            usb1_function_enable_nrdy_int(pipe);        /* Error (NORES or STALL) */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                     /* FIFO access status */
+        default:
+            usb1_function_disable_brdy_int(pipe);       /* Disable Ready Interrupt */
+            usb1_function_disable_bemp_int(pipe);       /* Disable Empty Interrupt */
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer_c
+* Description  : Writes data in the buffer allocated in the pipe specified in
+*              : the argument. Writes data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    if (g_usb1_function_CtrZeroLengthFlag == 1)
+    {
+        g_usb1_function_CtrZeroLengthFlag = 0;                  /* Zero Length Packet Flag CLR */
+        return DEVDRV_USBF_WRITEEND;
+    }
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    }
+    else
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+    }
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb1_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb1_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb1_function_write_c_fifo(pipe, (uint16_t)count);
+
+    if (g_usb1_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb1_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB201.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0)
+        {
+            USB201.CFIFOCTR = USB_FUNCTION_BITBVAL;             /* Short Packet */
+            g_usb1_function_CtrZeroLengthFlag = 1;              /* Zero Length Packet Flag */
+        }
+    }
+    else
+    {
+        g_usb1_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb1_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb1_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb1_function_write_d0_fifo(pipe, (uint16_t)count);
+
+    if (g_usb1_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb1_function_data_count[pipe] = 0;
+        if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb1_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_buffer_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_write_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size = usb1_function_get_buf_size(pipe);                    /* Data buffer size */
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] <= (uint32_t)size)
+    {
+        status = DEVDRV_USBF_WRITEEND;                          /* write continues */
+        count  = g_usb1_function_data_count[pipe];
+
+        if (count == 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Null Packet is end of write */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = DEVDRV_USBF_WRITESHRT;                     /* Short Packet is end of write */
+        }
+    }
+    else
+    {
+        status = DEVDRV_USBF_WRITING;                           /* write continues */
+        count  = (uint32_t)size;
+    }
+
+    usb1_function_write_d1_fifo(pipe, (uint16_t)count);
+
+    if (g_usb1_function_data_count[pipe] < (uint32_t)size)
+    {
+        g_usb1_function_data_count[pipe] = 0;
+
+        if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBVAL;            /* Short Packet */
+        }
+    }
+    else
+    {
+        g_usb1_function_data_count[pipe] -= count;
+    }
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D0FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma().
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_write_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb1_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb1_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;
+
+        if ((count % size) != 0)
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 1;
+        }
+        else
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;
+        }
+
+        dfacc = usb1_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb1_function_data_count[pipe]    = 0;
+        g_usb1_function_data_pointer[pipe] += count;
+        status = DEVDRV_USBF_WRITEDMA;                              /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_dma_d1
+* Description  : Writes data in the buffer allocated in the pipe specified in the argument.
+*              : Writes data by DMA transfer using D1FIFO.
+*              : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma().
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : DEVDRV_USBF_WRITEEND           : Write end
+*              : DEVDRV_USBF_WRITESHRT          : short data
+*              : DEVDRV_USBF_WRITING            : Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           : Write DMA
+*              : DEVDRV_USBF_FIFOERROR          : FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_write_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint16_t size;
+    uint16_t buffer;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc=0;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                            /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    size  = usb1_function_get_buf_size(pipe);                       /* Data buffer size */
+    count = g_usb1_function_data_count[pipe];
+
+    if (count != 0)
+    {
+        g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;
+        if ((count % size) != 0)
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 1;
+        }
+        else
+        {
+            g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;
+        }
+
+        dfacc = usb1_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_BUF2FIFO;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+
+        g_usb1_function_data_count[pipe]    = 0;
+        g_usb1_function_data_pointer[pipe] += count;
+
+        status = DEVDRV_USBF_WRITEDMA;                              /* DMA write  */
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
+        }
+        status = DEVDRV_USBF_WRITESHRT;                             /* Short Packet is end of write */
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb1_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t usefifo;
+
+    usb1_function_clear_bemp_sts(pipe);
+    usb1_function_clear_brdy_sts(pipe);
+    usb1_function_clear_nrdy_sts(pipe);
+
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb1_function_start_receive_trns_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb1_function_start_receive_trns_d1(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            usb1_function_start_receive_dma_d0(pipe, size, data);
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            usb1_function_start_receive_dma_d1(pipe, size, data);
+        break;
+
+        default:
+            usb1_function_start_receive_trns_c(pipe, size, data);
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_trns_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+*              : When storing data in the buffer allocated in the pipe specified in the
+*              : argument, BRDY interrupt is generated to read data
+*              : in the interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = size;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
+    USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    usb1_function_enable_nrdy_int(pipe);
+    usb1_function_enable_brdy_int(pipe);
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_trns_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data in the
+*              : interrupt.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = size;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    usb1_function_enable_nrdy_int(pipe);
+    usb1_function_enable_brdy_int(pipe);
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_trns_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, BRDY interrupt is generated to read data.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = size;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    usb1_function_enable_nrdy_int(pipe);
+    usb1_function_enable_brdy_int(pipe);
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_dma_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = 0;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb1_function_read_dma(pipe);
+
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_start_receive_dma_d1
+* Description  : Read data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+*              : This function does not read data from the buffer.
+*              : When storing data in the buffer allocated in the pipe specified
+*              : in the argument, delivered read request to DMAC to read data from
+*              : the buffer by DMAC.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data Address
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(pipe);
+    g_usb1_function_data_count[pipe]   = size;
+    g_usb1_function_data_pointer[pipe] = (uint8_t *)data;
+    g_usb1_function_PipeIgnore[pipe]   = 0;
+
+    g_usb1_function_PipeDataSize[pipe] = 0;
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_WAIT;
+
+    mbw = usb1_function_get_mbw(size, (uint32_t)data);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    usb1_function_set_transaction_counter(pipe, size);
+
+    usb1_function_aclrm(pipe);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        usb1_function_read_dma(pipe);
+
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+    else
+    {
+        usb1_function_enable_nrdy_int(pipe);
+        usb1_function_enable_brdy_int(pipe);
+    }
+
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Uses FIF0 set in the pipe definition table.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb1_function_PipeIgnore[pipe] = 0;
+
+    if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+    {
+        status = usb1_function_read_buffer_d0(pipe);
+    }
+    else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+    {
+        status = usb1_function_read_buffer_d1(pipe);
+    }
+    else
+    {
+        status = usb1_function_read_buffer_c(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb1_function_disable_brdy_int(pipe);
+            g_usb1_function_PipeDataSize[pipe]   -= g_usb1_function_data_count[pipe];
+            g_usb1_function_pipe_status[pipe]     = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
+            {
+                USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
+            {
+                USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            }
+            else
+            {
+                USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+            }
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe];
+            g_usb1_function_pipe_status[pipe]   = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer_c
+* Description  : Reads data from the buffer allocated in the pipe specified in the argument.
+*              : Reads data by CPU transfer using CFIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer_c (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb1_function_data_count[pipe];
+    }
+    else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;                 /* Clear BCLR */
+    }
+    else
+    {
+        usb1_function_read_c_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb1_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer_d0
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by CPU transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb1_function_data_count[pipe];
+    }
+    else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb1_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb1_function_read_d0_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb1_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_buffer_d1
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by CPU transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_buffer_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t pipebuf_size;
+
+    mbw    = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+    buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+
+    if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+    {
+        return DEVDRV_USBF_FIFOERROR;
+    }
+
+    dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+    mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+    if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+    {
+        status = USB_FUNCTION_READOVER;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = g_usb1_function_data_count[pipe];
+    }
+    else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+    {
+        status = USB_FUNCTION_READEND;
+        usb1_function_set_pid_nak(pipe);                        /* Set NAK */
+        count = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+        }
+    }
+    else                                                        /* continue Receive data */
+    {
+        status = USB_FUNCTION_READING;
+        count  = dtln;
+        if (count == 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+
+        if ((count % mxps) != 0)
+        {
+            status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            usb1_function_set_pid_nak(pipe);                    /* Set NAK */
+        }
+        else
+        {
+            pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+
+            if (count != pipebuf_size)
+            {
+                status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                usb1_function_set_pid_nak(pipe);                /* Set NAK */
+            }
+        }
+    }
+
+    if (count == 0)                                             /* 0 length packet */
+    {
+        USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+    }
+    else
+    {
+        usb1_function_read_d1_fifo(pipe, (uint16_t)count);
+    }
+
+    g_usb1_function_data_count[pipe] -= count;
+
+    return status;                                              /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_dma
+* Description  : Reads data from the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO or D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+uint16_t usb1_function_read_dma (uint16_t pipe)
+{
+    uint16_t status;
+
+    g_usb1_function_PipeIgnore[pipe] = 0;
+    if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+    {
+        status = usb1_function_read_dma_d0(pipe);
+    }
+    else
+    {
+        status = usb1_function_read_dma_d1(pipe);
+    }
+
+    switch (status)
+    {
+        case USB_FUNCTION_READING:                                      /* Continue of data read */
+        break;
+
+        case USB_FUNCTION_READZERO:                                     /* End of data read */
+            usb1_function_disable_brdy_int(pipe);
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+        break;
+
+        case USB_FUNCTION_READEND:                                      /* End of data read */
+        case USB_FUNCTION_READSHRT:                                     /* End of data read */
+            usb1_function_disable_brdy_int(pipe);
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe];
+            }
+        break;
+
+        case USB_FUNCTION_READOVER:                                     /* buffer over */
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+            {
+                g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe];
+            }
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access status */
+        default:
+            usb1_function_disable_brdy_int(pipe);                       /* Disable Ready Interrupt */
+            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_dma_d0
+* Description  : Writes data in the buffer allocated in the pipe specified
+*              : in the argument.
+*              : Reads data by DMA transfer using D0FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_read_dma_d0 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+    uint16_t pipebuf_size;
+
+    g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb1_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb1_function_data_count[pipe];
+        }
+        else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb1_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb1_function_set_dfacc_d0(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;        /* not use in read operation */
+        g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;           /* not use in read operation */
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo   = USB_FUNCTION_D0FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D0FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb1_function_data_count[pipe]   -= count;
+        g_usb1_function_data_pointer[pipe] += count;
+        g_usb1_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_dma_d1
+* Description  : Reads data from the buffer allocated in the pipe specified in
+*              : the argument.
+*              : Reads data by DMA transfer using D1FIFO.
+* Arguments    : uint16_t pipe     ; Pipe Number
+* Return Value : USB_FUNCTION_READEND          ; Read end
+*              : USB_FUNCTION_READSHRT         ; short data
+*              : USB_FUNCTION_READZERO         ; zero data
+*              : USB_FUNCTION_READING          ; Continue of data read
+*              : USB_FUNCTION_READOVER         ; buffer over
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO status
+*******************************************************************************/
+static uint16_t usb1_function_read_dma_d1 (uint16_t pipe)
+{
+    uint32_t count;
+    uint32_t dtln;
+    uint16_t buffer;
+    uint16_t mxps;
+    uint16_t status;
+    uint16_t mbw;
+    uint16_t dfacc = 0;
+    uint16_t pipebuf_size;
+
+    g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]);
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        count  = g_usb1_function_data_count[pipe];
+        status = USB_FUNCTION_READING;
+    }
+    else
+    {
+        buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+        if (buffer == DEVDRV_USBF_FIFOERROR)                        /* FIFO access status */
+        {
+            return DEVDRV_USBF_FIFOERROR;
+        }
+
+        dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
+        mxps = usb1_function_get_mxps(pipe);                        /* Max Packet Size */
+
+        if (g_usb1_function_data_count[pipe] < dtln)                /* Buffer Over ? */
+        {
+            status = USB_FUNCTION_READOVER;
+            count  = g_usb1_function_data_count[pipe];
+        }
+        else if (g_usb1_function_data_count[pipe] == dtln)          /* just Receive Size */
+        {
+            status = USB_FUNCTION_READEND;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+        }
+        else                                                        /* continue Receive data */
+        {
+            status = USB_FUNCTION_READING;
+            count  = dtln;
+            if (count == 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Null Packet receive */
+            }
+
+            if ((count % mxps) != 0)
+            {
+                status = USB_FUNCTION_READSHRT;                     /* Short Packet receive */
+            }
+            else
+            {
+                pipebuf_size = usb1_function_get_buf_size(pipe);    /* Data buffer size */
+                if (count != pipebuf_size)
+                {
+                    status = USB_FUNCTION_READSHRT;                 /* Short Packet receive */
+                }
+            }
+        }
+    }
+
+    if (count == 0)                                                 /* 0 length packet */
+    {
+        if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+        {
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;                /* Clear BCLR */
+            status = USB_FUNCTION_READZERO;                         /* Null Packet receive */
+        }
+        else
+        {
+            usb1_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
+                                                                    /* transaction counter No set */
+                                                                    /* FRDY = 1, DTLN = 0 -> BRDY */
+        }
+    }
+    else
+    {
+        dfacc = usb1_function_set_dfacc_d1(mbw, count);
+
+        if (mbw == USB_FUNCTION_BITMBW_32)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2;  /* 32bit transfer */
+        }
+        else if (mbw == USB_FUNCTION_BITMBW_16)
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1;  /* 16bit transfer */
+        }
+        else
+        {
+            g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0;  /* 8bit transfer */
+        }
+
+        g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;        /* not use in read operation */
+        g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;           /* not use in read operation */
+
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo   = USB_FUNCTION_D1FIFO_DMA;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir    = USB_FUNCTION_FIFO2BUF;
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe];
+        g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes  = count;
+
+        if (status == USB_FUNCTION_READING)
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY;
+        }
+        else
+        {
+            g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND;
+        }
+
+        Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
+
+        usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
+
+        RZA_IO_RegWrite_16(&USB201.D1FIFOSEL,
+                            1,
+                            USB_DnFIFOSEL_DREQE_SHIFT,
+                            USB_DnFIFOSEL_DREQE);
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+    {
+        g_usb1_function_data_count[pipe]   -= count;
+        g_usb1_function_data_pointer[pipe] += count;
+        g_usb1_function_PipeDataSize[pipe] += count;
+    }
+
+    return status;                                                  /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_change_fifo_port
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument. After allocating FIF0, waits in the software
+*              : till the corresponding pipe becomes ready.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : DEVDRV_USBF_FIFOERROR          ; Error
+*              : Others            ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value
+*******************************************************************************/
+uint16_t usb1_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    usb1_function_set_curpipe(pipe, fifosel, isel, mbw);
+
+    for (loop = 0; loop < 4; loop++)
+    {
+        switch (fifosel)
+        {
+            case USB_FUNCTION_CUSE:
+                buffer = USB201.CFIFOCTR;
+            break;
+
+            case USB_FUNCTION_D0USE:
+            case USB_FUNCTION_D0DMA:
+                buffer = USB201.D0FIFOCTR;
+            break;
+
+            case USB_FUNCTION_D1USE:
+            case USB_FUNCTION_D1DMA:
+                buffer = USB201.D1FIFOCTR;
+            break;
+
+            default:
+                buffer = 0;
+            break;
+        }
+
+        if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY)
+        {
+            return buffer;
+        }
+
+        loop2 = 25;
+        while (loop2-- > 0)
+        {
+            /* wait */
+        }
+    }
+
+    return DEVDRV_USBF_FIFOERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_curpipe
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    uint16_t buffer;
+    uint32_t loop;
+    volatile uint32_t loop2;
+
+    g_usb1_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB201.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB201.D0FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB201.D1FIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
+                        (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_curpipe2
+* Description  : Allocates FIF0 specified by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+*              : uint16_t dfacc     ; DFACC Access mode
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc)
+{
+    uint16_t buffer;
+    uint32_t loop;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+    uint32_t dummy;
+#endif
+    volatile uint32_t loop2;
+
+    g_usb1_function_mbw[pipe] = mbw;
+
+    switch (fifosel)
+    {
+        case USB_FUNCTION_CUSE:
+            buffer  = USB201.CFIFOSEL;
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
+            buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+            buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(isel | pipe | mbw);
+            USB201.CFIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
+                        (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D0DMA:
+        case USB_FUNCTION_D0USE:
+            buffer  = USB201.D0FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB201.D0FIFO.UINT32;
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D0FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        case USB_FUNCTION_D1DMA:
+        case USB_FUNCTION_D1USE:
+            buffer  = USB201.D1FIFOSEL;
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+
+            if (dfacc != 0)
+            {
+                buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
+            }
+#else
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
+#endif
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+#ifdef  __USB_FUNCTION_DF_ACC_ENABLE__
+            if (dfacc != 0)
+            {
+                dummy = USB201.D1FIFO.UINT32;
+                loop = dummy;                   // avoid warning.
+            }
+#endif
+            buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
+            buffer |= (uint16_t)(pipe | mbw);
+            USB201.D1FIFOSEL = buffer;
+
+            for (loop = 0; loop < 4; loop++)
+            {
+                if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
+                {
+                    break;
+                }
+
+                loop2 = 100;
+
+                while (loop2-- > 0)
+                {
+                    /* wait */
+                }
+            }
+        break;
+
+        default:
+        break;
+    }
+
+    /* Cautions !!!
+     * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
+     * For details, please look at the data sheet.   */
+    loop2 = 100;
+
+    while (loop2-- > 0)
+    {
+        /* wait */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_c_fifo
+* Description  : Writes data in CFIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_write_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB201.CFIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB201.CFIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB201.CFIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_c_fifo
+* Description  : Reads data from CFIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_read_c_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb1_function_data_pointer[pipe] = USB201.CFIFO.UINT8[HH];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT16[H];
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT32;
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_d0_fifo
+* Description  : Writes data in D0FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating CFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_write_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB201.D0FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB201.D0FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB201.D0FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_d0_fifo
+* Description  : Reads data from D0FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating DOFIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_read_d0_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb1_function_data_pointer[pipe] = USB201.D0FIFO.UINT8[HH];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT16[H];
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT32;
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_write_d1_fifo
+* Description  : Writes data in D1FIFO.
+*              : Writes data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_write_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            USB201.D1FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)(count / 2); even; --even)
+        {
+            USB201.D1FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)(count / 4); even; --even)
+        {
+            USB201.D1FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]);
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_read_d1_fifo
+* Description  : Reads data from D1FIFO.
+*              : Reads data by BYTE/WORD/LONG according to access size
+*              : to the pipe specified by the arguments.
+*              : Before executing this function, allocating D1FIF0 in the specified pipe
+*              : should be completed.
+*              : Before executing this function, access size to the specified pipe
+*              : should be fixed and set in g_usb1_function_mbw[].
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t count     ; Data Size(Byte)
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_read_d1_fifo (uint16_t pipe, uint16_t count)
+{
+    uint16_t even;
+
+    if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
+    {
+        for (even = count; even; --even)
+        {
+            *g_usb1_function_data_pointer[pipe] = USB201.D1FIFO.UINT8[HH];
+            g_usb1_function_data_pointer[pipe] += 1;
+        }
+    }
+    else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
+    {
+        for (even = (uint16_t)((count + 1) / 2); even; --even)
+        {
+            *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT16[H];
+            g_usb1_function_data_pointer[pipe] += 2;
+        }
+    }
+    else
+    {
+        for (even = (uint16_t)((count + 3) / 4); even; --even)
+        {
+            *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT32;
+            g_usb1_function_data_pointer[pipe] += 4;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_com_get_dmasize
+* Description  : Calculates access width of DMA transfer by the argument to
+*              : return as the Return Value.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : DMA transfer size    : 0   8bit
+*              :                      : 1  16bit
+*              :                      : 2  32bit
+*******************************************************************************/
+static uint32_t usb1_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+
+    if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0))
+    {
+        /*  When transfer byte count is odd         */
+        /* or transfer data area is 8-bit alignment */
+        size = 0;           /* 8bit */
+    }
+    else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0))
+    {
+        /* When the transfer byte count is multiples of 2 */
+        /* or the transfer data area is 16-bit alignment */
+        size = 1;           /* 16bit */
+    }
+    else
+    {
+        /* When the transfer byte count is multiples of 4 */
+        /* or the transfer data area is 32-bit alignment */
+        size = 2;           /* 32bit */
+    }
+
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_mbw
+* Description  : Calculates access width of DMA to return the value set in MBW.
+* Arguments    : uint32_t trncount   : transfer byte
+*              : uint32_t dtptr      : transfer data pointer
+* Return Value : FIFO transfer size   : USB_FUNCTION_BITMBW_8    8bit
+*              :                      : USB_FUNCTION_BITMBW_16  16bit
+*              :                      : USB_FUNCTION_BITMBW_32  32bit
+*******************************************************************************/
+uint16_t usb1_function_get_mbw (uint32_t trncount, uint32_t dtptr)
+{
+    uint32_t size;
+    uint16_t mbw;
+
+    size = usb1_function_com_get_dmasize(trncount, dtptr);
+
+    if (size == 0)
+    {
+        /* 8bit */
+        mbw = USB_FUNCTION_BITMBW_8;
+    }
+    else if (size == 1)
+    {
+        /* 16bit */
+        mbw = USB_FUNCTION_BITMBW_16;
+    }
+    else
+    {
+        /* 32bit */
+        mbw = USB_FUNCTION_BITMBW_32;
+    }
+
+    return mbw;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_transaction_counter
+* Description  : Sets transaction counter by the argument(PIPEnTRN).
+*              : Clears transaction before setting to enable transaction counter setting.
+* Arguments    : uint16_t pipe     ; Pipe number
+*              : uint32_t bsize    : Data transfer size
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_set_transaction_counter (uint16_t pipe, uint32_t bsize)
+{
+    uint16_t mxps;
+    uint16_t cnt;
+
+    if (bsize  == 0)
+    {
+        return;
+    }
+
+    mxps = usb1_function_get_mxps(pipe);            /* Max Packet Size */
+
+    if ((bsize % mxps) == 0)
+    {
+        cnt = (uint16_t)(bsize / mxps);
+    }
+    else
+    {
+        cnt = (uint16_t)((bsize / mxps) + 1);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE1TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE2TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE3TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE4TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE5TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPE9TRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEATRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEBTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPECTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEDTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEETRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+            USB201.PIPEFTRN             = cnt;
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_transaction_counter
+* Description  : Clears the transaction counter by the argument.
+*              : After executing this function, the transaction counter is invalid.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_transaction_counter (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE1TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE2TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE3TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE4TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE5TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPE9TRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEATRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEBTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPECTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEDTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEETRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                0,
+                                USB_PIPEnTRE_TRENB_SHIFT,
+                                USB_PIPEnTRE_TRENB);
+            RZA_IO_RegWrite_16(&USB201.PIPEFTRE,
+                                1,
+                                USB_PIPEnTRE_TRCLR_SHIFT,
+                                USB_PIPEnTRE_TRCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_stop_transfer
+* Description  : Stops the USB transfer in the pipe specified by the argument.
+*              : After stopping the USB transfer, clears the buffer allocated in
+*              : the pipe.
+*              : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0;
+*              : invalid. After executing this function, BRDY/NRDY/BEMP interrupt
+*              : in the corresponding pipe becomes invalid. Sequence bit is also
+*              : cleared.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_stop_transfer (uint16_t pipe)
+{
+    uint16_t usefifo;
+    uint32_t remain;
+    uint16_t fifo;
+
+    usb1_function_set_pid_nak(pipe);
+
+    usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+    switch (usefifo)
+    {
+        case USB_FUNCTION_D0FIFO_USE:
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0USE;
+        break;
+
+        case USB_FUNCTION_D1FIFO_USE:
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1USE;
+        break;
+
+        case USB_FUNCTION_D0FIFO_DMA:
+            remain = Userdef_USB_usb1_function_stop_dma0();
+            usb1_function_dma_stop_d0(pipe, remain);
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D0DMA;
+        break;
+
+        case USB_FUNCTION_D1FIFO_DMA:
+            remain = Userdef_USB_usb1_function_stop_dma1();
+            usb1_function_dma_stop_d1(pipe, remain);
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_D1DMA;
+        break;
+
+        default:
+            usb1_function_clear_transaction_counter(pipe);
+            USB201.CFIFOCTR =  USB_FUNCTION_BITBCLR;        /* Buffer Clear */
+            fifo = USB_FUNCTION_CUSE;
+        break;
+    }
+
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16);
+
+    /* Interrupt of pipe set is disabled */
+    usb1_function_disable_brdy_int(pipe);
+    usb1_function_disable_nrdy_int(pipe);
+    usb1_function_disable_bemp_int(pipe);
+
+    usb1_function_aclrm(pipe);
+    usb1_function_set_csclr(pipe);
+
+    if ( g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT )
+    {
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_dfacc_d0
+* Description  : Sets the DFACC setting value in D0FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb1_function_set_dfacc_d0 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D0FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+    return dfacc;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_dfacc_d1
+* Description  : Set the DFACC setting value in D1FIFO using the transfer size.
+* Arguments    : uint16_t mbw     ; MBW
+*              : uint16_t count   ; data count
+* Return Value : DFACC Access mode
+*******************************************************************************/
+static uint16_t usb1_function_set_dfacc_d1 (uint16_t mbw, uint32_t count)
+{
+    uint16_t dfacc = 0;
+
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_DFACC_SHIFT,
+                        USB_DnFBCFG_DFACC);
+    RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                        0,
+                        USB_DnFBCFG_TENDE_SHIFT,
+                        USB_DnFBCFG_TENDE);
+    dfacc = 0;
+#else
+    if (mbw == USB_FUNCTION_BITMBW_32)
+    {
+        if ((count % 32) == 0)
+        {
+            /* 32byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                2,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 2;
+        }
+        else if ((count % 16) == 0)
+        {
+            /* 16byte transfer */
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                1,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 1;
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_DFACC_SHIFT,
+                                USB_DnFBCFG_DFACC);
+            RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                                0,
+                                USB_DnFBCFG_TENDE_SHIFT,
+                                USB_DnFBCFG_TENDE);
+            dfacc = 0;
+        }
+    }
+    else if (mbw == USB_FUNCTION_BITMBW_16)
+    {
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_DFACC_SHIFT,
+                            USB_DnFBCFG_DFACC);
+        RZA_IO_RegWrite_16(&USB201.D1FBCFG,
+                            0,
+                            USB_DnFBCFG_TENDE_SHIFT,
+                            USB_DnFBCFG_TENDE);
+        dfacc = 0;
+    }
+#endif
+
+    return dfacc;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dma.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,346 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dma.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+static void usb1_function_dmaint(uint16_t fifo);
+static void usb1_function_dmaint_buf2fifo(uint16_t pipe);
+static void usb1_function_dmaint_fifo2buf(uint16_t pipe);
+
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_stop_d0
+* Description  : D0FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_stop_d0 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB201.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB201.D0FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain);
+            g_usb1_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_stop_d1
+* Description  : D1FIFO DMA stop
+* Arguments    : uint16_t pipe      : pipe number
+*              : uint32_t remain    : transfer byte
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_stop_d1 (uint16_t pipe, uint32_t remain)
+{
+    uint16_t dtln;
+    uint16_t dfacc;
+    uint16_t buffer;
+    uint16_t sds_b = 1;
+
+    dfacc = RZA_IO_RegRead_16(&USB201.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC);
+
+    if (dfacc == 2)
+    {
+        sds_b = 32;
+    }
+    else if (dfacc == 1)
+    {
+        sds_b = 16;
+    }
+    else
+    {
+        if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2)
+        {
+            sds_b = 4;
+        }
+        else if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1)
+        {
+            sds_b = 2;
+        }
+        else
+        {
+            sds_b = 1;
+        }
+    }
+
+    if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
+    {
+        if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+        {
+            buffer = USB201.D1FIFOCTR;
+            dtln   = (buffer & USB_FUNCTION_BITDTLN);
+
+            if ((dtln % sds_b) != 0)
+            {
+                remain += (sds_b - (dtln % sds_b));
+            }
+            g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain);
+            g_usb1_function_data_count[pipe]   = remain;
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_interrupt_d0fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb1_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_interrupt_d0fifo (uint32_t int_sense)
+{
+    usb1_function_dmaint(USB_FUNCTION_D0FIFO);
+    g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dma_interrupt_d1fifo
+* Description  : This function is DMA interrupt handler entry.
+*              : Execute usb1_function_dmaint() after disabling DMA interrupt in this function.
+*              : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is
+*              : specified by dma->fifo.
+*              : Register this function as DMA complete interrupt.
+* Arguments    : uint32_t int_sense ; Interrupts detection mode
+*              :                    ;  INTC_LEVEL_SENSITIVE : Level sense
+*              :                    ;  INTC_EDGE_TRIGGER : Edge trigger
+* Return Value : none
+*******************************************************************************/
+void usb1_function_dma_interrupt_d1fifo (uint32_t int_sense)
+{
+    usb1_function_dmaint(USB_FUNCTION_D1FIFO);
+    g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dmaint
+* Description  : This function is DMA transfer end interrupt
+* Arguments    : uint16_t fifo  ; fifo number
+*              :                ;  USB_FUNCTION_D0FIFO
+*              :                ;  USB_FUNCTION_D1FIFO
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_dmaint (uint16_t fifo)
+{
+    uint16_t pipe;
+
+    pipe = g_usb1_function_DmaPipe[fifo];
+
+    if (g_usb1_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO)
+    {
+        usb1_function_dmaint_buf2fifo(pipe);
+    }
+    else
+    {
+        usb1_function_dmaint_fifo2buf(pipe);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dmaint_fifo2buf
+* Description  : Executes read completion from FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_dmaint_fifo2buf (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE)
+    {
+        useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+        if (useport == USB_FUNCTION_D0FIFO_DMA)
+        {
+            remain = Userdef_USB_usb1_function_stop_dma0();
+            usb1_function_dma_stop_d0(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb1_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+        else
+        {
+            remain = Userdef_USB_usb1_function_stop_dma1();
+            usb1_function_dma_stop_d1(pipe, remain);
+
+            if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND)
+                {
+                    USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+                else
+                {
+                    usb1_function_enable_brdy_int(pipe);
+                }
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_dmaint_buf2fifo
+* Description  : Executes write completion in FIFO by DMAC.
+* Arguments    : uint16_t pipe      : pipe number
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_dmaint_buf2fifo (uint16_t pipe)
+{
+    uint32_t remain;
+    uint16_t useport;
+
+    useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+
+    if (useport == USB_FUNCTION_D0FIFO_DMA)
+    {
+        remain = Userdef_USB_usb1_function_stop_dma0();
+        usb1_function_dma_stop_d0(pipe, remain);
+
+        if (g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D0FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+    else
+    {
+        remain = Userdef_USB_usb1_function_stop_dma1();
+        usb1_function_dma_stop_d1(pipe, remain);
+
+        if (g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] != 0)
+        {
+            RZA_IO_RegWrite_16(&USB201.D1FIFOCTR,
+                                1,
+                                USB_DnFIFOCTR_BVAL_SHIFT,
+                                USB_DnFIFOCTR_BVAL);
+        }
+    }
+
+    usb1_function_enable_bemp_int(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_intrn.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,249 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_intrn.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_brdy_int
+* Description  : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : According to the pipe that interrupt is generated in,
+*              : reads/writes buffer allocated in the pipe.
+*              : This function is executed in the BRDY interrupt handler.
+*              : This function clears BRDY interrupt status and BEMP interrupt
+*              : status.
+* Arguments    : uint16_t Status       ; BRDYSTS Register Value
+*              : uint16_t Int_enbl     ; BRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_brdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint32_t int_sense = 0;
+    uint16_t pipe;
+    uint16_t pipebit;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        pipebit = g_usb1_function_bit_set[pipe];
+
+        if ((status & pipebit) && (int_enb & pipebit))
+        {
+            USB201.BRDYSTS = (uint16_t)~pipebit;
+            USB201.BEMPSTS = (uint16_t)~pipebit;
+            if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb1_function_dma_interrupt_d0fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb1_function_read_dma(pipe);
+                    usb1_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)
+            {
+                if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY)
+                {
+                    usb1_function_dma_interrupt_d1fifo(int_sense);
+                }
+
+                if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
+                {
+                    usb1_function_read_dma(pipe);
+                    usb1_function_disable_brdy_int(pipe);
+                }
+                else
+                {
+                    USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+            else
+            {
+                if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0)
+                {
+                    usb1_function_read_buffer(pipe);
+                }
+                else
+                {
+                    usb1_function_write_buffer(pipe);
+                }
+            }
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_nrdy_int
+* Description  : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9).
+*              : Checks NRDY interrupt cause by PID. When the cause if STALL,
+*              : regards the pipe state as STALL and ends the processing.
+*              : Then the cause is not STALL, increments the error count to
+*              : communicate again. When the error count is 3, determines
+*              : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing.
+*              : This function is executed in the NRDY interrupt handler.
+*              : This function clears NRDY interrupt status.
+* Arguments    : uint16_t status       ; NRDYSTS Register Value
+*              : uint16_t int_enb      ; NRDYENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb1_function_nrdy_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB201.NRDYSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe])
+        {
+            if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1)
+            {
+                if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT)
+                {
+                    pid = usb1_function_get_pid(pipe);
+                    if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+                    {
+                        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+                    }
+                    else
+                    {
+                        g_usb1_function_PipeIgnore[pipe]++;
+                        if (g_usb1_function_PipeIgnore[pipe] == 3)
+                        {
+                            g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
+                        }
+                        else
+                        {
+                            usb1_function_set_pid_buf(pipe);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                /* USB Function */
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_bemp_int
+* Description  : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9).
+* Arguments    : uint16_t status       ; BEMPSTS Register Value
+*              : uint16_t int_enb      ; BEMPENB Register Value
+* Return Value : none
+*******************************************************************************/
+void usb1_function_bemp_int (uint16_t status, uint16_t int_enb)
+{
+    uint16_t pid;
+    uint16_t pipe;
+    uint16_t bitcheck;
+    uint16_t inbuf;
+
+    bitcheck = (uint16_t)(status & int_enb);
+
+    USB201.BEMPSTS = (uint16_t)~status;
+
+    for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe])
+        {
+            pid = usb1_function_get_pid(pipe);
+
+            if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2))
+            {
+                g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+            }
+            else
+            {
+                inbuf = usb1_function_get_inbuf(pipe);
+
+                if (inbuf == 0)
+                {
+                    usb1_function_disable_bemp_int(pipe);
+                    usb1_function_set_pid_nak(pipe);
+                    g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                }
+            }
+        }
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_lib.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,2044 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_lib.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_brdy_int
+* Description  : Enables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_enable_brdy_int (uint16_t pipe)
+{
+    /* enable brdy interrupt */
+    USB201.BRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_disable_brdy_int
+* Description  : Disables BRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BRDY. Enables BRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling BRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_disable_brdy_int (uint16_t pipe)
+{
+    /* disable brdy interrupt */
+    USB201.BRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_brdy_sts (uint16_t pipe)
+{
+    /* clear brdy status */
+    USB201.BRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_bemp_int
+* Description  : Enables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_enable_bemp_int (uint16_t pipe)
+{
+    /* enable bemp interrupt */
+    USB201.BEMPENB |= (uint16_t)g_usb1_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_disable_bemp_int
+* Description  : Disables BEMP interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : BEMP. Enables BEMP interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling BEMP, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe           ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_disable_bemp_int (uint16_t pipe)
+{
+    /* disable bemp interrupt */
+    USB201.BEMPENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_bemp_sts (uint16_t pipe)
+{
+    /* clear bemp status */
+    USB201.BEMPSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_nrdy_int
+* Description  : Enables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling
+*              : NRDY. Enables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After enabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_enable_nrdy_int (uint16_t pipe)
+{
+    /* enable nrdy interrupt */
+    USB201.NRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_disable_nrdy_int
+* Description  : Disables NRDY interrupt in the pipe spceified by the argument.
+*              : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling
+*              : NRDY. Disables NRDY interrupt in the pipe specified by the argument
+*              : in the disabled status. After disabling NRDY, recover all
+*              : BEMP/NRDY/BRDY disabled/enabled status.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_disable_nrdy_int (uint16_t pipe)
+{
+    /* disable nrdy interrupt */
+    USB201.NRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_nrdy_sts (uint16_t pipe)
+{
+    /* clear nrdy status */
+    USB201.NRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_is_hispeed
+* Description  : Returns the result of USB reset hand shake (RHST) as
+*              : return value.
+* Arguments    : none
+* Return Value : USB_FUNCTION_HIGH_SPEED    ; Hi-Speed
+*              : USB_FUNCTION_FULL_SPEED    ; Full-Speed
+*              : LOW_SPEED                  ; Low-Speed
+*              : USB_FUNCTION_NON_SPEED     ; error
+*******************************************************************************/
+uint16_t usb1_function_is_hispeed (void)
+{
+    uint16_t rhst;
+    uint16_t speed;
+
+    rhst = RZA_IO_RegRead_16(&USB201.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST);
+
+    if (rhst == USB_FUNCTION_HSMODE)
+    {
+        speed = USB_FUNCTION_HIGH_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_FSMODE)
+    {
+        speed = USB_FUNCTION_FULL_SPEED;
+    }
+    else if (rhst == USB_FUNCTION_LSMODE)
+    {
+        speed = USB_FUNCTION_LOW_SPEED;
+    }
+    else
+    {
+        speed = USB_FUNCTION_NON_SPEED;
+    }
+
+    return speed;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_is_hispeed_enable
+* Description  : Returns the USB High-Speed connection enabled status as
+*              : return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Hi-Speed Enable
+*              : DEVDRV_USBF_NO   : Hi-Speed Disable
+*******************************************************************************/
+uint16_t usb1_function_is_hispeed_enable (void)
+{
+    uint16_t ret;
+
+    ret = DEVDRV_USBF_NO;
+
+    if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1)
+    {
+        ret = DEVDRV_USBF_YES;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_pid_buf (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb1_function_set_pid_nak(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                DEVDRV_USBF_PID_BUF,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_pid_nak (uint16_t pipe)
+{
+    uint16_t pid;
+    uint16_t pbusy;
+    uint32_t loop;
+
+    pid = usb1_function_get_pid(pipe);
+
+    if (pid == DEVDRV_USBF_PID_STALL2)
+    {
+        usb1_function_set_pid_stall(pipe);
+    }
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_DCPCTR_PID_SHIFT,
+                                USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_1_5_PID_SHIFT,
+                                USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_6_8_PID_SHIFT,
+                                USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_9_PID_SHIFT,
+                                USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                DEVDRV_USBF_PID_NAK,
+                                USB_PIPEnCTR_A_F_PID_SHIFT,
+                                USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+        break;
+    }
+
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        for (loop = 0; loop < 200; loop++)
+        {
+            switch (pipe)
+            {
+                case USB_FUNCTION_PIPE0:
+                    pbusy = RZA_IO_RegRead_16(&USB201.DCPCTR,
+                                                USB_DCPCTR_PBUSY_SHIFT,
+                                                USB_DCPCTR_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE1:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE2:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE3:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE4:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE5:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                                USB_PIPEnCTR_1_5_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_1_5_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE6:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE6CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE7:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE7CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE8:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE8CTR,
+                                                USB_PIPEnCTR_6_8_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_6_8_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPE9:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                                USB_PIPEnCTR_9_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_9_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEA:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEB:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEC:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPED:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEE:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                case USB_FUNCTION_PIPEF:
+                    pbusy = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                                USB_PIPEnCTR_A_F_PBUSY_SHIFT,
+                                                USB_PIPEnCTR_A_F_PBUSY);
+                break;
+
+                default:
+                    pbusy   = 1;
+                break;
+            }
+
+            if (pbusy == 0)
+            {
+                break;
+            }
+            Userdef_USB_usb1_function_delay_500ns();
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_pid_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+    if (pid == DEVDRV_USBF_PID_BUF)
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL2,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+    else
+    {
+        switch (pipe)
+        {
+            case USB_FUNCTION_PIPE0:
+                RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+            break;
+
+            case USB_FUNCTION_PIPE1:
+                RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE2:
+                RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE3:
+                RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE4:
+                RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE5:
+                RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+            break;
+
+            case USB_FUNCTION_PIPE6:
+                RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE7:
+                RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE8:
+                RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+            break;
+
+            case USB_FUNCTION_PIPE9:
+                RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+            break;
+
+            case USB_FUNCTION_PIPEA:
+                RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEB:
+                RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEC:
+                RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPED:
+                RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEE:
+                RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            case USB_FUNCTION_PIPEF:
+                RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                    DEVDRV_USBF_PID_STALL,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+            break;
+
+            default:
+            break;
+        }
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_pid_stall (uint16_t pipe)
+{
+    usb1_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb1_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            pid = RZA_IO_RegRead_16(&USB201.DCPCTR,
+                                    USB_DCPCTR_PID_SHIFT,
+                                    USB_DCPCTR_PID);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_PID_SHIFT,
+                                    USB_PIPEnCTR_1_5_PID);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE6CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE7CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE8CTR,
+                                    USB_PIPEnCTR_6_8_PID_SHIFT,
+                                    USB_PIPEnCTR_6_8_PID);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            pid = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                    USB_PIPEnCTR_9_PID_SHIFT,
+                                    USB_PIPEnCTR_9_PID);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            pid = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            pid = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_PID_SHIFT,
+                                    USB_PIPEnCTR_A_F_PID);
+        break;
+
+        default:
+            pid = 0;
+        break;
+    }
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_csclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                1,
+                                USB_DCPCTR_CSCLR_SHIFT,
+                                USB_DCPCTR_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_CSCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_CSCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_CSCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_CSCLR_SHIFT,
+                                USB_PIPEnCTR_9_CSCLR);
+        break;
+
+        default:
+            /* PIPEA-F have not CSCLR */
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_sqclr (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQCLR_SHIFT,
+                                USB_DCPCTR_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQCLR_SHIFT,
+                                USB_PIPEnCTR_1_5_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQCLR_SHIFT,
+                                USB_PIPEnCTR_6_8_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQCLR_SHIFT,
+                                USB_PIPEnCTR_9_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQCLR_SHIFT,
+                                USB_PIPEnCTR_A_F_SQCLR);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_sqset (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            RZA_IO_RegWrite_16(&USB201.DCPCTR,
+                                1,
+                                USB_DCPCTR_SQSET_SHIFT,
+                                USB_DCPCTR_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_SQSET_SHIFT,
+                                USB_PIPEnCTR_1_5_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_SQSET_SHIFT,
+                                USB_PIPEnCTR_6_8_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_SQSET_SHIFT,
+                                USB_PIPEnCTR_9_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_SQSET_SHIFT,
+                                USB_PIPEnCTR_A_F_SQSET);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_sqmon
+* Description  : Toggle bit of specified pipe is obtained
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : sqmon
+*******************************************************************************/
+uint16_t usb1_function_get_sqmon (uint16_t pipe)
+{
+    uint16_t sqmon;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            sqmon = RZA_IO_RegRead_16(&USB201.DCPCTR,
+                                        USB_DCPCTR_SQMON_SHIFT,
+                                        USB_DCPCTR_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                        USB_PIPEnCTR_1_5_SQMON_SHIFT,
+                                        USB_PIPEnCTR_1_5_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE6CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE7CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE8CTR,
+                                        USB_PIPEnCTR_6_8_SQMON_SHIFT,
+                                        USB_PIPEnCTR_6_8_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                        USB_PIPEnCTR_9_SQMON_SHIFT,
+                                        USB_PIPEnCTR_9_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            sqmon = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                        USB_PIPEnCTR_A_F_SQMON_SHIFT,
+                                        USB_PIPEnCTR_A_F_SQMON);
+        break;
+
+        default:
+            sqmon = 0;
+        break;
+    }
+
+    return sqmon;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_aclrm
+* Description  : The buffer of specified pipe is initialized
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb1_function_aclrm (uint16_t pipe)
+{
+    usb1_function_set_aclrm(pipe);
+    usb1_function_clr_aclrm(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_set_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb1_function_set_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                1,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                1,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                1,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                1,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clr_aclrm
+* Description  : The auto buffer clear mode of specified pipe is enabled
+* Arguments    : uint16_t pipe    : Pipe
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clr_aclrm (uint16_t pipe)
+{
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            RZA_IO_RegWrite_16(&USB201.PIPE1CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            RZA_IO_RegWrite_16(&USB201.PIPE2CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            RZA_IO_RegWrite_16(&USB201.PIPE3CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            RZA_IO_RegWrite_16(&USB201.PIPE4CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            RZA_IO_RegWrite_16(&USB201.PIPE5CTR,
+                                0,
+                                USB_PIPEnCTR_1_5_ACLRM_SHIFT,
+                                USB_PIPEnCTR_1_5_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            RZA_IO_RegWrite_16(&USB201.PIPE6CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            RZA_IO_RegWrite_16(&USB201.PIPE7CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            RZA_IO_RegWrite_16(&USB201.PIPE8CTR,
+                                0,
+                                USB_PIPEnCTR_6_8_ACLRM_SHIFT,
+                                USB_PIPEnCTR_6_8_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            RZA_IO_RegWrite_16(&USB201.PIPE9CTR,
+                                0,
+                                USB_PIPEnCTR_9_ACLRM_SHIFT,
+                                USB_PIPEnCTR_9_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            RZA_IO_RegWrite_16(&USB201.PIPEACTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            RZA_IO_RegWrite_16(&USB201.PIPEBCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            RZA_IO_RegWrite_16(&USB201.PIPECCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            RZA_IO_RegWrite_16(&USB201.PIPEDCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            RZA_IO_RegWrite_16(&USB201.PIPEECTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            RZA_IO_RegWrite_16(&USB201.PIPEFCTR,
+                                0,
+                                USB_PIPEnCTR_A_F_ACLRM_SHIFT,
+                                USB_PIPEnCTR_A_F_ACLRM);
+        break;
+
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_inbuf
+* Description  : Returns INBUFM of the pipe specified by the argument.
+* Arguments    : uint16_t pipe             ; Pipe Number
+* Return Value : inbuf
+*******************************************************************************/
+uint16_t usb1_function_get_inbuf (uint16_t pipe)
+{
+    uint16_t inbuf;
+
+    switch (pipe)
+    {
+        case USB_FUNCTION_PIPE0:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE1:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE1CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE2:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE2CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE3:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE3CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE4:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE4CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE5:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE5CTR,
+                                    USB_PIPEnCTR_1_5_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_1_5_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPE6:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE7:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE8:
+            inbuf = 0;
+        break;
+
+        case USB_FUNCTION_PIPE9:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPE9CTR,
+                                    USB_PIPEnCTR_9_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_9_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEA:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEACTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEB:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEBCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEC:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPECCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPED:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEDCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEE:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEECTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        case USB_FUNCTION_PIPEF:
+            inbuf = RZA_IO_RegRead_16(&USB201.PIPEFCTR,
+                                    USB_PIPEnCTR_A_F_INBUFM_SHIFT,
+                                    USB_PIPEnCTR_A_F_INBUFM);
+        break;
+
+        default:
+            inbuf = 0;
+        break;
+    }
+
+    return inbuf;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_setting_interrupt
+* Description  : Sets the USB module interrupt level.
+* Arguments    : uint8_t level
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_setting_interrupt (uint8_t level)
+{
+    uint16_t d0fifo_dmaintid;
+    uint16_t d1fifo_dmaintid;
+
+    R_INTC_RegistIntFunc(INTC_ID_USBI1, usb1_function_interrupt);
+    R_INTC_SetPriority(INTC_ID_USBI1, level);
+    R_INTC_Enable(INTC_ID_USBI1);
+
+    d0fifo_dmaintid = Userdef_USB_usb1_function_d0fifo_dmaintid();
+
+    if (d0fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d0fifo_dmaintid, usb1_function_dma_interrupt_d0fifo);
+        R_INTC_SetPriority(d0fifo_dmaintid, level);
+        R_INTC_Enable(d0fifo_dmaintid);
+    }
+
+    d1fifo_dmaintid = Userdef_USB_usb1_function_d1fifo_dmaintid();
+
+    if (d1fifo_dmaintid != 0xFFFF)
+    {
+        R_INTC_RegistIntFunc(d1fifo_dmaintid, usb1_function_dma_interrupt_d1fifo);
+        R_INTC_SetPriority(d1fifo_dmaintid, level);
+        R_INTC_Enable(d1fifo_dmaintid);
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_reset_module
+* Description  : Initializes the USB module.
+*              : Enables providing clock to the USB module.
+*              : Sets USB bus wait register.
+* Arguments    : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+void usb1_function_reset_module (uint16_t clockmode)
+{
+    /* UPLLE bit is only USB0 */
+    if (RZA_IO_RegRead_16(&USB200.SYSCFG0,
+                                USB_SYSCFG_UPLLE_SHIFT,
+                                USB_SYSCFG_UPLLE) == 1)
+    {
+        if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode)
+        {
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            USB201.SYSCFG0 = 0;
+            USB200.SYSCFG0 = 0;
+            USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+            Userdef_USB_usb1_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+        else
+        {
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                0,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+            Userdef_USB_usb1_function_delay_xms(1);
+            RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                                1,
+                                USB_SUSPMODE_SUSPM_SHIFT,
+                                USB_SUSPMODE_SUSPM);
+        }
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                            0,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            0,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        USB201.SYSCFG0 = 0;
+        USB200.SYSCFG0 = 0;
+        USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode);
+        Userdef_USB_usb1_function_delay_xms(1);
+        RZA_IO_RegWrite_16(&USB200.SUSPMODE,
+                            1,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+        RZA_IO_RegWrite_16(&USB201.SUSPMODE,
+                            1,
+                            USB_SUSPMODE_SUSPM_SHIFT,
+                            USB_SUSPMODE_SUSPM);
+    }
+
+    USB201.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_buf_size
+* Description  : Obtains pipe buffer size specified by the argument and
+*              : maximum packet size of the USB device in use.
+*              : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum
+*              : packet size of the USB device using the corresponding pipe.
+*              : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the
+*              : corresponding pipe is in continuous transfer mode,
+*              : obtains the buffer size allocated in the corresponcing pipe,
+*              : when incontinuous transfer, obtains maximum packet size.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Maximum packet size or buffer size
+*******************************************************************************/
+uint16_t usb1_function_get_buf_size (uint16_t pipe)
+{
+    uint16_t size;
+    uint16_t bufsize;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB201.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1)
+        {
+            bufsize = RZA_IO_RegRead_16(&g_usb1_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE);
+            size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF);
+        }
+        else
+        {
+            size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+        }
+    }
+    return size;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_get_mxps
+* Description  : Obtains maximum packet size of the USB device using the pipe
+*              : specified by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+* Return Value : Max Packet Size
+*******************************************************************************/
+uint16_t usb1_function_get_mxps (uint16_t pipe)
+{
+    uint16_t size;
+
+    if (pipe == USB_FUNCTION_PIPE0)
+    {
+        size = RZA_IO_RegRead_16(&USB201.DCPMAXP,
+                                USB_DCPMAXP_MXPS_SHIFT,
+                                USB_DCPMAXP_MXPS);
+    }
+    else
+    {
+        size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS);
+    }
+    return size;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_api.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,441 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_api.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+#include "dev_drv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_api_function_init
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint8_t  int_level ; interruput level
+*              : uint16_t mode      : Speed modes
+*              :                    :  USB_FUCNTION_HIGH_SPEED: High-speed device
+*              :                    :  USB_FUCNTION_FULL_SPEED: Full-speed device
+*              : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ
+*              :                    ; 12MHz ; USBFCLOCK_EXTAL_12MHZ
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode)
+{
+    volatile uint8_t dummy_buf;
+
+    CPG.STBCR7  &= 0xfc;                        /*The clock of USB0/1 modules is permitted  */
+    dummy_buf   = CPG.STBCR7;                   /* (Dummy read)                             */
+
+    usb1_function_setting_interrupt(int_level);
+
+    usb1_function_reset_module(clockmode);      /* reset USB module with setting tranciever */
+                                                /* and HSE=1                                */
+
+    usb1_function_init_status();                /* clear variables                          */
+
+    usb1_function_InitModule(mode);             /* select USB Function and Interrupt Enable */
+                                                /* Detect USB Device to attach or detach    */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_api_function_IsConfigured
+* Description  : Checks if the USB device is configured to return the result as
+*              : the return value.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_YES  : Configured & Configured Suspend
+*              : DEVDRV_USBF_NO   : not Configured
+*******************************************************************************/
+uint16_t usb1_api_function_IsConfigured (void)
+{
+    uint16_t dvst;
+
+    dvst = usb1_function_GetDeviceState();
+
+    if ((dvst == USB_FUNCTION_DVST_CONFIGURED) ||
+        (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND))
+    {
+        return DEVDRV_USBF_YES;
+    }
+
+    return DEVDRV_USBF_NO;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_GetDeviceState
+* Description  : Returns the state of USB device.
+* Arguments    : none
+* Return Value : Device States
+*******************************************************************************/
+uint16_t usb1_function_GetDeviceState (void)
+{
+    uint16_t dvsq;
+    uint16_t dvst;
+
+    dvsq = USB201.INTSTS0;
+    switch (dvsq & USB_FUNCTION_BITDVSQ)
+    {
+        case USB_FUNCTION_DS_POWR:                      /* Power state *//* power-on */
+            dvst = USB_FUNCTION_DVST_POWERED;
+        break;
+
+        case USB_FUNCTION_DS_DFLT:                      /* Default state *//* bus-reset */
+            dvst = USB_FUNCTION_DVST_DEFAULT;
+        break;
+
+        case USB_FUNCTION_DS_ADDS:                      /* Address state */
+            dvst = USB_FUNCTION_DVST_ADDRESS;
+        break;
+
+        case USB_FUNCTION_DS_CNFG:                      /* Configured state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED;
+        break;
+
+        case USB_FUNCTION_DS_SPD_CNFG:                  /* Configured Suspend state */
+            dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND;
+        break;
+
+        case USB_FUNCTION_DS_SPD_POWR:                  /* Power      Suspend state */
+        case USB_FUNCTION_DS_SPD_DFLT:                  /* Default    Suspend state */
+        case USB_FUNCTION_DS_SPD_ADDR:                  /* Address    Suspend state */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+
+        default:                                        /* error */
+            dvst = USB_FUNCTION_DVST_SUSPEND;
+        break;
+    }
+
+    return dvst;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_start_receive_transfer
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint32_t size      ; Data Size
+*              : uint8_t *data      ; Data data Address
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    usb1_function_start_receive_transfer(pipe, size, data);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_start_send_transfer
+* Description  : Starts the USB data communication using pipe specified by the argument.
+* Arguments    : uint16_t pipe     ; Pipe Number
+*              : uint32_t size     ; Data Size
+*              : uint8_t *data     ; Data data Address
+* Return Value : DEVDRV_USBF_WRITEEND           ; Write end
+*              : DEVDRV_USBF_WRITESHRT          ; short data
+*              : DEVDRV_USBF_WRITING            ; Continue of data write
+*              : DEVDRV_USBF_WRITEDMA           ; Write DMA
+*              : DEVDRV_USBF_FIFOERROR          ; FIFO status
+*******************************************************************************/
+uint16_t usb1_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+
+    status = usb1_function_start_send_transfer(pipe, size, data);
+
+    return status;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_check_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+*              : uint32_t *size     ; Data Size
+* Return Value : Pipe Status
+*******************************************************************************/
+uint16_t usb1_api_function_check_pipe_status (uint16_t pipe, uint32_t * size)
+{
+    if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE)
+    {
+        *size = g_usb1_function_PipeDataSize[pipe];
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_DONE;
+    }
+    else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES)
+    {
+        *size = 0;
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_NORES;
+    }
+    else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL)
+    {
+        *size = 0;
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_PIPE_STALL;
+    }
+    else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR)
+    {
+        *size = 0;
+        g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
+
+        return DEVDRV_USBF_FIFOERROR;
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    return g_usb1_function_pipe_status[pipe];
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_pipe_status
+* Description  : Starts USB data reception using the pipe specified in the argument.
+*              : The FIFO for using is set in the pipe definition table.
+* Arguments    : uint16_t  pipe     ; Pipe Number
+* Return Value : Pipe Status
+*******************************************************************************/
+void usb1_api_function_clear_pipe_status (uint16_t pipe)
+{
+    g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+    g_usb1_function_PipeDataSize[pipe] = 0;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_pid_buf
+* Description  : Enables communicaqtion in the pipe specified by the argument
+*              : (BUF).
+* Arguments    : uint16_t pipe             ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_pid_buf (uint16_t pipe)
+{
+    usb1_function_set_pid_buf(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_pid_nak
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+*              : When the pipe status was enabling communication (BUF) before
+*              : executing before executing this function, waits in the software
+*              : until the pipe becomes ready after setting disabled.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_pid_nak (uint16_t pipe)
+{
+    usb1_function_set_pid_nak(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_pid_stall
+* Description  : Disables communication (STALL) in the pipe specified by the
+*              : argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_pid_stall (uint16_t pipe)
+{
+    usb1_function_set_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_pid_stall
+* Description  : Disables communication (NAK) in the pipe specified by the argument.
+* Arguments    : uint16_t pipe            ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_pid_stall (uint16_t pipe)
+{
+    usb1_function_clear_pid_stall(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_get_pid
+* Description  : Returns the pipe state specified by the argument.
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+uint16_t usb1_api_function_get_pid (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+
+    return pid;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_check_stall
+* Description  :
+* Arguments    : uint16_t pipe          ; Pipe Number
+* Return Value : PID
+*******************************************************************************/
+int32_t usb1_api_function_check_stall (uint16_t pipe)
+{
+    uint16_t pid;
+
+    pid = usb1_function_get_pid(pipe);
+
+    if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL)
+    {
+        return DEVDRV_USBF_STALL;
+    }
+
+    return DEVDRV_SUCCESS;
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_sqclr
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA0.
+* Arguments    : uint16_t pipe              ; Pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_sqclr (uint16_t pipe)
+{
+    usb1_function_set_sqclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_sqset
+* Description  : Sets the sequence bit of the pipe specified by the argument to
+*              : DATA1.
+* Arguments    : uint16_t pipe   ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_sqset (uint16_t pipe)
+{
+    usb1_function_set_sqset(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_csclr
+* Description  : CSPLIT status clear setting of sprit transaction in specified
+*              : pipe is performed.
+*              : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit
+*              : in DCPCTR register are continuously changed (when the sequence
+*              : toggle bit of data PID is continuously changed over two or more pipes),
+*              : the access cycle with 120 ns and more than 5 cycle bus clock is necessary.
+*              : Do not set both SQCLR bit and SQSET bit to 1 at the same time.
+*              : In addition, both bits should be operated after PID is set to NAK.
+*              : However, when it is set to the isochronous transfer as the transfer type
+*              : (TYPE=11), writing in SQSET bit is disabled.
+* Arguments    : uint16_t pipe     ; Pipe number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_csclr (uint16_t pipe)
+{
+    usb1_function_set_csclr(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_set_curpipe
+* Description  : Allocates FIF0 specifed by the argument in the pipe assigned
+*              : by the argument.
+* Arguments    : uint16_t pipe      ; Pipe Number
+*              : uint16_t fifosel   ; Select FIFO
+*              : uint16_t isel      ; FIFO Access Direction
+*              : uint16_t mbw       ; FIFO Port Access Bit Width
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
+{
+    usb1_function_set_curpipe(pipe, fifosel, isel, mbw);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_brdy_sts
+* Description  : Clear BRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_brdy_sts (uint16_t pipe)
+{
+    usb1_function_clear_brdy_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_bemp_sts
+* Description  : Clear BEMP interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_bemp_sts (uint16_t pipe)
+{
+    usb1_function_clear_bemp_sts(pipe);
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_clear_nrdy_sts
+* Description  : Clear NRDY interrupt status in the pipe spceified by the argument.
+* Arguments    : uint16_t pipe        ; pipe Number
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_clear_nrdy_sts (uint16_t pipe)
+{
+    usb1_function_clear_nrdy_sts(pipe);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_controlrw.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_controlrw.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_api_function_CtrlReadStart
+* Description  : Executes the USB control read transfer.
+*              : USB host controller <- USB device
+* Arguments    : uint16_t size     ; Data Size
+*              : uint8_t  *data    ; Data Address
+* Return Value : DEVDRV_USBF_WRITEEND          ; End of data write
+*              : DEVDRV_USBF_WRITESHRT         ; End of short data write
+*              : DEVDRV_USBF_WRITING           ; Continue of data write
+*              : DEVDRV_USBF_FIFOERROR         ; FIFO access error
+*******************************************************************************/
+uint16_t usb1_api_function_CtrlReadStart (uint32_t size, uint8_t * data)
+{
+    uint16_t status;
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb1_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0],
+                                    (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    status = usb1_function_write_buffer_c(USB_FUNCTION_PIPE0);
+
+    /* Peripheral Control sequence */
+    switch (status)
+    {
+        case DEVDRV_USBF_WRITESHRT:                                     /* End of data write */
+        case DEVDRV_USBF_WRITEEND:                                      /* End of data write (not null) */
+        case DEVDRV_USBF_WRITING:                                       /* Continue of data write */
+            usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0);          /* Enable Empty Interrupt */
+            usb1_function_set_pid_buf(USB_FUNCTION_PIPE0);              /* Set BUF */
+        break;
+
+        case DEVDRV_USBF_FIFOERROR:                                     /* FIFO access error */
+        break;
+
+        default:
+        break;
+    }
+
+    return status;                                                      /* End or Err or Continue */
+}
+
+/*******************************************************************************
+* Function Name: usb1_api_function_CtrlWriteStart
+* Description  : Executes the USB control write transfer.
+*              : USB host controller -> USB device
+* Arguments    : uint16_t  size         ; Data Size
+*              : uint8_t  *data         ; Data Address
+* Return Value : none
+*******************************************************************************/
+void usb1_api_function_CtrlWriteStart (uint32_t size, uint8_t * data)
+{
+    uint16_t mbw;
+
+    usb1_function_set_pid_nak(USB_FUNCTION_PIPE0);
+
+    g_usb1_function_data_count[USB_FUNCTION_PIPE0]   = size;
+    g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data;
+
+    mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0],
+                                    (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]);
+    usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
+    USB201.CFIFOCTR = USB_FUNCTION_BITBCLR;
+
+    usb1_function_enable_brdy_int(USB_FUNCTION_PIPE0);
+    usb1_function_set_pid_buf(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_global.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,144 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_global.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+const uint16_t g_usb1_function_bit_set[16] =
+{
+    0x0001, 0x0002, 0x0004, 0x0008,
+    0x0010, 0x0020, 0x0040, 0x0080,
+    0x0100, 0x0200, 0x0400, 0x0800,
+    0x1000, 0x2000, 0x4000, 0x8000
+};
+
+uint32_t g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint8_t  * g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+uint16_t g_usb1_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint32_t g_usb1_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+USB_FUNCTION_DMA_t g_usb1_function_DmaInfo[2];
+uint16_t g_usb1_function_DmaPipe[2];
+uint16_t g_usb1_function_DmaBval[2];
+uint16_t g_usb1_function_DmaStatus[2];
+
+uint16_t g_usb1_function_CtrZeroLengthFlag;
+
+//uint16_t g_usb1_function_ConfigNum;
+//uint16_t g_usb1_function_Alternate[USB_FUNCTION_ALT_NO];
+//uint16_t g_usb1_function_RemoteWakeupFlag;
+uint16_t g_usb1_function_TestModeFlag;
+uint16_t g_usb1_function_TestModeSelectors;
+
+//uint16_t g_usb1_function_ReqType;
+//uint16_t g_usb1_function_ReqTypeType;
+//uint16_t g_usb1_function_ReqTypeRecip;
+//uint16_t g_usb1_function_ReqRequest;
+//uint16_t g_usb1_function_ReqValue;
+//uint16_t g_usb1_function_ReqIndex;
+//uint16_t g_usb1_function_ReqLength;
+
+//uint16_t g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1];
+
+uint16_t g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1];
+uint16_t g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1];
+
+
+/*******************************************************************************
+* Function Name: usb1_function_init_status
+* Description  : Initialization USB Sample Driver Variable.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_init_status (void)
+{
+    uint16_t pipe;
+
+    //g_usb1_function_ConfigNum         = 0;
+    //g_usb1_function_RemoteWakeupFlag  = DEVDRV_USBF_OFF;
+    g_usb1_function_TestModeFlag      = DEVDRV_USBF_OFF;
+    g_usb1_function_CtrZeroLengthFlag = 0;
+
+#if 0
+    usb1_function_clear_alt();
+#endif
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+        g_usb1_function_PipeDataSize[pipe] = 0;
+        g_usb1_function_data_count[pipe]   = 0;
+
+        /* pipe configuration in usb1_function_ResetEP() */
+        g_usb1_function_pipecfg[pipe]  = 0;
+        g_usb1_function_pipebuf[pipe]  = 0;
+        g_usb1_function_pipemaxp[pipe] = 0;
+        g_usb1_function_pipeperi[pipe] = 0;
+    }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sig.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,330 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_sig.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb1_function_EnableINTModule(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_InitModule
+* Description  : Initializes the USB module in the USB function mode.
+* Arguments    : uint16_t mode  ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode
+*              :                ; other                   ; Full-speed Mode
+* Return Value : none
+*******************************************************************************/
+void usb1_function_InitModule (uint16_t mode)
+{
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);           /* USB function */
+
+    /* USB module operation enabled     */
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    if (mode == USB_FUNCTION_HIGH_SPEED)
+    {
+        RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                            1,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);        /* Hi-Speed Mode */
+    }
+    else
+    {
+        RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                            0,
+                            USB_SYSCFG_HSE_SHIFT,
+                            USB_SYSCFG_HSE);
+    }
+
+    /* for power-on                     */
+    if (usb1_function_CheckVBUStaus() == DEVDRV_USBF_ON)
+    {
+        usb1_function_EnableINTModule();            /* Interrupt Enable */
+        usb1_function_USB_FUNCTION_Attach();        /* pull-up D+ and open D- */
+    }
+    else
+    {
+        usb1_function_USB_FUNCTION_Detach();        /* USB Detach */
+                                                    /* with Interrupt Enable */
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_CheckVBUStaus
+* Description  : Checks the USB-VBUS state to returns the connection state to
+*              : the USB host.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   VBUS ON
+*              : DEVDRV_USBF_OFF   :   VBUS OFF
+*******************************************************************************/
+uint16_t usb1_function_CheckVBUStaus (void)
+{
+    uint16_t buf1;
+    uint16_t buf2;
+    uint16_t buf3;
+
+    /* monitor VBUS pins */
+    do
+    {
+        buf1 = RZA_IO_RegRead_16(&USB201.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb1_function_delay_10us(1);
+        buf2 = RZA_IO_RegRead_16(&USB201.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+        Userdef_USB_usb1_function_delay_10us(1);
+        buf3 = RZA_IO_RegRead_16(&USB201.INTSTS0,
+                                USB_INTSTS0_VBSTS_SHIFT,
+                                USB_INTSTS0_VBSTS);
+    } while ((buf1 != buf2) || (buf2 != buf3));
+
+    if (buf1 == DEVDRV_USBF_OFF)
+    {
+        return DEVDRV_USBF_OFF;        /* detach */
+    }
+
+    return DEVDRV_USBF_ON;             /* attach */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Attach
+* Description  : Connects to the USB host controller.
+*              : This function pulls up D+.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_USB_FUNCTION_Attach (void)
+{
+    Userdef_USB_usb1_function_attach();
+
+    Userdef_USB_usb1_function_delay_xms(10);
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);      /* Pull-up D+ and open D- */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Detach
+* Description  : Disconnects from the USB host controller.
+*              : This function opens D+/D-.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_USB_FUNCTION_Detach (void)
+{
+    uint16_t pipe;
+
+    Userdef_USB_usb1_function_detach();
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE)
+        {
+            usb1_function_stop_transfer(pipe);
+        }
+    }
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DPRPU_SHIFT,
+                        USB_SYSCFG_DPRPU);      /* open D+ and D- */
+
+    /* Detach Recovery */
+    Userdef_USB_usb1_function_delay_500ns();                /* need 1us=500ns * 2 wait */
+    Userdef_USB_usb1_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+    Userdef_USB_usb1_function_delay_500ns();                /* need 100ns wait but 500ns S/W wait */
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_DCFM_SHIFT,
+                        USB_SYSCFG_DCFM);
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        0,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);       /* soft reset module */
+    Userdef_USB_usb1_function_delay_500ns();
+
+    RZA_IO_RegWrite_16(&USB201.SYSCFG0,
+                        1,
+                        USB_SYSCFG_USBE_SHIFT,
+                        USB_SYSCFG_USBE);
+
+    usb1_function_EnableINTModule();            /* Interrupt Enable */
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_BusReset
+* Description  : This function is executed when the USB device is transitioned
+*              : to POWERD_STATE. Sets the device descriptor according to the
+*              : connection speed determined by the USB reset hand shake.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb1_function_USB_FUNCTION_BusReset (void)
+{
+    usb1_function_init_status();                                    /* memory clear */
+
+    if (usb1_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED)
+    {
+        usb1_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED);     /* Device Descriptor reset */
+    }
+    else
+    {
+        usb1_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED);     /* Device Descriptor reset */
+    }
+
+    usb1_function_ResetDCP();                                       /* Default Control PIPE reset */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Resume
+* Description  : This function is executed when the USB device detects a resume
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb1_function_USB_FUNCTION_Resume (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_Suspend
+* Description  : This function is executed when the USB device detects a suspend
+*              : signal.
+*              : The USB sample driver does not operate for this function.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0	/*The USBHAL in mbed does not need this function*/
+void usb1_function_USB_FUNCTION_Suspend (void)
+{
+    /* NOP */
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_USB_FUNCTION_TestMode
+* Description  : This function is executed when the USB device is transitioned U
+*              : to TEST_MODE by the USB standard request.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_USB_FUNCTION_TestMode (void)
+{
+    switch (g_usb1_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT)
+    {
+        case USB_FUNCTION_FUNCTION_TEST_J:
+        case USB_FUNCTION_FUNCTION_TEST_K:
+        case USB_FUNCTION_FUNCTION_TEST_SE0_NAK:
+        case USB_FUNCTION_FUNCTION_TEST_PACKET:
+            RZA_IO_RegWrite_16(&USB201.TESTMODE,
+                                (g_usb1_function_TestModeSelectors >> 8),
+                                USB_TESTMODE_UTST_SHIFT,
+                                USB_TESTMODE_UTST);
+        break;
+
+        case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE:
+        default:
+        break;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_EnableINTModule
+* Description  : Enables USB interrupt.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_EnableINTModule (void)
+{
+    uint16_t buf;
+
+    buf  = USB201.INTENB0;
+    buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE |
+            USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE);
+    USB201.INTENB0 = buf;
+
+    usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0);
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sub.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,453 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_sub.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include "usb1_function.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+#if 0
+extern const uint16_t *g_usb1_function_EndPntPtr[];
+extern uint8_t         g_usb1_function_DeviceDescriptor[];
+extern uint8_t        *g_usb1_function_ConfigurationPtr[];
+#endif
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: usb1_function_ResetDCP
+* Description  : Initializes the default control pipe(DCP).
+* Outline      : Reset default control pipe
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_ResetDCP (void)
+{
+    USB201.DCPCFG  = 0;
+#if 0
+    USB201.DCPMAXP = g_usb1_function_DeviceDescriptor[7];
+#else
+    USB201.DCPMAXP = 64;
+#endif
+
+    USB201.CFIFOSEL  = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB201.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+    USB201.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_ResetEP
+* Description  : Initializes the end point.
+* Arguments    : uint16_t num          ; Configuration Number
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_ResetEP (uint16_t num)
+{
+    uint16_t   pipe;
+    uint16_t   ep;
+    uint16_t   index;
+    uint16_t   buf;
+    uint16_t * tbl;
+
+    tbl = (uint16_t *)(g_usb1_function_EndPntPtr[num - 1]);
+
+    for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        if (g_usb1_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR)
+        {
+            index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb1_function_EPTableIndex[ep]);
+            pipe  = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE);
+
+            g_usb1_function_PipeTbl[pipe] = (uint16_t)(((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) |
+                                                         ep                                            |
+                                                        (tbl[index + 0] & USB_FUNCTION_FIFO_USE));
+
+            if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT)
+            {
+                tbl[index + 1] |= USB_FUNCTION_SHTNAKON;
+#ifdef  __USB_DMA_BFRE_ENABLE__
+                /* this routine cannnot be perfomred if read operation is executed in buffer size */
+                if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) ||
+                    ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA))
+                {
+                    tbl[index + 1] |= USB_FUNCTION_BFREON;
+                }
+#endif
+            }
+
+            /* Interrupt Disable */
+            buf  = USB201.BRDYENB;
+            buf &= (uint16_t)~g_usb1_function_bit_set[pipe];
+            USB201.BRDYENB = buf;
+            buf  = USB201.NRDYENB;
+            buf &= (uint16_t)~g_usb1_function_bit_set[pipe];
+            USB201.NRDYENB = buf;
+            buf  = USB201.BEMPENB;
+            buf &= (uint16_t)~g_usb1_function_bit_set[pipe];
+            USB201.BEMPENB = buf;
+
+            usb1_function_set_pid_nak(pipe);
+
+            /* CurrentPIPE Clear */
+            if (RZA_IO_RegRead_16(&USB201.CFIFOSEL,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB201.CFIFOSEL,
+                                    0,
+                                    USB_CFIFOSEL_CURPIPE_SHIFT,
+                                    USB_CFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB201.D0FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB201.D0FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            if (RZA_IO_RegRead_16(&USB201.D1FIFOSEL,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE) == pipe)
+            {
+                RZA_IO_RegWrite_16(&USB201.D1FIFOSEL,
+                                    0,
+                                    USB_DnFIFOSEL_CURPIPE_SHIFT,
+                                    USB_DnFIFOSEL_CURPIPE);
+            }
+
+            /* PIPE Configuration */
+            USB201.PIPESEL  = pipe;
+            USB201.PIPECFG  = tbl[index + 1];
+            USB201.PIPEBUF  = tbl[index + 2];
+            USB201.PIPEMAXP = tbl[index + 3];
+            USB201.PIPEPERI = tbl[index + 4];
+
+            g_usb1_function_pipecfg[pipe]  = tbl[index + 1];
+            g_usb1_function_pipebuf[pipe]  = tbl[index + 2];
+            g_usb1_function_pipemaxp[pipe] = tbl[index + 3];
+            g_usb1_function_pipeperi[pipe] = tbl[index + 4];
+
+            /* Buffer Clear */
+            usb1_function_set_sqclr(pipe);
+            usb1_function_aclrm(pipe);
+
+            /* init Global */
+            g_usb1_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+            g_usb1_function_PipeDataSize[pipe] = 0;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_EpToPipe
+* Description  : Returns the pipe which end point specified by the argument is
+*              : allocated to.
+* Arguments    : uint16_t ep       ; Direction + Endpoint Number
+* Return Value : USB_FUNCTION_EP_ERROR         : Error
+*              : Others           : Pipe Number
+*******************************************************************************/
+uint16_t usb1_function_EpToPipe (uint16_t ep)
+{
+    uint16_t pipe;
+
+    for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++)
+    {
+        if ((g_usb1_function_PipeTbl[pipe] & 0x00ff) == ep)
+        {
+            return pipe;
+        }
+    }
+
+    return USB_FUNCTION_EP_ERROR;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_InitEPTable
+* Description  : Sets the end point by the Alternate setting value of the
+*              : configuration number and the interface number specified by the
+*              : argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+*              : uint16_t Alt_Num       ; Alternate Setting
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point_interface;
+    uint16_t   point_endpoint;
+    uint16_t   length;
+    uint16_t   start;
+    uint16_t   numbers;
+    uint16_t   endpoint;
+
+    ptr = (uint8_t *)g_usb1_function_ConfigurationPtr[Con_Num - 1];
+    point_interface = *ptr;
+    length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2));
+    ptr  += *ptr;
+    start   = 0;
+    numbers = 0;
+    point_endpoint = 0;
+
+    for (; point_interface < length;)
+    {
+        switch (*(ptr + 1))                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                     /* Interface */
+                if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num))
+                {
+                    numbers = *(ptr + 4);
+                }
+                else
+                {
+                    start  += *(ptr + 4);
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_ENDPOINT:                      /* Endpoint */
+                if (point_endpoint < numbers)
+                {
+                    endpoint = (uint16_t)(*(ptr + 2) & 0x0f);
+                    g_usb1_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint);
+                    ++point_endpoint;
+                }
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                        /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:                 /* Configuration */
+            case USB_FUNCTION_DT_STRING:                        /* String */
+            default:                                            /* Class, Vendor, else */
+                point_interface += *ptr;
+                ptr += *ptr;
+            break;
+        }
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_GetConfigNum
+* Description  : Returns the number of configuration referring to the number of
+*              : configuration described in the device descriptor.
+* Arguments    : none
+* Return Value : Number of possible configurations (bNumConfigurations).
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_GetConfigNum (void)
+{
+    return (uint16_t)g_usb1_function_DeviceDescriptor[17];
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_GetInterfaceNum
+* Description  : Returns the number of interface referring to the number of
+*              : interface described in the configuration descriptor.
+* Arguments    : uint16_t num       ; Configuration Number
+* Return Value : Number of this interface (bNumInterfaces).
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_GetInterfaceNum (uint16_t num)
+{
+    return (uint16_t)(*(g_usb1_function_ConfigurationPtr[num - 1] + 4));
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_GetAltNum
+* Description  : Returns the Alternate setting value of the configuration number
+*              : and the interface number specified by the argument.
+* Arguments    : uint16_t Con_Num       ; Configuration Number
+*              : uint16_t Int_Num       ; Interface Number
+* Return Value : Value used to select this alternate setting(bAlternateSetting).
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num)
+{
+    uint8_t  * ptr;
+    uint16_t   point;
+    uint16_t   alt_num = 0;
+    uint16_t   length;
+
+    ptr = (uint8_t *)(g_usb1_function_ConfigurationPtr[Con_Num - 1]);
+    point = ptr[0];
+    ptr  += ptr[0];                                 /* InterfaceDescriptor[0] */
+    length  = (uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 2));
+    length |= (uint16_t)((uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8);
+
+    for (; point < length;)                                 /* Search Descriptor Table size */
+    {
+        switch (ptr[1])                                     /* Descriptor Type ? */
+        {
+            case USB_FUNCTION_DT_INTERFACE:                 /* Interface */
+                if (Int_Num == ptr[2])
+                {
+                    alt_num = (uint16_t)ptr[3];             /* Alternate Number count */
+                }
+                point += ptr[0];
+                ptr += ptr[0];
+            break;
+
+            case USB_FUNCTION_DT_DEVICE:                    /* Device */
+            case USB_FUNCTION_DT_CONFIGURATION:             /* Configuration */
+            case USB_FUNCTION_DT_STRING:                    /* String */
+            case USB_FUNCTION_DT_ENDPOINT:                  /* Endpoint */
+            default:                                        /* Class, Vendor, else */
+                point += ptr[0];
+                ptr   += ptr[0];
+            break;
+        }
+    }
+    return alt_num;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_CheckRemoteWakeup
+* Description  : Returns the result of the remote wake up function is supported
+*              : or not referring to the configuration descriptor.
+* Arguments    : none
+* Return Value : DEVDRV_USBF_ON     :   Support Remote Wakeup
+*              : DEVDRV_USBF_OFF    :   not Support Remote Wakeup
+*******************************************************************************/
+#if 0
+uint16_t usb1_function_CheckRemoteWakeup (void)
+{
+    uint8_t atr;
+
+    if (g_usb1_function_ConfigNum == 0)
+    {
+        return DEVDRV_USBF_OFF;
+    }
+
+    atr = *(g_usb1_function_ConfigurationPtr[g_usb1_function_ConfigNum - 1] + 7);
+
+    if (atr & USB_FUNCTION_CF_RWUP)
+    {
+        return DEVDRV_USBF_ON;
+    }
+
+    return DEVDRV_USBF_OFF;
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_alt
+* Description  : Initializes the Alternate setting area.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_clear_alt (void)
+{
+    int i;
+
+    for (i = 0; i < USB_FUNCTION_ALT_NO; ++i)
+    {
+        g_usb1_function_Alternate[i] = 0;                           /* Alternate */
+    }
+}
+#endif
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_pipe_tbl
+* Description  : Initializes pipe definition table.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void usb1_function_clear_pipe_tbl (void)
+{
+    int pipe;
+
+    for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe)
+    {
+        g_usb1_function_PipeTbl[pipe] = 0;
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_clear_ep_table_index
+* Description  : Initializes the end point table index.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+#if 0
+void usb1_function_clear_ep_table_index (void)
+{
+    int ep;
+
+    for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep)
+    {
+        g_usb1_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR;
+    }
+}
+#endif
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,698 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_dmacdrv.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "rza_io_regrw.h"
+#include "usb1_function_dmacdrv.h"
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DMAC_INDEFINE   (255)       /* Macro definition when REQD bit is not used */
+
+/* ==== Request setting information for on-chip peripheral module ==== */
+typedef enum dmac_peri_req_reg_type
+{
+    DMAC_REQ_MID,
+    DMAC_REQ_RID,
+    DMAC_REQ_AM,
+    DMAC_REQ_LVL,
+    DMAC_REQ_REQD
+} dmac_peri_req_reg_type_t;
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+/* ==== Prototype declaration ==== */
+
+/* ==== Global variable ==== */
+/* On-chip peripheral module request setting table */
+static const uint8_t usb1_function_dmac_peri_req_init_table[8][5] =
+{
+    /* MID,RID,AM,LVL,REQD */
+    {32, 3, 2, 1, 1},    /* USB_0 channel 0 transmit FIFO empty */
+    {32, 3, 2, 1, 0},    /* USB_0 channel 0 receive FIFO full   */
+    {33, 3, 2, 1, 1},    /* USB_0 channel 1 transmit FIFO empty */
+    {33, 3, 2, 1, 0},    /* USB_0 channel 1 receive FIFO full   */
+    {34, 3, 2, 1, 1},    /* USB_1 channel 0 transmit FIFO empty */
+    {34, 3, 2, 1, 0},    /* USB_1 channel 0 receive FIFO full   */
+    {35, 3, 2, 1, 1},    /* USB_1 channel 1 transmit FIFO empty */
+    {35, 3, 2, 1, 0},    /* USB_1 channel 1 receive FIFO full   */
+};
+
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 1.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 1 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t *trans_info   : Setting information to DMAC register
+*              : uint32_t          dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t          continuation : Set continuous transfer to be valid
+*              :                                  after DMA transfer has been completed
+*              :             DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :             DMAC_SAMPLE_SINGLE       : Do not execute continuous transfer
+*              : uint32_t request_factor        : Factor for on-chip peripheral module request
+*              :             DMAC_REQ_OSTM0TINT       : OSTM_0 compare match
+*              :             DMAC_REQ_OSTM1TINT       : OSTM_1 compare match
+*              :             DMAC_REQ_TGI0A           : MTU2_0 input capture/compare match
+*              :                  :
+*              : uint32_t          req_direction: Setting value of CHCFG_n register REQD bit
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC3_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC3.N0SA_n = trans_info->src_addr;         /* Start address of transfer source      */
+        DMAC3.N0DA_n = trans_info->dst_addr;         /* Start address of transfer destination */
+        DMAC3.N0TB_n = trans_info->count;            /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC3_CHCFG_n_DAD_SHIFT,
+                            DMAC3_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC3_CHCFG_n_SAD_SHIFT,
+                            DMAC3_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC3_CHCFG_n_DDS_SHIFT,
+                            DMAC3_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC3_CHCFG_n_SDS_SHIFT,
+                            DMAC3_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_DMS_SHIFT,
+                            DMAC3_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_RSEL_SHIFT,
+                            DMAC3_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_SBE_SHIFT,
+                            DMAC3_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_DEM_SHIFT,
+                            DMAC3_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                1,
+                                DMAC3_CHCFG_n_REN_SHIFT,
+                                DMAC3_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                1,
+                                DMAC3_CHCFG_n_RSW_SHIFT,
+                                DMAC3_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                0,
+                                DMAC3_CHCFG_n_REN_SHIFT,
+                                DMAC3_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                0,
+                                DMAC3_CHCFG_n_RSW_SHIFT,
+                                DMAC3_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_TM_SHIFT,
+                            DMAC3_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            3,
+                            DMAC3_CHCFG_n_SEL_SHIFT,
+                            DMAC3_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            1,
+                            DMAC3_CHCFG_n_HIEN_SHIFT,
+                            DMAC3_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            0,
+                            DMAC3_CHCFG_n_LOEN_SHIFT,
+                            DMAC3_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC3_CHCFG_n_AM_SHIFT,
+                            DMAC3_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC3_CHCFG_n_LVL_SHIFT,
+                            DMAC3_CHCFG_n_LVL);
+
+        if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC3_CHCFG_n_REQD_SHIFT,
+                                DMAC3_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC3.CHCFG_n,
+                                req_direction,
+                                DMAC3_CHCFG_n_REQD_SHIFT,
+                                DMAC3_CHCFG_n_REQD);
+        }
+
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC23_DMARS_CH3_RID_SHIFT,
+                            DMAC23_DMARS_CH3_RID);
+        RZA_IO_RegWrite_32(&DMAC23.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC23_DMARS_CH3_MID_SHIFT,
+                            DMAC23_DMARS_CH3_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_Open
+* Description  : Enables DMAC channel 3 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb1_function_DMAC3_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_EN_SHIFT,
+                                DMAC3_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_TACT_SHIFT,
+                                DMAC3_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                            1,
+                            DMAC3_CHCTRL_n_SWRST_SHIFT,
+                            DMAC3_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC3.CHCTRL_n,
+                                DMAC3_CHCTRL_n_SWRST_SHIFT,
+                                DMAC3_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                            1,
+                            DMAC3_CHCTRL_n_SETEN_SHIFT,
+                            DMAC3_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                                1,
+                                DMAC3_CHCTRL_n_STG_SHIFT,
+                                DMAC3_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_Close
+* Description  : Aborts DMAC channel 3 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC3_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n,
+                        1,
+                        DMAC3_CHCTRL_n_CLREN_SHIFT,
+                        DMAC3_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_TACT_SHIFT,
+                                DMAC3_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_EN_SHIFT,
+                                DMAC3_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC3.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC3_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 3 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 3 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC3_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC3.CHSTAT_n,
+                                DMAC3_CHSTAT_n_SR_SHIFT,
+                                DMAC3_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC3.N0SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC3.N0DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC3.N0TB_n = count;       /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC3.N1SA_n = src_addr;     /* Start address of transfer source      */
+        DMAC3.N1DA_n = dst_addr;     /* Start address of transfer destination */
+        DMAC3.N1TB_n = count;        /* Total transfer byte count             */
+     }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_PeriReqInit
+* Description  : Sets the register mode for DMA mode and the on-chip peripheral
+*              : module request for transfer request for DMAC channel 2.
+*              : Executes DMAC initial setting using the DMA information
+*              : specified by the argument *trans_info and the enabled/disabled
+*              : continuous transfer specified by the argument continuation.
+*              : Registers DMAC channel 2 interrupt handler function and sets
+*              : the interrupt priority level. Then enables transfer completion
+*              : interrupt.
+* Arguments    : dmac_transinfo_t * trans_info : Setting information to DMAC
+*              :                               : register
+*              : uint32_t dmamode      : DMA mode (only for DMAC_MODE_REGISTER)
+*              : uint32_t continuation : Set continuous transfer to be valid
+*              :                       : after DMA transfer has been completed
+*              :         DMAC_SAMPLE_CONTINUATION : Execute continuous transfer
+*              :         DMAC_SAMPLE_SINGLE       : Do not execute continuous
+*              :                                  : transfer
+*              : uint32_t request_factor : Factor for on-chip peripheral module
+*              :                         : request
+*              :         DMAC_REQ_OSTM0TINT : OSTM_0 compare match
+*              :         DMAC_REQ_OSTM1TINT : OSTM_1 compare match
+*              :         DMAC_REQ_TGI0A     : MTU2_0 input capture/compare match
+*              :                 :
+*              : uint32_t req_direction : Setting value of CHCFG_n register
+*              :                        : REQD bit
+*******************************************************************************/
+void usb1_function_DMAC4_PeriReqInit (const dmac_transinfo_t * trans_info,
+                                      uint32_t dmamode, uint32_t continuation,
+                                      uint32_t request_factor, uint32_t req_direction)
+{
+    /* ==== Register mode ==== */
+    if (DMAC_MODE_REGISTER == dmamode)
+    {
+        /* ==== Next0 register set ==== */
+        DMAC4.N0SA_n = trans_info->src_addr;        /* Start address of transfer source      */
+        DMAC4.N0DA_n = trans_info->dst_addr;        /* Start address of transfer destination */
+        DMAC4.N0TB_n = trans_info->count;           /* Total transfer byte count             */
+
+        /* DAD : Transfer destination address counting direction */
+        /* SAD : Transfer source address counting direction      */
+        /* DDS : Transfer destination transfer size              */
+        /* SDS : Transfer source transfer size                   */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->daddr_dir,
+                            DMAC4_CHCFG_n_DAD_SHIFT,
+                            DMAC4_CHCFG_n_DAD);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->saddr_dir,
+                            DMAC4_CHCFG_n_SAD_SHIFT,
+                            DMAC4_CHCFG_n_SAD);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->dst_size,
+                            DMAC4_CHCFG_n_DDS_SHIFT,
+                            DMAC4_CHCFG_n_DDS);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            trans_info->src_size,
+                            DMAC4_CHCFG_n_SDS_SHIFT,
+                            DMAC4_CHCFG_n_SDS);
+
+        /* DMS  : Register mode                            */
+        /* RSEL : Select Next0 register set                */
+        /* SBE  : No discharge of buffer data when aborted */
+        /* DEM  : No DMA interrupt mask                    */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_DMS_SHIFT,
+                            DMAC4_CHCFG_n_DMS);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_RSEL_SHIFT,
+                            DMAC4_CHCFG_n_RSEL);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_SBE_SHIFT,
+                            DMAC4_CHCFG_n_SBE);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_DEM_SHIFT,
+                            DMAC4_CHCFG_n_DEM);
+
+        /* ---- Continuous transfer ---- */
+        if (DMAC_SAMPLE_CONTINUATION == continuation)
+        {
+            /* REN : Execute continuous transfer                         */
+            /* RSW : Change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                1,
+                                DMAC4_CHCFG_n_REN_SHIFT,
+                                DMAC4_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                1,
+                                DMAC4_CHCFG_n_RSW_SHIFT,
+                                DMAC4_CHCFG_n_RSW);
+        }
+        /* ---- Single transfer ---- */
+        else
+        {
+            /* REN : Do not execute continuous transfer                         */
+            /* RSW : Do not change register set when DMA transfer is completed. */
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                0,
+                                DMAC4_CHCFG_n_REN_SHIFT,
+                                DMAC4_CHCFG_n_REN);
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                0,
+                                DMAC4_CHCFG_n_RSW_SHIFT,
+                                DMAC4_CHCFG_n_RSW);
+        }
+
+        /* TM  : Single transfer                          */
+        /* SEL : Channel setting                          */
+        /* HIEN, LOEN : On-chip peripheral module request */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_TM_SHIFT,
+                            DMAC4_CHCFG_n_TM);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            4,
+                            DMAC4_CHCFG_n_SEL_SHIFT,
+                            DMAC4_CHCFG_n_SEL);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            1,
+                            DMAC4_CHCFG_n_HIEN_SHIFT,
+                            DMAC4_CHCFG_n_HIEN);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            0,
+                            DMAC4_CHCFG_n_LOEN_SHIFT,
+                            DMAC4_CHCFG_n_LOEN);
+
+        /* ---- Set factor by specified on-chip peripheral module request ---- */
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM],
+                            DMAC4_CHCFG_n_AM_SHIFT,
+                            DMAC4_CHCFG_n_AM);
+        RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL],
+                            DMAC4_CHCFG_n_LVL_SHIFT,
+                            DMAC4_CHCFG_n_LVL);
+        if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE)
+        {
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD],
+                                DMAC4_CHCFG_n_REQD_SHIFT,
+                                DMAC4_CHCFG_n_REQD);
+        }
+        else
+        {
+            RZA_IO_RegWrite_32(&DMAC4.CHCFG_n,
+                                req_direction,
+                                DMAC4_CHCFG_n_REQD_SHIFT,
+                                DMAC4_CHCFG_n_REQD);
+        }
+        RZA_IO_RegWrite_32(&DMAC45.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID],
+                            DMAC45_DMARS_CH4_RID_SHIFT,
+                            DMAC45_DMARS_CH4_RID);
+        RZA_IO_RegWrite_32(&DMAC45.DMARS,
+                            usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID],
+                            DMAC45_DMARS_CH4_MID_SHIFT,
+                            DMAC45_DMARS_CH4_MID);
+
+        /* PR : Round robin mode */
+        RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7,
+                            1,
+                            DMAC07_DCTRL_0_7_PR_SHIFT,
+                            DMAC07_DCTRL_0_7_PR);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_Open
+* Description  : Enables DMAC channel 4 transfer.
+* Arguments    : uint32_t req : DMAC request mode
+* Return Value :  0 : Succeeded in enabling DMA transfer
+*              : -1 : Failed to enable DMA transfer (due to DMA operation)
+*******************************************************************************/
+int32_t usb1_function_DMAC4_Open (uint32_t req)
+{
+    int32_t ret;
+    volatile uint8_t  dummy;
+
+    /* Transferable? */
+    if ((0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_EN_SHIFT,
+                                DMAC4_CHSTAT_n_EN)) &&
+        (0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_TACT_SHIFT,
+                                DMAC4_CHSTAT_n_TACT)))
+    {
+        /* Clear Channel Status Register */
+        RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                            1,
+                            DMAC4_CHCTRL_n_SWRST_SHIFT,
+                            DMAC4_CHCTRL_n_SWRST);
+        dummy = RZA_IO_RegRead_32(&DMAC4.CHCTRL_n,
+                                DMAC4_CHCTRL_n_SWRST_SHIFT,
+                                DMAC4_CHCTRL_n_SWRST);
+        /* Enable DMA transfer */
+        RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                            1,
+                            DMAC4_CHCTRL_n_SETEN_SHIFT,
+                            DMAC4_CHCTRL_n_SETEN);
+
+        /* ---- Request by software ---- */
+        if (DMAC_REQ_MODE_SOFT == req)
+        {
+            /* DMA transfer Request by software */
+            RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                                1,
+                                DMAC4_CHCTRL_n_STG_SHIFT,
+                                DMAC4_CHCTRL_n_STG);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+    }
+
+    return ret;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_Close
+* Description  : Aborts DMAC channel 4 transfer. Returns the remaining transfer
+*              : byte count at the time of DMA transfer abort to the argument
+*              : *remain.
+* Arguments    : uint32_t * remain : Remaining transfer byte count when
+*              :                   : DMA transfer is aborted
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC4_Close (uint32_t * remain)
+{
+
+    /* ==== Abort transfer ==== */
+    RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n,
+                        1,
+                        DMAC4_CHCTRL_n_CLREN_SHIFT,
+                        DMAC4_CHCTRL_n_CLREN);
+
+    while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_TACT_SHIFT,
+                                DMAC4_CHSTAT_n_TACT))
+    {
+        /* Loop until transfer is aborted */
+    }
+
+    while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_EN_SHIFT,
+                                DMAC4_CHSTAT_n_EN))
+    {
+        /* Loop until 0 is set in EN before checking the remaining transfer byte count */
+    }
+    /* ==== Obtain remaining transfer byte count ==== */
+    *remain = DMAC4.CRTB_n;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_DMAC4_Load_Set
+* Description  : Sets the transfer source address, transfer destination
+*              : address, and total transfer byte count respectively
+*              : specified by the argument src_addr, dst_addr, and count to
+*              : DMAC channel 4 as DMA transfer information.
+*              : Sets the register set selected by the CHCFG_n register
+*              : RSEL bit from the Next0 or Next1 register set.
+*              : This function should be called when DMA transfer of DMAC
+*              : channel 4 is aboted.
+* Arguments    : uint32_t src_addr : Transfer source address
+*              : uint32_t dst_addr : Transfer destination address
+*              : uint32_t count    : Total transfer byte count
+* Return Value : none
+*******************************************************************************/
+void usb1_function_DMAC4_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count)
+{
+    uint8_t reg_set;
+
+    /* Obtain register set in use */
+    reg_set = RZA_IO_RegRead_32(&DMAC4.CHSTAT_n,
+                                DMAC4_CHSTAT_n_SR_SHIFT,
+                                DMAC4_CHSTAT_n_SR);
+
+    /* ==== Load ==== */
+    if (0 == reg_set)
+    {
+        /* ---- Next0 Register Set ---- */
+        DMAC4.N0SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC4.N0DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC4.N0TB_n = count;       /* Total transfer byte count             */
+    }
+    else
+    {
+        /* ---- Next1 Register Set ---- */
+        DMAC4.N1SA_n = src_addr;    /* Start address of transfer source      */
+        DMAC4.N1DA_n = dst_addr;    /* Start address of transfer destination */
+        DMAC4.N1TB_n = count;       /* Total transfer byte count             */
+     }
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,762 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+/*******************************************************************************
+* File Name    : usb1_function_userdef.c
+* $Rev: 1116 $
+* $Date:: 2014-07-09 16:29:19 +0900#$
+* Device(s)    : RZ/A1H
+* Tool-Chain   :
+* OS           : None
+* H/W Platform :
+* Description  : RZ/A1H R7S72100 USB Sample Program
+* Operation    :
+* Limitations  :
+*******************************************************************************/
+
+
+/*******************************************************************************
+Includes   <System Includes> , "Project Includes"
+*******************************************************************************/
+#include <stdio.h>
+#include "r_typedefs.h"
+#include "iodefine.h"
+#include "devdrv_usb_function_api.h"
+#include "usb1_function_dmacdrv.h"  /* common DMAC driver for USB */
+
+
+/*******************************************************************************
+Typedef definitions
+*******************************************************************************/
+
+
+/*******************************************************************************
+Macro definitions
+*******************************************************************************/
+#define DUMMY_ACCESS OSTM0CNT
+
+/* #define CACHE_WRITEBACK */
+
+
+/*******************************************************************************
+Imported global variables and functions (from other files)
+*******************************************************************************/
+extern int32_t io_cwb(unsigned long start, unsigned long end);
+
+
+/*******************************************************************************
+Exported global variables and functions (to be accessed by other files)
+*******************************************************************************/
+static void usb1_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void usb1_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count,
+                                       uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc);
+static void Userdef_USB_usb1_function_delay_10us_2(void);
+
+
+/*******************************************************************************
+Private global variables and functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_d0fifo_dmaintid
+* Description  : get D0FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D0FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_d1fifo_dmaintid
+* Description  : get D1FIFO DMA Interrupt ID
+* Arguments    : none
+* Return Value : D1FIFO DMA Interrupt ID
+*******************************************************************************/
+IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid (void)
+{
+#if 0
+    return DMAINT1_IRQn;
+#else
+    return 0xFFFF;
+#endif
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_attach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_attach (void)
+{
+    printf("\n");
+    printf("channel 1 attach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_detach
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_detach (void)
+{
+    printf("\n");
+    printf("channel 1 detach device\n");
+    printf("\n");
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_1ms
+* Description  : Wait for the software of 1ms.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_1ms (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /*
+     * Wait 1ms (Please change for your MCU).
+     */
+    for (i = 0; i < 1440; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_xms
+* Description  : Wait for the software in the period of time specified by the
+*              : argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t msec ; Wait Time (msec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_xms (uint32_t msec)
+{
+    volatile unsigned short i;
+
+    for (i = 0; i < msec; ++i)
+    {
+        Userdef_USB_usb1_function_delay_1ms();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_10us
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : uint32_t usec ; Wait Time(x 10usec)
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_10us (uint32_t usec)
+{
+    volatile int i;
+
+    /* Wait 10us (Please change for your MCU) */
+    for (i = 0; i < usec; ++i)
+    {
+        Userdef_USB_usb1_function_delay_10us_2();
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_10us_2
+* Description  : Waits for software for the period specified by the argument.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+static void Userdef_USB_usb1_function_delay_10us_2 (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 1us (Please change for your MCU) */
+    for (i = 0; i < 14; ++i)
+    {
+        tmp = DUMMY_ACCESS;
+    }
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_delay_500ns
+* Description  : Wait for software for 500ns.
+*              : Alter this function according to the user's system.
+* Arguments    : none
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_delay_500ns (void)
+{
+    volatile int i;
+    volatile unsigned long tmp;
+
+    /* Wait 500ns (Please change for your MCU) */
+    /* Wait 500ns I clock 266MHz */
+    tmp = DUMMY_ACCESS;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_start_dma
+* Description  : Enables DMA transfer on the information specified by the argument.
+*              : Set DMAC register by this function to enable DMA transfer.
+*              : After executing this function, USB module is set to start DMA
+*              : transfer. DMA transfer should not wait for DMA transfer complete.
+* Arguments    : USB_FUNCTION_DMA_t *dma   : DMA parameter
+*              :  typedef struct{
+*              :      uint32_t fifo;    FIFO for using
+*              :      uint32_t buffer;  Start address of transfer source/destination
+*              :      uint32_t bytes;   Transfer size(Byte)
+*              :      uint32_t dir;     Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer)
+*              :      uint32_t size;    DMA transfer size
+*              :   } USB_FUNCTION_DMA_t;
+*              : uint16_t dfacc ; 0 : cycle steal mode
+*              :                  1 : 16byte continuous mode
+*              :                  2 : 32byte continuous mode
+* Return Value : none
+*******************************************************************************/
+void Userdef_USB_usb1_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc)
+{
+    uint32_t trncount;
+    uint32_t src;
+    uint32_t dst;
+    uint32_t size;
+    uint32_t dir;
+#ifdef CACHE_WRITEBACK
+    uint32_t ptr;
+#endif
+
+    trncount = dma->bytes;
+    dir      = dma->dir;
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        /* DxFIFO determination */
+        dst = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            src = (uint32_t)(&USB201.D0FIFO.UINT32);
+        }
+        else
+        {
+            src = (uint32_t)(&USB201.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            src += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    src = (uint32_t)(&USB201.D0FIFO.UINT32);
+                }
+                else
+                {
+                    src = (uint32_t)(&USB201.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            src += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                src = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                src = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            src += 3;       /* byte access */
+        }
+#endif
+    }
+    else
+    {
+        /* DxFIFO determination */
+        src = dma->buffer;
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+        if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+        {
+            dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+        }
+        else
+        {
+            dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+        }
+        size = dma->size;
+
+        if (size == 0)
+        {
+            dst += 3;       /* byte access  */
+        }
+        else if (size == 1)
+        {
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* Do Nothing */
+        }
+#else
+        size = dma->size;
+
+        if (size == 2)
+        {
+            /* 32bit access */
+            if (dfacc == 2)
+            {
+                /* 32byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else if (dfacc == 1)
+            {
+                /* 16byte access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB201.D0FIFOB0);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB201.D1FIFOB0);
+                }
+            }
+            else
+            {
+                /* normal access */
+                if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+                {
+                    dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+                }
+                else
+                {
+                    dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+                }
+            }
+        }
+        else if (size == 1)
+        {
+            /* 16bit access */
+            dfacc = 0;      /* force normal access */
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            dst += 2;       /* short access */
+        }
+        else
+        {
+            /* 8bit access */
+            dfacc = 0;      /* force normal access */
+
+            if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+            {
+                dst = (uint32_t)(&USB201.D0FIFO.UINT32);
+            }
+            else
+            {
+                dst = (uint32_t)(&USB201.D1FIFO.UINT32);
+            }
+            dst += 3;       /* byte access  */
+        }
+#endif
+    }
+
+#ifdef CACHE_WRITEBACK
+    ptr = (uint32_t)dma->buffer;
+
+    if ((ptr & 0x20000000ul) == 0)
+    {
+        io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount);
+    }
+#endif
+
+    if (dma->fifo == USB_FUNCTION_D0FIFO_DMA)
+    {
+        usb1_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+    else
+    {
+        usb1_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc);
+    }
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_dmac0
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB1_DMA0_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB1_DMA0_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb1_function_DMAC3_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb1_function_DMAC3_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb1_function_DMAC3_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC3 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: usb1_function_enable_dmac1
+* Description  : Enables DMA transfer on the information specified by the argument.
+* Arguments    : uint32_t src   : src address
+*              : uint32_t dst   : dst address
+*              : uint32_t count : transfer byte
+*              : uint32_t size  : transfer size
+*              : uint32_t dir   : direction
+*              : uint32_t fifo  : FIFO(D0FIFO or D1FIFO)
+*              : uint16_t dfacc : 0 : normal access
+*              :                : 1 : 16byte access
+*              :                : 2 : 32byte access
+* Return Value : none
+*******************************************************************************/
+static void usb1_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count,
+                                        uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc)
+{
+    dmac_transinfo_t trans_info;
+    uint32_t         request_factor = 0;
+    int32_t          ret;
+
+    /* ==== Variable setting for DMAC initialization ==== */
+    trans_info.src_addr = (uint32_t)src;                /* Start address of transfer source      */
+    trans_info.dst_addr = (uint32_t)dst;                /* Start address of transfer destination */
+    trans_info.count    = (uint32_t)count;              /* Total byte count to be transferred    */
+#ifndef __USB_FUNCTION_DF_ACC_ENABLE__
+    if (size == 0)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_8;        /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_8;        /* Transfer destination transfer size */
+    }
+    else if (size == 1)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_16;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_16;       /* Transfer destination transfer size */
+    }
+    else if (size == 2)
+    {
+        trans_info.src_size = DMAC_TRANS_SIZE_32;       /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_32;       /* Transfer destination transfer size */
+    }
+    else
+    {
+        printf("size error!!\n");
+    }
+#else
+    if (dfacc == 2)
+    {
+        /* 32byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_256;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_256;      /* Transfer destination transfer size */
+    }
+    else if (dfacc == 1)
+    {
+        /* 16byte access */
+        trans_info.src_size = DMAC_TRANS_SIZE_128;      /* Transfer source transfer size      */
+        trans_info.dst_size = DMAC_TRANS_SIZE_128;      /* Transfer destination transfer size */
+    }
+    else
+    {
+        /* normal access */
+        if (size == 0)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_8;    /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_8;    /* Transfer destination transfer size */
+        }
+        else if (size == 1)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_16;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_16;   /* Transfer destination transfer size */
+        }
+        else if (size == 2)
+        {
+            trans_info.src_size = DMAC_TRANS_SIZE_32;   /* Transfer source transfer size      */
+            trans_info.dst_size = DMAC_TRANS_SIZE_32;   /* Transfer destination transfer size */
+        }
+        else
+        {
+            printf("size error!!\n");
+        }
+    }
+#endif
+
+    if (dir == USB_FUNCTION_FIFO2BUF)
+    {
+        request_factor =DMAC_REQ_USB1_DMA1_RX;          /* USB_0 channel 0 receive FIFO full               */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer destination address */
+    }
+    else if (dir == USB_FUNCTION_BUF2FIFO)
+    {
+        request_factor =DMAC_REQ_USB1_DMA1_TX;          /* USB_0 channel 0 receive FIFO empty              */
+        trans_info.saddr_dir = DMAC_TRANS_ADR_INC;      /* Count direction of transfer source address      */
+        trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;   /* Count direction of transfer destination address */
+    }
+    else
+    {
+        /* Do Nothing */
+    }
+
+    /* ==== DMAC initialization ==== */
+    usb1_function_DMAC4_PeriReqInit((const dmac_transinfo_t *)&trans_info,
+                                    DMAC_MODE_REGISTER,
+                                    DMAC_SAMPLE_SINGLE,
+                                    request_factor,
+                                    0);     /* Don't care DMAC_REQ_REQD is setting in
+                                            usb1_function_DMAC4_PeriReqInit() */
+
+    /* ==== DMAC startup ==== */
+    ret = usb1_function_DMAC4_Open(DMAC_REQ_MODE_PERI);
+    if (ret != 0)
+    {
+        printf("DMAC4 Open error!!\n");
+    }
+
+    return;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_stop_dma0
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D0_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb1_function_stop_dma0 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb1_function_DMAC3_Close(&remain);
+
+    return remain;
+}
+
+/*******************************************************************************
+* Function Name: Userdef_USB_usb1_function_stop_dma1
+* Description  : Disables DMA transfer.
+*              : This function should be executed to DMAC executed at the time
+*              : of specification of D1_FIF0_DMA in dma->fifo.
+* Arguments    : none
+* Return Value : uint32_t return Transfer Counter register(DMATCRn) value
+*              : regarding to the bus width.
+*******************************************************************************/
+uint32_t Userdef_USB_usb1_function_stop_dma1 (void)
+{
+    uint32_t remain;
+
+    /* ==== DMAC release ==== */
+    usb1_function_DMAC4_Close(&remain);
+
+    return remain;
+}
+
+/* End of File */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb_function_setting.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,173 @@
+/*******************************************************************************
+* DISCLAIMER
+* This software is supplied by Renesas Electronics Corporation and is only
+* intended for use with Renesas products. No other uses are authorized. This
+* software is owned by Renesas Electronics Corporation and is protected under
+* all applicable laws, including copyright laws.
+* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
+* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
+* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
+* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
+* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
+* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
+* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
+* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+* Renesas reserves the right, without notice, to make changes to this software
+* and to discontinue the availability of this software. By using this software,
+* you agree to the additional terms and conditions found by accessing the
+* following link:
+* http://www.renesas.com/disclaimer
+* Copyright (C) 2014 - 2015 Renesas Electronics Corporation. All rights reserved.
+*******************************************************************************/
+
+#ifndef USB_FUNCTION_SETTING_H
+#define USB_FUNCTION_SETTING_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define USB_FUNCTION_CH                       0
+#define USB_FUNCTION_HISPEED                  1
+
+#if (USB_FUNCTION_CH == 0)
+#include "usb0_function.h"
+#define USB20X                                USB200
+#define USBIX_IRQn                            USBI0_IRQn
+#define g_usbx_function_bit_set               g_usb0_function_bit_set
+#define g_usbx_function_PipeDataSize          g_usb0_function_PipeDataSize
+#define g_usbx_function_data_count            g_usb0_function_data_count
+#define g_usbx_function_PipeTbl               g_usb0_function_PipeTbl
+#define g_usbx_function_DmaStatus             g_usb0_function_DmaStatus
+#define g_usbx_function_pipecfg               g_usb0_function_pipecfg
+#define g_usbx_function_pipe_status           g_usb0_function_pipe_status
+#define g_usbx_function_data_pointer          g_usb0_function_data_pointer
+#define g_usbx_function_pipebuf               g_usb0_function_pipebuf
+#define g_usbx_function_pipemaxp              g_usb0_function_pipemaxp
+#define g_usbx_function_pipeperi              g_usb0_function_pipeperi
+#define g_usbx_function_TestModeFlag          g_usb0_function_TestModeFlag
+#define usbx_function_BRDYInterruptPIPE0      usb0_function_BRDYInterruptPIPE0
+#define usbx_function_BRDYInterrupt           usb0_function_BRDYInterrupt
+#define usbx_function_NRDYInterruptPIPE0      usb0_function_NRDYInterruptPIPE0
+#define usbx_function_NRDYInterrupt           usb0_function_NRDYInterrupt
+#define usbx_function_BEMPInterruptPIPE0      usb0_function_BEMPInterruptPIPE0
+#define usbx_function_BEMPInterrupt           usb0_function_BEMPInterrupt
+#define usbx_function_read_buffer_c           usb0_function_read_buffer_c
+#define usbx_function_set_pid_buf             usb0_function_set_pid_buf
+#define usbx_function_disable_brdy_int        usb0_function_disable_brdy_int
+#define usbx_function_set_pid_stall           usb0_function_set_pid_stall
+#define usbx_function_dma_interrupt_d0fifo    usb0_function_dma_interrupt_d0fifo
+#define usbx_function_read_dma                usb0_function_read_dma
+#define usbx_function_dma_interrupt_d1fifo    usb0_function_dma_interrupt_d1fifo
+#define usbx_function_write_buffer            usb0_function_write_buffer
+#define usbx_function_set_pid_nak             usb0_function_set_pid_nak
+#define usbx_function_get_mbw                 usb0_function_get_mbw
+#define usbx_function_set_curpipe             usb0_function_set_curpipe
+#define usbx_function_aclrm                   usb0_function_aclrm
+#define usbx_function_enable_nrdy_int         usb0_function_enable_nrdy_int
+#define usbx_function_enable_brdy_int         usb0_function_enable_brdy_int
+#define usbx_function_get_pid                 usb0_function_get_pid
+#define usbx_function_get_inbuf               usb0_function_get_inbuf
+#define usbx_function_disable_bemp_int        usb0_function_disable_bemp_int
+#define usbx_function_EpToPipe                usb0_function_EpToPipe
+#define usbx_function_clear_pipe_tbl          usb0_function_clear_pipe_tbl
+#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb0_function_d0fifo_dmaintid
+#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb0_function_d1fifo_dmaintid
+#define usbx_function_reset_module            usb0_function_reset_module
+#define usbx_function_init_status             usb0_function_init_status
+#define usbx_function_InitModule              usb0_function_InitModule
+#define usbx_function_clear_alt               usb0_function_clear_alt
+#define usbx_function_set_sqclr               usb0_function_set_sqclr
+#define usbx_api_function_CtrlWriteStart      usb0_api_function_CtrlWriteStart
+#define usbx_api_function_CtrlReadStart       usb0_api_function_CtrlReadStart
+#define usbx_function_write_buffer_c          usb0_function_write_buffer_c
+#define usbx_api_function_check_pipe_status   usb0_api_function_check_pipe_status
+#define usbx_api_function_set_pid_nak         usb0_api_function_set_pid_nak
+#define usbx_api_function_clear_pipe_status   usb0_api_function_clear_pipe_status
+#define usbx_api_function_start_receive_transfer usb0_api_function_start_receive_transfer
+#define usbx_function_read_buffer             usb0_function_read_buffer
+#define usbx_api_function_start_send_transfer usb0_api_function_start_send_transfer
+#define usbx_function_stop_transfer           usb0_function_stop_transfer
+#define usbx_function_clear_pid_stall         usb0_function_clear_pid_stall
+#define usbx_function_CheckVBUStaus           usb0_function_CheckVBUStaus
+#define usbx_function_USB_FUNCTION_Attach     usb0_function_USB_FUNCTION_Attach
+#define usbx_function_USB_FUNCTION_Detach     usb0_function_USB_FUNCTION_Detach
+#define usbx_function_is_hispeed              usb0_function_is_hispeed
+#define usbx_function_ResetDescriptor         usb0_function_ResetDescriptor
+#define usbx_function_USB_FUNCTION_Suspend    usb0_function_USB_FUNCTION_Suspend
+#define usbx_function_USB_FUNCTION_TestMode   usb0_function_USB_FUNCTION_TestMode
+#else
+#include "usb1_function.h"
+#define USB20X                                USB201
+#define USBIX_IRQn                            USBI1_IRQn
+#define g_usbx_function_bit_set               g_usb1_function_bit_set
+#define g_usbx_function_PipeDataSize          g_usb1_function_PipeDataSize
+#define g_usbx_function_data_count            g_usb1_function_data_count
+#define g_usbx_function_PipeTbl               g_usb1_function_PipeTbl
+#define g_usbx_function_DmaStatus             g_usb1_function_DmaStatus
+#define g_usbx_function_pipecfg               g_usb1_function_pipecfg
+#define g_usbx_function_pipe_status           g_usb1_function_pipe_status
+#define g_usbx_function_data_pointer          g_usb1_function_data_pointer
+#define g_usbx_function_pipebuf               g_usb1_function_pipebuf
+#define g_usbx_function_pipemaxp              g_usb1_function_pipemaxp
+#define g_usbx_function_pipeperi              g_usb1_function_pipeperi
+#define g_usbx_function_TestModeFlag          g_usb1_function_TestModeFlag
+#define usbx_function_BRDYInterruptPIPE0      usb1_function_BRDYInterruptPIPE0
+#define usbx_function_BRDYInterrupt           usb1_function_BRDYInterrupt
+#define usbx_function_NRDYInterruptPIPE0      usb1_function_NRDYInterruptPIPE0
+#define usbx_function_NRDYInterrupt           usb1_function_NRDYInterrupt
+#define usbx_function_BEMPInterruptPIPE0      usb1_function_BEMPInterruptPIPE0
+#define usbx_function_BEMPInterrupt           usb1_function_BEMPInterrupt
+#define usbx_function_read_buffer_c           usb1_function_read_buffer_c
+#define usbx_function_set_pid_buf             usb1_function_set_pid_buf
+#define usbx_function_disable_brdy_int        usb1_function_disable_brdy_int
+#define usbx_function_set_pid_stall           usb1_function_set_pid_stall
+#define usbx_function_dma_interrupt_d0fifo    usb1_function_dma_interrupt_d0fifo
+#define usbx_function_read_dma                usb1_function_read_dma
+#define usbx_function_dma_interrupt_d1fifo    usb1_function_dma_interrupt_d1fifo
+#define usbx_function_write_buffer            usb1_function_write_buffer
+#define usbx_function_set_pid_nak             usb1_function_set_pid_nak
+#define usbx_function_get_mbw                 usb1_function_get_mbw
+#define usbx_function_set_curpipe             usb1_function_set_curpipe
+#define usbx_function_aclrm                   usb1_function_aclrm
+#define usbx_function_enable_nrdy_int         usb1_function_enable_nrdy_int
+#define usbx_function_enable_brdy_int         usb1_function_enable_brdy_int
+#define usbx_function_get_pid                 usb1_function_get_pid
+#define usbx_function_get_inbuf               usb1_function_get_inbuf
+#define usbx_function_disable_bemp_int        usb1_function_disable_bemp_int
+#define usbx_function_EpToPipe                usb1_function_EpToPipe
+#define usbx_function_clear_pipe_tbl          usb1_function_clear_pipe_tbl
+#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb1_function_d0fifo_dmaintid
+#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb1_function_d1fifo_dmaintid
+#define usbx_function_reset_module            usb1_function_reset_module
+#define usbx_function_init_status             usb1_function_init_status
+#define usbx_function_InitModule              usb1_function_InitModule
+#define usbx_function_clear_alt               usb1_function_clear_alt
+#define usbx_function_set_sqclr               usb1_function_set_sqclr
+#define usbx_api_function_CtrlWriteStart      usb1_api_function_CtrlWriteStart
+#define usbx_api_function_CtrlReadStart       usb1_api_function_CtrlReadStart
+#define usbx_function_write_buffer_c          usb1_function_write_buffer_c
+#define usbx_api_function_check_pipe_status   usb1_api_function_check_pipe_status
+#define usbx_api_function_set_pid_nak         usb1_api_function_set_pid_nak
+#define usbx_api_function_clear_pipe_status   usb1_api_function_clear_pipe_status
+#define usbx_api_function_start_receive_transfer usb1_api_function_start_receive_transfer
+#define usbx_function_read_buffer             usb1_function_read_buffer
+#define usbx_api_function_start_send_transfer usb1_api_function_start_send_transfer
+#define usbx_function_stop_transfer           usb1_function_stop_transfer
+#define usbx_function_clear_pid_stall         usb1_function_clear_pid_stall
+#define usbx_function_CheckVBUStaus           usb1_function_CheckVBUStaus
+#define usbx_function_USB_FUNCTION_Attach     usb1_function_USB_FUNCTION_Attach
+#define usbx_function_USB_FUNCTION_Detach     usb1_function_USB_FUNCTION_Detach
+#define usbx_function_is_hispeed              usb1_function_is_hispeed
+#define usbx_function_ResetDescriptor         usb1_function_ResetDescriptor
+#define usbx_function_USB_FUNCTION_Suspend    usb1_function_USB_FUNCTION_Suspend
+#define usbx_function_USB_FUNCTION_TestMode   usb1_function_USB_FUNCTION_TestMode
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* USB_FUNCTION_SETTING_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usb.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,999 @@
+/***************************************************************************//**
+ * @file em_usb.h
+ * @brief USB protocol stack library API for EFM32.
+ * @version 3.20.14
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef __EM_USB_H
+#define __EM_USB_H
+
+#include "em_device.h"
+#include "em_assert.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "usbconfig.h"
+#if defined( USB_DEVICE ) || defined( USB_HOST )
+
+#include <string.h>
+#include <stddef.h>
+#include "em_common.h"
+#include "em_int.h"
+
+#if defined( USB_USE_PRINTF )
+#include <stdio.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __CC_ARM
+#pragma anon_unions
+#endif
+
+/***************************************************************************//**
+ * @addtogroup USB
+ * @brief USB HOST and DEVICE protocol stacks.
+ * @{
+ ******************************************************************************/
+
+/***************************************************************************//**
+ * @addtogroup USB_COMMON
+ * @brief Common parts for both HOST and DEVICE USB stacks, see @ref usb_device
+ *        and @ref usb_host pages for device and host library documentation.
+ * @{
+ ******************************************************************************/
+
+#define SILABS_USB_VID          0x10C4          /**< Silicon Labs Vendor ID, supplied by USB-IF.       */
+
+/* SETUP request, direction of data stage */
+#define USB_SETUP_DIR_OUT       0               /**< Setup request data stage OUT direction value.     */
+#define USB_SETUP_DIR_IN        1               /**< Setup request data stage IN direction value.      */
+#define USB_SETUP_DIR_MASK      0x80            /**< Setup request data stage direction mask.          */
+#define USB_SETUP_DIR_D2H       0x80            /**< Setup request data stage IN direction mask.       */
+#define USB_SETUP_DIR_H2D       0x00            /**< Setup request data stage OUT direction mask.      */
+
+/* SETUP request type */
+#define USB_SETUP_TYPE_STANDARD       0         /**< Standard setup request value.                     */
+#define USB_SETUP_TYPE_CLASS          1         /**< Class setup request value.                        */
+#define USB_SETUP_TYPE_VENDOR         2         /**< Vendor setup request value.                       */
+#define USB_SETUP_TYPE_STANDARD_MASK  0x00      /**< Standard setup request mask.                      */
+#define USB_SETUP_TYPE_CLASS_MASK     0x20      /**< Class setup request mask.                         */
+#define USB_SETUP_TYPE_VENDOR_MASK    0x40      /**< Vendor setup request mask.                        */
+
+/* SETUP request recipient */
+#define USB_SETUP_RECIPIENT_DEVICE    0         /**< Setup request device recipient value.             */
+#define USB_SETUP_RECIPIENT_INTERFACE 1         /**< Setup request interface recipient value.          */
+#define USB_SETUP_RECIPIENT_ENDPOINT  2         /**< Setup request endpoint recipient value.           */
+#define USB_SETUP_RECIPIENT_OTHER     3         /**< Setup request other recipient value.              */
+
+/* SETUP standard request codes for Full Speed devices */
+#define GET_STATUS                0             /**< Standard setup request GET_STATUS.                */
+#define CLEAR_FEATURE             1             /**< Standard setup request CLEAR_FEATURE.             */
+#define SET_FEATURE               3             /**< Standard setup request SET_FEATURE.               */
+#define SET_ADDRESS               5             /**< Standard setup request SET_ADDRESS.               */
+#define GET_DESCRIPTOR            6             /**< Standard setup request GET_DESCRIPTOR.            */
+#define SET_DESCRIPTOR            7             /**< Standard setup request SET_DESCRIPTOR.            */
+#define GET_CONFIGURATION         8             /**< Standard setup request GET_CONFIGURATION.         */
+#define SET_CONFIGURATION         9             /**< Standard setup request SET_CONFIGURATION.         */
+#define GET_INTERFACE             10            /**< Standard setup request GET_INTERFACE.             */
+#define SET_INTERFACE             11            /**< Standard setup request SET_INTERFACE.             */
+#define SYNCH_FRAME               12            /**< Standard setup request SYNCH_FRAME.               */
+
+/* SETUP class request codes */
+#define USB_HID_GET_REPORT        0x01          /**< HID class setup request GET_REPORT.               */
+#define USB_HID_GET_IDLE          0x02          /**< HID class setup request GET_IDLE.                 */
+#define USB_HID_SET_REPORT        0x09          /**< HID class setup request SET_REPORT.               */
+#define USB_HID_SET_IDLE          0x0A          /**< HID class setup request SET_IDLE.                 */
+#define USB_HID_SET_PROTOCOL      0x0B          /**< HID class setup request SET_PROTOCOL.             */
+#define USB_CDC_SETLINECODING     0x20          /**< CDC class setup request SET_LINE_CODING.          */
+#define USB_CDC_GETLINECODING     0x21          /**< CDC class setup request GET_LINE_CODING.          */
+#define USB_CDC_SETCTRLLINESTATE  0x22          /**< CDC class setup request SET_CONTROL_LINE_STATE.   */
+#define USB_MSD_BOTRESET          0xFF          /**< MSD class setup request Bulk only transfer reset. */
+#define USB_MSD_GETMAXLUN         0xFE          /**< MSD class setup request Get Max LUN.              */
+#define USB_AUDIO_GET_CUR         0x81          /**< Audio class setup request GET_CUR.                */
+#define USB_AUDIO_SET_CUR         0x01          /**< Audio class setup request SET_CUR.                */
+#define USB_AUDIO_GET_CUR         0x81          /**< Audio class setup request GET_CUR.                */
+#define USB_AUDIO_SET_MIN         0x02          /**< Audio class setup request SET_MIN.                */
+#define USB_AUDIO_GET_MIN         0x82          /**< Audio class setup request GET_MIN.                */
+#define USB_AUDIO_SET_MAX         0x03          /**< Audio class setup request SET_MAX.                */
+#define USB_AUDIO_GET_MAX         0x83          /**< Audio class setup request GET_MAX.                */
+#define USB_AUDIO_SET_RES         0x04          /**< Audio class setup request SET_RES.                */
+#define USB_AUDIO_GET_RES         0x84          /**< Audio class setup request GET_RES.                */
+#define USB_AUDIO_SET_MEM         0x05          /**< Audio class setup request SET_MEM.                */
+#define USB_AUDIO_GET_MEM         0x85          /**< Audio class setup request GET_MEM.                */
+#define USB_AUDIO_GET_STAT        0xFF          /**< Audio class setup request GET_STAT.               */
+
+/* SETUP command GET/SET_DESCRIPTOR decriptor types */
+#define USB_DEVICE_DESCRIPTOR             1     /**< DEVICE descriptor value.                          */
+#define USB_CONFIG_DESCRIPTOR             2     /**< CONFIGURATION descriptor value.                   */
+#define USB_STRING_DESCRIPTOR             3     /**< STRING descriptor value.                          */
+#define USB_MAX_STRING_DESCRIPTOR_CHARS   126   /**< Maximum STRING descriptor bString length.         */
+#define USB_INTERFACE_DESCRIPTOR          4     /**< INTERFACE descriptor value.                       */
+#define USB_ENDPOINT_DESCRIPTOR           5     /**< ENDPOINT descriptor value.                        */
+#define USB_DEVICE_QUALIFIER_DESCRIPTOR   6     /**< DEVICE_QUALIFIER descriptor value.                */
+#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR 7     /**< OTHER_SPEED_CONFIGURATION descriptor value.       */
+#define USB_INTERFACE_POWER_DESCRIPTOR    8     /**< INTERFACE_POWER descriptor value.                 */
+#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR 11 /**< INTERFACE_ASSOCIATION descriptor value.           */
+#define USB_HID_DESCRIPTOR                0x21  /**< HID descriptor value.                             */
+#define USB_SMARTCARD_DESCRIPTOR          0x21  /**< Smartcard usb-ccid-specific Descriptor Type.      */
+#define USB_HID_REPORT_DESCRIPTOR         0x22  /**< HID REPORT descriptor value.                      */
+#define USB_CS_INTERFACE_DESCRIPTOR       0x24  /**< Audio Class-specific interface Descriptor Type.   */
+#define USB_CS_ENDPOINT_DESCRIPTOR        0x25  /**< Audio Class-specific endpoint Descriptor Type.    */
+#define USB_HUB_DESCRIPTOR                0x29  /**< HUB descriptor value.                             */
+#define USB_CA_HEADER_DESCRIPTOR          1     /**< Audio Class-Specific AC Interface Header descriptor.*/
+#define USB_CA_INPUT_TERMINAL_DESCRIPTOR  2     /**< Audio Class-Specific AC Interface Input Terminal desc. */
+#define USB_CA_OUTPUT_TERMINAL_DESCRIPTOR 3     /**< Audio Class-Specific AC Interface Output Terminal desc.*/
+#define USB_CA_MIXER_UNIT_DESCRIPTOR      4     /**< Audio Class-Specific AC Interface Mixer descriptor.*/
+#define USB_CA_SELECTOR_UNIT_DESCRIPTOR   5     /**< Audio Class-Specific AC Interface Selector desc.  */
+#define USB_CA_FEATURE_UNIT_DESCRIPTOR    6     /**< Audio Class-Specific AC Interface Feature desc.   */
+#define USB_CA_PROCESSING_UNIT_DESCRIPTOR 7     /**< Audio Class-Specific AC Interface Processing desc.*/
+#define USB_CA_EXTENSION_UNIT_DESCRIPTOR  8     /**< Audio Class-Specific AC Interface Extension desc. */
+#define USB_CA_EP_GENERAL_DESCRIPTOR      1     /**< Audio Class-Specific general descriptor subtype code.*/
+#define USB_CA_AS_GENERAL_DESCRIPTOR      1     /**< Audio Class-Specific AS Interface General descriptor.*/
+#define USB_CA_FORMAT_TYPE_DESCRIPTOR     2     /**< Audio Class-Specific AS Interface Format Type desc. */
+
+#define USB_DEVICE_DESCSIZE               18    /**< Device descriptor size.                           */
+#define USB_CONFIG_DESCSIZE               9     /**< Configuration descriptor size.                    */
+#define USB_INTERFACE_DESCSIZE            9     /**< Interface descriptor size.                        */
+#define USB_ENDPOINT_DESCSIZE             7     /**< Endpoint descriptor size.                         */
+#define USB_DEVICE_QUALIFIER_DESCSIZE     10    /**< Device qualifier descriptor size.                 */
+#define USB_OTHER_SPEED_CONFIG_DESCSIZE   9     /**< Device other speed configuration descriptor size. */
+#define USB_INTERFACE_ASSOCIATION_DESCSIZE 8    /**< INTERFACE_ASSOCIATION descriptor size.            */
+#define USB_HID_DESCSIZE                  9     /**< HID descriptor size.                              */
+#define USB_SMARTCARD_DESCSIZE            54    /**< CCID descriptor size.                             */
+#define USB_CDC_HEADER_FND_DESCSIZE       5     /**< CDC Header functional descriptor size.            */
+#define USB_CDC_CALLMNG_FND_DESCSIZE      5     /**< CDC Call Management functional descriptor size.   */
+#define USB_CDC_ACM_FND_DESCSIZE          4     /**< CDC Abstract Control Management functional descriptor size.*/
+#define USB_CA_INPUT_TERMINAL_DESCSIZE    12    /**< Audio Input Terminal descriptor size.             */
+#define USB_CA_OUTPUT_TERMINAL_DESCSIZE   9     /**< Audio Output Terminal descriptor size.            */
+#define USB_CA_EP_GENERAL_DESCSIZE        7     /**< Audio Class-Specific general descriptor subtype size.*/
+#define USB_CA_AS_GENERAL_DESCSIZE        7     /**< Audio Class-Specific AS Interface General desc size.*/
+#define USB_CA_STD_AS_ENDPOINT_DESCSZIE   9     /**< Audio-class standard audio stream descriptor size.*/
+
+/* Misc. USB definitions */
+#define USB_LS_CTRL_EP_MAXSIZE  8               /**< The max size of low speed control endpoints.      */
+#define USB_LS_INTR_EP_MAXSIZE  8               /**< The max size of low speed interrupt endpoints.    */
+#define USB_FS_CTRL_EP_MAXSIZE  64              /**< The max size of full speed control endpoints.     */
+#define USB_FS_INTR_EP_MAXSIZE  64              /**< The max size of full speed interrupt endpoints.   */
+#define USB_FS_BULK_EP_MAXSIZE  64              /**< The max size of full speed bulk endpoints.        */
+#define USB_FS_ISOC_EP_MAXSIZE  1023            /**< The max size of full speed isochronous endpoints. */
+#define USB_EPTYPE_CTRL         0               /**< Endpoint type control.                            */
+#define USB_EPTYPE_ISOC         1               /**< Endpoint type isochron.                           */
+#define USB_EPTYPE_BULK         2               /**< Endpoint type bulk.                               */
+#define USB_EPTYPE_INTR         3               /**< Endpoint type interrupt.                          */
+#define USB_EPSYNC_NO           (0 << 2)        /**< Endpoint synchronization type, none.              */
+#define USB_EPSYNC_ASYNC        (1 << 2)        /**< Endpoint synchronization type, asynchronous.      */
+#define USB_EPSYNC_ADAPTIVE     (2 << 2)        /**< Endpoint synchronization type, adaptive.          */
+#define USB_EPSYNC_SYNC         (3 << 2)        /**< Endpoint synchronization type, synchronous.       */
+#define USB_EP_DIR_IN           0x80            /**< Endpoint direction mask.                          */
+#define USB_SETUP_PKT_SIZE      8               /**< Setup request packet size.                        */
+#define USB_EPNUM_MASK          0x0F            /**< Endpoint number mask.                             */
+#define USB_LANGID_ENUS         0x0409          /**< English-United States language id.                */
+#define USB_MAX_DEVICE_ADDRESS  127             /**< Maximum allowable device address.                 */
+
+#define CONFIG_DESC_BM_REMOTEWAKEUP 0x20        /**< Configuration descriptor attribute macro.         */
+#define CONFIG_DESC_BM_SELFPOWERED  0x40        /**< Configuration descriptor attribute macro.         */
+#define CONFIG_DESC_BM_RESERVED_D7  0x80        /**< Configuration descriptor attribute macro.         */
+#define CONFIG_DESC_BM_TRANSFERTYPE 0x03        /**< Configuration descriptor transfer type bitmask.   */
+#define CONFIG_DESC_MAXPOWER_mA(x)  (((x)+1)/2) /**< Configuration descriptor power macro.             */
+
+#define DEVICE_IS_SELFPOWERED       0x0001      /**< Standard request GET_STATUS bitmask.              */
+#define REMOTE_WAKEUP_ENABLED       0x0002      /**< Standard request GET_STATUS bitmask.              */
+#define USB_FEATURE_ENDPOINT_HALT         0     /**< Standard request CLEAR/SET_FEATURE bitmask.       */
+#define USB_FEATURE_DEVICE_REMOTE_WAKEUP  1     /**< Standard request CLEAR/SET_FEATURE bitmask.       */
+
+#define HUB_FEATURE_PORT_RESET            4     /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
+#define HUB_FEATURE_PORT_POWER            8     /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
+#define HUB_FEATURE_C_PORT_CONNECTION     16    /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
+#define HUB_FEATURE_C_PORT_RESET          20    /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
+#define HUB_FEATURE_PORT_INDICATOR        22    /**< HUB class request CLEAR/SET_PORT_FEATURE feature selector. */
+
+#define USB_CLASS_CDC                     2     /**< CDC device/interface class code.                    */
+#define USB_CLASS_CDC_DATA                0x0A  /**< CDC Data interface class code.                      */
+#define USB_CLASS_CDC_ACM                 2     /**< CDC Abstract Control Model interface subclass code. */
+#define USB_CLASS_CDC_HFN                 0     /**< CDC class Header Functional Descriptor subtype.     */
+#define USB_CLASS_CDC_CMNGFN              1     /**< CDC class Call Management Functional Descriptor subtype.*/
+#define USB_CLASS_CDC_ACMFN               2     /**< CDC class Abstract Control Management Functional Descriptor subtype.*/
+#define USB_CLASS_CDC_UNIONFN             6     /**< CDC class Union Functional Descriptor subtype.      */
+
+#define USB_CLASS_HID                     3     /**< HID device/interface class code.                    */
+#define USB_CLASS_HID_KEYBOARD            1     /**< HID keyboard interface protocol code.               */
+#define USB_CLASS_HID_MOUSE               2     /**< HID mouse interface protocol code.                  */
+
+#define USB_CLASS_HUB                     9     /**< HUB device/interface class code.                    */
+
+#define USB_CLASS_MSD                     8     /**< MSD device/interface class code.                    */
+#define USB_CLASS_MSD_BOT_TRANSPORT       0x50  /**< MSD Bulk Only Transport protocol.                   */
+#define USB_CLASS_MSD_SCSI_CMDSET         6     /**< MSD Subclass SCSI transparent command set.          */
+#define USB_CLASS_MSD_CSW_CMDPASSED       0     /**< MSD BOT Command status wrapper command passed code. */
+#define USB_CLASS_MSD_CSW_CMDFAILED       1     /**< MSD BOT Command status wrapper command failed code. */
+#define USB_CLASS_MSD_CSW_PHASEERROR      2     /**< MSD BOT Command status wrapper cmd phase error code.*/
+
+#define USB_CLASS_AUDIO                   1     /**< Audio interface class code.                         */
+#define USB_CLASS_AUDIO_CONTROL           1     /**< Audio subclass code for control interface.          */
+#define USB_CLASS_AUDIO_STREAMING         2     /**< Audio subclass code for streaming interface.        */
+#define USB_CLASS_AUDIO_MIDISTREAMING     3     /**< Audio subclass code for midi streaming interface.   */
+
+/*** Triplet for the device descriptor of a composite device using IAD descriptors. ***/
+#define USB_CLASS_MISCELLANEOUS           0xEF  /**< MISCELLANEOUS device class code.                    */
+#define USB_CLASS_MISC_COMMON_SUBCLASS    2     /**< MISCELLANEOUS Common sub class code.                */
+#define USB_CLASS_MISC_IAD_PROTOCOL       1     /**< MISCELLANEOUS Interface Association Descriptor protocol code. */
+
+#define PORT_FULL_SPEED                   1     /**< Full speed return value for USBH_GetPortSpeed(). */
+#define PORT_LOW_SPEED                    2     /**< Low speed return value for USBH_GetPortSpeed().  */
+
+#if defined( __GNUC__  )                  /* GCC compilers */
+#if defined( __CHAR16_TYPE__ )
+typedef __CHAR16_TYPE__ char16_t;
+#else
+typedef unsigned short char16_t;
+#endif
+
+#elif defined( __ICCARM__ )               /* IAR compiler */
+#include <uchar.h>
+
+#elif defined( __CC_ARM )                 /* MDK-ARM compiler */
+typedef unsigned short char16_t;
+#endif
+
+/** Macro for creating USB compliant UTF-16LE UNICODE string descriptors.
+ *  @n Example: STATIC_CONST_STRING_DESC( iManufacturer, 'E','n','e','r','g','y',' ','M','i','c','r','o',' ','A','S' );
+ *  @note The size of the resulting struct will be two byte larger than a USB string
+ *        descriptor. This is to accommodate a terminating null char for the string.
+ *        The value assigned to the 'len' member does not take this into account
+ *        and is therefore correct usb wise.
+ */
+#define STATIC_CONST_STRING_DESC( _name, ... )                  \
+EFM32_PACK_START( 1 )                                           \
+typedef struct                                                  \
+{                                                               \
+  uint8_t  len;                                                 \
+  uint8_t  type;                                                \
+  char16_t name[ 1 + sizeof( (char16_t[]){__VA_ARGS__} ) / 2];  \
+} __attribute__ ((packed)) _##_name;                            \
+EFM32_PACK_END()                                                \
+EFM32_ALIGN( 4 )                                                \
+EFM32_PACK_START( 1 )                                           \
+static const _##_name _name __attribute__ ((aligned(4)))=       \
+{                                                               \
+  .len  = sizeof( _##_name ) - 2,                               \
+  .type = USB_STRING_DESCRIPTOR,                                \
+  .name = {__VA_ARGS__},                                        \
+  .name[ ( ( sizeof( _##_name ) - 2 ) / 2 ) - 1 ] = '\0'        \
+}                                                               \
+EFM32_PACK_END()
+
+/** Macro for creating USB compliant language string descriptors.
+ *  @n Example: STATIC_CONST_STRING_DESC_LANGID( langID, 0x04, 0x09 );
+ */
+#define STATIC_CONST_STRING_DESC_LANGID( _name, x, y )      \
+EFM32_PACK_START( 1 )                                       \
+typedef struct                                              \
+{                                                           \
+  uint8_t len;                                              \
+  uint8_t type;                                             \
+  uint8_t name[ 2 ];                                        \
+} __attribute__ ((packed)) _##_name;                        \
+EFM32_PACK_END()                                            \
+EFM32_ALIGN( 4 )                                            \
+EFM32_PACK_START( 1 )                                       \
+static const _##_name _name __attribute__ ((aligned(4)))=   \
+{                                                           \
+  .len = 4,                                                 \
+  .type = USB_STRING_DESCRIPTOR,                            \
+  .name = { y, x }                                          \
+}                                                           \
+EFM32_PACK_END()
+
+/** Macro for creating WORD (4 byte) aligned uint8_t array with size which
+ *  is a multiple of WORD size.
+ *  @n Example: @n UBUF( rxBuffer, 37 );  =>  uint8_t rxBuffer[ 40 ];
+ */
+#if !defined(__GNUC__)
+#define        UBUF( x, y ) EFM32_ALIGN( 4 )        uint8_t x[((y)+3)&~3]
+#define STATIC_UBUF( x, y ) EFM32_ALIGN( 4 ) static uint8_t x[((y)+3)&~3]
+#else
+#define        UBUF( x, y ) uint8_t x[((y)+3)&~3] __attribute__ ((aligned(4)))
+
+/** Macro for creating WORD (4 byte) aligned static uint8_t arrays with size which
+ *  is a multiple of WORD size.
+ *  @n Example: @n STATIC_UBUF( rxBuffer, 37 );  =>  static uint8_t rxBuffer[ 40 ];
+ */
+#define STATIC_UBUF( x, y ) static uint8_t x[((y)+3)&~3] __attribute__ ((aligned(4)))
+#endif
+
+
+/** @brief USB transfer status enumerator. */
+typedef enum
+{
+  /* NOTE: Please keep in sync with table errMsg[] in em_usbhal.c */
+  USB_STATUS_OK              = 0,               /**< No errors detected.                               */
+  USB_STATUS_REQ_ERR         = -1,              /**< Setup request error.                              */
+  USB_STATUS_EP_BUSY         = -2,              /**< Endpoint is busy.                                 */
+  USB_STATUS_REQ_UNHANDLED   = -3,              /**< Setup request not handled.                        */
+  USB_STATUS_ILLEGAL         = -4,              /**< Illegal operation attempted.                      */
+  USB_STATUS_EP_STALLED      = -5,              /**< Endpoint is stalled.                              */
+  USB_STATUS_EP_ABORTED      = -6,              /**< Endpoint transfer was aborted.                    */
+  USB_STATUS_EP_ERROR        = -7,              /**< Endpoint transfer error.                          */
+  USB_STATUS_EP_NAK          = -8,              /**< Endpoint NAK'ed transfer request.                 */
+  USB_STATUS_DEVICE_UNCONFIGURED = -9,          /**< Device is unconfigured.                           */
+  USB_STATUS_DEVICE_SUSPENDED    = -10,         /**< Device is suspended.                              */
+  USB_STATUS_DEVICE_RESET    = -11,             /**< Device is/was reset.                              */
+  USB_STATUS_TIMEOUT         = -12,             /**< Transfer timeout.                                 */
+  USB_STATUS_DEVICE_REMOVED  = -13,             /**< Device was removed.                               */
+  USB_STATUS_HC_BUSY         = -14,             /**< Host channel is busy.                             */
+  USB_STATUS_DEVICE_MALFUNCTION = -15,          /**< Malfunctioning device attached.                   */
+  USB_STATUS_PORT_OVERCURRENT = -16,            /**< VBUS shortcircuit/overcurrent failure.            */
+} USB_Status_TypeDef;
+/** @} (end addtogroup USB_COMMON) */
+
+
+#if defined( USB_DEVICE )
+/***************************************************************************//**
+ * @addtogroup USB_DEVICE
+ * @brief USB DEVICE protocol stack, see @ref usb_device page for detailed documentation.
+ * @{
+ ******************************************************************************/
+
+#define USB_PWRSAVE_MODE_OFF       0 /**< No energy saving mode selected.                       */
+#define USB_PWRSAVE_MODE_ONSUSPEND 1 /**< Enter USB power-save mode on suspend.                 */
+#define USB_PWRSAVE_MODE_ONVBUSOFF 2 /**< Enter USB power-save mode when not attached to host.  */
+#define USB_PWRSAVE_MODE_ENTEREM2  4 /**< Enter EM2 while in power-save mode.                   */
+
+#define USB_USBC_32kHz_CLK_LFXO    0 /**< Use 32kHz LFXO clock while in powersave mode.         */
+#define USB_USBC_32kHz_CLK_LFRCO   1 /**< Use 32kHz LFRCO clock while in powersave mode.        */
+
+/** @brief USB device state enumerator. */
+typedef enum
+{
+  USBD_STATE_NONE       = 0,                    /**< Device state is undefined/unknown.                */
+  USBD_STATE_ATTACHED   = 1,                    /**< Device state is ATTACHED.                         */
+  USBD_STATE_POWERED    = 2,                    /**< Device state is POWERED.                          */
+  USBD_STATE_DEFAULT    = 3,                    /**< Device state is DEFAULT.                          */
+  USBD_STATE_ADDRESSED  = 4,                    /**< Device state is ADDRESSED.                        */
+  USBD_STATE_CONFIGURED = 5,                    /**< Device state is CONFIGURED.                       */
+  USBD_STATE_SUSPENDED  = 6,                    /**< Device state is SUSPENDED.                        */
+  USBD_STATE_LASTMARKER = 7,                    /**< Device state enum end marker.                     */
+} USBD_State_TypeDef;
+/** @} (end addtogroup USB_DEVICE) */
+#endif /* defined( USB_DEVICE ) */
+
+/** @addtogroup USB_COMMON
+ *  @{*/
+
+/** @brief USB Setup request package. */
+EFM32_PACK_START( 1 )
+typedef struct
+{
+  union
+  {
+    struct
+    {
+      union
+      {
+        struct
+        {
+          uint8_t Recipient : 5;                /**< Request recipient (device, interface, endpoint or other).*/
+          uint8_t Type      : 2;                /**< Request type (standard, class or vendor).         */
+          uint8_t Direction : 1;                /**< Transfer direction of SETUP data phase.           */
+        };
+        uint8_t bmRequestType;                  /**< Request characteristics.                          */
+      };
+      uint8_t   bRequest;                       /**< Request code.                                     */
+      uint16_t  wValue;                         /**< Varies according to request.                      */
+      uint16_t  wIndex;                         /**< Index or offset, varies according to request.     */
+      uint16_t  wLength;                        /**< Number of bytes to transfer if there is a data stage.*/
+    };
+  uint32_t  dw[2];
+  };
+} __attribute__ ((packed)) USB_Setup_TypeDef;
+EFM32_PACK_END()
+
+
+/** @brief USB Device Descriptor. */
+EFM32_PACK_START( 1 )
+typedef struct
+{
+  uint8_t  bLength;                             /**< Size of this descriptor in bytes                  */
+  uint8_t  bDescriptorType;                     /**< Constant DEVICE Descriptor Type                   */
+  uint16_t bcdUSB;                              /**< USB Specification Release Number in Binary-Coded
+                                                     Decimal                                           */
+  uint8_t  bDeviceClass;                        /**< Class code (assigned by the USB-IF)               */
+  uint8_t  bDeviceSubClass;                     /**< Subclass code (assigned by the USB-IF)            */
+  uint8_t  bDeviceProtocol;                     /**< Protocol code (assigned by the USB-IF)            */
+  uint8_t  bMaxPacketSize0;                     /**< Maximum packet size for endpoint zero             */
+  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 in binary-coded decimal     */
+  uint8_t  iManufacturer;                       /**< Index of string descriptor describing manufacturer*/
+  uint8_t  iProduct;                            /**< Index of string descriptor describing product     */
+  uint8_t  iSerialNumber;                       /**< Index of string descriptor describing the device
+                                                     serialnumber                                      */
+  uint8_t  bNumConfigurations;                  /**< Number of possible configurations                 */
+} __attribute__ ((packed)) USB_DeviceDescriptor_TypeDef;
+EFM32_PACK_END()
+
+
+/** @brief USB Configuration Descriptor. */
+EFM32_PACK_START( 1 )
+typedef struct
+{
+  uint8_t  bLength;                             /**< Size of this descriptor in bytes                  */
+  uint8_t  bDescriptorType;                     /**< Constant CONFIGURATION Descriptor Type            */
+  uint16_t wTotalLength;                        /**< Total length of data returned for this
+                                                     configuration. Includes the combined length of all
+                                                     descriptors (configuration, interface, endpoint,
+                                                     and class- or vendor-specific) returned for this
+                                                     configuration.                                    */
+  uint8_t  bNumInterfaces;                      /**< Number of interfaces supported by this
+                                                     configuration                                     */
+  uint8_t  bConfigurationValue;                 /**< Value to use as an argument to the
+                                                     SetConfiguration request to select this
+                                                     configuration.                                    */
+  uint8_t  iConfiguration;                      /**< Index of string descriptor describing this
+                                                     configuration.                                    */
+  uint8_t  bmAttributes;                        /**< Configuration characteristics.
+                                                     @n D7: Reserved (set to one)
+                                                     @n D6: Self-powered
+                                                     @n D5: Remote Wakeup
+                                                     @n D4...0: Reserved (reset to zero)               */
+  uint8_t  bMaxPower;                           /**< Maximum power consumption of the USB device, unit
+                                                     is 2mA per LSB                                    */
+} __attribute__ ((packed)) USB_ConfigurationDescriptor_TypeDef;
+EFM32_PACK_END()
+
+
+/** @brief USB Interface Descriptor. */
+EFM32_PACK_START( 1 )
+typedef struct
+{
+  uint8_t bLength;                              /**< Size of this descriptor in bytes.                 */
+  uint8_t bDescriptorType;                      /**< Constant INTERFACE Descriptor Type.               */
+  uint8_t bInterfaceNumber;                     /**< Number of this interface. Zero-based value
+                                                     identifying the index in the array of concurrent
+                                                     interfaces supported by this configuration.       */
+  uint8_t bAlternateSetting;                    /**< Value used to select this alternate setting for
+                                                     the interface identified in the prior field.      */
+  uint8_t bNumEndpoints;                        /**< Number of endpoints used by this interface
+                                                     (excluding endpoint zero). If this value is zero,
+                                                     this interface only uses the Default Control Pipe.*/
+  uint8_t bInterfaceClass;                      /**< Class code (assigned by the USB-IF). A value
+                                                     of zero is reserved for future standardization. If
+                                                     this field is set to FFH, the interface class is
+                                                     vendor-specific. All other values are reserved for
+                                                     assignment by the USB-IF.                         */
+  uint8_t bInterfaceSubClass;                   /**< Subclass code (assigned by the USB-IF). These codes
+                                                     are qualified by the value of the bInterfaceClass
+                                                     field. If the bInterfaceClass field is reset to
+                                                     zero, this field must also be reset to zero. If
+                                                     the bInterfaceClass field is not set to FFH, all
+                                                     values are reserved forassignment by the USB-IF.  */
+  uint8_t bInterfaceProtocol;                   /**< Protocol code (assigned by the USB). These codes
+                                                     are qualified by the value of the bInterfaceClass
+                                                     and the bInterfaceSubClass fields. If an interface
+                                                     supports class-specific requests, this code
+                                                     identifies the protocols that the device uses as
+                                                     defined by the specification of the device class.
+                                                     If this field is reset to zero, the device does
+                                                     not use a class-specific protocol on this
+                                                     interface. If this field is set to FFH, the device
+                                                     uses a vendor-specific protocol for this interface*/
+  uint8_t iInterface;                           /**< Index of string descriptor describing this
+                                                     interface.                                        */
+} __attribute__ ((packed)) USB_InterfaceDescriptor_TypeDef;
+EFM32_PACK_END()
+
+
+/** @brief USB Endpoint Descriptor. */
+EFM32_PACK_START( 1 )
+typedef struct
+{
+  uint8_t   bLength;                            /**< Size of this descriptor in bytes                  */
+  uint8_t   bDescriptorType;                    /**< Constant ENDPOINT Descriptor Type                 */
+  uint8_t   bEndpointAddress;                   /**< The address of the endpoint                       */
+  uint8_t   bmAttributes;                       /**< This field describes the endpoint attributes      */
+  uint16_t  wMaxPacketSize;                     /**< Maximum packet size for the endpoint              */
+  uint8_t   bInterval;                          /**< Interval for polling EP for data transfers        */
+} __attribute__ ((packed)) USB_EndpointDescriptor_TypeDef;
+EFM32_PACK_END()
+
+
+/** @brief USB String Descriptor. */
+EFM32_PACK_START( 1 )
+typedef struct
+{
+  uint8_t len;                                  /**< Size of this descriptor in bytes.                 */
+  uint8_t type;                                 /**< Constant STRING Descriptor Type.                  */
+  char16_t name[];                              /**< The string encoded with UTF-16LE UNICODE charset. */
+} __attribute__ ((packed)) USB_StringDescriptor_TypeDef;
+EFM32_PACK_END()
+
+/** @} (end addtogroup USB_COMMON) */
+
+/*** -------------------- Serial port debug configuration ---------------- ***/
+
+#if defined( DOXY_DOC_ONLY )
+/** @addtogroup USB_COMMON
+ *  @{*/
+
+/***************************************************************************//**
+ * @brief
+ *   Transmit a single char on the debug serial port.
+ *
+ * @note
+ *   This function is enabled with \#define DEBUG_USB_API when configuring the
+ *   protocol stack in "usbconfig.h".
+ *   This is convenient when debugging code, no need to remove use of this
+ *   function when debugging has completed.
+ *
+ * @param[in] c
+ *   Char to transmit.
+ *
+ * @return
+ *   The char transmitted.
+ ******************************************************************************/
+int  USB_PUTCHAR( char c );
+
+/***************************************************************************//**
+ * @brief
+ *   Transmit a zero terminated string on the debug serial port.
+ *
+ * @note
+ *   This function is enabled with \#define DEBUG_USB_API when configuring the
+ *   protocol stack in "usbconfig.h".
+ *   This is convenient when debugging code, no need to remove use of this
+ *   function when debugging has completed.
+ *
+ * @param[in] p
+ *   Pointer to string to transmit.
+ ******************************************************************************/
+void USB_PUTS( const char *p );
+
+/***************************************************************************//**
+ * @brief
+ *   Transmit "printf" formated data on the debug serial port.
+ *
+ * @note
+ *   This function is enabled with \#define USB_USE_PRINTF when configuring the
+ *   protocol stack in "usbconfig.h".
+ *   This is convenient when debugging code, no need to remove use of this
+ *   function when debugging has completed.
+ *
+ * @param[in] format
+ *   Format string (as in printf). No floating point format support.
+ ******************************************************************************/
+int  USB_PRINTF( const char *format, ... );
+
+/** @} (end addtogroup USB_COMMON) */
+#endif /* defined( DOXY_DOC_ONLY ) */
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+/* Hardware constraint, do not change. */
+#define MAX_NUM_HOSTCHANNELS  14
+
+/* The DMA engine use one FIFO ram word for each host channel. */
+#define MAX_HOST_FIFO_SIZE_INWORDS (512-MAX_NUM_HOSTCHANNELS)/*Unit is 4 bytes*/
+
+#if defined ( USER_PUTCHAR )
+  void USB_Puts( const char *p );
+  #define USB_PUTS( s )            USB_Puts( s )
+  #define USB_PUTCHAR( c )         USER_PUTCHAR( c )
+#else
+  #define USB_PUTS( s )
+  #define USB_PUTCHAR( c )
+#endif
+
+#if defined( USB_USE_PRINTF )
+  /* Use a printf which don't support floating point formatting */
+  #if defined(__ICCARM__) || defined (__CC_ARM) || defined (__CROSSWORKS_ARM)
+    #define USB_PRINTF                  printf
+  #else
+    #define USB_PRINTF                  iprintf
+  #endif
+#else
+  #define USB_PRINTF(...)
+#endif /* defined( USB_USE_PRINTF ) */
+
+#if defined( DEBUG_USB_API )
+  #define DEBUG_USB_API_PUTS( s )       USB_PUTS( s )
+  #define DEBUG_USB_API_PUTCHAR( c )    USB_PUTCHAR( c )
+#else
+  #define DEBUG_USB_API_PUTS( s )
+  #define DEBUG_USB_API_PUTCHAR( c )
+#endif /* defined( DEBUG_USB_API ) */
+
+/** @endcond */
+
+/*** -------------------- Common API definitions ------------------------- ***/
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+#if defined( USB_HOST )
+  #if defined( NUM_APP_TIMERS )
+    #define NUM_QTIMERS ( NUM_HC_USED + 2 + NUM_APP_TIMERS + 1 )
+  #else
+    #define NUM_QTIMERS ( NUM_HC_USED + 2 + 1 )
+  #endif
+  /* + 2 for default ctrl. host ch. 0 & 1, + 1 for host port timer  */
+#else
+  #if defined( NUM_APP_TIMERS )
+    #define NUM_QTIMERS ( NUM_APP_TIMERS )
+  #else
+    #define NUM_QTIMERS 0
+  #endif
+#endif /* defined( USB_HOST ) */
+/** @endcond */
+
+/** @addtogroup USB_COMMON
+ *  @{*/
+
+/***************************************************************************//**
+ * @brief
+ *  USB transfer callback function.
+ *
+ * @details
+ *  The callback function is called when a transfer has completed. An application
+ *  should check the status, xferred and optionally the remaining parameters
+ *  before deciding if the transfer is usable. In the case where the transfer
+ *  is part of a control request data stage, the callback function should
+ *  return an appropriate @ref USB_Status_TypeDef status.
+ *
+ * @param[in] status
+ *   The transfer status. See @ref USB_Status_TypeDef.
+ *
+ * @param[in] xferred
+ *   Number of bytes actually transferred.
+ *
+ * @param[in] remaining
+ *   Number of bytes not transferred.
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+typedef int  (*USB_XferCompleteCb_TypeDef)( USB_Status_TypeDef status, uint32_t xferred, uint32_t remaining );
+
+/***************************************************************************//**
+ * @brief
+ *  USBTIMER callback function.
+ *
+ * @details
+ *  The callback function is called when an USBTIMER has expired. The callback
+ *  is done with interrupts disabled.
+ ******************************************************************************/
+typedef void (*USBTIMER_Callback_TypeDef)(  void );
+
+char *USB_GetErrorMsgString(            int error );
+
+#if defined( USB_USE_PRINTF )
+  void USB_PrintErrorMsgString(         char *pre, int error );
+#else
+  #define USB_PrintErrorMsgString(      pre, error )
+#endif
+
+void  USBTIMER_DelayMs(                 uint32_t msec );
+void  USBTIMER_DelayUs(                 uint32_t usec );
+void  USBTIMER_Init(                    void );
+
+#if ( NUM_QTIMERS > 0 )
+  void  USBTIMER_Start(                 uint32_t id, uint32_t timeout, USBTIMER_Callback_TypeDef callback );
+  void  USBTIMER_Stop(                  uint32_t id );
+#endif /* ( NUM_QTIMERS > 0 ) */
+/** @} (end addtogroup USB_COMMON) */
+
+#if defined( USB_DEVICE )
+/** @addtogroup USB_DEVICE
+ *  @{*/
+/*** -------------------- DEVICE mode API definitions -------------------- ***/
+
+/***************************************************************************//**
+ * @brief
+ *  USB Reset callback function.
+ * @details
+ *  Called whenever USB reset signalling is detected on the USB port.
+ ******************************************************************************/
+typedef void (*USBD_UsbResetCb_TypeDef)( void );
+
+/***************************************************************************//**
+ * @brief
+ *  USB Start Of Frame (SOF) interrupt callback function.
+ *
+ * @details
+ *  Called at each SOF interrupt (if enabled),
+ *
+ * @param[in] sofNr
+ *   Current frame number. The value rolls over to 0 after 16383 (0x3FFF).
+ ******************************************************************************/
+typedef void (*USBD_SofIntCb_TypeDef)( uint16_t sofNr );
+
+/***************************************************************************//**
+ * @brief
+ *  USB State change callback function.
+ *
+ * @details
+ *  Called whenever the device change state.
+ *
+ * @param[in] oldState
+ *   The device USB state just leaved. See @ref USBD_State_TypeDef.
+ *
+ * @param[in] newState
+ *   New (the current) USB device state. See @ref USBD_State_TypeDef.
+ ******************************************************************************/
+typedef void (*USBD_DeviceStateChangeCb_TypeDef)( USBD_State_TypeDef oldState, USBD_State_TypeDef newState );
+
+/***************************************************************************//**
+ * @brief
+ *  USB power mode callback function.
+ *
+ * @details
+ *  Called whenever the device stack needs to query if the device is currently
+ *  self- or bus-powered. Typically when host has issued an @ref GET_STATUS
+ *  setup command.
+ *
+ * @return
+ *  True if self-powered, false otherwise.
+ ******************************************************************************/
+typedef bool (*USBD_IsSelfPoweredCb_TypeDef)( void );
+
+/***************************************************************************//**
+ * @brief
+ *  USB setup request callback function.
+ *
+ * @details
+ *  Called on each setup request received from host. This gives the application a
+ *  possibility to extend or override standard requests, and to implement class
+ *  or vendor specific requests. Return @ref USB_STATUS_OK if the request is
+ *  handled, return @ref USB_STATUS_REQ_ERR if it is an illegal request or
+ *  return @ref USB_STATUS_REQ_UNHANDLED to pass the request on to the default
+ *  request handler.
+ *
+ * @param[in] setup
+ *  Pointer to an USB setup packet. See @ref USB_Setup_TypeDef.
+ *
+ * @return
+ *  An appropriate status/error code. See @ref USB_Status_TypeDef.
+ ******************************************************************************/
+typedef int  (*USBD_SetupCmdCb_TypeDef)( const USB_Setup_TypeDef *setup );
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+struct USBD_Callbacks_TypeDef;
+typedef struct USBD_Callbacks_TypeDef const *USBD_Callbacks_TypeDef_Pointer;
+/** @endcond */
+
+
+/** @brief USB Device stack initialization structure.
+ *  @details This structure is passed to @ref USBD_Init() when starting up
+ *  the device.                                                             */
+typedef struct
+{
+  const USB_DeviceDescriptor_TypeDef      *deviceDescriptor;      /**< Pointer to a device descriptor.                */
+  const uint8_t                           *configDescriptor;      /**< Pointer to a configuration descriptor.         */
+  const void * const                      *stringDescriptors;     /**< Pointer to an array of string descriptor pointers.*/
+  const uint8_t                           numberOfStrings;        /**< Number of strings in string descriptor array.  */
+  const uint8_t                           *bufferingMultiplier;   /**< Pointer to an array defining the size of the
+                                                                       endpoint buffers. The size is given in
+                                                                       multiples of endpoint size. Generally a value
+                                                                       of 1 (single) or 2 (double) buffering should be
+                                                                       used.                                          */
+  USBD_Callbacks_TypeDef_Pointer          callbacks;              /**< Pointer to struct with callbacks
+                                                                       (@ref USBD_Callbacks_TypeDef). These callbacks
+                                                                       are used by the device stack to signal events
+                                                                       to or query the application.                   */
+  const uint32_t                          reserved;               /**< Reserved for future use.                       */
+} USBD_Init_TypeDef;
+
+
+/** @brief USB Device stack callback structure.
+ *  @details Callback functions used by the device stack to signal events or
+ *  query status to/from the application. See @ref USBD_Init_TypeDef. Assign
+ *  members to NULL if your application don't need a specific callback. */
+typedef struct USBD_Callbacks_TypeDef
+{
+  const USBD_UsbResetCb_TypeDef           usbReset;               /**< Called whenever USB reset signalling is detected
+                                                                       on the USB port.                                */
+  const USBD_DeviceStateChangeCb_TypeDef  usbStateChange;         /**< Called whenever the device change state.        */
+  const USBD_SetupCmdCb_TypeDef           setupCmd;               /**< Called on each setup request received from host.*/
+  const USBD_IsSelfPoweredCb_TypeDef      isSelfPowered;          /**< Called whenever the device stack needs to query
+                                                                       if the device is currently self- or bus-powered.
+                                                                       Applies to devices which can operate in both modes.*/
+  const USBD_SofIntCb_TypeDef             sofInt;                 /**< Called at each SOF interrupt. If NULL, the device
+                                                                       stack will not enable the SOF interrupt.        */
+} USBD_Callbacks_TypeDef;
+
+
+/*** -------------------- DEVICE mode API -------------------------------- ***/
+
+void                USBD_AbortAllTransfers( void );
+int                 USBD_AbortTransfer(     int epAddr );
+void                USBD_Connect(           void );
+void                USBD_Disconnect(        void );
+bool                USBD_EpIsBusy(          int epAddr );
+USBD_State_TypeDef  USBD_GetUsbState(       void );
+const char *        USBD_GetUsbStateName(   USBD_State_TypeDef state );
+int                 USBD_Init(              const USBD_Init_TypeDef *p );
+int                 USBD_Read(              int epAddr, void *data, int byteCount, USB_XferCompleteCb_TypeDef callback );
+int                 USBD_RemoteWakeup(      void );
+bool                USBD_SafeToEnterEM2(    void );
+int                 USBD_StallEp(           int epAddr );
+void                USBD_Stop(              void );
+int                 USBD_UnStallEp(         int epAddr );
+int                 USBD_Write(             int epAddr, void *data, int byteCount, USB_XferCompleteCb_TypeDef callback );
+
+#ifdef __MBED__
+int                 USBD_SetAddress(        uint8_t addr );
+int                 USBD_AddEndpoint(       int epAddr, int transferType, int maxPacketSize, int bufferMult );
+int                 USBD_EpIsStalled(       int epAddr );
+void                USBD_StallEp0(          void );
+#endif
+
+/** @} (end addtogroup USB_DEVICE) */
+#endif /* defined( USB_DEVICE ) */
+
+
+#if defined( USB_HOST )
+/***************************************************************************//**
+ * @addtogroup USB_HOST
+ * @brief USB HOST protocol stack, see @ref usb_host page for detailed documentation.
+ * @{
+ ******************************************************************************/
+/*** -------------------- HOST mode API definitions ---------------------- ***/
+
+#define USB_VBUSOVRCUR_PORT_NONE     -1       /**< No overcurrent flag functionality.                   */
+#define USB_VBUSOVRCUR_POLARITY_LOW  0        /**< Overcurrent flag pin polarity is low.                */
+#define USB_VBUSOVRCUR_POLARITY_HIGH 1        /**< Overcurrent flag pin polarity is high.               */
+
+/** USB HOST endpoint status enumerator. */
+typedef enum
+{
+  H_EP_IDLE             = 0,                      /**< The endpoint is idle.                            */
+  H_EP_SETUP            = 1,                      /**< The endpoint is in SETUP stage.                  */
+  H_EP_DATA_IN          = 2,                      /**< The endpoint is in DATA IN stage.                */
+  H_EP_DATA_OUT         = 3,                      /**< The endpoint is in DATA OUT stage.               */
+  H_EP_STATUS_IN        = 4,                      /**< The endpoint is in STATUS IN stage.              */
+  H_EP_STATUS_OUT       = 5,                      /**< The endpoint is in STATUS OUT stage.             */
+} USBH_EpState_TypeDef;
+
+
+/** @brief USB HOST endpoint status data.
+ *  @details A host application should not manipulate the contents of
+ * this struct.                                                             */
+typedef struct
+{
+  USB_Setup_TypeDef               setup;          /**< A SETUP package.                                 */
+  uint8_t                         setupErrCnt;    /**< Error counter for SETUP transfers.               */
+  USB_EndpointDescriptor_TypeDef  epDesc;         /**< Endpoint descriptor.                             */
+  struct USBH_Device_TypeDef      *parentDevice;  /**< The device the endpoint belongs to.              */
+  uint8_t                         type;           /**< Endpoint type.                                   */
+  uint16_t                        packetSize;     /**< Packet size, current transfer.                   */
+  uint8_t                         hcOut;          /**< Host channel number assigned for OUT transfers.  */
+  uint8_t                         hcIn;           /**< Host channel number assigned for IN transfers.   */
+  bool                            in;             /**< Endpoint direction.                              */
+  uint8_t                         toggle;         /**< Endpoint data toggle.                            */
+  USBH_EpState_TypeDef            state;          /**< Endpoint state.                                  */
+  uint8_t                         addr;           /**< Endpoint address.                                */
+  uint8_t                         *buf;           /**< Transfer buffer.                                 */
+  volatile bool                   xferCompleted;  /**< Transfer completion flag.                        */
+  USB_Status_TypeDef              xferStatus;     /**< Transfer status.                                 */
+  USB_XferCompleteCb_TypeDef      xferCompleteCb; /**< Transfer completion callback function.           */
+  uint32_t                        xferred;        /**< Number of bytes transferred.                     */
+  uint32_t                        remaining;      /**< Number of bytes remaining.                       */
+  uint32_t                        timeout;        /**< Transfer timeout.                                */
+} USBH_Ep_TypeDef;
+
+
+/** @brief USB HOST device definition.
+ *  @details A host application should not manipulate the contents of
+ *  this struct.                                                            */
+typedef struct USBH_Device_TypeDef
+{
+  USB_DeviceDescriptor_TypeDef          devDesc;  /**< The device device descriptor.                    */
+  USB_ConfigurationDescriptor_TypeDef   confDesc; /**< The device configuration descriptor.             */
+  USB_InterfaceDescriptor_TypeDef       itfDesc;  /**< The device interface descriptor.                 */
+  USBH_Ep_TypeDef                       ep0;      /**< Endpoint 0 status data.                          */
+  USBH_Ep_TypeDef                       *ep;      /**< Array of endpoint status data.                   */
+  int                                   numEp;    /**< Number of endpoints.                             */
+  uint8_t                               addr;     /**< The device address.                              */
+  uint8_t                               speed;    /**< The device speed (low or full speed).            */
+} USBH_Device_TypeDef;
+
+
+/** @brief USB Host stack initialization structure.
+ *  @details This structure is passed to @ref USBH_Init() when starting up the
+ *  device. Max accumulated FIFO size is 2K bytes.                          */
+typedef struct
+{
+  uint32_t                  rxFifoSize;     /**< Number of FIFO bytes set aside for IN endpoints.            */
+  uint32_t                  nptxFifoSize;   /**< Number of FIFO bytes set aside for OUT CTRL/BULK endoints.  */
+  uint32_t                  ptxFifoSize;    /**< Number of FIFO bytes set aside for OUT INTR/ISO endoints.   */
+  uint32_t                  reserved;       /**< Reserved for future use.                                    */
+} USBH_Init_TypeDef;
+
+
+/** Default @ref USBH_Init_TypeDef values, provides reasonable Tx/Rx FIFO
+ *  partitioning.                                                         */
+/* In DMA mode the total available FIFO space is smaller.       */
+/* The DMA controller use one FIFO word pr. channel for status. */
+/* The unit in the table is byte.                               */
+#define USBH_INIT_DEFAULT                                                    \
+{                                                                            \
+  MAX_HOST_FIFO_SIZE_INWORDS * 2,/* 1024 bytes Rx FIFO size.             */  \
+  MAX_HOST_FIFO_SIZE_INWORDS,    /* 512 bytes non-periodic Tx FIFO size. */  \
+  MAX_HOST_FIFO_SIZE_INWORDS,    /* 512 bytes periodic Tx FIFO size.     */  \
+  0                              /* Reserved.                            */  \
+}
+
+/*** -------------------- HOST mode API ---------------------------------- ***/
+
+int     USBH_AssignHostChannel(            USBH_Ep_TypeDef *ep, uint8_t hcnum );
+int     USBH_ControlMsg(                   USBH_Ep_TypeDef *ep, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, void *data, int timeout, USB_XferCompleteCb_TypeDef callback );
+int     USBH_ControlMsgB(                  USBH_Ep_TypeDef *ep, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, void *data, int timeout );
+bool    USBH_DeviceConnected(              void );
+int     USBH_GetConfigurationDescriptorB(  USBH_Device_TypeDef *device, void *buf, int len, uint8_t configIndex );
+int     USBH_GetDeviceDescriptorB(         USBH_Device_TypeDef *device, void *buf, int len );
+uint8_t USBH_GetPortSpeed(                 void );
+int     USBH_GetStringB(                   USBH_Device_TypeDef *device, uint8_t *buf, int bufLen, uint8_t stringIndex, uint16_t langID );
+int     USBH_Init(                         const USBH_Init_TypeDef *p );
+int     USBH_InitDeviceData(               USBH_Device_TypeDef *device, const uint8_t *buf, USBH_Ep_TypeDef *ep, int numEp, uint8_t deviceSpeed );
+int     USBH_PortReset(                    void );
+int     USBH_PortResume(                   void );
+void    USBH_PortSuspend(                  void );
+void    USBH_PrintString(                  const char *pre, const USB_StringDescriptor_TypeDef *s, const char *post );
+
+#if defined( USB_USE_PRINTF )
+int     USBH_PrintConfigurationDescriptor( const USB_ConfigurationDescriptor_TypeDef *config, int maxLen );
+int     USBH_PrintDeviceDescriptor(        const USB_DeviceDescriptor_TypeDef *device );
+int     USBH_PrintEndpointDescriptor(      const USB_EndpointDescriptor_TypeDef *endpoint );
+int     USBH_PrintInterfaceDescriptor(     const USB_InterfaceDescriptor_TypeDef *interface );
+#else
+#define USBH_PrintConfigurationDescriptor( config, maxLen )
+#define USBH_PrintDeviceDescriptor(        device )
+#define USBH_PrintEndpointDescriptor(      endpoint )
+#define USBH_PrintInterfaceDescriptor(     interface )
+#endif /* defined( USB_USE_PRINTF ) */
+
+int                                  USBH_QueryDeviceB(                uint8_t *buf, size_t bufsize, uint8_t deviceSpeed );
+USB_ConfigurationDescriptor_TypeDef* USBH_QGetConfigurationDescriptor( const uint8_t *buf, int configIndex );
+USB_DeviceDescriptor_TypeDef*        USBH_QGetDeviceDescriptor(        const uint8_t *buf );
+USB_EndpointDescriptor_TypeDef*      USBH_QGetEndpointDescriptor(      const uint8_t *buf, int configIndex, int interfaceIndex, int endpointIndex );
+USB_InterfaceDescriptor_TypeDef*     USBH_QGetInterfaceDescriptor(     const uint8_t *buf, int configIndex, int interfaceIndex );
+
+int     USBH_Read(                         USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout, USB_XferCompleteCb_TypeDef callback );
+int     USBH_ReadB(                        USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout );
+int     USBH_SetAddressB(                  USBH_Device_TypeDef *device, uint8_t deviceAddress );
+int     USBH_SetAltInterfaceB(             USBH_Device_TypeDef *device, uint8_t interfaceIndex, uint8_t alternateSetting );
+int     USBH_SetConfigurationB(            USBH_Device_TypeDef *device, uint8_t configValue );
+int     USBH_StallEpB(                     USBH_Ep_TypeDef *ep );
+void    USBH_Stop(                         void );
+int     USBH_UnStallEpB(                   USBH_Ep_TypeDef *ep );
+int     USBH_WaitForDeviceConnectionB(     uint8_t *buf, int timeoutInSeconds );
+int     USBH_Write(                        USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout, USB_XferCompleteCb_TypeDef callback );
+int     USBH_WriteB(                       USBH_Ep_TypeDef *ep, void *data, int byteCount, int timeout );
+
+/** @} (end addtogroup USB_HOST) */
+#endif /* defined( USB_HOST ) */
+/** @} (end addtogroup USB) */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
+#endif /* __EM_USB_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbd.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,206 @@
+/***************************************************************************//**
+ * @file em_usbd.h
+ * @brief USB protocol stack library API for EFM32.
+ * @version 3.20.14
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef __EM_USBD_H
+#define __EM_USBD_H
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+#if defined( DEBUG_USB_API )
+#define DEBUG_TRACE_ABORT( x )                                  \
+{                                                               \
+  if ( x == USB_STATUS_EP_STALLED )                             \
+  {  DEBUG_USB_API_PUTS( "\nEP cb(), EP stalled" );           } \
+  else if ( x == USB_STATUS_EP_ABORTED )                        \
+  {  DEBUG_USB_API_PUTS( "\nEP cb(), EP aborted" );           } \
+  else if ( x == USB_STATUS_DEVICE_UNCONFIGURED )               \
+  {  DEBUG_USB_API_PUTS( "\nEP cb(), device unconfigured" );  } \
+  else if ( x == USB_STATUS_DEVICE_SUSPENDED )                  \
+  {  DEBUG_USB_API_PUTS( "\nEP cb(), device suspended" );     } \
+  else /* ( x == USB_STATUS_DEVICE_RESET ) */                   \
+  {  DEBUG_USB_API_PUTS( "\nEP cb(), device reset" );         } \
+}
+#else
+#define DEBUG_TRACE_ABORT( x )
+#endif
+
+extern USBD_Device_TypeDef *dev;
+extern volatile bool USBD_poweredDown;
+
+__STATIC_INLINE void USBD_ArmEp0( USBD_Ep_TypeDef *ep );
+__STATIC_INLINE void USBD_ArmEpN( USBD_Ep_TypeDef *ep );
+__STATIC_INLINE void USBD_AbortEp( USBD_Ep_TypeDef *ep );
+
+void USBD_SetUsbState( USBD_State_TypeDef newState );
+
+int  USBDCH9_SetupCmd( USBD_Device_TypeDef *device );
+
+void USBDEP_Ep0Handler( USBD_Device_TypeDef *device );
+void USBDEP_EpHandler( uint8_t epAddr );
+
+__STATIC_INLINE void USBD_ActivateAllEps( bool forceIdle )
+{
+  int i;
+
+  for ( i = 1; i <= NUM_EP_USED; i++ )
+  {
+    USBDHAL_ActivateEp( &dev->ep[ i ], forceIdle );
+  }
+}
+
+__STATIC_INLINE void USBD_ArmEp( USBD_Ep_TypeDef *ep )
+{
+  if ( ep->num == 0 )
+  {
+    USBD_ArmEp0( ep );
+  }
+  else
+  {
+    USBD_ArmEpN( ep );
+  }
+}
+
+__STATIC_INLINE void USBD_ArmEp0( USBD_Ep_TypeDef *ep )
+{
+  if ( ep->in )
+  {
+    if ( ep->remaining == 0 )       /* Zero Length Packet? */
+    {
+      ep->zlp = 1;
+    }
+
+    USBDHAL_SetEp0InDmaPtr( ep->buf );
+    USBDHAL_StartEp0In( EFM32_MIN( ep->remaining, ep->packetSize ),
+                        dev->ep0MpsCode );
+  }
+  else
+  {
+    USBDHAL_SetEp0OutDmaPtr( ep->buf );
+    USBDHAL_StartEp0Out( ep->packetSize, dev->ep0MpsCode );
+  }
+}
+
+__STATIC_INLINE void USBD_ArmEpN( USBD_Ep_TypeDef *ep )
+{
+  if ( ep->in )
+  {
+    USBDHAL_StartEpIn( ep );
+  }
+  else
+  {
+    USBDHAL_StartEpOut( ep );
+  }
+}
+
+__STATIC_INLINE void USBD_DeactivateAllEps( USB_Status_TypeDef reason )
+{
+  int i;
+  USBD_Ep_TypeDef *ep;
+
+  for ( i = 1; i <= NUM_EP_USED; i++ )
+  {
+    ep = &dev->ep[ i ];
+
+    if ( ep->state == D_EP_IDLE )
+    {
+      USBDHAL_DeactivateEp( ep );
+    }
+  }
+
+  USBDHAL_AbortAllTransfers( reason );
+}
+
+__STATIC_INLINE USBD_Ep_TypeDef *USBD_GetEpFromAddr( uint8_t epAddr )
+{
+  int epIndex;
+  USBD_Ep_TypeDef *ep = NULL;
+
+  if ( epAddr & USB_SETUP_DIR_MASK )
+  {
+    epIndex = dev->inEpAddr2EpIndex[ epAddr & USB_EPNUM_MASK ];
+  }
+  else
+  {
+    epIndex = dev->outEpAddr2EpIndex[ epAddr & USB_EPNUM_MASK ];
+  }
+
+  if ( epIndex )
+  {
+    ep = &dev->ep[ epIndex ];
+  }
+  else if ( ( epAddr & USB_EPNUM_MASK ) == 0 )
+  {
+    ep = &dev->ep[ 0 ];
+  }
+
+  return ep;
+}
+
+__STATIC_INLINE void USBD_ReArmEp0( USBD_Ep_TypeDef *ep )
+{
+  if ( ep->in )
+  {
+    USBDHAL_StartEp0In( EFM32_MIN( ep->remaining, ep->packetSize ),
+                        dev->ep0MpsCode );
+  }
+  else
+  {
+    USBDHAL_StartEp0Out( ep->packetSize, dev->ep0MpsCode );
+  }
+}
+
+__STATIC_INLINE void USBD_AbortEp( USBD_Ep_TypeDef *ep )
+{
+  if ( ep->state == D_EP_IDLE )
+  {
+    return;
+  }
+
+  if ( ep->in )
+  {
+    USBDHAL_AbortEpIn( ep );
+  }
+  else
+  {
+    USBDHAL_AbortEpOut( ep );
+  }
+}
+
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* defined( USB_DEVICE ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
+#endif /* __EM_USBD_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbh.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,75 @@
+/***************************************************************************//**
+ * @file em_usbh.h
+ * @brief USB protocol stack library API for EFM32.
+ * @version 3.20.14
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef __EM_USBH_H
+#define __EM_USBH_H
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_HOST )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+extern USBH_Hc_TypeDef                  hcs[];
+extern int                              USBH_attachRetryCount;
+extern const USBH_AttachTiming_TypeDef  USBH_attachTiming[];
+extern USBH_Init_TypeDef                USBH_initData;
+extern volatile USBH_PortState_TypeDef  USBH_portStatus;
+
+USB_Status_TypeDef USBH_CtlSendSetup(   USBH_Ep_TypeDef *ep );
+USB_Status_TypeDef USBH_CtlSendData(    USBH_Ep_TypeDef *ep, uint16_t length );
+USB_Status_TypeDef USBH_CtlReceiveData( USBH_Ep_TypeDef *ep, uint16_t length );
+
+#if defined( USB_RAW_API )
+int USBH_CtlRxRaw( uint8_t pid, USBH_Ep_TypeDef *ep, void *data, int byteCount );
+int USBH_CtlTxRaw( uint8_t pid, USBH_Ep_TypeDef *ep, void *data, int byteCount );
+#endif
+
+void USBHEP_EpHandler(     USBH_Ep_TypeDef *ep, USB_Status_TypeDef result );
+void USBHEP_CtrlEpHandler( USBH_Ep_TypeDef *ep, USB_Status_TypeDef result );
+void USBHEP_TransferDone(  USBH_Ep_TypeDef *ep, USB_Status_TypeDef result );
+
+__STATIC_INLINE uint16_t USBH_GetFrameNum( void )
+{
+  return USBHHAL_GetFrameNum();
+}
+
+__STATIC_INLINE bool USBH_FrameNumIsEven( void )
+{
+  return ( USBHHAL_GetFrameNum() & 1 ) == 0;
+}
+
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* defined( USB_HOST ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
+#endif /* __EM_USBH_H      */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbhal.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,757 @@
+/***************************************************************************//**
+ * @file em_usbhal.h
+ * @brief USB protocol stack library, low level USB peripheral access.
+ * @version 3.20.14
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef __EM_USBHAL_H
+#define __EM_USBHAL_H
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE ) || defined( USB_HOST )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+#define USB_PID_DATA0         0
+#define USB_PID_DATA2         1
+#define USB_PID_DATA1         2
+#define USB_PID_SETUP         3
+
+#define HPRT_F_SPEED          ( 1 << _USB_HPRT_PRTSPD_SHIFT )
+#define HPRT_L_SPEED          ( 2 << _USB_HPRT_PRTSPD_SHIFT )
+#define HCFG_PHYCLK_48MHZ     1
+#define HCFG_PHYCLK_6MHZ      2
+
+#define DOEP0_XFERSIZE_PKTCNT_MASK ( _USB_DOEP0TSIZ_XFERSIZE_MASK | \
+                                     _USB_DOEP0TSIZ_PKTCNT_MASK   )
+#define DOEP_XFERSIZE_PKTCNT_MASK  ( _USB_DOEP_TSIZ_XFERSIZE_MASK | \
+                                     _USB_DOEP_TSIZ_PKTCNT_MASK   )
+
+#define DIEP0_XFERSIZE_PKTCNT_MASK ( _USB_DIEP0TSIZ_XFERSIZE_MASK | \
+                                     _USB_DIEP0TSIZ_PKTCNT_MASK   )
+#define DIEP_XFERSIZE_PKTCNT_MASK  ( _USB_DIEP_TSIZ_XFERSIZE_MASK | \
+                                     _USB_DIEP_TSIZ_PKTCNT_MASK   | \
+                                     _USB_DIEP_TSIZ_MC_MASK       )
+
+#define DIEPCTL_EPTYPE_CONTROL (0 << _USB_DIEP_CTL_EPTYPE_SHIFT )
+#define DIEPCTL_EPTYPE_ISOC    (1 << _USB_DIEP_CTL_EPTYPE_SHIFT )
+#define DIEPCTL_EPTYPE_BULK    (2 << _USB_DIEP_CTL_EPTYPE_SHIFT )
+#define DIEPCTL_EPTYPE_INTR    (3 << _USB_DIEP_CTL_EPTYPE_SHIFT )
+
+#define DOEPCTL_EPTYPE_CONTROL (0 << _USB_DOEP_CTL_EPTYPE_SHIFT )
+#define DOEPCTL_EPTYPE_ISOC    (1 << _USB_DOEP_CTL_EPTYPE_SHIFT )
+#define DOEPCTL_EPTYPE_BULK    (2 << _USB_DOEP_CTL_EPTYPE_SHIFT )
+#define DOEPCTL_EPTYPE_INTR    (3 << _USB_DOEP_CTL_EPTYPE_SHIFT )
+
+#define HCCHAR_EPTYPE_CTRL     (0 << _USB_HC_CHAR_EPTYPE_SHIFT )
+#define HCCHAR_EPTYPE_ISOC     (1 << _USB_HC_CHAR_EPTYPE_SHIFT )
+#define HCCHAR_EPTYPE_BULK     (2 << _USB_HC_CHAR_EPTYPE_SHIFT )
+#define HCCHAR_EPTYPE_INTR     (3 << _USB_HC_CHAR_EPTYPE_SHIFT )
+
+#define GRXSTSP_PKTSTS_DEVICE_GOTNAK          ( 1 << _USB_GRXSTSP_PKTSTS_SHIFT )
+#define GRXSTSP_PKTSTS_DEVICE_DATAOUTRECEIVED ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT )
+#define GRXSTSP_PKTSTS_DEVICE_DATAOUTCOMPLETE ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT )
+#define GRXSTSP_PKTSTS_DEVICE_SETUPCOMPLETE   ( 4 << _USB_GRXSTSP_PKTSTS_SHIFT )
+#define GRXSTSP_PKTSTS_DEVICE_SETUPRECEIVED   ( 6 << _USB_GRXSTSP_PKTSTS_SHIFT )
+
+#define GRXSTSP_PKTSTS_HOST_DATAINRECEIVED  ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT )
+#define GRXSTSP_PKTSTS_HOST_DATAINCOMPLETE  ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT )
+#define GRXSTSP_PKTSTS_HOST_DATATOGGLEERROR ( 5 << _USB_GRXSTSP_PKTSTS_SHIFT )
+#define GRXSTSP_PKTSTS_HOST_CHANNELHALTED   ( 7 << _USB_GRXSTSP_PKTSTS_SHIFT )
+
+#define DCTL_WO_BITMASK \
+          ( _USB_DCTL_CGOUTNAK_MASK  | _USB_DCTL_SGOUTNAK_MASK   | \
+            _USB_DCTL_CGNPINNAK_MASK | _USB_DCTL_SGNPINNAK_MASK  )
+#define GUSBCFG_WO_BITMASK ( USB_GUSBCFG_CORRUPTTXPKT )
+#define DEPCTL_WO_BITMASK \
+          ( USB_DIEP_CTL_CNAK       | USB_DIEP_CTL_SNAK        | \
+            USB_DIEP_CTL_SETD0PIDEF | USB_DIEP_CTL_SETD1PIDOF  )
+
+#define HPRT_WC_MASK ( USB_HPRT_PRTCONNDET | USB_HPRT_PRTENA | \
+                       USB_HPRT_PRTENCHNG  | USB_HPRT_PRTOVRCURRCHNG )
+
+typedef __IO uint32_t USB_FIFO_TypeDef[ 0x1000 / sizeof( uint32_t ) ];
+typedef __IO uint32_t USB_DIEPTXF_TypeDef;
+
+#define USB_DINEPS       ((USB_DIEP_TypeDef    *) &USB->DIEP0CTL )
+#define USB_DOUTEPS      ((USB_DOEP_TypeDef    *) &USB->DOEP0CTL )
+#define USB_FIFOS        ((USB_FIFO_TypeDef    *) &USB->FIFO0D   )
+#define USB_DIEPTXFS     ((USB_DIEPTXF_TypeDef *) &USB->DIEPTXF1 )
+
+void USBHAL_CoreReset( void );
+
+#if defined( USB_DEVICE )
+void USBDHAL_AbortAllTransfers( USB_Status_TypeDef reason );
+USB_Status_TypeDef USBDHAL_CoreInit( const uint32_t totalRxFifoSize,
+                                     const uint32_t totalTxFifoSize );
+void USBDHAL_Connect( void );
+void USBDHAL_Disconnect( void );
+void USBDHAL_AbortAllEps( void );
+void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep );
+void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep );
+
+__STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp(
+                                   USBD_Ep_TypeDef *ep, uint16_t *halt );
+__STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep );
+__STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep );
+__STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep );
+#endif /* defined( USB_DEVICE ) */
+
+#if defined( USB_HOST )
+USB_Status_TypeDef USBHHAL_CoreInit( const uint32_t rxFifoSize,
+                                     const uint32_t nptxFifoSize,
+                                     const uint32_t ptxFifoSize );
+void USBHHAL_HCHalt(  int hcnum, uint32_t hcchar );
+void USBHHAL_HCInit(  int hcnum );
+void USBHHAL_HCStart( int hcnum );
+#endif /* defined( USB_HOST ) */
+
+__STATIC_INLINE void USBHAL_DisableGlobalInt( void )
+{
+  USB->GAHBCFG &= ~USB_GAHBCFG_GLBLINTRMSK;
+}
+
+__STATIC_INLINE void USBHAL_DisablePhyPins( void )
+{
+  USB->ROUTE = _USB_ROUTE_RESETVALUE;
+}
+
+__STATIC_INLINE void USBHAL_DisableUsbInt( void )
+{
+  USB->IEN = _USB_IEN_RESETVALUE;
+}
+
+__STATIC_INLINE void USBHAL_EnableGlobalInt( void )
+{
+  USB->GAHBCFG |= USB_GAHBCFG_GLBLINTRMSK;
+}
+
+__STATIC_INLINE void USBHAL_FlushRxFifo( void )
+{
+  USB->GRSTCTL = USB_GRSTCTL_RXFFLSH;
+  while ( USB->GRSTCTL & USB_GRSTCTL_RXFFLSH ) {}
+}
+
+__STATIC_INLINE void USBHAL_FlushTxFifo( uint8_t fifoNum )
+{
+  USB->GRSTCTL = USB_GRSTCTL_TXFFLSH | ( fifoNum << _USB_GRSTCTL_TXFNUM_SHIFT );
+  while ( USB->GRSTCTL & USB_GRSTCTL_TXFFLSH ) {}
+}
+
+__STATIC_INLINE uint32_t USBHAL_GetCoreInts( void )
+{
+  uint32_t retVal;
+
+  retVal  = USB->GINTSTS;
+  retVal &= USB->GINTMSK;
+
+  return retVal;
+}
+
+__STATIC_INLINE bool USBHAL_VbusIsOn( void )
+{
+  return ( USB->STATUS & USB_STATUS_VREGOS ) != 0;
+}
+
+#if defined( USB_DEVICE )
+__STATIC_INLINE void USBDHAL_ActivateEp( USBD_Ep_TypeDef *ep, bool forceIdle )
+{
+#define DIEP_MPS_EPTYPE_TXFNUM_MASK ( _USB_DIEP_CTL_MPS_MASK    | \
+                                      _USB_DIEP_CTL_EPTYPE_MASK | \
+                                      _USB_DIEP_CTL_TXFNUM_MASK )
+#define DOEP_MPS_EPTYPE_MASK        ( _USB_DOEP_CTL_MPS_MASK    | \
+                                      _USB_DOEP_CTL_EPTYPE_MASK )
+  uint32_t daintmask, depctl;
+
+  if ( forceIdle )
+    ep->state = D_EP_IDLE;
+
+  if ( ep->in )
+  {
+    daintmask = ep->mask;
+    depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
+
+    if ( !( depctl & USB_DIEP_CTL_USBACTEP ) )
+    {
+      depctl = ( depctl                                     &
+                 ~( DIEP_MPS_EPTYPE_TXFNUM_MASK          |
+                    USB_DIEP_CTL_STALL                     )  ) |
+               ( ep->packetSize << _USB_DIEP_CTL_MPS_SHIFT    ) |
+               ( ep->type       << _USB_DIEP_CTL_EPTYPE_SHIFT ) |
+               ( ep->txFifoNum  << _USB_DIEP_CTL_TXFNUM_SHIFT ) |
+               USB_DIEP_CTL_SETD0PIDEF                          |
+               USB_DIEP_CTL_USBACTEP                            |
+               USB_DIEP_CTL_SNAK;
+    }
+    else
+    {
+      depctl |= USB_DIEP_CTL_SETD0PIDEF;
+    }
+    USB_DINEPS[ ep->num ].CTL = depctl;
+  }
+  else
+  {
+    daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT;
+    depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
+
+    if ( !( depctl & USB_DOEP_CTL_USBACTEP ) )
+    {
+      depctl = ( depctl                                     &
+                 ~( DOEP_MPS_EPTYPE_MASK                 |
+                    USB_DOEP_CTL_STALL                     )  ) |
+               ( ep->packetSize << _USB_DOEP_CTL_MPS_SHIFT    ) |
+               ( ep->type       << _USB_DOEP_CTL_EPTYPE_SHIFT ) |
+               USB_DOEP_CTL_SETD0PIDEF                          |
+               USB_DOEP_CTL_USBACTEP                            |
+               USB_DOEP_CTL_SNAK;
+    }
+    else
+    {
+      depctl |= USB_DOEP_CTL_SETD0PIDEF;
+    }
+    USB_DOUTEPS[ ep->num ].CTL = depctl;
+  }
+
+  /* Enable interrupt for this EP */
+  USB->DAINTMSK |= daintmask;
+
+#undef DIEP_MPS_EPTYPE_TXFNUM_MASK
+#undef DOEP_MPS_EPTYPE_MASK
+}
+
+__STATIC_INLINE void USBDHAL_ClearRemoteWakeup( void )
+{
+  USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_RMTWKUPSIG );
+}
+
+__STATIC_INLINE void USBDHAL_DeactivateEp( USBD_Ep_TypeDef *ep )
+{
+  uint32_t daintmask;
+
+  if ( ep->in )
+  {
+    USB_DINEPS[ ep->num ].CTL = 0;
+    daintmask = ep->mask;
+  }
+  else
+  {
+    USB_DOUTEPS[ ep->num ].CTL = 0;
+    daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT;
+  }
+
+  /* Disable interrupt for this EP */
+  USB->DAINTMSK &= ~daintmask;
+}
+
+__STATIC_INLINE void USBDHAL_EnableInts( USBD_Device_TypeDef *dev )
+{
+  uint32_t mask;
+
+  /* Disable all interrupts. */
+  USB->GINTMSK = 0;
+
+  /* Clear pending interrupts */
+  USB->GINTSTS = 0xFFFFFFFF;
+
+  mask = USB_GINTMSK_USBSUSPMSK     |
+         USB_GINTMSK_USBRSTMSK      |
+         USB_GINTMSK_ENUMDONEMSK    |
+         USB_GINTMSK_IEPINTMSK      |
+         USB_GINTMSK_OEPINTMSK      |
+         USB_GINTMSK_WKUPINTMSK;
+
+  if ( dev->callbacks->sofInt )
+  {
+    mask |= USB_GINTMSK_SOFMSK;
+  }
+
+  USB->GINTMSK = mask;
+}
+
+__STATIC_INLINE void USBDHAL_EnableUsbResetAndSuspendInt( void )
+{
+  /* Disable all interrupts. */
+  USB->GINTMSK = 0;
+
+  USB->GINTMSK = USB_GINTMSK_USBRSTMSK | USB_GINTMSK_USBSUSPMSK;
+}
+
+__STATIC_INLINE void USBDHAL_Ep0Activate( uint32_t ep0mps )
+{
+  USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGNPINNAK;
+
+  USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
+                  | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
+                  | ep0mps;
+}
+
+__STATIC_INLINE bool USBDHAL_EpIsStalled( USBD_Ep_TypeDef *ep )
+{
+  bool retVal = false;
+  uint16_t stallStatus;
+
+  if ( USBDHAL_GetStallStatusEp( ep, &stallStatus ) == USB_STATUS_OK )
+  {
+    retVal = stallStatus & 1 ? true : false;
+  }
+  return retVal;
+}
+
+__STATIC_INLINE uint32_t USBDHAL_GetAllInEpInts( void )
+{
+  uint32_t retVal;
+
+  retVal  = USB->DAINT;
+  retVal &= USB->DAINTMSK;
+  return retVal & 0xFFFF;
+}
+
+__STATIC_INLINE uint32_t USBDHAL_GetAllOutEpInts( void )
+{
+  uint32_t retVal;
+
+  retVal  = USB->DAINT;
+  retVal &= USB->DAINTMSK;
+  return retVal >> 16;
+}
+
+__STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep )
+{
+  uint32_t retVal, msk;
+
+  msk    = USB->DIEPMSK;
+  retVal = USB_DINEPS[ ep->num ].INT;
+
+  return retVal & msk;
+}
+
+__STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep )
+{
+  uint32_t retVal;
+
+  retVal  = USB_DOUTEPS[ ep->num ].INT;
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+  retVal &= USB->DOEPMSK | USB_DOEP0INT_STUPPKTRCVD;
+#else
+  retVal &= USB->DOEPMSK;
+#endif
+
+  return retVal;
+}
+
+__STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp(
+                                   USBD_Ep_TypeDef *ep, uint16_t *halt )
+{
+  uint32_t depctl, eptype;
+  USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
+
+  if ( ep->in == true )
+  {
+    depctl = USB_DINEPS[ ep->num ].CTL;
+    eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
+
+    if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
+    {
+      *halt = depctl & USB_DIEP_CTL_STALL ? 1 : 0;
+      retVal = USB_STATUS_OK;
+    }
+  }
+  else
+  {
+    depctl = USB_DOUTEPS[ ep->num ].CTL;
+    eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
+
+    if (( eptype == DOEPCTL_EPTYPE_INTR ) || ( eptype == DOEPCTL_EPTYPE_BULK ))
+    {
+      *halt = depctl & USB_DOEP_CTL_STALL ? 1 : 0;
+      retVal = USB_STATUS_OK;
+    }
+  }
+
+  return retVal;
+}
+
+__STATIC_INLINE void USBDHAL_ReenableEp0Setup( USBD_Device_TypeDef *dev )
+
+{
+  USB->DOEP0DMAADDR = (uint32_t)dev->setupPkt;
+  USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
+                  | USB_DOEP0CTL_EPENA
+                  | dev->ep0MpsCode;
+}
+
+__STATIC_INLINE void USBDHAL_SetAddr( uint8_t addr )
+{
+  USB->DCFG = ( USB->DCFG                    &
+                ~_USB_DCFG_DEVADDR_MASK        ) |
+              (addr << _USB_DCFG_DEVADDR_SHIFT );
+}
+
+__STATIC_INLINE void USBDHAL_SetEp0InDmaPtr( uint8_t* addr )
+{
+  USB->DIEP0DMAADDR = (uint32_t)addr;
+}
+
+__STATIC_INLINE void USBDHAL_SetEp0OutDmaPtr( uint8_t* addr )
+{
+  USB->DOEP0DMAADDR = (uint32_t)addr;
+}
+
+__STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep )
+{
+  if ( ep->in )
+  {
+    USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL   &
+                                  ~DEPCTL_WO_BITMASK            ) |
+                                USB_DIEP_CTL_SNAK                 |
+                                USB_DIEP_CTL_EPDIS;
+  }
+  else
+  {
+    USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL   &
+                                   ~DEPCTL_WO_BITMASK             ) |
+                                 USB_DOEP_CTL_EPENA;
+
+    USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL   &
+                                   ~DEPCTL_WO_BITMASK             ) |
+                                 USB_DOEP_CTL_SNAK                  |
+                                 USB_DOEP_CTL_EPDIS;
+  }
+}
+
+__STATIC_INLINE void USBDHAL_SetRemoteWakeup( void )
+{
+  USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_RMTWKUPSIG;
+}
+
+__STATIC_INLINE USB_Status_TypeDef USBDHAL_StallEp( USBD_Ep_TypeDef *ep )
+{
+  uint32_t depctl, eptype;
+  USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
+
+  if ( ep->in == true )
+  {
+    depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
+    eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
+
+    if ( eptype != DIEPCTL_EPTYPE_ISOC )
+    {
+      if ( depctl & USB_DIEP_CTL_EPENA )
+      {
+        depctl |= USB_DIEP_CTL_EPDIS;
+      }
+      USB_DINEPS[ ep->num ].CTL = depctl | USB_DIEP_CTL_STALL;
+      retVal = USB_STATUS_OK;
+    }
+  }
+  else
+  {
+    depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
+    eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
+
+    if ( eptype != DIEPCTL_EPTYPE_ISOC )
+    {
+      USB_DOUTEPS[ ep->num ].CTL = depctl | USB_DOEP_CTL_STALL;
+      retVal = USB_STATUS_OK;
+    }
+  }
+
+  return retVal;
+}
+
+__STATIC_INLINE void USBDHAL_StartEp0In( uint32_t len, uint32_t ep0mps )
+{
+  USB->DIEP0TSIZ = ( len << _USB_DIEP0TSIZ_XFERSIZE_SHIFT   ) |
+                   ( 1   << _USB_DIEP0TSIZ_PKTCNT_SHIFT     );
+
+  USB->DIEP0CTL = ( USB->DIEP0CTL & ~DEPCTL_WO_BITMASK )
+                  | USB_DIEP0CTL_CNAK | USB_DIEP0CTL_EPENA
+                  | ep0mps;
+}
+
+__STATIC_INLINE void USBDHAL_StartEp0Out( uint32_t len, uint32_t ep0mps )
+{
+  USB->DOEP0TSIZ = ( len << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) |
+                   ( 1   << _USB_DOEP0TSIZ_PKTCNT_SHIFT   );
+
+  USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
+                  | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
+                  | ep0mps;
+}
+
+__STATIC_INLINE void USBDHAL_StartEp0Setup( USBD_Device_TypeDef *dev )
+{
+  dev->ep[ 0 ].in = false;
+
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+  USB->DOEP0TSIZ = ( 8*3 << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) |
+                   ( 1   << _USB_DOEP0TSIZ_PKTCNT_SHIFT   ) |
+                   ( 3   << _USB_DOEP0TSIZ_SUPCNT_SHIFT   );
+#else
+  USB->DOEP0TSIZ = 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT;
+#endif
+
+  dev->setup = dev->setupPkt;
+  USB->DOEP0DMAADDR = (uint32_t)dev->setup;
+
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+  USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
+                  | USB_DOEP0CTL_EPENA
+                  | dev->ep0MpsCode;
+#else
+  USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
+                  | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
+                  | dev->ep0MpsCode;
+#endif
+}
+
+__STATIC_INLINE void USBDHAL_StartEpIn( USBD_Ep_TypeDef *ep )
+{
+  uint32_t pktcnt, xfersize;
+
+  if ( ep->remaining == 0 )     /* ZLP ? */
+  {
+    pktcnt = 1;
+    xfersize = 0;
+  }
+  else
+  {
+    pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize;
+    xfersize = ep->remaining;
+  }
+
+  USB_DINEPS[ ep->num ].TSIZ =
+                ( USB_DINEPS[ ep->num ].TSIZ                &
+                  ~DIEP_XFERSIZE_PKTCNT_MASK                  ) |
+                ( xfersize << _USB_DIEP_TSIZ_XFERSIZE_SHIFT   ) |
+                ( pktcnt   << _USB_DIEP_TSIZ_PKTCNT_SHIFT     );
+
+  USB_DINEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf;
+  USB_DINEPS[ ep->num ].CTL =
+                  ( USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK ) |
+                  USB_DIEP_CTL_CNAK                                  |
+                  USB_DIEP_CTL_EPENA;
+}
+
+__STATIC_INLINE void USBDHAL_StartEpOut( USBD_Ep_TypeDef *ep )
+{
+  uint32_t pktcnt, xfersize;
+
+  if ( ep->remaining == 0 )     /* ZLP ? */
+  {
+    pktcnt = 1;
+    xfersize = ep->packetSize;
+  }
+  else
+  {
+    pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize;
+    xfersize = pktcnt * ep->packetSize;
+  }
+
+  USB_DOUTEPS[ ep->num ].TSIZ =
+                  ( USB_DOUTEPS[ ep->num ].TSIZ               &
+                    ~DOEP_XFERSIZE_PKTCNT_MASK                  ) |
+                  ( xfersize << _USB_DOEP_TSIZ_XFERSIZE_SHIFT   ) |
+                  ( pktcnt   << _USB_DOEP_TSIZ_PKTCNT_SHIFT     );
+
+  ep->hwXferSize = xfersize;
+  USB_DOUTEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf;
+  USB_DOUTEPS[ ep->num ].CTL =
+                          ( USB_DOUTEPS[ ep->num ].CTL  &
+                            ~DEPCTL_WO_BITMASK             ) |
+                          USB_DOEP_CTL_CNAK                  |
+                          USB_DOEP_CTL_EPENA;
+}
+
+__STATIC_INLINE USB_Status_TypeDef USBDHAL_UnStallEp( USBD_Ep_TypeDef *ep )
+{
+  uint32_t depctl, eptype;
+  USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
+
+  if ( ep->in == true )
+  {
+    depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
+    eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
+
+    if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
+    {
+      depctl |=  USB_DIEP_CTL_SETD0PIDEF;
+      depctl &= ~USB_DIEP_CTL_STALL;
+      USB_DINEPS[ ep->num ].CTL = depctl;
+      retVal = USB_STATUS_OK;
+    }
+  }
+  else
+  {
+    depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
+    eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
+
+    if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
+    {
+      depctl |=  USB_DOEP_CTL_SETD0PIDEF;
+      depctl &= ~USB_DOEP_CTL_STALL;
+      USB_DOUTEPS[ ep->num ].CTL = depctl;
+      retVal = USB_STATUS_OK;
+    }
+  }
+
+  return retVal;
+}
+#endif /* defined( USB_DEVICE ) */
+
+#if defined( USB_HOST )
+__STATIC_INLINE void USBHHAL_HCActivate( int hcnum, uint32_t hcchar, bool intep )
+{
+  uint32_t oddframe;
+
+  if ( intep )
+  {
+    oddframe = USB->HFNUM & 1;
+
+    USB->HC[ hcnum ].CHAR =
+                    ( hcchar &
+                      ~( USB_HC_CHAR_CHDIS | _USB_HC_CHAR_ODDFRM_MASK ) ) |
+
+                    /* Schedule INT transfers to start in next frame. */
+                    ( oddframe & 1 ? 0 : USB_HC_CHAR_ODDFRM             ) |
+
+                    USB_HC_CHAR_CHENA;
+  }
+  else
+  {
+    USB->HC[ hcnum ].CHAR = ( hcchar & ~USB_HC_CHAR_CHDIS ) |
+                              USB_HC_CHAR_CHENA;
+  }
+}
+
+__STATIC_INLINE bool USBHHAL_InitializedAndPowered( void )
+{
+  if ( ( USB->ROUTE & USB_ROUTE_PHYPEN ) &&
+       ( USB->HPRT  & USB_HPRT_PRTPWR  )    )
+    return true;
+  return false;
+}
+
+__STATIC_INLINE void USBHHAL_EnableInts( void )
+{
+  /* Disable all interrupts. */
+  USB->GINTMSK = 0;
+
+  /* Clear pending OTG interrupts */
+  USB->GOTGINT = 0xFFFFFFFF;
+
+  /* Clear pending interrupts */
+  USB->GINTSTS = 0xFFFFFFFF;
+
+  USB->GINTMSK = USB_GINTMSK_PRTINTMSK     |
+                 USB_GINTMSK_HCHINTMSK     |
+                 USB_GINTMSK_DISCONNINTMSK;
+}
+
+__STATIC_INLINE uint16_t USBHHAL_GetFrameNum( void )
+{
+  return USB->HFNUM;
+}
+
+__STATIC_INLINE uint32_t USBHHAL_GetHcChar( uint8_t hcnum )
+{
+  return USB->HC[ hcnum ].CHAR;
+}
+
+__STATIC_INLINE uint32_t USBHHAL_GetHcInts( uint8_t hcnum )
+{
+  uint32_t retVal;
+
+  retVal  = USB->HC[ hcnum ].INT;
+  return retVal;
+}
+
+__STATIC_INLINE uint32_t USBHHAL_GetHostChannelInts( void )
+{
+  return USB->HAINT;
+}
+
+__STATIC_INLINE uint8_t USBHHAL_GetPortSpeed( void )
+{
+  return ( USB->HPRT & _USB_HPRT_PRTSPD_MASK ) >> _USB_HPRT_PRTSPD_SHIFT;
+}
+
+__STATIC_INLINE void USBHHAL_PortReset( bool on )
+{
+  if ( on )
+  {
+    DEBUG_USB_INT_LO_PUTCHAR( '+' );
+    USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTRST;
+  }
+  else
+  {
+    DEBUG_USB_INT_LO_PUTCHAR( '-' );
+    USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTRST );
+  }
+}
+
+__STATIC_INLINE void USBHHAL_PortResume( bool on )
+{
+  if ( on )
+  {
+    USB->HPRT = ( USB->HPRT & ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP ) ) |
+                USB_HPRT_PRTRES;
+  }
+  else
+  {
+    USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP | USB_HPRT_PRTRES );
+  }
+}
+
+__STATIC_INLINE void USBHHAL_PortSuspend( void )
+{
+  USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTSUSP;
+}
+
+__STATIC_INLINE void USBHHAL_VbusOn( bool on )
+{
+  if ( on )
+  {
+    USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTPWR;
+    DEBUG_USB_INT_LO_PUTCHAR( '/' );
+  }
+  else
+  {
+    USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTPWR );
+    DEBUG_USB_INT_LO_PUTCHAR( '\\' );
+  }
+}
+#endif /* defined( USB_HOST ) */
+
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
+#endif /* __EM_USBHAL_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/inc/em_usbtypes.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,230 @@
+/***************************************************************************//**
+ * @file em_usbtypes.h
+ * @brief USB protocol stack library, internal type definitions.
+ * @version 3.20.14
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef __EM_USBTYPES_H
+#define __EM_USBTYPES_H
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE ) || defined( USB_HOST )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+/* Limits imposed by the USB peripheral */
+#define NP_RX_QUE_DEPTH       8
+#define HP_RX_QUE_DEPTH       8
+#define MAX_XFER_LEN          524287L         /* 2^19 - 1 bytes             */
+#define MAX_PACKETS_PR_XFER   1023            /* 2^10 - 1 packets           */
+#if defined( _USB_DIEPTXF6_MASK )
+  #define MAX_NUM_TX_FIFOS      6             /* In addition to EP0 Tx FIFO */
+  #define MAX_NUM_IN_EPS        6             /* In addition to EP0         */
+  #define MAX_NUM_OUT_EPS       6             /* In addition to EP0         */
+  #define MAX_DEVICE_FIFO_SIZE_INWORDS 512U
+#else
+  #define MAX_NUM_TX_FIFOS      3             /* In addition to EP0 Tx FIFO */
+  #define MAX_NUM_IN_EPS        3             /* In addition to EP0         */
+  #define MAX_NUM_OUT_EPS       3             /* In addition to EP0         */
+  #define MAX_DEVICE_FIFO_SIZE_INWORDS 384U
+#endif
+#define MIN_EP_FIFO_SIZE_INWORDS  16U         /* Unit is words (32bit)      */
+#define MIN_EP_FIFO_SIZE_INBYTES  64U         /* Unit is bytes (8bit)       */
+
+/* For MCU's without USB host capability. */
+#if !defined( USB_ROUTE_VBUSENPEN )
+#define USB_VBUS_SWITCH_NOT_PRESENT
+#endif
+
+/* Limit imposed by the USB standard */
+#define MAX_USB_EP_NUM      15
+
+#if defined( USB_DEVICE )
+  /* Check power saving modes. */
+  #ifndef USB_PWRSAVE_MODE
+    /* Default powersave-mode is OFF. */
+    #define USB_PWRSAVE_MODE  USB_PWRSAVE_MODE_OFF
+  #else
+    #if ( USB_PWRSAVE_MODE                                               &  \
+          ~( USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ONVBUSOFF |      \
+             USB_PWRSAVE_MODE_ENTEREM2                                 )    )
+      #error "Illegal USB powersave mode."
+    #endif
+  #endif /* ifndef USB_PWRSAVE_MODE */
+
+  /* Check power saving low frequency clock selection. */
+  #ifndef USB_USBC_32kHz_CLK
+    /* Default clock source is LFXO. */
+    #define USB_USBC_32kHz_CLK USB_USBC_32kHz_CLK_LFXO
+  #else
+    #if ( ( USB_USBC_32kHz_CLK != USB_USBC_32kHz_CLK_LFXO  ) &&  \
+          ( USB_USBC_32kHz_CLK != USB_USBC_32kHz_CLK_LFRCO )     )
+      #error "Illegal USB 32kHz powersave clock selection."
+    #endif
+  #endif /* ifndef USB_USBC_32kHz_CLK */
+#endif /* defined( USB_DEVICE ) */
+
+#if defined( USB_HOST )
+  /* Check VBUS overcurrent definitions. */
+  #ifndef USB_VBUSOVRCUR_PORT
+    #define USB_VBUSOVRCUR_PORT       gpioPortE
+    #define USB_VBUSOVRCUR_PIN        2
+    #define USB_VBUSOVRCUR_POLARITY   USB_VBUSOVRCUR_POLARITY_LOW
+  #endif
+#endif
+
+/* Developer mode debugging macro's */
+#if defined( DEBUG_USB_INT_LO )
+  #define DEBUG_USB_INT_LO_PUTS( s )    USB_PUTS( s )
+  #define DEBUG_USB_INT_LO_PUTCHAR( c ) USB_PUTCHAR( c )
+#else
+  #define DEBUG_USB_INT_LO_PUTS( s )
+  #define DEBUG_USB_INT_LO_PUTCHAR( c )
+#endif /* defined( DEBUG_USB_INT_LO ) */
+
+#if defined( DEBUG_USB_INT_HI )
+  #define DEBUG_USB_INT_HI_PUTS( s )    USB_PUTS( s )
+  #define DEBUG_USB_INT_HI_PUTCHAR( c ) USB_PUTCHAR( c )
+#else
+  #define DEBUG_USB_INT_HI_PUTS( s )
+  #define DEBUG_USB_INT_HI_PUTCHAR( c )
+#endif /* defined( DEBUG_USB_INT_HI ) */
+
+#if defined( USB_HOST )
+  #if defined( NUM_APP_TIMERS )
+    #define HOSTPORT_TIMER_INDEX  (NUM_APP_TIMERS)
+  #else
+    #define HOSTPORT_TIMER_INDEX  (0)
+  #endif
+  #define HOSTCH_TIMER_INDEX      (HOSTPORT_TIMER_INDEX + 1 )
+#endif
+
+/* Macros for selecting a hardware timer. */
+#define USB_TIMER0 0
+#define USB_TIMER1 1
+#define USB_TIMER2 2
+#define USB_TIMER3 3
+
+#if defined( USB_HOST )
+#define HCS_NAK       0x01
+#define HCS_STALL     0x02
+#define HCS_XACT      0x04
+#define HCS_TGLERR    0x08
+#define HCS_BABBLE    0x10
+#define HCS_TIMEOUT   0x20
+#define HCS_COMPLETED 0x40
+#define HCS_RETRY     0x80
+#endif
+
+#if defined( USB_DEVICE )
+typedef enum
+{
+  D_EP_IDLE          = 0,
+  D_EP_TRANSMITTING  = 1,
+  D_EP_RECEIVING     = 2,
+  D_EP0_IN_STATUS    = 3,
+  D_EP0_OUT_STATUS   = 4
+} USBD_EpState_TypeDef;
+
+typedef struct
+{
+  bool                        in;
+  uint8_t                     zlp;
+  uint8_t                     num;
+  uint8_t                     addr;
+  uint8_t                     type;
+  uint8_t                     txFifoNum;
+  uint8_t                     *buf;
+  uint16_t                    packetSize;
+  uint16_t                    mask;
+  uint32_t                    remaining;
+  uint32_t                    xferred;
+  uint32_t                    hwXferSize;
+  uint32_t                    fifoSize;
+  USBD_EpState_TypeDef        state;
+  USB_XferCompleteCb_TypeDef  xferCompleteCb;
+} USBD_Ep_TypeDef;
+
+typedef struct
+{
+  USB_Setup_TypeDef                     *setup;
+  USB_Setup_TypeDef                     setupPkt[3];
+  uint8_t                               configurationValue; /* Must be DWORD aligned */
+  bool                                  remoteWakeupEnabled;
+  uint8_t                               numberOfStrings;
+  uint8_t                               numberOfInterfaces;
+  USBD_State_TypeDef                    state;
+  USBD_State_TypeDef                    savedState;
+  USBD_State_TypeDef                    lastState;
+  const USB_DeviceDescriptor_TypeDef    *deviceDescriptor;
+  const USB_ConfigurationDescriptor_TypeDef *configDescriptor;
+  const void * const                    *stringDescriptors;
+  const USBD_Callbacks_TypeDef          *callbacks;
+  USBD_Ep_TypeDef                       ep[ NUM_EP_USED + 1 ];
+  uint8_t                               inEpAddr2EpIndex[  MAX_USB_EP_NUM + 1 ];
+  uint8_t                               outEpAddr2EpIndex[ MAX_USB_EP_NUM + 1 ];
+  uint32_t                              ep0MpsCode;
+} USBD_Device_TypeDef;
+#endif /* defined( USB_DEVICE ) */
+
+#if defined( USB_HOST )
+typedef enum
+{
+  H_PORT_DISCONNECTED         = 0,
+  H_PORT_CONNECTED_DEBOUNCING = 1,
+  H_PORT_CONNECTED_RESETTING  = 2,
+  H_PORT_CONNECTED            = 3,
+  H_PORT_OVERCURRENT          = 4
+} USBH_PortState_TypeDef;
+
+typedef struct
+{
+  int   debounceTime;
+  int   resetTime;
+} USBH_AttachTiming_TypeDef;
+
+typedef struct
+{
+  uint8_t                 *buf;
+  int                     errorCnt;
+  uint32_t                remaining;
+  uint32_t                xferred;
+  uint32_t                hwXferSize;
+  uint8_t                 status;
+  bool                    idle;
+  USBH_Ep_TypeDef         *ep;
+} USBH_Hc_TypeDef;
+#endif /* defined( USB_HOST ) */
+
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
+#endif /* __EM_USBTYPES_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/inc/usbconfig.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,88 @@
+/***************************************************************************//**
+ * @file usbconfig.h
+ * @brief USB protocol stack library, application supplied configuration options.
+ * @version 3.20.12
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef __USBCONFIG_H
+#define __USBCONFIG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Compile stack for device mode. */
+#define USB_DEVICE
+
+/* Maximum number of endpoint used, EP0 excluded. If you change this, you must
+   also change USBEndpoints_EFM32.h to match. */
+#define NUM_EP_USED 6
+
+/* Power management modes. The following can be or'd toghether. See comments in
+   em_usbd.c under "Energy-saving modes" for more details.
+
+   USB_PWRSAVE_MODE_ONSUSPEND  Set USB peripheral in low power mode on suspend
+
+   USB_PWRSAVE_MODE_ONVBUSOFF  Set USB peripheral in low power mode when not
+   attached to a host. While this mode assumes that the internal voltage regulator
+   is used and that the VREGI pin of the chip is connected to VBUS it should
+   be safe to use given that VREGOSEN is always enabled. If you disable VREGOSEN
+   you must turn this off.
+
+   USB_PWRSAVE_MODE_ENTEREM2  Enter EM2 when USB peripheral is in low power mode.
+   On Mbed this allows the sleep() and deepsleep() calls to enter EM2, but
+   does not automatically enter any sleep states. Entering EM1 is always allowed.
+
+   Note for Happy Gecko, errata USB_E111: Entering EM2 when both the system clock
+   (HFCLK) and the USB core clock (USBCCLK) is running on USHFRCO will result in
+   a lock-up.
+*/
+#define USB_PWRSAVE_MODE  (USB_PWRSAVE_MODE_ONSUSPEND|USB_PWRSAVE_MODE_ONVBUSOFF|USB_PWRSAVE_MODE_ENTEREM2)
+
+/* Use dynamic memory to allocate rx/tx buffers in the HAL. Saves memory
+   as buffers are only allocated for used endpoints. The system malloc
+   must return memory that is aligned by 4.
+
+   Note: if you disable this, using isochronous endpoints with packet
+   sizes that are larger than the maximum for other EP types (64) will
+   not work. */
+#define USB_USE_DYNAMIC_MEMORY
+
+/* When the USB peripheral is set in low power mode, it must be clocked by a 32kHz
+   clock. Both LFXO and LFRCO can be used, but only LFXO guarantee USB specification
+   compliance. */
+#define USB_USBC_32kHz_CLK   USB_USBC_32kHz_CLK_LFXO
+
+/* Uncomment to get some debugging information. Default value for USER_PUTCHAR
+   should work for SiLabs Gecko boards. Printf requires a working retarget
+   implementation for write(). */
+//#define DEBUG_USB_API
+//#define USB_USE_PRINTF
+//#define USER_PUTCHAR   ITM_SendChar
+//#define DEBUG_USB_INT_HI
+//#define DEBUG_USB_INT_LO
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __USBCONFIG_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbd.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,1438 @@
+/**************************************************************************//**
+ * @file em_usbd.c
+ * @brief USB protocol stack library, device API.
+ * @version 3.20.14
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE )
+
+#include "em_cmu.h"
+#include "em_usbtypes.h"
+#include "em_usbhal.h"
+#include "em_usbd.h"
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+static USBD_Device_TypeDef device;
+USBD_Device_TypeDef *dev = &device;
+
+static uint32_t totalRxFifoSize = 0, totalTxFifoSize = 0;
+static int numEps = 0;
+static int txFifoNum = 1;
+
+static void USBD_ResetEndpoints(void);
+extern USB_Status_TypeDef USBDHAL_ReconfigureFifos( uint32_t totalRxFifoSize,
+                                                    uint32_t totalTxFifoSize );
+#ifndef __MBED__
+static const char *stateNames[] =
+{
+  [ USBD_STATE_NONE       ] = "NONE      ",
+  [ USBD_STATE_ATTACHED   ] = "ATTACHED  ",
+  [ USBD_STATE_POWERED    ] = "POWERED   ",
+  [ USBD_STATE_DEFAULT    ] = "DEFAULT   ",
+  [ USBD_STATE_ADDRESSED  ] = "ADDRESSED ",
+  [ USBD_STATE_CONFIGURED ] = "CONFIGURED",
+  [ USBD_STATE_SUSPENDED  ] = "SUSPENDED ",
+  [ USBD_STATE_LASTMARKER ] = "UNDEFINED "
+};
+#endif
+
+/** @endcond */
+
+/***************************************************************************//**
+ * @brief
+ *   Abort all pending transfers.
+ *
+ * @details
+ *   Aborts transfers for all endpoints currently in use. Pending
+ *   transfers on the default endpoint (EP0) are not aborted.
+ ******************************************************************************/
+void USBD_AbortAllTransfers( void )
+{
+  INT_Disable();
+  USBDHAL_AbortAllTransfers( USB_STATUS_EP_ABORTED );
+  INT_Enable();
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Abort a pending transfer on a specific endpoint.
+ *
+ * @param[in] epAddr
+ *   The address of the endpoint to abort.
+ ******************************************************************************/
+int USBD_AbortTransfer( int epAddr )
+{
+  USB_XferCompleteCb_TypeDef callback;
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  if ( ep == NULL )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_AbortTransfer(), Illegal endpoint" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( ep->num == 0 )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_AbortTransfer(), Illegal endpoint" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  INT_Disable();
+  if ( ep->state == D_EP_IDLE )
+  {
+    INT_Enable();
+    return USB_STATUS_OK;
+  }
+
+  USBD_AbortEp( ep );
+
+  ep->state = D_EP_IDLE;
+  if ( ep->xferCompleteCb )
+  {
+    callback = ep->xferCompleteCb;
+    ep->xferCompleteCb = NULL;
+
+    if ( ( dev->lastState == USBD_STATE_CONFIGURED ) &&
+         ( dev->state     == USBD_STATE_ADDRESSED  )    )
+    {
+      USBDHAL_DeactivateEp( ep );
+    }
+
+    DEBUG_TRACE_ABORT( USB_STATUS_EP_ABORTED );
+    callback( USB_STATUS_EP_ABORTED, ep->xferred, ep->remaining );
+  }
+
+  INT_Enable();
+  return USB_STATUS_OK;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Start USB device operation.
+ *
+ * @details
+ *   Device operation is started by connecting a pullup resistor on the
+ *   appropriate USB data line.
+ ******************************************************************************/
+void USBD_Connect( void )
+{
+  INT_Disable();
+  USBDHAL_Connect();
+  INT_Enable();
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Stop USB device operation.
+ *
+ * @details
+ *   Device operation is stopped by disconnecting the pullup resistor from the
+ *   appropriate USB data line. Often referred to as a "soft" disconnect.
+ ******************************************************************************/
+void USBD_Disconnect( void )
+{
+  INT_Disable();
+  USBDHAL_Disconnect();
+  INT_Enable();
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Check if an endpoint is busy doing a transfer.
+ *
+ * @param[in] epAddr
+ *   The address of the endpoint to check.
+ *
+ * @return
+ *   True if endpoint is busy, false otherwise.
+ ******************************************************************************/
+bool USBD_EpIsBusy( int epAddr )
+{
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  if ( ep == NULL )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_EpIsBusy(), Illegal endpoint" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( ep->state == D_EP_IDLE )
+    return false;
+
+  return true;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Get current USB device state.
+ *
+ * @return
+ *   Device USB state. See @ref USBD_State_TypeDef.
+ ******************************************************************************/
+USBD_State_TypeDef USBD_GetUsbState( void )
+{
+  return dev->state;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Get a string naming a device USB state.
+ *
+ * @param[in] state
+ *   Device USB state. See @ref USBD_State_TypeDef.
+ *
+ * @return
+ *   State name string pointer.
+ ******************************************************************************/
+const char *USBD_GetUsbStateName( USBD_State_TypeDef state )
+{
+  if ( state > USBD_STATE_LASTMARKER )
+    state = USBD_STATE_LASTMARKER;
+
+#ifndef __MBED__
+  return stateNames[ state ];
+#else
+  return NULL;
+#endif
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Initializes USB device hardware and internal protocol stack data structures,
+ *   then connects the data-line (D+ or D-) pullup resistor to signal host that
+ *   enumeration can begin.
+ *
+ * @note
+ *   You may later use @ref USBD_Disconnect() and @ref USBD_Connect() to force
+ *   reenumeration.
+ *
+ * @param[in] p
+ *   Pointer to device initialization struct. See @ref USBD_Init_TypeDef.
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+int USBD_Init( const USBD_Init_TypeDef *p )
+{
+  USBD_Ep_TypeDef *ep;
+
+#if !defined( USB_CORECLK_HFRCO ) || !defined( CMU_OSCENCMD_USHFRCOEN )
+  /* Devices supporting crystal-less USB can use HFRCO or HFXO as core clock. */
+  /* All other devices must use HFXO as core clock.                           */
+  if ( CMU_ClockSelectGet( cmuClock_HF ) != cmuSelect_HFXO )
+  {
+    CMU_ClockSelectSet( cmuClock_HF, cmuSelect_HFXO );
+  }
+#endif
+
+#if !defined( CMU_OSCENCMD_USHFRCOEN )
+#if ( USB_USBC_32kHz_CLK == USB_USBC_32kHz_CLK_LFXO )
+  CMU_OscillatorEnable(cmuOsc_LFXO, true, false);
+#else
+  CMU_OscillatorEnable(cmuOsc_LFRCO, true, false);
+#endif
+
+#else
+  CMU_ClockEnable(cmuClock_CORELE, true);
+  /* LFC clock is needed to detect USB suspend when LEMIDLE is activated. */
+#if ( USB_USBC_32kHz_CLK == USB_USBC_32kHz_CLK_LFXO )
+  CMU_ClockSelectSet(cmuClock_LFC, cmuSelect_LFXO);
+#else
+  CMU_ClockSelectSet(cmuClock_LFC, cmuSelect_LFRCO);
+#endif
+  CMU_ClockEnable(cmuClock_USBLE, true);
+#endif
+
+  USBTIMER_Init();
+
+  memset( dev, 0, sizeof( USBD_Device_TypeDef ) );
+
+  dev->setup                = dev->setupPkt;
+  dev->state                = USBD_STATE_LASTMARKER;
+  dev->savedState           = USBD_STATE_NONE;
+  dev->lastState            = USBD_STATE_NONE;
+  dev->callbacks            = p->callbacks;
+  dev->remoteWakeupEnabled  = false;
+
+  /* Initialize EP0 */
+
+  ep                 = &dev->ep[ 0 ];
+  ep->in             = false;
+  ep->buf            = NULL;
+  ep->num            = 0;
+  ep->mask           = 1;
+  ep->addr           = 0;
+  ep->type           = USB_EPTYPE_CTRL;
+  ep->txFifoNum      = 0;
+
+  /* FIXME! */
+  ep->packetSize     = 64;
+  dev->ep0MpsCode = _USB_DOEP0CTL_MPS_64B;
+
+  ep->remaining      = 0;
+  ep->xferred        = 0;
+  ep->state          = D_EP_IDLE;
+  ep->xferCompleteCb = NULL;
+  ep->fifoSize       = ep->packetSize / 4;
+
+  totalTxFifoSize = ep->fifoSize * p->bufferingMultiplier[ 0 ];
+  totalRxFifoSize = (ep->fifoSize + 1) * p->bufferingMultiplier[ 0 ];
+
+  /* Rx-FIFO size: SETUP packets : 4*n + 6    n=#CTRL EP's
+   *               GOTNAK        : 1
+   *               Status info   : 2*n        n=#OUT EP's (EP0 included) in HW
+   */
+  totalRxFifoSize += 10 + 1 + ( 2 * (MAX_NUM_OUT_EPS + 1) );
+
+  INT_Disable();
+
+  /* Enable USB clock */
+  CMU->HFCORECLKEN0 |= CMU_HFCORECLKEN0_USB | CMU_HFCORECLKEN0_USBC;
+
+#if defined( CMU_OSCENCMD_USHFRCOEN )
+  CMU->USHFRCOCONF = CMU_USHFRCOCONF_BAND_48MHZ;
+  CMU_ClockSelectSet( cmuClock_USBC, cmuSelect_USHFRCO );
+
+  /* Enable USHFRCO Clock Recovery mode. */
+  CMU->USBCRCTRL |= CMU_USBCRCTRL_EN;
+
+  /* Turn on Low Energy Mode (LEM) features. */
+  USB->CTRL = USB_CTRL_LEMOSCCTRL_GATE
+              | USB_CTRL_LEMIDLEEN
+              | USB_CTRL_LEMPHYCTRL;
+#else
+  CMU_ClockSelectSet( cmuClock_USBC, cmuSelect_HFCLK );
+#endif
+
+  USBHAL_DisableGlobalInt();
+
+  if ( USBDHAL_CoreInit( totalRxFifoSize, totalTxFifoSize ) == USB_STATUS_OK )
+  {
+    USBDHAL_EnableUsbResetAndSuspendInt();
+    USBHAL_EnableGlobalInt();
+    NVIC_ClearPendingIRQ( USB_IRQn );
+    NVIC_EnableIRQ( USB_IRQn );
+  }
+  else
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Init(), FIFO setup error" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF )
+  if ( USBHAL_VbusIsOn() )
+  {
+    USBD_SetUsbState( USBD_STATE_POWERED );
+  }
+  else
+#endif
+  {
+    USBD_SetUsbState( USBD_STATE_NONE );
+  }
+
+  INT_Enable();
+  return USB_STATUS_OK;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Start a read (OUT) transfer on an endpoint.
+ *
+ * @note
+ *   The transfer buffer length must be a multiple of 4 bytes in length and
+ *   WORD (4 byte) aligned. When allocating the buffer, round buffer length up.
+ *   If it is possible that the host will send more data than your device
+ *   expects, round buffer size up to the next multiple of maxpacket size.
+ *
+ * @param[in] epAddr
+ *   Endpoint address.
+ *
+ * @param[in] data
+ *   Pointer to transfer data buffer.
+ *
+ * @param[in] byteCount
+ *   Transfer length.
+ *
+ * @param[in] callback
+ *   Function to be called on transfer completion. Supply NULL if no callback
+ *   is needed. See @ref USB_XferCompleteCb_TypeDef.
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+int USBD_Read( int epAddr, void *data, int byteCount,
+               USB_XferCompleteCb_TypeDef callback )
+{
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  USB_PRINTF("USBD: Read addr %x, data %p, size %d, cb 0x%lx\n",
+             epAddr, data, byteCount, (uint32_t)callback);
+
+  if ( ep == NULL )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_Read(), Illegal endpoint" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( (   byteCount > MAX_XFER_LEN                           ) ||
+       ( ( byteCount / ep->packetSize ) > MAX_PACKETS_PR_XFER )    )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_Read(), Illegal transfer size" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( (uint32_t)data & 3 )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_Read(), Misaligned data buffer" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  INT_Disable();
+  if ( USBDHAL_EpIsStalled( ep ) )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Read(), Endpoint is halted" );
+    return USB_STATUS_EP_STALLED;
+  }
+
+  if ( ep->state != D_EP_IDLE )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Read(), Endpoint is busy" );
+    return USB_STATUS_EP_BUSY;
+  }
+
+  if ( ( ep->num > 0 ) && ( USBD_GetUsbState() != USBD_STATE_CONFIGURED ) )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Read(), Device not configured" );
+    return USB_STATUS_DEVICE_UNCONFIGURED;
+  }
+
+  ep->buf       = (uint8_t*)data;
+  ep->remaining = byteCount;
+  ep->xferred   = 0;
+
+  if ( ep->num == 0 )
+  {
+    ep->in = false;
+  }
+  else if ( ep->in != false )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Read(), Illegal EP direction" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  ep->state          = D_EP_RECEIVING;
+  ep->xferCompleteCb = callback;
+
+  USBD_ArmEp( ep );
+  INT_Enable();
+  return USB_STATUS_OK;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Perform a remote wakeup signalling sequence.
+ *
+ * @note
+ *   It is the responsibility of the application to ensure that remote wakeup
+ *   is not attempted before the device has been suspended for at least 5
+ *   miliseconds. This function should not be called from within an interrupt
+ *   handler.
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+int USBD_RemoteWakeup( void )
+{
+  INT_Disable();
+
+  if ( ( dev->state != USBD_STATE_SUSPENDED ) ||
+       ( dev->remoteWakeupEnabled == false  )    )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_RemoteWakeup(), Illegal remote wakeup" );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  USBDHAL_SetRemoteWakeup();
+  INT_Enable();
+  USBTIMER_DelayMs( 10 );
+  INT_Disable();
+  USBDHAL_ClearRemoteWakeup();
+  INT_Enable();
+  return USB_STATUS_OK;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Check if it is ok to enter energy mode EM2.
+ *
+ * @note
+ *   Before entering EM2 both the USB hardware and the USB stack must be in a
+ *   certain state, this function checks if all conditions for entering EM2
+ *   is met.
+ *   Refer to the @ref usb_device_powersave section for more information.
+ *
+ * @return
+ *   True if ok to enter EM2, false otherwise.
+ ******************************************************************************/
+bool USBD_SafeToEnterEM2( void )
+{
+#if ( USB_PWRSAVE_MODE )
+  return USBD_poweredDown ? true : false;
+#else
+  return false;
+#endif
+}
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+void USBD_SetUsbState( USBD_State_TypeDef newState )
+{
+  USBD_State_TypeDef currentState;
+
+  currentState = dev->state;
+  if ( newState == USBD_STATE_SUSPENDED )
+  {
+    dev->savedState = currentState;
+  }
+
+  dev->lastState = dev->state;
+  dev->state = newState;
+
+  if ( ( dev->callbacks->usbStateChange ) &&
+       ( currentState != newState       )    )
+  {
+    /* When we transition to a state "lower" than CONFIGURED
+     * we must reset the endpoint data
+     */
+    if ( (dev->lastState == USBD_STATE_CONFIGURED ||
+          dev->lastState == USBD_STATE_SUSPENDED ) &&
+         dev->state < USBD_STATE_CONFIGURED )
+    {
+      USBD_ResetEndpoints();
+    }
+
+    dev->callbacks->usbStateChange( currentState, newState );
+  }
+}
+
+/** @endcond */
+
+/***************************************************************************//**
+ * @brief
+ *   Set an endpoint in the stalled (halted) state.
+ *
+ * @param[in] epAddr
+ *   The address of the endpoint to stall.
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+int USBD_StallEp( int epAddr )
+{
+  USB_Status_TypeDef retVal;
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  if ( ep == NULL )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_StallEp(), Illegal request" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( ep->num == 0 )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_StallEp(), Illegal endpoint" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  INT_Disable();
+  retVal = USBDHAL_StallEp( ep );
+  INT_Enable();
+
+  if ( retVal != USB_STATUS_OK )
+  {
+    retVal = USB_STATUS_ILLEGAL;
+  }
+
+  return retVal;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Stop USB device stack operation.
+ *
+ * @details
+ *   The data-line pullup resistor is turned off, USB interrupts are disabled,
+ *   and finally the USB pins are disabled.
+ ******************************************************************************/
+void USBD_Stop( void )
+{
+  USBD_Disconnect();
+  NVIC_DisableIRQ( USB_IRQn );
+  USBHAL_DisableGlobalInt();
+  USBHAL_DisableUsbInt();
+  USBHAL_DisablePhyPins();
+  USBD_SetUsbState( USBD_STATE_NONE );
+  /* Turn off USB clocks. */
+  CMU->HFCORECLKEN0 &= ~(CMU_HFCORECLKEN0_USB | CMU_HFCORECLKEN0_USBC);
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Reset stall state on a stalled (halted) endpoint.
+ *
+ * @param[in] epAddr
+ *   The address of the endpoint to un-stall.
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+int USBD_UnStallEp( int epAddr )
+{
+  USB_Status_TypeDef retVal;
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  if ( ep == NULL )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_UnStallEp(), Illegal request" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( ep->num == 0 )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_UnStallEp(), Illegal endpoint" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  INT_Disable();
+  retVal = USBDHAL_UnStallEp( ep );
+  INT_Enable();
+
+  if ( retVal != USB_STATUS_OK )
+  {
+    retVal = USB_STATUS_ILLEGAL;
+  }
+
+  return retVal;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Start a write (IN) transfer on an endpoint.
+ *
+ * @param[in] epAddr
+ *   Endpoint address.
+ *
+ * @param[in] data
+ *   Pointer to transfer data buffer. This buffer must be WORD (4 byte) aligned.
+ *
+ * @param[in] byteCount
+ *   Transfer length.
+ *
+ * @param[in] callback
+ *   Function to be called on transfer completion. Supply NULL if no callback
+ *   is needed. See @ref USB_XferCompleteCb_TypeDef.
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+int USBD_Write( int epAddr, void *data, int byteCount,
+                USB_XferCompleteCb_TypeDef callback )
+{
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  USB_PRINTF("USBD: Write addr %x, data %p, size %d, cb 0x%lx\n",
+             epAddr, data, byteCount, (uint32_t)callback);
+
+  if ( ep == NULL )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_Write(), Illegal endpoint" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( (   byteCount > MAX_XFER_LEN                           ) ||
+       ( ( byteCount / ep->packetSize ) > MAX_PACKETS_PR_XFER )    )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_Write(), Illegal transfer size" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  if ( (uint32_t)data & 3 )
+  {
+    DEBUG_USB_API_PUTS( "\nUSBD_Write(), Misaligned data buffer" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  INT_Disable();
+  if ( USBDHAL_EpIsStalled( ep ) )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Write(), Endpoint is halted" );
+    return USB_STATUS_EP_STALLED;
+  }
+
+  if ( ep->state != D_EP_IDLE )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Write(), Endpoint is busy" );
+    return USB_STATUS_EP_BUSY;
+  }
+
+  if ( ( ep->num > 0 ) && ( USBD_GetUsbState() != USBD_STATE_CONFIGURED ) )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Write(), Device not configured" );
+    return USB_STATUS_DEVICE_UNCONFIGURED;
+  }
+
+  ep->buf       = (uint8_t*)data;
+  ep->remaining = byteCount;
+  ep->xferred   = 0;
+
+  if ( ep->num == 0 )
+  {
+    ep->in = true;
+  }
+  else if ( ep->in != true )
+  {
+    INT_Enable();
+    DEBUG_USB_API_PUTS( "\nUSBD_Write(), Illegal EP direction" );
+    EFM_ASSERT( false );
+    return USB_STATUS_ILLEGAL;
+  }
+
+  ep->state          = D_EP_TRANSMITTING;
+  ep->xferCompleteCb = callback;
+
+  USBD_ArmEp( ep );
+  INT_Enable();
+  return USB_STATUS_OK;
+}
+
+int USBD_SetAddress(uint8_t addr)
+{
+  int retVal = USB_STATUS_REQ_ERR;
+
+  if ( dev->state == USBD_STATE_DEFAULT )
+  {
+    if ( addr != 0 )
+    {
+      USBD_SetUsbState( USBD_STATE_ADDRESSED );
+    }
+    USBDHAL_SetAddr( addr );
+    retVal = USB_STATUS_OK;
+  }
+  else if ( dev->state == USBD_STATE_ADDRESSED )
+  {
+    if ( addr == 0 )
+    {
+      USBD_SetUsbState( USBD_STATE_DEFAULT );
+    }
+    USBDHAL_SetAddr( addr );
+    retVal = USB_STATUS_OK;
+  }
+
+  return retVal;
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Query the stall state of an endpoint
+ *
+ * @param[in] epAddr
+ *   The address of the endpoint to query.
+ *
+ * @return
+ *   True if endpoint is stalled, false otherwise
+ ******************************************************************************/
+int USBD_EpIsStalled(int epAddr)
+{
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  if( !ep )
+  {
+    return false;
+  }
+
+  return USBDHAL_EpIsStalled(ep);
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Reset (remove) all client endpoints
+ *
+ * @details
+ *   Removes client endpoints, and resets the RX/TX fifos. No endpoints
+ *   other than EP0 can be used until added with @ref USBD_AddEndpoint.
+ ******************************************************************************/
+static void USBD_ResetEndpoints(void)
+{
+  USBD_Ep_TypeDef *ep = &dev->ep[0];
+
+  numEps = 0;
+  txFifoNum = 1;
+
+  totalTxFifoSize  = ep->fifoSize * 1;
+  totalRxFifoSize  = (ep->fifoSize + 1) * 1;
+  totalRxFifoSize += 10 + 1 + ( 2 * (MAX_NUM_OUT_EPS + 1) );
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Add a new endpoint
+ *
+ * @param[in] epAddr
+ *   Endpoint address
+ *
+ * @param[in] transferType
+ *   Endpoint type, one of @ref USB_EPTYPE_BULK, @ref USB_EPTYPE_INTR or
+ *   @ref USB_EPTYPE_ISOC.
+ *
+ * @param[in] maxPacketSize
+ *   Maximum packet size of the new endpoint, in bytes
+ *
+ * @param[in] bufferMult
+ *   FIFO buffer size multiplier
+ *
+ * @return
+ *   @ref USB_STATUS_OK on success, else an appropriate error code.
+ ******************************************************************************/
+int USBD_AddEndpoint(int epAddr, int transferType,
+                     int maxPacketSize, int bufferMult)
+{
+  USBD_Ep_TypeDef *ep;
+
+  numEps++;
+
+  ep                 = &dev->ep[ numEps ];
+  ep->in             = ( epAddr & USB_SETUP_DIR_MASK ) != 0;
+  ep->buf            = NULL;
+  ep->addr           = epAddr;
+  ep->num            = ep->addr & USB_EPNUM_MASK;
+  ep->mask           = 1 << ep->num;
+  ep->type           = transferType;
+  ep->packetSize     = maxPacketSize;
+  ep->remaining      = 0;
+  ep->xferred        = 0;
+  ep->state          = D_EP_IDLE;
+  ep->xferCompleteCb = NULL;
+
+  if ( ep->in )
+  {
+    ep->txFifoNum = txFifoNum++;
+    ep->fifoSize = ( ( ep->packetSize + 3 ) / 4 ) * bufferMult;
+    dev->inEpAddr2EpIndex[ ep->num ] = numEps;
+    totalTxFifoSize += ep->fifoSize;
+
+    if ( ep->num > MAX_NUM_IN_EPS )
+    {
+      DEBUG_USB_API_PUTS( "\nUSBD_AddEndpoint(), Illegal IN EP address" );
+      EFM_ASSERT( false );
+      return USB_STATUS_ILLEGAL;
+    }
+  }
+  else
+  {
+    ep->fifoSize = ( ( ( ep->packetSize + 3 ) / 4 ) + 1 ) * bufferMult;
+    dev->outEpAddr2EpIndex[ ep->num ] = numEps;
+    totalRxFifoSize += ep->fifoSize;
+
+    if ( ep->num > MAX_NUM_OUT_EPS )
+    {
+      DEBUG_USB_API_PUTS( "\nUSBD_AddEndpoint(), Illegal OUT EP address" );
+      EFM_ASSERT( false );
+      return USB_STATUS_ILLEGAL;
+    }
+  }
+
+  USB_PRINTF("USBD: Added endpoint %d to slot %d, in %d, addr 0x%x, type %d, ps %d, fifo %ld (total tx %ld, rx %ld)\n",
+             ep->num, numEps, ep->in, ep->addr, ep->type, ep->packetSize, ep->fifoSize,
+             totalTxFifoSize, totalRxFifoSize);
+
+  INT_Disable();
+#if defined( CMU_OSCENCMD_USHFRCOEN )
+  /* Happy Gecko workaround: disable LEM GATE mode if using ISOC endpoints. */
+  if ( transferType == USB_EPTYPE_ISOC )
+  {
+      USB->CTRL = (USB->CTRL & ~_USB_CTRL_LEMOSCCTRL_MASK) | USB_CTRL_LEMOSCCTRL_NONE;
+  }
+#endif
+
+  int ret = USBDHAL_ReconfigureFifos(totalRxFifoSize, totalTxFifoSize);
+  INT_Enable();
+
+  if( ret != USB_STATUS_OK ) {
+    return ret;
+  }
+
+  USBDHAL_ActivateEp(ep, false);
+
+  return USB_STATUS_OK;
+}
+
+
+/***************************************************************************//**
+ * @brief
+ *   Set an endpoint0 in the stalled (halted) state.
+ *
+ * @details
+ *   Temporarily stalls endpoint 0. Used to signal a failure to respond to
+ *   the host's setup packet.
+ ******************************************************************************/
+void USBD_StallEp0()
+{
+    int const epAddr = 0;
+    USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+    ep->in = true;
+    USBDHAL_StallEp( ep ); /* Stall Ep0 IN */
+    ep->in = false; /* OUT for next SETUP */
+    USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */
+#if !defined( USB_DOEP0INT_STUPPKTRCVD )
+    USBDHAL_ReenableEp0Setup( dev ); /* Prepare for next SETUP pkt. */
+#else
+    USBDHAL_StartEp0Setup( dev );
+#endif
+    ep->state = D_EP_IDLE;
+}
+
+/******** THE REST OF THE FILE IS DOCUMENTATION ONLY !**********************//**
+ * @{
+
+@page usb_device USB device stack library
+
+  The source files for the USB device stack resides in the usb directory
+  and follows the naming convention: em_usbd<em>nnn</em>.c/h.
+
+  @li @ref usb_device_intro
+  @li @ref usb_device_api
+  @li @ref usb_device_conf
+  @li @ref usb_device_powersave
+  @li @ref usb_device_example1
+
+
+@n @section usb_device_intro Introduction
+
+  The USB device protocol stack provides an API which makes it possible to
+  create USB devices with a minimum of effort. The device stack supports control,
+  bulk and interrupt transfers.
+
+  The stack is highly configurable to suit various needs, it does also contain
+  useful debugging features together with several demonstration projects to
+  get you started fast.
+
+  We recommend that you read through this documentation, then proceed to build
+  and test a few example projects before you start designing your own device.
+
+@n @section usb_device_api The device stack API
+
+  This section contains brief descriptions of the functions in the API. You will
+  find detailed information on input and output parameters and return values by
+  clicking on the hyperlinked function names. It is also a good idea to study
+  the code in the USB demonstration projects.
+
+  Your application code must include one header file: @em em_usb.h.
+
+  All functions defined in the API can be called from within interrupt handlers.
+
+  The USB stack use a hardware timer to keep track of time. TIMER0 is the
+  default choice, refer to @ref usb_device_conf for other possibilities.
+  Your application must not use the selected timer.
+
+  <b>Pitfalls:</b>@n
+    The USB peripheral will fill your receive buffers in quantities of WORD's
+    (4 bytes). Transmit and receive buffers must be WORD aligned, in
+    addition when allocating storage for receive buffers, round size up to
+    next WORD boundary. If it is possible that the host will send more data
+    than your device expects, round buffer size up to the next multiple of
+    maxpacket size for the relevant endpoint to avoid data corruption.
+
+    Transmit buffers passed to @htmlonly USBD_Write() @endhtmlonly must be
+    statically allocated because @htmlonly USBD_Write() @endhtmlonly only
+    initiates the transfer. When the host decide to actually perform the
+    transfer, your data must be available.
+
+  @n @ref USBD_Init() @n
+    This function is called to register your device and all its properties with
+    the device stack. The application must fill in a @ref USBD_Init_TypeDef
+    structure prior to calling. Refer to @ref DeviceInitCallbacks for the
+    optional callback functions defined within this structure. When this
+    function has been called your device is ready to be enumerated by the USB
+    host.
+
+  @ref USBD_Read(), @ref USBD_Write() @n
+    These functions initiate data transfers.
+    @n @htmlonly USBD_Read() @endhtmlonly initiate a transfer of data @em
+    from host @em to device (an @em OUT transfer in USB terminology).
+    @n @htmlonly USBD_Write() @endhtmlonly initiate a transfer of data @em from
+    device @em to host (an @em IN transfer).
+
+    When the USB host actually performs the transfer, your application will be
+    notified by means of a callback function which you provide (optionally).
+    Refer to @ref TransferCallback for details of the callback functionality.
+
+  @ref USBD_AbortTransfer(), @ref USBD_AbortAllTransfers() @n
+    These functions terminate transfers that are initiated, but has not yet
+    taken place. If a transfer is initiated with @htmlonly USBD_Read()
+    or USBD_Write(), @endhtmlonly but the USB host never actually peform
+    the transfers, these functions will deactivate the transfer setup to make
+    the USB device endpoint hardware ready for new (and potentially) different
+    transfers.
+
+  @ref USBD_Connect(), @ref USBD_Disconnect() @n
+    These functions turns the data-line (D+ or D-) pullup on or off. They can be
+    used to force reenumeration. It's good practice to delay at least one second
+    between @htmlonly USBD_Disconnect() and USBD_Connect() @endhtmlonly
+    to allow the USB host to unload the currently active device driver.
+
+  @ref USBD_EpIsBusy() @n
+    Check if an endpoint is busy.
+
+  @ref USBD_StallEp(), @ref USBD_UnStallEp() @n
+    These functions stalls or un-stalls an endpoint. This functionality may not
+    be needed by your application, but the USB device stack use them in response
+    to standard setup commands SET_FEATURE and CLEAR_FEATURE. They may be useful
+    when implementing some USB classes, e.g. a mass storage device use them
+    extensively.
+
+  @ref USBD_RemoteWakeup() @n
+    Used in SUSPENDED state (see @ref USB_Status_TypeDef) to signal resume to
+    host. It's the applications responsibility to adhere to the USB standard
+    which states that a device can not signal resume before it has been
+    SUSPENDED for at least 5 ms. The function will also check the configuration
+    descriptor defined by the application to see if it is legal for the device
+    to signal resume.
+
+  @ref USBD_GetUsbState() @n
+    Returns the device USB state (see @ref USBD_State_TypeDef). Refer to
+    Figure 9-1. "Device State Diagram" in the USB revision 2.0 specification.
+
+  @ref USBD_GetUsbStateName() @n
+    Returns a text string naming a given USB device state.
+
+  @ref USBD_SafeToEnterEM2() @n
+    Check if it is ok to enter energy mode EM2. Refer to the
+    @ref usb_device_powersave section for more information.
+
+  @n @anchor TransferCallback <b>The transfer complete callback function:</b> @n
+    @n USB_XferCompleteCb_TypeDef() is called when a transfer completes. It is
+    called with three parameters, the status of the transfer, the number of
+    bytes transferred and the number of bytes remaining. It may not always be
+    needed to have a callback on transfer completion, but you should keep in
+    mind that a transfer may be aborted when you least expect it. A transfer
+    will be aborted if host stalls the endpoint, if host resets your device, if
+    host unconfigures your device or if you unplug your device cable and the
+    device is selfpowered.
+    @htmlonly USB_XferCompleteCb_TypeDef() @endhtmlonly is also called if your
+    application use @htmlonly USBD_AbortTransfer() or USBD_AbortAllTransfers()
+    @endhtmlonly calls.
+    @note This callback is called from within an interrupt handler with
+          interrupts disabled.
+
+  @n @anchor DeviceInitCallbacks <b>Optional callbacks passed to the stack via
+    the @ref USBD_Init() function:</b> @n
+    @n These callbacks are all optional, and it is up to the application
+    programmer to decide if the application needs the functionality they
+    provide.
+    @note These callbacks are all called from within an interrupt handler
+          with interrupts disabled.
+
+  USBD_UsbResetCb_TypeDef() is called each time reset signalling is sensed on
+    the USB wire.
+
+  @n USBD_SofIntCb_TypeDef() is called with framenumber as a parameter on
+    each SOF interrupt.
+
+  @n USBD_DeviceStateChangeCb_TypeDef() is called whenever the device state
+    change. Useful for detecting e.g. SUSPENDED state change in order to reduce
+    current consumption of buspowered devices. The USB HID keyboard example
+    project has a good example on how to use this callback.
+
+  @n USBD_IsSelfPoweredCb_TypeDef() is called by the device stack when host
+    queries the device with a standard setup GET_STATUS command to check if the
+    device is currently selfpowered or buspowered. This feature is only
+    applicable on selfpowered devices which also works when only buspower is
+    available.
+
+  @n USBD_SetupCmdCb_TypeDef() is called each time a setup command is
+    received from host. Use this callback to override or extend the default
+    handling of standard setup commands, and to implement class or vendor
+    specific setup commands. The USB HID keyboard example project has a good
+    example on how to use this callback.
+
+  @n <b>Utility functions:</b> @n
+    @n    USB_PUTCHAR() Transmit a single char on the debug serial port.
+    @n @n USB_PUTS() Transmit a zero terminated string on the debug serial port.
+    @n @n USB_PRINTF() Transmit "printf" formated data on the debug serial port.
+    @n @n USB_GetErrorMsgString() Return an error message string for a given
+          error code.
+    @n @n USB_PrintErrorMsgString() Format and print a text string given an
+          error code, prepends an optional user supplied leader string.
+    @n @n USBTIMER_DelayMs() Active wait millisecond delay function. Can also be
+          used inside interrupt handlers.
+    @n @n USBTIMER_DelayUs() Active wait microsecond delay function. Can also be
+          used inside interrupt handlers.
+    @n @n USBTIMER_Init() Initialize the timer system. Called by @htmlonly
+          USBD_Init(), @endhtmlonly but your application must call it again to
+          reinitialize whenever you change the HFPERCLK frequency.
+    @n @n USBTIMER_Start() Start a timer. You can configure the USB device stack
+          to provide any number of timers. The timers have 1 ms resolution, your
+          application is notified of timeout by means of a callback.
+    @n @n USBTIMER_Stop() Stop a timer.
+
+@n @section usb_device_conf Configuring the device stack
+
+  Your application must provide a header file named @em usbconfig.h. This file
+  must contain the following \#define's:@n @n
+  @verbatim
+#define USB_DEVICE       // Compile the stack for device mode.
+#define NUM_EP_USED n    // Your application use 'n' endpoints in
+                         // addition to endpoint 0. @endverbatim
+
+  @n @em usbconfig.h may define the following items: @n @n
+  @verbatim
+#define NUM_APP_TIMERS n // Your application needs 'n' timers
+
+#define DEBUG_USB_API    // Turn on API debug diagnostics.
+
+// Some utility functions in the API needs printf. These
+// functions have "print" in their name. This macro enables
+// these functions.
+#define USB_USE_PRINTF   // Enable utility print functions.
+
+// Define a function for transmitting a single char on the serial port.
+extern int RETARGET_WriteChar(char c);
+#define USER_PUTCHAR  RETARGET_WriteChar
+
+#define USB_TIMER USB_TIMERn  // Select which hardware timer the USB stack
+                              // is allowed to use. Valid values are n=0,1,2...
+                              // corresponding to TIMER0, TIMER1, ...
+                              // If not specified, TIMER0 is used
+
+#define USB_VBUS_SWITCH_NOT_PRESENT  // Hardware does not have a VBUS switch
+
+#define USB_CORECLK_HFRCO   // Devices supporting crystal-less USB can use
+                            // HFRCO as core clock, default is HFXO
+@endverbatim
+
+  @n You are strongly encouraged to start application development with DEBUG_USB_API
+  turned on. When DEBUG_USB_API is turned on and USER_PUTCHAR is defined, useful
+  debugging information will be output on the development kit serial port.
+  Compiling with the DEBUG_EFM_USER flag will also enable all asserts
+  in both @em emlib and in the USB stack. If asserts are enabled and
+  USER_PUTCHAR defined, assert texts will be output on the serial port.
+
+  You application must include @em retargetserial.c if DEBUG_USB_API is defined
+  and @em retargetio.c if USB_USE_PRINTF is defined.
+  These files reside in the @em drivers
+  directory in the software package for your development board. Refer to
+  @ref usb_device_powersave for energy-saving mode configurations.
+
+@n @section usb_device_powersave Energy-saving modes
+
+  The device stack provides two energy saving levels. The first level is to
+  set the USB peripheral in energy saving mode, the next level is to enter
+  Energy Mode 2 (EM2). These energy saving modes can be applied when the device
+  is suspended by the USB host, or when when the device is not connected to a
+  USB host.
+  In addition to this an application can use energy modes EM1 and EM2. There
+  are no restrictions on when EM1 can be entered, EM2 can only be entered
+  when the USB device is suspended or detached from host.
+
+  Energy-saving modes are selected with a \#define in @em usbconfig.h, default
+  selection is to not use any energy saving modes.@n @n
+  @verbatim
+#define USB_PWRSAVE_MODE (USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ENTEREM2)@endverbatim
+
+  There are three flags available, the flags can be or'ed together as shown above.
+
+  <b>\#define USB_PWRSAVE_MODE_ONSUSPEND</b>@n Set USB peripheral in low power
+  mode on suspend.
+
+  <b>\#define USB_PWRSAVE_MODE_ONVBUSOFF</b>@n Set USB peripheral in low power
+  mode when not attached to a host. This mode assumes that the internal voltage
+  regulator is used and that the VREGI pin of the chip is connected to VBUS.
+  This option can not be used with bus-powered devices.
+
+  <b>\#define USB_PWRSAVE_MODE_ENTEREM2</b>@n Enter EM2 when USB peripheral is
+  in low power mode.
+
+  When the USB peripheral is set in low power mode, it must be clocked by a 32kHz
+  clock. Both LFXO and LFRCO can be used, but only LFXO guarantee USB specification
+  compliance. Selection is done with a \#define in @em usbconfig.h.@n @n
+  @verbatim
+#define USB_USBC_32kHz_CLK   USB_USBC_32kHz_CLK_LFXO @endverbatim
+  Two flags are available, <b>USB_USBC_32kHz_CLK_LFXO</b> and
+  <b>USB_USBC_32kHz_CLK_LFRCO</b>. <b>USB_USBC_32kHz_CLK_LFXO</b> is selected
+  by default.
+
+  The USB HID keyboard and Mass Storage device example projects demonstrate
+  different energy-saving modes.
+
+  <b>Example 1:</b>
+  Leave all energy saving to the stack, the device enters EM2 on suspend and
+  when detached from host. @n
+  @verbatim
+In usbconfig.h:
+
+#define USB_PWRSAVE_MODE (USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ONVBUSOFF | USB_PWRSAVE_MODE_ENTEREM2)
+  @endverbatim
+
+  @n <b>Example 2:</b>
+  Let the stack control energy saving in the USB periheral but let your
+  application control energy modes EM1 and EM2. @n
+  @verbatim
+In usbconfig.h:
+
+#define USB_PWRSAVE_MODE (USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ONVBUSOFF)
+
+In application code:
+
+if ( USBD_SafeToEnterEM2() )
+  EMU_EnterEM2(true);
+else
+  EMU_EnterEM1(); @endverbatim
+
+@n @section usb_device_example1 Vendor unique device example application
+
+  This example represents the most simple USB device imaginable. It's purpose
+  is to turn user LED's on or off under control of vendor unique setup commands.
+  The device will rely on @em libusb device driver on the host, a host
+  application @em EFM32-LedApp.exe is bundled with the example.
+
+  The main() is really simple ! @n @n
+  @verbatim
+#include "em_usb.h"
+
+#include "descriptors.h"
+
+int main( void )
+{
+  BSP_Init(BSP_INIT_DEFAULT); // Initialize DK board register access
+  CMU_ClockSelectSet( cmuClock_HF, cmuSelect_HFXO );
+  BSP_LedsSet(0);             // Turn off all LED's
+
+  ConsoleDebugInit();         // Initialize UART for debug diagnostics
+
+  USB_PUTS( "\nEFM32 USB LED Vendor Unique Device example\n" );
+
+  USBD_Init( &initstruct );   // GO !
+
+  //When using a debugger it is pratical to uncomment the following three
+  //lines to force host to re-enumerate the device.
+
+  //USBD_Disconnect();
+  //USBTIMER_DelayMs( 1000 );
+  //USBD_Connect();
+
+  for (;;) {}
+} @endverbatim
+
+  @n Configure the device stack in <em>usbconfig.h</em>: @n @n
+  @verbatim
+#define USB_DEVICE                        // Compile stack for device mode.
+
+// **************************************************************************
+**                                                                         **
+** Specify number of endpoints used (in addition to EP0).                  **
+**                                                                         **
+*****************************************************************************
+#define NUM_EP_USED 0                     // EP0 is the only endpoint used.
+
+// **************************************************************************
+**                                                                         **
+** Configure serial port debug output.                                     **
+**                                                                         **
+*****************************************************************************
+// Prototype a function for transmitting a single char on the serial port.
+extern int RETARGET_WriteChar(char c);
+#define USER_PUTCHAR RETARGET_WriteChar
+
+// Enable debug diagnostics from API functions (illegal input params etc.)
+#define DEBUG_USB_API @endverbatim
+
+  @n Define device properties and fill in USB initstruct in
+  <em>descriptors.h</em>: @n @n
+  @verbatim
+EFM32_ALIGN(4)
+static const USB_DeviceDescriptor_TypeDef deviceDesc __attribute__ ((aligned(4))) =
+{
+  .bLength            = USB_DEVICE_DESCSIZE,
+  .bDescriptorType    = USB_DEVICE_DESCRIPTOR,
+  .bcdUSB             = 0x0200,
+  .bDeviceClass       = 0xFF,
+  .bDeviceSubClass    = 0,
+  .bDeviceProtocol    = 0,
+  .bMaxPacketSize0    = USB_FS_CTRL_EP_MAXSIZE,
+  .idVendor           = 0x10C4,
+  .idProduct          = 0x0001,
+  .bcdDevice          = 0x0000,
+  .iManufacturer      = 1,
+  .iProduct           = 2,
+  .iSerialNumber      = 3,
+  .bNumConfigurations = 1
+};
+
+EFM32_ALIGN(4)
+static const uint8_t configDesc[] __attribute__ ((aligned(4)))=
+{
+  // *** Configuration descriptor ***
+  USB_CONFIG_DESCSIZE,            // bLength
+  USB_CONFIG_DESCRIPTOR,          // bDescriptorType
+  USB_CONFIG_DESCSIZE +           // wTotalLength (LSB)
+  USB_INTERFACE_DESCSIZE,
+  (USB_CONFIG_DESCSIZE +          // wTotalLength (MSB)
+  USB_INTERFACE_DESCSIZE)>>8,
+  1,                              // bNumInterfaces
+  1,                              // bConfigurationValue
+  0,                              // iConfiguration
+  CONFIG_DESC_BM_RESERVED_D7 |    // bmAttrib: Self powered
+  CONFIG_DESC_BM_SELFPOWERED,
+  CONFIG_DESC_MAXPOWER_mA( 100 ), // bMaxPower: 100 mA
+
+  // *** Interface descriptor ***
+  USB_INTERFACE_DESCSIZE,         // bLength
+  USB_INTERFACE_DESCRIPTOR,       // bDescriptorType
+  0,                              // bInterfaceNumber
+  0,                              // bAlternateSetting
+  NUM_EP_USED,                    // bNumEndpoints
+  0xFF,                           // bInterfaceClass
+  0,                              // bInterfaceSubClass
+  0,                              // bInterfaceProtocol
+  0,                              // iInterface
+};
+
+STATIC_CONST_STRING_DESC_LANGID( langID, 0x04, 0x09 );
+STATIC_CONST_STRING_DESC( iManufacturer, 'E','n','e','r','g','y',' ',       \
+                                         'M','i','c','r','o',' ','A','S' );
+STATIC_CONST_STRING_DESC( iProduct     , 'V','e','n','d','o','r',' ',       \
+                                         'U','n','i','q','u','e',' ',       \
+                                         'L','E','D',' ',                   \
+                                         'D','e','v','i','c','e' );
+STATIC_CONST_STRING_DESC( iSerialNumber, '0','0','0','0','0','0',           \
+                                         '0','0','1','2','3','4' );
+
+static const void * const strings[] =
+{
+  &langID,
+  &iManufacturer,
+  &iProduct,
+  &iSerialNumber
+};
+
+// Endpoint buffer sizes
+// 1 = single buffer, 2 = double buffering, 3 = tripple buffering ...
+static const uint8_t bufferingMultiplier[ NUM_EP_USED + 1 ] = { 1 };
+
+static const USBD_Callbacks_TypeDef callbacks =
+{
+  .usbReset        = NULL,
+  .usbStateChange  = NULL,
+  .setupCmd        = SetupCmd,
+  .isSelfPowered   = NULL,
+  .sofInt          = NULL
+};
+
+static const USBD_Init_TypeDef initstruct =
+{
+  .deviceDescriptor    = &deviceDesc,
+  .configDescriptor    = configDesc,
+  .stringDescriptors   = strings,
+  .numberOfStrings     = sizeof(strings)/sizeof(void*),
+  .callbacks           = &callbacks,
+  .bufferingMultiplier = bufferingMultiplier
+};  @endverbatim
+
+  @n Now we have to implement vendor unique USB setup commands to control the
+  LED's (see callbacks variable above). Notice that the buffer variable below is
+  statically allocated because @htmlonly USBD_Write() @endhtmlonly only
+  initiates the transfer. When the host actually performs the transfer, the
+  SetupCmd() function will have returned ! @n @n
+
+  @verbatim
+#define VND_GET_LEDS 0x10
+#define VND_SET_LED  0x11
+
+static int SetupCmd( const USB_Setup_TypeDef *setup )
+{
+  int retVal;
+  uint16_t leds;
+  static uint32_t buffer;
+  uint8_t *pBuffer = (uint8_t*)&buffer;
+
+  retVal = USB_STATUS_REQ_UNHANDLED;
+
+  if ( setup->Type == USB_SETUP_TYPE_VENDOR )
+  {
+    switch ( setup->bRequest )
+    {
+      case VND_GET_LEDS:
+      // ********************
+        *pBuffer = BSP_LedsGet() & 0x1F;
+        retVal = USBD_Write( 0, pBuffer, setup->wLength, NULL );
+        break;
+
+      case VND_SET_LED:
+      // ********************
+        leds = DVK_getLEDs() & 0x1F;
+        if ( setup->wValue )
+        {
+          leds |= LED0 << setup->wIndex;
+        }
+        else
+        {
+          leds &= ~( LED0 << setup->wIndex );
+        }
+        BSP_LedsSet( leds );
+        retVal = USB_STATUS_OK;
+        break;
+    }
+  }
+
+  return retVal;
+}@endverbatim
+
+ * @}**************************************************************************/
+
+#endif /* defined( USB_DEVICE ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbdep.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,446 @@
+/**************************************************************************//**
+ * @file em_usbdep.c
+ * @brief USB protocol stack library, USB device endpoint handlers.
+ * @version 3.20.14
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE )
+
+#include "em_usbtypes.h"
+#include "em_usbhal.h"
+#include "em_usbd.h"
+
+#ifdef USB_USE_PRINTF
+static const char *epStatusStr[] = {
+    "IDLE","TRANS","RECV","IN_S","OUT_S"
+};
+#endif
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+/*
+ * USBDEP_Ep0Handler() is called each time a packet has been transmitted
+ * or recieved on the default endpoint.
+ * A state machine navigate us through the phases of a control transfer
+ * according to "chapter 9" in the USB spec.
+ */
+#if !defined( USB_DOEP0INT_STUPPKTRCVD )
+void USBDEP_Ep0Handler( USBD_Device_TypeDef *device )
+{
+  int status;
+  USBD_Ep_TypeDef *ep;
+  static bool statusIn;
+  static uint32_t xferred;
+  static USB_XferCompleteCb_TypeDef callback;
+
+  ep = &device->ep[ 0 ];
+
+#ifdef __MBED__
+
+  (void)xferred;
+  (void)statusIn;
+  (void)status;
+
+  USB_PRINTF("USBDEP: ep0 %s, rem %ld, z %d\n", epStatusStr[ep->state], ep->remaining, ep->zlp);
+
+  if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) )
+  {
+    ep->state = D_EP_IDLE;
+
+    if ( ep->xferCompleteCb )
+    {
+      callback = ep->xferCompleteCb;
+      ep->xferCompleteCb = NULL;
+      callback( USB_STATUS_OK, ep->xferred, ep->remaining );
+    }
+
+    USBDHAL_ReenableEp0Setup(device);
+  }
+  else
+  {
+    device->callbacks->setupCmd(device->setup);
+  }
+
+#else /* not __MBED__ */
+
+  switch ( ep->state )
+  {
+    case D_EP_IDLE:
+      ep->remaining = 0;
+      ep->zlp = 0;
+      callback = NULL;
+      statusIn = false;
+
+      status = USBDCH9_SetupCmd( device );
+
+      if ( status == USB_STATUS_REQ_ERR )
+      {
+        ep->in = true;
+        USBDHAL_StallEp( ep );              /* Stall Ep0 IN                 */
+        ep->in = false;                     /* OUT for next SETUP           */
+        USBDHAL_StallEp( ep );              /* Stall Ep0 OUT                */
+        USBDHAL_ReenableEp0Setup( device ); /* Prepare for next SETUP packet*/
+      }
+      else /* ( Status == USB_STATUS_OK ) */
+      {
+        if ( (ep->state == D_EP_RECEIVING) || (ep->state == D_EP_TRANSMITTING) )
+        {
+          callback = ep->xferCompleteCb;
+        }
+
+        if ( ep->state != D_EP_RECEIVING )
+        {
+          if ( ep->remaining )
+          {
+            /* Data will be sent to host, check if a ZLP must be appended */
+            if ( ( ep->remaining < device->setup->wLength ) &&
+                 ( ep->remaining % ep->packetSize == 0    )    )
+            {
+              ep->zlp = 1;
+            }
+          }
+          else
+          {
+            /* Prepare for next SETUP packet*/
+            USBDHAL_ReenableEp0Setup( device );
+
+            /* No data stage, a ZLP may have been sent. If not, send one */
+
+            xferred = 0;
+            if ( ep->zlp == 0 )
+            {
+              USBD_Write( 0, NULL, 0, NULL );             /* ACK to host */
+              ep->state = D_EP0_IN_STATUS;
+            }
+            else
+            {
+              ep->state = D_EP_IDLE;
+              ep->in = false;                      /* OUT for next SETUP */
+            }
+          }
+        }
+      }
+      break;
+
+    case D_EP_RECEIVING:
+      if ( ep->remaining )
+      {
+        /* There is more data to receive */
+        USBD_ReArmEp0( ep );
+      }
+      else
+      {
+        status = USB_STATUS_OK;
+        if ( callback != NULL )
+        {
+          status = callback( USB_STATUS_OK, ep->xferred, 0 );
+          callback = NULL;
+        }
+
+        if ( status != USB_STATUS_OK )
+        {
+          ep->in = true;
+          USBDHAL_StallEp( ep );              /* Stall Ep0 IN                */
+          ep->in = false;                     /* OUT for next SETUP           */
+          USBDHAL_StallEp( ep );              /* Stall Ep0 OUT                */
+          USBDHAL_ReenableEp0Setup( device ); /* Prepare for next SETUP pkt. */
+          ep->state = D_EP_IDLE;
+        }
+        else /* Everything OK, send a ZLP (ACK) to host */
+        {
+          USBDHAL_ReenableEp0Setup( device );/* Prepare for next SETUP packet*/
+
+          ep->state = D_EP_IDLE;              /* USBD_Write() sets state back*/
+                                              /* to EP_TRANSMITTING          */
+          USBD_Write( 0, NULL, 0, NULL );
+          ep->state = D_EP0_IN_STATUS;
+        }
+      }
+      break;
+
+    case D_EP_TRANSMITTING:
+      if ( ep->remaining )
+      {
+        /* There is more data to transmit */
+        USBD_ReArmEp0( ep );
+      }
+      else
+      {
+        /* All data transferred, is a ZLP packet needed ? */
+        if ( ep->zlp == 1 )
+        {
+          xferred   = ep->xferred;
+          ep->state = D_EP_IDLE;          /* USBD_Write() sets state back */
+                                          /* to EP_TRANSMITTING           */
+          USBD_Write( 0, NULL, 0, NULL ); /* Send ZLP                     */
+          ep->zlp = 2;
+        }
+        else
+        {
+          if ( ep->zlp == 0 )
+          {
+            xferred = ep->xferred;
+          }
+
+          ep->state = D_EP_IDLE;
+          USBD_Read( 0, NULL, 0, NULL );  /* Get ZLP packet (ACK) from host */
+          statusIn = true;
+          ep->state = D_EP0_OUT_STATUS;
+        }
+      }
+      break;
+
+    case D_EP0_IN_STATUS:
+    case D_EP0_OUT_STATUS:
+      if ( statusIn )
+      {
+        USBDHAL_ReenableEp0Setup( device );
+      }
+
+      if ( callback != NULL )
+      {
+        callback( USB_STATUS_OK, xferred, 0 );
+      }
+
+      ep->state = D_EP_IDLE;
+      ep->in = false;                     /* OUT for next SETUP */
+      break;
+
+    default:
+      EFM_ASSERT( false );
+      break;
+  }
+#endif /* __MBED__ */
+}
+#endif
+
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+void USBDEP_Ep0Handler( USBD_Device_TypeDef *device )
+{
+  int status;
+  USBD_Ep_TypeDef *ep;
+  static uint32_t xferred;
+  static USB_XferCompleteCb_TypeDef callback;
+
+#ifdef __MBED__
+
+  (void)xferred;
+  (void)status;
+
+  ep = &device->ep[ 0 ];
+
+  if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) )
+  {
+    ep->state = D_EP_IDLE;
+
+    if ( ep->xferCompleteCb )
+    {
+      callback = ep->xferCompleteCb;
+      ep->xferCompleteCb = NULL;
+      callback( USB_STATUS_OK, ep->xferred, ep->remaining );
+    }
+
+    USBDHAL_StartEp0Setup( dev );
+  }
+  else
+  {
+    device->callbacks->setupCmd(device->setup);
+  }
+
+#else
+
+  ep = &device->ep[ 0 ];
+
+  switch ( ep->state )
+  {
+    case D_EP_IDLE:
+      ep->zlp       = 0;
+      ep->remaining = 0;
+      callback      = NULL;
+
+      status = USBDCH9_SetupCmd( device );
+
+      if ( status == USB_STATUS_REQ_ERR )
+      {
+        ep->in = true;
+        USBDHAL_StallEp( ep );              /* Stall Ep0 IN                 */
+        ep->in = false;                     /* OUT for next SETUP           */
+        USBDHAL_StallEp( ep );              /* Stall Ep0 OUT                */
+        USBDHAL_StartEp0Setup( dev );       /* Prepare for next SETUP packet*/
+      }
+      else /* ( Status == USB_STATUS_OK ) */
+      {
+        if ( (ep->state == D_EP_RECEIVING) || (ep->state == D_EP_TRANSMITTING) )
+        {
+          callback = ep->xferCompleteCb;
+        }
+
+        if ( ep->state != D_EP_RECEIVING )
+        {
+          if ( ep->remaining )
+          {
+            /* Data will be sent to host, check if a ZLP must be appended */
+            if ( ( ep->remaining < device->setup->wLength ) &&
+                 ( ep->remaining % ep->packetSize == 0    )    )
+            {
+              ep->zlp = 1;
+            }
+          }
+          else
+          {
+            /* No data stage, a ZLP may have been sent. If not, send one */
+            xferred = 0;
+            if ( ep->zlp == 0 )
+            {
+              ep->state = D_EP_IDLE;
+              USBD_Write( 0, NULL, 0, NULL );             /* ACK to host */
+              ep->state = D_EP0_IN_STATUS;
+            }
+          }
+        }
+      }
+      break;
+
+    case D_EP_RECEIVING:
+      if ( ep->remaining )
+      {
+        ep->in = false;
+        USBD_ReArmEp0( ep );
+      }
+      else
+      {
+        status = USB_STATUS_OK;
+        if ( callback != NULL )
+        {
+          status = callback( USB_STATUS_OK, ep->xferred, 0 );
+          callback = NULL;
+        }
+
+        if ( status != USB_STATUS_OK )
+        {
+          ep->in = true;
+          USBDHAL_StallEp( ep );              /* Stall Ep0 IN                */
+          ep->in = false;                     /* OUT for next SETUP          */
+          USBDHAL_StallEp( ep );              /* Stall Ep0 OUT               */
+          USBDHAL_StartEp0Setup( dev );       /* Prepare for next SETUP pkt. */
+          ep->state = D_EP_IDLE;
+        }
+        else
+        {
+
+          USBDHAL_StartEp0Setup( dev );      /* Prepare for next SETUP packet*/
+          ep->state = D_EP_IDLE;             /* USBD_Write() sets state back */
+                                             /* to EP_TRANSMITTING           */
+          USBD_Write( 0, NULL, 0, NULL );
+          ep->state = D_EP0_IN_STATUS;
+        }
+      }
+      break;
+
+    case D_EP_TRANSMITTING:
+      if ( ep->remaining )
+      {
+        ep->in = true;
+        USBD_ReArmEp0( ep );
+      }
+      else
+      {
+        if ( ep->zlp == 1 )
+        {
+          xferred   = ep->xferred;
+          ep->state = D_EP_IDLE;          /* USBD_Write() sets state back */
+                                          /* to EP_TRANSMITTING           */
+          USBD_Write( 0, NULL, 0, NULL ); /* Send ZLP                     */
+          ep->zlp = 2;
+        }
+        else
+        {
+          if ( ep->zlp == 0 )
+          {
+            xferred = ep->xferred;
+          }
+
+          ep->state = D_EP_IDLE;
+          USBD_Read( 0, NULL, 0, NULL );  /* Get ZLP packet (ACK) from host */
+          ep->state = D_EP0_OUT_STATUS;
+        }
+      }
+      break;
+
+    case D_EP0_IN_STATUS:
+      if ( ( USB->DOEP0CTL & USB_DOEP0CTL_EPENA ) == 0 )
+      {
+        /* Prepare for more SETUP Packets */
+        USBDHAL_StartEp0Setup( dev );
+      }
+      if ( callback != NULL )
+      {
+        callback( USB_STATUS_OK, xferred, 0 );
+      }
+      ep->state = D_EP_IDLE;
+      ep->in = false;                     /* OUT for next SETUP */
+      break;
+
+    case D_EP0_OUT_STATUS:
+      USBDHAL_StartEp0Setup( dev );       /* Prepare for more SETUP Packets */
+      if ( callback != NULL )
+      {
+        callback( USB_STATUS_OK, xferred, 0 );
+      }
+      ep->state = D_EP_IDLE;
+      ep->in = false;                     /* OUT for next SETUP */
+      break;
+  }
+#endif /* __MBED__ */
+}
+#endif
+
+/*
+ * USBDEP_EpHandler() is called each time a packet has been transmitted
+ * or recieved on an endpoint other than the default endpoint.
+ */
+void USBDEP_EpHandler( uint8_t epAddr )
+{
+  USB_XferCompleteCb_TypeDef callback;
+  USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
+
+  if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) )
+  {
+    ep->state = D_EP_IDLE;
+    if ( ep->xferCompleteCb )
+    {
+      callback = ep->xferCompleteCb;
+      ep->xferCompleteCb = NULL;
+      callback( USB_STATUS_OK, ep->xferred, ep->remaining );
+    }
+  }
+  else
+  {
+    EFM_ASSERT( false );
+  }
+}
+
+/** @endcond */
+
+#endif /* defined( USB_DEVICE ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbdint.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,946 @@
+/**************************************************************************//**
+ * @file em_usbdint.c
+ * @brief USB protocol stack library, USB device peripheral interrupt handlers.
+ * @version 3.20.14
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE )
+
+#include "em_cmu.h"
+#include "em_usbtypes.h"
+#include "em_usbhal.h"
+#include "em_usbd.h"
+
+#ifdef __MBED__
+extern void usbhal_allow_em2(bool em2_allow);
+#endif
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+#define HANDLE_INT( x ) if ( status & x ) { Handle_##x(); status &= ~x; }
+
+static void Handle_USB_GINTSTS_ENUMDONE  ( void );
+static void Handle_USB_GINTSTS_IEPINT    ( void );
+static void Handle_USB_GINTSTS_OEPINT    ( void );
+static void Handle_USB_GINTSTS_RESETDET  ( void );
+static void Handle_USB_GINTSTS_SOF       ( void );
+static void Handle_USB_GINTSTS_USBRST    ( void );
+static void Handle_USB_GINTSTS_USBSUSP   ( void );
+static void Handle_USB_GINTSTS_WKUPINT   ( void );
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+static void HandleOutEpIntr( uint32_t status, USBD_Ep_TypeDef *ep );
+#else
+static void ProcessSetup                 ( void );
+static void ProcessOepData               ( USBD_Ep_TypeDef *ep );
+#endif
+
+#if ( USB_PWRSAVE_MODE )
+/* Variables and prototypes for USB powerdown (suspend) functionality. */
+static bool UsbPowerDown( void );
+static bool UsbPowerUp( void );
+
+volatile bool USBD_poweredDown = false;
+
+/* Storage for backing up USB core registers. */
+static uint32_t  x_USB_GINTMSK;
+#if defined(_USB_GOTGCTL_MASK)
+static uint32_t  x_USB_GOTGCTL;
+#endif
+static uint32_t  x_USB_GAHBCFG;
+static uint32_t  x_USB_GUSBCFG;
+static uint32_t  x_USB_GRXFSIZ;
+static uint32_t  x_USB_GNPTXFSIZ;
+static uint32_t  x_USB_DCFG;
+static uint32_t  x_USB_DCTL;
+static uint32_t  x_USB_DAINTMSK;
+static uint32_t  x_USB_DIEPMSK;
+static uint32_t  x_USB_DOEPMSK;
+static uint32_t  x_USB_PCGCCTL;
+
+#if ( NUM_EP_USED > 0 )
+static uint32_t  x_USB_EP_CTL[ NUM_EP_USED ];
+static uint32_t  x_USB_EP_TSIZ[ NUM_EP_USED ];
+static uint32_t  x_USB_EP_DMAADDR[ NUM_EP_USED ];
+#endif
+
+#if ( NUM_EP_USED > MAX_NUM_TX_FIFOS )
+#define FIFO_CNT MAX_NUM_TX_FIFOS
+#else
+#define FIFO_CNT NUM_EP_USED
+#endif
+
+#if ( FIFO_CNT > 0 )
+static uint32_t  x_USB_DIEPTXFS[ FIFO_CNT ];
+#endif
+
+#if ( USB_PWRSAVE_MODE )
+static uint32_t cmuStatus = 0;
+#endif
+
+#endif /* if ( USB_PWRSAVE_MODE ) */
+
+/*
+ * USB_IRQHandler() is the first level handler for the USB peripheral interrupt.
+ */
+void USB_IRQHandler( void )
+{
+  uint32_t status;
+  bool servedVbusInterrupt = false;
+
+  INT_Disable();
+
+#if ( USB_PWRSAVE_MODE )
+  if ( USBD_poweredDown )
+  {
+    /* Switch USBC clock from 32kHz to a 48MHz clock to be able to  */
+    /* read USB peripheral registers.                               */
+    /* If we woke up from EM2, HFCLK is now HFRCO.                  */
+
+    /* Restore clock oscillators.*/
+#if defined( CMU_OSCENCMD_USHFRCOEN )
+    if ( ( CMU->STATUS & CMU_STATUS_USHFRCOENS ) == 0 )/*Wakeup from EM2 ?*/
+    {
+      CMU->OSCENCMD = ( cmuStatus
+                        & ( CMU_STATUS_AUXHFRCOENS | CMU_STATUS_HFXOENS ) )
+                      | CMU_OSCENCMD_USHFRCOEN;
+    }
+#else
+    if ( ( CMU->STATUS & CMU_STATUS_HFXOENS ) == 0 ) /* Wakeup from EM2 ? */
+    {
+      CMU->OSCENCMD = cmuStatus
+                      & ( CMU_STATUS_AUXHFRCOENS | CMU_STATUS_HFXOENS );
+    }
+#endif
+
+    /* Select correct USBC clock.*/
+#if defined( CMU_OSCENCMD_USHFRCOEN )
+    CMU->CMD = CMU_CMD_USBCCLKSEL_USHFRCO;
+    while ( ( CMU->STATUS & CMU_STATUS_USBCUSHFRCOSEL ) == 0 ){}
+#else
+    CMU->CMD = CMU_CMD_USBCCLKSEL_HFCLKNODIV;
+    while ( ( CMU->STATUS & CMU_STATUS_USBCHFCLKSEL ) == 0 ){}
+#endif
+  }
+#endif /* if ( USB_PWRSAVE_MODE ) */
+
+  if ( USB->IF && ( USB->CTRL & USB_CTRL_VREGOSEN ) )
+  {
+    if ( USB->IF & USB_IF_VREGOSH )
+    {
+      USB->IFC = USB_IFC_VREGOSH;
+
+      if ( USB->STATUS & USB_STATUS_VREGOS )
+      {
+        servedVbusInterrupt = true;
+        DEBUG_USB_INT_LO_PUTS( "\nVboN" );
+
+#if ( USB_PWRSAVE_MODE )
+        if ( UsbPowerUp() )
+        {
+          USBDHAL_EnableUsbResetAndSuspendInt();
+        }
+        USBD_SetUsbState( USBD_STATE_POWERED );
+#endif
+      }
+    }
+
+    if ( USB->IF & USB_IF_VREGOSL )
+    {
+      USB->IFC = USB_IFC_VREGOSL;
+
+      if ( ( USB->STATUS & USB_STATUS_VREGOS ) == 0 )
+      {
+        servedVbusInterrupt = true;
+        DEBUG_USB_INT_LO_PUTS( "\nVboF" );
+
+#if ( USB_PWRSAVE_MODE )
+#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF )
+        if ( !USBD_poweredDown )
+        {
+          USB->GINTMSK = 0;
+          USB->GINTSTS = 0xFFFFFFFF;
+        }
+
+        UsbPowerDown();
+#endif
+        USBD_SetUsbState( USBD_STATE_NONE );
+#endif
+      }
+    }
+  }
+
+  status = USBHAL_GetCoreInts();
+  if ( status == 0 )
+  {
+    INT_Enable();
+    if ( !servedVbusInterrupt )
+    {
+      DEBUG_USB_INT_LO_PUTS( "\nSinT" );
+    }
+    return;
+  }
+
+  HANDLE_INT( USB_GINTSTS_RESETDET   )
+  HANDLE_INT( USB_GINTSTS_WKUPINT    )
+  HANDLE_INT( USB_GINTSTS_USBSUSP    )
+  HANDLE_INT( USB_GINTSTS_SOF        )
+  HANDLE_INT( USB_GINTSTS_ENUMDONE   )
+  HANDLE_INT( USB_GINTSTS_USBRST     )
+  HANDLE_INT( USB_GINTSTS_IEPINT     )
+  HANDLE_INT( USB_GINTSTS_OEPINT     )
+
+  INT_Enable();
+
+  if ( status != 0 )
+  {
+    DEBUG_USB_INT_LO_PUTS( "\nUinT" );
+  }
+}
+
+/*
+ * Handle port enumeration interrupt. This has nothing to do with normal
+ * device enumeration.
+ */
+static void Handle_USB_GINTSTS_ENUMDONE( void )
+{
+#if ( USB_PWRSAVE_MODE )
+  UsbPowerUp();
+#endif
+
+  USBDHAL_Ep0Activate( dev->ep0MpsCode );
+  dev->ep[ 0 ].state = D_EP_IDLE;
+  USBDHAL_EnableInts( dev );
+  DEBUG_USB_INT_LO_PUTS( "EnumD" );
+}
+
+/*
+ * Handle IN endpoint transfer interrupt.
+ */
+static void Handle_USB_GINTSTS_IEPINT( void )
+{
+  int epnum;
+  uint16_t epint;
+  uint16_t epmask;
+  uint32_t status;
+  USBD_Ep_TypeDef *ep;
+
+  DEBUG_USB_INT_HI_PUTCHAR( 'i' );
+
+  epint = USBDHAL_GetAllInEpInts();
+  for ( epnum = 0,                epmask = 1;
+        epnum <= MAX_NUM_IN_EPS;
+        epnum++,                  epmask <<= 1 )
+  {
+    if ( epint & epmask )
+    {
+      ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | epnum );
+      status = USBDHAL_GetInEpInts( ep );
+
+      if ( status & USB_DIEP_INT_XFERCOMPL )
+      {
+        USB_DINEPS[ epnum ].INT = USB_DIEP_INT_XFERCOMPL;
+
+        DEBUG_USB_INT_HI_PUTCHAR( 'c' );
+
+        if ( epnum == 0 )
+        {
+          if ( ep->remaining > ep->packetSize )
+          {
+            ep->remaining -= ep->packetSize;
+            ep->xferred += ep->packetSize;
+          }
+          else
+          {
+            ep->xferred += ep->remaining;
+            ep->remaining = 0;
+          }
+          USBDEP_Ep0Handler( dev );
+        }
+        else
+        {
+          ep->xferred = ep->remaining -
+                        ( ( USB_DINEPS[ epnum ].TSIZ      &
+                            _USB_DIEP_TSIZ_XFERSIZE_MASK    ) >>
+                          _USB_DIEP_TSIZ_XFERSIZE_SHIFT          );
+          ep->remaining -= ep->xferred;
+
+          USBDEP_EpHandler( ep->addr );
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+          if ( USB_DINEPS[ ep->num ].INT & USB_DIEP_INT_NAKINTRPT )
+          {
+            USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_NAKINTRPT;
+          }
+#endif
+        }
+      }
+    }
+  }
+}
+
+/*
+ * Handle OUT endpoint transfer interrupt.
+ */
+static void Handle_USB_GINTSTS_OEPINT( void )
+{
+  int epnum;
+  uint16_t epint;
+  uint16_t epmask;
+  uint32_t status;
+  USBD_Ep_TypeDef *ep;
+
+  DEBUG_USB_INT_HI_PUTCHAR( 'o' );
+
+  epint = USBDHAL_GetAllOutEpInts();
+  for ( epnum = 0,                epmask = 1;
+        epnum <= MAX_NUM_OUT_EPS;
+        epnum++,                  epmask <<= 1 )
+  {
+    if ( epint & epmask )
+    {
+      ep = USBD_GetEpFromAddr( epnum );
+      status = USBDHAL_GetOutEpInts( ep );
+
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+      HandleOutEpIntr( status, ep );
+#else
+      if ( status & USB_DOEP_INT_XFERCOMPL )
+      {
+        USB_DOUTEPS[ epnum ].INT = USB_DOEP_INT_XFERCOMPL;
+        DEBUG_USB_INT_HI_PUTCHAR( 'c' );
+        ProcessOepData( ep );
+      }
+
+      /* Setup Phase Done */
+      if ( status & USB_DOEP0INT_SETUP )
+      {
+        ProcessSetup();
+      }
+#endif
+    }
+  }
+}
+
+#if !defined( USB_DOEP0INT_STUPPKTRCVD )
+static void ProcessOepData( USBD_Ep_TypeDef *ep )
+{
+  if ( ep->num == 0 )
+  {
+
+#ifdef __MBED__
+    int xfer_size = ep->packetSize - (( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_XFERSIZE_MASK )
+                                      >> _USB_DOEP0TSIZ_XFERSIZE_SHIFT);
+    int setup_pkt_received = USBDHAL_GetOutEpInts( ep ) & USB_DOEP0INT_SETUP;
+
+    if ( (!setup_pkt_received && xfer_size == 0) ||
+         (setup_pkt_received && xfer_size == 8) )
+    {
+      /* Higher levels need to see the correct transfer amount for ZLPs */
+      ep->remaining = 0;
+      ep->xferred = 0;
+    }
+    else
+    {
+      /* FIXME - does not work if actual read size > 56 */
+      if ( setup_pkt_received ) xfer_size -= 8;
+
+      ep->xferred = xfer_size;
+      ep->remaining -= xfer_size;
+    }
+#else
+    if ( ep->remaining > ep->packetSize )
+    {
+      ep->remaining -= ep->packetSize;
+      ep->xferred += ep->packetSize;
+    }
+    else
+    {
+      ep->xferred += ep->remaining;
+      ep->remaining = 0;
+    }
+#endif
+
+    USBDEP_Ep0Handler( dev );
+  }
+  else
+  {
+    ep->xferred = ep->hwXferSize -
+        ( ( USB_DOUTEPS[ ep->num ].TSIZ & _USB_DOEP_TSIZ_XFERSIZE_MASK )>>
+          _USB_DOEP_TSIZ_XFERSIZE_SHIFT );
+    ep->remaining -= ep->xferred;
+    USBDEP_EpHandler( ep->addr );
+  }
+}
+#endif
+
+#if !defined( USB_DOEP0INT_STUPPKTRCVD )
+static void ProcessSetup( void )
+{
+  DEBUG_USB_INT_LO_PUTS( "\nS" );
+
+  if ( USB->DOEP0INT & USB_DOEP0INT_BACK2BACKSETUP )
+  {                           /* Back to back setup packets received */
+    USB->DOEP0INT = USB_DOEP0INT_BACK2BACKSETUP;
+    DEBUG_USB_INT_LO_PUTS( "B2B" );
+
+    dev->setup = (USB_Setup_TypeDef*)( USB->DOEP0DMAADDR - USB_SETUP_PKT_SIZE );
+  }
+  else
+  {
+    /* Read SETUP packet counter from hw. */
+    int supCnt = ( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_SUPCNT_MASK )
+                 >> _USB_DOEP0TSIZ_SUPCNT_SHIFT;
+
+    if ( supCnt == 3 )
+      supCnt = 2;
+
+    dev->setup = &dev->setupPkt[ 2 - supCnt ];
+  }
+  USB->DOEP0TSIZ |= 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT;
+  USB->DOEP0DMAADDR = (uint32_t)dev->setupPkt;
+  USB->DOEP0INT = USB_DOEP0INT_SETUP;
+
+  USBDEP_Ep0Handler( dev );   /* Call the SETUP handler for EP0 */
+}
+#endif
+
+/*
+ * Handle USB reset detected interrupt in suspend mode.
+ */
+static void Handle_USB_GINTSTS_RESETDET  ( void )
+{
+#if ( USB_PWRSAVE_MODE )
+  if ( ! USBD_poweredDown )
+  {
+    USB->GINTSTS = USB_GINTSTS_RESETDET;
+  }
+
+  if ( UsbPowerUp() )
+  {
+    USB->GINTSTS = USB_GINTSTS_RESETDET;
+  }
+
+#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF )
+  /* Power down immediately if VBUS is off. */
+  if ( ! ( USB->STATUS & USB_STATUS_VREGOS ) )
+  {
+    UsbPowerDown();
+  }
+#endif
+
+#else
+  USB->GINTSTS = USB_GINTSTS_RESETDET;
+#endif /* if ( USB_PWRSAVE_MODE ) */
+
+  if ( USB->STATUS & USB_STATUS_VREGOS )
+  {
+    USBD_SetUsbState( USBD_STATE_DEFAULT );
+  }
+  else
+  {
+    USBD_SetUsbState( USBD_STATE_NONE );
+  }
+  DEBUG_USB_INT_LO_PUTS( "RsuP\n" );
+}
+
+/*
+ * Handle Start Of Frame (SOF) interrupt.
+ */
+static void Handle_USB_GINTSTS_SOF( void )
+{
+  USB->GINTSTS = USB_GINTSTS_SOF;
+
+  if ( dev->callbacks->sofInt )
+  {
+    dev->callbacks->sofInt(
+      ( USB->DSTS & _USB_DSTS_SOFFN_MASK ) >> _USB_DSTS_SOFFN_SHIFT );
+  }
+}
+
+/*
+ * Handle USB port reset interrupt.
+ */
+static void Handle_USB_GINTSTS_USBRST( void )
+{
+  int i;
+
+  DEBUG_USB_INT_LO_PUTS( "ReseT" );
+
+  /* Clear Remote Wakeup Signalling */
+  USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_RMTWKUPSIG );
+  USBHAL_FlushTxFifo( 0 );
+
+  /* Clear pending interrupts */
+  for ( i = 0; i <= MAX_NUM_IN_EPS; i++ )
+  {
+    USB_DINEPS[ i ].INT = 0xFFFFFFFF;
+  }
+
+  for ( i = 0; i <= MAX_NUM_OUT_EPS; i++ )
+  {
+    USB_DOUTEPS[ i ].INT = 0xFFFFFFFF;
+  }
+
+  USB->DAINTMSK = USB_DAINTMSK_INEPMSK0 | USB_DAINTMSK_OUTEPMSK0;
+#if defined( USB_DOEPMSK_STSPHSERCVDMSK )
+  USB->DOEPMSK  = USB_DOEPMSK_SETUPMSK  | USB_DOEPMSK_XFERCOMPLMSK
+                  | USB_DOEPMSK_STSPHSERCVDMSK;
+#else
+  USB->DOEPMSK  = USB_DOEPMSK_SETUPMSK  | USB_DOEPMSK_XFERCOMPLMSK;
+#endif
+  USB->DIEPMSK  = USB_DIEPMSK_XFERCOMPLMSK;
+
+  /* Reset Device Address */
+  USB->DCFG &= ~_USB_DCFG_DEVADDR_MASK;
+
+  /* Setup EP0 to receive SETUP packets */
+  USBDHAL_StartEp0Setup( dev );
+  USBDHAL_EnableInts( dev );
+
+  if ( dev->callbacks->usbReset )
+  {
+    dev->callbacks->usbReset();
+  }
+
+  USBD_SetUsbState( USBD_STATE_DEFAULT );
+  USBDHAL_AbortAllTransfers( USB_STATUS_DEVICE_RESET );
+}
+
+/*
+ * Handle USB port suspend interrupt.
+ */
+static void Handle_USB_GINTSTS_USBSUSP( void )
+{
+  USBD_State_TypeDef state;
+
+  USB->GINTSTS = USB_GINTSTS_USBSUSP;
+  USBDHAL_AbortAllTransfers( USB_STATUS_DEVICE_SUSPENDED );
+  DEBUG_USB_INT_LO_PUTS( "\nSusP" );
+
+  if ( USBD_GetUsbState() == USBD_STATE_NONE )
+  {
+    USBD_SetUsbState( USBD_STATE_POWERED );
+  }
+
+  state = USBD_GetUsbState();
+  if ( ( state == USBD_STATE_POWERED    ) ||
+       ( state == USBD_STATE_DEFAULT    ) ||
+       ( state == USBD_STATE_ADDRESSED  ) ||
+       ( state == USBD_STATE_CONFIGURED )    )
+  {
+#if ( USB_PWRSAVE_MODE )
+    UsbPowerDown();
+#endif
+    USBD_SetUsbState( USBD_STATE_SUSPENDED );
+  }
+}
+
+/*
+ * Handle USB port wakeup interrupt.
+ */
+static void Handle_USB_GINTSTS_WKUPINT( void )
+{
+#if ( USB_PWRSAVE_MODE )
+  if ( ! USBD_poweredDown )
+  {
+    USB->GINTSTS = USB_GINTSTS_WKUPINT;
+  }
+
+  if ( UsbPowerUp() )
+  {
+    USB->GINTSTS = USB_GINTSTS_WKUPINT;
+    USBDHAL_StartEp0Setup( dev );
+    USBDHAL_Ep0Activate( dev->ep0MpsCode );
+  }
+#else
+  USB->GINTSTS = USB_GINTSTS_WKUPINT;
+#endif
+
+  USBD_SetUsbState( dev->savedState );
+  DEBUG_USB_INT_LO_PUTS( "WkuP\n" );
+}
+
+#if ( USB_PWRSAVE_MODE )
+/*
+ * Backup essential USB core registers, and set the core in partial powerdown
+ * mode. Optionally prepare entry into EM2.
+ */
+static bool UsbPowerDown( void )
+{
+#if ( NUM_EP_USED > 0 ) || ( FIFO_CNT > 0 )
+  int i;
+#endif
+#if ( NUM_EP_USED > 0 )
+  int epNum;
+  USBD_Ep_TypeDef *ep;
+#endif
+
+  if ( !USBD_poweredDown )
+  {
+    USBD_poweredDown = true;
+    DEBUG_USB_INT_LO_PUTCHAR( '\\' );
+
+    /* Backup USB core registers. */
+    x_USB_GINTMSK   = USB->GINTMSK;
+#if defined(_USB_GOTGCTL_MASK)
+    x_USB_GOTGCTL   = USB->GOTGCTL;
+#endif
+    x_USB_GAHBCFG   = USB->GAHBCFG;
+    x_USB_GUSBCFG   = USB->GUSBCFG;
+    x_USB_GRXFSIZ   = USB->GRXFSIZ;
+    x_USB_GNPTXFSIZ = USB->GNPTXFSIZ;
+    x_USB_DCFG      = USB->DCFG;
+    x_USB_DCTL      = USB->DCTL;
+    x_USB_DAINTMSK  = USB->DAINTMSK;
+    x_USB_DIEPMSK   = USB->DIEPMSK;
+    x_USB_DOEPMSK   = USB->DOEPMSK;
+    x_USB_PCGCCTL   = USB->PCGCCTL;
+
+#if ( NUM_EP_USED > 0 )
+    for ( i = 0; i < NUM_EP_USED; i++ )
+    {
+      ep = &dev->ep[ i+1 ];
+      epNum = ep->num;
+      if ( ep->in )
+      {
+        x_USB_EP_CTL[     i ] = USB_DINEPS[ epNum ].CTL;
+        x_USB_EP_TSIZ[    i ] = USB_DINEPS[ epNum ].TSIZ;
+        x_USB_EP_DMAADDR[ i ] = USB_DINEPS[ epNum ].DMAADDR;
+      }
+      else
+      {
+        x_USB_EP_CTL[     i ] = USB_DOUTEPS[ epNum ].CTL;
+        x_USB_EP_TSIZ[    i ] = USB_DOUTEPS[ epNum ].TSIZ;
+        x_USB_EP_DMAADDR[ i ] = USB_DOUTEPS[ epNum ].DMAADDR;
+      }
+    }
+#endif
+
+#if ( FIFO_CNT > 0 )
+    for ( i = 0; i < FIFO_CNT; i++ )
+    {
+      x_USB_DIEPTXFS[ i ] = USB_DIEPTXFS[ i ];
+    }
+#endif
+
+    /* Prepare for wakeup on resume and reset. */
+    USB->DCFG    = (USB->DCFG & ~_USB_DCFG_RESVALID_MASK) |
+                   (4 << _USB_DCFG_RESVALID_SHIFT);
+    USB->DCFG   |= USB_DCFG_ENA32KHZSUSP;
+    USB->GINTMSK = USB_GINTMSK_RESETDETMSK | USB_GINTMSK_WKUPINTMSK;
+
+    /* Enter partial powerdown mode. */
+    USB->PCGCCTL |= USB_PCGCCTL_PWRCLMP;
+    USB->PCGCCTL |= USB_PCGCCTL_RSTPDWNMODULE;
+    USB->PCGCCTL |= USB_PCGCCTL_STOPPCLK;
+
+    /* Record current clock settings. */
+    cmuStatus = CMU->STATUS;
+
+#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ENTEREM2 )
+#ifndef __MBED__
+    /* Enter EM2 on interrupt exit. */
+    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk;
+#else
+    usbhal_allow_em2(true);
+#endif
+#endif
+
+    /* Switch USBC clock to 32 kHz. */
+#if ( USB_USBC_32kHz_CLK == USB_USBC_32kHz_CLK_LFXO )
+    CMU->CMD = CMU_CMD_USBCCLKSEL_LFXO;
+    while ( ( CMU->STATUS & CMU_STATUS_USBCLFXOSEL ) == 0 ){}
+#else
+    CMU->CMD = CMU_CMD_USBCCLKSEL_LFRCO;
+    while ( ( CMU->STATUS & CMU_STATUS_USBCLFRCOSEL ) == 0 ){}
+#endif
+
+    return true;
+  }
+  return false;
+}
+#endif /* if ( USB_PWRSAVE_MODE ) */
+
+#if ( USB_PWRSAVE_MODE )
+/*
+ * Exit USB core partial powerdown mode, restore essential USB core registers.
+ * Will prevent re-entry back to EM2.
+ * Returns true if a powerup sequence was performed.
+ */
+static bool UsbPowerUp( void )
+{
+#if ( NUM_EP_USED > 0 ) || ( FIFO_CNT > 0 )
+  int i;
+#endif
+#if ( NUM_EP_USED > 0 )
+  int epNum;
+  uint32_t tmp;
+  USBD_Ep_TypeDef *ep;
+#endif
+
+  if ( USBD_poweredDown )
+  {
+    USBD_poweredDown = false;
+    DEBUG_USB_INT_LO_PUTCHAR( '/' );
+
+#if !defined( USB_CORECLK_HFRCO ) || !defined( CMU_OSCENCMD_USHFRCOEN )
+    /* Switch HFCLK from HFRCO to HFXO. */
+    CMU_ClockSelectSet( cmuClock_HF, cmuSelect_HFXO );
+#endif
+
+    /* Turn off HFRCO when not needed. */
+    if ( ( cmuStatus & CMU_STATUS_HFRCOENS ) == 0 )
+    {
+      CMU->OSCENCMD = CMU_OSCENCMD_HFRCODIS;
+    }
+
+    /* Exit partial powerdown mode. */
+    USB->PCGCCTL &= ~USB_PCGCCTL_STOPPCLK;
+    USB->PCGCCTL &= ~(USB_PCGCCTL_PWRCLMP | USB_PCGCCTL_RSTPDWNMODULE);
+
+    if (( USB->GINTSTS & ( USB_GINTSTS_WKUPINT | USB_GINTSTS_RESETDET ) ) == 0)
+    {
+      USB->DCTL = x_USB_DCTL | USB_DCTL_RMTWKUPSIG;
+      USB->DCTL = x_USB_DCTL;
+    }
+
+    /* Restore USB core registers. */
+    USB->GUSBCFG = x_USB_GUSBCFG;
+    USB->DCFG    = x_USB_DCFG;
+
+#if ( FIFO_CNT > 0 )
+    for ( i = 0; i < FIFO_CNT; i++ )
+    {
+      USB_DIEPTXFS[ i ] = x_USB_DIEPTXFS[ i ];
+    }
+#endif
+
+#if ( NUM_EP_USED > 0 )
+    for ( i = 0; i < NUM_EP_USED; i++ )
+    {
+      ep = &dev->ep[ i+1 ];
+      epNum = ep->num;
+
+      tmp = x_USB_EP_CTL[ i ] &
+            ~( USB_DIEP_CTL_CNAK       | USB_DIEP_CTL_SNAK       |
+               USB_DIEP_CTL_SETD0PIDEF | USB_DIEP_CTL_SETD1PIDOF   );
+
+      if ( x_USB_EP_CTL[ i ] & USB_DIEP_CTL_DPIDEOF )
+        tmp |= USB_DIEP_CTL_SETD1PIDOF;
+      else
+        tmp |= USB_DIEP_CTL_SETD0PIDEF;
+
+      if ( x_USB_EP_CTL[ i ] & USB_DIEP_CTL_NAKSTS )
+        tmp |= USB_DIEP_CTL_SNAK;
+      else
+        tmp |= USB_DIEP_CTL_CNAK;
+
+      if ( ep->in )
+      {
+        USB_DINEPS[ epNum ].CTL     = tmp;
+        USB_DINEPS[ epNum ].TSIZ    = x_USB_EP_TSIZ[    i ];
+        USB_DINEPS[ epNum ].DMAADDR = x_USB_EP_DMAADDR[ i ];
+      }
+      else
+      {
+        USB_DOUTEPS[ epNum ].CTL     = tmp;
+        USB_DOUTEPS[ epNum ].TSIZ    = x_USB_EP_TSIZ[    i ];
+        USB_DOUTEPS[ epNum ].DMAADDR = x_USB_EP_DMAADDR[ i ];
+      }
+    }
+#endif
+
+    USB->PCGCCTL   = x_USB_PCGCCTL;
+    USB->DOEPMSK   = x_USB_DOEPMSK;
+    USB->DIEPMSK   = x_USB_DIEPMSK;
+    USB->DAINTMSK  = x_USB_DAINTMSK;
+    USB->DCTL      = x_USB_DCTL;
+    USB->GNPTXFSIZ = x_USB_GNPTXFSIZ;
+    USB->GRXFSIZ   = x_USB_GRXFSIZ;
+    USB->GAHBCFG   = x_USB_GAHBCFG;
+#if defined(_USB_GOTGCTL_MASK)
+    USB->GOTGCTL   = x_USB_GOTGCTL;
+#endif
+    USB->GINTMSK   = x_USB_GINTMSK;
+
+    USB->DCTL |= USB_DCTL_PWRONPRGDONE;
+
+#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ENTEREM2 )
+#ifndef __MBED__
+    /* Do not reenter EM2 on interrupt exit. */
+    SCB->SCR &= ~(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk);
+#else
+    usbhal_allow_em2(false);
+#endif
+#endif
+
+    return true;
+  }
+  return false;
+}
+#endif /* if ( USB_PWRSAVE_MODE ) */
+
+#if defined( USB_DOEP0INT_STUPPKTRCVD )
+static void HandleOutEpIntr( uint32_t status, USBD_Ep_TypeDef *ep )
+{
+  uint32_t doeptsiz;
+
+  if ( ep->num == 0 )
+  {
+    if ( status & USB_DOEP0INT_XFERCOMPL )
+    {
+      USB->DOEP0INT = USB_DOEP0INT_XFERCOMPL;
+      doeptsiz      = USB->DOEP0TSIZ;
+
+      if ( ep->state == D_EP_IDLE )
+      {
+        if ( status & USB_DOEP0INT_STUPPKTRCVD )
+        {
+          USB->DOEP0INT = USB_DOEP0INT_STUPPKTRCVD;
+        }
+        status = USBDHAL_GetOutEpInts( ep );
+        doeptsiz = USB->DOEP0TSIZ;
+
+        if ( status & USB_DOEP0INT_SETUP )
+        {
+retry:
+          /* Already started data stage, clear setup */
+          USB->DOEP0INT = USB_DOEP0INT_SETUP;
+          status       &= ~USB_DOEP0INT_SETUP;
+          {
+            int supCnt = ( doeptsiz & _USB_DOEP0TSIZ_SUPCNT_MASK )
+                         >> _USB_DOEP0TSIZ_SUPCNT_SHIFT;
+
+            if ( supCnt == 3 )
+              supCnt = 2;
+
+            dev->setup = &dev->setupPkt[ 2 - supCnt ];
+          }
+          DEBUG_USB_INT_LO_PUTS( "\nS" );
+          USBDEP_Ep0Handler( dev );
+
+          /* Prepare for more setup packets */
+          if ( ep->state == D_EP0_IN_STATUS || ep->state == D_EP_TRANSMITTING )
+          {
+            USBDHAL_StartEp0Setup( dev );
+          }
+        }
+        else /* xfercompl && idle && !setup */
+        {
+            status = USBDHAL_GetOutEpInts( ep );
+            if ( status & USB_DOEP0INT_SETUP )
+              goto retry;
+            USBDHAL_StartEp0Setup( dev );
+        }
+      }
+      else /* ep0state != EP0_IDLE */
+      {
+#ifdef __MBED__
+        if ( ep->state == D_EP_RECEIVING )
+        {
+          int xfer_size = ep->packetSize - (( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_XFERSIZE_MASK )
+                                            >> _USB_DOEP0TSIZ_XFERSIZE_SHIFT);
+          int setup_pkt_received = status & USB_DOEP0INT_SETUP;
+
+          if ( (!setup_pkt_received && xfer_size == 0) ||
+               (setup_pkt_received && xfer_size == 8) )
+          {
+            /* Higher levels need to see the correct transfer amount for ZLPs */
+            ep->remaining = 0;
+            ep->xferred = 0;
+          }
+          else
+          {
+            /* FIXME - does not work if actual read size > 56 */
+            if ( setup_pkt_received ) xfer_size -= 8;
+
+            ep->xferred = xfer_size;
+            ep->remaining -= xfer_size;
+          }
+
+          USBDEP_Ep0Handler( dev );
+        }
+#else
+        if ( ep->state == D_EP_RECEIVING )
+        {
+          if ( ep->remaining > ep->packetSize )
+          {
+            ep->remaining -= ep->packetSize;
+            ep->xferred += ep->packetSize;
+          }
+          else
+          {
+            ep->xferred += ep->remaining;
+            ep->remaining = 0;
+          }
+          USBDEP_Ep0Handler( dev );
+        }
+        else if ( ep->state == D_EP0_OUT_STATUS )
+        {
+          USBDEP_Ep0Handler( dev );
+        }
+#endif
+      }
+    } /* if ( status & USB_DOEP0INT_XFERCOMPL ) */
+
+    if ( status & USB_DOEP0INT_STSPHSERCVD )
+    {
+      USB->DOEP0INT = USB_DOEP0INT_STSPHSERCVD;
+    }
+
+    if ( status & USB_DOEP0INT_SETUP )
+    {
+      USB->DOEP0INT = USB_DOEP0INT_SETUP;
+      {
+        int supCnt = ( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_SUPCNT_MASK )
+                     >> _USB_DOEP0TSIZ_SUPCNT_SHIFT;
+
+        if ( supCnt == 3 )
+          supCnt = 2;
+
+        dev->setup = &dev->setupPkt[ 2 - supCnt ];
+      }
+      DEBUG_USB_INT_LO_PUTS( "\nS" );
+      USBDEP_Ep0Handler( dev );
+    }
+  }
+  else /* epnum != 0 */
+  {
+    if ( status & USB_DOEP_INT_XFERCOMPL )
+    {
+      USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_XFERCOMPL;
+
+      ep->xferred = ep->hwXferSize -
+          ( ( USB_DOUTEPS[ ep->num ].TSIZ & _USB_DOEP_TSIZ_XFERSIZE_MASK )>>
+            _USB_DOEP_TSIZ_XFERSIZE_SHIFT );
+      ep->remaining -= ep->xferred;
+
+      USBDEP_EpHandler( ep->addr );
+    }
+  }
+}
+#endif
+
+/** @endcond */
+
+#endif /* defined( USB_DEVICE ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbhal.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,799 @@
+/**************************************************************************//**
+ * @file em_usbhal.c
+ * @brief USB protocol stack library, low level USB peripheral access.
+ * @version 3.20.14
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE ) || defined( USB_HOST )
+
+#include "em_usbtypes.h"
+#include "em_usbhal.h"
+#if defined( USB_DEVICE )
+#include "em_usbd.h"
+#endif
+#if defined( USB_HOST )
+#include "em_usbh.h"
+#endif
+#include "em_cmu.h"
+#include "em_gpio.h"
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+#define EPABORT_BREAK_LOOP_COUNT 15000              /* Approx. 100 ms */
+
+/* NOTE: The sequence of error message strings must agree with the    */
+/*       definition of USB_Status_TypeDef enum.                       */
+static const char * const errMsg[] =
+{
+  [  USB_STATUS_OK                  ] = "No errors",
+  [ -USB_STATUS_REQ_ERR             ] = "Setup request error",
+  [ -USB_STATUS_EP_BUSY             ] = "Endpoint is busy",
+  [ -USB_STATUS_REQ_UNHANDLED       ] = "Setup request not handled",
+  [ -USB_STATUS_ILLEGAL             ] = "Illegal operation attempted",
+  [ -USB_STATUS_EP_STALLED          ] = "Endpoint is stalled",
+  [ -USB_STATUS_EP_ABORTED          ] = "Transfer aborted",
+  [ -USB_STATUS_EP_ERROR            ] = "Transfer error",
+  [ -USB_STATUS_EP_NAK              ] = "Endpoint NAK",
+  [ -USB_STATUS_DEVICE_UNCONFIGURED ] = "Device is not configured",
+  [ -USB_STATUS_DEVICE_SUSPENDED    ] = "Device is suspended",
+  [ -USB_STATUS_DEVICE_RESET        ] = "Device has been reset",
+  [ -USB_STATUS_TIMEOUT             ] = "Transfer timeout",
+  [ -USB_STATUS_DEVICE_REMOVED      ] = "Device removed",
+  [ -USB_STATUS_HC_BUSY             ] = "Host channel is busy",
+  [ -USB_STATUS_DEVICE_MALFUNCTION  ] = "Device malfunction",
+  [ -USB_STATUS_PORT_OVERCURRENT    ] = "VBUS overcurrent",
+};
+/** @endcond */
+
+
+/***************************************************************************//**
+ * @brief
+ *   Return an error message string for a given error code.
+ *
+ * @param[in] error
+ *   Error code, see \ref USB_Status_TypeDef.
+ *
+ * @return
+ *   Error message string pointer.
+ ******************************************************************************/
+char *USB_GetErrorMsgString( int error )
+{
+  if ( error >= 0 )
+    return (char*)errMsg[ 0 ];
+
+  return (char*)errMsg[ -error ];
+}
+
+
+#if defined( USB_USE_PRINTF )
+/***************************************************************************//**
+ * @brief
+ *   Format and print a text string given an error code, prepends an optional user
+ *   supplied leader string.
+ *
+ * @param[in] pre
+ *   Optional leader string to prepend to error message string.
+ *
+ * @param[in] error
+ *   Error code, see \ref USB_Status_TypeDef.
+ ******************************************************************************/
+void USB_PrintErrorMsgString( char *pre, int error )
+{
+  if ( pre )
+  {
+    USB_PRINTF( "%s", pre );
+  }
+
+  if ( error > USB_STATUS_OK )
+  {
+    USB_PRINTF( "%d", error );
+  }
+  else
+  {
+    USB_PRINTF( "%s", USB_GetErrorMsgString( error ) );
+  }
+}
+#endif /* defined( USB_USE_PRINTF ) */
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+#if defined( DEBUG_EFM_USER )
+static void PrintI( int i )
+{
+#if !defined ( USER_PUTCHAR )
+  (void)i;
+#else
+  if ( i >= 10 )
+  {
+    PrintI( i / 10 );
+  }
+
+  DEBUG_USB_API_PUTCHAR( ( i % 10 ) + '0' );
+#endif
+}
+
+void assertEFM( const char *file, int line )
+{
+#if !defined ( USER_PUTCHAR )
+  (void)file;
+#endif
+
+  DEBUG_USB_API_PUTS( "\nASSERT " );
+  DEBUG_USB_API_PUTS( file );
+  DEBUG_USB_API_PUTCHAR( ' ' );
+  PrintI( line );
+  for(;;){}
+}
+#endif /* defined( DEBUG_EFM_USER ) */
+
+#if defined ( USER_PUTCHAR )
+void USB_Puts( const char *p )
+{
+  while( *p )
+    USB_PUTCHAR( *p++ );
+}
+#endif /* defined ( USER_PUTCHAR ) */
+
+void USBHAL_CoreReset( void )
+{
+  USB->PCGCCTL &= ~USB_PCGCCTL_STOPPCLK;
+  USB->PCGCCTL &= ~(USB_PCGCCTL_PWRCLMP | USB_PCGCCTL_RSTPDWNMODULE);
+
+  /* Core Soft Reset */
+  USB->GRSTCTL |= USB_GRSTCTL_CSFTRST;
+  while ( USB->GRSTCTL & USB_GRSTCTL_CSFTRST ) {}
+
+  USBTIMER_DelayUs( 1 );
+
+  /* Wait for AHB master IDLE state. */
+  while ( !( USB->GRSTCTL & USB_GRSTCTL_AHBIDLE ) ) {}
+}
+
+#ifdef USB_DEVICE
+void USBDHAL_Connect( void )
+{
+  USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_SFTDISCON );
+}
+
+USB_Status_TypeDef USBDHAL_CoreInit( uint32_t totalRxFifoSize,
+                                     uint32_t totalTxFifoSize )
+{
+  uint8_t i, j;
+  uint16_t start, depth;
+  USBD_Ep_TypeDef *ep;
+
+#if !defined( USB_VBUS_SWITCH_NOT_PRESENT )
+  CMU_ClockEnable( cmuClock_GPIO, true );
+  GPIO_PinModeSet( gpioPortF, 5, gpioModePushPull, 0 ); /* Enable VBUSEN pin */
+  USB->ROUTE = USB_ROUTE_PHYPEN | USB_ROUTE_VBUSENPEN;  /* Enable PHY pins.  */
+#else
+  USB->ROUTE = USB_ROUTE_PHYPEN;                        /* Enable PHY pins.  */
+#endif
+
+  USBHAL_CoreReset();                                   /* Reset USB core    */
+
+#if defined( USB_GUSBCFG_FORCEHSTMODE )
+  /* Force Device Mode */
+  USB->GUSBCFG = ( USB->GUSBCFG                                    &
+                  ~(GUSBCFG_WO_BITMASK | USB_GUSBCFG_FORCEHSTMODE )  ) |
+                 USB_GUSBCFG_FORCEDEVMODE;
+#endif
+
+  INT_Enable();
+  USBTIMER_DelayMs( 50 );
+  INT_Disable();
+
+  /* Set device speed */
+  USB->DCFG = ( USB->DCFG & ~_USB_DCFG_DEVSPD_MASK ) | 3; /* Full speed PHY */
+
+  /* Stall on non-zero len status OUT packets (ctrl transfers). */
+  USB->DCFG |= USB_DCFG_NZSTSOUTHSHK;
+
+  /* Set periodic frame interval to 80% */
+  USB->DCFG &= ~_USB_DCFG_PERFRINT_MASK;
+
+  USB->GAHBCFG = ( USB->GAHBCFG & ~_USB_GAHBCFG_HBSTLEN_MASK ) |
+                 USB_GAHBCFG_DMAEN | USB_GAHBCFG_HBSTLEN_INCR;
+
+  /* Ignore frame numbers on ISO transfers. */
+  USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_IGNRFRMNUM;
+
+  /* Set Rx FIFO size */
+  start = EFM32_MAX( totalRxFifoSize, MIN_EP_FIFO_SIZE_INWORDS );
+  USB->GRXFSIZ = ( start << _USB_GRXFSIZ_RXFDEP_SHIFT ) &
+                 _USB_GRXFSIZ_RXFDEP_MASK;
+
+  /* Set Tx EP0 FIFO size */
+  depth = EFM32_MAX( dev->ep[ 0 ].fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
+  USB->GNPTXFSIZ = ( ( depth << _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) &
+                     _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK                 ) |
+                   ( ( start << _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) &
+                     _USB_GNPTXFSIZ_NPTXFSTADDR_MASK                      );
+
+
+  /* Set Tx EP FIFO sizes for all IN ep's */
+  for ( j = 1; j <= MAX_NUM_TX_FIFOS; j++ )
+  {
+    for ( i = 1; i <= MAX_NUM_IN_EPS; i++ )
+    {
+      ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | i );
+      if ( ep )                             /* Is EP in use ? */
+      {
+        if ( ep->txFifoNum == j )           /* Is it correct FIFO number ? */
+        {
+          start += depth;
+          depth = EFM32_MAX( ep->fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
+          USB_DIEPTXFS[ ep->txFifoNum - 1 ] =
+                              ( depth << _USB_DIEPTXF1_INEPNTXFDEP_SHIFT   ) |
+                              ( start &  _USB_DIEPTXF1_INEPNTXFSTADDR_MASK );
+        }
+      }
+    }
+  }
+
+  if ( totalRxFifoSize + totalTxFifoSize > MAX_DEVICE_FIFO_SIZE_INWORDS )
+    return USB_STATUS_ILLEGAL;
+
+  if ( start > MAX_DEVICE_FIFO_SIZE_INWORDS )
+    return USB_STATUS_ILLEGAL;
+
+  /* Flush the FIFO's */
+  USBHAL_FlushTxFifo( 0x10 );      /* All Tx FIFO's */
+  USBHAL_FlushRxFifo();            /* The Rx FIFO   */
+
+  /* Disable all device interrupts */
+  USB->DIEPMSK  = 0;
+  USB->DOEPMSK  = 0;
+  USB->DAINTMSK = 0;
+  USB->DIEPEMPMSK = 0;
+
+  /* Disable all EP's, clear all EP ints. */
+  for ( i = 0; i <= MAX_NUM_IN_EPS; i++ )
+  {
+    USB_DINEPS[ i ].CTL  = 0;
+    USB_DINEPS[ i ].TSIZ = 0;
+    USB_DINEPS[ i ].INT  = 0xFFFFFFFF;
+  }
+
+  for ( i = 0; i <= MAX_NUM_OUT_EPS; i++ )
+  {
+    USB_DOUTEPS[ i ].CTL  = 0;
+    USB_DOUTEPS[ i ].TSIZ = 0;
+    USB_DOUTEPS[ i ].INT  = 0xFFFFFFFF;
+  }
+
+#if ( USB_DCTL_SFTDISCON_DEFAULT != 0 )
+  USBD_Connect();
+#endif
+
+  /* Enable VREGO sense. */
+  USB->CTRL |= USB_CTRL_VREGOSEN;
+  USB->IFC   = USB_IFC_VREGOSH | USB_IFC_VREGOSL;
+  USB->IEN   = USB_IFC_VREGOSH | USB_IFC_VREGOSL;
+  /* Force a VREGO interrupt. */
+  if ( USB->STATUS & USB_STATUS_VREGOS)
+    USB->IFS = USB_IFS_VREGOSH;
+  else
+    USB->IFS = USB_IFS_VREGOSL;
+
+  return USB_STATUS_OK;
+}
+
+USB_Status_TypeDef USBDHAL_ReconfigureFifos( uint32_t totalRxFifoSize,
+                                             uint32_t totalTxFifoSize )
+{
+  uint8_t i, j;
+  uint16_t start, depth;
+  USBD_Ep_TypeDef *ep;
+
+  /* Set Rx FIFO size */
+  start = EFM32_MAX( totalRxFifoSize, MIN_EP_FIFO_SIZE_INWORDS );
+  USB->GRXFSIZ = ( start << _USB_GRXFSIZ_RXFDEP_SHIFT ) &
+                 _USB_GRXFSIZ_RXFDEP_MASK;
+
+  /* Set Tx EP0 FIFO size */
+  depth = EFM32_MAX( dev->ep[ 0 ].fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
+  USB->GNPTXFSIZ = ( ( depth << _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) &
+                     _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK                 ) |
+                   ( ( start << _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) &
+                     _USB_GNPTXFSIZ_NPTXFSTADDR_MASK                      );
+
+
+  /* Set Tx EP FIFO sizes for all IN ep's */
+  for ( j = 1; j <= MAX_NUM_TX_FIFOS; j++ )
+  {
+    for ( i = 1; i <= MAX_NUM_IN_EPS; i++ )
+    {
+      ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | i );
+      if ( ep )                             /* Is EP in use ? */
+      {
+        if ( ep->txFifoNum == j )           /* Is it correct FIFO number ? */
+        {
+          start += depth;
+          depth = EFM32_MAX( ep->fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
+          USB_DIEPTXFS[ ep->txFifoNum - 1 ] =
+                              ( depth << _USB_DIEPTXF1_INEPNTXFDEP_SHIFT   ) |
+                              ( start &  _USB_DIEPTXF1_INEPNTXFSTADDR_MASK );
+        }
+      }
+    }
+  }
+
+  if ( totalRxFifoSize + totalTxFifoSize > MAX_DEVICE_FIFO_SIZE_INWORDS )
+    return USB_STATUS_ILLEGAL;
+
+  if ( start > MAX_DEVICE_FIFO_SIZE_INWORDS )
+    return USB_STATUS_ILLEGAL;
+
+  /* Flush the FIFO's */
+  USBHAL_FlushTxFifo( 0x10 );      /* All Tx FIFO's */
+  USBHAL_FlushRxFifo();            /* The Rx FIFO   */
+
+  return USB_STATUS_OK;
+}
+
+void USBDHAL_Disconnect( void )
+{
+  USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SFTDISCON;
+}
+
+void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep )
+{
+  /* Clear epdis & inepnakeff INT's */
+  USB_DINEPS[ ep->num ].INT |= USB_DIEP_INT_EPDISBLD |
+                               USB_DIEP_INT_INEPNAKEFF;
+
+  /* Enable epdis & inepnakeff INT's */
+  USB->DIEPMSK |= USB_DIEPMSK_EPDISBLDMSK | USB_DIEPMSK_INEPNAKEFFMSK;
+  USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL  &
+                                ~DEPCTL_WO_BITMASK           ) |
+                              USB_DIEP_CTL_SNAK;
+
+  /* Wait for inepnakeff INT */
+  while ( !( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_INEPNAKEFF ) ) {}
+  USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_INEPNAKEFF;
+  USB->DIEPMSK &= ~USB_DIEPMSK_INEPNAKEFFMSK;
+
+  DEBUG_USB_INT_LO_PUTCHAR( '.' );
+
+  USBDHAL_SetEPDISNAK( ep );
+  /* Wait for epdis INT */
+  while ( !( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_EPDISBLD ) ) {}
+  USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_EPDISBLD;
+  USB->DIEPMSK &= ~USB_DIEPMSK_EPDISBLDMSK;
+  USBHAL_FlushTxFifo( ep->txFifoNum );
+
+  /* Clear any interrupts generated by the abort sequence. */
+  NVIC_ClearPendingIRQ( USB_IRQn );
+
+  DEBUG_USB_INT_LO_PUTCHAR( '.' );
+}
+
+void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep )
+{
+  int cnt;
+
+  /* Clear epdis INT's */
+  USB_DOUTEPS[ ep->num ].INT |= USB_DOEP_INT_EPDISBLD;
+
+  /* Clear Global OUT NAK if already set */
+  USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
+  USB->GINTMSK |= USB_GINTMSK_GOUTNAKEFFMSK;    /* Enable GOUTNAKEFF int */
+
+  /* Set Global OUT NAK */
+  USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SGOUTNAK;
+
+  /* Wait for goutnakeff */
+  cnt = EPABORT_BREAK_LOOP_COUNT;
+  while ( !( USB->GINTSTS & USB_GINTSTS_GOUTNAKEFF ) && cnt )
+  {
+    cnt--;
+  }
+
+  USB->GINTMSK &= ~USB_GINTMSK_GOUTNAKEFFMSK; /* Disable GOUTNAKEFF int  */
+  USB->DOEPMSK |= USB_DOEPMSK_EPDISBLDMSK;    /* Enable EPDIS interrupt  */
+
+  DEBUG_USB_INT_LO_PUTCHAR( ',' );
+
+  USBDHAL_SetEPDISNAK( ep );                  /* Disable ep */
+
+  /* Wait for epdis INT */
+  cnt = EPABORT_BREAK_LOOP_COUNT;
+  while ( !( USBDHAL_GetOutEpInts( ep ) & USB_DOEP_INT_EPDISBLD ) && cnt )
+  {
+    cnt--;
+  }
+
+  USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_EPDISBLD;
+  USB->DOEPMSK &= ~USB_DOEPMSK_EPDISBLDMSK;     /* Disable EPDIS interrupt */
+
+  /* Clear Global OUT NAK */
+  USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
+
+  /* Clear any interrupts generated by the abort sequence. */
+  NVIC_ClearPendingIRQ( USB_IRQn );
+
+  DEBUG_USB_INT_LO_PUTCHAR( ',' );
+}
+
+void USBDHAL_AbortAllEps( void )
+{
+  int i, cnt;
+  USBD_Ep_TypeDef *ep;
+  uint16_t im, om, inmask=0, outmask=0;
+
+  /* Clear epdis & inepnakeff INT's */
+  for ( i = 1; i <= NUM_EP_USED; i++ )
+  {
+    ep = &dev->ep[i];
+    if ( ep->state != D_EP_IDLE )
+    {
+      if ( ep->in )
+      {
+        inmask |= ep->mask;
+        USB_DINEPS[ ep->num ].INT |= USB_DIEP_INT_EPDISBLD |
+                                     USB_DIEP_INT_INEPNAKEFF;
+      }
+      else
+      {
+        outmask |= ep->mask;
+        USB_DOUTEPS[ ep->num ].INT |= USB_DOEP_INT_EPDISBLD;
+      }
+    }
+  }
+
+  if ( inmask )
+  {
+    /* Enable epdis & inepnakeff INT's */
+    USB->DIEPMSK |= USB_DIEPMSK_EPDISBLDMSK | USB_DIEPMSK_INEPNAKEFFMSK;
+
+    /* Set NAK on all IN ep's */
+    im = inmask;
+    for ( i = 1; i <= NUM_EP_USED; i++ )
+    {
+      ep = &dev->ep[i];
+      if ( im & ep->mask )
+      {
+        USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL &
+                                      ~DEPCTL_WO_BITMASK          ) |
+                                    USB_DIEP_CTL_SNAK;
+      }
+    }
+  }
+
+  if ( outmask )
+  {
+    /* Clear Global OUT NAK if already set */
+    USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
+
+    USB->GINTMSK |= USB_GINTMSK_GOUTNAKEFFMSK;    /* Enable GOUTNAKEFF int */
+
+    /* Set Global OUT NAK */
+    USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SGOUTNAK;
+
+    /* Wait for goutnakeff */
+    cnt = EPABORT_BREAK_LOOP_COUNT;
+    while ( !( USB->GINTSTS & USB_GINTSTS_GOUTNAKEFF ) && cnt )
+    {
+      cnt--;
+    }
+    USB->GINTMSK &= ~USB_GINTMSK_GOUTNAKEFFMSK; /* Disable GOUTNAKEFF int  */
+    USB->DOEPMSK |= USB_DOEPMSK_EPDISBLDMSK;    /* Enable EPDIS interrupt  */
+  }
+
+  if ( inmask )
+  {
+    /* Wait for inepnakeff INT on all IN ep's */
+    im  = inmask;
+    cnt = EPABORT_BREAK_LOOP_COUNT;
+    do
+    {
+      for ( i = 1; i <= NUM_EP_USED; i++ )
+      {
+        ep = &dev->ep[i];
+        if ( im & ep->mask )
+        {
+          if ( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_INEPNAKEFF )
+          {
+            USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_INEPNAKEFF;
+            im &= ~ep->mask;
+          }
+        }
+      }
+      cnt--;
+    } while ( im && cnt );
+    USB->DIEPMSK &= ~USB_DIEPMSK_INEPNAKEFFMSK;
+  }
+
+  DEBUG_USB_INT_LO_PUTCHAR( '\'' );
+
+  /* Disable ep's */
+  for ( i = 1; i <= NUM_EP_USED; i++ )
+  {
+    ep = &dev->ep[i];
+    if ( ep->state != D_EP_IDLE )
+    {
+      USBDHAL_SetEPDISNAK( ep );
+    }
+  }
+
+  /* Wait for epdis INT */
+  im  = inmask;
+  om  = outmask;
+  cnt = EPABORT_BREAK_LOOP_COUNT;
+  do
+  {
+    for ( i = 1; i <= NUM_EP_USED; i++ )
+    {
+      ep = &dev->ep[i];
+      if ( ep->in && ( im & ep->mask ) )
+      {
+        if ( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_EPDISBLD )
+        {
+          USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_EPDISBLD;
+          im &= ~ep->mask;
+        }
+      }
+
+      if ( !ep->in && ( om & ep->mask ) )
+      {
+        if ( USBDHAL_GetOutEpInts( ep ) & USB_DOEP_INT_EPDISBLD )
+        {
+          USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_EPDISBLD;
+          om &= ~ep->mask;
+        }
+      }
+    }
+    cnt--;
+  } while ( ( im || om ) && cnt );
+
+  if ( inmask )
+  {
+    USB->DIEPMSK &= ~USB_DIEPMSK_EPDISBLDMSK;     /* Disable EPDIS interrupt */
+    USBHAL_FlushTxFifo( 0x10 );                   /* Flush all Tx FIFO's     */
+  }
+
+  if ( outmask )
+  {
+    USB->DOEPMSK &= ~USB_DOEPMSK_EPDISBLDMSK;     /* Disable EPDIS interrupt */
+    /* Clear Global OUT NAK */
+    USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
+  }
+
+  DEBUG_USB_INT_LO_PUTCHAR( '\'' );
+}
+
+void USBDHAL_AbortAllTransfers( USB_Status_TypeDef reason )
+{
+  int i;
+  USBD_Ep_TypeDef *ep;
+  USB_XferCompleteCb_TypeDef callback;
+
+  if ( reason != USB_STATUS_DEVICE_RESET )
+  {
+    USBDHAL_AbortAllEps();
+  }
+
+  for ( i = 1; i <= NUM_EP_USED; i++ )
+  {
+    ep = &(dev->ep[i]);
+    if ( ep->state != D_EP_IDLE )
+    {
+      ep->state = D_EP_IDLE;
+      if ( ep->xferCompleteCb )
+      {
+        callback = ep->xferCompleteCb;
+        ep->xferCompleteCb = NULL;
+
+        if ( ( dev->lastState == USBD_STATE_CONFIGURED ) &&
+             ( dev->state     == USBD_STATE_ADDRESSED  )    )
+        {
+          USBDHAL_DeactivateEp( ep );
+        }
+
+        DEBUG_TRACE_ABORT( reason );
+        callback( reason, ep->xferred, ep->remaining );
+      }
+    }
+  }
+
+  /* Clear any interrupts generated by the abort sequence. */
+  NVIC_ClearPendingIRQ( USB_IRQn );
+}
+#endif /* defined( USB_DEVICE ) */
+
+#if defined( USB_HOST )
+USB_Status_TypeDef USBHHAL_CoreInit( uint32_t rxFifoSize,
+                                     uint32_t nptxFifoSize,
+                                     uint32_t ptxFifoSize )
+{
+  uint8_t i;
+
+  rxFifoSize   /= 4;              /* Convert from byte count to word count.  */
+  nptxFifoSize /= 4;
+  ptxFifoSize  /= 4;
+
+  CMU_ClockEnable( cmuClock_GPIO, true );
+  GPIO_PinModeSet( gpioPortF, 5, gpioModePushPull, 0 ); /* Enable VBUSEN pin */
+
+#if ( USB_VBUSOVRCUR_PORT != USB_VBUSOVRCUR_PORT_NONE )
+  /* Enable VBUS overcurrent flag pin. */
+  GPIO_PinModeSet( USB_VBUSOVRCUR_PORT, USB_VBUSOVRCUR_PIN, gpioModeInput, 0 );
+#endif
+
+  USB->ROUTE = USB_ROUTE_PHYPEN | USB_ROUTE_VBUSENPEN;  /* Enable PHY pins.  */
+  USBHAL_CoreReset();                                   /* Reset USB core    */
+
+  /* Force Host Mode */
+  USB->GUSBCFG = ( USB->GUSBCFG                                     &
+                   ~(GUSBCFG_WO_BITMASK | USB_GUSBCFG_FORCEDEVMODE )  ) |
+                 USB_GUSBCFG_FORCEHSTMODE;
+
+  INT_Enable();
+  USBTIMER_DelayMs( 100 );
+  INT_Disable();
+
+  /* Set 48 MHz PHY clock, FS/LS mode */
+  USB->HCFG = ( USB->HCFG & ~_USB_HCFG_FSLSPCLKSEL_MASK ) |
+              ( 1 << _USB_HCFG_FSLSPCLKSEL_SHIFT        ) |
+              ( USB_HCFG_FSLSSUPP                       );
+
+  USB->GAHBCFG = ( USB->GAHBCFG & ~_USB_GAHBCFG_HBSTLEN_MASK ) |
+                 USB_GAHBCFG_DMAEN | USB_GAHBCFG_HBSTLEN_INCR;
+
+  /* Set Rx FIFO size */
+  USB->GRXFSIZ = ( rxFifoSize << _USB_GRXFSIZ_RXFDEP_SHIFT ) &
+                 _USB_GRXFSIZ_RXFDEP_MASK;
+
+  /* Set Tx FIFO sizes */
+  USB->GNPTXFSIZ = ( ( nptxFifoSize <<
+                       _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) &
+                     _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK        ) |
+                   ( ( rxFifoSize <<
+                       _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT      ) &
+                     _USB_GNPTXFSIZ_NPTXFSTADDR_MASK             );
+
+  USB->HPTXFSIZ  = ( ( ptxFifoSize  << _USB_HPTXFSIZ_PTXFSIZE_SHIFT   ) &
+                     _USB_HPTXFSIZ_PTXFSIZE_MASK                          ) |
+                   ( ( ( rxFifoSize + nptxFifoSize )
+                                    << _USB_HPTXFSIZ_PTXFSTADDR_SHIFT ) &
+                     _USB_HPTXFSIZ_PTXFSTADDR_MASK                        );
+
+  /* Flush Tx and Rx FIFO's */
+  USBHAL_FlushTxFifo( 0x10 );
+  USBHAL_FlushRxFifo();
+
+  for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
+  {
+    USB->HC[ i ].CHAR = USB_HC_CHAR_CHDIS;      /* Disable channel          */
+    USB->HC[ i ].INT = 0xFFFFFFFF;              /* Clear pending interrupts */
+  }
+
+  /* Enable and halt all channels */
+  for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
+  {
+    USB->HC[ i ].CHAR |= USB_HC_CHAR_CHDIS | USB_HC_CHAR_CHENA;
+    do
+    {
+      __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
+    }
+    while ( USB->HC[ i ].CHAR & USB_HC_CHAR_CHENA );
+  }
+
+  /* Disable all interrupts */
+  for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
+  {
+    USB->HC[ i ].INTMSK = 0;
+  }
+
+  USB->HAINTMSK = 0;
+
+  return USB_STATUS_OK;
+}
+
+void USBHHAL_HCHalt( int hcnum, uint32_t hcchar )
+{
+  hcchar |= USB_HC_CHAR_CHENA | USB_HC_CHAR_CHDIS;
+  USB->HC[ hcnum ].CHAR = hcchar;
+}
+
+void USBHHAL_HCInit( int hcnum )
+{
+  USBH_Ep_TypeDef *ep;
+
+  ep = hcs[ hcnum ].ep;
+  USB->HC[ hcnum ].INT = 0xFFFFFFFF;      /* Clear all interrupt flags      */
+
+  switch ( ep->type )                     /* Enable host channel int. types */
+  {
+    case USB_EPTYPE_CTRL:
+    case USB_EPTYPE_BULK:
+    case USB_EPTYPE_INTR:
+      USB->HC[ hcnum ].INTMSK = USB_HC_INT_CHHLTD;
+      break;
+  }
+
+  hcs[ hcnum ].errorCnt = 0;
+
+  USB->HAINTMSK |= 1 << hcnum;            /* Enable host channel interrupt  */
+
+  USB->HC[ hcnum ].CHAR =                 /* Program HCCHAR register        */
+      ( ep->parentDevice->addr     <<   _USB_HC_CHAR_DEVADDR_SHIFT     ) |
+      ( ( ep->addr & USB_EPNUM_MASK ) << _USB_HC_CHAR_EPNUM_SHIFT      ) |
+      ( ep->type                   <<   _USB_HC_CHAR_EPTYPE_SHIFT      ) |
+      ( ep->packetSize             <<   _USB_HC_CHAR_MPS_SHIFT         ) |
+      ( ep->in                      ?   USB_HC_CHAR_EPDIR         : 0  ) |
+      ( ep->parentDevice->speed ==
+                           HPRT_L_SPEED >> _USB_HPRT_PRTSPD_SHIFT
+                                    ?   USB_HC_CHAR_LSPDDEV       : 0  );
+}
+
+void USBHHAL_HCStart( int hcnum )
+{
+  USBH_Hc_TypeDef *hc;
+  uint16_t packets, len;
+
+  hc = &hcs[ hcnum ];
+  hc->status = 0;
+  hc->idle = false;
+
+  if ( hc->remaining > 0 )
+  {
+    packets = ( hc->remaining + hc->ep->packetSize - 1 ) / hc->ep->packetSize;
+  }
+  else
+  {
+    packets = 1;
+  }
+
+  if ( hc->ep->in )
+  {
+    len = packets * hc->ep->packetSize;
+  }
+  else
+  {
+    len = hc->remaining;
+  }
+
+  /* Initialize the HCTSIZn register */
+  hc->hwXferSize = len;
+  USB->HC[ hcnum ].TSIZ =
+          ( ( len             << _USB_HC_TSIZ_XFERSIZE_SHIFT ) &
+                                 _USB_HC_TSIZ_XFERSIZE_MASK       ) |
+          ( ( packets         << _USB_HC_TSIZ_PKTCNT_SHIFT   ) &
+                                 _USB_HC_TSIZ_PKTCNT_MASK         ) |
+          ( ( hc->ep->toggle  << _USB_HC_TSIZ_PID_SHIFT      ) &
+                                 _USB_HC_TSIZ_PID_MASK            );
+
+  USB->HC[ hcnum ].DMAADDR = (uint32_t)hc->buf;
+
+  USBHHAL_HCActivate( hcnum,
+                      USB->HC[ hcnum ].CHAR,
+                      hc->ep->type == USB_EPTYPE_INTR );
+}
+#endif /* defined( USB_HOST ) */
+
+/** @endcond */
+
+#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/TARGET_Silicon_Labs/src/em_usbtimer.c	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,381 @@
+/***************************************************************************//**
+ * @file em_usbtimer.c
+ * @brief USB protocol stack library, timer API.
+ * @version 3.20.14
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "em_device.h"
+#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
+#include "em_usb.h"
+#if defined( USB_DEVICE ) || defined( USB_HOST )
+#include "em_cmu.h"
+#include "em_timer.h"
+#include "em_usbtypes.h"
+#include "em_usbhal.h"
+
+#include "device_peripherals.h"
+
+/*
+ *  Use one HW timer to serve n software milisecond timers.
+ *  A timer is, when running, in a linked list of timers.
+ *  A given timers timeout period is the acculmulated timeout
+ *  of all timers preceeding it in the queue.
+ *  This makes timer start (linked list insertion) computing intensive,
+ *  but the checking of the queue at each tick very effective.
+ *             ______          ______          ______
+ *            |      |    --->|      |    --->|      |
+ *   head --> |      |   |    |      |   |    |      |
+ *            |______|---     |______|---     |______|---/ NULL
+ */
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+#ifndef USB_TIMER
+#error HW platform must define the timer to use for USB
+#endif
+
+#if ( USB_TIMER == USB_TIMER0 ) && ( TIMER_COUNT >= 1 )
+  #define TIMER             TIMER0
+  #define TIMER_CLK         cmuClock_TIMER0
+  #define TIMER_IRQ         TIMER0_IRQn
+  #define TIMER_IRQHandler  TIMER0_IRQHandler
+
+#elif ( USB_TIMER == USB_TIMER1 ) && ( TIMER_COUNT >= 2 )
+  #define TIMER             TIMER1
+  #define TIMER_CLK         cmuClock_TIMER1
+  #define TIMER_IRQ         TIMER1_IRQn
+  #define TIMER_IRQHandler  TIMER1_IRQHandler
+
+#elif ( USB_TIMER == USB_TIMER2 ) && ( TIMER_COUNT >= 3 )
+  #define TIMER             TIMER2
+  #define TIMER_CLK         cmuClock_TIMER2
+  #define TIMER_IRQ         TIMER2_IRQn
+  #define TIMER_IRQHandler  TIMER2_IRQHandler
+
+#elif ( USB_TIMER == USB_TIMER3 ) && ( TIMER_COUNT == 4 )
+  #define TIMER             TIMER3
+  #define TIMER_CLK         cmuClock_TIMER3
+  #define TIMER_IRQ         TIMER3_IRQn
+  #define TIMER_IRQHandler  TIMER3_IRQHandler
+
+#else
+#error "Illegal USB TIMER definition"
+#endif
+
+typedef struct _timer
+{
+  uint32_t                  timeout;  /* Delta value relative to prev. timer */
+  struct _timer             *next;
+  USBTIMER_Callback_TypeDef callback;
+  bool                      running;
+} USBTIMER_Timer_TypeDef;
+
+#if ( NUM_QTIMERS > 0 )
+static USBTIMER_Timer_TypeDef timers[ NUM_QTIMERS ];
+static USBTIMER_Timer_TypeDef *head = NULL;
+#endif
+
+static uint32_t ticksPrMs, ticksPr1us, ticksPr10us, ticksPr100us;
+
+#if ( NUM_QTIMERS > 0 )
+
+static void TimerTick( void );
+
+void TIMER_IRQHandler( void )
+{
+  uint32_t flags;
+
+  flags = TIMER_IntGet( TIMER );
+
+  if ( flags & TIMER_IF_CC0 )
+  {
+    TIMER_IntClear( TIMER, TIMER_IFC_CC0 );
+    TIMER_CompareSet( TIMER, 0, TIMER_CaptureGet( TIMER, 0 ) + ticksPrMs );
+    TimerTick();
+  }
+}
+#endif /* ( NUM_QTIMERS > 0 ) */
+
+static void DelayTicks( uint16_t ticks )
+{
+  uint16_t startTime;
+  volatile uint16_t now;
+
+  if ( ticks )
+  {
+    startTime = TIMER_CounterGet( TIMER );
+    do
+    {
+      now = TIMER_CounterGet(TIMER);
+    } while ( (uint16_t)( now - startTime ) < ticks );
+  }
+}
+
+/** @endcond */
+
+/** @addtogroup USB_COMMON
+ *  @{*/
+
+/***************************************************************************//**
+ * @brief
+ *   Active wait millisecond delay function. Can also be used inside
+ *   interrupt handlers.
+ *
+ * @param[in] msec
+ *   Number of milliseconds to wait.
+ ******************************************************************************/
+void USBTIMER_DelayMs( uint32_t msec )
+{
+  uint64_t totalTicks;
+
+  totalTicks = (uint64_t)ticksPrMs * msec;
+  while ( totalTicks > 20000 )
+  {
+    DelayTicks( 20000 );
+    totalTicks -= 20000;
+  }
+  DelayTicks( (uint16_t)totalTicks );
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Active wait microsecond delay function. Can also be used inside
+ *   interrupt handlers.
+ *
+ * @param[in] usec
+ *   Number of microseconds to wait.
+ ******************************************************************************/
+void USBTIMER_DelayUs( uint32_t usec )
+{
+  uint64_t totalTicks;
+
+  totalTicks = (uint64_t)ticksPr1us * usec;
+  if ( totalTicks == 0 )
+  {
+    usec /= 10;
+    totalTicks = (uint64_t)ticksPr10us * usec;
+
+    if ( totalTicks == 0 )
+    {
+      usec /= 10;
+      totalTicks = (uint64_t)ticksPr100us * usec;
+    }
+  }
+
+  while ( totalTicks > 60000 )
+  {
+    DelayTicks( 60000 );
+    totalTicks -= 60000;
+  }
+  DelayTicks( (uint16_t)totalTicks );
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Activate the hardware timer used to pace the 1 millisecond timer system.
+ *
+ * @details
+ *   Call this function whenever the HFPERCLK frequency is changed.
+ *   This function is initially called by HOST and DEVICE stack xxxx_Init()
+ *   functions.
+ ******************************************************************************/
+void USBTIMER_Init( void )
+{
+  uint32_t freq;
+  TIMER_Init_TypeDef timerInit     = TIMER_INIT_DEFAULT;
+  TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT;
+
+  freq = CMU_ClockFreqGet( cmuClock_HFPER );
+  ticksPrMs = ( freq + 500 ) / 1000;
+  ticksPr1us = ( freq + 500000 ) / 1000000;
+  ticksPr10us = ( freq + 50000 ) / 100000;
+  ticksPr100us = ( freq + 5000 ) / 10000;
+
+  timerCCInit.mode = timerCCModeCompare;
+  CMU_ClockEnable( TIMER_CLK, true );
+  TIMER_TopSet( TIMER, 0xFFFF );
+  TIMER_InitCC( TIMER, 0, &timerCCInit );
+  TIMER_Init( TIMER, &timerInit );
+
+#if ( NUM_QTIMERS > 0 )
+  TIMER_IntClear( TIMER, 0xFFFFFFFF );
+  TIMER_IntEnable( TIMER, TIMER_IEN_CC0 );
+  TIMER_CompareSet( TIMER, 0, TIMER_CounterGet( TIMER ) + ticksPrMs );
+  NVIC_ClearPendingIRQ( TIMER_IRQ );
+  NVIC_EnableIRQ( TIMER_IRQ );
+#endif /* ( NUM_QTIMERS > 0 ) */
+}
+
+#if ( NUM_QTIMERS > 0 ) || defined( DOXY_DOC_ONLY )
+/***************************************************************************//**
+ * @brief
+ *   Start a timer.
+ *
+ * @details
+ *   If the timer is already running, it will be restarted with new timeout.
+ *
+ * @param[in] id
+ *   Timer id (0..).
+ *
+ * @param[in] timeout
+ *   Number of milliseconds before timer will elapse.
+ *
+ * @param[in] callback
+ *   Function to be called on timer elapse, ref. @ref USBTIMER_Callback_TypeDef.
+ ******************************************************************************/
+void USBTIMER_Start( uint32_t id, uint32_t timeout,
+                     USBTIMER_Callback_TypeDef callback )
+{
+  uint32_t accumulated;
+  USBTIMER_Timer_TypeDef *this, **last;
+
+  INT_Disable();
+
+  if ( timers[ id ].running )
+  {
+    USBTIMER_Stop( id );
+  }
+
+  if ( timeout == 0 )
+  {
+    callback();
+    INT_Enable();
+    return;
+  }
+
+  timers[ id ].running  = true;
+  timers[ id ].callback = callback;
+  timers[ id ].next     = NULL;
+
+  if ( !head )                                        /* Queue empty ? */
+  {
+    timers[ id ].timeout  = timeout;
+    head = &timers[ id ];
+  }
+  else
+  {
+    this = head;
+    last = &head;
+    accumulated = 0;
+
+    /* Do a sorted insert */
+    while ( this  )
+    {
+      if ( timeout < accumulated + this->timeout )  /* Insert before "this" ? */
+      {
+        timers[ id ].timeout  = timeout - accumulated;
+        timers[ id ].next     = this;
+        *last = &timers[ id ];
+        this->timeout -= timers[ id ].timeout;        /* Adjust timeout     */
+        break;
+      }
+      else if ( this->next == NULL )                  /* At end of queue ?  */
+      {
+        timers[ id ].timeout  = timeout - accumulated - this->timeout;
+        this->next = &timers[ id ];
+        break;
+      }
+      accumulated += this->timeout;
+      last = &this->next;
+      this = this->next;
+    }
+  }
+
+  INT_Enable();
+}
+
+/***************************************************************************//**
+ * @brief
+ *   Stop a timer.
+ *
+ * @param[in] id
+ *   Timer id (0..).
+ ******************************************************************************/
+void USBTIMER_Stop( uint32_t id )
+{
+  USBTIMER_Timer_TypeDef *this, **last;
+
+  INT_Disable();
+
+  if ( head )                                           /* Queue empty ?    */
+  {
+    this = head;
+    last = &head;
+    timers[ id ].running = false;
+
+    while ( this  )
+    {
+      if ( this == &timers[ id ] )                      /* Correct timer ?  */
+      {
+        if ( this->next )
+        {
+          this->next->timeout += timers[ id ].timeout;  /* Adjust timeout   */
+        }
+        *last = this->next;
+        break;
+      }
+      last = &this->next;
+      this = this->next;
+    }
+  }
+
+  INT_Enable();
+}
+#endif /* ( NUM_QTIMERS > 0 ) */
+
+/** @} (end addtogroup USB_COMMON) */
+
+#if ( NUM_QTIMERS > 0 )
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+static void TimerTick( void )
+{
+  USBTIMER_Callback_TypeDef cb;
+
+  INT_Disable();
+
+  if ( head )
+  {
+    head->timeout--;
+
+    while ( head  )
+    {
+      if ( head->timeout == 0 )
+      {
+        cb = head->callback;
+        head->running = false;
+        head = head->next;
+        /* The callback may place new items in the queue !!! */
+        if ( cb )
+        {
+          (cb)();
+        }
+        continue; /* There might be more than one timeout pr. tick */
+      }
+      break;
+    }
+  }
+
+  INT_Enable();
+}
+/** @endcond */
+#endif /* ( NUM_QTIMERS > 0 ) */
+
+#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
+#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBDescriptor.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,74 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* Standard descriptor types */
+#define DEVICE_DESCRIPTOR        (1)
+#define CONFIGURATION_DESCRIPTOR (2)
+#define STRING_DESCRIPTOR        (3)
+#define INTERFACE_DESCRIPTOR     (4)
+#define ENDPOINT_DESCRIPTOR      (5)
+#define QUALIFIER_DESCRIPTOR     (6)
+
+/* Standard descriptor lengths */
+#define DEVICE_DESCRIPTOR_LENGTH        (0x12)
+#define CONFIGURATION_DESCRIPTOR_LENGTH (0x09)
+#define INTERFACE_DESCRIPTOR_LENGTH     (0x09)
+#define ENDPOINT_DESCRIPTOR_LENGTH      (0x07)
+
+
+/*string offset*/
+#define STRING_OFFSET_LANGID            (0)
+#define STRING_OFFSET_IMANUFACTURER     (1)
+#define STRING_OFFSET_IPRODUCT          (2)
+#define STRING_OFFSET_ISERIAL           (3)
+#define STRING_OFFSET_ICONFIGURATION    (4)
+#define STRING_OFFSET_IINTERFACE        (5)
+
+/* USB Specification Release Number */
+#define USB_VERSION_2_0 (0x0200)
+
+/* Least/Most significant byte of short integer */
+#define LSB(n)  ((n)&0xff)
+#define MSB(n)  (((n)&0xff00)>>8)
+
+/* Convert physical endpoint number to descriptor endpoint number */
+#define PHY_TO_DESC(endpoint) (((endpoint)>>1) | (((endpoint) & 1) ? 0x80:0))
+
+/* bmAttributes in configuration descriptor */
+/* C_RESERVED must always be set */
+#define C_RESERVED      (1U<<7)
+#define C_SELF_POWERED  (1U<<6)
+#define C_REMOTE_WAKEUP (1U<<5)
+
+/* bMaxPower in configuration descriptor */
+#define C_POWER(mA)     ((mA)/2)
+
+/* bmAttributes in endpoint descriptor */
+#define E_CONTROL       (0x00)
+#define E_ISOCHRONOUS   (0x01)
+#define E_BULK          (0x02)
+#define E_INTERRUPT     (0x03)
+
+/* For isochronous endpoints only: */
+#define E_NO_SYNCHRONIZATION    (0x00)
+#define E_ASYNCHRONOUS          (0x04)
+#define E_ADAPTIVE              (0x08)
+#define E_SYNCHRONOUS           (0x0C)
+#define E_DATA                  (0x00)
+#define E_FEEDBACK              (0x10)
+#define E_IMPLICIT_FEEDBACK     (0x20)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBDevice.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,1005 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+
+#include "USBEndpoints.h"
+#include "USBDevice.h"
+#include "USBDescriptor.h"
+
+//#define DEBUG
+
+/* Device status */
+#define DEVICE_STATUS_SELF_POWERED  (1U<<0)
+#define DEVICE_STATUS_REMOTE_WAKEUP (1U<<1)
+
+/* Endpoint status */
+#define ENDPOINT_STATUS_HALT        (1U<<0)
+
+/* Standard feature selectors */
+#define DEVICE_REMOTE_WAKEUP        (1)
+#define ENDPOINT_HALT               (0)
+
+/* Macro to convert wIndex endpoint number to physical endpoint number */
+#define WINDEX_TO_PHYSICAL(endpoint) (((endpoint & 0x0f) << 1) + \
+    ((endpoint & 0x80) ? 1 : 0))
+
+
+bool USBDevice::requestGetDescriptor(void)
+{
+    bool success = false;
+#ifdef DEBUG
+    printf("get descr: type: %d\r\n", DESCRIPTOR_TYPE(transfer.setup.wValue));
+#endif
+    switch (DESCRIPTOR_TYPE(transfer.setup.wValue))
+    {
+        case DEVICE_DESCRIPTOR:
+            if (deviceDesc() != NULL)
+            {
+                if ((deviceDesc()[0] == DEVICE_DESCRIPTOR_LENGTH) \
+                    && (deviceDesc()[1] == DEVICE_DESCRIPTOR))
+                {
+#ifdef DEBUG
+                    printf("device descr\r\n");
+#endif
+                    transfer.remaining = DEVICE_DESCRIPTOR_LENGTH;
+                    transfer.ptr = deviceDesc();
+                    transfer.direction = DEVICE_TO_HOST;
+                    success = true;
+                }
+            }
+            break;
+        case CONFIGURATION_DESCRIPTOR:
+            if (configurationDesc() != NULL)
+            {
+                if ((configurationDesc()[0] == CONFIGURATION_DESCRIPTOR_LENGTH) \
+                    && (configurationDesc()[1] == CONFIGURATION_DESCRIPTOR))
+                {
+#ifdef DEBUG
+                    printf("conf descr request\r\n");
+#endif
+                    /* Get wTotalLength */
+                    transfer.remaining = configurationDesc()[2] \
+                        | (configurationDesc()[3] << 8);
+
+                    transfer.ptr = configurationDesc();
+                    transfer.direction = DEVICE_TO_HOST;
+                    success = true;
+                }
+            }
+            break;
+        case STRING_DESCRIPTOR:
+#ifdef DEBUG
+            printf("str descriptor\r\n");
+#endif
+            switch (DESCRIPTOR_INDEX(transfer.setup.wValue))
+            {
+                            case STRING_OFFSET_LANGID:
+#ifdef DEBUG
+                                printf("1\r\n");
+#endif
+                                transfer.remaining = stringLangidDesc()[0];
+                                transfer.ptr = stringLangidDesc();
+                                transfer.direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case STRING_OFFSET_IMANUFACTURER:
+#ifdef DEBUG
+                                printf("2\r\n");
+#endif
+                                transfer.remaining =  stringImanufacturerDesc()[0];
+                                transfer.ptr = stringImanufacturerDesc();
+                                transfer.direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case STRING_OFFSET_IPRODUCT:
+#ifdef DEBUG
+                                printf("3\r\n");
+#endif
+                                transfer.remaining = stringIproductDesc()[0];
+                                transfer.ptr = stringIproductDesc();
+                                transfer.direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case STRING_OFFSET_ISERIAL:
+#ifdef DEBUG
+                                printf("4\r\n");
+#endif
+                                transfer.remaining = stringIserialDesc()[0];
+                                transfer.ptr = stringIserialDesc();
+                                transfer.direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case STRING_OFFSET_ICONFIGURATION:
+#ifdef DEBUG
+                                printf("5\r\n");
+#endif
+                                transfer.remaining = stringIConfigurationDesc()[0];
+                                transfer.ptr = stringIConfigurationDesc();
+                                transfer.direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+                            case STRING_OFFSET_IINTERFACE:
+#ifdef DEBUG
+                                printf("6\r\n");
+#endif
+                                transfer.remaining = stringIinterfaceDesc()[0];
+                                transfer.ptr = stringIinterfaceDesc();
+                                transfer.direction = DEVICE_TO_HOST;
+                                success = true;
+                                break;
+            }
+            break;
+        case INTERFACE_DESCRIPTOR:
+#ifdef DEBUG
+            printf("interface descr\r\n");
+#endif
+        case ENDPOINT_DESCRIPTOR:
+#ifdef DEBUG
+            printf("endpoint descr\r\n");
+#endif
+            /* TODO: Support is optional, not implemented here */
+            break;
+        default:
+#ifdef DEBUG
+            printf("ERROR\r\n");
+#endif
+            break;
+    }
+
+    return success;
+}
+
+void USBDevice::decodeSetupPacket(uint8_t *data, SETUP_PACKET *packet)
+{
+    /* Fill in the elements of a SETUP_PACKET structure from raw data */
+    packet->bmRequestType.dataTransferDirection = (data[0] & 0x80) >> 7;
+    packet->bmRequestType.Type = (data[0] & 0x60) >> 5;
+    packet->bmRequestType.Recipient = data[0] & 0x1f;
+    packet->bRequest = data[1];
+    packet->wValue = (data[2] | (uint16_t)data[3] << 8);
+    packet->wIndex = (data[4] | (uint16_t)data[5] << 8);
+    packet->wLength = (data[6] | (uint16_t)data[7] << 8);
+}
+
+
+bool USBDevice::controlOut(void)
+{
+    /* Control transfer data OUT stage */
+    uint8_t buffer[MAX_PACKET_SIZE_EP0];
+    uint32_t packetSize;
+
+    /* Check we should be transferring data OUT */
+    if (transfer.direction != HOST_TO_DEVICE)
+    {
+#if defined(TARGET_KL25Z) | defined(TARGET_KL43Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D5M) | defined(TARGET_K64F) | defined(TARGET_K22F) | defined(TARGET_TEENSY3_1)
+        /*
+         * We seem to have a pending device-to-host transfer.  The host must have
+         * sent a new control request without waiting for us to finish processing
+         * the previous one.  This appears to happen when we're connected to certain 
+         * USB 3.0 host chip set. Do a zeor-length send to tell the host we're not
+         * ready for the new request - that'll make it resend - and then just
+         * pretend we were successful here so that the pending transfer can finish.
+         */
+         uint8_t buf[1] = { 0 };
+         EP0write(buf, 0);
+         
+         /* execute our pending ttransfer */
+         controlIn();
+         
+         /* indicate success */
+         return true;
+ #else
+         /* for other platforms, count on the HAL to handle this case */
+         return false;
+ #endif
+    }
+
+    /* Read from endpoint */
+    packetSize = EP0getReadResult(buffer);
+
+    /* Check if transfer size is valid */
+    if (packetSize > transfer.remaining)
+    {
+        /* Too big */
+        return false;
+    }
+
+    /* Update transfer */
+    transfer.ptr += packetSize;
+    transfer.remaining -= packetSize;
+
+    /* Check if transfer has completed */
+    if (transfer.remaining == 0)
+    {
+        /* Transfer completed */
+        if (transfer.notify)
+        {
+            /* Notify class layer. */
+            USBCallback_requestCompleted(buffer, packetSize);
+            transfer.notify = false;
+        }
+        /* Status stage */
+        EP0write(NULL, 0);
+    }
+    else
+    {
+        EP0read();
+    }
+
+    return true;
+}
+
+bool USBDevice::controlIn(void)
+{
+    /* Control transfer data IN stage */
+    uint32_t packetSize;
+
+    /* Check if transfer has completed (status stage transactions */
+    /* also have transfer.remaining == 0) */
+    if (transfer.remaining == 0)
+    {
+        if (transfer.zlp)
+        {
+            /* Send zero length packet */
+            EP0write(NULL, 0);
+            transfer.zlp = false;
+        }
+
+        /* Transfer completed */
+        if (transfer.notify)
+        {
+            /* Notify class layer. */
+            USBCallback_requestCompleted(NULL, 0);
+            transfer.notify = false;
+        }
+
+        EP0read();
+        EP0readStage();
+
+        /* Completed */
+        return true;
+    }
+
+    /* Check we should be transferring data IN */
+    if (transfer.direction != DEVICE_TO_HOST)
+    {
+        return false;
+    }
+
+    packetSize = transfer.remaining;
+
+    if (packetSize > MAX_PACKET_SIZE_EP0)
+    {
+        packetSize = MAX_PACKET_SIZE_EP0;
+    }
+
+    /* Write to endpoint */
+    EP0write(transfer.ptr, packetSize);
+
+    /* Update transfer */
+    transfer.ptr += packetSize;
+    transfer.remaining -= packetSize;
+
+    return true;
+}
+
+bool USBDevice::requestSetAddress(void)
+{
+    /* Set the device address */
+    setAddress(transfer.setup.wValue);
+
+    if (transfer.setup.wValue == 0)
+    {
+        device.state = DEFAULT;
+    }
+    else
+    {
+        device.state = ADDRESS;
+    }
+
+    return true;
+}
+
+bool USBDevice::requestSetConfiguration(void)
+{
+
+    device.configuration = transfer.setup.wValue;
+    /* Set the device configuration */
+    if (device.configuration == 0)
+    {
+        /* Not configured */
+        unconfigureDevice();
+        device.state = ADDRESS;
+    }
+    else
+    {
+        if (USBCallback_setConfiguration(device.configuration))
+        {
+            /* Valid configuration */
+            configureDevice();
+            device.state = CONFIGURED;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool USBDevice::requestGetConfiguration(void)
+{
+    /* Send the device configuration */
+    transfer.ptr = &device.configuration;
+    transfer.remaining = sizeof(device.configuration);
+    transfer.direction = DEVICE_TO_HOST;
+    return true;
+}
+
+bool USBDevice::requestGetInterface(void)
+{
+    /* Return the selected alternate setting for an interface */
+
+    if (device.state != CONFIGURED)
+    {
+        return false;
+    }
+
+    /* Send the alternate setting */
+    transfer.setup.wIndex = currentInterface;
+    transfer.ptr = &currentAlternate;
+    transfer.remaining = sizeof(currentAlternate);
+    transfer.direction = DEVICE_TO_HOST;
+    return true;
+}
+
+bool USBDevice::requestSetInterface(void)
+{
+    bool success = false;
+    if(USBCallback_setInterface(transfer.setup.wIndex, transfer.setup.wValue))
+    {
+        success = true;
+        currentInterface = transfer.setup.wIndex;
+        currentAlternate = transfer.setup.wValue;
+    }
+    return success;
+}
+
+bool USBDevice::requestSetFeature()
+{
+    bool success = false;
+
+    if (device.state != CONFIGURED)
+    {
+        /* Endpoint or interface must be zero */
+        if (transfer.setup.wIndex != 0)
+        {
+            return false;
+        }
+    }
+
+    switch (transfer.setup.bmRequestType.Recipient)
+    {
+        case DEVICE_RECIPIENT:
+            /* TODO: Remote wakeup feature not supported */
+            break;
+        case ENDPOINT_RECIPIENT:
+            if (transfer.setup.wValue == ENDPOINT_HALT)
+            {
+                /* TODO: We should check that the endpoint number is valid */
+                stallEndpoint(
+                    WINDEX_TO_PHYSICAL(transfer.setup.wIndex));
+                success = true;
+            }
+            break;
+        default:
+            break;
+    }
+
+    return success;
+}
+
+bool USBDevice::requestClearFeature()
+{
+    bool success = false;
+
+    if (device.state != CONFIGURED)
+    {
+        /* Endpoint or interface must be zero */
+        if (transfer.setup.wIndex != 0)
+        {
+            return false;
+        }
+    }
+
+    switch (transfer.setup.bmRequestType.Recipient)
+    {
+        case DEVICE_RECIPIENT:
+            /* TODO: Remote wakeup feature not supported */
+            break;
+        case ENDPOINT_RECIPIENT:
+            /* TODO: We should check that the endpoint number is valid */
+            if (transfer.setup.wValue == ENDPOINT_HALT)
+            {
+                unstallEndpoint( WINDEX_TO_PHYSICAL(transfer.setup.wIndex));
+                success = true;
+            }
+            break;
+        default:
+            break;
+    }
+
+    return success;
+}
+
+bool USBDevice::requestGetStatus(void)
+{
+    static uint16_t status;
+    bool success = false;
+
+    if (device.state != CONFIGURED)
+    {
+        /* Endpoint or interface must be zero */
+        if (transfer.setup.wIndex != 0)
+        {
+            return false;
+        }
+    }
+
+    switch (transfer.setup.bmRequestType.Recipient)
+    {
+        case DEVICE_RECIPIENT:
+            /* TODO: Currently only supports self powered devices */
+            status = DEVICE_STATUS_SELF_POWERED;
+            success = true;
+            break;
+        case INTERFACE_RECIPIENT:
+            status = 0;
+            success = true;
+            break;
+        case ENDPOINT_RECIPIENT:
+            /* TODO: We should check that the endpoint number is valid */
+            if (getEndpointStallState(
+                WINDEX_TO_PHYSICAL(transfer.setup.wIndex)))
+            {
+                status = ENDPOINT_STATUS_HALT;
+            }
+            else
+            {
+                status = 0;
+            }
+            success = true;
+            break;
+        default:
+            break;
+    }
+
+    if (success)
+    {
+        /* Send the status */
+        transfer.ptr = (uint8_t *)&status; /* Assumes little endian */
+        transfer.remaining = sizeof(status);
+        transfer.direction = DEVICE_TO_HOST;
+    }
+
+    return success;
+}
+
+bool USBDevice::requestSetup(void)
+{
+    bool success = false;
+
+    /* Process standard requests */
+    if ((transfer.setup.bmRequestType.Type == STANDARD_TYPE))
+    {
+        switch (transfer.setup.bRequest)
+        {
+             case GET_STATUS:
+                 success = requestGetStatus();
+                 break;
+             case CLEAR_FEATURE:
+                 success = requestClearFeature();
+                 break;
+             case SET_FEATURE:
+                 success = requestSetFeature();
+                 break;
+             case SET_ADDRESS:
+                success = requestSetAddress();
+                 break;
+             case GET_DESCRIPTOR:
+                 success = requestGetDescriptor();
+                 break;
+             case SET_DESCRIPTOR:
+                 /* TODO: Support is optional, not implemented here */
+                 success = false;
+                 break;
+             case GET_CONFIGURATION:
+                 success = requestGetConfiguration();
+                 break;
+             case SET_CONFIGURATION:
+                 success = requestSetConfiguration();
+                 break;
+             case GET_INTERFACE:
+                 success = requestGetInterface();
+                 break;
+             case SET_INTERFACE:
+                 success = requestSetInterface();
+                 break;
+             default:
+                 break;
+        }
+    }
+
+    return success;
+}
+
+bool USBDevice::controlSetup(void)
+{
+    bool success = false;
+
+    /* Control transfer setup stage */
+    uint8_t buffer[MAX_PACKET_SIZE_EP0];
+
+    EP0setup(buffer);
+
+    /* Initialise control transfer state */
+    decodeSetupPacket(buffer, &transfer.setup);
+    transfer.ptr = NULL;
+    transfer.remaining = 0;
+    transfer.direction = 0;
+    transfer.zlp = false;
+    transfer.notify = false;
+
+#ifdef DEBUG
+    printf("dataTransferDirection: %d\r\nType: %d\r\nRecipient: %d\r\nbRequest: %d\r\nwValue: %d\r\nwIndex: %d\r\nwLength: %d\r\n",transfer.setup.bmRequestType.dataTransferDirection,
+                                                                                                                                   transfer.setup.bmRequestType.Type,
+                                                                                                                                   transfer.setup.bmRequestType.Recipient,
+                                                                                                                                   transfer.setup.bRequest,
+                                                                                                                                   transfer.setup.wValue,
+                                                                                                                                   transfer.setup.wIndex,
+                                                                                                                                   transfer.setup.wLength);
+#endif
+
+    /* Class / vendor specific */
+    success = USBCallback_request();
+
+    if (!success)
+    {
+        /* Standard requests */
+        if (!requestSetup())
+        {
+#ifdef DEBUG
+            printf("fail!!!!\r\n");
+#endif
+            return false;
+        }
+    }
+
+    /* Check transfer size and direction */
+    if (transfer.setup.wLength>0)
+    {
+        if (transfer.setup.bmRequestType.dataTransferDirection \
+            == DEVICE_TO_HOST)
+        {
+            /* IN data stage is required */
+            if (transfer.direction != DEVICE_TO_HOST)
+            {
+                return false;
+            }
+
+            /* Transfer must be less than or equal to the size */
+            /* requested by the host */
+            if (transfer.remaining > transfer.setup.wLength)
+            {
+                transfer.remaining = transfer.setup.wLength;
+            }
+        }
+        else
+        {
+
+            /* OUT data stage is required */
+            if (transfer.direction != HOST_TO_DEVICE)
+            {
+                return false;
+            }
+
+            /* Transfer must be equal to the size requested by the host */
+            if (transfer.remaining != transfer.setup.wLength)
+            {
+                return false;
+            }
+        }
+    }
+    else
+    {
+        /* No data stage; transfer size must be zero */
+        if (transfer.remaining != 0)
+        {
+            return false;
+        }
+    }
+
+    /* Data or status stage if applicable */
+    if (transfer.setup.wLength>0)
+    {
+        if (transfer.setup.bmRequestType.dataTransferDirection \
+            == DEVICE_TO_HOST)
+        {
+            /* Check if we'll need to send a zero length packet at */
+            /* the end of this transfer */
+            if (transfer.setup.wLength > transfer.remaining)
+            {
+                /* Device wishes to transfer less than host requested */
+                if ((transfer.remaining % MAX_PACKET_SIZE_EP0) == 0)
+                {
+                    /* Transfer is a multiple of EP0 max packet size */
+                    transfer.zlp = true;
+                }
+            }
+
+            /* IN stage */
+            controlIn();
+        }
+        else
+        {
+            /* OUT stage */
+            EP0read();
+        }
+    }
+    else
+    {
+        /* Status stage */
+        EP0write(NULL, 0);
+    }
+
+    return true;
+}
+
+void USBDevice::busReset(void)
+{
+    device.state = DEFAULT;
+    device.configuration = 0;
+    device.suspended = false;
+
+    /* Call class / vendor specific busReset function */
+    USBCallback_busReset();
+}
+
+void USBDevice::EP0setupCallback(void)
+{
+    /* Endpoint 0 setup event */
+    if (!controlSetup())
+    {
+        /* Protocol stall */
+        EP0stall();
+    }
+
+    /* Return true if an OUT data stage is expected */
+}
+
+void USBDevice::EP0out(void)
+{
+    /* Endpoint 0 OUT data event */
+    if (!controlOut())
+    {
+        /* Protocol stall; this will stall both endpoints */
+        EP0stall();
+    }
+}
+
+void USBDevice::EP0in(void)
+{
+#ifdef DEBUG
+    printf("EP0IN\r\n");
+#endif
+    /* Endpoint 0 IN data event */
+    if (!controlIn())
+    {
+        /* Protocol stall; this will stall both endpoints */
+        EP0stall();
+    }
+}
+
+bool USBDevice::configured(void)
+{
+    /* Returns true if device is in the CONFIGURED state */
+    return (device.state == CONFIGURED);
+}
+
+void USBDevice::connect(bool blocking)
+{
+    /* Connect device */
+    USBHAL::connect();
+
+    if (blocking) {
+        /* Block if not configured */
+        while (!configured());
+    }
+}
+
+void USBDevice::disconnect(void)
+{
+    /* Disconnect device */
+    USBHAL::disconnect();
+    
+    /* Set initial device state */
+    device.state = POWERED;
+    device.configuration = 0;
+    device.suspended = false;
+}
+
+CONTROL_TRANSFER * USBDevice::getTransferPtr(void)
+{
+    return &transfer;
+}
+
+bool USBDevice::addEndpoint(uint8_t endpoint, uint32_t maxPacket)
+{
+    return realiseEndpoint(endpoint, maxPacket, 0);
+}
+
+bool USBDevice::addRateFeedbackEndpoint(uint8_t endpoint, uint32_t maxPacket)
+{
+    /* For interrupt endpoints only */
+    return realiseEndpoint(endpoint, maxPacket, RATE_FEEDBACK_MODE);
+}
+
+uint8_t * USBDevice::findDescriptor(uint8_t descriptorType)
+{
+    /* Find a descriptor within the list of descriptors */
+    /* following a configuration descriptor. */
+    uint16_t wTotalLength;
+    uint8_t *ptr;
+
+    if (configurationDesc() == NULL)
+    {
+        return NULL;
+    }
+
+    /* Check this is a configuration descriptor */
+    if ((configurationDesc()[0] != CONFIGURATION_DESCRIPTOR_LENGTH) \
+            || (configurationDesc()[1] != CONFIGURATION_DESCRIPTOR))
+    {
+        return NULL;
+    }
+
+    wTotalLength = configurationDesc()[2] | (configurationDesc()[3] << 8);
+
+    /* Check there are some more descriptors to follow */
+    if (wTotalLength <= (CONFIGURATION_DESCRIPTOR_LENGTH+2))
+    /* +2 is for bLength and bDescriptorType of next descriptor */
+    {
+        return NULL;
+    }
+
+    /* Start at first descriptor after the configuration descriptor */
+    ptr = &(configurationDesc()[CONFIGURATION_DESCRIPTOR_LENGTH]);
+
+    do {
+        if (ptr[1] /* bDescriptorType */ == descriptorType)
+        {
+            /* Found */
+            return ptr;
+        }
+
+        /* Skip to next descriptor */
+        ptr += ptr[0]; /* bLength */
+    } while (ptr < (configurationDesc() + wTotalLength));
+
+    /* Reached end of the descriptors - not found */
+    return NULL;
+}
+
+
+void USBDevice::connectStateChanged(unsigned int connected)
+{
+}
+
+void USBDevice::suspendStateChanged(unsigned int suspended)
+{
+}
+
+
+USBDevice::USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release){
+    VENDOR_ID = vendor_id;
+    PRODUCT_ID = product_id;
+    PRODUCT_RELEASE = product_release;
+
+    /* Set initial device state */
+    device.state = POWERED;
+    device.configuration = 0;
+    device.suspended = false;
+};
+
+
+bool USBDevice::readStart(uint8_t endpoint, uint32_t maxSize)
+{
+    return endpointRead(endpoint, maxSize) == EP_PENDING;
+}
+
+
+bool USBDevice::write(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize)
+{
+    EP_STATUS result;
+
+    if (size > maxSize)
+    {
+        return false;
+    }
+
+
+    if(!configured()) {
+        return false;
+    }
+
+    /* Send report */
+    result = endpointWrite(endpoint, buffer, size);
+
+    if (result != EP_PENDING)
+    {
+        return false;
+    }
+
+    /* Wait for completion */
+    do {
+        result = endpointWriteResult(endpoint);
+    } while ((result == EP_PENDING) && configured());
+
+    return (result == EP_COMPLETED);
+}
+
+
+bool USBDevice::writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize)
+{
+    EP_STATUS result;
+
+    if (size > maxSize)
+    {
+        return false;
+    }
+
+    if(!configured()) {
+        return false;
+    }
+
+    /* Send report */
+    result = endpointWrite(endpoint, buffer, size);
+
+    if (result != EP_PENDING)
+    {
+        return false;
+    }
+
+    result = endpointWriteResult(endpoint);
+
+    return (result == EP_COMPLETED);
+}
+
+
+
+bool USBDevice::readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize)
+{
+    EP_STATUS result;
+
+    if(!configured()) {
+        return false;
+    }
+
+    /* Wait for completion */
+    do {
+        result = endpointReadResult(endpoint, buffer, size);
+    } while ((result == EP_PENDING) && configured());
+
+    return (result == EP_COMPLETED);
+}
+
+
+bool USBDevice::readEP_NB(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize)
+{
+    EP_STATUS result;
+
+    if(!configured()) {
+        return false;
+    }
+
+    result = endpointReadResult(endpoint, buffer, size);
+
+    return (result == EP_COMPLETED);
+}
+
+
+
+uint8_t * USBDevice::deviceDesc() {
+    static uint8_t deviceDescriptor[] = {
+        DEVICE_DESCRIPTOR_LENGTH,       /* bLength */
+        DEVICE_DESCRIPTOR,              /* bDescriptorType */
+        LSB(USB_VERSION_2_0),           /* bcdUSB (LSB) */
+        MSB(USB_VERSION_2_0),           /* bcdUSB (MSB) */
+        0x00,                           /* bDeviceClass */
+        0x00,                           /* bDeviceSubClass */
+        0x00,                           /* bDeviceprotocol */
+        MAX_PACKET_SIZE_EP0,            /* bMaxPacketSize0 */
+        (uint8_t)(LSB(VENDOR_ID)),                 /* idVendor (LSB) */
+        (uint8_t)(MSB(VENDOR_ID)),                 /* idVendor (MSB) */
+        (uint8_t)(LSB(PRODUCT_ID)),                /* idProduct (LSB) */
+        (uint8_t)(MSB(PRODUCT_ID)),                /* idProduct (MSB) */
+        (uint8_t)(LSB(PRODUCT_RELEASE)),           /* bcdDevice (LSB) */
+        (uint8_t)(MSB(PRODUCT_RELEASE)),           /* bcdDevice (MSB) */
+        STRING_OFFSET_IMANUFACTURER,    /* iManufacturer */
+        STRING_OFFSET_IPRODUCT,         /* iProduct */
+        STRING_OFFSET_ISERIAL,          /* iSerialNumber */
+        0x01                            /* bNumConfigurations */
+    };
+    return deviceDescriptor;
+}
+
+uint8_t * USBDevice::stringLangidDesc() {
+    static uint8_t stringLangidDescriptor[] = {
+        0x04,               /*bLength*/
+        STRING_DESCRIPTOR,  /*bDescriptorType 0x03*/
+        0x09,0x04,          /*bString Lang ID - 0x0409 - English*/
+    };
+    return stringLangidDescriptor;
+}
+
+uint8_t * USBDevice::stringImanufacturerDesc() {
+    static uint8_t stringImanufacturerDescriptor[] = {
+        0x12,                                            /*bLength*/
+        STRING_DESCRIPTOR,                               /*bDescriptorType 0x03*/
+        'm',0,'b',0,'e',0,'d',0,'.',0,'o',0,'r',0,'g',0, /*bString iManufacturer - mbed.org*/
+    };
+    return stringImanufacturerDescriptor;
+}
+
+uint8_t * USBDevice::stringIserialDesc() {
+    static uint8_t stringIserialDescriptor[] = {
+        0x16,                                                           /*bLength*/
+        STRING_DESCRIPTOR,                                              /*bDescriptorType 0x03*/
+        '0',0,'1',0,'2',0,'3',0,'4',0,'5',0,'6',0,'7',0,'8',0,'9',0,    /*bString iSerial - 0123456789*/
+    };
+    return stringIserialDescriptor;
+}
+
+uint8_t * USBDevice::stringIConfigurationDesc() {
+    static uint8_t stringIconfigurationDescriptor[] = {
+        0x06,               /*bLength*/
+        STRING_DESCRIPTOR,  /*bDescriptorType 0x03*/
+        '0',0,'1',0,        /*bString iConfiguration - 01*/
+    };
+    return stringIconfigurationDescriptor;
+}
+
+uint8_t * USBDevice::stringIinterfaceDesc() {
+    static uint8_t stringIinterfaceDescriptor[] = {
+        0x08,               /*bLength*/
+        STRING_DESCRIPTOR,  /*bDescriptorType 0x03*/
+        'U',0,'S',0,'B',0,  /*bString iInterface - USB*/
+    };
+    return stringIinterfaceDescriptor;
+}
+
+uint8_t * USBDevice::stringIproductDesc() {
+    static uint8_t stringIproductDescriptor[] = {
+        0x16,                                                       /*bLength*/
+        STRING_DESCRIPTOR,                                          /*bDescriptorType 0x03*/
+        'U',0,'S',0,'B',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 /*bString iProduct - USB DEVICE*/
+    };
+    return stringIproductDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBDevice.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,271 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBDEVICE_H
+#define USBDEVICE_H
+
+#include "mbed.h"
+#include "USBDevice_Types.h"
+#include "USBHAL.h"
+
+class USBDevice: public USBHAL
+{
+public:
+    USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release);
+
+    /*
+    * Check if the device is configured
+    *
+    * @returns true if configured, false otherwise
+    */
+    bool configured(void);
+
+    /*
+    * Connect a device
+    *
+    * @param blocking: block if not configured
+    */
+    void connect(bool blocking = true);
+
+    /*
+    * Disconnect a device
+    */
+    void disconnect(void);
+
+    /*
+    * Add an endpoint
+    *
+    * @param endpoint endpoint which will be added
+    * @param maxPacket Maximum size of a packet which can be sent for this endpoint
+    * @returns true if successful, false otherwise
+    */
+    bool addEndpoint(uint8_t endpoint, uint32_t maxPacket);
+
+    /*
+    * Start a reading on a certain endpoint.
+    * You can access the result of the reading by USBDevice_read
+    *
+    * @param endpoint endpoint which will be read
+    * @param maxSize the maximum length that can be read
+    * @return true if successful
+    */
+    bool readStart(uint8_t endpoint, uint32_t maxSize);
+
+    /*
+    * Read a certain endpoint. Before calling this function, USBUSBDevice_readStart
+    * must be called.
+    *
+    * Warning: blocking
+    *
+    * @param endpoint endpoint which will be read
+    * @param buffer buffer will be filled with the data received
+    * @param size the number of bytes read will be stored in *size
+    * @param maxSize the maximum length that can be read
+    * @returns true if successful
+    */
+    bool readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
+
+    /*
+    * Read a certain endpoint.
+    *
+    * Warning: non blocking
+    *
+    * @param endpoint endpoint which will be read
+    * @param buffer buffer will be filled with the data received (if data are available)
+    * @param size the number of bytes read will be stored in *size
+    * @param maxSize the maximum length that can be read
+    * @returns true if successful
+    */
+    bool readEP_NB(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
+
+    /*
+    * Write a certain endpoint.
+    *
+    * Warning: blocking
+    *
+    * @param endpoint endpoint to write
+    * @param buffer data contained in buffer will be write
+    * @param size the number of bytes to write
+    * @param maxSize the maximum length that can be written on this endpoint
+    */
+    bool write(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize);
+
+
+    /*
+    * Write a certain endpoint.
+    *
+    * Warning: non blocking
+    *
+    * @param endpoint endpoint to write
+    * @param buffer data contained in buffer will be write
+    * @param size the number of bytes to write
+    * @param maxSize the maximum length that can be written on this endpoint
+    */
+    bool writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize);
+
+
+    /*
+    * Called by USBDevice layer on bus reset. Warning: Called in ISR context
+    *
+    * May be used to reset state
+    */
+    virtual void USBCallback_busReset(void) {};
+
+    /*
+    * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
+    * This is used to handle extensions to standard requests
+    * and class specific requests
+    *
+    * @returns true if class handles this request
+    */
+    virtual bool USBCallback_request() { return false; };
+
+    /*
+    * Called by USBDevice on Endpoint0 request completion
+    * if the 'notify' flag has been set to true. Warning: Called in ISR context
+    *
+    * In this case it is used to indicate that a HID report has
+    * been received from the host on endpoint 0
+    *
+    * @param buf buffer received on endpoint 0
+    * @param length length of this buffer
+    */
+    virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {};
+
+    /*
+    * Called by USBDevice layer. Set configuration of the device.
+    * For instance, you can add all endpoints that you need on this function.
+    *
+    * @param configuration Number of the configuration
+    */
+    virtual bool USBCallback_setConfiguration(uint8_t configuration) { return false; };
+
+    /*
+     * Called by USBDevice layer. Set interface/alternate of the device.
+     *
+     * @param interface Number of the interface to be configured
+     * @param alternate Number of the alternate to be configured
+     * @returns true if class handles this request
+     */
+    virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate) { return false; };
+
+    /*
+    * Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+    *
+    * @returns pointer to the device descriptor
+    */
+    virtual uint8_t * deviceDesc();
+
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc(){return NULL;};
+
+    /*
+    * Get string lang id descriptor
+    *
+    * @return pointer to the string lang id descriptor
+    */
+    virtual uint8_t * stringLangidDesc();
+
+    /*
+    * Get string manufacturer descriptor
+    *
+    * @returns pointer to the string manufacturer descriptor
+    */
+    virtual uint8_t * stringImanufacturerDesc();
+
+    /*
+    * Get string product descriptor
+    *
+    * @returns pointer to the string product descriptor
+    */
+    virtual uint8_t * stringIproductDesc();
+
+    /*
+    * Get string serial descriptor
+    *
+    * @returns pointer to the string serial descriptor
+    */
+    virtual uint8_t * stringIserialDesc();
+
+    /*
+    * Get string configuration descriptor
+    *
+    * @returns pointer to the string configuration descriptor
+    */
+    virtual uint8_t * stringIConfigurationDesc();
+
+    /*
+    * Get string interface descriptor
+    *
+    * @returns pointer to the string interface descriptor
+    */
+    virtual uint8_t * stringIinterfaceDesc();
+
+    /*
+    * Get the length of the report descriptor
+    *
+    * @returns length of the report descriptor
+    */
+    virtual uint16_t reportDescLength() { return 0; };
+
+
+
+protected:
+    virtual void busReset(void);
+    virtual void EP0setupCallback(void);
+    virtual void EP0out(void);
+    virtual void EP0in(void);
+    virtual void connectStateChanged(unsigned int connected);
+    virtual void suspendStateChanged(unsigned int suspended);
+    uint8_t * findDescriptor(uint8_t descriptorType);
+    CONTROL_TRANSFER * getTransferPtr(void);
+
+    uint16_t VENDOR_ID;
+    uint16_t PRODUCT_ID;
+    uint16_t PRODUCT_RELEASE;
+
+private:
+    bool addRateFeedbackEndpoint(uint8_t endpoint, uint32_t maxPacket);
+    bool requestGetDescriptor(void);
+    bool controlOut(void);
+    bool controlIn(void);
+    bool requestSetAddress(void);
+    bool requestSetConfiguration(void);
+    bool requestSetFeature(void);
+    bool requestClearFeature(void);
+    bool requestGetStatus(void);
+    bool requestSetup(void);
+    bool controlSetup(void);
+    void decodeSetupPacket(uint8_t *data, SETUP_PACKET *packet);
+    bool requestGetConfiguration(void);
+    bool requestGetInterface(void);
+    bool requestSetInterface(void);
+
+    CONTROL_TRANSFER transfer;
+    USB_DEVICE device;
+
+    uint16_t currentInterface;
+    uint8_t currentAlternate;
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBDevice_Types.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,85 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBDEVICE_TYPES_H
+#define USBDEVICE_TYPES_H
+
+#include <stdint.h>
+
+/* Standard requests */
+#define GET_STATUS        (0)
+#define CLEAR_FEATURE     (1)
+#define SET_FEATURE       (3)
+#define SET_ADDRESS       (5)
+#define GET_DESCRIPTOR    (6)
+#define SET_DESCRIPTOR    (7)
+#define GET_CONFIGURATION (8)
+#define SET_CONFIGURATION (9)
+#define GET_INTERFACE     (10)
+#define SET_INTERFACE     (11)
+
+/* bmRequestType.dataTransferDirection */
+#define HOST_TO_DEVICE (0)
+#define DEVICE_TO_HOST (1)
+
+/* bmRequestType.Type*/
+#define STANDARD_TYPE  (0)
+#define CLASS_TYPE     (1)
+#define VENDOR_TYPE    (2)
+#define RESERVED_TYPE  (3)
+
+/* bmRequestType.Recipient */
+#define DEVICE_RECIPIENT    (0)
+#define INTERFACE_RECIPIENT (1)
+#define ENDPOINT_RECIPIENT  (2)
+#define OTHER_RECIPIENT     (3)
+
+/* Descriptors */
+#define DESCRIPTOR_TYPE(wValue)  (wValue >> 8)
+#define DESCRIPTOR_INDEX(wValue) (wValue & 0xff)
+
+typedef struct {
+    struct {
+        uint8_t dataTransferDirection;
+        uint8_t Type;
+        uint8_t Recipient;
+    } bmRequestType;
+    uint8_t  bRequest;
+    uint16_t wValue;
+    uint16_t wIndex;
+    uint16_t wLength;
+} SETUP_PACKET;
+
+typedef struct {
+    SETUP_PACKET setup;
+    uint8_t *ptr;
+    uint32_t remaining;
+    uint8_t direction;
+    bool zlp;
+    bool notify;
+} CONTROL_TRANSFER;
+
+typedef enum {ATTACHED, POWERED, DEFAULT, ADDRESS, CONFIGURED} DEVICE_STATE;
+
+typedef struct {
+    volatile DEVICE_STATE state;
+    uint8_t configuration;
+    bool suspended;
+} USB_DEVICE;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,58 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBENDPOINTS_H
+#define USBENDPOINTS_H
+
+/* SETUP packet size */
+#define SETUP_PACKET_SIZE (8)
+
+/* Options flags for configuring endpoints */
+#define DEFAULT_OPTIONS     (0)
+#define SINGLE_BUFFERED     (1U << 0)
+#define ISOCHRONOUS         (1U << 1)
+#define RATE_FEEDBACK_MODE  (1U << 2) /* Interrupt endpoints only */
+
+/* Endpoint transfer status, for endpoints > 0 */
+typedef enum {
+    EP_COMPLETED,   /* Transfer completed */
+    EP_PENDING,     /* Transfer in progress */
+    EP_INVALID,     /* Invalid parameter */
+    EP_STALLED,     /* Endpoint stalled */
+} EP_STATUS;
+
+/* Include configuration for specific target */
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088) || defined(TARGET_LPC2460) || defined(TARGET_LPC4088_DM)
+#include "USBEndpoints_LPC17_LPC23.h"
+#elif defined(TARGET_LPC11UXX) || defined(TARGET_LPC1347) || defined (TARGET_LPC11U6X) || defined (TARGET_LPC1549)
+#include "USBEndpoints_LPC11U.h"
+#elif defined(TARGET_KL25Z) | defined(TARGET_KL26Z) | defined(TARGET_KL27Z) | defined(TARGET_KL43Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D50M) | defined(TARGET_K64F) | defined(TARGET_K22F) | defined(TARGET_TEENSY3_1)
+#include "USBEndpoints_KL25Z.h"
+#elif defined (TARGET_STM32F4)
+#include "USBEndpoints_STM32F4.h"
+#elif defined (TARGET_RZ_A1H) || defined (TARGET_VK_RZ_A1H)
+#include "USBEndpoints_RZ_A1H.h"
+#elif defined(TARGET_Maxim)
+#include "USBEndpoints_Maxim.h"
+#elif defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32WG_STK3800) || defined(TARGET_EFM32HG_STK3400)
+#include "USBEndpoints_EFM32.h"
+#else
+#error "Unknown target type"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints_EFM32.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,65 @@
+
+#ifndef TARGET_EFM32HG_STK3400
+# define NUMBER_OF_LOGICAL_ENDPOINTS   (6)
+#else
+# define NUMBER_OF_LOGICAL_ENDPOINTS   (3)
+#endif
+
+#define NUMBER_OF_PHYSICAL_ENDPOINTS  (NUMBER_OF_LOGICAL_ENDPOINTS * 2)
+#define NUMBER_OF_ENDPOINTS           (NUMBER_OF_PHYSICAL_ENDPOINTS + 2)  /* Includes EP0 */
+
+#define EP0OUT      (0)
+#define EP0IN       (1)
+#define EP1OUT      (2)
+#define EP1IN       (3)
+#define EP2OUT      (4)
+#define EP2IN       (5)
+#define EP3OUT      (6)
+#define EP3IN       (7)
+#ifndef TARGET_EFM32HG_STK3400
+# define EP4OUT     (8)
+# define EP4IN      (9)
+# define EP5OUT     (10)
+# define EP5IN      (11)
+# define EP6OUT     (12)
+# define EP6IN      (13)
+#endif
+
+#define USB_EP_TO_INDEX(ep) (ep)
+#define USB_EP_TO_ADDR(ep)  (((ep)>>1) | (((ep) & 1   ) ? 0x80 : 0x00))
+#define USB_ADDR_TO_EP(ep)  (((ep)<<1) | (((ep) & 0x80) ? 0x01 : 0x00))
+
+/* Maximum Packet sizes */
+
+#define MAX_PACKET_SIZE_EP0   64
+#define MAX_PACKET_SIZE_EP1   64
+#define MAX_PACKET_SIZE_EP2   64
+#define MAX_PACKET_SIZE_EP3   64
+#ifndef TARGET_EFM32HG_STK3400
+# define MAX_PACKET_SIZE_EP4  64
+# define MAX_PACKET_SIZE_EP5  64
+# define MAX_PACKET_SIZE_EP6  64
+#endif
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoints */
+#define EPBULK_OUT            EP2OUT
+#define EPBULK_IN             EP2IN
+#define EPBULK_OUT_callback   EP2_OUT_callback
+#define EPBULK_IN_callback    EP2_IN_callback
+/* Interrupt endpoints */
+#define EPINT_OUT             EP1OUT
+#define EPINT_IN              EP1IN
+#define EPINT_OUT_callback    EP1_OUT_callback
+#define EPINT_IN_callback     EP1_IN_callback
+/* Isochronous endpoints */
+#define EPISO_OUT             EP3OUT
+#define EPISO_IN              EP3IN
+#define EPISO_OUT_callback    EP3_OUT_callback
+#define EPISO_IN_callback     EP3_IN_callback
+
+#define MAX_PACKET_SIZE_EPBULK  64
+#define MAX_PACKET_SIZE_EPINT   64
+#define MAX_PACKET_SIZE_EPISO   1023
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints_KL25Z.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,99 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define NUMBER_OF_LOGICAL_ENDPOINTS (16)
+#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2)
+
+/* Define physical endpoint numbers */
+
+/*      Endpoint    No.   */
+/*      ----------------  */
+#define EP0OUT      (0)
+#define EP0IN       (1)
+#define EP1OUT      (2)
+#define EP1IN       (3)
+#define EP2OUT      (4)
+#define EP2IN       (5)
+#define EP3OUT      (6)
+#define EP3IN       (7)
+#define EP4OUT      (8)
+#define EP4IN       (9)
+#define EP5OUT      (10)
+#define EP5IN       (11)
+#define EP6OUT      (12)
+#define EP6IN       (13)
+#define EP7OUT      (14)
+#define EP7IN       (15)
+#define EP8OUT      (16)
+#define EP8IN       (17)
+#define EP9OUT      (18)
+#define EP9IN       (19)
+#define EP10OUT     (20)
+#define EP10IN      (21)
+#define EP11OUT     (22)
+#define EP11IN      (23)
+#define EP12OUT     (24)
+#define EP12IN      (25)
+#define EP13OUT     (26)
+#define EP13IN      (27)
+#define EP14OUT     (28)
+#define EP14IN      (29)
+#define EP15OUT     (30)
+#define EP15IN      (31)
+
+/* Maximum Packet sizes */
+
+#define MAX_PACKET_SIZE_EP0  (64)
+#define MAX_PACKET_SIZE_EP1  (64)
+#define MAX_PACKET_SIZE_EP2  (64)
+#define MAX_PACKET_SIZE_EP3  (1023)
+#define MAX_PACKET_SIZE_EP4  (64)
+#define MAX_PACKET_SIZE_EP5  (64)
+#define MAX_PACKET_SIZE_EP6  (64)
+#define MAX_PACKET_SIZE_EP7  (64)
+#define MAX_PACKET_SIZE_EP8  (64)
+#define MAX_PACKET_SIZE_EP9  (64)
+#define MAX_PACKET_SIZE_EP10 (64)
+#define MAX_PACKET_SIZE_EP11 (64)
+#define MAX_PACKET_SIZE_EP12 (64)
+#define MAX_PACKET_SIZE_EP13 (64)
+#define MAX_PACKET_SIZE_EP14 (64)
+#define MAX_PACKET_SIZE_EP15 (64)
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoints */
+#define EPBULK_OUT  (EP2OUT)
+#define EPBULK_IN   (EP2IN)
+#define EPBULK_OUT_callback   EP2_OUT_callback
+#define EPBULK_IN_callback    EP2_IN_callback
+/* Interrupt endpoints */
+#define EPINT_OUT   (EP1OUT)
+#define EPINT_IN    (EP1IN)
+#define EPINT_OUT_callback    EP1_OUT_callback
+#define EPINT_IN_callback     EP1_IN_callback
+/* Isochronous endpoints */
+#define EPISO_OUT   (EP3OUT)
+#define EPISO_IN    (EP3IN)
+#define EPISO_OUT_callback    EP3_OUT_callback
+#define EPISO_IN_callback     EP3_IN_callback
+
+#define MAX_PACKET_SIZE_EPBULK  (MAX_PACKET_SIZE_EP2)
+#define MAX_PACKET_SIZE_EPINT   (MAX_PACKET_SIZE_EP1)
+#define MAX_PACKET_SIZE_EPISO   (MAX_PACKET_SIZE_EP3)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints_LPC11U.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,71 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define NUMBER_OF_LOGICAL_ENDPOINTS (5)
+#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2)
+
+/* Define physical endpoint numbers */
+
+/*      Endpoint    No.     Type(s)       MaxPacket   DoubleBuffer  */
+/*      ----------------    ------------  ----------  ---           */
+#define EP0OUT      (0)  /* Control       64          No            */
+#define EP0IN       (1)  /* Control       64          No            */
+#define EP1OUT      (2)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP1IN       (3)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP2OUT      (4)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP2IN       (5)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP3OUT      (6)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP3IN       (7)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP4OUT      (8)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP4IN       (9)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+
+/* Maximum Packet sizes */
+
+#define MAX_PACKET_SIZE_EP0 (64)
+#define MAX_PACKET_SIZE_EP1 (64) /* Int/Bulk */
+#define MAX_PACKET_SIZE_EP2 (64) /* Int/Bulk */
+#define MAX_PACKET_SIZE_EP3 (64) /* Int/Bulk */
+#define MAX_PACKET_SIZE_EP4 (64) /* Int/Bulk */
+
+#define MAX_PACKET_SIZE_EP1_ISO (1023) /* Isochronous */
+#define MAX_PACKET_SIZE_EP2_ISO (1023) /* Isochronous */
+#define MAX_PACKET_SIZE_EP3_ISO (1023) /* Isochronous */
+#define MAX_PACKET_SIZE_EP4_ISO (1023) /* Isochronous */
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoint */
+#define EPBULK_OUT  (EP2OUT)
+#define EPBULK_IN   (EP2IN)
+#define EPBULK_OUT_callback   EP2_OUT_callback
+#define EPBULK_IN_callback    EP2_IN_callback
+/* Interrupt endpoint */
+#define EPINT_OUT   (EP1OUT)
+#define EPINT_IN    (EP1IN)
+#define EPINT_OUT_callback    EP1_OUT_callback
+#define EPINT_IN_callback     EP1_IN_callback
+/* Isochronous endpoint */
+#define EPISO_OUT   (EP3OUT)
+#define EPISO_IN    (EP3IN)
+#define EPISO_OUT_callback    EP3_OUT_callback
+#define EPISO_IN_callback     EP3_IN_callback
+
+#define MAX_PACKET_SIZE_EPBULK  (MAX_PACKET_SIZE_EP2)
+#define MAX_PACKET_SIZE_EPINT   (MAX_PACKET_SIZE_EP1)
+#define MAX_PACKET_SIZE_EPISO   (MAX_PACKET_SIZE_EP3_ISO)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints_LPC17_LPC23.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,99 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define NUMBER_OF_LOGICAL_ENDPOINTS (16)
+#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2)
+
+/* Define physical endpoint numbers */
+
+/*      Endpoint    No.     Type(s)       MaxPacket   DoubleBuffer  */
+/*      ----------------    ------------  ----------  ---           */
+#define EP0OUT      (0)  /* Control       64          No            */
+#define EP0IN       (1)  /* Control       64          No            */
+#define EP1OUT      (2)  /* Interrupt     64          No            */
+#define EP1IN       (3)  /* Interrupt     64          No            */
+#define EP2OUT      (4)  /* Bulk          64          Yes           */
+#define EP2IN       (5)  /* Bulk          64          Yes           */
+#define EP3OUT      (6)  /* Isochronous   1023        Yes           */
+#define EP3IN       (7)  /* Isochronous   1023        Yes           */
+#define EP4OUT      (8)  /* Interrupt     64          No            */
+#define EP4IN       (9)  /* Interrupt     64          No            */
+#define EP5OUT      (10) /* Bulk          64          Yes           */
+#define EP5IN       (11) /* Bulk          64          Yes           */
+#define EP6OUT      (12) /* Isochronous   1023        Yes           */
+#define EP6IN       (13) /* Isochronous   1023        Yes           */
+#define EP7OUT      (14) /* Interrupt     64          No            */
+#define EP7IN       (15) /* Interrupt     64          No            */
+#define EP8OUT      (16) /* Bulk          64          Yes           */
+#define EP8IN       (17) /* Bulk          64          Yes           */
+#define EP9OUT      (18) /* Isochronous   1023        Yes           */
+#define EP9IN       (19) /* Isochronous   1023        Yes           */
+#define EP10OUT     (20) /* Interrupt     64          No            */
+#define EP10IN      (21) /* Interrupt     64          No            */
+#define EP11OUT     (22) /* Bulk          64          Yes           */
+#define EP11IN      (23) /* Bulk          64          Yes           */
+#define EP12OUT     (24) /* Isochronous   1023        Yes           */
+#define EP12IN      (25) /* Isochronous   1023        Yes           */
+#define EP13OUT     (26) /* Interrupt     64          No            */
+#define EP13IN      (27) /* Interrupt     64          No            */
+#define EP14OUT     (28) /* Bulk          64          Yes           */
+#define EP14IN      (29) /* Bulk          64          Yes           */
+#define EP15OUT     (30) /* Bulk          64          Yes           */
+#define EP15IN      (31) /* Bulk          64          Yes           */
+
+/* Maximum Packet sizes */
+
+#define MAX_PACKET_SIZE_EP0  (64)
+#define MAX_PACKET_SIZE_EP1  (64)
+#define MAX_PACKET_SIZE_EP2  (64)
+#define MAX_PACKET_SIZE_EP3  (1023)
+#define MAX_PACKET_SIZE_EP4  (64)
+#define MAX_PACKET_SIZE_EP5  (64)
+#define MAX_PACKET_SIZE_EP6  (1023)
+#define MAX_PACKET_SIZE_EP7  (64)
+#define MAX_PACKET_SIZE_EP8  (64)
+#define MAX_PACKET_SIZE_EP9  (1023)
+#define MAX_PACKET_SIZE_EP10 (64)
+#define MAX_PACKET_SIZE_EP11 (64)
+#define MAX_PACKET_SIZE_EP12 (1023)
+#define MAX_PACKET_SIZE_EP13 (64)
+#define MAX_PACKET_SIZE_EP14 (64)
+#define MAX_PACKET_SIZE_EP15 (64)
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoints */
+#define EPBULK_OUT  (EP2OUT)
+#define EPBULK_IN   (EP2IN)
+#define EPBULK_OUT_callback   EP2_OUT_callback
+#define EPBULK_IN_callback    EP2_IN_callback
+/* Interrupt endpoints */
+#define EPINT_OUT   (EP1OUT)
+#define EPINT_IN    (EP1IN)
+#define EPINT_OUT_callback    EP1_OUT_callback
+#define EPINT_IN_callback     EP1_IN_callback
+/* Isochronous endpoints */
+#define EPISO_OUT   (EP3OUT)
+#define EPISO_IN    (EP3IN)
+#define EPISO_OUT_callback    EP3_OUT_callback
+#define EPISO_IN_callback     EP3_IN_callback
+
+#define MAX_PACKET_SIZE_EPBULK  (MAX_PACKET_SIZE_EP2)
+#define MAX_PACKET_SIZE_EPINT   (MAX_PACKET_SIZE_EP1)
+#define MAX_PACKET_SIZE_EPISO   (MAX_PACKET_SIZE_EP3)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints_Maxim.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#define NUMBER_OF_LOGICAL_ENDPOINTS   (8)
+#define NUMBER_OF_PHYSICAL_ENDPOINTS  (NUMBER_OF_LOGICAL_ENDPOINTS * 2)
+
+#define DIR_OUT       0x00
+#define DIR_IN        0x01
+#define EP_NUM(ep)    (ep >> 1)
+#define IN_EP(ep)     (ep & DIR_IN)
+#define OUT_EP(ep)    (!(ep & DIR_IN))
+
+/* Define physical endpoint numbers */
+
+/*      Endpoint    No.   */
+/*      ----------------  */
+#define EP0OUT      ((0 << 1) | DIR_OUT)
+#define EP0IN       ((0 << 1) | DIR_IN)
+#define EP1OUT      ((1 << 1) | DIR_OUT)
+#define EP1IN       ((1 << 1) | DIR_IN)
+#define EP2OUT      ((2 << 1) | DIR_OUT)
+#define EP2IN       ((2 << 1) | DIR_IN)
+#define EP3OUT      ((3 << 1) | DIR_OUT)
+#define EP3IN       ((3 << 1) | DIR_IN)
+#define EP4OUT      ((4 << 1) | DIR_OUT)
+#define EP4IN       ((4 << 1) | DIR_IN)
+#define EP5OUT      ((5 << 1) | DIR_OUT)
+#define EP5IN       ((5 << 1) | DIR_IN)
+#define EP6OUT      ((6 << 1) | DIR_OUT)
+#define EP6IN       ((6 << 1) | DIR_IN)
+#define EP7OUT      ((7 << 1) | DIR_OUT)
+#define EP7IN       ((7 << 1) | DIR_IN)
+
+/* Maximum Packet sizes */
+
+#define MAX_PACKET_SIZE_EP0  (64)
+#define MAX_PACKET_SIZE_EP1  (64)
+#define MAX_PACKET_SIZE_EP2  (64)
+#define MAX_PACKET_SIZE_EP3  (64)
+#define MAX_PACKET_SIZE_EP4  (64)
+#define MAX_PACKET_SIZE_EP5  (64)
+#define MAX_PACKET_SIZE_EP6  (64)
+#define MAX_PACKET_SIZE_EP7  (64)
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoints */
+#define EPBULK_OUT  (EP1OUT)
+#define EPBULK_IN   (EP2IN)
+#define EPBULK_OUT_callback   EP1_OUT_callback
+#define EPBULK_IN_callback    EP2_IN_callback
+/* Interrupt endpoints */
+#define EPINT_OUT   (EP3OUT)
+#define EPINT_IN    (EP4IN)
+#define EPINT_OUT_callback    EP3_OUT_callback
+#define EPINT_IN_callback     EP4_IN_callback
+/* Isochronous endpoints */
+/* NOT SUPPORTED - use invalid endpoint number to prevent built errors */
+#define EPISO_OUT   (EP0OUT)
+#define EPISO_IN    (EP0IN)
+
+#define MAX_PACKET_SIZE_EPBULK  (64)
+#define MAX_PACKET_SIZE_EPINT   (64)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints_RZ_A1H.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,85 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define NUMBER_OF_LOGICAL_ENDPOINTS (16)
+#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2)
+
+/* Define physical endpoint numbers */
+
+/*      Endpoint    No.     Type(s)   MaxSiz  DoubleBuf  pipe */
+/*      ----------------    --------- ------  ---------  ---- */
+#define EP0OUT      (0)  /* Control    256    No           0  */
+#define EP0IN       (1)  /* Control    256    No           0  */
+#define EP1OUT      (2)  /* Int         64    No           6  */
+#define EP1IN       (3)  /* Int         64    No           7  */
+#define EP2OUT      (4)  /* Bulk      2048    Yes          3  */
+#define EP2IN       (5)  /* Bulk      2048    Yes          4  */
+#define EP3OUT      (6)  /* Bulk/Iso  2048    Yes          1  */
+#define EP3IN       (7)  /* Bulk/Iso  2048    Yes          2  */
+/*following EP is not configured in sample program*/
+#define EP6IN       (8)  /* Bulk      2048    Yes          5  */
+#define EP8IN       (9)  /* Int        64     No           8  */
+#define EP9IN       (10) /* Bulk       512    Bulk         9  */
+#define EP10IN      (11) /* Int/Bulk  2048    Bulk        10  */
+#define EP11IN      (12) /* Bulk      2048    Yes         11  */
+#define EP12IN      (13) /* Bulk      2048    Yes         12  */
+#define EP13IN      (14) /* Bulk      2048    Yes         13  */
+#define EP14IN      (15) /* Bulk      2048    Yes         14  */
+#define EP15IN      (16) /* Bulk      2048    Yes         15  */
+
+/* Maximum Packet sizes */
+#define MAX_PACKET_SIZE_EP0   (64)      /*pipe0/pipe0: control      */
+#define MAX_PACKET_SIZE_EP1   (64)      /*pipe6/pipe7: interrupt    */
+#define MAX_PACKET_SIZE_EP2  (512)      /*pipe3/pipe4: bulk         */
+#define MAX_PACKET_SIZE_EP3  (512)      /*pipe1/pipe2: isochronous  */
+#define MAX_PACKET_SIZE_EP6   (64)      /*pipe5:    Note *1 */
+#define MAX_PACKET_SIZE_EP8   (64)      /*pipe7:    Note *1 */
+#define MAX_PACKET_SIZE_EP9  (512)      /*pipe8:    Note *1 */
+#define MAX_PACKET_SIZE_EP10 (512)      /*pipe9:    Note *1 */
+#define MAX_PACKET_SIZE_EP11 (512)      /*pipe10:   Note *1 */
+#define MAX_PACKET_SIZE_EP12 (512)      /*pipe11:   Note *1 */
+#define MAX_PACKET_SIZE_EP13 (512)      /*pipe12:   Note *1 */
+#define MAX_PACKET_SIZE_EP14 (512)      /*pipe13:   Note *1 */
+#define MAX_PACKET_SIZE_EP15 (512)      /*pipe14:   Note *1 */
+/* Note *1: This pipe is not configure in sample program */
+
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoints */
+#define EPBULK_OUT  (EP2OUT)
+#define EPBULK_IN   (EP2IN)
+#define EPBULK_OUT_callback   EP2_OUT_callback
+#define EPBULK_IN_callback    EP2_IN_callback
+/* Interrupt endpoints */
+#define EPINT_OUT   (EP1OUT)
+#define EPINT_IN    (EP1IN)
+#define EPINT_OUT_callback    EP1_OUT_callback
+#define EPINT_IN_callback     EP1_IN_callback
+/* Isochronous endpoints */
+#define EPISO_OUT   (EP3OUT)
+#define EPISO_IN    (EP3IN)
+#define EPISO_OUT_callback    EP3_OUT_callback
+#define EPISO_IN_callback     EP3_IN_callback
+
+#define MAX_PACKET_SIZE_EPBULK  (MAX_PACKET_SIZE_EP2)
+#define MAX_PACKET_SIZE_EPINT   (MAX_PACKET_SIZE_EP1)
+#define MAX_PACKET_SIZE_EPISO   (MAX_PACKET_SIZE_EP3)
+
+/*EOF*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBEndpoints_STM32F4.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,67 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define NUMBER_OF_LOGICAL_ENDPOINTS (4)
+#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2)
+
+/* Define physical endpoint numbers */
+
+/*      Endpoint    No.     Type(s)       MaxPacket   DoubleBuffer  */
+/*      ----------------    ------------  ----------  ---           */
+#define EP0OUT      (0)  /* Control       64          No            */
+#define EP0IN       (1)  /* Control       64          No            */
+#define EP1OUT      (2)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP1IN       (3)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP2OUT      (4)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP2IN       (5)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP3OUT      (6)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+#define EP3IN       (7)  /* Int/Bulk/Iso  64/64/1023  Yes           */
+
+/* Maximum Packet sizes */
+
+#define MAX_PACKET_SIZE_EP0 (64)
+#define MAX_PACKET_SIZE_EP1 (64) /* Int/Bulk */
+#define MAX_PACKET_SIZE_EP2 (64) /* Int/Bulk */
+#define MAX_PACKET_SIZE_EP3 (64) /* Int/Bulk */
+
+#define MAX_PACKET_SIZE_EP1_ISO (1023) /* Isochronous */
+#define MAX_PACKET_SIZE_EP2_ISO (1023) /* Isochronous */
+#define MAX_PACKET_SIZE_EP3_ISO (1023) /* Isochronous */
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoint */
+#define EPBULK_OUT  (EP2OUT)
+#define EPBULK_IN   (EP2IN)
+#define EPBULK_OUT_callback   EP2_OUT_callback
+#define EPBULK_IN_callback    EP2_IN_callback
+/* Interrupt endpoint */
+#define EPINT_OUT   (EP1OUT)
+#define EPINT_IN    (EP1IN)
+#define EPINT_OUT_callback    EP1_OUT_callback
+#define EPINT_IN_callback     EP1_IN_callback
+/* Isochronous endpoint */
+#define EPISO_OUT   (EP3OUT)
+#define EPISO_IN    (EP3IN)
+#define EPISO_OUT_callback    EP3_OUT_callback
+#define EPISO_IN_callback     EP3_IN_callback
+
+#define MAX_PACKET_SIZE_EPBULK  (MAX_PACKET_SIZE_EP2)
+#define MAX_PACKET_SIZE_EPINT   (MAX_PACKET_SIZE_EP1)
+#define MAX_PACKET_SIZE_EPISO   (MAX_PACKET_SIZE_EP3_ISO)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,121 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBBUSINTERFACE_H
+#define USBBUSINTERFACE_H
+
+#include "mbed.h"
+#include "USBEndpoints.h"
+#include "toolchain.h"
+
+//#ifdef __GNUC__
+//#define __packed __attribute__ ((__packed__))
+//#endif
+
+class USBHAL {
+public:
+    /* Configuration */
+    USBHAL();
+    ~USBHAL();
+    void connect(void);
+    void disconnect(void);
+    void configureDevice(void);
+    void unconfigureDevice(void);
+    void setAddress(uint8_t address);
+    void remoteWakeup(void);
+
+    /* Endpoint 0 */
+    void EP0setup(uint8_t *buffer);
+    void EP0read(void);
+    void EP0readStage(void);
+    uint32_t EP0getReadResult(uint8_t *buffer);
+    void EP0write(uint8_t *buffer, uint32_t size);
+    void EP0getWriteResult(void);
+    void EP0stall(void);
+
+    /* Other endpoints */
+    EP_STATUS endpointRead(uint8_t endpoint, uint32_t maximumSize);
+    EP_STATUS endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead);
+    EP_STATUS endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size);
+    EP_STATUS endpointWriteResult(uint8_t endpoint);
+    void stallEndpoint(uint8_t endpoint);
+    void unstallEndpoint(uint8_t endpoint);
+    bool realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options);
+    bool getEndpointStallState(unsigned char endpoint);
+    uint32_t endpointReadcore(uint8_t endpoint, uint8_t *buffer);
+
+protected:
+    virtual void busReset(void){};
+    virtual void EP0setupCallback(void){};
+    virtual void EP0out(void){};
+    virtual void EP0in(void){};
+    virtual void connectStateChanged(unsigned int connected){};
+    virtual void suspendStateChanged(unsigned int suspended){};
+    virtual void SOF(int frameNumber){};
+
+    virtual bool EP1_OUT_callback(){return false;};
+    virtual bool EP1_IN_callback(){return false;};
+    virtual bool EP2_OUT_callback(){return false;};
+    virtual bool EP2_IN_callback(){return false;};
+    virtual bool EP3_OUT_callback(){return false;};
+    virtual bool EP3_IN_callback(){return false;};
+#if !defined(TARGET_STM32F4)
+    virtual bool EP4_OUT_callback(){return false;};
+    virtual bool EP4_IN_callback(){return false;};
+#if !(defined(TARGET_LPC11UXX) || defined(TARGET_LPC11U6X) || defined(TARGET_LPC1347) || defined(TARGET_LPC1549))
+    virtual bool EP5_OUT_callback(){return false;};
+    virtual bool EP5_IN_callback(){return false;};
+    virtual bool EP6_OUT_callback(){return false;};
+    virtual bool EP6_IN_callback(){return false;};
+    virtual bool EP7_OUT_callback(){return false;};
+    virtual bool EP7_IN_callback(){return false;};
+    virtual bool EP8_OUT_callback(){return false;};
+    virtual bool EP8_IN_callback(){return false;};
+    virtual bool EP9_OUT_callback(){return false;};
+    virtual bool EP9_IN_callback(){return false;};
+    virtual bool EP10_OUT_callback(){return false;};
+    virtual bool EP10_IN_callback(){return false;};
+    virtual bool EP11_OUT_callback(){return false;};
+    virtual bool EP11_IN_callback(){return false;};
+    virtual bool EP12_OUT_callback(){return false;};
+    virtual bool EP12_IN_callback(){return false;};
+    virtual bool EP13_OUT_callback(){return false;};
+    virtual bool EP13_IN_callback(){return false;};
+    virtual bool EP14_OUT_callback(){return false;};
+    virtual bool EP14_IN_callback(){return false;};
+    virtual bool EP15_OUT_callback(){return false;};
+    virtual bool EP15_IN_callback(){return false;};
+#endif
+#endif
+
+private:
+    void usbisr(void);
+    static void _usbisr(void);
+    static USBHAL * instance;
+
+#if defined(TARGET_LPC11UXX) || defined(TARGET_LPC11U6X) || defined(TARGET_LPC1347) || defined(TARGET_LPC1549)
+        bool (USBHAL::*epCallback[10 - 2])(void);
+#elif defined(TARGET_STM32F4)
+        bool (USBHAL::*epCallback[8 - 2])(void);
+#else
+        bool (USBHAL::*epCallback[32 - 2])(void);
+#endif
+
+
+};
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_EFM32.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,775 @@
+/* Copyright 2015 Silicon Labs, http://www.silabs.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if defined TARGET_EFM32GG_STK3700 || \
+    defined TARGET_EFM32LG_STK3600 || \
+    defined TARGET_EFM32WG_STK3800 || \
+    defined TARGET_EFM32HG_STK3400
+
+#include "USBHAL.h"
+#include "em_usb.h"
+#include "em_usbtypes.h"
+#include "em_usbhal.h"
+#include "em_usbd.h"
+
+#include "sleepmodes.h"
+
+enum USBISRCommand {
+    CMD_HANDLED = 0,
+    CMD_EP0SETUP,
+    CMD_EP0IN,
+    CMD_EP0OUT,
+    CMD_EP_XFER_COMPLETED,
+    CMD_SOF,
+    CMD_BUSRESET,
+    CMD_SUSPEND_STATE_CHANGED,
+    CMD_ENUM_END_MARKER
+};
+
+enum IEPStatus {
+    NOT_CONFIGURED = 0,
+    IDLE = 1,
+    READ_PENDING = 2,
+    WRITE_PENDING = 3,
+    READ_COMPLETE = 4,
+    WRITE_COMPLETE = 5,
+    FAILED_INVALID = 6,
+    FAILED_STALLED = 7
+};
+
+typedef struct {
+    IEPStatus status;
+    uint32_t byte_count;
+    uint32_t max_packet;
+    USB_XferCompleteCb_TypeDef intern_cb;
+    uint8_t *data_buf;
+} ep_state_t;
+
+USBHAL * USBHAL::instance;
+static uint8_t ep0setupdata[8];
+static ep_state_t ep_state[NUMBER_OF_ENDPOINTS];
+#ifdef USB_USE_DYNAMIC_MEMORY
+static uint8_t ep0in_data_buf[MAX_PACKET_SIZE_EP0] __attribute__ ((aligned (4)));
+static uint8_t ep0out_data_buf[MAX_PACKET_SIZE_EP0]; // FIXME: does this need to be this big?
+#else
+static uint8_t ep_data_buf[NUMBER_OF_ENDPOINTS][64] __attribute__ ((aligned (4)));
+#endif
+
+static void run_cmd(USBISRCommand cmd, uint32_t param);
+static void (*isrptr)() = NULL;
+static USBISRCommand usb_isrcmd = CMD_HANDLED;
+static uint32_t usb_isrcmd_param = 0;
+
+extern "C" void usbhal_allow_em2(bool allow_em2);
+
+#ifdef DEBUG_USB_API
+#define TRACE(fmt,...)            printf("USB:   %s: " fmt "\n", __func__, __VA_ARGS__);
+#define TRACE_FUNC_IN             printf("USB: > %s\n",__func__);
+#define TRACE_FUNC_IN_P(fmt, ...) printf("USB: > %s: " fmt "\n", __func__, __VA_ARGS__);
+#else
+#define TRACE(fmt,...)
+#define TRACE_FUNC_IN
+#define TRACE_FUNC_IN_P(fmt, ...)
+#endif
+
+static EP_STATUS internEndpointRead(uint8_t ep, uint32_t maxSize);
+
+static int usbhal_xfer_complete_cb(uint8_t epaddr, USB_Status_TypeDef status,
+                                   uint32_t xferred, uint32_t remaining);
+static void usbhal_free_buffers(void);
+
+/* Internal EP transfer complete callbacks */
+#define EPCB(n) static int usbhal_xfer_complete_cb_##n(USB_Status_TypeDef status,              \
+                                                       uint32_t xferred, uint32_t remaining) { \
+        return usbhal_xfer_complete_cb(n, status, xferred, remaining);                         \
+}
+/*   ------^   */
+EPCB(EP0OUT)
+EPCB(EP0IN)
+EPCB(EP1OUT)
+EPCB(EP1IN)
+EPCB(EP2OUT)
+EPCB(EP2IN)
+EPCB(EP3OUT)
+EPCB(EP3IN)
+#ifndef TARGET_EFM32HG_STK3400
+EPCB(EP4OUT)
+EPCB(EP4IN)
+EPCB(EP5OUT)
+EPCB(EP5IN)
+EPCB(EP6OUT)
+EPCB(EP6IN)
+#endif
+
+static inline bool is_aligned(const void *pointer, size_t byte_count)
+{
+    return ((uintptr_t)pointer % byte_count == 0);
+}
+
+USBHAL::USBHAL(void)
+{
+    TRACE_FUNC_IN;
+
+    isrptr = &USBHAL::_usbisr;
+
+    if (instance) {
+        TRACE("Assert self failed! instance=%p", instance);
+        abort();
+    }
+    instance = this;
+
+    // When USB is active, we can't go below EM1. This block may
+    // be dynamically removed/reinstated to allow deeper sleep.
+    usbhal_allow_em2(false);
+
+    // When in suspend / Vbus off we can go to EM2, but never below
+    // that as long as USB is being used. Despite the name the call here
+    // blocks entering modes _below_ EM2, but allows EM2.
+    blockSleepMode(EM2);
+
+    epCallback[EP0OUT] = NULL;
+    epCallback[EP0IN ] = NULL;
+    epCallback[EP1OUT] = &USBHAL::EP1_OUT_callback;
+    epCallback[EP1IN ] = &USBHAL::EP1_IN_callback;
+    epCallback[EP2OUT] = &USBHAL::EP2_OUT_callback;
+    epCallback[EP2IN ] = &USBHAL::EP2_IN_callback;
+    epCallback[EP3OUT] = &USBHAL::EP3_OUT_callback;
+    epCallback[EP3IN ] = &USBHAL::EP3_IN_callback;
+#ifndef TARGET_EFM32HG_STK3400
+    epCallback[EP4OUT] = &USBHAL::EP4_OUT_callback;
+    epCallback[EP4IN ] = &USBHAL::EP4_IN_callback;
+    epCallback[EP5OUT] = &USBHAL::EP5_OUT_callback;
+    epCallback[EP5IN ] = &USBHAL::EP5_IN_callback;
+    epCallback[EP6OUT] = &USBHAL::EP6_OUT_callback;
+    epCallback[EP6IN ] = &USBHAL::EP6_IN_callback;
+#endif
+
+    memset(ep_state, 0, sizeof(ep_state));
+
+    ep_state[EP0OUT].intern_cb = usbhal_xfer_complete_cb_EP0OUT;
+    ep_state[EP0IN ].intern_cb = usbhal_xfer_complete_cb_EP0IN;
+    ep_state[EP1OUT].intern_cb = usbhal_xfer_complete_cb_EP1OUT;
+    ep_state[EP1IN ].intern_cb = usbhal_xfer_complete_cb_EP1IN;
+    ep_state[EP2OUT].intern_cb = usbhal_xfer_complete_cb_EP2OUT;
+    ep_state[EP2IN ].intern_cb = usbhal_xfer_complete_cb_EP2IN;
+    ep_state[EP3OUT].intern_cb = usbhal_xfer_complete_cb_EP3OUT;
+    ep_state[EP3IN ].intern_cb = usbhal_xfer_complete_cb_EP3IN;
+#ifndef TARGET_EFM32HG_STK3400
+    ep_state[EP4OUT].intern_cb = usbhal_xfer_complete_cb_EP4OUT;
+    ep_state[EP4IN ].intern_cb = usbhal_xfer_complete_cb_EP4IN;
+    ep_state[EP5OUT].intern_cb = usbhal_xfer_complete_cb_EP5OUT;
+    ep_state[EP5IN ].intern_cb = usbhal_xfer_complete_cb_EP5IN;
+    ep_state[EP6OUT].intern_cb = usbhal_xfer_complete_cb_EP6OUT;
+    ep_state[EP6IN ].intern_cb = usbhal_xfer_complete_cb_EP6IN;
+#endif
+
+#ifdef USB_USE_DYNAMIC_MEMORY
+    ep_state[EP0OUT].data_buf = ep0out_data_buf;
+    ep_state[EP0IN].data_buf = ep0in_data_buf;
+#else
+    for (int i=0 ; i<NUMBER_OF_ENDPOINTS ; i++) {
+        ep_state[i].data_buf = ep_data_buf[i];
+    }
+#endif
+}
+
+USBHAL::~USBHAL(void)
+{
+    TRACE_FUNC_IN;
+    USBD_AbortAllTransfers();
+    USBD_Disconnect();
+    usbhal_free_buffers();
+
+    usbhal_allow_em2(true);
+    unblockSleepMode(EM2);
+}
+
+extern "C" void usbhal_allow_em2(bool allow_em2)
+{
+    if (allow_em2) {
+        // unblockSleepMode is safe to call even if we would unblock
+        // an already unblocked mode, so no checks here.
+        unblockSleepMode(EM1);
+    } else {
+        blockSleepMode(EM1);
+    }
+}
+
+static void usbhal_reset_cb(void)
+{
+    TRACE_FUNC_IN;
+    run_cmd(CMD_BUSRESET, 0);
+}
+
+#ifdef DEBUG_USB_API
+static const char *usbstate[] = { "NONE", "ATTACHED", "POWERED", "DEFAULT",
+                                  "ADDRESSED", "CONFIGURED", "SUSPENDED", "???" };
+#endif
+
+static void usbhal_state_change_cb(USBD_State_TypeDef oldState,
+                                   USBD_State_TypeDef newState)
+{
+    TRACE("state changed %s -> %s", usbstate[oldState], usbstate[newState]);
+
+    if (oldState == USBD_STATE_SUSPENDED) {
+        run_cmd(CMD_SUSPEND_STATE_CHANGED, 0);
+    }
+
+    if (newState == USBD_STATE_SUSPENDED) {
+        run_cmd(CMD_SUSPEND_STATE_CHANGED, 1);
+    }
+
+    // Should call connectStateChanged from here as well but there is
+    // no documentation on when to actually do so. (And the implementation
+    // in USBDevice.cpp is a stub)
+
+    // HACK! Since connectStateChanged is not used, indicate the loss
+    // off connection by reporting a bus reset. This causes USBDevice
+    // to realise that at least it's not in CONFIGURED anymore, and
+    // stop trying to read/write in a busyloop.
+    if (newState == USBD_STATE_NONE) {
+        run_cmd(CMD_BUSRESET, 0);
+    }
+}
+
+static int usbhal_setupcmd_cb(const USB_Setup_TypeDef *setup)
+{
+    TRACE_FUNC_IN;
+    if (!setup) {
+        EFM_ASSERT(false);
+        return USB_STATUS_REQ_ERR;
+    }
+
+    memcpy(ep0setupdata, setup, 8);
+    run_cmd(CMD_EP0SETUP, 0);
+
+    return USB_STATUS_OK;
+}
+
+static void usbhal_sof_cb(uint16_t frameNum)
+{
+    run_cmd(CMD_SOF, frameNum);
+}
+
+static void usbhal_free_buffers(void)
+{
+#ifdef USB_USE_DYNAMIC_MEMORY
+    TRACE_FUNC_IN;
+
+    for (int i=EP1OUT ; i<NUMBER_OF_ENDPOINTS ; i++ ) {
+        if (ep_state[i].data_buf) {
+            free(ep_state[i].data_buf);
+            ep_state[i].data_buf = NULL;
+        }
+    }
+#endif
+}
+
+void USBHAL::connect(void)
+{
+    TRACE_FUNC_IN;
+
+    // Init datastructures must be static - driver will use these even after the init function exits!
+
+    static const uint8_t buffer_multiplier[] = { 1 }; // Mult 1 for control EP
+    static const USBD_Callbacks_TypeDef usbd_callbacks = {
+        .usbReset = usbhal_reset_cb,
+        .usbStateChange = usbhal_state_change_cb,
+        .setupCmd = usbhal_setupcmd_cb,
+        .isSelfPowered = NULL,
+        .sofInt = usbhal_sof_cb
+    };
+
+    USBD_Init_TypeDef initdata = {
+        .deviceDescriptor = NULL,
+        .configDescriptor = NULL,
+        .stringDescriptors = NULL,
+        .numberOfStrings = 0,
+        .bufferingMultiplier = buffer_multiplier,
+        .callbacks = &usbd_callbacks,
+        .reserved = 0
+    };
+
+    int ret = USBD_Init(&initdata);
+
+    TRACE("init = %d, devicedesc = %lx, configdesc = %lx", ret,
+          (uint32_t) initdata.deviceDescriptor,
+          (uint32_t) initdata.configDescriptor);
+
+    EFM_ASSERT(ret == USB_STATUS_OK);
+}
+
+void USBHAL::disconnect(void)
+{
+    TRACE_FUNC_IN;
+    USBD_Disconnect();
+}
+
+void USBHAL::configureDevice(void)
+{
+    TRACE_FUNC_IN;
+    USBD_SetUsbState(USBD_STATE_CONFIGURED);
+}
+
+void USBHAL::unconfigureDevice(void)
+{
+    TRACE_FUNC_IN;
+    USBD_SetUsbState(USBD_STATE_DEFAULT);
+    usbhal_free_buffers();
+}
+
+void USBHAL::setAddress(uint8_t address)
+{
+    TRACE_FUNC_IN_P("addr 0x%x", (unsigned)address);
+    USBD_SetAddress(address);
+}
+
+void USBHAL::remoteWakeup(void)
+{
+    TRACE_FUNC_IN;
+    USBD_RemoteWakeup();
+}
+
+void USBHAL::EP0setup(uint8_t *buffer)
+{
+    TRACE_FUNC_IN;
+    EFM_ASSERT(buffer);
+    if (buffer) {
+        memcpy(buffer, ep0setupdata, 8);
+    }
+}
+
+void USBHAL::EP0read(void)
+{
+    TRACE_FUNC_IN;
+    (void)internEndpointRead(0, MAX_PACKET_SIZE_EP0);
+}
+
+void USBHAL::EP0readStage(void)
+{
+    TRACE_FUNC_IN;
+    // Not needed
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
+{
+    TRACE_FUNC_IN;
+    EFM_ASSERT(buffer);
+
+    uint32_t read = 0;
+    endpointReadResult(0, buffer, &read);
+    return read;
+}
+
+static int usbhal_xfer_complete_cb(uint8_t ep, USB_Status_TypeDef status,
+                                   uint32_t xferred, uint32_t remaining)
+{
+    TRACE_FUNC_IN_P("ep 0x%x, status %u, xferred %lu, rem %lu",
+                    ep, status, xferred, remaining);
+
+    if (ep >= NUMBER_OF_ENDPOINTS) {
+        EFM_ASSERT(false);
+        return USB_STATUS_REQ_ERR;
+    }
+
+    switch (ep) {
+        case EP0OUT:
+            if (ep_state[EP0OUT].status == READ_PENDING) {
+                ep_state[EP0OUT].status = READ_COMPLETE;
+                ep_state[EP0OUT].byte_count = xferred;
+                // drop zlp
+                if (xferred == 0) {
+                    break;
+                }
+            }
+            run_cmd(CMD_EP0OUT, 0);
+            break;
+
+        case EP0IN:
+            run_cmd(CMD_EP0IN, 0);
+            break;
+
+        default:
+            bool write = ep & 1;
+
+            if (status == USB_STATUS_OK) {
+                if (!write && ep_state[ep].status == READ_PENDING) {
+                    ep_state[ep].status = READ_COMPLETE;
+                    ep_state[ep].byte_count = xferred;
+                } else if (write && ep_state[ep].status == WRITE_PENDING) {
+                    ep_state[ep].status = WRITE_COMPLETE;
+                } else {
+                    ep_state[ep].status = FAILED_INVALID;
+                }
+            } else {
+                ep_state[ep].status = FAILED_INVALID;
+            }
+
+            if (ep_state[ep].status != FAILED_INVALID) {
+                run_cmd(CMD_EP_XFER_COMPLETED, ep);
+            }
+            break;
+    }
+
+    return USB_STATUS_OK;
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
+{
+    //TRACE_FUNC_IN_P("buffer %lx, size %lu", (uint32_t) buffer, size);
+
+    int ret;
+    USB_XferCompleteCb_TypeDef cb = ep_state[EP0IN].intern_cb;
+
+    EFM_ASSERT((buffer != NULL) || (size == 0));
+    EFM_ASSERT(size <= MAX_PACKET_SIZE_EP0);
+
+    if (!buffer || size == 0) {
+        // No callback after writing EP0 ZLP
+        cb = NULL;
+    }
+
+    if (buffer && !is_aligned(buffer,4)) {
+        // Copy unaligned data to write-buffer before USBD_Write
+        memcpy(ep_state[EP0IN].data_buf, buffer, size);
+        ret = USBD_Write(0, ep_state[EP0IN].data_buf, size, cb);
+    } else {
+        ret = USBD_Write(0, buffer, size, cb);
+    }
+
+    if (ret != USB_STATUS_OK) {
+        TRACE("FAILED - ret %d", ret);
+    }
+}
+
+void USBHAL::EP0stall(void)
+{
+    TRACE_FUNC_IN;
+    USBD_StallEp0();
+}
+
+static EP_STATUS internEndpointRead(uint8_t ep, uint32_t maxSize)
+{
+    //TRACE_FUNC_IN_P("endpoint 0x%x, size %ld, cb %d", (unsigned)ep, maxSize, useCallback);
+
+    if (ep >= NUMBER_OF_ENDPOINTS) {
+        EFM_ASSERT(false);
+        return EP_INVALID;
+    }
+
+    ep_state[ep].status = READ_PENDING;
+
+    int ret = USBD_Read(USB_EP_TO_ADDR(ep), ep_state[ep].data_buf, maxSize,
+                        ep_state[ep].intern_cb);
+
+    if (ret == USB_STATUS_OK) {
+        return EP_PENDING;
+    } else {
+        TRACE("FAILED - ret %d", ret);
+
+        if (ret == USB_STATUS_EP_STALLED) {
+            return EP_STALLED;
+        } else {
+            return EP_INVALID;
+        }
+    }
+}
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize)
+{
+    return internEndpointRead(endpoint, maximumSize);
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead)
+{
+    TRACE_FUNC_IN;
+
+    if (endpoint >= NUMBER_OF_ENDPOINTS) {
+        EFM_ASSERT(false);
+        return EP_INVALID;
+    }
+
+    EFM_ASSERT(data);
+    EFM_ASSERT(bytesRead);
+    if (!data || !bytesRead) {
+        return EP_INVALID;
+    }
+
+    switch (ep_state[endpoint].status) {
+        case READ_PENDING:
+            return EP_PENDING;
+
+        case READ_COMPLETE:
+            memcpy(data, ep_state[endpoint].data_buf, ep_state[endpoint].byte_count);
+            *bytesRead = ep_state[endpoint].byte_count;
+            ep_state[endpoint].status = IDLE;
+            return EP_COMPLETED;
+
+        case FAILED_STALLED:
+            ep_state[endpoint].status = IDLE;
+            return EP_STALLED;
+
+        default:
+            ep_state[endpoint].status = IDLE;
+            return EP_INVALID;
+    }
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
+{
+    TRACE_FUNC_IN_P("endpoint 0x%x, data 0x%lx, size %lu", (unsigned )endpoint, (uint32_t)data, size);
+
+    EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS);
+    EFM_ASSERT(endpoint > EP0IN);
+    EFM_ASSERT(size <= ep_state[endpoint].max_packet);
+    EFM_ASSERT(data);
+
+    uint8_t ep = USB_EP_TO_INDEX(endpoint);
+
+    if (endpoint >= NUMBER_OF_ENDPOINTS || endpoint <= EP0IN) {
+        return EP_INVALID;
+    }
+
+    if (size > ep_state[endpoint].max_packet) {
+        return EP_INVALID;
+    }
+
+    if (!data) {
+        return EP_INVALID;
+    }
+
+    memcpy(ep_state[ep].data_buf, data, size);
+
+    ep_state[ep].status = WRITE_PENDING;
+    int ret = USBD_Write(USB_EP_TO_ADDR(endpoint), ep_state[ep].data_buf, size, ep_state[ep].intern_cb);
+
+    if (ret == USB_STATUS_EP_STALLED) {
+        ep_state[ep].status = IDLE;
+        return EP_STALLED;
+    } else if (ret != USB_STATUS_OK) {
+        ep_state[ep].status = IDLE;
+        return EP_INVALID;
+    }
+
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
+{
+    if (endpoint >= NUMBER_OF_ENDPOINTS) {
+        EFM_ASSERT(false);
+        return EP_INVALID;
+    }
+
+    switch (ep_state[endpoint].status) {
+        case WRITE_PENDING:
+            return EP_PENDING;
+
+        case WRITE_COMPLETE:
+            ep_state[endpoint].status = IDLE;
+            return EP_COMPLETED;
+
+        case FAILED_STALLED:
+            ep_state[endpoint].status = IDLE;
+            return EP_STALLED;
+
+        default:
+            ep_state[endpoint].status = IDLE;
+            return EP_INVALID;
+    }
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint)
+{
+    TRACE_FUNC_IN;
+
+    EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS);
+    EFM_ASSERT((endpoint != EP0OUT) && (endpoint != EP0IN));
+
+    USBD_StallEp(USB_EP_TO_ADDR(endpoint));
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint)
+{
+    TRACE_FUNC_IN;
+
+    EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS);
+    EFM_ASSERT((endpoint != EP0OUT) && (endpoint != EP0IN));
+
+    USBD_UnStallEp(USB_EP_TO_ADDR(endpoint));
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
+{
+    TRACE_FUNC_IN_P("endpoint %d, packetsize %ld, options 0x%lx", endpoint,
+                    maxPacket, options);
+
+    int mult = 1; // RX/TX buffer size multiplier
+    int type = USB_EPTYPE_INTR;
+
+    if (endpoint >= NUMBER_OF_ENDPOINTS) {
+        EFM_ASSERT(false);
+        return false;
+    }
+
+    if (endpoint == EP0IN || endpoint == EP0OUT) {
+        EFM_ASSERT(false);
+        return false;
+    }
+
+    ep_state[endpoint].max_packet = 0;
+
+    if (endpoint == EPISO_OUT || endpoint ==  EPISO_IN) {
+        if (maxPacket > MAX_PACKET_SIZE_EPISO) {
+            EFM_ASSERT(false);
+            return false;
+        }
+    } else if ((maxPacket > MAX_PACKET_SIZE_EPBULK) || (maxPacket > MAX_PACKET_SIZE_EPINT)) {
+        EFM_ASSERT(false);
+        return false;
+    }
+
+    // USBDevice performs a read right after creating the endpoints,
+    // before calling configureDevice. The read will fail since
+    // at that point the device state is still ADDRESSED. Workaround
+    // is to force configured state here.
+    //
+    // This relies on USBDevice to not call realiseEndpoint unless
+    // it is transitioning to the CONFIGURED state.
+    USBD_SetUsbState(USBD_STATE_CONFIGURED);
+
+    // Why doesn't this function have a type param? This is silly...
+    switch (endpoint) {
+        case EPBULK_OUT:
+        case EPBULK_IN:
+            type = USB_EPTYPE_BULK;
+            mult = 2;
+            break;
+        case EPINT_OUT:
+        case EPINT_IN:
+            type = USB_EPTYPE_INTR;
+            mult = 1;
+            break;
+        case EPISO_OUT:
+        case EPISO_IN:
+            type = USB_EPTYPE_ISOC;
+            mult = 2; // ?
+            break;
+    }
+
+    // Some options force the endpoint to a specific type
+    if( options & ISOCHRONOUS ) {
+        type = USB_EPTYPE_ISOC;
+        mult = 2; // ?
+    } else if ( options & RATE_FEEDBACK_MODE ) {
+        // No support for whatever rate feedback is, but for interrupt only
+        type = USB_EPTYPE_INTR;
+        mult = 1;
+    }
+
+#ifdef USB_USE_DYNAMIC_MEMORY
+    if (ep_state[endpoint].data_buf) {
+        free(ep_state[endpoint].data_buf);
+    }
+
+    ep_state[endpoint].data_buf = (uint8_t *)malloc(maxPacket);
+
+    if (!ep_state[endpoint].data_buf) {
+        EFM_ASSERT(false);
+        return false;
+    }
+#endif
+
+    int ret = USBD_AddEndpoint(USB_EP_TO_ADDR(endpoint), type, maxPacket, mult);
+
+    if (ret == USB_STATUS_OK) {
+        ep_state[endpoint].status = IDLE;
+        ep_state[endpoint].max_packet = maxPacket;
+        return true;
+    } else {
+        return false;
+    }
+}
+
+bool USBHAL::getEndpointStallState(unsigned char endpoint)
+{
+    TRACE_FUNC_IN;
+    if (endpoint >= NUMBER_OF_ENDPOINTS) {
+        EFM_ASSERT(false);
+        return false;
+    }
+    return USBD_EpIsStalled(USB_EP_TO_ADDR(endpoint));
+}
+
+static void run_cmd(USBISRCommand cmd, uint32_t param)
+{
+    if (usb_isrcmd != CMD_HANDLED || cmd >= CMD_ENUM_END_MARKER) {
+        EFM_ASSERT(false);
+        abort();
+    }
+
+    usb_isrcmd = cmd;
+    usb_isrcmd_param = param;
+    isrptr();
+}
+
+void USBHAL::_usbisr(void)
+{
+    EFM_ASSERT(instance);
+    instance->usbisr();
+}
+
+void USBHAL::usbisr(void)
+{
+    //TRACE_FUNC_IN;
+
+    // This "ISR" is used just to route callbacks from SiL USB driver
+    // callback context (which can not call protected/private USBHAL
+    // methods), to the actual USBHAL.
+
+    EFM_ASSERT(usb_isrcmd != CMD_HANDLED);
+    switch (usb_isrcmd) {
+        case CMD_EP0SETUP:
+            this->EP0setupCallback();
+            break;
+        case CMD_EP0IN:
+            this->EP0in();
+            break;
+        case CMD_EP0OUT:
+            this->EP0out();
+            break;
+        case CMD_BUSRESET:
+            this->busReset();
+            break;
+        case CMD_EP_XFER_COMPLETED:
+            if (epCallback[usb_isrcmd_param] && instance) {
+                (instance->*(epCallback[usb_isrcmd_param]))();
+            }
+            break;
+        case CMD_SOF:
+            this->SOF(usb_isrcmd_param);
+            break;
+        case CMD_SUSPEND_STATE_CHANGED:
+            this->suspendStateChanged(usb_isrcmd_param);
+            break;
+        default:
+            EFM_ASSERT(false);
+            break;
+    }
+    usb_isrcmd = CMD_HANDLED;
+}
+#endif
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_KL25Z.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,552 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(TARGET_KL25Z) | defined(TARGET_KL43Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D50M) | defined(TARGET_K64F) | defined(TARGET_K22F) | defined(TARGET_TEENSY3_1)
+
+#include "USBHAL.h"
+
+USBHAL * USBHAL::instance;
+
+static volatile int epComplete = 0;
+
+// Convert physical endpoint number to register bit
+#define EP(endpoint) (1<<(endpoint))
+
+// Convert physical to logical
+#define PHY_TO_LOG(endpoint)    ((endpoint)>>1)
+
+// Get endpoint direction
+#define IN_EP(endpoint)     ((endpoint) & 1U ? true : false)
+#define OUT_EP(endpoint)    ((endpoint) & 1U ? false : true)
+
+#define BD_OWN_MASK        (1<<7)
+#define BD_DATA01_MASK     (1<<6)
+#define BD_KEEP_MASK       (1<<5)
+#define BD_NINC_MASK       (1<<4)
+#define BD_DTS_MASK        (1<<3)
+#define BD_STALL_MASK      (1<<2)
+
+#define TX    1
+#define RX    0
+#define ODD   0
+#define EVEN  1
+// this macro waits a physical endpoint number
+#define EP_BDT_IDX(ep, dir, odd) (((ep * 4) + (2 * dir) + (1 *  odd)))
+
+#define SETUP_TOKEN    0x0D
+#define IN_TOKEN       0x09
+#define OUT_TOKEN      0x01
+#define TOK_PID(idx)   ((bdt[idx].info >> 2) & 0x0F)
+
+// for each endpt: 8 bytes
+typedef struct BDT {
+    uint8_t   info;       // BD[0:7]
+    uint8_t   dummy;      // RSVD: BD[8:15]
+    uint16_t  byte_count; // BD[16:32]
+    uint32_t  address;    // Addr
+} BDT;
+
+
+// there are:
+//    * 16 bidirectionnal endpt -> 32 physical endpt
+//    * as there are ODD and EVEN buffer -> 32*2 bdt
+__attribute__((__aligned__(512))) BDT bdt[NUMBER_OF_PHYSICAL_ENDPOINTS * 2];
+uint8_t * endpoint_buffer[(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2];
+uint8_t * endpoint_buffer_iso[2*2];
+
+static uint8_t set_addr = 0;
+static uint8_t addr = 0;
+
+static uint32_t Data1  = 0x55555555;
+
+static uint32_t frameNumber() {
+    return((USB0->FRMNUML | (USB0->FRMNUMH << 8)) & 0x07FF);
+}
+
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
+    return 0;
+}
+
+USBHAL::USBHAL(void) {
+    // Disable IRQ
+    NVIC_DisableIRQ(USB0_IRQn);
+
+#if defined(TARGET_K64F)
+    MPU->CESR=0;
+#endif
+    // fill in callback array
+    epCallback[0] = &USBHAL::EP1_OUT_callback;
+    epCallback[1] = &USBHAL::EP1_IN_callback;
+    epCallback[2] = &USBHAL::EP2_OUT_callback;
+    epCallback[3] = &USBHAL::EP2_IN_callback;
+    epCallback[4] = &USBHAL::EP3_OUT_callback;
+    epCallback[5] = &USBHAL::EP3_IN_callback;
+    epCallback[6] = &USBHAL::EP4_OUT_callback;
+    epCallback[7] = &USBHAL::EP4_IN_callback;
+    epCallback[8] = &USBHAL::EP5_OUT_callback;
+    epCallback[9] = &USBHAL::EP5_IN_callback;
+    epCallback[10] = &USBHAL::EP6_OUT_callback;
+    epCallback[11] = &USBHAL::EP6_IN_callback;
+    epCallback[12] = &USBHAL::EP7_OUT_callback;
+    epCallback[13] = &USBHAL::EP7_IN_callback;
+    epCallback[14] = &USBHAL::EP8_OUT_callback;
+    epCallback[15] = &USBHAL::EP8_IN_callback;
+    epCallback[16] = &USBHAL::EP9_OUT_callback;
+    epCallback[17] = &USBHAL::EP9_IN_callback;
+    epCallback[18] = &USBHAL::EP10_OUT_callback;
+    epCallback[19] = &USBHAL::EP10_IN_callback;
+    epCallback[20] = &USBHAL::EP11_OUT_callback;
+    epCallback[21] = &USBHAL::EP11_IN_callback;
+    epCallback[22] = &USBHAL::EP12_OUT_callback;
+    epCallback[23] = &USBHAL::EP12_IN_callback;
+    epCallback[24] = &USBHAL::EP13_OUT_callback;
+    epCallback[25] = &USBHAL::EP13_IN_callback;
+    epCallback[26] = &USBHAL::EP14_OUT_callback;
+    epCallback[27] = &USBHAL::EP14_IN_callback;
+    epCallback[28] = &USBHAL::EP15_OUT_callback;
+    epCallback[29] = &USBHAL::EP15_IN_callback;
+
+#if defined(TARGET_KL43Z)
+    // enable USBFS clock
+    SIM->SCGC4 |= SIM_SCGC4_USBFS_MASK;
+
+    // enable the IRC48M clock
+    USB0->CLK_RECOVER_IRC_EN |= USB_CLK_RECOVER_IRC_EN_IRC_EN_MASK;
+
+    // enable the USB clock recovery tuning
+    USB0->CLK_RECOVER_CTRL |= USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_MASK;
+
+    // choose usb src clock
+    SIM->SOPT2 |= SIM_SOPT2_USBSRC_MASK;
+#else
+    // choose usb src as PLL
+    SIM->SOPT2 &= ~SIM_SOPT2_PLLFLLSEL_MASK;
+    SIM->SOPT2 |= (SIM_SOPT2_USBSRC_MASK | (1 << SIM_SOPT2_PLLFLLSEL_SHIFT));
+
+    // enable OTG clock
+    SIM->SCGC4 |= SIM_SCGC4_USBOTG_MASK;
+#endif
+
+    // Attach IRQ
+    instance = this;
+    NVIC_SetVector(USB0_IRQn, (uint32_t)&_usbisr);
+    NVIC_EnableIRQ(USB0_IRQn);
+
+    // USB Module Configuration
+    // Reset USB Module
+    USB0->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;
+    while(USB0->USBTRC0 & USB_USBTRC0_USBRESET_MASK);
+
+    // Set BDT Base Register
+    USB0->BDTPAGE1 = (uint8_t)((uint32_t)bdt>>8);
+    USB0->BDTPAGE2 = (uint8_t)((uint32_t)bdt>>16);
+    USB0->BDTPAGE3 = (uint8_t)((uint32_t)bdt>>24);
+
+    // Clear interrupt flag
+    USB0->ISTAT = 0xff;
+
+    // USB Interrupt Enablers
+    USB0->INTEN |= USB_INTEN_TOKDNEEN_MASK |
+                   USB_INTEN_SOFTOKEN_MASK |
+                   USB_INTEN_ERROREN_MASK  |
+                   USB_INTEN_USBRSTEN_MASK;
+
+    // Disable weak pull downs
+    USB0->USBCTRL &= ~(USB_USBCTRL_PDE_MASK | USB_USBCTRL_SUSP_MASK);
+
+    USB0->USBTRC0 |= 0x40;
+}
+
+USBHAL::~USBHAL(void) { }
+
+void USBHAL::connect(void) {
+    // enable USB
+    USB0->CTL |= USB_CTL_USBENSOFEN_MASK;
+    // Pull up enable
+    USB0->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;
+}
+
+void USBHAL::disconnect(void) {
+    // disable USB
+    USB0->CTL &= ~USB_CTL_USBENSOFEN_MASK;
+    // Pull up disable
+    USB0->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK;
+
+    //Free buffers if required:
+    for (int i = 0; i<(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2; i++) {
+        free(endpoint_buffer[i]);
+        endpoint_buffer[i] = NULL;
+    }
+    free(endpoint_buffer_iso[2]);
+    endpoint_buffer_iso[2] = NULL;
+    free(endpoint_buffer_iso[0]);
+    endpoint_buffer_iso[0] = NULL;
+}
+
+void USBHAL::configureDevice(void) {
+    // not needed
+}
+
+void USBHAL::unconfigureDevice(void) {
+    // not needed
+}
+
+void USBHAL::setAddress(uint8_t address) {
+    // we don't set the address now otherwise the usb controller does not ack
+    // we set a flag instead
+    // see usbisr when an IN token is received
+    set_addr = 1;
+    addr = address;
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
+    uint32_t handshake_flag = 0;
+    uint8_t * buf;
+
+    if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) {
+        return false;
+    }
+
+    uint32_t log_endpoint = PHY_TO_LOG(endpoint);
+
+    if ((flags & ISOCHRONOUS) == 0) {
+        handshake_flag = USB_ENDPT_EPHSHK_MASK;
+        if (IN_EP(endpoint)) {
+            if (endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] == NULL)
+                endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] = (uint8_t *) malloc (64);
+            buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)][0];
+        } else {
+            if (endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] == NULL)
+                endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] = (uint8_t *) malloc (64);
+            buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)][0];
+        }
+    } else {
+        if (IN_EP(endpoint)) {
+            if (endpoint_buffer_iso[2] == NULL)
+                endpoint_buffer_iso[2] = (uint8_t *) malloc (1023);
+            buf = &endpoint_buffer_iso[2][0];
+        } else {
+            if (endpoint_buffer_iso[0] == NULL)
+                endpoint_buffer_iso[0] = (uint8_t *) malloc (1023);
+            buf = &endpoint_buffer_iso[0][0];
+        }
+    }
+
+    // IN endpt -> device to host (TX)
+    if (IN_EP(endpoint)) {
+        USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag |        // ep handshaking (not if iso endpoint)
+                                              USB_ENDPT_EPTXEN_MASK;  // en TX (IN) tran
+        bdt[EP_BDT_IDX(log_endpoint, TX, ODD )].address = (uint32_t) buf;
+        bdt[EP_BDT_IDX(log_endpoint, TX, EVEN)].address = 0;
+    }
+    // OUT endpt -> host to device (RX)
+    else {
+        USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag |        // ep handshaking (not if iso endpoint)
+                                              USB_ENDPT_EPRXEN_MASK;  // en RX (OUT) tran.
+        bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].byte_count = maxPacket;
+        bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].address    = (uint32_t) buf;
+        bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].info       = BD_OWN_MASK | BD_DTS_MASK;
+        bdt[EP_BDT_IDX(log_endpoint, RX, EVEN)].info       = 0;
+    }
+
+    Data1 |= (1 << endpoint);
+
+    return true;
+}
+
+// read setup packet
+void USBHAL::EP0setup(uint8_t *buffer) {
+    uint32_t sz;
+    endpointReadResult(EP0OUT, buffer, &sz);
+}
+
+void USBHAL::EP0readStage(void) {
+    Data1 &= ~1UL;  // set DATA0
+    bdt[0].info = (BD_DTS_MASK | BD_OWN_MASK);
+}
+
+void USBHAL::EP0read(void) {
+    uint32_t idx = EP_BDT_IDX(PHY_TO_LOG(EP0OUT), RX, 0);
+    bdt[idx].byte_count = MAX_PACKET_SIZE_EP0;
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
+    uint32_t sz;
+    endpointReadResult(EP0OUT, buffer, &sz);
+    return sz;
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
+    endpointWrite(EP0IN, buffer, size);
+}
+
+void USBHAL::EP0getWriteResult(void) {
+}
+
+void USBHAL::EP0stall(void) {
+    stallEndpoint(EP0OUT);
+}
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
+    endpoint = PHY_TO_LOG(endpoint);
+    uint32_t idx = EP_BDT_IDX(endpoint, RX, 0);
+    bdt[idx].byte_count = maximumSize;
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
+    uint32_t n, sz, idx, setup = 0;
+    uint8_t not_iso;
+    uint8_t * ep_buf;
+
+    uint32_t log_endpoint = PHY_TO_LOG(endpoint);
+
+    if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) {
+        return EP_INVALID;
+    }
+
+    // if read on a IN endpoint -> error
+    if (IN_EP(endpoint)) {
+        return EP_INVALID;
+    }
+
+    idx = EP_BDT_IDX(log_endpoint, RX, 0);
+    sz  = bdt[idx].byte_count;
+    not_iso = USB0->ENDPOINT[log_endpoint].ENDPT & USB_ENDPT_EPHSHK_MASK;
+
+    //for isochronous endpoint, we don't wait an interrupt
+    if ((log_endpoint != 0) && not_iso && !(epComplete & EP(endpoint))) {
+        return EP_PENDING;
+    }
+
+    if ((log_endpoint == 0) && (TOK_PID(idx) == SETUP_TOKEN)) {
+        setup = 1;
+    }
+
+    // non iso endpoint
+    if (not_iso) {
+        ep_buf = endpoint_buffer[idx];
+    } else {
+        ep_buf = endpoint_buffer_iso[0];
+    }
+
+    for (n = 0; n < sz; n++) {
+        buffer[n] = ep_buf[n];
+    }
+
+    if (((Data1 >> endpoint) & 1) == ((bdt[idx].info >> 6) & 1)) {
+        if (setup && (buffer[6] == 0))  // if no setup data stage,
+            Data1 &= ~1UL;              // set DATA0
+        else
+            Data1 ^= (1 << endpoint);
+    }
+
+    if (((Data1 >> endpoint) & 1)) {
+        bdt[idx].info = BD_DTS_MASK | BD_DATA01_MASK | BD_OWN_MASK;
+    }
+    else {
+        bdt[idx].info = BD_DTS_MASK | BD_OWN_MASK;
+    }
+
+    USB0->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK;
+    *bytesRead = sz;
+
+    epComplete &= ~EP(endpoint);
+    return EP_COMPLETED;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
+    uint32_t idx, n;
+    uint8_t * ep_buf;
+
+    if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) {
+        return EP_INVALID;
+    }
+
+    // if write on a OUT endpoint -> error
+    if (OUT_EP(endpoint)) {
+        return EP_INVALID;
+    }
+
+    idx = EP_BDT_IDX(PHY_TO_LOG(endpoint), TX, 0);
+    bdt[idx].byte_count = size;
+
+
+    // non iso endpoint
+    if (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPHSHK_MASK) {
+        ep_buf = endpoint_buffer[idx];
+    } else {
+        ep_buf = endpoint_buffer_iso[2];
+    }
+
+    for (n = 0; n < size; n++) {
+        ep_buf[n] = data[n];
+    }
+
+    if ((Data1 >> endpoint) & 1) {
+        bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK;
+    } else {
+        bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK | BD_DATA01_MASK;
+    }
+
+    Data1 ^= (1 << endpoint);
+
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
+    if (epComplete & EP(endpoint)) {
+        epComplete &= ~EP(endpoint);
+        return EP_COMPLETED;
+    }
+
+    return EP_PENDING;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint) {
+    USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT |= USB_ENDPT_EPSTALL_MASK;
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint) {
+    USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT &= ~USB_ENDPT_EPSTALL_MASK;
+}
+
+bool USBHAL::getEndpointStallState(uint8_t endpoint) {
+    uint8_t stall = (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPSTALL_MASK);
+    return (stall) ? true : false;
+}
+
+void USBHAL::remoteWakeup(void) {
+    // [TODO]
+}
+
+
+void USBHAL::_usbisr(void) {
+    instance->usbisr();
+}
+
+
+void USBHAL::usbisr(void) {
+    uint8_t i;
+    uint8_t istat = USB0->ISTAT;
+
+    // reset interrupt
+    if (istat & USB_ISTAT_USBRST_MASK) {
+        // disable all endpt
+        for(i = 0; i < 16; i++) {
+            USB0->ENDPOINT[i].ENDPT = 0x00;
+        }
+
+        // enable control endpoint
+        realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
+        realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
+
+        Data1 = 0x55555555;
+        USB0->CTL |=  USB_CTL_ODDRST_MASK;
+
+        USB0->ISTAT   =  0xFF;  // clear all interrupt status flags
+        USB0->ERRSTAT =  0xFF;  // clear all error flags
+        USB0->ERREN   =  0xFF;  // enable error interrupt sources
+        USB0->ADDR    =  0x00;  // set default address
+
+        return;
+    }
+
+    // resume interrupt
+    if (istat & USB_ISTAT_RESUME_MASK) {
+        USB0->ISTAT = USB_ISTAT_RESUME_MASK;
+    }
+
+    // SOF interrupt
+    if (istat & USB_ISTAT_SOFTOK_MASK) {
+        USB0->ISTAT = USB_ISTAT_SOFTOK_MASK;
+        // SOF event, read frame number
+        SOF(frameNumber());
+    }
+
+    // stall interrupt
+    if (istat & 1<<7) {
+        if (USB0->ENDPOINT[0].ENDPT & USB_ENDPT_EPSTALL_MASK)
+            USB0->ENDPOINT[0].ENDPT &= ~USB_ENDPT_EPSTALL_MASK;
+        USB0->ISTAT |= USB_ISTAT_STALL_MASK;
+    }
+
+    // token interrupt
+    if (istat & 1<<3) {
+        uint32_t num  = (USB0->STAT >> 4) & 0x0F;
+        uint32_t dir  = (USB0->STAT >> 3) & 0x01;
+        uint32_t ev_odd = (USB0->STAT >> 2) & 0x01;
+        int endpoint = (num << 1) | dir;
+
+        // setup packet
+        if ((num == 0) && (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == SETUP_TOKEN)) {
+            Data1 &= ~0x02;
+            bdt[EP_BDT_IDX(0, TX, EVEN)].info &= ~BD_OWN_MASK;
+            bdt[EP_BDT_IDX(0, TX, ODD)].info  &= ~BD_OWN_MASK;
+
+            // EP0 SETUP event (SETUP data received)
+            EP0setupCallback();
+
+        } else {
+            // OUT packet
+            if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == OUT_TOKEN) {
+                if (num == 0)
+                    EP0out();
+                else {
+                    epComplete |= EP(endpoint);
+                    if ((instance->*(epCallback[endpoint - 2]))()) {
+                        epComplete &= ~EP(endpoint);
+                    }
+                }
+            }
+
+            // IN packet
+            if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == IN_TOKEN) {
+                if (num == 0) {
+                    EP0in();
+                    if (set_addr == 1) {
+                        USB0->ADDR = addr & 0x7F;
+                        set_addr = 0;
+                    }
+                }
+                else {
+                    epComplete |= EP(endpoint);
+                    if ((instance->*(epCallback[endpoint - 2]))()) {
+                        epComplete &= ~EP(endpoint);
+                    }
+                }
+            }
+        }
+
+        USB0->ISTAT = USB_ISTAT_TOKDNE_MASK;
+    }
+
+    // sleep interrupt
+    if (istat & 1<<4) {
+        USB0->ISTAT |= USB_ISTAT_SLEEP_MASK;
+    }
+
+    // error interrupt
+    if (istat & USB_ISTAT_ERROR_MASK) {
+        USB0->ERRSTAT = 0xFF;
+        USB0->ISTAT |= USB_ISTAT_ERROR_MASK;
+    }
+}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_LPC11U.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,738 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(TARGET_LPC11UXX) || defined(TARGET_LPC11U6X) || defined(TARGET_LPC1347) || defined(TARGET_LPC1549)
+
+#if defined(TARGET_LPC1347) || defined(TARGET_LPC1549)
+#define USB_IRQ USB_IRQ_IRQn
+#else
+#define USB_IRQ USB_IRQn
+#endif
+
+#include "USBHAL.h"
+
+USBHAL * USBHAL::instance;
+#if defined(TARGET_LPC1549)
+static uint8_t usbmem[2048] __attribute__((aligned(2048)));
+#endif
+
+// Valid physical endpoint numbers are 0 to (NUMBER_OF_PHYSICAL_ENDPOINTS-1)
+#define LAST_PHYSICAL_ENDPOINT (NUMBER_OF_PHYSICAL_ENDPOINTS-1)
+
+// Convert physical endpoint number to register bit
+#define EP(endpoint) (1UL<<endpoint)
+
+// Convert physical to logical
+#define PHY_TO_LOG(endpoint)    ((endpoint)>>1)
+
+// Get endpoint direction
+#define IN_EP(endpoint)     ((endpoint) & 1U ? true : false)
+#define OUT_EP(endpoint)    ((endpoint) & 1U ? false : true)
+
+// USB RAM
+#if defined(TARGET_LPC1549)
+#define USB_RAM_START ((uint32_t)usbmem)
+#define USB_RAM_SIZE  sizeof(usbmem)
+#else
+#define USB_RAM_START (0x20004000)
+#define USB_RAM_SIZE  (0x00000800)
+#endif
+
+// SYSAHBCLKCTRL
+#if defined(TARGET_LPC1549)
+#define CLK_USB     (1UL<<23)
+#else
+#define CLK_USB     (1UL<<14)
+#define CLK_USBRAM  (1UL<<27)
+#endif
+
+// USB Information register
+#define FRAME_NR(a)     ((a) & 0x7ff)   // Frame number
+
+// USB Device Command/Status register
+#define DEV_ADDR_MASK   (0x7f)          // Device address
+#define DEV_ADDR(a)     ((a) & DEV_ADDR_MASK)
+#define DEV_EN          (1UL<<7)        // Device enable
+#define SETUP           (1UL<<8)        // SETUP token received
+#define PLL_ON          (1UL<<9)        // PLL enabled in suspend
+#define DCON            (1UL<<16)       // Device status - connect
+#define DSUS            (1UL<<17)       // Device status - suspend
+#define DCON_C          (1UL<<24)       // Connect change
+#define DSUS_C          (1UL<<25)       // Suspend change
+#define DRES_C          (1UL<<26)       // Reset change
+#define VBUSDEBOUNCED   (1UL<<28)       // Vbus detected
+
+// Endpoint Command/Status list
+#define CMDSTS_A                 (1UL<<31)          // Active
+#define CMDSTS_D                 (1UL<<30)          // Disable
+#define CMDSTS_S                 (1UL<<29)          // Stall
+#define CMDSTS_TR                (1UL<<28)          // Toggle Reset
+#define CMDSTS_RF                (1UL<<27)          // Rate Feedback mode
+#define CMDSTS_TV                (1UL<<27)          // Toggle Value
+#define CMDSTS_T                 (1UL<<26)          // Endpoint Type
+#define CMDSTS_NBYTES(n)         (((n)&0x3ff)<<16)  // Number of bytes
+#define CMDSTS_ADDRESS_OFFSET(a) (((a)>>6)&0xffff)  // Buffer start address
+
+#define BYTES_REMAINING(s)       (((s)>>16)&0x3ff)  // Bytes remaining after transfer
+
+// USB Non-endpoint interrupt sources
+#define FRAME_INT   (1UL<<30)
+#define DEV_INT     (1UL<<31)
+
+static volatile int epComplete = 0;
+
+// One entry for a double-buffered logical endpoint in the endpoint
+// command/status list. Endpoint 0 is single buffered, out[1] is used
+// for the SETUP packet and in[1] is not used
+typedef struct {
+    uint32_t out[2];
+    uint32_t in[2];
+} PACKED EP_COMMAND_STATUS;
+
+typedef struct {
+    uint8_t out[MAX_PACKET_SIZE_EP0];
+    uint8_t in[MAX_PACKET_SIZE_EP0];
+    uint8_t setup[SETUP_PACKET_SIZE];
+} PACKED CONTROL_TRANSFER;
+
+typedef struct {
+    uint32_t    maxPacket;
+    uint32_t    buffer[2];
+    uint32_t    options;
+} PACKED EP_STATE;
+
+static volatile EP_STATE endpointState[NUMBER_OF_PHYSICAL_ENDPOINTS];
+
+// Pointer to the endpoint command/status list
+static EP_COMMAND_STATUS *ep = NULL;
+
+// Pointer to endpoint 0 data (IN/OUT and SETUP)
+static CONTROL_TRANSFER *ct = NULL;
+
+// Shadow DEVCMDSTAT register to avoid accidentally clearing flags or
+// initiating a remote wakeup event.
+static volatile uint32_t devCmdStat;
+
+// Pointers used to allocate USB RAM
+static uint32_t usbRamPtr = USB_RAM_START;
+static uint32_t epRamPtr = 0; // Buffers for endpoints > 0 start here
+
+#define ROUND_UP_TO_MULTIPLE(x, m) ((((x)+((m)-1))/(m))*(m))
+
+void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size);
+void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size) {
+    if (size > 0) {
+        do {
+            *dst++ = *src++;
+        } while (--size > 0);
+    }
+}
+
+
+USBHAL::USBHAL(void) {
+    NVIC_DisableIRQ(USB_IRQ);
+
+    // fill in callback array
+    epCallback[0] = &USBHAL::EP1_OUT_callback;
+    epCallback[1] = &USBHAL::EP1_IN_callback;
+    epCallback[2] = &USBHAL::EP2_OUT_callback;
+    epCallback[3] = &USBHAL::EP2_IN_callback;
+    epCallback[4] = &USBHAL::EP3_OUT_callback;
+    epCallback[5] = &USBHAL::EP3_IN_callback;
+    epCallback[6] = &USBHAL::EP4_OUT_callback;
+    epCallback[7] = &USBHAL::EP4_IN_callback;
+
+#if defined(TARGET_LPC1549)
+    /* Set USB PLL input to system oscillator */
+    LPC_SYSCON->USBPLLCLKSEL = 0x01;
+
+    /* Setup USB PLL  (FCLKIN = 12MHz) * 4 = 48MHz
+       MSEL = 3 (this is pre-decremented), PSEL = 1 (for P = 2)
+       FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 4 = 48MHz
+       FCCO = FCLKOUT * 2 * P = 48MHz * 2 * 2 = 192MHz (within FCCO range) */
+    LPC_SYSCON->USBPLLCTRL = (0x3 | (1UL << 6));
+
+    /* Powerup USB PLL */
+    LPC_SYSCON->PDRUNCFG &= ~(CLK_USB);
+
+    /* Wait for PLL to lock */
+    while(!(LPC_SYSCON->USBPLLSTAT & 0x01));
+
+    /* enable USB main clock */
+    LPC_SYSCON->USBCLKSEL = 0x02;
+    LPC_SYSCON->USBCLKDIV = 1;
+
+    /* Enable AHB clock to the USB block. */
+    LPC_SYSCON->SYSAHBCLKCTRL1 |= CLK_USB;
+
+    /* power UP USB Phy */
+    LPC_SYSCON->PDRUNCFG &= ~(1UL << 9);
+
+    /* Reset USB block */
+    LPC_SYSCON->PRESETCTRL1 |= (CLK_USB);
+    LPC_SYSCON->PRESETCTRL1 &= ~(CLK_USB);
+
+#else
+    #if defined(TARGET_LPC11U35_401) || defined(TARGET_LPC11U35_501)
+    // USB_VBUS input with pull-down
+    LPC_IOCON->PIO0_3 = 0x00000009;
+    #endif
+
+    // nUSB_CONNECT output
+    LPC_IOCON->PIO0_6 = 0x00000001;
+
+    // Enable clocks (USB registers, USB RAM)
+    LPC_SYSCON->SYSAHBCLKCTRL |= CLK_USB | CLK_USBRAM;
+
+    // Ensure device disconnected (DCON not set)
+    LPC_USB->DEVCMDSTAT = 0;
+#endif
+    // to ensure that the USB host sees the device as
+    // disconnected if the target CPU is reset.
+    wait(0.3);
+
+    // Reserve space in USB RAM for endpoint command/status list
+    // Must be 256 byte aligned
+    usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 256);
+    ep = (EP_COMMAND_STATUS *)usbRamPtr;
+    usbRamPtr += (sizeof(EP_COMMAND_STATUS) * NUMBER_OF_LOGICAL_ENDPOINTS);
+    LPC_USB->EPLISTSTART = (uint32_t)(ep) & 0xffffff00;
+
+    // Reserve space in USB RAM for Endpoint 0
+    // Must be 64 byte aligned
+    usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 64);
+    ct = (CONTROL_TRANSFER *)usbRamPtr;
+    usbRamPtr += sizeof(CONTROL_TRANSFER);
+    LPC_USB->DATABUFSTART =(uint32_t)(ct) & 0xffc00000;
+
+    // Setup command/status list for EP0
+    ep[0].out[0] = 0;
+    ep[0].in[0] =  0;
+    ep[0].out[1] = CMDSTS_ADDRESS_OFFSET((uint32_t)ct->setup);
+
+    // Route all interrupts to IRQ, some can be routed to
+    // USB_FIQ if you wish.
+    LPC_USB->INTROUTING = 0;
+
+    // Set device address 0, enable USB device, no remote wakeup
+    devCmdStat = DEV_ADDR(0) | DEV_EN | DSUS;
+    LPC_USB->DEVCMDSTAT = devCmdStat;
+
+    // Enable interrupts for device events and EP0
+    LPC_USB->INTEN = DEV_INT | EP(EP0IN) | EP(EP0OUT) | FRAME_INT;
+    instance = this;
+
+    //attach IRQ handler and enable interrupts
+    NVIC_SetVector(USB_IRQ, (uint32_t)&_usbisr);
+}
+
+USBHAL::~USBHAL(void) {
+    // Ensure device disconnected (DCON not set)
+    LPC_USB->DEVCMDSTAT = 0;
+    // Disable USB interrupts
+    NVIC_DisableIRQ(USB_IRQ);
+}
+
+void USBHAL::connect(void) {
+    NVIC_EnableIRQ(USB_IRQ);
+    devCmdStat |= DCON;
+    LPC_USB->DEVCMDSTAT = devCmdStat;
+}
+
+void USBHAL::disconnect(void) {
+    NVIC_DisableIRQ(USB_IRQ);
+    devCmdStat &= ~DCON;
+    LPC_USB->DEVCMDSTAT = devCmdStat;
+}
+
+void USBHAL::configureDevice(void) {
+    // Not required
+}
+
+void USBHAL::unconfigureDevice(void) {
+    // Not required
+}
+
+void USBHAL::EP0setup(uint8_t *buffer) {
+    // Copy setup packet data
+    USBMemCopy(buffer, ct->setup, SETUP_PACKET_SIZE);
+}
+
+void USBHAL::EP0read(void) {
+    // Start an endpoint 0 read
+
+    // The USB ISR will call USBDevice_EP0out() when a packet has been read,
+    // the USBDevice layer then calls USBBusInterface_EP0getReadResult() to
+    // read the data.
+
+    ep[0].out[0] = CMDSTS_A |CMDSTS_NBYTES(MAX_PACKET_SIZE_EP0) \
+                   | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out);
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
+    // Complete an endpoint 0 read
+    uint32_t bytesRead;
+
+    // Find how many bytes were read
+    bytesRead = MAX_PACKET_SIZE_EP0 - BYTES_REMAINING(ep[0].out[0]);
+
+    // Copy data
+    USBMemCopy(buffer, ct->out, bytesRead);
+    return bytesRead;
+}
+
+
+void USBHAL::EP0readStage(void) {
+    // Not required
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
+    // Start and endpoint 0 write
+
+    // The USB ISR will call USBDevice_EP0in() when the data has
+    // been written, the USBDevice layer then calls
+    // USBBusInterface_EP0getWriteResult() to complete the transaction.
+
+    // Copy data
+    USBMemCopy(ct->in, buffer, size);
+
+    // Start transfer
+    ep[0].in[0] = CMDSTS_A | CMDSTS_NBYTES(size) \
+                  | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->in);
+}
+
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
+    uint8_t bf = 0;
+    uint32_t flags = 0;
+
+    //check which buffer must be filled
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {
+        // Double buffered
+        if (LPC_USB->EPINUSE & EP(endpoint)) {
+            bf = 1;
+        } else {
+            bf = 0;
+        }
+    }
+
+    // if isochronous endpoint, T = 1
+    if(endpointState[endpoint].options & ISOCHRONOUS)
+    {
+        flags |= CMDSTS_T;
+    }
+
+    //Active the endpoint for reading
+    ep[PHY_TO_LOG(endpoint)].out[bf] = CMDSTS_A | CMDSTS_NBYTES(maximumSize) \
+                                       | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out) | flags;
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead) {
+
+    uint8_t bf = 0;
+
+    if (!(epComplete & EP(endpoint)))
+        return EP_PENDING;
+    else {
+        epComplete &= ~EP(endpoint);
+
+        //check which buffer has been filled
+        if (LPC_USB->EPBUFCFG & EP(endpoint)) {
+            // Double buffered (here we read the previous buffer which was used)
+            if (LPC_USB->EPINUSE & EP(endpoint)) {
+                bf = 0;
+            } else {
+                bf = 1;
+            }
+        }
+
+        // Find how many bytes were read
+        *bytesRead = (uint32_t) (endpointState[endpoint].maxPacket - BYTES_REMAINING(ep[PHY_TO_LOG(endpoint)].out[bf]));
+
+        // Copy data
+        USBMemCopy(data, ct->out, *bytesRead);
+        return EP_COMPLETED;
+    }
+}
+
+void USBHAL::EP0getWriteResult(void) {
+    // Not required
+}
+
+void USBHAL::EP0stall(void) {
+    ep[0].in[0] = CMDSTS_S;
+    ep[0].out[0] = CMDSTS_S;
+}
+
+void USBHAL::setAddress(uint8_t address) {
+    devCmdStat &= ~DEV_ADDR_MASK;
+    devCmdStat |= DEV_ADDR(address);
+    LPC_USB->DEVCMDSTAT = devCmdStat;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
+    uint32_t flags = 0;
+    uint32_t bf;
+
+    // Validate parameters
+    if (data == NULL) {
+        return EP_INVALID;
+    }
+
+    if (endpoint > LAST_PHYSICAL_ENDPOINT) {
+        return EP_INVALID;
+    }
+
+    if ((endpoint==EP0IN) || (endpoint==EP0OUT)) {
+        return EP_INVALID;
+    }
+
+    if (size > endpointState[endpoint].maxPacket) {
+        return EP_INVALID;
+    }
+
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {
+        // Double buffered
+        if (LPC_USB->EPINUSE & EP(endpoint)) {
+            bf = 1;
+        } else {
+            bf = 0;
+        }
+    } else {
+        // Single buffered
+        bf = 0;
+    }
+
+    // Check if already active
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) {
+        return EP_INVALID;
+    }
+
+    // Check if stalled
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) {
+        return EP_STALLED;
+    }
+
+    // Copy data to USB RAM
+    USBMemCopy((uint8_t *)endpointState[endpoint].buffer[bf], data, size);
+
+    // Add options
+    if (endpointState[endpoint].options & RATE_FEEDBACK_MODE) {
+        flags |= CMDSTS_RF;
+    }
+
+    if (endpointState[endpoint].options & ISOCHRONOUS) {
+        flags |= CMDSTS_T;
+    }
+
+    // Add transfer
+    ep[PHY_TO_LOG(endpoint)].in[bf] = CMDSTS_ADDRESS_OFFSET( \
+                                      endpointState[endpoint].buffer[bf]) \
+                                      | CMDSTS_NBYTES(size) | CMDSTS_A | flags;
+
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
+    uint32_t bf;
+
+    // Validate parameters
+    if (endpoint > LAST_PHYSICAL_ENDPOINT) {
+        return EP_INVALID;
+    }
+
+    if (OUT_EP(endpoint)) {
+        return EP_INVALID;
+    }
+
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {
+        // Double buffered     // TODO: FIX THIS
+        if (LPC_USB->EPINUSE & EP(endpoint)) {
+            bf = 1;
+        } else {
+            bf = 0;
+        }
+    } else {
+        // Single buffered
+        bf = 0;
+    }
+
+    // Check if endpoint still active
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) {
+        return EP_PENDING;
+    }
+
+    // Check if stalled
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) {
+        return EP_STALLED;
+    }
+
+    return EP_COMPLETED;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint) {
+
+    // FIX: should this clear active bit?
+    if (IN_EP(endpoint)) {
+        ep[PHY_TO_LOG(endpoint)].in[0] |= CMDSTS_S;
+        ep[PHY_TO_LOG(endpoint)].in[1] |= CMDSTS_S;
+    } else {
+        ep[PHY_TO_LOG(endpoint)].out[0] |= CMDSTS_S;
+        ep[PHY_TO_LOG(endpoint)].out[1] |= CMDSTS_S;
+    }
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint) {
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {
+        // Double buffered
+        if (IN_EP(endpoint)) {
+            ep[PHY_TO_LOG(endpoint)].in[0] = 0; // S = 0
+            ep[PHY_TO_LOG(endpoint)].in[1] = 0; // S = 0
+
+            if (LPC_USB->EPINUSE & EP(endpoint)) {
+                ep[PHY_TO_LOG(endpoint)].in[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
+            } else {
+                ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
+            }
+        } else {
+            ep[PHY_TO_LOG(endpoint)].out[0] = 0; // S = 0
+            ep[PHY_TO_LOG(endpoint)].out[1] = 0; // S = 0
+
+            if (LPC_USB->EPINUSE & EP(endpoint)) {
+                ep[PHY_TO_LOG(endpoint)].out[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
+            } else {
+                ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
+            }
+        }
+    } else {
+        // Single buffered
+        if (IN_EP(endpoint)) {
+            ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR;     // S = 0, TR = 1, TV = 0
+        } else {
+            ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR;    // S = 0, TR = 1, TV = 0
+        }
+    }
+}
+
+bool USBHAL::getEndpointStallState(unsigned char endpoint) {
+    if (IN_EP(endpoint)) {
+        if (LPC_USB->EPINUSE & EP(endpoint)) {
+            if (ep[PHY_TO_LOG(endpoint)].in[1] & CMDSTS_S) {
+                return true;
+            }
+        } else {
+            if (ep[PHY_TO_LOG(endpoint)].in[0] & CMDSTS_S) {
+                return true;
+            }
+        }
+    } else {
+        if (LPC_USB->EPINUSE & EP(endpoint)) {
+            if (ep[PHY_TO_LOG(endpoint)].out[1] & CMDSTS_S) {
+                return true;
+            }
+        } else {
+            if (ep[PHY_TO_LOG(endpoint)].out[0] & CMDSTS_S) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options) {
+    uint32_t tmpEpRamPtr;
+
+    if (endpoint > LAST_PHYSICAL_ENDPOINT) {
+        return false;
+    }
+
+    // Not applicable to the control endpoints
+    if ((endpoint==EP0IN) || (endpoint==EP0OUT)) {
+        return false;
+    }
+
+    // Allocate buffers in USB RAM
+    tmpEpRamPtr = epRamPtr;
+
+    // Must be 64 byte aligned
+    tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64);
+
+    if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) {
+        // Out of memory
+        return false;
+    }
+
+    // Allocate first buffer
+    endpointState[endpoint].buffer[0] = tmpEpRamPtr;
+    tmpEpRamPtr += maxPacket;
+
+    if (!(options & SINGLE_BUFFERED)) {
+        // Must be 64 byte aligned
+        tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64);
+
+        if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) {
+            // Out of memory
+            return false;
+        }
+
+        // Allocate second buffer
+        endpointState[endpoint].buffer[1] = tmpEpRamPtr;
+        tmpEpRamPtr += maxPacket;
+    }
+
+    // Commit to this USB RAM allocation
+    epRamPtr = tmpEpRamPtr;
+
+    // Remaining endpoint state values
+    endpointState[endpoint].maxPacket = maxPacket;
+    endpointState[endpoint].options = options;
+
+    // Enable double buffering if required
+    if (options & SINGLE_BUFFERED) {
+        LPC_USB->EPBUFCFG &= ~EP(endpoint);
+    } else {
+        // Double buffered
+        LPC_USB->EPBUFCFG |= EP(endpoint);
+    }
+
+    // Enable interrupt
+    LPC_USB->INTEN |= EP(endpoint);
+
+    // Enable endpoint
+    unstallEndpoint(endpoint);
+    return true;
+}
+
+void USBHAL::remoteWakeup(void) {
+    // Clearing DSUS bit initiates a remote wakeup if the
+    // device is currently enabled and suspended - otherwise
+    // it has no effect.
+    LPC_USB->DEVCMDSTAT = devCmdStat & ~DSUS;
+}
+
+
+static void disableEndpoints(void) {
+    uint32_t logEp;
+
+    // Ref. Table 158 "When a bus reset is received, software
+    // must set the disable bit of all endpoints to 1".
+
+    for (logEp = 1; logEp < NUMBER_OF_LOGICAL_ENDPOINTS; logEp++) {
+        ep[logEp].out[0] = CMDSTS_D;
+        ep[logEp].out[1] = CMDSTS_D;
+        ep[logEp].in[0] =  CMDSTS_D;
+        ep[logEp].in[1] =  CMDSTS_D;
+    }
+
+    // Start of USB RAM for endpoints > 0
+    epRamPtr = usbRamPtr;
+}
+
+
+
+void USBHAL::_usbisr(void) {
+    instance->usbisr();
+}
+
+void USBHAL::usbisr(void) {
+    // Start of frame
+    if (LPC_USB->INTSTAT & FRAME_INT) {
+        // Clear SOF interrupt
+        LPC_USB->INTSTAT = FRAME_INT;
+
+        // SOF event, read frame number
+        SOF(FRAME_NR(LPC_USB->INFO));
+    }
+
+    // Device state
+    if (LPC_USB->INTSTAT & DEV_INT) {
+        LPC_USB->INTSTAT = DEV_INT;
+
+        if (LPC_USB->DEVCMDSTAT & DSUS_C) {
+            // Suspend status changed
+            LPC_USB->DEVCMDSTAT = devCmdStat | DSUS_C;
+            if (LPC_USB->DEVCMDSTAT & DSUS) {
+                suspendStateChanged(1);
+            } else {
+                suspendStateChanged(0);
+            }
+        }
+
+        if (LPC_USB->DEVCMDSTAT & DRES_C) {
+            // Bus reset
+            LPC_USB->DEVCMDSTAT = devCmdStat | DRES_C;
+
+            // Disable endpoints > 0
+            disableEndpoints();
+
+            // Bus reset event
+            busReset();
+        }
+    }
+
+    // Endpoint 0
+    if (LPC_USB->INTSTAT & EP(EP0OUT)) {
+        // Clear EP0OUT/SETUP interrupt
+        LPC_USB->INTSTAT = EP(EP0OUT);
+
+        // Check if SETUP
+        if (LPC_USB->DEVCMDSTAT & SETUP) {
+            // Clear Active and Stall bits for EP0
+            // Documentation does not make it clear if we must use the
+            // EPSKIP register to achieve this, Fig. 16 and NXP reference
+            // code suggests we can just clear the Active bits - check with
+            // NXP to be sure.
+            ep[0].in[0] = 0;
+            ep[0].out[0] = 0;
+
+            // Clear EP0IN interrupt
+            LPC_USB->INTSTAT = EP(EP0IN);
+
+            // Clear SETUP (and INTONNAK_CI/O) in device status register
+            LPC_USB->DEVCMDSTAT = devCmdStat | SETUP;
+
+            // EP0 SETUP event (SETUP data received)
+            EP0setupCallback();
+        } else {
+            // EP0OUT ACK event (OUT data received)
+            EP0out();
+        }
+    }
+
+    if (LPC_USB->INTSTAT & EP(EP0IN)) {
+        // Clear EP0IN interrupt
+        LPC_USB->INTSTAT = EP(EP0IN);
+
+        // EP0IN ACK event (IN data sent)
+        EP0in();
+    }
+
+    for (uint8_t num = 2; num < 5*2; num++) {
+        if (LPC_USB->INTSTAT & EP(num)) {
+            LPC_USB->INTSTAT = EP(num);
+            epComplete |= EP(num);
+            if ((instance->*(epCallback[num - 2]))()) {
+                epComplete &= ~EP(num);
+            }
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_LPC17.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,623 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC2460)
+
+#include "USBHAL.h"
+
+
+// Get endpoint direction
+#define IN_EP(endpoint)     ((endpoint) & 1U ? true : false)
+#define OUT_EP(endpoint)    ((endpoint) & 1U ? false : true)
+
+// Convert physical endpoint number to register bit
+#define EP(endpoint) (1UL<<endpoint)
+
+// Power Control for Peripherals register
+#define PCUSB      (1UL<<31)
+
+// USB Clock Control register
+#define DEV_CLK_EN (1UL<<1)
+#define AHB_CLK_EN (1UL<<4)
+
+// USB Clock Status register
+#define DEV_CLK_ON (1UL<<1)
+#define AHB_CLK_ON (1UL<<4)
+
+// USB Device Interupt registers
+#define FRAME      (1UL<<0)
+#define EP_FAST    (1UL<<1)
+#define EP_SLOW    (1UL<<2)
+#define DEV_STAT   (1UL<<3)
+#define CCEMPTY    (1UL<<4)
+#define CDFULL     (1UL<<5)
+#define RxENDPKT   (1UL<<6)
+#define TxENDPKT   (1UL<<7)
+#define EP_RLZED   (1UL<<8)
+#define ERR_INT    (1UL<<9)
+
+// USB Control register
+#define RD_EN (1<<0)
+#define WR_EN (1<<1)
+#define LOG_ENDPOINT(endpoint) ((endpoint>>1)<<2)
+
+// USB Receive Packet Length register
+#define DV      (1UL<<10)
+#define PKT_RDY (1UL<<11)
+#define PKT_LNGTH_MASK (0x3ff)
+
+// Serial Interface Engine (SIE)
+#define SIE_WRITE   (0x01)
+#define SIE_READ    (0x02)
+#define SIE_COMMAND (0x05)
+#define SIE_CMD_CODE(phase, data) ((phase<<8)|(data<<16))
+
+// SIE Command codes
+#define SIE_CMD_SET_ADDRESS        (0xD0)
+#define SIE_CMD_CONFIGURE_DEVICE   (0xD8)
+#define SIE_CMD_SET_MODE           (0xF3)
+#define SIE_CMD_READ_FRAME_NUMBER  (0xF5)
+#define SIE_CMD_READ_TEST_REGISTER (0xFD)
+#define SIE_CMD_SET_DEVICE_STATUS  (0xFE)
+#define SIE_CMD_GET_DEVICE_STATUS  (0xFE)
+#define SIE_CMD_GET_ERROR_CODE     (0xFF)
+#define SIE_CMD_READ_ERROR_STATUS  (0xFB)
+
+#define SIE_CMD_SELECT_ENDPOINT(endpoint)                 (0x00+endpoint)
+#define SIE_CMD_SELECT_ENDPOINT_CLEAR_INTERRUPT(endpoint) (0x40+endpoint)
+#define SIE_CMD_SET_ENDPOINT_STATUS(endpoint)             (0x40+endpoint)
+
+#define SIE_CMD_CLEAR_BUFFER    (0xF2)
+#define SIE_CMD_VALIDATE_BUFFER (0xFA)
+
+// SIE Device Status register
+#define SIE_DS_CON    (1<<0)
+#define SIE_DS_CON_CH (1<<1)
+#define SIE_DS_SUS    (1<<2)
+#define SIE_DS_SUS_CH (1<<3)
+#define SIE_DS_RST    (1<<4)
+
+// SIE Device Set Address register
+#define SIE_DSA_DEV_EN  (1<<7)
+
+// SIE Configue Device register
+#define SIE_CONF_DEVICE (1<<0)
+
+// Select Endpoint register
+#define SIE_SE_FE       (1<<0)
+#define SIE_SE_ST       (1<<1)
+#define SIE_SE_STP      (1<<2)
+#define SIE_SE_PO       (1<<3)
+#define SIE_SE_EPN      (1<<4)
+#define SIE_SE_B_1_FULL (1<<5)
+#define SIE_SE_B_2_FULL (1<<6)
+
+// Set Endpoint Status command
+#define SIE_SES_ST      (1<<0)
+#define SIE_SES_DA      (1<<5)
+#define SIE_SES_RF_MO   (1<<6)
+#define SIE_SES_CND_ST  (1<<7)
+
+
+USBHAL * USBHAL::instance;
+
+static volatile int epComplete;
+static uint32_t endpointStallState;
+
+static void SIECommand(uint32_t command) {
+    // The command phase of a SIE transaction
+    LPC_USB->USBDevIntClr = CCEMPTY;
+    LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_COMMAND, command);
+    while (!(LPC_USB->USBDevIntSt & CCEMPTY));
+}
+
+static void SIEWriteData(uint8_t data) {
+    // The data write phase of a SIE transaction
+    LPC_USB->USBDevIntClr = CCEMPTY;
+    LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_WRITE, data);
+    while (!(LPC_USB->USBDevIntSt & CCEMPTY));
+}
+
+static uint8_t SIEReadData(uint32_t command) {
+    // The data read phase of a SIE transaction
+    LPC_USB->USBDevIntClr = CDFULL;
+    LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_READ, command);
+    while (!(LPC_USB->USBDevIntSt & CDFULL));
+    return (uint8_t)LPC_USB->USBCmdData;
+}
+
+static void SIEsetDeviceStatus(uint8_t status) {
+    // Write SIE device status register
+    SIECommand(SIE_CMD_SET_DEVICE_STATUS);
+    SIEWriteData(status);
+}
+
+static uint8_t SIEgetDeviceStatus(void) {
+    // Read SIE device status register
+    SIECommand(SIE_CMD_GET_DEVICE_STATUS);
+    return SIEReadData(SIE_CMD_GET_DEVICE_STATUS);
+}
+
+void SIEsetAddress(uint8_t address) {
+    // Write SIE device address register
+    SIECommand(SIE_CMD_SET_ADDRESS);
+    SIEWriteData((address & 0x7f) | SIE_DSA_DEV_EN);
+}
+
+static uint8_t SIEselectEndpoint(uint8_t endpoint) {
+    // SIE select endpoint command
+    SIECommand(SIE_CMD_SELECT_ENDPOINT(endpoint));
+    return SIEReadData(SIE_CMD_SELECT_ENDPOINT(endpoint));
+}
+
+static uint8_t SIEclearBuffer(void) {
+    // SIE clear buffer command
+    SIECommand(SIE_CMD_CLEAR_BUFFER);
+    return SIEReadData(SIE_CMD_CLEAR_BUFFER);
+}
+
+static void SIEvalidateBuffer(void) {
+    // SIE validate buffer command
+    SIECommand(SIE_CMD_VALIDATE_BUFFER);
+}
+
+static void SIEsetEndpointStatus(uint8_t endpoint, uint8_t status) {
+    // SIE set endpoint status command
+    SIECommand(SIE_CMD_SET_ENDPOINT_STATUS(endpoint));
+    SIEWriteData(status);
+}
+
+static uint16_t SIEgetFrameNumber(void) __attribute__ ((unused));
+static uint16_t SIEgetFrameNumber(void) {
+    // Read current frame number
+    uint16_t lowByte;
+    uint16_t highByte;
+
+    SIECommand(SIE_CMD_READ_FRAME_NUMBER);
+    lowByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
+    highByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
+
+    return (highByte << 8) | lowByte;
+}
+
+static void SIEconfigureDevice(void) {
+    // SIE Configure device command
+    SIECommand(SIE_CMD_CONFIGURE_DEVICE);
+    SIEWriteData(SIE_CONF_DEVICE);
+}
+
+static void SIEunconfigureDevice(void) {
+    // SIE Configure device command
+    SIECommand(SIE_CMD_CONFIGURE_DEVICE);
+    SIEWriteData(0);
+}
+
+static void SIEconnect(void) {
+    // Connect USB device
+    uint8_t status = SIEgetDeviceStatus();
+    SIEsetDeviceStatus(status | SIE_DS_CON);
+}
+
+
+static void SIEdisconnect(void) {
+    // Disconnect USB device
+    uint8_t status = SIEgetDeviceStatus();
+    SIEsetDeviceStatus(status & ~SIE_DS_CON);
+}
+
+
+static uint8_t selectEndpointClearInterrupt(uint8_t endpoint) {
+    // Implemented using using EP_INT_CLR.
+    LPC_USB->USBEpIntClr = EP(endpoint);
+    while (!(LPC_USB->USBDevIntSt & CDFULL));
+    return (uint8_t)LPC_USB->USBCmdData;
+}
+
+
+static void enableEndpointEvent(uint8_t endpoint) {
+    // Enable an endpoint interrupt
+    LPC_USB->USBEpIntEn |= EP(endpoint);
+}
+
+static void disableEndpointEvent(uint8_t endpoint) __attribute__ ((unused));
+static void disableEndpointEvent(uint8_t endpoint) {
+    // Disable an endpoint interrupt
+    LPC_USB->USBEpIntEn &= ~EP(endpoint);
+}
+
+static volatile uint32_t __attribute__((used)) dummyRead;
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
+    // Read from an OUT endpoint
+    uint32_t size;
+    uint32_t i;
+    uint32_t data = 0;
+    uint8_t offset;
+
+    LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | RD_EN;
+    while (!(LPC_USB->USBRxPLen & PKT_RDY));
+
+    size = LPC_USB->USBRxPLen & PKT_LNGTH_MASK;
+
+    offset = 0;
+
+    if (size > 0) {
+        for (i=0; i<size; i++) {
+            if (offset==0) {
+                // Fetch up to four bytes of data as a word
+                data = LPC_USB->USBRxData;
+            }
+
+            // extract a byte
+            *buffer = (data>>offset) & 0xff;
+            buffer++;
+
+            // move on to the next byte
+            offset = (offset + 8) % 32;
+        }
+    } else {
+        dummyRead = LPC_USB->USBRxData;
+    }
+
+    LPC_USB->USBCtrl = 0;
+
+    if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
+        SIEselectEndpoint(endpoint);
+        SIEclearBuffer();
+    }
+
+    return size;
+}
+
+static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size) {
+    // Write to an IN endpoint
+    uint32_t temp, data;
+    uint8_t offset;
+
+    LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | WR_EN;
+
+    LPC_USB->USBTxPLen = size;
+    offset = 0;
+    data = 0;
+
+    if (size>0) {
+        do {
+            // Fetch next data byte into a word-sized temporary variable
+            temp = *buffer++;
+
+            // Add to current data word
+            temp = temp << offset;
+            data = data | temp;
+
+            // move on to the next byte
+            offset = (offset + 8) % 32;
+            size--;
+
+            if ((offset==0) || (size==0)) {
+                // Write the word to the endpoint
+                LPC_USB->USBTxData = data;
+                data = 0;
+            }
+        } while (size>0);
+    } else {
+        LPC_USB->USBTxData = 0;
+    }
+
+    // Clear WR_EN to cover zero length packet case
+    LPC_USB->USBCtrl=0;
+
+    SIEselectEndpoint(endpoint);
+    SIEvalidateBuffer();
+}
+
+USBHAL::USBHAL(void) {
+    // Disable IRQ
+    NVIC_DisableIRQ(USB_IRQn);
+
+    // fill in callback array
+    epCallback[0] = &USBHAL::EP1_OUT_callback;
+    epCallback[1] = &USBHAL::EP1_IN_callback;
+    epCallback[2] = &USBHAL::EP2_OUT_callback;
+    epCallback[3] = &USBHAL::EP2_IN_callback;
+    epCallback[4] = &USBHAL::EP3_OUT_callback;
+    epCallback[5] = &USBHAL::EP3_IN_callback;
+    epCallback[6] = &USBHAL::EP4_OUT_callback;
+    epCallback[7] = &USBHAL::EP4_IN_callback;
+    epCallback[8] = &USBHAL::EP5_OUT_callback;
+    epCallback[9] = &USBHAL::EP5_IN_callback;
+    epCallback[10] = &USBHAL::EP6_OUT_callback;
+    epCallback[11] = &USBHAL::EP6_IN_callback;
+    epCallback[12] = &USBHAL::EP7_OUT_callback;
+    epCallback[13] = &USBHAL::EP7_IN_callback;
+    epCallback[14] = &USBHAL::EP8_OUT_callback;
+    epCallback[15] = &USBHAL::EP8_IN_callback;
+    epCallback[16] = &USBHAL::EP9_OUT_callback;
+    epCallback[17] = &USBHAL::EP9_IN_callback;
+    epCallback[18] = &USBHAL::EP10_OUT_callback;
+    epCallback[19] = &USBHAL::EP10_IN_callback;
+    epCallback[20] = &USBHAL::EP11_OUT_callback;
+    epCallback[21] = &USBHAL::EP11_IN_callback;
+    epCallback[22] = &USBHAL::EP12_OUT_callback;
+    epCallback[23] = &USBHAL::EP12_IN_callback;
+    epCallback[24] = &USBHAL::EP13_OUT_callback;
+    epCallback[25] = &USBHAL::EP13_IN_callback;
+    epCallback[26] = &USBHAL::EP14_OUT_callback;
+    epCallback[27] = &USBHAL::EP14_IN_callback;
+    epCallback[28] = &USBHAL::EP15_OUT_callback;
+    epCallback[29] = &USBHAL::EP15_IN_callback;
+
+    // Enable power to USB device controller
+    LPC_SC->PCONP |= PCUSB;
+
+    // Enable USB clocks
+    LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;
+    while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));
+
+    // Configure pins P0.29 and P0.30 to be USB D+ and USB D-
+    LPC_PINCON->PINSEL1 &= 0xc3ffffff;
+    LPC_PINCON->PINSEL1 |= 0x14000000;
+
+    // Disconnect USB device
+    SIEdisconnect();
+
+    // Configure pin P2.9 to be Connect
+    LPC_PINCON->PINSEL4 &= 0xfffcffff;
+    LPC_PINCON->PINSEL4 |= 0x00040000;
+
+    // Connect must be low for at least 2.5uS
+    wait(0.3);
+
+    // Set the maximum packet size for the control endpoints
+    realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
+    realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
+
+    // Attach IRQ
+    instance = this;
+    NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);
+
+    // Enable interrupts for device events and EP0
+    LPC_USB->USBDevIntEn = EP_SLOW | DEV_STAT | FRAME;
+    enableEndpointEvent(EP0IN);
+    enableEndpointEvent(EP0OUT);
+}
+
+USBHAL::~USBHAL(void) {
+    // Ensure device disconnected
+    SIEdisconnect();
+    // Disable USB interrupts
+    NVIC_DisableIRQ(USB_IRQn);
+}
+
+void USBHAL::connect(void) {
+    NVIC_EnableIRQ(USB_IRQn);
+    // Connect USB device
+    SIEconnect();
+}
+
+void USBHAL::disconnect(void) {
+    NVIC_DisableIRQ(USB_IRQn);
+    // Disconnect USB device
+    SIEdisconnect();
+}
+
+void USBHAL::configureDevice(void) {
+    SIEconfigureDevice();
+}
+
+void USBHAL::unconfigureDevice(void) {
+    SIEunconfigureDevice();
+}
+
+void USBHAL::setAddress(uint8_t address) {
+    SIEsetAddress(address);
+}
+
+void USBHAL::EP0setup(uint8_t *buffer) {
+    endpointReadcore(EP0OUT, buffer);
+}
+
+void USBHAL::EP0read(void) {
+    // Not required
+}
+
+void USBHAL::EP0readStage(void) {
+    // Not required
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
+    return endpointReadcore(EP0OUT, buffer);
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
+    endpointWritecore(EP0IN, buffer, size);
+}
+
+void USBHAL::EP0getWriteResult(void) {
+    // Not required
+}
+
+void USBHAL::EP0stall(void) {
+    // This will stall both control endpoints
+    stallEndpoint(EP0OUT);
+}
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
+
+    //for isochronous endpoint, we don't wait an interrupt
+    if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
+        if (!(epComplete & EP(endpoint)))
+            return EP_PENDING;
+    }
+
+    *bytesRead = endpointReadcore(endpoint, buffer);
+    epComplete &= ~EP(endpoint);
+    return EP_COMPLETED;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
+    if (getEndpointStallState(endpoint)) {
+        return EP_STALLED;
+    }
+
+    epComplete &= ~EP(endpoint);
+
+    endpointWritecore(endpoint, data, size);
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
+    if (epComplete & EP(endpoint)) {
+        epComplete &= ~EP(endpoint);
+        return EP_COMPLETED;
+    }
+
+    return EP_PENDING;
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
+    // Realise an endpoint
+    LPC_USB->USBDevIntClr = EP_RLZED;
+    LPC_USB->USBReEp |= EP(endpoint);
+    LPC_USB->USBEpInd = endpoint;
+    LPC_USB->USBMaxPSize = maxPacket;
+
+    while (!(LPC_USB->USBDevIntSt & EP_RLZED));
+    LPC_USB->USBDevIntClr = EP_RLZED;
+
+    // Clear stall state
+    endpointStallState &= ~EP(endpoint);
+
+    enableEndpointEvent(endpoint);
+    return true;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint) {
+    // Stall an endpoint
+    if ( (endpoint==EP0IN) || (endpoint==EP0OUT) ) {
+        // Conditionally stall both control endpoints
+        SIEsetEndpointStatus(EP0OUT, SIE_SES_CND_ST);
+    } else {
+        SIEsetEndpointStatus(endpoint, SIE_SES_ST);
+
+        // Update stall state
+        endpointStallState |= EP(endpoint);
+    }
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint) {
+    // Unstall an endpoint. The endpoint will also be reinitialised
+    SIEsetEndpointStatus(endpoint, 0);
+
+    // Update stall state
+    endpointStallState &= ~EP(endpoint);
+}
+
+bool USBHAL::getEndpointStallState(uint8_t endpoint) {
+    // Returns true if endpoint stalled
+    return endpointStallState & EP(endpoint);
+}
+
+void USBHAL::remoteWakeup(void) {
+    // Remote wakeup
+    uint8_t status;
+
+    // Enable USB clocks
+    LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;
+    while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));
+
+    status = SIEgetDeviceStatus();
+    SIEsetDeviceStatus(status & ~SIE_DS_SUS);
+}
+
+void USBHAL::_usbisr(void) {
+    instance->usbisr();
+}
+
+
+void USBHAL::usbisr(void) {
+    uint8_t devStat;
+
+    if (LPC_USB->USBDevIntSt & FRAME) {
+        // Start of frame event
+        SOF(SIEgetFrameNumber());
+        // Clear interrupt status flag
+        LPC_USB->USBDevIntClr = FRAME;
+    }
+
+    if (LPC_USB->USBDevIntSt & DEV_STAT) {
+        // Device Status interrupt
+        // Must clear the interrupt status flag before reading the device status from the SIE
+        LPC_USB->USBDevIntClr = DEV_STAT;
+
+        // Read device status from SIE
+        devStat = SIEgetDeviceStatus();
+        //printf("devStat: %d\r\n", devStat);
+
+        if (devStat & SIE_DS_SUS_CH) {
+            // Suspend status changed
+            if((devStat & SIE_DS_SUS) != 0) {
+                suspendStateChanged(0);
+            }
+        }
+
+        if (devStat & SIE_DS_RST) {
+            // Bus reset
+            if((devStat & SIE_DS_SUS) == 0) {
+                suspendStateChanged(1);
+            }
+            busReset();
+        }
+    }
+
+    if (LPC_USB->USBDevIntSt & EP_SLOW) {
+        // (Slow) Endpoint Interrupt
+
+        // Process each endpoint interrupt
+        if (LPC_USB->USBEpIntSt & EP(EP0OUT)) {
+            if (selectEndpointClearInterrupt(EP0OUT) & SIE_SE_STP) {
+                // this is a setup packet
+                EP0setupCallback();
+            } else {
+                EP0out();
+            }
+            LPC_USB->USBDevIntClr = EP_SLOW;
+        }
+
+        if (LPC_USB->USBEpIntSt & EP(EP0IN)) {
+            selectEndpointClearInterrupt(EP0IN);
+            LPC_USB->USBDevIntClr = EP_SLOW;
+            EP0in();
+        }
+
+        for (uint8_t num = 2; num < 16*2; num++) {
+            if (LPC_USB->USBEpIntSt & EP(num)) {
+                selectEndpointClearInterrupt(num);
+                epComplete |= EP(num);
+                LPC_USB->USBDevIntClr = EP_SLOW;
+                if ((instance->*(epCallback[num - 2]))()) {
+                    epComplete &= ~EP(num);
+                }
+            }
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_LPC40.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,628 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(TARGET_LPC4088) || defined(TARGET_LPC4088_DM)
+
+#include "USBHAL.h"
+
+
+// Get endpoint direction
+#define IN_EP(endpoint)     ((endpoint) & 1U ? true : false)
+#define OUT_EP(endpoint)    ((endpoint) & 1U ? false : true)
+
+// Convert physical endpoint number to register bit
+#define EP(endpoint) (1UL<<endpoint)
+
+// Power Control for Peripherals register
+#define PCUSB      (1UL<<31)
+
+// USB Clock Control register
+#define DEV_CLK_EN  (1UL<<1)
+#define PORT_CLK_EN (1UL<<3)
+#define AHB_CLK_EN  (1UL<<4)
+
+// USB Clock Status register
+#define DEV_CLK_ON (1UL<<1)
+#define AHB_CLK_ON (1UL<<4)
+
+// USB Device Interupt registers
+#define FRAME      (1UL<<0)
+#define EP_FAST    (1UL<<1)
+#define EP_SLOW    (1UL<<2)
+#define DEV_STAT   (1UL<<3)
+#define CCEMPTY    (1UL<<4)
+#define CDFULL     (1UL<<5)
+#define RxENDPKT   (1UL<<6)
+#define TxENDPKT   (1UL<<7)
+#define EP_RLZED   (1UL<<8)
+#define ERR_INT    (1UL<<9)
+
+// USB Control register
+#define RD_EN (1<<0)
+#define WR_EN (1<<1)
+#define LOG_ENDPOINT(endpoint) ((endpoint>>1)<<2)
+
+// USB Receive Packet Length register
+#define DV      (1UL<<10)
+#define PKT_RDY (1UL<<11)
+#define PKT_LNGTH_MASK (0x3ff)
+
+// Serial Interface Engine (SIE)
+#define SIE_WRITE   (0x01)
+#define SIE_READ    (0x02)
+#define SIE_COMMAND (0x05)
+#define SIE_CMD_CODE(phase, data) ((phase<<8)|(data<<16))
+
+// SIE Command codes
+#define SIE_CMD_SET_ADDRESS        (0xD0)
+#define SIE_CMD_CONFIGURE_DEVICE   (0xD8)
+#define SIE_CMD_SET_MODE           (0xF3)
+#define SIE_CMD_READ_FRAME_NUMBER  (0xF5)
+#define SIE_CMD_READ_TEST_REGISTER (0xFD)
+#define SIE_CMD_SET_DEVICE_STATUS  (0xFE)
+#define SIE_CMD_GET_DEVICE_STATUS  (0xFE)
+#define SIE_CMD_GET_ERROR_CODE     (0xFF)
+#define SIE_CMD_READ_ERROR_STATUS  (0xFB)
+
+#define SIE_CMD_SELECT_ENDPOINT(endpoint)                 (0x00+endpoint)
+#define SIE_CMD_SELECT_ENDPOINT_CLEAR_INTERRUPT(endpoint) (0x40+endpoint)
+#define SIE_CMD_SET_ENDPOINT_STATUS(endpoint)             (0x40+endpoint)
+
+#define SIE_CMD_CLEAR_BUFFER    (0xF2)
+#define SIE_CMD_VALIDATE_BUFFER (0xFA)
+
+// SIE Device Status register
+#define SIE_DS_CON    (1<<0)
+#define SIE_DS_CON_CH (1<<1)
+#define SIE_DS_SUS    (1<<2)
+#define SIE_DS_SUS_CH (1<<3)
+#define SIE_DS_RST    (1<<4)
+
+// SIE Device Set Address register
+#define SIE_DSA_DEV_EN  (1<<7)
+
+// SIE Configue Device register
+#define SIE_CONF_DEVICE (1<<0)
+
+// Select Endpoint register
+#define SIE_SE_FE       (1<<0)
+#define SIE_SE_ST       (1<<1)
+#define SIE_SE_STP      (1<<2)
+#define SIE_SE_PO       (1<<3)
+#define SIE_SE_EPN      (1<<4)
+#define SIE_SE_B_1_FULL (1<<5)
+#define SIE_SE_B_2_FULL (1<<6)
+
+// Set Endpoint Status command
+#define SIE_SES_ST      (1<<0)
+#define SIE_SES_DA      (1<<5)
+#define SIE_SES_RF_MO   (1<<6)
+#define SIE_SES_CND_ST  (1<<7)
+
+
+USBHAL * USBHAL::instance;
+
+static volatile int epComplete;
+static uint32_t endpointStallState;
+
+static void SIECommand(uint32_t command) {
+    // The command phase of a SIE transaction
+    LPC_USB->DevIntClr = CCEMPTY;
+    LPC_USB->CmdCode = SIE_CMD_CODE(SIE_COMMAND, command);
+    while (!(LPC_USB->DevIntSt & CCEMPTY));
+}
+
+static void SIEWriteData(uint8_t data) {
+    // The data write phase of a SIE transaction
+    LPC_USB->DevIntClr = CCEMPTY;
+    LPC_USB->CmdCode = SIE_CMD_CODE(SIE_WRITE, data);
+    while (!(LPC_USB->DevIntSt & CCEMPTY));
+}
+
+static uint8_t SIEReadData(uint32_t command) {
+    // The data read phase of a SIE transaction
+    LPC_USB->DevIntClr = CDFULL;
+    LPC_USB->CmdCode = SIE_CMD_CODE(SIE_READ, command);
+    while (!(LPC_USB->DevIntSt & CDFULL));
+    return (uint8_t)LPC_USB->CmdData;
+}
+
+static void SIEsetDeviceStatus(uint8_t status) {
+    // Write SIE device status register
+    SIECommand(SIE_CMD_SET_DEVICE_STATUS);
+    SIEWriteData(status);
+}
+
+static uint8_t SIEgetDeviceStatus(void) {
+    // Read SIE device status register
+    SIECommand(SIE_CMD_GET_DEVICE_STATUS);
+    return SIEReadData(SIE_CMD_GET_DEVICE_STATUS);
+}
+
+void SIEsetAddress(uint8_t address) {
+    // Write SIE device address register
+    SIECommand(SIE_CMD_SET_ADDRESS);
+    SIEWriteData((address & 0x7f) | SIE_DSA_DEV_EN);
+}
+
+static uint8_t SIEselectEndpoint(uint8_t endpoint) {
+    // SIE select endpoint command
+    SIECommand(SIE_CMD_SELECT_ENDPOINT(endpoint));
+    return SIEReadData(SIE_CMD_SELECT_ENDPOINT(endpoint));
+}
+
+static uint8_t SIEclearBuffer(void) {
+    // SIE clear buffer command
+    SIECommand(SIE_CMD_CLEAR_BUFFER);
+    return SIEReadData(SIE_CMD_CLEAR_BUFFER);
+}
+
+static void SIEvalidateBuffer(void) {
+    // SIE validate buffer command
+    SIECommand(SIE_CMD_VALIDATE_BUFFER);
+}
+
+static void SIEsetEndpointStatus(uint8_t endpoint, uint8_t status) {
+    // SIE set endpoint status command
+    SIECommand(SIE_CMD_SET_ENDPOINT_STATUS(endpoint));
+    SIEWriteData(status);
+}
+
+static uint16_t SIEgetFrameNumber(void) __attribute__ ((unused));
+static uint16_t SIEgetFrameNumber(void) {
+    // Read current frame number
+    uint16_t lowByte;
+    uint16_t highByte;
+
+    SIECommand(SIE_CMD_READ_FRAME_NUMBER);
+    lowByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
+    highByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
+
+    return (highByte << 8) | lowByte;
+}
+
+static void SIEconfigureDevice(void) {
+    // SIE Configure device command
+    SIECommand(SIE_CMD_CONFIGURE_DEVICE);
+    SIEWriteData(SIE_CONF_DEVICE);
+}
+
+static void SIEunconfigureDevice(void) {
+    // SIE Configure device command
+    SIECommand(SIE_CMD_CONFIGURE_DEVICE);
+    SIEWriteData(0);
+}
+
+static void SIEconnect(void) {
+    // Connect USB device
+    uint8_t status = SIEgetDeviceStatus();
+    SIEsetDeviceStatus(status | SIE_DS_CON);
+}
+
+
+static void SIEdisconnect(void) {
+    // Disconnect USB device
+    uint8_t status = SIEgetDeviceStatus();
+    SIEsetDeviceStatus(status & ~SIE_DS_CON);
+}
+
+
+static uint8_t selectEndpointClearInterrupt(uint8_t endpoint) {
+    // Implemented using using EP_INT_CLR.
+    LPC_USB->EpIntClr = EP(endpoint);
+    while (!(LPC_USB->DevIntSt & CDFULL));
+    return (uint8_t)LPC_USB->CmdData;
+}
+
+
+static void enableEndpointEvent(uint8_t endpoint) {
+    // Enable an endpoint interrupt
+    LPC_USB->EpIntEn |= EP(endpoint);
+}
+
+static void disableEndpointEvent(uint8_t endpoint) __attribute__ ((unused));
+static void disableEndpointEvent(uint8_t endpoint) {
+    // Disable an endpoint interrupt
+    LPC_USB->EpIntEn &= ~EP(endpoint);
+}
+
+static volatile uint32_t __attribute__((used)) dummyRead;
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
+    // Read from an OUT endpoint
+    uint32_t size;
+    uint32_t i;
+    uint32_t data = 0;
+    uint8_t offset;
+
+    LPC_USB->Ctrl = LOG_ENDPOINT(endpoint) | RD_EN;
+    while (!(LPC_USB->RxPLen & PKT_RDY));
+
+    size = LPC_USB->RxPLen & PKT_LNGTH_MASK;
+
+    offset = 0;
+
+    if (size > 0) {
+        for (i=0; i<size; i++) {
+            if (offset==0) {
+                // Fetch up to four bytes of data as a word
+                data = LPC_USB->RxData;
+            }
+
+            // extract a byte
+            *buffer = (data>>offset) & 0xff;
+            buffer++;
+
+            // move on to the next byte
+            offset = (offset + 8) % 32;
+        }
+    } else {
+        dummyRead = LPC_USB->RxData;
+    }
+
+    LPC_USB->Ctrl = 0;
+
+    if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
+        SIEselectEndpoint(endpoint);
+        SIEclearBuffer();
+    }
+
+    return size;
+}
+
+static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size) {
+    // Write to an IN endpoint
+    uint32_t temp, data;
+    uint8_t offset;
+
+    LPC_USB->Ctrl = LOG_ENDPOINT(endpoint) | WR_EN;
+
+    LPC_USB->TxPLen = size;
+    offset = 0;
+    data = 0;
+
+    if (size>0) {
+        do {
+            // Fetch next data byte into a word-sized temporary variable
+            temp = *buffer++;
+
+            // Add to current data word
+            temp = temp << offset;
+            data = data | temp;
+
+            // move on to the next byte
+            offset = (offset + 8) % 32;
+            size--;
+
+            if ((offset==0) || (size==0)) {
+                // Write the word to the endpoint
+                LPC_USB->TxData = data;
+                data = 0;
+            }
+        } while (size>0);
+    } else {
+        LPC_USB->TxData = 0;
+    }
+
+    // Clear WR_EN to cover zero length packet case
+    LPC_USB->Ctrl=0;
+
+    SIEselectEndpoint(endpoint);
+    SIEvalidateBuffer();
+}
+
+USBHAL::USBHAL(void) {
+    // Disable IRQ
+    NVIC_DisableIRQ(USB_IRQn);
+
+    // fill in callback array
+    epCallback[0] = &USBHAL::EP1_OUT_callback;
+    epCallback[1] = &USBHAL::EP1_IN_callback;
+    epCallback[2] = &USBHAL::EP2_OUT_callback;
+    epCallback[3] = &USBHAL::EP2_IN_callback;
+    epCallback[4] = &USBHAL::EP3_OUT_callback;
+    epCallback[5] = &USBHAL::EP3_IN_callback;
+    epCallback[6] = &USBHAL::EP4_OUT_callback;
+    epCallback[7] = &USBHAL::EP4_IN_callback;
+    epCallback[8] = &USBHAL::EP5_OUT_callback;
+    epCallback[9] = &USBHAL::EP5_IN_callback;
+    epCallback[10] = &USBHAL::EP6_OUT_callback;
+    epCallback[11] = &USBHAL::EP6_IN_callback;
+    epCallback[12] = &USBHAL::EP7_OUT_callback;
+    epCallback[13] = &USBHAL::EP7_IN_callback;
+    epCallback[14] = &USBHAL::EP8_OUT_callback;
+    epCallback[15] = &USBHAL::EP8_IN_callback;
+    epCallback[16] = &USBHAL::EP9_OUT_callback;
+    epCallback[17] = &USBHAL::EP9_IN_callback;
+    epCallback[18] = &USBHAL::EP10_OUT_callback;
+    epCallback[19] = &USBHAL::EP10_IN_callback;
+    epCallback[20] = &USBHAL::EP11_OUT_callback;
+    epCallback[21] = &USBHAL::EP11_IN_callback;
+    epCallback[22] = &USBHAL::EP12_OUT_callback;
+    epCallback[23] = &USBHAL::EP12_IN_callback;
+    epCallback[24] = &USBHAL::EP13_OUT_callback;
+    epCallback[25] = &USBHAL::EP13_IN_callback;
+    epCallback[26] = &USBHAL::EP14_OUT_callback;
+    epCallback[27] = &USBHAL::EP14_IN_callback;
+    epCallback[28] = &USBHAL::EP15_OUT_callback;
+    epCallback[29] = &USBHAL::EP15_IN_callback;
+
+    // Enable power to USB device controller
+    LPC_SC->PCONP |= PCUSB;
+
+    // Enable USB clocks
+    LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN | PORT_CLK_EN;
+    while ((LPC_USB->USBClkSt & (DEV_CLK_EN | AHB_CLK_EN | PORT_CLK_EN)) != (DEV_CLK_ON | AHB_CLK_ON | PORT_CLK_EN));
+
+    // Select port USB2
+    LPC_USB->StCtrl |= 3;
+
+
+    // Configure pin P0.31 to be USB2
+    LPC_IOCON->P0_31 &= ~0x07;
+    LPC_IOCON->P0_31 |= 0x01;
+
+    // Disconnect USB device
+    SIEdisconnect();
+
+    // Configure pin P0.14 to be Connect
+    LPC_IOCON->P0_14 &= ~0x07;
+    LPC_IOCON->P0_14 |= 0x03;
+
+    // Connect must be low for at least 2.5uS
+    wait(0.3);
+
+    // Set the maximum packet size for the control endpoints
+    realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
+    realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
+
+    // Attach IRQ
+    instance = this;
+    NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);
+
+    // Enable interrupts for device events and EP0
+    LPC_USB->DevIntEn = EP_SLOW | DEV_STAT | FRAME;
+    enableEndpointEvent(EP0IN);
+    enableEndpointEvent(EP0OUT);
+}
+
+USBHAL::~USBHAL(void) {
+    // Ensure device disconnected
+    SIEdisconnect();
+    // Disable USB interrupts
+    NVIC_DisableIRQ(USB_IRQn);
+}
+
+void USBHAL::connect(void) {
+    NVIC_EnableIRQ(USB_IRQn);
+    // Connect USB device
+    SIEconnect();
+}
+
+void USBHAL::disconnect(void) {
+    NVIC_DisableIRQ(USB_IRQn);
+    // Disconnect USB device
+    SIEdisconnect();
+}
+
+void USBHAL::configureDevice(void) {
+    SIEconfigureDevice();
+}
+
+void USBHAL::unconfigureDevice(void) {
+    SIEunconfigureDevice();
+}
+
+void USBHAL::setAddress(uint8_t address) {
+    SIEsetAddress(address);
+}
+
+void USBHAL::EP0setup(uint8_t *buffer) {
+    endpointReadcore(EP0OUT, buffer);
+}
+
+void USBHAL::EP0read(void) {
+    // Not required
+}
+
+void USBHAL::EP0readStage(void) {
+    // Not required
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
+    return endpointReadcore(EP0OUT, buffer);
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
+    endpointWritecore(EP0IN, buffer, size);
+}
+
+void USBHAL::EP0getWriteResult(void) {
+    // Not required
+}
+
+void USBHAL::EP0stall(void) {
+    // This will stall both control endpoints
+    stallEndpoint(EP0OUT);
+}
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
+
+    //for isochronous endpoint, we don't wait an interrupt
+    if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
+        if (!(epComplete & EP(endpoint)))
+            return EP_PENDING;
+    }
+
+    *bytesRead = endpointReadcore(endpoint, buffer);
+    epComplete &= ~EP(endpoint);
+    return EP_COMPLETED;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
+    if (getEndpointStallState(endpoint)) {
+        return EP_STALLED;
+    }
+
+    epComplete &= ~EP(endpoint);
+
+    endpointWritecore(endpoint, data, size);
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
+    if (epComplete & EP(endpoint)) {
+        epComplete &= ~EP(endpoint);
+        return EP_COMPLETED;
+    }
+
+    return EP_PENDING;
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
+    // Realise an endpoint
+    LPC_USB->DevIntClr = EP_RLZED;
+    LPC_USB->ReEp |= EP(endpoint);
+    LPC_USB->EpInd = endpoint;
+    LPC_USB->MaxPSize = maxPacket;
+
+    while (!(LPC_USB->DevIntSt & EP_RLZED));
+    LPC_USB->DevIntClr = EP_RLZED;
+
+    // Clear stall state
+    endpointStallState &= ~EP(endpoint);
+
+    enableEndpointEvent(endpoint);
+    return true;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint) {
+    // Stall an endpoint
+    if ( (endpoint==EP0IN) || (endpoint==EP0OUT) ) {
+        // Conditionally stall both control endpoints
+        SIEsetEndpointStatus(EP0OUT, SIE_SES_CND_ST);
+    } else {
+        SIEsetEndpointStatus(endpoint, SIE_SES_ST);
+
+        // Update stall state
+        endpointStallState |= EP(endpoint);
+    }
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint) {
+    // Unstall an endpoint. The endpoint will also be reinitialised
+    SIEsetEndpointStatus(endpoint, 0);
+
+    // Update stall state
+    endpointStallState &= ~EP(endpoint);
+}
+
+bool USBHAL::getEndpointStallState(uint8_t endpoint) {
+    // Returns true if endpoint stalled
+    return endpointStallState & EP(endpoint);
+}
+
+void USBHAL::remoteWakeup(void) {
+    // Remote wakeup
+    uint8_t status;
+
+    // Enable USB clocks
+    LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;
+    while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));
+
+    status = SIEgetDeviceStatus();
+    SIEsetDeviceStatus(status & ~SIE_DS_SUS);
+}
+
+void USBHAL::_usbisr(void) {
+    instance->usbisr();
+}
+
+
+void USBHAL::usbisr(void) {
+    uint8_t devStat;
+
+    if (LPC_USB->DevIntSt & FRAME) {
+        // Start of frame event
+        SOF(SIEgetFrameNumber());
+        // Clear interrupt status flag
+        LPC_USB->DevIntClr = FRAME;
+    }
+
+    if (LPC_USB->DevIntSt & DEV_STAT) {
+        // Device Status interrupt
+        // Must clear the interrupt status flag before reading the device status from the SIE
+        LPC_USB->DevIntClr = DEV_STAT;
+
+        // Read device status from SIE
+        devStat = SIEgetDeviceStatus();
+        //printf("devStat: %d\r\n", devStat);
+
+        if (devStat & SIE_DS_SUS_CH) {
+            // Suspend status changed
+            if((devStat & SIE_DS_SUS) != 0) {
+                suspendStateChanged(0);
+            }
+        }
+
+        if (devStat & SIE_DS_RST) {
+            // Bus reset
+            if((devStat & SIE_DS_SUS) == 0) {
+                suspendStateChanged(1);
+            }
+            busReset();
+        }
+    }
+
+    if (LPC_USB->DevIntSt & EP_SLOW) {
+        // (Slow) Endpoint Interrupt
+
+        // Process each endpoint interrupt
+        if (LPC_USB->EpIntSt & EP(EP0OUT)) {
+            if (selectEndpointClearInterrupt(EP0OUT) & SIE_SE_STP) {
+                // this is a setup packet
+                EP0setupCallback();
+            } else {
+                EP0out();
+            }
+            LPC_USB->DevIntClr = EP_SLOW;
+        }
+
+        if (LPC_USB->EpIntSt & EP(EP0IN)) {
+            selectEndpointClearInterrupt(EP0IN);
+            LPC_USB->DevIntClr = EP_SLOW;
+            EP0in();
+        }
+
+        for (uint8_t num = 2; num < 16*2; num++) {
+            if (LPC_USB->EpIntSt & EP(num)) {
+                selectEndpointClearInterrupt(num);
+                epComplete |= EP(num);
+                LPC_USB->DevIntClr = EP_SLOW;
+                if ((instance->*(epCallback[num - 2]))()) {
+                    epComplete &= ~EP(num);
+                }
+            }
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_Maxim.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,492 @@
+/*******************************************************************************
+ * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#if defined(TARGET_Maxim)
+
+#include "USBHAL.h"
+#include "usb_regs.h"
+#include "clkman_regs.h"
+
+#if defined(TARGET_MAX32625) || defined(TARGET_MAX32630)
+#include "pwrman_regs.h"
+#endif
+
+#define CONNECT_INTS    (MXC_F_USB_DEV_INTEN_BRST | MXC_F_USB_DEV_INTEN_SETUP | MXC_F_USB_DEV_INTEN_EP_IN | MXC_F_USB_DEV_INTEN_EP_OUT | MXC_F_USB_DEV_INTEN_DMA_ERR)
+
+USBHAL *USBHAL::instance;
+
+typedef struct {
+    volatile uint32_t buf0_desc;
+    volatile uint32_t buf0_address;
+    volatile uint32_t buf1_desc;
+    volatile uint32_t buf1_address;
+} ep_buffer_t;
+
+typedef struct {
+    ep_buffer_t out_buffer;
+    ep_buffer_t in_buffer;
+} ep0_buffer_t;
+
+typedef struct {
+    ep0_buffer_t ep0;
+    ep_buffer_t ep[MXC_USB_NUM_EP - 1];
+} ep_buffer_descriptor_t;
+
+// Static storage for endpoint buffer descriptor table. Must be 512 byte aligned for DMA.
+#ifdef __IAR_SYSTEMS_ICC__
+#pragma data_alignment = 512
+#else
+__attribute__ ((aligned (512))) 
+#endif
+ep_buffer_descriptor_t ep_buffer_descriptor;
+
+// static storage for temporary data buffers. Must be 32 byte aligned.
+#ifdef __IAR_SYSTEMS_ICC__
+#pragma data_alignment = 4
+#else
+__attribute__ ((aligned (4))) 
+#endif
+static uint8_t aligned_buffer[NUMBER_OF_LOGICAL_ENDPOINTS][MXC_USB_MAX_PACKET];
+
+// control packet state
+static enum {
+    CTRL_NONE = 0,
+    CTRL_SETUP,
+    CTRL_OUT,
+    CTRL_IN,
+} control_state;
+
+USBHAL::USBHAL(void)
+{
+    NVIC_DisableIRQ(USB_IRQn);
+
+#if defined(TARGET_MAX32600)
+    // The PLL must be enabled for USB
+    MBED_ASSERT(MXC_CLKMAN->clk_config & MXC_F_CLKMAN_CLK_CONFIG_PLL_ENABLE);
+
+    // Enable the USB clock
+    MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_USB_GATE_N;
+#elif defined(TARGET_MAX32620)
+    // Enable the USB clock
+    MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_USB_CLOCK_ENABLE;
+#elif defined(TARGET_MAX32625) || defined(TARGET_MAX32630)
+    MXC_PWRMAN->pwr_rst_ctrl |= MXC_F_PWRMAN_PWR_RST_CTRL_USB_POWERED;
+    MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_USB_CLOCK_ENABLE;
+#endif
+
+    // reset the device
+    MXC_USB->cn = 0;
+    MXC_USB->cn = MXC_F_USB_CN_USB_EN;
+    MXC_USB->dev_inten = 0;
+    MXC_USB->dev_cn = 0;
+    MXC_USB->dev_cn = MXC_F_USB_DEV_CN_URST;
+    MXC_USB->dev_cn = 0;
+
+    // fill in callback arrays
+    epCallback[EP0OUT] = NULL;
+    epCallback[EP0IN]  = NULL;
+    epCallback[EP1OUT] = &USBHAL::EP1_OUT_callback;
+    epCallback[EP1IN ] = &USBHAL::EP1_IN_callback;
+    epCallback[EP2OUT] = &USBHAL::EP2_OUT_callback;
+    epCallback[EP2IN ] = &USBHAL::EP2_IN_callback;
+    epCallback[EP3OUT] = &USBHAL::EP3_OUT_callback;
+    epCallback[EP3IN ] = &USBHAL::EP3_IN_callback;
+    epCallback[EP4OUT] = &USBHAL::EP4_OUT_callback;
+    epCallback[EP4IN ] = &USBHAL::EP4_IN_callback;
+    epCallback[EP5OUT] = &USBHAL::EP5_OUT_callback;
+    epCallback[EP5IN ] = &USBHAL::EP5_IN_callback;
+    epCallback[EP6OUT] = &USBHAL::EP6_OUT_callback;
+    epCallback[EP6IN ] = &USBHAL::EP6_IN_callback;
+    epCallback[EP7OUT] = &USBHAL::EP7_OUT_callback;
+    epCallback[EP7IN ] = &USBHAL::EP7_IN_callback;
+
+    // clear driver state
+    control_state = CTRL_NONE;
+
+    // set the descriptor location
+    MXC_USB->ep_base = (uint32_t)&ep_buffer_descriptor;
+
+    // enable VBUS interrupts
+    MXC_USB->dev_inten = MXC_F_USB_DEV_INTEN_NO_VBUS | MXC_F_USB_DEV_INTEN_VBUS;
+
+    // attach IRQ handler and enable interrupts
+    instance = this;
+    NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);
+    NVIC_EnableIRQ(USB_IRQn);
+}
+
+USBHAL::~USBHAL(void)
+{
+    MXC_USB->dev_cn = MXC_F_USB_DEV_CN_URST;
+    MXC_USB->dev_cn = 0;
+    MXC_USB->cn = 0;
+}
+
+void USBHAL::connect(void)
+{
+    // enable interrupts
+    MXC_USB->dev_inten |= CONNECT_INTS;
+
+    // allow interrupts on ep0
+    MXC_USB->ep[0] |= MXC_F_USB_EP_INT_EN;
+
+    // pullup enable
+    MXC_USB->dev_cn |= (MXC_F_USB_DEV_CN_CONNECT | MXC_F_USB_DEV_CN_FIFO_MODE);
+}
+
+void USBHAL::disconnect(void)
+{
+    // disable interrupts
+    MXC_USB->dev_inten &= ~CONNECT_INTS;
+
+    // disable pullup
+    MXC_USB->dev_cn &= ~MXC_F_USB_DEV_CN_CONNECT;
+}
+
+void USBHAL::configureDevice(void)
+{
+    // do nothing
+}
+
+void USBHAL::unconfigureDevice(void)
+{
+    // reset endpoints
+    for (int i = 0; i < MXC_USB_NUM_EP; i++) {
+        // Disable endpoint and clear the data toggle
+        MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR;
+        MXC_USB->ep[i] |= MXC_F_USB_EP_DT;
+    }
+}
+
+void USBHAL::setAddress(uint8_t address)
+{
+    // do nothing
+}
+
+void USBHAL::remoteWakeup(void)
+{
+    // do nothing
+}
+
+static ep_buffer_t *get_desc(uint8_t endpoint)
+{
+    uint8_t epnum = EP_NUM(endpoint);
+    ep_buffer_t *desc;
+
+    if (epnum == 0) {
+        if (IN_EP(endpoint)) {
+            desc = &ep_buffer_descriptor.ep0.in_buffer;
+        } else {
+            desc = &ep_buffer_descriptor.ep0.out_buffer;
+        }
+    } else {
+        desc = &ep_buffer_descriptor.ep[epnum - 1];
+    }
+
+    return desc;
+}
+
+void USBHAL::EP0setup(uint8_t *buffer)
+{
+    // Setup packet is fixed at 8 bytes
+    // Setup registers cannot be read in byte mode
+    uint32_t *ptr32 = (uint32_t*)buffer;
+    ptr32[0] = (uint32_t)MXC_USB->setup0;
+    ptr32[1] = (uint32_t)MXC_USB->setup1;
+}
+
+void USBHAL::EP0read(void)
+{
+    if (control_state == CTRL_IN) {
+        // This is the status stage. ACK.
+        MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK;
+        control_state = CTRL_NONE;
+        return;
+    }
+
+    control_state = CTRL_OUT;
+
+    endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0);
+}
+
+void USBHAL::EP0readStage(void)
+{
+    // do nothing
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
+{
+    uint32_t size;
+
+    if (MXC_USB->out_owner & 1) {
+        return 0;
+    }
+
+    // get the packet length and contents
+    ep_buffer_t *desc = get_desc(EP0OUT);
+    size = desc->buf0_desc;
+    memcpy(buffer, aligned_buffer[0], size);
+
+    return size;
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
+{
+    if ((size == 0) && (control_state != CTRL_IN)) {
+        // This is a status stage ACK. Handle in hardware.
+        MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK;
+        control_state = CTRL_NONE;
+        return;
+    }
+
+    control_state = CTRL_IN;
+
+    endpointWrite(EP0IN, buffer, size);
+}
+
+void USBHAL::EP0stall(void)
+{
+    stallEndpoint(0);
+}
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize)
+{
+    uint8_t epnum = EP_NUM(endpoint);
+
+    if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) {
+        return EP_INVALID;
+    }
+
+    if (maximumSize > MXC_USB_MAX_PACKET) {
+        return EP_INVALID;
+    }
+    
+    uint32_t mask = (1 << epnum);
+    if (MXC_USB->out_owner & mask) {
+        return EP_INVALID;
+    }
+
+    ep_buffer_t *desc = get_desc(endpoint);
+    desc->buf0_desc = maximumSize;
+    desc->buf0_address = (uint32_t)aligned_buffer[epnum];
+
+    MXC_USB->out_owner = mask;
+
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead)
+{
+    if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) {
+        return EP_INVALID;
+    }
+
+    uint32_t mask = (1 << EP_NUM(endpoint));
+    if (MXC_USB->out_owner & mask) {
+        return EP_PENDING;
+    }
+
+    // get the packet length and contents
+    ep_buffer_t *desc = get_desc(endpoint);
+    *bytesRead = desc->buf0_desc;
+    memcpy(data, aligned_buffer[EP_NUM(endpoint)], *bytesRead);
+
+    return EP_COMPLETED;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
+{
+    uint8_t epnum = EP_NUM(endpoint);
+
+    if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || OUT_EP(endpoint)) {
+        return EP_INVALID;
+    }
+
+    if (size > MXC_USB_MAX_PACKET) {
+        return EP_INVALID;
+    }
+
+    uint32_t mask = (1 << epnum);
+    if (MXC_USB->in_owner & mask) {
+        return EP_INVALID;
+    }
+
+    memcpy(aligned_buffer[epnum], data, size);
+
+    ep_buffer_t *desc = get_desc(endpoint);
+    desc->buf0_desc = size;
+    desc->buf0_address = (uint32_t)aligned_buffer[epnum];
+
+    // start the DMA
+    MXC_USB->in_owner = mask;
+
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
+{
+    uint32_t mask = (1 << EP_NUM(endpoint));
+    if (MXC_USB->in_owner & mask) {
+        return EP_PENDING;
+    }
+
+    return EP_COMPLETED;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint)
+{
+    uint8_t epnum = EP_NUM(endpoint);
+
+    if (epnum == 0) {
+        MXC_USB->ep[epnum] |= MXC_F_USB_EP_ST_STALL;
+    }
+
+    MXC_USB->ep[epnum] |= MXC_F_USB_EP_STALL;
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint)
+{
+    MXC_USB->ep[EP_NUM(endpoint)] &= ~MXC_F_USB_EP_STALL;
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
+{
+    uint8_t epnum = EP_NUM(endpoint);
+    uint32_t ep_ctrl;
+
+    if (epnum >= NUMBER_OF_PHYSICAL_ENDPOINTS) {
+        return false;
+    }
+
+    if (IN_EP(endpoint)) {
+        ep_ctrl = (MXC_V_USB_EP_DIR_IN << MXC_F_USB_EP_DIR_POS);
+    } else {
+        ep_ctrl = (MXC_S_USB_EP_DIR_OUT << MXC_F_USB_EP_DIR_POS);
+    }
+
+    ep_ctrl |= (MXC_F_USB_EP_DT | MXC_F_USB_EP_INT_EN);
+
+    MXC_USB->ep[epnum] = ep_ctrl;
+
+    return true;
+}
+
+bool USBHAL::getEndpointStallState(unsigned char endpoint)
+{
+    return !!(MXC_USB->ep[endpoint] & MXC_F_USB_EP_STALL);
+}
+
+void USBHAL::_usbisr(void)
+{
+    instance->usbisr();
+}
+
+void USBHAL::usbisr(void)
+{
+    // get and clear irqs
+    uint32_t irq_flags = MXC_USB->dev_intfl;
+    MXC_USB->dev_intfl = irq_flags;
+
+    // process only enabled interrupts
+    irq_flags &= MXC_USB->dev_inten;
+
+    // suspend 
+    if (irq_flags & MXC_F_USB_DEV_INTFL_SUSP) {
+        suspendStateChanged(1);
+    }
+
+    // bus reset
+    if (irq_flags & MXC_F_USB_DEV_INTFL_BRST) {
+
+        // reset endpoints
+        for (int i = 0; i < MXC_USB_NUM_EP; i++) {
+            // Disable endpoint and clear the data toggle
+            MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR;
+            MXC_USB->ep[i] |= MXC_F_USB_EP_DT;
+        }
+
+        // clear driver state
+        control_state = CTRL_NONE;
+
+        busReset();
+
+        // no need to process events after reset
+        return;
+    }
+
+    // Setup packet
+    if (irq_flags & MXC_F_USB_DEV_INTFL_SETUP) {
+        control_state = CTRL_SETUP;
+        EP0setupCallback();
+    }
+
+    // IN packets
+    if (irq_flags & MXC_F_USB_DEV_INTFL_EP_IN) {
+        // get and clear IN irqs
+        uint32_t in_irqs = MXC_USB->in_int;
+        MXC_USB->in_int = in_irqs;
+
+        if (in_irqs & 1) {
+            EP0in();
+        }
+
+        for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) {
+            uint32_t irq_mask = (1 << epnum);
+            if (in_irqs & irq_mask) {
+                uint8_t endpoint = (epnum << 1) | DIR_IN;
+                (instance->*(epCallback[endpoint]))();
+            }
+        }
+    }
+
+    // OUT packets
+    if (irq_flags & MXC_F_USB_DEV_INTFL_EP_OUT) {
+        // get and clear OUT irqs
+        uint32_t out_irqs = MXC_USB->out_int;
+        MXC_USB->out_int = out_irqs;
+
+        if (out_irqs & 1) {
+            EP0out();
+        }
+
+        for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) {
+            uint32_t irq_mask = (1 << epnum);
+            if (out_irqs & irq_mask) {
+                uint8_t endpoint = (epnum << 1) | DIR_OUT;
+                (instance->*(epCallback[endpoint]))();
+            }
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_RZ_A1H.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,1497 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person
+* obtaining a copy of this software and associated documentation
+* files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use,
+* copy, modify, merge, publish, distribute, sublicense, and/or
+* sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the
+* Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(TARGET_RZ_A1H) || defined(TARGET_VK_RZ_A1H)
+
+/*
+  This class can use the pipe1, pipe3 and pipe6 only. You should
+  re-program this class if you wanted to use other pipe.
+ */
+
+/*************************************************************************/
+extern "C"
+{
+#include "r_typedefs.h"
+#include "iodefine.h"
+}
+#include "USBHAL.h"
+#include "devdrv_usb_function_api.h"
+#include "usb_iobitmask.h"
+#include "rza_io_regrw.h"
+#include "USBDevice_Types.h"
+#include "usb_function_setting.h"
+
+
+/*************************************************************************/
+/* constants */
+const struct PIPECFGREC {
+    uint16_t    endpoint;
+    uint16_t    pipesel;
+    uint16_t    pipecfg;
+    uint16_t    pipebuf;
+    uint16_t    pipemaxp;
+    uint16_t    pipeperi;
+} def_pipecfg[] = {
+    /*EP0OUT and EP0IN are configured by USB IP*/
+    {
+        EP1OUT, /*EP1: Host -> Func, INT*/
+        6 | USB_FUNCTION_D0FIFO_USE,
+        USB_FUNCTION_INTERRUPT |
+        USB_FUNCTION_BFREOFF   |
+        USB_FUNCTION_DBLBOFF   |
+        USB_FUNCTION_CNTMDON   |
+        USB_FUNCTION_SHTNAKOFF |
+        USB_FUNCTION_DIR_P_OUT |
+        USB_FUNCTION_EP1,
+        ( ( (  64) / 64 - 1 ) << 10 ) | 0x04u,
+        MAX_PACKET_SIZE_EP1,
+        DEVDRV_USBF_OFF |
+        ( 3 << USB_PIPEPERI_IITV_SHIFT ),
+    },
+    {
+        EP1IN,  /*EP1: Host <- Func, INT*/
+        7 | USB_FUNCTION_D1FIFO_USE,
+        USB_FUNCTION_INTERRUPT |
+        USB_FUNCTION_BFREOFF   |
+        USB_FUNCTION_DBLBOFF   |
+        USB_FUNCTION_CNTMDOFF  |
+        USB_FUNCTION_SHTNAKOFF |
+        USB_FUNCTION_DIR_P_IN  |
+        USB_FUNCTION_EP1,
+        ( ( (  64) / 64 - 1 ) << 10 ) | 0x05u,
+        MAX_PACKET_SIZE_EP1,
+        DEVDRV_USBF_OFF |
+        ( 3 << USB_PIPEPERI_IITV_SHIFT ),
+    },
+    {
+        EP2OUT, /*EP2: Host -> Func, BULK*/
+        3 | USB_FUNCTION_D0FIFO_USE,
+        USB_FUNCTION_BULK      |
+        USB_FUNCTION_BFREOFF   |
+        USB_FUNCTION_DBLBON    |
+        USB_FUNCTION_CNTMDON   |
+        USB_FUNCTION_SHTNAKON  |
+        USB_FUNCTION_DIR_P_OUT |
+        USB_FUNCTION_EP2,
+        ( ( (2048) / 64 - 1 ) << 10 ) | 0x30u,
+        MAX_PACKET_SIZE_EP2,
+        DEVDRV_USBF_OFF |
+        ( 0 << USB_PIPEPERI_IITV_SHIFT ),
+    },
+    {
+        EP2IN,  /*EP2: Host <- Func, BULK*/
+        4 | USB_FUNCTION_D1FIFO_USE,
+        USB_FUNCTION_BULK      |
+        USB_FUNCTION_BFREOFF   |
+        USB_FUNCTION_DBLBOFF   |
+        USB_FUNCTION_CNTMDON   |
+        USB_FUNCTION_SHTNAKOFF |
+        USB_FUNCTION_DIR_P_IN  |
+        USB_FUNCTION_EP2,
+        ( ( (2048) / 64 - 1 ) << 10 ) | 0x50u,
+        MAX_PACKET_SIZE_EP2,
+        DEVDRV_USBF_OFF |
+        ( 0 << USB_PIPEPERI_IITV_SHIFT ),
+    },
+    {
+        EP3OUT, /*EP3: Host -> Func, ISO*/
+        1 | USB_FUNCTION_D0FIFO_USE,
+        USB_FUNCTION_ISO       |
+        USB_FUNCTION_BFREOFF   |
+        USB_FUNCTION_DBLBON    |
+        USB_FUNCTION_CNTMDOFF  |
+        USB_FUNCTION_SHTNAKON  |
+        USB_FUNCTION_DIR_P_OUT |
+        USB_FUNCTION_EP3,
+        ( ( ( 512) / 64 - 1 ) << 10 ) | 0x10u,
+        MAX_PACKET_SIZE_EP3,
+        DEVDRV_USBF_OFF |
+        ( 0 << USB_PIPEPERI_IITV_SHIFT ),
+    },
+    {
+        EP3IN,  /*EP3: Host <- Func, ISO*/
+        2 | USB_FUNCTION_D1FIFO_USE,
+        USB_FUNCTION_ISO       |
+        USB_FUNCTION_BFREOFF   |
+        USB_FUNCTION_DBLBON    |
+        USB_FUNCTION_CNTMDOFF  |
+        USB_FUNCTION_SHTNAKOFF |
+        USB_FUNCTION_DIR_P_IN  |
+        USB_FUNCTION_EP3,
+        ( ( ( 512) / 64 - 1 ) << 10 ) | 0x20u,
+        MAX_PACKET_SIZE_EP3,
+        DEVDRV_USBF_OFF |
+        ( 0 << USB_PIPEPERI_IITV_SHIFT ),
+    },
+    { /*terminator*/
+        0, 0, 0, 0, 0,
+    },
+};
+
+
+/*************************************************************************/
+/* workareas */
+USBHAL * USBHAL::instance;
+
+static IRQn_Type    int_id;         /* interrupt ID          */
+static uint16_t     int_level;      /* initerrupt level      */
+static uint16_t     clock_mode;     /* input clock selector  */
+static uint16_t     mode;           /* USB speed (HIGH/FULL) */
+
+//static DigitalOut *usbx_en;
+
+static uint16_t     EP0_read_status;
+static uint16_t     EPx_read_status;
+
+static uint16_t setup_buffer[MAX_PACKET_SIZE_EP0 / 2];
+
+/* 0: not used / other: a pipe number to use recv_buffer*/
+static uint8_t  recv_buffer[MAX_PACKET_SIZE_EPBULK];
+volatile static uint16_t    recv_error;
+
+
+/*************************************************************************/
+/* prototypes for C */
+extern "C" {
+    void usbx_function_BRDYInterruptPIPE0 (uint16_t status, uint16_t intenb,
+        USBHAL *object, void (USBHAL::*EP0func)(void));
+
+    void usbx_function_BRDYInterrupt (uint16_t status, uint16_t intenb,
+        USBHAL *object, bool (USBHAL::*epCallback[])(void));
+
+    void usbx_function_NRDYInterruptPIPE0(uint16_t status, uint16_t intenb,
+        USBHAL *object, void (USBHAL::*EP0func)(void));
+
+    void usbx_function_NRDYInterrupt (uint16_t status, uint16_t intenb,
+        USBHAL *object, bool (USBHAL::*epCallback[])(void));
+
+    void usbx_function_BEMPInterruptPIPE0(uint16_t status, uint16_t intenb,
+        USBHAL *object, void (USBHAL::*EP0func)(void));
+
+    void usbx_function_BEMPInterrupt (uint16_t status, uint16_t intenb,
+        USBHAL *object, bool (USBHAL::*epCallback[])(void));
+}
+
+
+/*************************************************************************/
+/* macros */
+
+/******************************************************************************
+ * Function Name: usbx_function_BRDYInterruptPIPE0
+ * Description  : Executes BRDY interrupt for pipe0.
+ * Arguments    : uint16_t status       ; BRDYSTS Register Value
+ *              : uint16_t intenb       ; BRDYENB Register Value
+ * Return Value : none
+ *****************************************************************************/
+extern "C" {
+    void usbx_function_BRDYInterruptPIPE0 (
+        uint16_t status,
+        uint16_t intenb,
+        USBHAL *object,
+        void (USBHAL::*EP0func)(void)
+    )
+    {
+        volatile uint16_t dumy_sts;
+        uint16_t read_status;
+
+        USB20X.BRDYSTS =
+            (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0];
+        RZA_IO_RegWrite_16(
+            &USB20X.CFIFOSEL, USB_FUNCTION_PIPE0,
+            USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
+
+        g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0] =
+            g_usbx_function_data_count[USB_FUNCTION_PIPE0];
+
+        read_status = usbx_function_read_buffer_c(USB_FUNCTION_PIPE0);
+
+        g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0] -=
+            g_usbx_function_data_count[USB_FUNCTION_PIPE0];
+
+        switch (read_status) {
+            case USB_FUNCTION_READING:      /* Continue of data read */
+            case USB_FUNCTION_READEND:      /* End of data read */
+                /* PID = BUF */
+                usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);
+
+                /*callback*/
+                (object->*EP0func)();
+                break;
+
+            case USB_FUNCTION_READSHRT:     /* End of data read */
+                usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0);
+                /* PID = BUF */
+                usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);
+
+                /*callback*/
+                (object->*EP0func)();
+                break;
+
+            case USB_FUNCTION_READOVER:     /* FIFO access error */
+                /* Buffer Clear */
+                USB20X.CFIFOCTR = USB_FUNCTION_BITBCLR;
+                usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0);
+                /* Req Error */
+                usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
+
+                /*callback*/
+                (object->*EP0func)();
+                break;
+
+            case DEVDRV_USBF_FIFOERROR:     /* FIFO access error */
+            default:
+                usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0);
+                /* Req Error */
+                usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
+                break;
+        }
+        /* Three dummy reads for clearing interrupt requests */
+        dumy_sts = USB20X.BRDYSTS;
+    }
+}
+
+
+/******************************************************************************
+ * Function Name: usbx_function_BRDYInterrupt
+ * Description  : Executes BRDY interrupt uxclude pipe0.
+ * Arguments    : uint16_t status       ; BRDYSTS Register Value
+ *              : uint16_t intenb       ; BRDYENB Register Value
+ * Return Value : none
+ *****************************************************************************/
+extern "C" {
+    void usbx_function_BRDYInterrupt(
+        uint16_t status,
+        uint16_t intenb,
+        USBHAL *object,
+        bool (USBHAL::*epCallback[])(void)
+    )
+    {
+        volatile uint16_t dumy_sts;
+
+        /**************************************************************
+         * Function Name: usbx_function_brdy_int
+         * Description  : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9).
+         *              : According to the pipe that interrupt is generated in,
+         *              : reads/writes buffer allocated in the pipe.
+         *              : This function is executed in the BRDY
+         *              : interrupt handler.  This function
+         *              : clears BRDY interrupt status and BEMP
+         *              : interrupt status.
+         * Arguments    : uint16_t Status    ; BRDYSTS Register Value
+         *              : uint16_t Int_enbl  ; BRDYENB Register Value
+         * Return Value : none
+         *************************************************************/
+        /* copied from usbx_function_intrn.c */
+        uint32_t int_sense = 0;
+        uint16_t pipe;
+        uint16_t pipebit;
+        uint16_t ep;
+
+        for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) {
+            pipebit = g_usbx_function_bit_set[pipe];
+
+            if ((status & pipebit) && (intenb & pipebit)) {
+                USB20X.BRDYSTS = (uint16_t)~pipebit;
+                USB20X.BEMPSTS = (uint16_t)~pipebit;
+
+                switch (g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) {
+                    case USB_FUNCTION_D0FIFO_DMA:
+                        if (g_usbx_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) {
+                            /*now, DMA is not supported*/
+                            usbx_function_dma_interrupt_d0fifo(int_sense);
+                        }
+
+                        if (RZA_IO_RegRead_16(
+                                &g_usbx_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) {
+                            /*now, DMA is not supported*/
+                            usbx_function_read_dma(pipe);
+                            usbx_function_disable_brdy_int(pipe);
+                        } else {
+                            USB20X.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                            g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                        }
+                        break;
+
+                    case USB_FUNCTION_D1FIFO_DMA:
+                        if (g_usbx_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) {
+                            /*now, DMA is not supported*/
+                            usbx_function_dma_interrupt_d1fifo(int_sense);
+                        }
+
+                        if (RZA_IO_RegRead_16(
+                                &g_usbx_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) {
+                            /*now, DMA is not supported*/
+                            usbx_function_read_dma(pipe);
+                            usbx_function_disable_brdy_int(pipe);
+                        } else {
+                            USB20X.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                            g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+                        }
+                        break;
+
+                    default:
+                        ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
+                        ep <<= 1;
+                        if (RZA_IO_RegRead_16(
+                                &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
+                            /* read */
+                            EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
+                            (object->*(epCallback[ep - 2])) ();
+                            EPx_read_status = DEVDRV_USBF_PIPE_DONE;
+                        } else {
+                            /* write */
+                            EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
+                            (object->*(epCallback[ep - 2 + 1])) ();
+                            EPx_read_status = DEVDRV_USBF_PIPE_DONE;
+                            usbx_function_write_buffer(pipe);
+                        }
+                }
+            }
+        }
+        /* Three dummy reads for clearing interrupt requests */
+        dumy_sts = USB20X.BRDYSTS;
+    }
+}
+
+
+/******************************************************************************
+ * Function Name: usbx_function_NRDYInterruptPIPE0
+ * Description  : Executes NRDY interrupt for pipe0.
+ * Arguments    : uint16_t status       ; NRDYSTS Register Value
+ *              : uint16_t intenb       ; NRDYENB Register Value
+ * Return Value : none
+ *****************************************************************************/
+extern "C" {
+    void usbx_function_NRDYInterruptPIPE0(
+        uint16_t status,
+        uint16_t intenb,
+        USBHAL *object,
+        void (USBHAL::*EP0func)(void)
+    )
+    {
+        volatile uint16_t dumy_sts;
+
+        USB20X.NRDYSTS =
+            (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0];
+
+        /* Three dummy reads for clearing interrupt requests */
+        dumy_sts = USB20X.NRDYSTS;
+    }
+}
+
+
+/******************************************************************************
+ * Function Name: usbx_function_NRDYInterrupt
+ * Description  : Executes NRDY interrupt exclude pipe0.
+ * Arguments    : uint16_t status       ; NRDYSTS Register Value
+ *              : uint16_t intenb       ; NRDYENB Register Value
+ * Return Value : none
+ *****************************************************************************/
+extern "C" {
+    void usbx_function_NRDYInterrupt(
+        uint16_t status,
+        uint16_t intenb,
+        USBHAL *object,
+        bool (USBHAL::*epCallback[])(void)
+    )
+    {
+        volatile uint16_t dumy_sts;
+
+        /**************************************************************
+         * Function Name: usbx_function_nrdy_int
+         * Description  : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9).
+         *              : Checks NRDY interrupt cause by PID. When the cause if STALL,
+         *              : regards the pipe state as STALL and ends the processing.
+         *              : Then the cause is not STALL, increments the error count to
+         *              : communicate again. When the error count is 3, determines
+         *              : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing.
+         *              : This function is executed in the NRDY interrupt handler.
+         *              : This function clears NRDY interrupt status.
+         * Arguments    : uint16_t status       ; NRDYSTS Register Value
+         *              : uint16_t int_enb      ; NRDYENB Register Value
+         * Return Value : none
+         *************************************************************/
+        /* copied from usbx_function_intrn.c */
+#if 0
+        uint16_t usefifo;
+#endif
+        uint16_t pid;
+        uint16_t pipe;
+        uint16_t bitcheck;
+#if 0
+        uint16_t mbw;
+        uint32_t size;
+#endif
+        uint16_t ep;
+
+        bitcheck = (uint16_t)(status & intenb);
+
+        USB20X.NRDYSTS = (uint16_t)~status;
+
+
+        if (RZA_IO_RegRead_16(&USB20X.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1) {
+            /* USB HOST */
+            /* not support */
+
+        } else {
+            /* USB Function */
+            for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) {
+                if ((bitcheck&g_usbx_function_bit_set[pipe]) != g_usbx_function_bit_set[pipe]) {
+                    continue;
+                }
+
+                if (g_usbx_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_WAIT) {
+                    continue;
+                }
+
+#if 0
+                usbx_function_set_pid_nak(pipe);
+
+                size = (uint32_t)g_usbx_function_data_count[pipe];
+                mbw = usbx_function_get_mbw(
+                    size, (uint32_t)g_usbx_function_data_pointer[pipe]);
+
+                usefifo = (uint16_t)(g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+                switch (usefifo) {
+
+                    case USB_FUNCTION_D0FIFO_USE:
+                        usbx_function_set_curpipe(
+                            pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+                        USB20X.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+                        break;
+
+                    case USB_FUNCTION_D1FIFO_USE:
+                        usbx_function_set_curpipe(
+                            pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+                        USB20X.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+                        break;
+
+                    default:
+                        usbx_function_set_curpipe(
+                            pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
+                        USB20X.CFIFOCTR = USB_FUNCTION_BITBCLR;
+                        break;
+                }
+
+                usbx_function_aclrm(pipe);
+
+                usbx_function_enable_nrdy_int(pipe);
+                usbx_function_enable_brdy_int(pipe);
+
+                usbx_function_set_pid_buf(pipe);
+#endif
+
+                pid = usbx_function_get_pid(pipe);
+                if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) {
+                    g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+                } else {
+                    usbx_function_set_pid_buf(pipe);
+                }
+
+                ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
+                ep <<= 1;
+                if (RZA_IO_RegRead_16(
+                        &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
+                    /* read */
+                    __NOP();
+                } else {
+                    /* write */
+                    __NOP();
+                }
+            }
+        }
+
+        /* Three dummy reads for clearing interrupt requests */
+        dumy_sts = USB20X.NRDYSTS;
+    }
+}
+
+/******************************************************************************
+ * Function Name: usbx_function_BEMPInterruptPIPE0
+ * Description  : Executes BEMP interrupt for pipe0.
+ * Arguments    : uint16_t status       ; BEMPSTS Register Value
+ *              : uint16_t intenb       ; BEMPENB Register Value
+ * Return Value : none
+ *****************************************************************************/
+extern "C" {
+    void usbx_function_BEMPInterruptPIPE0(
+        uint16_t status,
+        uint16_t intenb,
+        USBHAL *object,
+        void (USBHAL::*EP0func)(void)
+    )
+    {
+        volatile uint16_t dumy_sts;
+
+        USB20X.BEMPSTS =
+            (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0];
+        RZA_IO_RegWrite_16(
+            &USB20X.CFIFOSEL, USB_FUNCTION_PIPE0,
+            USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
+
+        /*usbx_function_write_buffer_c(USB_FUNCTION_PIPE0);*/
+        (object->*EP0func)();
+
+        /* Three dummy reads for clearing interrupt requests */
+        dumy_sts = USB20X.BEMPSTS;
+    }
+}
+
+
+/******************************************************************************
+ * Function Name: usbx_function_BEMPInterrupt
+ * Description  : Executes BEMP interrupt exclude pipe0.
+ * Arguments    : uint16_t status       ; BEMPSTS Register Value
+ *              : uint16_t intenb       ; BEMPENB Register Value
+ * Return Value : none
+ *****************************************************************************/
+extern "C" {
+    void usbx_function_BEMPInterrupt(
+        uint16_t status,
+        uint16_t intenb,
+        USBHAL *object,
+        bool (USBHAL::*epCallback[])(void)
+    )
+    {
+        volatile uint16_t dumy_sts;
+
+        /**************************************************************
+         * Function Name: usbx_function_bemp_int
+         * Description  : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9).
+         * Arguments    : uint16_t status       ; BEMPSTS Register Value
+         *              : uint16_t intenb      ; BEMPENB Register Value
+         * Return Value : none
+         *************************************************************/
+        /* copied from usbx_function_intrn.c */
+        uint16_t pid;
+        uint16_t pipe;
+        uint16_t bitcheck;
+        uint16_t inbuf;
+        uint16_t ep;
+
+        bitcheck = (uint16_t)(status & intenb);
+
+        USB20X.BEMPSTS = (uint16_t)~status;
+
+        for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) {
+            if ((bitcheck&g_usbx_function_bit_set[pipe]) != g_usbx_function_bit_set[pipe]) {
+                continue;
+            }
+
+            pid = usbx_function_get_pid(pipe);
+
+            if ((pid == DEVDRV_USBF_PID_STALL) ||
+                (pid == DEVDRV_USBF_PID_STALL2)) {
+                g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
+
+            } else {
+                inbuf = usbx_function_get_inbuf(pipe);
+
+                if (inbuf == 0) {
+                    usbx_function_disable_bemp_int(pipe);
+                    usbx_function_set_pid_nak(pipe);
+                    g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
+
+                    switch (g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) {
+                        case USB_FUNCTION_D0FIFO_DMA:
+                            /*now, DMA is not supported*/
+                            break;
+
+                        case USB_FUNCTION_D1FIFO_DMA:
+                            /*now, DMA is not supported*/
+                            break;
+
+                        default:
+                            ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
+                            ep <<= 1;
+                            if (RZA_IO_RegRead_16(
+                                    &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
+                                /* read */
+                                __NOP();
+                            } else {
+                                /* write */
+                                EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
+                                (object->*(epCallback[ep - 2 + 1])) ();
+                                EPx_read_status = DEVDRV_USBF_PIPE_DONE;
+                            }
+                    }
+                }
+            }
+        }
+
+        /* Three dummy reads for clearing interrupt requests */
+        dumy_sts = USB20X.BEMPSTS;
+    }
+}
+
+/******************************************************************************
+ * Function Name: EP2PIPE
+ * Description  : Converts from endpoint to pipe
+ * Arguments    : number of endpoint
+ * Return Value : number of pipe
+ *****************************************************************************/
+/*EP2PIPE converter is for pipe1, pipe3 and pipe6 only.*/
+#define EP2PIPE(endpoint)   ((uint32_t)usbx_function_EpToPipe(endpoint))
+
+
+/******************************************************************************
+ * Function Name: usbx_function_save_request
+ * Description  : Retains the USB request information in variables.
+ * Arguments    : none
+ * Return Value : none
+ *****************************************************************************/
+#define  usbx_function_save_request()                       \
+    {                                                       \
+        uint16_t *bufO = &setup_buffer[0];                  \
+                                                            \
+        USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVALID;  \
+        /*data[0] <= bmRequest, data[1] <= bmRequestType */ \
+        *bufO++ = USB20X.USBREQ;                            \
+        /*data[2] data[3] <= wValue*/                       \
+        *bufO++ = USB20X.USBVAL;                            \
+        /*data[4] data[5] <= wIndex*/                       \
+        *bufO++ = USB20X.USBINDX;                           \
+        /*data[6] data[6] <= wIndex*/                       \
+        *bufO++ = USB20X.USBLENG;                           \
+    }
+
+
+/*************************************************************************/
+/*************************************************************************/
+/*************************************************************************/
+
+/*************************************************************************/
+/* constructor */
+USBHAL::USBHAL(void)
+{
+    /* ---- P4_1 : P4_1 (USB0_EN for GR-PEACH) ---- */
+    //usbx_en = new DigitalOut(P4_1, 1);
+
+    /* some constants */
+    int_id          = USBIX_IRQn;
+    int_level       = ( 2 << 3 );
+    clock_mode      = USBFCLOCK_X1_48MHZ;
+#if (USB_FUNCTION_HISPEED == 0)
+    mode            = USB_FUNCTION_FULL_SPEED;
+#else
+    mode            = USB_FUNCTION_HIGH_SPEED;
+#endif
+    EP0_read_status = DEVDRV_USBF_WRITEEND;
+    EPx_read_status = DEVDRV_USBF_PIPE_DONE;
+
+    /* Disables interrupt for usb */
+    GIC_DisableIRQ(int_id);
+
+    /* Setup the end point */
+    epCallback[ 0] = &USBHAL::EP1_OUT_callback;
+    epCallback[ 1] = &USBHAL::EP1_IN_callback;
+    epCallback[ 2] = &USBHAL::EP2_OUT_callback;
+    epCallback[ 3] = &USBHAL::EP2_IN_callback;
+    epCallback[ 4] = &USBHAL::EP3_OUT_callback;
+    epCallback[ 5] = &USBHAL::EP3_IN_callback;
+    epCallback[ 6] = &USBHAL::EP4_OUT_callback;
+    epCallback[ 7] = &USBHAL::EP4_IN_callback;
+    epCallback[ 8] = &USBHAL::EP5_OUT_callback;
+    epCallback[ 9] = &USBHAL::EP5_IN_callback;
+    epCallback[10] = &USBHAL::EP6_OUT_callback;
+    epCallback[11] = &USBHAL::EP6_IN_callback;
+    epCallback[12] = &USBHAL::EP7_OUT_callback;
+    epCallback[13] = &USBHAL::EP7_IN_callback;
+    epCallback[14] = &USBHAL::EP8_OUT_callback;
+    epCallback[15] = &USBHAL::EP8_IN_callback;
+    epCallback[16] = &USBHAL::EP9_OUT_callback;
+    epCallback[17] = &USBHAL::EP9_IN_callback;
+    epCallback[18] = &USBHAL::EP10_OUT_callback;
+    epCallback[19] = &USBHAL::EP10_IN_callback;
+    epCallback[20] = &USBHAL::EP11_OUT_callback;
+    epCallback[21] = &USBHAL::EP11_IN_callback;
+    epCallback[22] = &USBHAL::EP12_OUT_callback;
+    epCallback[23] = &USBHAL::EP12_IN_callback;
+    epCallback[24] = &USBHAL::EP13_OUT_callback;
+    epCallback[25] = &USBHAL::EP13_IN_callback;
+    epCallback[26] = &USBHAL::EP14_OUT_callback;
+    epCallback[27] = &USBHAL::EP14_IN_callback;
+    epCallback[28] = &USBHAL::EP15_OUT_callback;
+    epCallback[29] = &USBHAL::EP15_IN_callback;
+
+    /* registers me */
+    instance = this;
+
+    /* Clear pipe table */
+    usbx_function_clear_pipe_tbl();
+
+/******************************************************************************
+ * Function Name: usbx_api_function_init
+ * Description  : Initializes the USB module in the USB function mode.
+ *****************************************************************************/
+    /* The clock of USB0 modules is permitted */
+#if (USB_FUNCTION_CH == 0)
+    CPG.STBCR7 &= ~(CPG_STBCR7_MSTP71);
+#else
+    CPG.STBCR7 &= ~(CPG_STBCR7_MSTP71 | CPG_STBCR7_MSTP70);
+#endif
+    volatile uint8_t    dummy8;
+    dummy8 = CPG.STBCR7;
+
+    {
+/******************************************************************************
+ * Function Name: usbx_function_setting_interrupt
+ * Description  : Sets the USB module interrupt level.
+ *****************************************************************************/
+#if 0   /*DMA is not supported*/
+        IRQn_Type d0fifo_dmaintid;
+        IRQn_Type d1fifo_dmaintid;
+#endif
+
+        InterruptHandlerRegister(int_id, &_usbisr);
+        GIC_SetPriority(int_id, int_level);
+        GIC_EnableIRQ(int_id);
+
+#if 0   /*DMA is not supported*/
+        d0fifo_dmaintid = Userdef_USB_usbx_function_d0fifo_dmaintid();
+        if (d0fifo_dmaintid != 0xFFFF) {
+            InterruptHandlerRegister(d0fifo_dmaintid, usbx_function_dma_interrupt_d0fifo);
+            GIC_SetPriority(d0fifo_dmaintid, int_level);
+            GIC_EnableIRQ(d0fifo_dmaintid);
+        }
+#endif
+
+#if 0   /*DMA is not supported*/
+        d1fifo_dmaintid = Userdef_USB_usbx_function_d1fifo_dmaintid();
+        if (d1fifo_dmaintid != 0xFFFF) {
+            InterruptHandlerRegister(d1fifo_dmaintid, usbx_function_dma_interrupt_d1fifo);
+            GIC_SetPriority(d1fifo_dmaintid, int_level);
+            GIC_EnableIRQ(d1fifo_dmaintid);
+        }
+#endif
+/*****************************************************************************/
+    }
+
+    /* reset USB module with setting tranciever and HSE=1 */
+    usbx_function_reset_module(clock_mode);
+
+    /* clear variables */
+    usbx_function_init_status();
+
+    /* select USB Function and Interrupt Enable */
+    /* Detect USB Device to attach or detach    */
+    usbx_function_InitModule(mode);
+
+    {
+        uint16_t buf;
+        buf  = USB20X.INTENB0;
+        buf |= USB_INTENB0_SOFE;
+        USB20X.INTENB0 = buf;
+    }
+}
+
+/*************************************************************************/
+USBHAL::~USBHAL(void)
+{
+    /* Disables interrupt for usb */
+    GIC_DisableIRQ( int_id );
+    /* Unregisters interrupt function and priority */
+    InterruptHandlerRegister( int_id, (uint32_t)NULL );
+
+    //usbx_en  = NULL;
+    instance = NULL;
+}
+
+/*************************************************************************/
+void USBHAL::connect(void)
+{
+    /* Activates USB0_EN */
+    //(*usbx_en) = 0;
+}
+
+
+/*************************************************************************/
+void USBHAL::disconnect(void)
+{
+    /* Deactivates USB0_EN */
+    //(*usbx_en) = 1;
+}
+
+
+/*************************************************************************/
+void USBHAL::configureDevice(void)
+{
+    /*The pipes set up in USBHAL::realiseEndpoint*/
+    /*usbx_function_clear_alt();*/      /* Alternate setting clear */
+    /*usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);*/
+}
+
+
+/*************************************************************************/
+void USBHAL::unconfigureDevice(void)
+{
+    /* The Interface would be managed by USBDevice */
+    /*usbx_function_clear_alt();*/      /* Alternate setting clear */
+    /*usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);*/
+}
+
+
+/*************************************************************************/
+void USBHAL::setAddress(uint8_t address)
+{
+    if (address <= 127) {
+        usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);      /* OK */
+    } else {
+        usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);    /* Not Spec */
+    }
+}
+
+
+/*************************************************************************/
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags)
+{
+    const struct PIPECFGREC *cfg;
+    uint16_t pipe;
+    uint16_t buf;
+
+    if ( (EP0OUT == endpoint) || (EP0IN  == endpoint) ) {
+        return true;
+    }
+
+    for (cfg = &def_pipecfg[0]; cfg->pipesel != 0; cfg++) {
+        if (cfg->endpoint == endpoint) {
+            break;
+        }
+    }
+    if (cfg->pipesel == 0) {
+        return false;
+    }
+
+    pipe = ((cfg->pipesel & USB_PIPESEL_PIPESEL) >> USB_PIPESEL_PIPESEL_SHIFT);
+
+    g_usbx_function_PipeTbl[ pipe ] = (uint16_t)(endpoint | ((cfg->pipesel & USB_FUNCTION_FIFO_USE) << 0));
+
+    /* There are maintenance routine of SHTNAK and BFRE bits
+     * in original sample program. This sample is not
+     * programmed. Do maintenance the "def_pipecfg" array if
+     * you want it. */
+
+    /* Interrupt Disable */
+    buf  = USB20X.BRDYENB;
+    buf &= (uint16_t)~g_usbx_function_bit_set[pipe];
+    USB20X.BRDYENB = buf;
+    buf  = USB20X.NRDYENB;
+    buf &= (uint16_t)~g_usbx_function_bit_set[pipe];
+    USB20X.NRDYENB = buf;
+    buf  = USB20X.BEMPENB;
+    buf &= (uint16_t)~g_usbx_function_bit_set[pipe];
+    USB20X.BEMPENB = buf;
+
+    usbx_function_set_pid_nak(pipe);
+
+    /* CurrentPIPE Clear */
+    if (RZA_IO_RegRead_16(&USB20X.CFIFOSEL, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE) == pipe) {
+        RZA_IO_RegWrite_16(&USB20X.CFIFOSEL, 0, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
+    }
+
+    if (RZA_IO_RegRead_16(&USB20X.D0FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) {
+        RZA_IO_RegWrite_16(&USB20X.D0FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE);
+    }
+
+    if (RZA_IO_RegRead_16(&USB20X.D1FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) {
+        RZA_IO_RegWrite_16(&USB20X.D1FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE);
+    }
+
+    /* PIPE Configuration */
+    USB20X.PIPESEL  = pipe;
+    USB20X.PIPECFG  = cfg->pipecfg;
+    USB20X.PIPEBUF  = cfg->pipebuf;
+    USB20X.PIPEMAXP = cfg->pipemaxp;
+    USB20X.PIPEPERI = cfg->pipeperi;
+
+    g_usbx_function_pipecfg[pipe]  = cfg->pipecfg;
+    g_usbx_function_pipebuf[pipe]  = cfg->pipebuf;
+    g_usbx_function_pipemaxp[pipe] = cfg->pipemaxp;
+    g_usbx_function_pipeperi[pipe] = cfg->pipeperi;
+
+    /* Buffer Clear */
+    usbx_function_set_sqclr(pipe);
+    usbx_function_aclrm(pipe);
+
+    /* init Global */
+    g_usbx_function_pipe_status[pipe]  = DEVDRV_USBF_PIPE_IDLE;
+    g_usbx_function_PipeDataSize[pipe] = 0;
+
+    return true;
+}
+
+
+/*************************************************************************/
+// read setup packet
+void USBHAL::EP0setup(uint8_t *buffer)
+{
+    memcpy(buffer, setup_buffer, MAX_PACKET_SIZE_EP0);
+}
+
+
+/*************************************************************************/
+void USBHAL::EP0readStage(void)
+{
+    // No implements
+}
+
+
+/*************************************************************************/
+void USBHAL::EP0read(void)
+{
+    uint8_t *buffer;
+    uint32_t size;
+
+    /* remain of last writing */
+    while (EP0_read_status != DEVDRV_USBF_WRITEEND) {
+        static uint8_t bbb[2] = { 255, 255 };
+        EP0write(&bbb[0], 0);
+    }
+
+    buffer = (uint8_t*)(&setup_buffer[4]);
+    size   = (MAX_PACKET_SIZE_EP0 / 2) - 8;
+    usbx_api_function_CtrlWriteStart(size, buffer);
+}
+
+
+/*************************************************************************/
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
+{
+    memcpy(buffer, (uint8_t*)(&setup_buffer[4]), g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0]);
+
+    return g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0];
+}
+
+
+/*************************************************************************/
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
+{
+    /* zero byte writing */
+    if ( (size == 0) && (EP0_read_status == DEVDRV_USBF_WRITEEND) ) {
+        return;
+    }
+
+    if (EP0_read_status == DEVDRV_USBF_WRITEEND) {
+        /*1st block*/
+        EP0_read_status = usbx_api_function_CtrlReadStart(size, buffer);
+    } else {
+        /* waits the last transmission */
+        /*other blocks*/
+        g_usbx_function_data_count[ USB_FUNCTION_PIPE0 ]    = size;
+        g_usbx_function_data_pointer [ USB_FUNCTION_PIPE0 ] = buffer;
+        EP0_read_status = usbx_function_write_buffer_c(USB_FUNCTION_PIPE0);
+    }
+    /*max size may be deblocking outside*/
+    if (size == MAX_PACKET_SIZE_EP0) {
+        EP0_read_status = DEVDRV_USBF_WRITING;
+    }
+}
+
+
+/*************************************************************************/
+#if 0   // No implements
+void USBHAL::EP0getWriteResult(void)
+{
+}
+#endif
+
+/*************************************************************************/
+void USBHAL::EP0stall(void)
+{
+    stallEndpoint( 0 );
+}
+
+
+/*************************************************************************/
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t max_size)
+{
+    uint32_t    pipe = EP2PIPE(endpoint);
+    uint32_t    pipe_size;
+    uint16_t    pipe_status;
+    EP_STATUS status = EP_COMPLETED;
+
+    pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
+
+    switch (pipe_status) {
+        case DEVDRV_USBF_PIPE_IDLE:
+        case DEVDRV_USBF_PIPE_WAIT:
+            usbx_api_function_set_pid_nak(pipe);
+            usbx_api_function_clear_pipe_status(pipe);
+
+            usbx_api_function_start_receive_transfer(pipe, max_size, recv_buffer);
+            break;
+
+        default:
+            status = EP_PENDING;
+            break;
+    }
+
+    return status;
+}
+
+
+/*************************************************************************/
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *buffer, uint32_t *bytes_read )
+{
+    uint32_t pipe = EP2PIPE(endpoint);
+    uint16_t pipe_status;
+    uint16_t err;
+    EP_STATUS status = EP_PENDING;
+
+
+    if (EPx_read_status != DEVDRV_USBF_PIPE_WAIT) {
+        return status;
+    }
+
+    pipe_status = usbx_api_function_check_pipe_status(pipe, bytes_read);
+    switch (pipe_status) {
+        case DEVDRV_USBF_PIPE_IDLE:
+            return EP_COMPLETED;
+
+        case DEVDRV_USBF_PIPE_DONE:
+            return EP_COMPLETED;
+
+        case DEVDRV_USBF_PIPE_WAIT:
+            break;
+
+        default:
+            return status;
+    }
+
+    /* sets the output buffer and size */
+    g_usbx_function_data_pointer[pipe] = buffer;
+
+    /* receives data from pipe */
+    err = usbx_function_read_buffer(pipe);
+    recv_error = err;
+    switch (err) {
+        case USB_FUNCTION_READEND:
+        case USB_FUNCTION_READSHRT:
+        case USB_FUNCTION_READOVER:
+            *bytes_read = g_usbx_function_PipeDataSize[pipe];
+            break;
+
+        case USB_FUNCTION_READING:
+        case DEVDRV_USBF_FIFOERROR:
+            break;
+    }
+
+    pipe_status = usbx_api_function_check_pipe_status(pipe, bytes_read);
+    switch (pipe_status) {
+        case DEVDRV_USBF_PIPE_DONE:
+            status = EP_COMPLETED;
+            break;
+
+        case DEVDRV_USBF_PIPE_IDLE:
+        case DEVDRV_USBF_PIPE_NORES:
+        case DEVDRV_USBF_PIPE_STALL:
+        case DEVDRV_USBF_FIFOERROR:
+        default:
+            break;
+    }
+
+    return status;
+}
+
+
+/*************************************************************************/
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
+{
+    uint32_t pipe = EP2PIPE(endpoint);
+    uint32_t pipe_size;
+    uint16_t pipe_status;
+    uint16_t err;
+    uint16_t count;
+    EP_STATUS status = EP_PENDING;
+
+    pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
+
+    /* waits the last transmission */
+    count = 30000;
+    while ((pipe_status == DEVDRV_USBF_PIPE_WAIT) || (pipe_status == DEVDRV_USBF_PIPE_DONE)) {
+        pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
+        if( --count == 0 ) {
+            pipe_status = DEVDRV_USBF_PIPE_STALL;
+            break;
+        }
+    }
+
+    switch (pipe_status) {
+        case DEVDRV_USBF_PIPE_IDLE:
+            err = usbx_api_function_start_send_transfer(pipe, size, data);
+
+            switch (err) {
+                    /* finish to write */
+                case DEVDRV_USBF_WRITEEND:
+                    /* finish to write, but data is short */
+                case DEVDRV_USBF_WRITESHRT:
+                    /* continue to write */
+                case DEVDRV_USBF_WRITING:
+                    /* use DMA */
+                case DEVDRV_USBF_WRITEDMA:
+                    /* error */
+                case DEVDRV_USBF_FIFOERROR:
+                    status = EP_PENDING;
+                    break;
+            }
+            break;
+
+        case DEVDRV_USBF_PIPE_WAIT:
+        case DEVDRV_USBF_PIPE_DONE:
+            status = EP_PENDING;
+            break;
+
+        case DEVDRV_USBF_PIPE_NORES:
+        case DEVDRV_USBF_PIPE_STALL:
+        default:
+            status = EP_STALLED;
+            break;
+    }
+
+    return status;
+}
+
+
+/*************************************************************************/
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
+{
+    uint32_t    pipe = EP2PIPE(endpoint);
+    uint32_t    pipe_size;
+    uint16_t    pipe_status;
+    EP_STATUS status = EP_PENDING;
+
+    pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
+
+    switch (pipe_status) {
+        case DEVDRV_USBF_PIPE_IDLE:
+            status = EP_COMPLETED;
+            break;
+
+        case DEVDRV_USBF_PIPE_WAIT:
+            status = EP_PENDING;
+            break;
+
+        case DEVDRV_USBF_PIPE_DONE:
+            usbx_function_stop_transfer(pipe);
+            status = EP_COMPLETED;
+            break;
+
+        case DEVDRV_USBF_PIPE_NORES:
+            status = EP_STALLED;
+            break;
+
+        case DEVDRV_USBF_PIPE_STALL:
+            status = EP_STALLED;
+            break;
+
+        default:
+            status = EP_PENDING;
+    }
+
+    return status;
+}
+
+
+/*************************************************************************/
+void USBHAL::stallEndpoint(uint8_t endpoint)
+{
+    uint32_t pipe = EP2PIPE(endpoint);
+
+    usbx_function_clear_pid_stall(pipe);
+}
+
+
+/*************************************************************************/
+void USBHAL::unstallEndpoint(uint8_t endpoint)
+{
+    uint32_t pipe = EP2PIPE(endpoint);
+
+    usbx_function_set_pid_stall( pipe );
+}
+
+
+/*************************************************************************/
+bool USBHAL::getEndpointStallState(uint8_t endpoint)
+{
+    // No implemens
+    return false;
+}
+
+
+/*************************************************************************/
+#if 0   // No implements
+void USBHAL::remoteWakeup(void)
+{
+}
+#endif
+
+/*************************************************************************/
+void USBHAL::_usbisr(void)
+{
+    instance->usbisr();
+}
+
+
+/*************************************************************************/
+void USBHAL::usbisr(void)
+{
+    uint16_t            int_sts0;
+    uint16_t            int_sts1;
+    uint16_t            int_sts2;
+    uint16_t            int_sts3;
+    uint16_t            int_enb0;
+    uint16_t            int_enb2;
+    uint16_t            int_enb3;
+    uint16_t            int_enb4;
+    volatile uint16_t   dumy_sts;
+
+
+    int_sts0 = USB20X.INTSTS0;
+
+    if (!(int_sts0 & (
+                USB_FUNCTION_BITVBINT |
+                USB_FUNCTION_BITRESM  |
+                USB_FUNCTION_BITSOFR  |
+                USB_FUNCTION_BITDVST  |
+                USB_FUNCTION_BITCTRT  |
+                USB_FUNCTION_BITBEMP  |
+                USB_FUNCTION_BITNRDY  |
+                USB_FUNCTION_BITBRDY ))) {
+        return;
+    }
+
+    int_sts1 = USB20X.BRDYSTS;
+    int_sts2 = USB20X.NRDYSTS;
+    int_sts3 = USB20X.BEMPSTS;
+    int_enb0 = USB20X.INTENB0;
+    int_enb2 = USB20X.BRDYENB;
+    int_enb3 = USB20X.NRDYENB;
+    int_enb4 = USB20X.BEMPENB;
+
+    if ((int_sts0 & USB_FUNCTION_BITRESM) &&
+            (int_enb0 & USB_FUNCTION_BITRSME)) {
+        USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITRESM;
+        RZA_IO_RegWrite_16(&USB20X.INTENB0, 0, USB_INTENB0_RSME_SHIFT, USB_INTENB0_RSME);
+        /*usbx_function_USB_FUNCTION_Resume();*/
+        suspendStateChanged(1);
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITVBINT) &&
+        (int_enb0 & USB_FUNCTION_BITVBSE)) {
+        USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVBINT;
+
+        if (usbx_function_CheckVBUStaus() == DEVDRV_USBF_ON) {
+            usbx_function_USB_FUNCTION_Attach();
+        } else {
+            usbx_function_USB_FUNCTION_Detach();
+        }
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITSOFR) &&
+        (int_enb0 & USB_FUNCTION_BITSOFE)) {
+        USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITSOFR;
+        SOF((USB20X.FRMNUM & USB_FRMNUM_FRNM) >> USB_FRMNUM_FRNM_SHIFT);
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITDVST) &&
+        (int_enb0 & USB_FUNCTION_BITDVSE)) {
+        USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITDVST;
+        switch (int_sts0 & USB_FUNCTION_BITDVSQ) {
+            case USB_FUNCTION_DS_POWR:
+                break;
+
+            case USB_FUNCTION_DS_DFLT:
+                /*****************************************************************************
+                 * Function Name: usbx_function_USB_FUNCTION_BusReset
+                 * Description  : This function is executed when the USB device is transitioned
+                 *              : to POWERD_STATE. Sets the device descriptor according to the
+                 *              : connection speed determined by the USB reset hand shake.
+                 * Arguments    : none
+                 * Return Value : none
+                 *****************************************************************************/
+                usbx_function_init_status();            /* memory clear */
+
+#if 0
+                /* You would program those steps in USBCallback_busReset
+                 * if the system need the comment out steps.
+                 */
+
+                if (usbx_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) {
+                    /* Device Descriptor reset */
+                    usbx_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED);
+                } else {
+                    /* Device Descriptor reset */
+                    usbx_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED);
+                }
+#endif
+                /* Default Control PIPE reset */
+                /*****************************************************************************
+                 * Function Name: usbx_function_ResetDCP
+                 * Description  : Initializes the default control pipe(DCP).
+                 * Outline      : Reset default control pipe
+                 * Arguments    : none
+                 * Return Value : none
+                 *****************************************************************************/
+                USB20X.DCPCFG  = 0;
+                USB20X.DCPMAXP = 64;    /*TODO: This value is copied from sample*/
+
+                USB20X.CFIFOSEL  = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+                USB20X.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+                USB20X.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
+
+                busReset();
+                break;
+
+            case USB_FUNCTION_DS_ADDS:
+                break;
+
+            case USB_FUNCTION_DS_CNFG:
+                break;
+
+            case USB_FUNCTION_DS_SPD_POWR:
+            case USB_FUNCTION_DS_SPD_DFLT:
+            case USB_FUNCTION_DS_SPD_ADDR:
+            case USB_FUNCTION_DS_SPD_CNFG:
+                suspendStateChanged(0);
+                /*usbx_function_USB_FUNCTION_Suspend();*/
+                break;
+
+            default:
+                break;
+        }
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITBEMP) &&
+        (int_enb0 & USB_FUNCTION_BITBEMP) &&
+        ((int_sts3 & int_enb4) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) {
+        /* ==== BEMP PIPE0 ==== */
+        usbx_function_BEMPInterruptPIPE0(int_sts3, int_enb4, this, &USBHAL::EP0in);
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITBRDY) &&
+        (int_enb0 & USB_FUNCTION_BITBRDY) &&
+        ((int_sts1 & int_enb2) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) {
+        /* ==== BRDY PIPE0 ==== */
+        usbx_function_BRDYInterruptPIPE0(int_sts1, int_enb2, this, &USBHAL::EP0out);
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITNRDY) &&
+        (int_enb0 & USB_FUNCTION_BITNRDY) &&
+        ((int_sts2 & int_enb3) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) {
+        /* ==== NRDY PIPE0 ==== */
+        usbx_function_NRDYInterruptPIPE0(int_sts2, int_enb3, this, NULL);
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITCTRT) && (int_enb0 & USB_FUNCTION_BITCTRE)) {
+        int_sts0 = USB20X.INTSTS0;
+        USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITCTRT;
+
+        if (((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) ||
+                ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) ||
+                ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND)) {
+
+            /* remake EP0 into buffer */
+            usbx_function_save_request();
+            if ((USB20X.INTSTS0 & USB_FUNCTION_BITVALID) && (
+                        ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) ||
+                        ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) ||
+                        ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND))) {
+                /* New SETUP token received */
+                /* Three dummy reads for cleearing interrupt requests */
+                dumy_sts = USB20X.INTSTS0;
+                dumy_sts = USB20X.INTSTS0;
+                dumy_sts = USB20X.INTSTS0;
+                return;
+            }
+        }
+
+        switch (int_sts0 & USB_FUNCTION_BITCTSQ) {
+            case USB_FUNCTION_CS_IDST:
+                if (g_usbx_function_TestModeFlag == DEVDRV_USBF_YES) {
+                    /* ==== Test Mode ==== */
+                    usbx_function_USB_FUNCTION_TestMode();
+                }
+                /* Needs not procedure in this state */
+                break;
+
+            case USB_FUNCTION_CS_RDDS:
+                /* Reads a setup packet */
+                EP0setupCallback();
+                break;
+
+            case USB_FUNCTION_CS_WRDS:
+                /* Original code was the SetDescriptor was called */
+                EP0setupCallback();
+                break;
+
+            case USB_FUNCTION_CS_WRND:
+                EP0setupCallback();
+
+                /*The EP0setupCallback should finish in successful */
+                usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);
+
+                RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
+                break;
+
+            case USB_FUNCTION_CS_RDSS:
+                RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
+                break;
+
+            case USB_FUNCTION_CS_WRSS:
+                RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
+                break;
+
+            case USB_FUNCTION_CS_SQER:
+                usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
+                break;
+
+            default:
+                usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
+                break;
+        }
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITBEMP) &&
+        (int_enb0 & USB_FUNCTION_BITBEMP) &&
+        (int_sts3 & int_enb4) ) {
+        /* ==== BEMP PIPEx ==== */
+        usbx_function_BEMPInterrupt(int_sts3, int_enb4, this, epCallback);
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITBRDY) &&
+        (int_enb0 & USB_FUNCTION_BITBRDY) &&
+        (int_sts1 & int_enb2) ) {
+        /* ==== BRDY PIPEx ==== */
+        usbx_function_BRDYInterrupt(int_sts1, int_enb2, this, epCallback);
+    } else if (
+        (int_sts0 & USB_FUNCTION_BITNRDY) &&
+        (int_enb0 & USB_FUNCTION_BITNRDY) &&
+        (int_sts2 & int_enb3)) {
+        /* ==== NRDY PIPEx ==== */
+        usbx_function_NRDYInterrupt(int_sts2, int_enb3, this, epCallback);
+    } else {
+        /* Do Nothing */
+    }
+
+    /* Three dummy reads for cleearing interrupt requests */
+    dumy_sts = USB20X.INTSTS0;
+    dumy_sts = USB20X.INTSTS1;
+}
+
+/*************************************************************************/
+#endif
+/*************************************************************************/
+/*EOF*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBHAL_STM32F4.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,416 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(TARGET_STM32F4)
+
+#include "USBHAL.h"
+#include "USBRegs_STM32.h"
+#include "pinmap.h"
+
+USBHAL * USBHAL::instance;
+
+static volatile int epComplete = 0;
+
+static uint32_t bufferEnd = 0;
+static const uint32_t rxFifoSize = 512;
+static uint32_t rxFifoCount = 0;
+
+static uint32_t setupBuffer[MAX_PACKET_SIZE_EP0 >> 2];
+
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
+    return 0;
+}
+
+USBHAL::USBHAL(void) {
+    NVIC_DisableIRQ(OTG_FS_IRQn);
+    epCallback[0] = &USBHAL::EP1_OUT_callback;
+    epCallback[1] = &USBHAL::EP1_IN_callback;
+    epCallback[2] = &USBHAL::EP2_OUT_callback;
+    epCallback[3] = &USBHAL::EP2_IN_callback;
+    epCallback[4] = &USBHAL::EP3_OUT_callback;
+    epCallback[5] = &USBHAL::EP3_IN_callback;
+
+    // Enable power and clocking
+    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
+
+#if defined(TARGET_STM32F407VG) || defined(TARGET_STM32F401RE) || defined(TARGET_STM32F411RE) || defined(TARGET_STM32F429ZI)
+    pin_function(PA_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
+    pin_function(PA_9, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLDOWN, GPIO_AF10_OTG_FS));
+    pin_function(PA_10, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS));
+    pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
+    pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
+#else
+    pin_function(PA_8, STM_PIN_DATA(2, 10));
+    pin_function(PA_9, STM_PIN_DATA(0, 0));
+    pin_function(PA_10, STM_PIN_DATA(2, 10));
+    pin_function(PA_11, STM_PIN_DATA(2, 10));
+    pin_function(PA_12, STM_PIN_DATA(2, 10));
+
+    // Set ID pin to open drain with pull-up resistor
+    pin_mode(PA_10, OpenDrain);
+    GPIOA->PUPDR &= ~(0x3 << 20);
+    GPIOA->PUPDR |= 1 << 20;
+
+    // Set VBUS pin to open drain
+    pin_mode(PA_9, OpenDrain);
+#endif
+
+    RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
+
+    // Enable interrupts
+    OTG_FS->GREGS.GAHBCFG |= (1 << 0);
+
+    // Turnaround time to maximum value - too small causes packet loss
+    OTG_FS->GREGS.GUSBCFG |= (0xF << 10);
+
+    // Unmask global interrupts
+    OTG_FS->GREGS.GINTMSK |= (1 << 3) | // SOF
+                             (1 << 4) | // RX FIFO not empty
+                             (1 << 12); // USB reset
+
+    OTG_FS->DREGS.DCFG |= (0x3 << 0) | // Full speed
+                          (1 << 2); // Non-zero-length status OUT handshake
+
+    OTG_FS->GREGS.GCCFG |= (1 << 19) | // Enable VBUS sensing
+                           (1 << 16); // Power Up
+
+    instance = this;
+    NVIC_SetVector(OTG_FS_IRQn, (uint32_t)&_usbisr);
+    NVIC_SetPriority(OTG_FS_IRQn, 1);
+}
+
+USBHAL::~USBHAL(void) {
+}
+
+void USBHAL::connect(void) {
+    NVIC_EnableIRQ(OTG_FS_IRQn);
+}
+
+void USBHAL::disconnect(void) {
+    NVIC_DisableIRQ(OTG_FS_IRQn);
+}
+
+void USBHAL::configureDevice(void) {
+    // Not needed
+}
+
+void USBHAL::unconfigureDevice(void) {
+    // Not needed
+}
+
+void USBHAL::setAddress(uint8_t address) {
+    OTG_FS->DREGS.DCFG |= (address << 4);
+    EP0write(0, 0);
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket,
+                             uint32_t flags) {
+    uint32_t epIndex = endpoint >> 1;
+
+    uint32_t type;
+    switch (endpoint) {
+        case EP0IN:
+        case EP0OUT:
+            type = 0;
+            break;
+        case EPISO_IN:
+        case EPISO_OUT:
+            type = 1;
+        case EPBULK_IN:
+        case EPBULK_OUT:
+            type = 2;
+            break;
+        case EPINT_IN:
+        case EPINT_OUT:
+            type = 3;
+            break;
+    }
+
+    // Generic in or out EP controls
+    uint32_t control = (maxPacket << 0) | // Packet size
+                       (1 << 15) | // Active endpoint
+                       (type << 18); // Endpoint type
+
+    if (endpoint & 0x1) { // In Endpoint
+        // Set up the Tx FIFO
+        if (endpoint == EP0IN) {
+            OTG_FS->GREGS.DIEPTXF0_HNPTXFSIZ = ((maxPacket >> 2) << 16) |
+                                               (bufferEnd << 0);
+        }
+        else {
+            OTG_FS->GREGS.DIEPTXF[epIndex - 1] = ((maxPacket >> 2) << 16) |
+                                                 (bufferEnd << 0);
+        }
+        bufferEnd += maxPacket >> 2;
+
+        // Set the In EP specific control settings
+        if (endpoint != EP0IN) {
+            control |= (1 << 28); // SD0PID
+        }
+
+        control |= (epIndex << 22) | // TxFIFO index
+                   (1 << 27); // SNAK
+        OTG_FS->INEP_REGS[epIndex].DIEPCTL = control;
+
+        // Unmask the interrupt
+        OTG_FS->DREGS.DAINTMSK |= (1 << epIndex);
+    }
+    else { // Out endpoint
+        // Set the out EP specific control settings
+        control |= (1 << 26); // CNAK
+        OTG_FS->OUTEP_REGS[epIndex].DOEPCTL = control;
+
+        // Unmask the interrupt
+        OTG_FS->DREGS.DAINTMSK |= (1 << (epIndex + 16));
+    }
+    return true;
+}
+
+// read setup packet
+void USBHAL::EP0setup(uint8_t *buffer) {
+    memcpy(buffer, setupBuffer, MAX_PACKET_SIZE_EP0);
+}
+
+void USBHAL::EP0readStage(void) {
+}
+
+void USBHAL::EP0read(void) {
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
+    uint32_t* buffer32 = (uint32_t *) buffer;
+    uint32_t length = rxFifoCount;
+    for (uint32_t i = 0; i < length; i += 4) {
+        buffer32[i >> 2] = OTG_FS->FIFO[0][0];
+    }
+
+    rxFifoCount = 0;
+    return length;
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
+    endpointWrite(0, buffer, size);
+}
+
+void USBHAL::EP0getWriteResult(void) {
+}
+
+void USBHAL::EP0stall(void) {
+    // If we stall the out endpoint here then we have problems transferring
+    // and setup requests after the (stalled) get device qualifier requests.
+    // TODO: Find out if this is correct behavior, or whether we are doing
+    // something else wrong
+    stallEndpoint(EP0IN);
+//    stallEndpoint(EP0OUT);
+}
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
+    uint32_t epIndex = endpoint >> 1;
+    uint32_t size = (1 << 19) | // 1 packet
+                    (maximumSize << 0); // Packet size
+//    if (endpoint == EP0OUT) {
+        size |= (1 << 29); // 1 setup packet
+//    }
+    OTG_FS->OUTEP_REGS[epIndex].DOEPTSIZ = size;
+    OTG_FS->OUTEP_REGS[epIndex].DOEPCTL |= (1 << 31) | // Enable endpoint
+                                           (1 << 26); // Clear NAK
+
+    epComplete &= ~(1 << endpoint);
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
+    if (!(epComplete & (1 << endpoint))) {
+        return EP_PENDING;
+    }
+
+    uint32_t* buffer32 = (uint32_t *) buffer;
+    uint32_t length = rxFifoCount;
+    for (uint32_t i = 0; i < length; i += 4) {
+        buffer32[i >> 2] = OTG_FS->FIFO[endpoint >> 1][0];
+    }
+    rxFifoCount = 0;
+    *bytesRead = length;
+    return EP_COMPLETED;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
+    uint32_t epIndex = endpoint >> 1;
+    OTG_FS->INEP_REGS[epIndex].DIEPTSIZ = (1 << 19) | // 1 packet
+                                          (size << 0); // Size of packet
+    OTG_FS->INEP_REGS[epIndex].DIEPCTL |= (1 << 31) | // Enable endpoint
+                                          (1 << 26); // CNAK
+    OTG_FS->DREGS.DIEPEMPMSK = (1 << epIndex);
+
+    while ((OTG_FS->INEP_REGS[epIndex].DTXFSTS & 0XFFFF) < ((size + 3) >> 2));
+
+    for (uint32_t i=0; i<(size + 3) >> 2; i++, data+=4) {
+        OTG_FS->FIFO[epIndex][0] = *(uint32_t *)data;
+    }
+
+    epComplete &= ~(1 << endpoint);
+
+    return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
+    if (epComplete & (1 << endpoint)) {
+        epComplete &= ~(1 << endpoint);
+        return EP_COMPLETED;
+    }
+
+    return EP_PENDING;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint) {
+    if (endpoint & 0x1) { // In EP
+        OTG_FS->INEP_REGS[endpoint >> 1].DIEPCTL |= (1 << 30) | // Disable
+                                                    (1 << 21); // Stall
+    }
+    else {  // Out EP
+        OTG_FS->DREGS.DCTL |= (1 << 9); // Set global out NAK
+        OTG_FS->OUTEP_REGS[endpoint >> 1].DOEPCTL |= (1 << 30) | // Disable
+                                                     (1 << 21); // Stall
+    }
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint) {
+
+}
+
+bool USBHAL::getEndpointStallState(uint8_t endpoint) {
+    return false;
+}
+
+void USBHAL::remoteWakeup(void) {
+}
+
+
+void USBHAL::_usbisr(void) {
+    instance->usbisr();
+}
+
+
+void USBHAL::usbisr(void) {
+    if (OTG_FS->GREGS.GINTSTS & (1 << 11)) { // USB Suspend
+        suspendStateChanged(1);
+    };
+
+    if (OTG_FS->GREGS.GINTSTS & (1 << 12)) { // USB Reset
+        suspendStateChanged(0);
+
+        // Set SNAK bits
+        OTG_FS->OUTEP_REGS[0].DOEPCTL |= (1 << 27);
+        OTG_FS->OUTEP_REGS[1].DOEPCTL |= (1 << 27);
+        OTG_FS->OUTEP_REGS[2].DOEPCTL |= (1 << 27);
+        OTG_FS->OUTEP_REGS[3].DOEPCTL |= (1 << 27);
+
+        OTG_FS->DREGS.DIEPMSK = (1 << 0);
+
+        bufferEnd = 0;
+
+        // Set the receive FIFO size
+        OTG_FS->GREGS.GRXFSIZ = rxFifoSize >> 2;
+        bufferEnd += rxFifoSize >> 2;
+
+        // Create the endpoints, and wait for setup packets on out EP0
+        realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
+        realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
+        endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0);
+
+        OTG_FS->GREGS.GINTSTS = (1 << 12);
+    }
+
+    if (OTG_FS->GREGS.GINTSTS & (1 << 4)) { // RX FIFO not empty
+        uint32_t status = OTG_FS->GREGS.GRXSTSP;
+
+        uint32_t endpoint = (status & 0xF) << 1;
+        uint32_t length = (status >> 4) & 0x7FF;
+        uint32_t type = (status >> 17) & 0xF;
+
+        rxFifoCount = length;
+
+        if (type == 0x6) {
+            // Setup packet
+            for (uint32_t i=0; i<length; i+=4) {
+                setupBuffer[i >> 2] = OTG_FS->FIFO[0][i >> 2];
+            }
+            rxFifoCount = 0;
+        }
+
+        if (type == 0x4) {
+            // Setup complete
+            EP0setupCallback();
+            endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0);
+        }
+
+        if (type == 0x2) {
+            // Out packet
+            if (endpoint == EP0OUT) {
+                EP0out();
+            }
+            else {
+                epComplete |= (1 << endpoint);
+                if ((instance->*(epCallback[endpoint - 2]))()) {
+                    epComplete &= (1 << endpoint);
+                }
+            }
+        }
+
+        for (uint32_t i=0; i<rxFifoCount; i+=4) {
+            (void) OTG_FS->FIFO[0][0];
+        }
+        OTG_FS->GREGS.GINTSTS = (1 << 4);
+    }
+
+    if (OTG_FS->GREGS.GINTSTS & (1 << 18)) { // In endpoint interrupt
+        // Loop through the in endpoints
+        for (uint32_t i=0; i<4; i++) {
+            if (OTG_FS->DREGS.DAINT & (1 << i)) { // Interrupt is on endpoint
+
+                if (OTG_FS->INEP_REGS[i].DIEPINT & (1 << 7)) {// Tx FIFO empty
+                    // If the Tx FIFO is empty on EP0 we need to send a further
+                    // packet, so call EP0in()
+                    if (i == 0) {
+                        EP0in();
+                    }
+                    // Clear the interrupt
+                    OTG_FS->INEP_REGS[i].DIEPINT = (1 << 7);
+                    // Stop firing Tx empty interrupts
+                    // Will get turned on again if another write is called
+                    OTG_FS->DREGS.DIEPEMPMSK &= ~(1 << i);
+                }
+
+                // If the transfer is complete
+                if (OTG_FS->INEP_REGS[i].DIEPINT & (1 << 0)) { // Tx Complete
+                    epComplete |= (1 << (1 + (i << 1)));
+                    OTG_FS->INEP_REGS[i].DIEPINT = (1 << 0);
+                }
+            }
+        }
+        OTG_FS->GREGS.GINTSTS = (1 << 18);
+    }
+
+    if (OTG_FS->GREGS.GINTSTS & (1 << 3)) { // Start of frame
+        SOF((OTG_FS->GREGS.GRXSTSR >> 17) & 0xF);
+        OTG_FS->GREGS.GINTSTS = (1 << 3);
+    }
+}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBDevice/USBRegs_STM32.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,149 @@
+/**
+  ******************************************************************************
+  * @file    usb_regs.h
+  * @author  MCD Application Team
+  * @version V2.1.0
+  * @date    19-March-2012
+  * @brief   hardware registers
+  ******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
+  *
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+  * You may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at:
+  *
+  *        http://www.st.com/software_license_agreement_liberty_v2
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  *
+  ******************************************************************************
+  */
+
+#ifndef __USB_OTG_REGS_H__
+#define __USB_OTG_REGS_H__
+
+typedef struct //000h
+{
+  __IO uint32_t GOTGCTL;      /* USB_OTG Control and Status Register    000h*/
+  __IO uint32_t GOTGINT;      /* USB_OTG Interrupt Register             004h*/
+  __IO uint32_t GAHBCFG;      /* Core AHB Configuration Register    008h*/
+  __IO uint32_t GUSBCFG;      /* Core USB Configuration Register    00Ch*/
+  __IO uint32_t GRSTCTL;      /* Core Reset Register                010h*/
+  __IO uint32_t GINTSTS;      /* Core Interrupt Register            014h*/
+  __IO uint32_t GINTMSK;      /* Core Interrupt Mask Register       018h*/
+  __IO uint32_t GRXSTSR;      /* Receive Sts Q Read Register        01Ch*/
+  __IO uint32_t GRXSTSP;      /* Receive Sts Q Read & POP Register  020h*/
+  __IO uint32_t GRXFSIZ;      /* Receive FIFO Size Register         024h*/
+  __IO uint32_t DIEPTXF0_HNPTXFSIZ;   /* EP0 / Non Periodic Tx FIFO Size Register 028h*/
+  __IO uint32_t HNPTXSTS;     /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/
+  uint32_t Reserved30[2];     /* Reserved                           030h*/
+  __IO uint32_t GCCFG;        /* General Purpose IO Register        038h*/
+  __IO uint32_t CID;          /* User ID Register                   03Ch*/
+  uint32_t  Reserved40[48];   /* Reserved                      040h-0FFh*/
+  __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg     100h*/
+  __IO uint32_t DIEPTXF[3];/* dev Periodic Transmit FIFO */
+}
+USB_OTG_GREGS;
+
+typedef struct // 800h
+{
+  __IO uint32_t DCFG;         /* dev Configuration Register   800h*/
+  __IO uint32_t DCTL;         /* dev Control Register         804h*/
+  __IO uint32_t DSTS;         /* dev Status Register (RO)     808h*/
+  uint32_t Reserved0C;           /* Reserved                     80Ch*/
+  __IO uint32_t DIEPMSK;   /* dev IN Endpoint Mask         810h*/
+  __IO uint32_t DOEPMSK;  /* dev OUT Endpoint Mask        814h*/
+  __IO uint32_t DAINT;     /* dev All Endpoints Itr Reg    818h*/
+  __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask   81Ch*/
+  uint32_t  Reserved20;          /* Reserved                     820h*/
+  uint32_t Reserved9;       /* Reserved                     824h*/
+  __IO uint32_t DVBUSDIS;    /* dev VBUS discharge Register  828h*/
+  __IO uint32_t DVBUSPULSE;  /* dev VBUS Pulse Register      82Ch*/
+  __IO uint32_t DTHRCTL;     /* dev thr                      830h*/
+  __IO uint32_t DIEPEMPMSK; /* dev empty msk             834h*/
+}
+USB_OTG_DREGS;
+
+typedef struct
+{
+  __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/
+  uint32_t Reserved04;             /* Reserved                       900h + (ep_num * 20h) + 04h*/
+  __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg     900h + (ep_num * 20h) + 08h*/
+  uint32_t Reserved0C;             /* Reserved                       900h + (ep_num * 20h) + 0Ch*/
+  __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size   900h + (ep_num * 20h) + 10h*/
+  uint32_t Reserved14;
+  __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/
+  uint32_t Reserved1C;             /* Reserved  900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/
+}
+USB_OTG_INEPREGS;
+
+typedef struct
+{
+  __IO uint32_t DOEPCTL;       /* dev OUT Endpoint Control Reg  B00h + (ep_num * 20h) + 00h*/
+  uint32_t Reserved04;         /* Reserved                      B00h + (ep_num * 20h) + 04h*/
+  __IO uint32_t DOEPINT;       /* dev OUT Endpoint Itr Reg      B00h + (ep_num * 20h) + 08h*/
+  uint32_t Reserved0C;         /* Reserved                      B00h + (ep_num * 20h) + 0Ch*/
+  __IO uint32_t DOEPTSIZ;      /* dev OUT Endpoint Txfer Size   B00h + (ep_num * 20h) + 10h*/
+  uint32_t Reserved14[3];
+}
+USB_OTG_OUTEPREGS;
+
+typedef struct
+{
+  __IO uint32_t HCFG;             /* Host Configuration Register    400h*/
+  __IO uint32_t HFIR;      /* Host Frame Interval Register   404h*/
+  __IO uint32_t HFNUM;         /* Host Frame Nbr/Frame Remaining 408h*/
+  uint32_t Reserved40C;                   /* Reserved                       40Ch*/
+  __IO uint32_t HPTXSTS;   /* Host Periodic Tx FIFO/ Queue Status 410h*/
+  __IO uint32_t HAINT;   /* Host All Channels Interrupt Register 414h*/
+  __IO uint32_t HAINTMSK;   /* Host All Channels Interrupt Mask 418h*/
+}
+USB_OTG_HREGS;
+
+typedef struct
+{
+  __IO uint32_t HCCHAR;
+  __IO uint32_t HCSPLT;
+  __IO uint32_t HCINT;
+  __IO uint32_t HCINTMSK;
+  __IO uint32_t HCTSIZ;
+  uint32_t Reserved[3];
+}
+USB_OTG_HC_REGS;
+
+typedef struct
+{
+    USB_OTG_GREGS         GREGS;
+    uint32_t RESERVED0[188];
+    USB_OTG_HREGS         HREGS;
+    uint32_t RESERVED1[9];
+    __IO uint32_t         HPRT;
+    uint32_t RESERVED2[47];
+    USB_OTG_HC_REGS       HC_REGS[8];
+    uint32_t RESERVED3[128];
+    USB_OTG_DREGS         DREGS;
+    uint32_t RESERVED4[50];
+    USB_OTG_INEPREGS      INEP_REGS[4];
+    uint32_t RESERVED5[96];
+    USB_OTG_OUTEPREGS     OUTEP_REGS[4];
+    uint32_t RESERVED6[160];
+    __IO uint32_t         PCGCCTL;
+    uint32_t RESERVED7[127];
+    __IO uint32_t         FIFO[4][1024];
+}
+USB_OTG_CORE_REGS;
+
+
+#define OTG_FS_BASE (AHB2PERIPH_BASE + 0x0000)
+#define OTG_FS ((USB_OTG_CORE_REGS *) OTG_FS_BASE)
+
+#endif //__USB_OTG_REGS_H__
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBHID.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,276 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBHAL.h"
+#include "USBHID.h"
+
+
+USBHID::USBHID(uint8_t output_report_length, uint8_t input_report_length, uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect): USBDevice(vendor_id, product_id, product_release)
+{
+    output_length = output_report_length;
+    input_length = input_report_length;
+    if(connect) {
+        USBDevice::connect();
+    }
+}
+
+
+bool USBHID::send(HID_REPORT *report)
+{
+    return write(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
+}
+
+bool USBHID::sendNB(HID_REPORT *report)
+{
+    return writeNB(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
+}
+
+
+bool USBHID::read(HID_REPORT *report)
+{
+    uint32_t bytesRead = 0;
+    bool result;
+    result = USBDevice::readEP(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
+    if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
+        return false;
+    report->length = bytesRead;
+    return result;
+}
+
+
+bool USBHID::readNB(HID_REPORT *report)
+{
+    uint32_t bytesRead = 0;
+    bool result;
+    result = USBDevice::readEP_NB(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
+    // if readEP_NB did not succeed, does not issue a readStart
+    if (!result)
+        return false;
+    report->length = bytesRead;
+    if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
+        return false;
+    return result;
+}
+
+
+uint16_t USBHID::reportDescLength() {
+    reportDesc();
+    return reportLength;
+}
+
+
+
+//
+//  Route callbacks from lower layers to class(es)
+//
+
+
+// Called in ISR context
+// Called by USBDevice on Endpoint0 request
+// This is used to handle extensions to standard requests
+// and class specific requests
+// Return true if class handles this request
+bool USBHID::USBCallback_request() {
+    bool success = false;
+    CONTROL_TRANSFER * transfer = getTransferPtr();
+    uint8_t *hidDescriptor;
+
+    // Process additional standard requests
+
+    if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
+    {
+        switch (transfer->setup.bRequest)
+        {
+            case GET_DESCRIPTOR:
+                switch (DESCRIPTOR_TYPE(transfer->setup.wValue))
+                {
+                    case REPORT_DESCRIPTOR:
+                        if ((reportDesc() != NULL) \
+                            && (reportDescLength() != 0))
+                        {
+                            transfer->remaining = reportDescLength();
+                            transfer->ptr = reportDesc();
+                            transfer->direction = DEVICE_TO_HOST;
+                            success = true;
+                        }
+                        break;
+                    case HID_DESCRIPTOR:
+                            // Find the HID descriptor, after the configuration descriptor
+                            hidDescriptor = findDescriptor(HID_DESCRIPTOR);
+                            if (hidDescriptor != NULL)
+                            {
+                                transfer->remaining = HID_DESCRIPTOR_LENGTH;
+                                transfer->ptr = hidDescriptor;
+                                transfer->direction = DEVICE_TO_HOST;
+                                success = true;
+                            }
+                            break;
+
+                    default:
+                        break;
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    // Process class-specific requests
+
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
+    {
+        switch (transfer->setup.bRequest)
+        {
+             case SET_REPORT:
+                // First byte will be used for report ID
+                outputReport.data[0] = transfer->setup.wValue & 0xff;
+                outputReport.length = transfer->setup.wLength + 1;
+
+                transfer->remaining = sizeof(outputReport.data) - 1;
+                transfer->ptr = &outputReport.data[1];
+                transfer->direction = HOST_TO_DEVICE;
+                transfer->notify = true;
+                success = true;
+            default:
+                break;
+        }
+    }
+
+    return success;
+}
+
+
+#define DEFAULT_CONFIGURATION (1)
+
+
+// Called in ISR context
+// Set configuration. Return false if the
+// configuration is not supported
+bool USBHID::USBCallback_setConfiguration(uint8_t configuration) {
+    if (configuration != DEFAULT_CONFIGURATION) {
+        return false;
+    }
+
+    // Configure endpoints > 0
+    addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
+    addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
+
+    // We activate the endpoint to be able to recceive data
+    readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
+    return true;
+}
+
+
+uint8_t * USBHID::stringIinterfaceDesc() {
+    static uint8_t stringIinterfaceDescriptor[] = {
+        0x08,               //bLength
+        STRING_DESCRIPTOR,  //bDescriptorType 0x03
+        'H',0,'I',0,'D',0,  //bString iInterface - HID
+    };
+    return stringIinterfaceDescriptor;
+}
+
+uint8_t * USBHID::stringIproductDesc() {
+    static uint8_t stringIproductDescriptor[] = {
+        0x16,                                                       //bLength
+        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
+        'H',0,'I',0,'D',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 //bString iProduct - HID device
+    };
+    return stringIproductDescriptor;
+}
+
+
+
+uint8_t * USBHID::reportDesc() {
+    static uint8_t reportDescriptor[] = {
+        0x06, LSB(0xFFAB), MSB(0xFFAB),
+        0x0A, LSB(0x0200), MSB(0x0200),
+        0xA1, 0x01,         // Collection 0x01
+        0x75, 0x08,         // report size = 8 bits
+        0x15, 0x00,         // logical minimum = 0
+        0x26, 0xFF, 0x00,   // logical maximum = 255
+        0x95, input_length, // report count
+        0x09, 0x01,         // usage
+        0x81, 0x02,         // Input (array)
+        0x95, output_length,// report count
+        0x09, 0x02,         // usage
+        0x91, 0x02,         // Output (array)
+        0xC0                // end collection
+
+    };
+    reportLength = sizeof(reportDescriptor);
+    return reportDescriptor;
+}
+
+#define DEFAULT_CONFIGURATION (1)
+#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
+                               + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (1 * HID_DESCRIPTOR_LENGTH) \
+                               + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
+
+uint8_t * USBHID::configurationDesc() {
+    static uint8_t configurationDescriptor[] = {
+        CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
+        CONFIGURATION_DESCRIPTOR,       // bDescriptorType
+        LSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (LSB)
+        MSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (MSB)
+        0x01,                           // bNumInterfaces
+        DEFAULT_CONFIGURATION,          // bConfigurationValue
+        0x00,                           // iConfiguration
+        C_RESERVED | C_SELF_POWERED,    // bmAttributes
+        C_POWER(0),                     // bMaxPower
+
+        INTERFACE_DESCRIPTOR_LENGTH,    // bLength
+        INTERFACE_DESCRIPTOR,           // bDescriptorType
+        0x00,                           // bInterfaceNumber
+        0x00,                           // bAlternateSetting
+        0x02,                           // bNumEndpoints
+        HID_CLASS,                      // bInterfaceClass
+        HID_SUBCLASS_NONE,              // bInterfaceSubClass
+        HID_PROTOCOL_NONE,              // bInterfaceProtocol
+        0x00,                           // iInterface
+
+        HID_DESCRIPTOR_LENGTH,          // bLength
+        HID_DESCRIPTOR,                 // bDescriptorType
+        LSB(HID_VERSION_1_11),          // bcdHID (LSB)
+        MSB(HID_VERSION_1_11),          // bcdHID (MSB)
+        0x00,                           // bCountryCode
+        0x01,                           // bNumDescriptors
+        REPORT_DESCRIPTOR,              // bDescriptorType
+        (uint8_t)(LSB(this->reportDescLength())),  // wDescriptorLength (LSB)
+        (uint8_t)(MSB(this->reportDescLength())),  // wDescriptorLength (MSB)
+
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EPINT_IN),          // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        1,                             // bInterval (milliseconds)
+
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EPINT_OUT),          // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        1,                             // bInterval (milliseconds)
+    };
+    return configurationDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBHID.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,172 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USB_HID_H
+#define USB_HID_H
+
+/* These headers are included for child class. */
+#include "USBEndpoints.h"
+#include "USBDescriptor.h"
+#include "USBDevice_Types.h"
+
+#include "USBHID_Types.h"
+#include "USBDevice.h"
+
+
+/**
+ * USBHID example
+ * @code
+ * #include "mbed.h"
+ * #include "USBHID.h"
+ *
+ * USBHID hid;
+ * HID_REPORT recv;
+ * BusOut leds(LED1,LED2,LED3,LED4);
+ *
+ * int main(void) {
+ *    while (1) {
+ *        hid.read(&recv);
+ *        leds = recv.data[0];
+ *    }
+ * }
+ * @endcode
+ */
+
+class USBHID: public USBDevice {
+public:
+
+    /**
+    * Constructor
+    *
+    * @param output_report_length Maximum length of a sent report (up to 64 bytes) (default: 64 bytes)
+    * @param input_report_length Maximum length of a received report (up to 64 bytes) (default: 64 bytes)
+    * @param vendor_id Your vendor_id
+    * @param product_id Your product_id
+    * @param product_release Your preoduct_release
+    * @param connect Connect the device
+    */
+    USBHID(uint8_t output_report_length = 64, uint8_t input_report_length = 64, uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0006, uint16_t product_release = 0x0001, bool connect = true);
+
+
+    /**
+    * Send a Report. warning: blocking
+    *
+    * @param report Report which will be sent (a report is defined by all data and the length)
+    * @returns true if successful
+    */
+    bool send(HID_REPORT *report);
+
+
+    /**
+    * Send a Report. warning: non blocking
+    *
+    * @param report Report which will be sent (a report is defined by all data and the length)
+    * @returns true if successful
+    */
+    bool sendNB(HID_REPORT *report);
+
+    /**
+    * Read a report: blocking
+    *
+    * @param report pointer to the report to fill
+    * @returns true if successful
+    */
+    bool read(HID_REPORT * report);
+
+    /**
+    * Read a report: non blocking
+    *
+    * @param report pointer to the report to fill
+    * @returns true if successful
+    */
+    bool readNB(HID_REPORT * report);
+
+protected:
+    uint16_t reportLength;
+
+    /*
+    * Get the Report descriptor
+    *
+    * @returns pointer to the report descriptor
+    */
+    virtual uint8_t * reportDesc();
+
+    /*
+    * Get the length of the report descriptor
+    *
+    * @returns the length of the report descriptor
+    */
+    virtual uint16_t reportDescLength();
+
+    /*
+    * Get string product descriptor
+    *
+    * @returns pointer to the string product descriptor
+    */
+    virtual uint8_t * stringIproductDesc();
+
+    /*
+    * Get string interface descriptor
+    *
+    * @returns pointer to the string interface descriptor
+    */
+    virtual uint8_t * stringIinterfaceDesc();
+
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc();
+
+
+    /*
+    * HID Report received by SET_REPORT request. Warning: Called in ISR context
+    * First byte of data will be the report ID
+    *
+    * @param report Data and length received
+    */
+    virtual void HID_callbackSetReport(HID_REPORT *report){};
+
+
+    /*
+    * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
+    * This is used to handle extensions to standard requests
+    * and class specific requests
+    *
+    * @returns true if class handles this request
+    */
+    virtual bool USBCallback_request();
+
+
+    /*
+    * Called by USBDevice layer. Set configuration of the device.
+    * For instance, you can add all endpoints that you need on this function.
+    *
+    * @param configuration Number of the configuration
+    * @returns true if class handles this request
+    */
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);
+
+private:
+    HID_REPORT outputReport;
+    uint8_t output_length;
+    uint8_t input_length;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBHID_Types.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,91 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBCLASS_HID_TYPES
+#define USBCLASS_HID_TYPES
+
+#include <stdint.h>
+
+/* */
+#define HID_VERSION_1_11    (0x0111)
+
+/* HID Class */
+#define HID_CLASS           (3)
+#define HID_SUBCLASS_NONE   (0)
+#define HID_PROTOCOL_NONE   (0)
+
+/* Descriptors */
+#define HID_DESCRIPTOR          (33)
+#define HID_DESCRIPTOR_LENGTH   (0x09)
+#define REPORT_DESCRIPTOR       (34)
+
+/* Class requests */
+#define GET_REPORT (0x1)
+#define GET_IDLE   (0x2)
+#define SET_REPORT (0x9)
+#define SET_IDLE   (0xa)
+
+/* HID Class Report Descriptor */
+/* Short items: size is 0, 1, 2 or 3 specifying 0, 1, 2 or 4 (four) bytes */
+/* of data as per HID Class standard */
+
+/* Main items */
+#define INPUT(size)             (0x80 | size)
+#define OUTPUT(size)            (0x90 | size)
+#define FEATURE(size)           (0xb0 | size)
+#define COLLECTION(size)        (0xa0 | size)
+#define END_COLLECTION(size)    (0xc0 | size)
+
+/* Global items */
+#define USAGE_PAGE(size)        (0x04 | size)
+#define LOGICAL_MINIMUM(size)   (0x14 | size)
+#define LOGICAL_MAXIMUM(size)   (0x24 | size)
+#define PHYSICAL_MINIMUM(size)  (0x34 | size)
+#define PHYSICAL_MAXIMUM(size)  (0x44 | size)
+#define UNIT_EXPONENT(size)     (0x54 | size)
+#define UNIT(size)              (0x64 | size)
+#define REPORT_SIZE(size)       (0x74 | size)
+#define REPORT_ID(size)         (0x84 | size)
+#define REPORT_COUNT(size)      (0x94 | size)
+#define PUSH(size)              (0xa4 | size)
+#define POP(size)               (0xb4 | size)
+
+/* Local items */
+#define USAGE(size)                 (0x08 | size)
+#define USAGE_MINIMUM(size)         (0x18 | size)
+#define USAGE_MAXIMUM(size)         (0x28 | size)
+#define DESIGNATOR_INDEX(size)      (0x38 | size)
+#define DESIGNATOR_MINIMUM(size)    (0x48 | size)
+#define DESIGNATOR_MAXIMUM(size)    (0x58 | size)
+#define STRING_INDEX(size)          (0x78 | size)
+#define STRING_MINIMUM(size)        (0x88 | size)
+#define STRING_MAXIMUM(size)        (0x98 | size)
+#define DELIMITER(size)             (0xa8 | size)
+
+/* HID Report */
+/* Where report IDs are used the first byte of 'data' will be the */
+/* report ID and 'length' will include this report ID byte. */
+
+#define MAX_HID_REPORT_SIZE (64)
+
+typedef struct {
+    uint32_t length;
+    uint8_t data[MAX_HID_REPORT_SIZE];
+} HID_REPORT;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBKeyboard.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,553 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+
+#include "USBKeyboard.h"
+
+#define REPORT_ID_KEYBOARD 1
+#define REPORT_ID_VOLUME   3
+
+
+typedef struct {
+    unsigned char usage;
+    unsigned char modifier;
+} KEYMAP;
+
+#ifdef US_KEYBOARD
+/* US keyboard (as HID standard) */
+#define KEYMAP_SIZE (152)
+const KEYMAP keymap[KEYMAP_SIZE] = {
+    {0, 0},             /* NUL */
+    {0, 0},             /* SOH */
+    {0, 0},             /* STX */
+    {0, 0},             /* ETX */
+    {0, 0},             /* EOT */
+    {0, 0},             /* ENQ */
+    {0, 0},             /* ACK */
+    {0, 0},             /* BEL */
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
+    {0, 0},             /* VT  */
+    {0, 0},             /* FF  */
+    {0, 0},             /* CR  */
+    {0, 0},             /* SO  */
+    {0, 0},             /* SI  */
+    {0, 0},             /* DEL */
+    {0, 0},             /* DC1 */
+    {0, 0},             /* DC2 */
+    {0, 0},             /* DC3 */
+    {0, 0},             /* DC4 */
+    {0, 0},             /* NAK */
+    {0, 0},             /* SYN */
+    {0, 0},             /* ETB */
+    {0, 0},             /* CAN */
+    {0, 0},             /* EM  */
+    {0, 0},             /* SUB */
+    {0, 0},             /* ESC */
+    {0, 0},             /* FS  */
+    {0, 0},             /* GS  */
+    {0, 0},             /* RS  */
+    {0, 0},             /* US  */
+    {0x2c, 0},          /*   */
+    {0x1e, KEY_SHIFT},      /* ! */
+    {0x34, KEY_SHIFT},      /* " */
+    {0x20, KEY_SHIFT},      /* # */
+    {0x21, KEY_SHIFT},      /* $ */
+    {0x22, KEY_SHIFT},      /* % */
+    {0x24, KEY_SHIFT},      /* & */
+    {0x34, 0},          /* ' */
+    {0x26, KEY_SHIFT},      /* ( */
+    {0x27, KEY_SHIFT},      /* ) */
+    {0x25, KEY_SHIFT},      /* * */
+    {0x2e, KEY_SHIFT},      /* + */
+    {0x36, 0},          /* , */
+    {0x2d, 0},          /* - */
+    {0x37, 0},          /* . */
+    {0x38, 0},          /* / */
+    {0x27, 0},          /* 0 */
+    {0x1e, 0},          /* 1 */
+    {0x1f, 0},          /* 2 */
+    {0x20, 0},          /* 3 */
+    {0x21, 0},          /* 4 */
+    {0x22, 0},          /* 5 */
+    {0x23, 0},          /* 6 */
+    {0x24, 0},          /* 7 */
+    {0x25, 0},          /* 8 */
+    {0x26, 0},          /* 9 */
+    {0x33, KEY_SHIFT},      /* : */
+    {0x33, 0},          /* ; */
+    {0x36, KEY_SHIFT},      /* < */
+    {0x2e, 0},          /* = */
+    {0x37, KEY_SHIFT},      /* > */
+    {0x38, KEY_SHIFT},      /* ? */
+    {0x1f, KEY_SHIFT},      /* @ */
+    {0x04, KEY_SHIFT},      /* A */
+    {0x05, KEY_SHIFT},      /* B */
+    {0x06, KEY_SHIFT},      /* C */
+    {0x07, KEY_SHIFT},      /* D */
+    {0x08, KEY_SHIFT},      /* E */
+    {0x09, KEY_SHIFT},      /* F */
+    {0x0a, KEY_SHIFT},      /* G */
+    {0x0b, KEY_SHIFT},      /* H */
+    {0x0c, KEY_SHIFT},      /* I */
+    {0x0d, KEY_SHIFT},      /* J */
+    {0x0e, KEY_SHIFT},      /* K */
+    {0x0f, KEY_SHIFT},      /* L */
+    {0x10, KEY_SHIFT},      /* M */
+    {0x11, KEY_SHIFT},      /* N */
+    {0x12, KEY_SHIFT},      /* O */
+    {0x13, KEY_SHIFT},      /* P */
+    {0x14, KEY_SHIFT},      /* Q */
+    {0x15, KEY_SHIFT},      /* R */
+    {0x16, KEY_SHIFT},      /* S */
+    {0x17, KEY_SHIFT},      /* T */
+    {0x18, KEY_SHIFT},      /* U */
+    {0x19, KEY_SHIFT},      /* V */
+    {0x1a, KEY_SHIFT},      /* W */
+    {0x1b, KEY_SHIFT},      /* X */
+    {0x1c, KEY_SHIFT},      /* Y */
+    {0x1d, KEY_SHIFT},      /* Z */
+    {0x2f, 0},          /* [ */
+    {0x31, 0},          /* \ */
+    {0x30, 0},          /* ] */
+    {0x23, KEY_SHIFT},      /* ^ */
+    {0x2d, KEY_SHIFT},      /* _ */
+    {0x35, 0},          /* ` */
+    {0x04, 0},          /* a */
+    {0x05, 0},          /* b */
+    {0x06, 0},          /* c */
+    {0x07, 0},          /* d */
+    {0x08, 0},          /* e */
+    {0x09, 0},          /* f */
+    {0x0a, 0},          /* g */
+    {0x0b, 0},          /* h */
+    {0x0c, 0},          /* i */
+    {0x0d, 0},          /* j */
+    {0x0e, 0},          /* k */
+    {0x0f, 0},          /* l */
+    {0x10, 0},          /* m */
+    {0x11, 0},          /* n */
+    {0x12, 0},          /* o */
+    {0x13, 0},          /* p */
+    {0x14, 0},          /* q */
+    {0x15, 0},          /* r */
+    {0x16, 0},          /* s */
+    {0x17, 0},          /* t */
+    {0x18, 0},          /* u */
+    {0x19, 0},          /* v */
+    {0x1a, 0},          /* w */
+    {0x1b, 0},          /* x */
+    {0x1c, 0},          /* y */
+    {0x1d, 0},          /* z */
+    {0x2f, KEY_SHIFT},      /* { */
+    {0x31, KEY_SHIFT},      /* | */
+    {0x30, KEY_SHIFT},      /* } */
+    {0x35, KEY_SHIFT},      /* ~ */
+    {0,0},              /* DEL */
+
+    {0x3a, 0},          /* F1 */
+    {0x3b, 0},          /* F2 */
+    {0x3c, 0},          /* F3 */
+    {0x3d, 0},          /* F4 */
+    {0x3e, 0},          /* F5 */
+    {0x3f, 0},          /* F6 */
+    {0x40, 0},          /* F7 */
+    {0x41, 0},          /* F8 */
+    {0x42, 0},          /* F9 */
+    {0x43, 0},          /* F10 */
+    {0x44, 0},          /* F11 */
+    {0x45, 0},          /* F12 */
+
+    {0x46, 0},          /* PRINT_SCREEN */
+    {0x47, 0},          /* SCROLL_LOCK */
+    {0x39, 0},          /* CAPS_LOCK */
+    {0x53, 0},          /* NUM_LOCK */
+    {0x49, 0},          /* INSERT */
+    {0x4a, 0},          /* HOME */
+    {0x4b, 0},          /* PAGE_UP */
+    {0x4e, 0},          /* PAGE_DOWN */
+
+    {0x4f, 0},          /* RIGHT_ARROW */
+    {0x50, 0},          /* LEFT_ARROW */
+    {0x51, 0},          /* DOWN_ARROW */
+    {0x52, 0},          /* UP_ARROW */
+};
+
+#else
+/* UK keyboard */
+#define KEYMAP_SIZE (152)
+const KEYMAP keymap[KEYMAP_SIZE] = {
+    {0, 0},             /* NUL */
+    {0, 0},             /* SOH */
+    {0, 0},             /* STX */
+    {0, 0},             /* ETX */
+    {0, 0},             /* EOT */
+    {0, 0},             /* ENQ */
+    {0, 0},             /* ACK */
+    {0, 0},             /* BEL */
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
+    {0, 0},             /* VT  */
+    {0, 0},             /* FF  */
+    {0, 0},             /* CR  */
+    {0, 0},             /* SO  */
+    {0, 0},             /* SI  */
+    {0, 0},             /* DEL */
+    {0, 0},             /* DC1 */
+    {0, 0},             /* DC2 */
+    {0, 0},             /* DC3 */
+    {0, 0},             /* DC4 */
+    {0, 0},             /* NAK */
+    {0, 0},             /* SYN */
+    {0, 0},             /* ETB */
+    {0, 0},             /* CAN */
+    {0, 0},             /* EM  */
+    {0, 0},             /* SUB */
+    {0, 0},             /* ESC */
+    {0, 0},             /* FS  */
+    {0, 0},             /* GS  */
+    {0, 0},             /* RS  */
+    {0, 0},             /* US  */
+    {0x2c, 0},          /*   */
+    {0x1e, KEY_SHIFT},      /* ! */
+    {0x1f, KEY_SHIFT},      /* " */
+    {0x32, 0},          /* # */
+    {0x21, KEY_SHIFT},      /* $ */
+    {0x22, KEY_SHIFT},      /* % */
+    {0x24, KEY_SHIFT},      /* & */
+    {0x34, 0},          /* ' */
+    {0x26, KEY_SHIFT},      /* ( */
+    {0x27, KEY_SHIFT},      /* ) */
+    {0x25, KEY_SHIFT},      /* * */
+    {0x2e, KEY_SHIFT},      /* + */
+    {0x36, 0},          /* , */
+    {0x2d, 0},          /* - */
+    {0x37, 0},          /* . */
+    {0x38, 0},          /* / */
+    {0x27, 0},          /* 0 */
+    {0x1e, 0},          /* 1 */
+    {0x1f, 0},          /* 2 */
+    {0x20, 0},          /* 3 */
+    {0x21, 0},          /* 4 */
+    {0x22, 0},          /* 5 */
+    {0x23, 0},          /* 6 */
+    {0x24, 0},          /* 7 */
+    {0x25, 0},          /* 8 */
+    {0x26, 0},          /* 9 */
+    {0x33, KEY_SHIFT},      /* : */
+    {0x33, 0},          /* ; */
+    {0x36, KEY_SHIFT},      /* < */
+    {0x2e, 0},          /* = */
+    {0x37, KEY_SHIFT},      /* > */
+    {0x38, KEY_SHIFT},      /* ? */
+    {0x34, KEY_SHIFT},      /* @ */
+    {0x04, KEY_SHIFT},      /* A */
+    {0x05, KEY_SHIFT},      /* B */
+    {0x06, KEY_SHIFT},      /* C */
+    {0x07, KEY_SHIFT},      /* D */
+    {0x08, KEY_SHIFT},      /* E */
+    {0x09, KEY_SHIFT},      /* F */
+    {0x0a, KEY_SHIFT},      /* G */
+    {0x0b, KEY_SHIFT},      /* H */
+    {0x0c, KEY_SHIFT},      /* I */
+    {0x0d, KEY_SHIFT},      /* J */
+    {0x0e, KEY_SHIFT},      /* K */
+    {0x0f, KEY_SHIFT},      /* L */
+    {0x10, KEY_SHIFT},      /* M */
+    {0x11, KEY_SHIFT},      /* N */
+    {0x12, KEY_SHIFT},      /* O */
+    {0x13, KEY_SHIFT},      /* P */
+    {0x14, KEY_SHIFT},      /* Q */
+    {0x15, KEY_SHIFT},      /* R */
+    {0x16, KEY_SHIFT},      /* S */
+    {0x17, KEY_SHIFT},      /* T */
+    {0x18, KEY_SHIFT},      /* U */
+    {0x19, KEY_SHIFT},      /* V */
+    {0x1a, KEY_SHIFT},      /* W */
+    {0x1b, KEY_SHIFT},      /* X */
+    {0x1c, KEY_SHIFT},      /* Y */
+    {0x1d, KEY_SHIFT},      /* Z */
+    {0x2f, 0},          /* [ */
+    {0x64, 0},          /* \ */
+    {0x30, 0},          /* ] */
+    {0x23, KEY_SHIFT},      /* ^ */
+    {0x2d, KEY_SHIFT},      /* _ */
+    {0x35, 0},          /* ` */
+    {0x04, 0},          /* a */
+    {0x05, 0},          /* b */
+    {0x06, 0},          /* c */
+    {0x07, 0},          /* d */
+    {0x08, 0},          /* e */
+    {0x09, 0},          /* f */
+    {0x0a, 0},          /* g */
+    {0x0b, 0},          /* h */
+    {0x0c, 0},          /* i */
+    {0x0d, 0},          /* j */
+    {0x0e, 0},          /* k */
+    {0x0f, 0},          /* l */
+    {0x10, 0},          /* m */
+    {0x11, 0},          /* n */
+    {0x12, 0},          /* o */
+    {0x13, 0},          /* p */
+    {0x14, 0},          /* q */
+    {0x15, 0},          /* r */
+    {0x16, 0},          /* s */
+    {0x17, 0},          /* t */
+    {0x18, 0},          /* u */
+    {0x19, 0},          /* v */
+    {0x1a, 0},          /* w */
+    {0x1b, 0},          /* x */
+    {0x1c, 0},          /* y */
+    {0x1d, 0},          /* z */
+    {0x2f, KEY_SHIFT},      /* { */
+    {0x64, KEY_SHIFT},      /* | */
+    {0x30, KEY_SHIFT},      /* } */
+    {0x32, KEY_SHIFT},      /* ~ */
+    {0,0},             /* DEL */
+
+    {0x3a, 0},          /* F1 */
+    {0x3b, 0},          /* F2 */
+    {0x3c, 0},          /* F3 */
+    {0x3d, 0},          /* F4 */
+    {0x3e, 0},          /* F5 */
+    {0x3f, 0},          /* F6 */
+    {0x40, 0},          /* F7 */
+    {0x41, 0},          /* F8 */
+    {0x42, 0},          /* F9 */
+    {0x43, 0},          /* F10 */
+    {0x44, 0},          /* F11 */
+    {0x45, 0},          /* F12 */
+
+    {0x46, 0},          /* PRINT_SCREEN */
+    {0x47, 0},          /* SCROLL_LOCK */
+    {0x39, 0},          /* CAPS_LOCK */
+    {0x53, 0},          /* NUM_LOCK */
+    {0x49, 0},          /* INSERT */
+    {0x4a, 0},          /* HOME */
+    {0x4b, 0},          /* PAGE_UP */
+    {0x4e, 0},          /* PAGE_DOWN */
+
+    {0x4f, 0},          /* RIGHT_ARROW */
+    {0x50, 0},          /* LEFT_ARROW */
+    {0x51, 0},          /* DOWN_ARROW */
+    {0x52, 0},          /* UP_ARROW */
+};
+#endif
+
+uint8_t * USBKeyboard::reportDesc() {
+    static uint8_t reportDescriptor[] = {
+        USAGE_PAGE(1), 0x01,                    // Generic Desktop
+        USAGE(1), 0x06,                         // Keyboard
+        COLLECTION(1), 0x01,                    // Application
+        REPORT_ID(1),       REPORT_ID_KEYBOARD,
+
+        USAGE_PAGE(1), 0x07,                    // Key Codes
+        USAGE_MINIMUM(1), 0xE0,
+        USAGE_MAXIMUM(1), 0xE7,
+        LOGICAL_MINIMUM(1), 0x00,
+        LOGICAL_MAXIMUM(1), 0x01,
+        REPORT_SIZE(1), 0x01,
+        REPORT_COUNT(1), 0x08,
+        INPUT(1), 0x02,                         // Data, Variable, Absolute
+        REPORT_COUNT(1), 0x01,
+        REPORT_SIZE(1), 0x08,
+        INPUT(1), 0x01,                         // Constant
+
+
+        REPORT_COUNT(1), 0x05,
+        REPORT_SIZE(1), 0x01,
+        USAGE_PAGE(1), 0x08,                    // LEDs
+        USAGE_MINIMUM(1), 0x01,
+        USAGE_MAXIMUM(1), 0x05,
+        OUTPUT(1), 0x02,                        // Data, Variable, Absolute
+        REPORT_COUNT(1), 0x01,
+        REPORT_SIZE(1), 0x03,
+        OUTPUT(1), 0x01,                        // Constant
+
+
+        REPORT_COUNT(1), 0x06,
+        REPORT_SIZE(1), 0x08,
+        LOGICAL_MINIMUM(1), 0x00,
+        LOGICAL_MAXIMUM(1), 0x65,
+        USAGE_PAGE(1), 0x07,                    // Key Codes
+        USAGE_MINIMUM(1), 0x00,
+        USAGE_MAXIMUM(1), 0x65,
+        INPUT(1), 0x00,                         // Data, Array
+        END_COLLECTION(0),
+
+        // Media Control
+        USAGE_PAGE(1), 0x0C,
+        USAGE(1), 0x01,
+        COLLECTION(1), 0x01,
+        REPORT_ID(1), REPORT_ID_VOLUME,
+        USAGE_PAGE(1), 0x0C,
+        LOGICAL_MINIMUM(1), 0x00,
+        LOGICAL_MAXIMUM(1), 0x01,
+        REPORT_SIZE(1), 0x01,
+        REPORT_COUNT(1), 0x07,
+        USAGE(1), 0xB5,             // Next Track
+        USAGE(1), 0xB6,             // Previous Track
+        USAGE(1), 0xB7,             // Stop
+        USAGE(1), 0xCD,             // Play / Pause
+        USAGE(1), 0xE2,             // Mute
+        USAGE(1), 0xE9,             // Volume Up
+        USAGE(1), 0xEA,             // Volume Down
+        INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
+        REPORT_COUNT(1), 0x01,
+        INPUT(1), 0x01,
+        END_COLLECTION(0),
+    };
+    reportLength = sizeof(reportDescriptor);
+    return reportDescriptor;
+}
+
+
+bool USBKeyboard::EPINT_OUT_callback() {
+    uint32_t bytesRead = 0;
+    uint8_t led[65];
+    USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
+
+    // we take led[1] because led[0] is the report ID
+    lock_status = led[1] & 0x07;
+
+    // We activate the endpoint to be able to recceive data
+    if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
+        return false;
+    return true;
+}
+
+uint8_t USBKeyboard::lockStatus() {
+    return lock_status;
+}
+
+int USBKeyboard::_putc(int c) {
+    return keyCode(c, keymap[c].modifier);
+}
+
+bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) {
+    // Send a simulated keyboard keypress. Returns true if successful.
+    HID_REPORT report;
+
+    report.data[0] = REPORT_ID_KEYBOARD;
+    report.data[1] = modifier;
+    report.data[2] = 0;
+    report.data[3] = keymap[key].usage;
+    report.data[4] = 0;
+    report.data[5] = 0;
+    report.data[6] = 0;
+    report.data[7] = 0;
+    report.data[8] = 0;
+
+    report.length = 9;
+
+    if (!send(&report)) {
+        return false;
+    }
+
+    report.data[1] = 0;
+    report.data[3] = 0;
+
+    if (!send(&report)) {
+        return false;
+    }
+
+    return true;
+
+}
+
+
+bool USBKeyboard::mediaControl(MEDIA_KEY key) {
+    HID_REPORT report;
+
+    report.data[0] = REPORT_ID_VOLUME;
+    report.data[1] = (1 << key) & 0x7f;
+
+    report.length = 2;
+
+    if (!send(&report)) {
+        return false;
+    }
+
+    report.data[0] = REPORT_ID_VOLUME;
+    report.data[1] = 0;
+
+    report.length = 2;
+
+    return send(&report);
+}
+
+
+#define DEFAULT_CONFIGURATION (1)
+#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
+                               + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (1 * HID_DESCRIPTOR_LENGTH) \
+                               + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
+
+uint8_t * USBKeyboard::configurationDesc() {
+    static uint8_t configurationDescriptor[] = {
+        CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
+        CONFIGURATION_DESCRIPTOR,       // bDescriptorType
+        LSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (LSB)
+        MSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (MSB)
+        0x01,                           // bNumInterfaces
+        DEFAULT_CONFIGURATION,          // bConfigurationValue
+        0x00,                           // iConfiguration
+        C_RESERVED | C_SELF_POWERED,    // bmAttributes
+        C_POWER(0),                     // bMaxPowerHello World from Mbed
+
+        INTERFACE_DESCRIPTOR_LENGTH,    // bLength
+        INTERFACE_DESCRIPTOR,           // bDescriptorType
+        0x00,                           // bInterfaceNumber
+        0x00,                           // bAlternateSetting
+        0x02,                           // bNumEndpoints
+        HID_CLASS,                      // bInterfaceClass
+        1,                              // bInterfaceSubClass
+        1,                              // bInterfaceProtocol (keyboard)
+        0x00,                           // iInterface
+
+        HID_DESCRIPTOR_LENGTH,          // bLength
+        HID_DESCRIPTOR,                 // bDescriptorType
+        LSB(HID_VERSION_1_11),          // bcdHID (LSB)
+        MSB(HID_VERSION_1_11),          // bcdHID (MSB)
+        0x00,                           // bCountryCode
+        0x01,                           // bNumDescriptors
+        REPORT_DESCRIPTOR,              // bDescriptorType
+        (uint8_t)(LSB(reportDescLength())),  // wDescriptorLength (LSB)
+        (uint8_t)(MSB(reportDescLength())),  // wDescriptorLength (MSB)
+
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EPINT_IN),          // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        1,                             // bInterval (milliseconds)
+
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EPINT_OUT),          // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        1,                             // bInterval (milliseconds)
+    };
+    return configurationDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBKeyboard.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,183 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBKEYBOARD_H
+#define USBKEYBOARD_H
+
+#include "USBHID.h"
+#include "Stream.h"
+
+/* Modifiers */
+enum MODIFIER_KEY {
+    KEY_CTRL = 1,
+    KEY_SHIFT = 2,
+    KEY_ALT = 4,
+};
+
+
+enum MEDIA_KEY {
+    KEY_NEXT_TRACK,     /*!< next Track Button */
+    KEY_PREVIOUS_TRACK, /*!< Previous track Button */
+    KEY_STOP,           /*!< Stop Button */
+    KEY_PLAY_PAUSE,     /*!< Play/Pause Button */
+    KEY_MUTE,           /*!< Mute Button */
+    KEY_VOLUME_UP,      /*!< Volume Up Button */
+    KEY_VOLUME_DOWN,    /*!< Volume Down Button */
+};
+
+enum FUNCTION_KEY {
+    KEY_F1 = 128,   /* F1 key */
+    KEY_F2,         /* F2 key */
+    KEY_F3,         /* F3 key */
+    KEY_F4,         /* F4 key */
+    KEY_F5,         /* F5 key */
+    KEY_F6,         /* F6 key */
+    KEY_F7,         /* F7 key */
+    KEY_F8,         /* F8 key */
+    KEY_F9,         /* F9 key */
+    KEY_F10,        /* F10 key */
+    KEY_F11,        /* F11 key */
+    KEY_F12,        /* F12 key */
+
+    KEY_PRINT_SCREEN,   /* Print Screen key */
+    KEY_SCROLL_LOCK,    /* Scroll lock */
+    KEY_CAPS_LOCK,      /* caps lock */
+    KEY_NUM_LOCK,       /* num lock */
+    KEY_INSERT,         /* Insert key */
+    KEY_HOME,           /* Home key */
+    KEY_PAGE_UP,        /* Page Up key */
+    KEY_PAGE_DOWN,      /* Page Down key */
+
+    RIGHT_ARROW,        /* Right arrow */
+    LEFT_ARROW,         /* Left arrow */
+    DOWN_ARROW,         /* Down arrow */
+    UP_ARROW,           /* Up arrow */
+};
+
+/**
+ * USBKeyboard example
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "USBKeyboard.h"
+ *
+ * USBKeyboard key;
+ *
+ * int main(void)
+ * {
+ *   while (1)
+ *   {
+ *       key.printf("Hello World\r\n");
+ *       wait(1);
+ *   }
+ * }
+ *
+ * @endcode
+ */
+class USBKeyboard: public USBHID, public Stream {
+public:
+
+    /**
+    *   Constructor
+    *
+    *
+    * @param leds Leds bus: first: NUM_LOCK, second: CAPS_LOCK, third: SCROLL_LOCK
+    * @param vendor_id Your vendor_id (default: 0x1235)
+    * @param product_id Your product_id (default: 0x0050)
+    * @param product_release Your preoduct_release (default: 0x0001)
+    *
+    */
+    USBKeyboard(uint16_t vendor_id = 0x1235, uint16_t product_id = 0x0050, uint16_t product_release = 0x0001):
+            USBHID(0, 0, vendor_id, product_id, product_release, false) {
+        lock_status = 0;
+        connect();
+    };
+
+    /**
+    * To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key
+    *
+    * @code
+    * //To send CTRL + s (save)
+    *  keyboard.keyCode('s', KEY_CTRL);
+    * @endcode
+    *
+    * @param modifier bit 0: KEY_CTRL, bit 1: KEY_SHIFT, bit 2: KEY_ALT (default: 0)
+    * @param key character to send
+    * @returns true if there is no error, false otherwise
+    */
+    bool keyCode(uint8_t key, uint8_t modifier = 0);
+
+    /**
+    * Send a character
+    *
+    * @param c character to be sent
+    * @returns true if there is no error, false otherwise
+    */
+    virtual int _putc(int c);
+
+    /**
+    * Control media keys
+    *
+    * @param key media key pressed (KEY_NEXT_TRACK, KEY_PREVIOUS_TRACK, KEY_STOP, KEY_PLAY_PAUSE, KEY_MUTE, KEY_VOLUME_UP, KEY_VOLUME_DOWN)
+    * @returns true if there is no error, false otherwise
+    */
+    bool mediaControl(MEDIA_KEY key);
+
+    /*
+    * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+    *
+    * @returns pointer to the report descriptor
+    */
+    virtual uint8_t * reportDesc();
+
+    /*
+    * Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
+    *
+    * @returns if handle by subclass, return true
+    */
+    virtual bool EPINT_OUT_callback();
+
+    /**
+    * Read status of lock keys. Useful to switch-on/off leds according to key pressed. Only the first three bits of the result is important:
+    *   - First bit: NUM_LOCK
+    *   - Second bit: CAPS_LOCK
+    *   - Third bit: SCROLL_LOCK
+    *
+    * @returns status of lock keys
+    */
+    uint8_t lockStatus();
+
+protected:
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc();
+
+private:
+    //dummy otherwise it doesn,t compile (we must define all methods of an abstract class)
+    virtual int _getc() {
+        return -1;
+    };
+
+    uint8_t lock_status;
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBMouse.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,245 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBMouse.h"
+
+bool USBMouse::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
+    switch (mouse_type) {
+        case REL_MOUSE:
+            while (x > 127) {
+                if (!mouseSend(127, 0, button, z)) return false;
+                x = x - 127;
+            }
+            while (x < -128) {
+                if (!mouseSend(-128, 0, button, z)) return false;
+                x = x + 128;
+            }
+            while (y > 127) {
+                if (!mouseSend(0, 127, button, z)) return false;
+                y = y - 127;
+            }
+            while (y < -128) {
+                if (!mouseSend(0, -128, button, z)) return false;
+                y = y + 128;
+            }
+            return mouseSend(x, y, button, z);
+        case ABS_MOUSE:
+            HID_REPORT report;
+
+            report.data[0] = x & 0xff;
+            report.data[1] = (x >> 8) & 0xff;
+            report.data[2] = y & 0xff;
+            report.data[3] = (y >> 8) & 0xff;
+            report.data[4] = -z;
+            report.data[5] = button & 0x07;
+
+            report.length = 6;
+
+            return send(&report);
+        default:
+            return false;
+    }
+}
+
+bool USBMouse::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
+    HID_REPORT report;
+    report.data[0] = buttons & 0x07;
+    report.data[1] = x;
+    report.data[2] = y;
+    report.data[3] = -z; // >0 to scroll down, <0 to scroll up
+
+    report.length = 4;
+
+    return send(&report);
+}
+
+bool USBMouse::move(int16_t x, int16_t y) {
+    return update(x, y, button, 0);
+}
+
+bool USBMouse::scroll(int8_t z) {
+    return update(0, 0, button, z);
+}
+
+
+bool USBMouse::doubleClick() {
+    if (!click(MOUSE_LEFT))
+        return false;
+    wait(0.1);
+    return click(MOUSE_LEFT);
+}
+
+bool USBMouse::click(uint8_t button) {
+    if (!update(0, 0, button, 0))
+        return false;
+    wait(0.01);
+    return update(0, 0, 0, 0);
+}
+
+bool USBMouse::press(uint8_t button_) {
+    button = button_ & 0x07;
+    return update(0, 0, button, 0);
+}
+
+bool USBMouse::release(uint8_t button_) {
+    button = (button & (~button_)) & 0x07;
+    return update(0, 0, button, 0);
+}
+
+
+uint8_t * USBMouse::reportDesc() {
+
+    if (mouse_type == REL_MOUSE) {
+        static uint8_t reportDescriptor[] = {
+            USAGE_PAGE(1),      0x01,       // Genric Desktop
+            USAGE(1),           0x02,       // Mouse
+            COLLECTION(1),      0x01,       // Application
+            USAGE(1),           0x01,       // Pointer
+            COLLECTION(1),      0x00,       // Physical
+
+            REPORT_COUNT(1),    0x03,
+            REPORT_SIZE(1),     0x01,
+            USAGE_PAGE(1),      0x09,       // Buttons
+            USAGE_MINIMUM(1),       0x1,
+            USAGE_MAXIMUM(1),       0x3,
+            LOGICAL_MINIMUM(1),     0x00,
+            LOGICAL_MAXIMUM(1),     0x01,
+            INPUT(1),           0x02,
+            REPORT_COUNT(1),    0x01,
+            REPORT_SIZE(1),     0x05,
+            INPUT(1),           0x01,
+
+            REPORT_COUNT(1),    0x03,
+            REPORT_SIZE(1),     0x08,
+            USAGE_PAGE(1),      0x01,
+            USAGE(1),           0x30,       // X
+            USAGE(1),           0x31,       // Y
+            USAGE(1),           0x38,       // scroll
+            LOGICAL_MINIMUM(1),     0x81,
+            LOGICAL_MAXIMUM(1),     0x7f,
+            INPUT(1),           0x06,       // Relative data
+
+            END_COLLECTION(0),
+            END_COLLECTION(0),
+        };
+        reportLength = sizeof(reportDescriptor);
+        return reportDescriptor;
+    } else if (mouse_type == ABS_MOUSE) {
+        static uint8_t reportDescriptor[] = {
+
+            USAGE_PAGE(1), 0x01,           // Generic Desktop
+            USAGE(1), 0x02,                // Mouse
+            COLLECTION(1), 0x01,           // Application
+            USAGE(1), 0x01,                // Pointer
+            COLLECTION(1), 0x00,           // Physical
+
+            USAGE_PAGE(1), 0x01,            // Generic Desktop
+            USAGE(1), 0x30,                 // X
+            USAGE(1), 0x31,                 // Y
+            LOGICAL_MINIMUM(1), 0x00,       // 0
+            LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767
+            REPORT_SIZE(1), 0x10,
+            REPORT_COUNT(1), 0x02,
+            INPUT(1), 0x02,                 // Data, Variable, Absolute
+
+            USAGE_PAGE(1), 0x01,            // Generic Desktop
+            USAGE(1), 0x38,                 // scroll
+            LOGICAL_MINIMUM(1), 0x81,       // -127
+            LOGICAL_MAXIMUM(1), 0x7f,       // 127
+            REPORT_SIZE(1), 0x08,
+            REPORT_COUNT(1), 0x01,
+            INPUT(1), 0x06,                 // Data, Variable, Relative
+
+            USAGE_PAGE(1), 0x09,            // Buttons
+            USAGE_MINIMUM(1), 0x01,
+            USAGE_MAXIMUM(1), 0x03,
+            LOGICAL_MINIMUM(1), 0x00,       // 0
+            LOGICAL_MAXIMUM(1), 0x01,       // 1
+            REPORT_COUNT(1), 0x03,
+            REPORT_SIZE(1), 0x01,
+            INPUT(1), 0x02,                 // Data, Variable, Absolute
+            REPORT_COUNT(1), 0x01,
+            REPORT_SIZE(1), 0x05,
+            INPUT(1), 0x01,                 // Constant
+
+            END_COLLECTION(0),
+            END_COLLECTION(0)
+        };
+        reportLength = sizeof(reportDescriptor);
+        return reportDescriptor;
+    }
+    return NULL;
+}
+
+#define DEFAULT_CONFIGURATION (1)
+#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
+                               + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (1 * HID_DESCRIPTOR_LENGTH) \
+                               + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
+
+uint8_t * USBMouse::configurationDesc() {
+    static uint8_t configurationDescriptor[] = {
+        CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
+        CONFIGURATION_DESCRIPTOR,       // bDescriptorType
+        LSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (LSB)
+        MSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (MSB)
+        0x01,                           // bNumInterfaces
+        DEFAULT_CONFIGURATION,          // bConfigurationValue
+        0x00,                           // iConfiguration
+        C_RESERVED | C_SELF_POWERED,    // bmAttributes
+        C_POWER(0),                     // bMaxPowerHello World from Mbed
+
+        INTERFACE_DESCRIPTOR_LENGTH,    // bLength
+        INTERFACE_DESCRIPTOR,           // bDescriptorType
+        0x00,                           // bInterfaceNumber
+        0x00,                           // bAlternateSetting
+        0x02,                           // bNumEndpoints
+        HID_CLASS,                      // bInterfaceClass
+        1,                              // bInterfaceSubClass
+        2,                              // bInterfaceProtocol (mouse)
+        0x00,                           // iInterface
+
+        HID_DESCRIPTOR_LENGTH,          // bLength
+        HID_DESCRIPTOR,                 // bDescriptorType
+        LSB(HID_VERSION_1_11),          // bcdHID (LSB)
+        MSB(HID_VERSION_1_11),          // bcdHID (MSB)
+        0x00,                           // bCountryCode
+        0x01,                           // bNumDescriptors
+        REPORT_DESCRIPTOR,              // bDescriptorType
+        (uint8_t)(LSB(reportDescLength())),        // wDescriptorLength (LSB)
+        (uint8_t)(MSB(reportDescLength())),        // wDescriptorLength (MSB)
+
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EPINT_IN),          // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        1,                              // bInterval (milliseconds)
+
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EPINT_OUT),         // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        1,                              // bInterval (milliseconds)
+    };
+    return configurationDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBMouse.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,209 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBMOUSE_H
+#define USBMOUSE_H
+
+#include "USBHID.h"
+
+#define REPORT_ID_MOUSE   2
+
+/* Common usage */
+
+enum MOUSE_BUTTON
+{
+    MOUSE_LEFT = 1,
+    MOUSE_RIGHT = 2,
+    MOUSE_MIDDLE = 4,
+};
+
+/* X and Y limits */
+/* These values do not directly map to screen pixels */
+/* Zero may be interpreted as meaning 'no movement' */
+#define X_MIN_ABS    (1)        /*!< Minimum value on x-axis */
+#define Y_MIN_ABS    (1)        /*!< Minimum value on y-axis */
+#define X_MAX_ABS    (0x7fff)   /*!< Maximum value on x-axis */
+#define Y_MAX_ABS    (0x7fff)   /*!< Maximum value on y-axis */
+
+#define X_MIN_REL    (-127)     /*!< The maximum value that we can move to the left on the x-axis */
+#define Y_MIN_REL    (-127)     /*!< The maximum value that we can move up on the y-axis */
+#define X_MAX_REL    (127)      /*!< The maximum value that we can move to the right on the x-axis */
+#define Y_MAX_REL    (127)      /*!< The maximum value that we can move down on the y-axis */
+
+enum MOUSE_TYPE
+{
+    ABS_MOUSE,
+    REL_MOUSE,
+};
+
+/**
+ *
+ * USBMouse example
+ * @code
+ * #include "mbed.h"
+ * #include "USBMouse.h"
+ *
+ * USBMouse mouse;
+ *
+ * int main(void)
+ * {
+ *   while (1)
+ *   {
+ *      mouse.move(20, 0);
+ *      wait(0.5);
+ *   }
+ * }
+ *
+ * @endcode
+ *
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "USBMouse.h"
+ * #include <math.h>
+ *
+ * USBMouse mouse(ABS_MOUSE);
+ *
+ * int main(void)
+ * {
+ *   uint16_t x_center = (X_MAX_ABS - X_MIN_ABS)/2;
+ *   uint16_t y_center = (Y_MAX_ABS - Y_MIN_ABS)/2;
+ *   uint16_t x_screen = 0;
+ *   uint16_t y_screen = 0;
+ *
+ *   uint32_t x_origin = x_center;
+ *   uint32_t y_origin = y_center;
+ *   uint32_t radius = 5000;
+ *   uint32_t angle = 0;
+ *
+ *   while (1)
+ *   {
+ *       x_screen = x_origin + cos((double)angle*3.14/180.0)*radius;
+ *       y_screen = y_origin + sin((double)angle*3.14/180.0)*radius;
+ *
+ *       mouse.move(x_screen, y_screen);
+ *       angle += 3;
+ *       wait(0.01);
+ *   }
+ * }
+ *
+ * @endcode
+ */
+class USBMouse: public USBHID
+{
+    public:
+
+        /**
+        *   Constructor
+        *
+        * @param mouse_type Mouse type: ABS_MOUSE (absolute mouse) or REL_MOUSE (relative mouse) (default: REL_MOUSE)
+        * @param vendor_id Your vendor_id (default: 0x1234)
+        * @param product_id Your product_id (default: 0x0001)
+        * @param product_release Your preoduct_release (default: 0x0001)
+        *
+        */
+        USBMouse(MOUSE_TYPE mouse_type = REL_MOUSE, uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0001, uint16_t product_release = 0x0001):
+            USBHID(0, 0, vendor_id, product_id, product_release, false)
+            {
+                button = 0;
+                this->mouse_type = mouse_type;
+                connect();
+            };
+
+        /**
+        * Write a state of the mouse
+        *
+        * @param x x-axis position
+        * @param y y-axis position
+        * @param buttons buttons state (first bit represents MOUSE_LEFT, second bit MOUSE_RIGHT and third bit MOUSE_MIDDLE)
+        * @param z wheel state (>0 to scroll down, <0 to scroll up)
+        * @returns true if there is no error, false otherwise
+        */
+        bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
+
+
+        /**
+        * Move the cursor to (x, y)
+        *
+        * @param x-axis position
+        * @param y-axis position
+        * @returns true if there is no error, false otherwise
+        */
+        bool move(int16_t x, int16_t y);
+
+        /**
+        * Press one or several buttons
+        *
+        * @param button button state (ex: press(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool press(uint8_t button);
+
+        /**
+        * Release one or several buttons
+        *
+        * @param button button state (ex: release(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool release(uint8_t button);
+
+        /**
+        * Double click (MOUSE_LEFT)
+        *
+        * @returns true if there is no error, false otherwise
+        */
+        bool doubleClick();
+
+        /**
+        * Click
+        *
+        * @param button state of the buttons ( ex: clic(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool click(uint8_t button);
+
+        /**
+        * Scrolling
+        *
+        * @param z value of the wheel (>0 to go down, <0 to go up)
+        * @returns true if there is no error, false otherwise
+        */
+        bool scroll(int8_t z);
+
+        /*
+        * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+        *
+        * @returns pointer to the report descriptor
+        */
+        virtual uint8_t * reportDesc();
+
+    protected:
+        /*
+        * Get configuration descriptor
+        *
+        * @returns pointer to the configuration descriptor
+        */
+        virtual uint8_t * configurationDesc();
+
+    private:
+        MOUSE_TYPE mouse_type;
+        uint8_t button;
+        bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBMouseKeyboard.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,706 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBMouseKeyboard.h"
+
+typedef struct {
+    unsigned char usage;
+    unsigned char modifier;
+} KEYMAP;
+
+#ifdef US_KEYBOARD
+/* US keyboard (as HID standard) */
+#define KEYMAP_SIZE (152)
+const KEYMAP keymap[KEYMAP_SIZE] = {
+    {0, 0},             /* NUL */
+    {0, 0},             /* SOH */
+    {0, 0},             /* STX */
+    {0, 0},             /* ETX */
+    {0, 0},             /* EOT */
+    {0, 0},             /* ENQ */
+    {0, 0},             /* ACK */
+    {0, 0},             /* BEL */
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
+    {0, 0},             /* VT  */
+    {0, 0},             /* FF  */
+    {0, 0},             /* CR  */
+    {0, 0},             /* SO  */
+    {0, 0},             /* SI  */
+    {0, 0},             /* DEL */
+    {0, 0},             /* DC1 */
+    {0, 0},             /* DC2 */
+    {0, 0},             /* DC3 */
+    {0, 0},             /* DC4 */
+    {0, 0},             /* NAK */
+    {0, 0},             /* SYN */
+    {0, 0},             /* ETB */
+    {0, 0},             /* CAN */
+    {0, 0},             /* EM  */
+    {0, 0},             /* SUB */
+    {0, 0},             /* ESC */
+    {0, 0},             /* FS  */
+    {0, 0},             /* GS  */
+    {0, 0},             /* RS  */
+    {0, 0},             /* US  */
+    {0x2c, 0},          /*   */
+    {0x1e, KEY_SHIFT},      /* ! */
+    {0x34, KEY_SHIFT},      /* " */
+    {0x20, KEY_SHIFT},      /* # */
+    {0x21, KEY_SHIFT},      /* $ */
+    {0x22, KEY_SHIFT},      /* % */
+    {0x24, KEY_SHIFT},      /* & */
+    {0x34, 0},          /* ' */
+    {0x26, KEY_SHIFT},      /* ( */
+    {0x27, KEY_SHIFT},      /* ) */
+    {0x25, KEY_SHIFT},      /* * */
+    {0x2e, KEY_SHIFT},      /* + */
+    {0x36, 0},          /* , */
+    {0x2d, 0},          /* - */
+    {0x37, 0},          /* . */
+    {0x38, 0},          /* / */
+    {0x27, 0},          /* 0 */
+    {0x1e, 0},          /* 1 */
+    {0x1f, 0},          /* 2 */
+    {0x20, 0},          /* 3 */
+    {0x21, 0},          /* 4 */
+    {0x22, 0},          /* 5 */
+    {0x23, 0},          /* 6 */
+    {0x24, 0},          /* 7 */
+    {0x25, 0},          /* 8 */
+    {0x26, 0},          /* 9 */
+    {0x33, KEY_SHIFT},      /* : */
+    {0x33, 0},          /* ; */
+    {0x36, KEY_SHIFT},      /* < */
+    {0x2e, 0},          /* = */
+    {0x37, KEY_SHIFT},      /* > */
+    {0x38, KEY_SHIFT},      /* ? */
+    {0x1f, KEY_SHIFT},      /* @ */
+    {0x04, KEY_SHIFT},      /* A */
+    {0x05, KEY_SHIFT},      /* B */
+    {0x06, KEY_SHIFT},      /* C */
+    {0x07, KEY_SHIFT},      /* D */
+    {0x08, KEY_SHIFT},      /* E */
+    {0x09, KEY_SHIFT},      /* F */
+    {0x0a, KEY_SHIFT},      /* G */
+    {0x0b, KEY_SHIFT},      /* H */
+    {0x0c, KEY_SHIFT},      /* I */
+    {0x0d, KEY_SHIFT},      /* J */
+    {0x0e, KEY_SHIFT},      /* K */
+    {0x0f, KEY_SHIFT},      /* L */
+    {0x10, KEY_SHIFT},      /* M */
+    {0x11, KEY_SHIFT},      /* N */
+    {0x12, KEY_SHIFT},      /* O */
+    {0x13, KEY_SHIFT},      /* P */
+    {0x14, KEY_SHIFT},      /* Q */
+    {0x15, KEY_SHIFT},      /* R */
+    {0x16, KEY_SHIFT},      /* S */
+    {0x17, KEY_SHIFT},      /* T */
+    {0x18, KEY_SHIFT},      /* U */
+    {0x19, KEY_SHIFT},      /* V */
+    {0x1a, KEY_SHIFT},      /* W */
+    {0x1b, KEY_SHIFT},      /* X */
+    {0x1c, KEY_SHIFT},      /* Y */
+    {0x1d, KEY_SHIFT},      /* Z */
+    {0x2f, 0},          /* [ */
+    {0x31, 0},          /* \ */
+    {0x30, 0},          /* ] */
+    {0x23, KEY_SHIFT},      /* ^ */
+    {0x2d, KEY_SHIFT},      /* _ */
+    {0x35, 0},          /* ` */
+    {0x04, 0},          /* a */
+    {0x05, 0},          /* b */
+    {0x06, 0},          /* c */
+    {0x07, 0},          /* d */
+    {0x08, 0},          /* e */
+    {0x09, 0},          /* f */
+    {0x0a, 0},          /* g */
+    {0x0b, 0},          /* h */
+    {0x0c, 0},          /* i */
+    {0x0d, 0},          /* j */
+    {0x0e, 0},          /* k */
+    {0x0f, 0},          /* l */
+    {0x10, 0},          /* m */
+    {0x11, 0},          /* n */
+    {0x12, 0},          /* o */
+    {0x13, 0},          /* p */
+    {0x14, 0},          /* q */
+    {0x15, 0},          /* r */
+    {0x16, 0},          /* s */
+    {0x17, 0},          /* t */
+    {0x18, 0},          /* u */
+    {0x19, 0},          /* v */
+    {0x1a, 0},          /* w */
+    {0x1b, 0},          /* x */
+    {0x1c, 0},          /* y */
+    {0x1d, 0},          /* z */
+    {0x2f, KEY_SHIFT},      /* { */
+    {0x31, KEY_SHIFT},      /* | */
+    {0x30, KEY_SHIFT},      /* } */
+    {0x35, KEY_SHIFT},      /* ~ */
+    {0,0},              /* DEL */
+
+    {0x3a, 0},          /* F1 */
+    {0x3b, 0},          /* F2 */
+    {0x3c, 0},          /* F3 */
+    {0x3d, 0},          /* F4 */
+    {0x3e, 0},          /* F5 */
+    {0x3f, 0},          /* F6 */
+    {0x40, 0},          /* F7 */
+    {0x41, 0},          /* F8 */
+    {0x42, 0},          /* F9 */
+    {0x43, 0},          /* F10 */
+    {0x44, 0},          /* F11 */
+    {0x45, 0},          /* F12 */
+
+    {0x46, 0},          /* PRINT_SCREEN */
+    {0x47, 0},          /* SCROLL_LOCK */
+    {0x39, 0},          /* CAPS_LOCK */
+    {0x53, 0},          /* NUM_LOCK */
+    {0x49, 0},          /* INSERT */
+    {0x4a, 0},          /* HOME */
+    {0x4b, 0},          /* PAGE_UP */
+    {0x4e, 0},          /* PAGE_DOWN */
+
+    {0x4f, 0},          /* RIGHT_ARROW */
+    {0x50, 0},          /* LEFT_ARROW */
+    {0x51, 0},          /* DOWN_ARROW */
+    {0x52, 0},          /* UP_ARROW */
+};
+
+#else
+/* UK keyboard */
+#define KEYMAP_SIZE (152)
+const KEYMAP keymap[KEYMAP_SIZE] = {
+    {0, 0},             /* NUL */
+    {0, 0},             /* SOH */
+    {0, 0},             /* STX */
+    {0, 0},             /* ETX */
+    {0, 0},             /* EOT */
+    {0, 0},             /* ENQ */
+    {0, 0},             /* ACK */
+    {0, 0},             /* BEL */
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
+    {0, 0},             /* VT  */
+    {0, 0},             /* FF  */
+    {0, 0},             /* CR  */
+    {0, 0},             /* SO  */
+    {0, 0},             /* SI  */
+    {0, 0},             /* DEL */
+    {0, 0},             /* DC1 */
+    {0, 0},             /* DC2 */
+    {0, 0},             /* DC3 */
+    {0, 0},             /* DC4 */
+    {0, 0},             /* NAK */
+    {0, 0},             /* SYN */
+    {0, 0},             /* ETB */
+    {0, 0},             /* CAN */
+    {0, 0},             /* EM  */
+    {0, 0},             /* SUB */
+    {0, 0},             /* ESC */
+    {0, 0},             /* FS  */
+    {0, 0},             /* GS  */
+    {0, 0},             /* RS  */
+    {0, 0},             /* US  */
+    {0x2c, 0},          /*   */
+    {0x1e, KEY_SHIFT},      /* ! */
+    {0x1f, KEY_SHIFT},      /* " */
+    {0x32, 0},          /* # */
+    {0x21, KEY_SHIFT},      /* $ */
+    {0x22, KEY_SHIFT},      /* % */
+    {0x24, KEY_SHIFT},      /* & */
+    {0x34, 0},          /* ' */
+    {0x26, KEY_SHIFT},      /* ( */
+    {0x27, KEY_SHIFT},      /* ) */
+    {0x25, KEY_SHIFT},      /* * */
+    {0x2e, KEY_SHIFT},      /* + */
+    {0x36, 0},          /* , */
+    {0x2d, 0},          /* - */
+    {0x37, 0},          /* . */
+    {0x38, 0},          /* / */
+    {0x27, 0},          /* 0 */
+    {0x1e, 0},          /* 1 */
+    {0x1f, 0},          /* 2 */
+    {0x20, 0},          /* 3 */
+    {0x21, 0},          /* 4 */
+    {0x22, 0},          /* 5 */
+    {0x23, 0},          /* 6 */
+    {0x24, 0},          /* 7 */
+    {0x25, 0},          /* 8 */
+    {0x26, 0},          /* 9 */
+    {0x33, KEY_SHIFT},      /* : */
+    {0x33, 0},          /* ; */
+    {0x36, KEY_SHIFT},      /* < */
+    {0x2e, 0},          /* = */
+    {0x37, KEY_SHIFT},      /* > */
+    {0x38, KEY_SHIFT},      /* ? */
+    {0x34, KEY_SHIFT},      /* @ */
+    {0x04, KEY_SHIFT},      /* A */
+    {0x05, KEY_SHIFT},      /* B */
+    {0x06, KEY_SHIFT},      /* C */
+    {0x07, KEY_SHIFT},      /* D */
+    {0x08, KEY_SHIFT},      /* E */
+    {0x09, KEY_SHIFT},      /* F */
+    {0x0a, KEY_SHIFT},      /* G */
+    {0x0b, KEY_SHIFT},      /* H */
+    {0x0c, KEY_SHIFT},      /* I */
+    {0x0d, KEY_SHIFT},      /* J */
+    {0x0e, KEY_SHIFT},      /* K */
+    {0x0f, KEY_SHIFT},      /* L */
+    {0x10, KEY_SHIFT},      /* M */
+    {0x11, KEY_SHIFT},      /* N */
+    {0x12, KEY_SHIFT},      /* O */
+    {0x13, KEY_SHIFT},      /* P */
+    {0x14, KEY_SHIFT},      /* Q */
+    {0x15, KEY_SHIFT},      /* R */
+    {0x16, KEY_SHIFT},      /* S */
+    {0x17, KEY_SHIFT},      /* T */
+    {0x18, KEY_SHIFT},      /* U */
+    {0x19, KEY_SHIFT},      /* V */
+    {0x1a, KEY_SHIFT},      /* W */
+    {0x1b, KEY_SHIFT},      /* X */
+    {0x1c, KEY_SHIFT},      /* Y */
+    {0x1d, KEY_SHIFT},      /* Z */
+    {0x2f, 0},          /* [ */
+    {0x64, 0},          /* \ */
+    {0x30, 0},          /* ] */
+    {0x23, KEY_SHIFT},      /* ^ */
+    {0x2d, KEY_SHIFT},      /* _ */
+    {0x35, 0},          /* ` */
+    {0x04, 0},          /* a */
+    {0x05, 0},          /* b */
+    {0x06, 0},          /* c */
+    {0x07, 0},          /* d */
+    {0x08, 0},          /* e */
+    {0x09, 0},          /* f */
+    {0x0a, 0},          /* g */
+    {0x0b, 0},          /* h */
+    {0x0c, 0},          /* i */
+    {0x0d, 0},          /* j */
+    {0x0e, 0},          /* k */
+    {0x0f, 0},          /* l */
+    {0x10, 0},          /* m */
+    {0x11, 0},          /* n */
+    {0x12, 0},          /* o */
+    {0x13, 0},          /* p */
+    {0x14, 0},          /* q */
+    {0x15, 0},          /* r */
+    {0x16, 0},          /* s */
+    {0x17, 0},          /* t */
+    {0x18, 0},          /* u */
+    {0x19, 0},          /* v */
+    {0x1a, 0},          /* w */
+    {0x1b, 0},          /* x */
+    {0x1c, 0},          /* y */
+    {0x1d, 0},          /* z */
+    {0x2f, KEY_SHIFT},      /* { */
+    {0x64, KEY_SHIFT},      /* | */
+    {0x30, KEY_SHIFT},      /* } */
+    {0x32, KEY_SHIFT},      /* ~ */
+    {0,0},             /* DEL */
+
+    {0x3a, 0},          /* F1 */
+    {0x3b, 0},          /* F2 */
+    {0x3c, 0},          /* F3 */
+    {0x3d, 0},          /* F4 */
+    {0x3e, 0},          /* F5 */
+    {0x3f, 0},          /* F6 */
+    {0x40, 0},          /* F7 */
+    {0x41, 0},          /* F8 */
+    {0x42, 0},          /* F9 */
+    {0x43, 0},          /* F10 */
+    {0x44, 0},          /* F11 */
+    {0x45, 0},          /* F12 */
+
+    {0x46, 0},          /* PRINT_SCREEN */
+    {0x47, 0},          /* SCROLL_LOCK */
+    {0x39, 0},          /* CAPS_LOCK */
+    {0x53, 0},          /* NUM_LOCK */
+    {0x49, 0},          /* INSERT */
+    {0x4a, 0},          /* HOME */
+    {0x4b, 0},          /* PAGE_UP */
+    {0x4e, 0},          /* PAGE_DOWN */
+
+    {0x4f, 0},          /* RIGHT_ARROW */
+    {0x50, 0},          /* LEFT_ARROW */
+    {0x51, 0},          /* DOWN_ARROW */
+    {0x52, 0},          /* UP_ARROW */
+};
+#endif
+
+
+uint8_t * USBMouseKeyboard::reportDesc() {
+    if (mouse_type == REL_MOUSE) {
+        static uint8_t reportDescriptor[] = {
+                // Keyboard
+                USAGE_PAGE(1),      0x01,
+                USAGE(1),           0x06,
+                COLLECTION(1),      0x01,
+                REPORT_ID(1),       REPORT_ID_KEYBOARD,
+                USAGE_PAGE(1),      0x07,
+                USAGE_MINIMUM(1),       0xE0,
+                USAGE_MAXIMUM(1),       0xE7,
+                LOGICAL_MINIMUM(1),     0x00,
+                LOGICAL_MAXIMUM(1),     0x01,
+                REPORT_SIZE(1),     0x01,
+                REPORT_COUNT(1),    0x08,
+                INPUT(1),           0x02,
+                REPORT_COUNT(1),    0x01,
+                REPORT_SIZE(1),     0x08,
+                INPUT(1),           0x01,
+                REPORT_COUNT(1),    0x05,
+                REPORT_SIZE(1),     0x01,
+                USAGE_PAGE(1),      0x08,
+                USAGE_MINIMUM(1),       0x01,
+                USAGE_MAXIMUM(1),       0x05,
+                OUTPUT(1),          0x02,
+                REPORT_COUNT(1),    0x01,
+                REPORT_SIZE(1),     0x03,
+                OUTPUT(1),          0x01,
+                REPORT_COUNT(1),    0x06,
+                REPORT_SIZE(1),     0x08,
+                LOGICAL_MINIMUM(1),     0x00,
+                LOGICAL_MAXIMUM(2),     0xff, 0x00,
+                USAGE_PAGE(1),      0x07,
+                USAGE_MINIMUM(1),       0x00,
+                USAGE_MAXIMUM(2),       0xff, 0x00,
+                INPUT(1),           0x00,
+                END_COLLECTION(0),
+
+                // Mouse
+                USAGE_PAGE(1),      0x01,           // Generic Desktop
+                USAGE(1),           0x02,           // Mouse
+                COLLECTION(1),      0x01,           // Application
+                USAGE(1),           0x01,           // Pointer
+                COLLECTION(1),      0x00,           // Physical
+                REPORT_ID(1),       REPORT_ID_MOUSE,
+                REPORT_COUNT(1),    0x03,
+                REPORT_SIZE(1),     0x01,
+                USAGE_PAGE(1),      0x09,           // Buttons
+                USAGE_MINIMUM(1),       0x1,
+                USAGE_MAXIMUM(1),       0x3,
+                LOGICAL_MINIMUM(1),     0x00,
+                LOGICAL_MAXIMUM(1),     0x01,
+                INPUT(1),           0x02,
+                REPORT_COUNT(1),    0x01,
+                REPORT_SIZE(1),     0x05,
+                INPUT(1),           0x01,
+                REPORT_COUNT(1),    0x03,
+                REPORT_SIZE(1),     0x08,
+                USAGE_PAGE(1),      0x01,
+                USAGE(1),           0x30,           // X
+                USAGE(1),           0x31,           // Y
+                USAGE(1),           0x38,           // scroll
+                LOGICAL_MINIMUM(1),     0x81,
+                LOGICAL_MAXIMUM(1),     0x7f,
+                INPUT(1),           0x06,
+                END_COLLECTION(0),
+                END_COLLECTION(0),
+
+
+                // Media Control
+                USAGE_PAGE(1), 0x0C,
+                USAGE(1), 0x01,
+                COLLECTION(1), 0x01,
+                REPORT_ID(1), REPORT_ID_VOLUME,
+                USAGE_PAGE(1), 0x0C,
+                LOGICAL_MINIMUM(1), 0x00,
+                LOGICAL_MAXIMUM(1), 0x01,
+                REPORT_SIZE(1), 0x01,
+                REPORT_COUNT(1), 0x07,
+                USAGE(1), 0xB5,             // Next Track
+                USAGE(1), 0xB6,             // Previous Track
+                USAGE(1), 0xB7,             // Stop
+                USAGE(1), 0xCD,             // Play / Pause
+                USAGE(1), 0xE2,             // Mute
+                USAGE(1), 0xE9,             // Volume Up
+                USAGE(1), 0xEA,             // Volume Down
+                INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
+                REPORT_COUNT(1), 0x01,
+                INPUT(1), 0x01,
+                END_COLLECTION(0),
+        };
+        reportLength = sizeof(reportDescriptor);
+        return reportDescriptor;
+    } else if (mouse_type == ABS_MOUSE) {
+        static uint8_t reportDescriptor[] = {
+
+                // Keyboard
+                USAGE_PAGE(1),      0x01,
+                USAGE(1),           0x06,
+                COLLECTION(1),      0x01,
+                REPORT_ID(1),       REPORT_ID_KEYBOARD,
+                USAGE_PAGE(1),      0x07,
+                USAGE_MINIMUM(1),       0xE0,
+                USAGE_MAXIMUM(1),       0xE7,
+                LOGICAL_MINIMUM(1),     0x00,
+                LOGICAL_MAXIMUM(1),     0x01,
+                REPORT_SIZE(1),     0x01,
+                REPORT_COUNT(1),    0x08,
+                INPUT(1),           0x02,
+                REPORT_COUNT(1),    0x01,
+                REPORT_SIZE(1),     0x08,
+                INPUT(1),           0x01,
+                REPORT_COUNT(1),    0x05,
+                REPORT_SIZE(1),     0x01,
+                USAGE_PAGE(1),      0x08,
+                USAGE_MINIMUM(1),       0x01,
+                USAGE_MAXIMUM(1),       0x05,
+                OUTPUT(1),          0x02,
+                REPORT_COUNT(1),    0x01,
+                REPORT_SIZE(1),     0x03,
+                OUTPUT(1),          0x01,
+                REPORT_COUNT(1),    0x06,
+                REPORT_SIZE(1),     0x08,
+                LOGICAL_MINIMUM(1),     0x00,
+                LOGICAL_MAXIMUM(2),     0xff, 0x00,
+                USAGE_PAGE(1),      0x07,
+                USAGE_MINIMUM(1),       0x00,
+                USAGE_MAXIMUM(2),       0xff, 0x00,
+                INPUT(1),           0x00,
+                END_COLLECTION(0),
+
+                // Mouse
+                USAGE_PAGE(1), 0x01,               // Generic Desktop
+                USAGE(1), 0x02,                    // Mouse
+                COLLECTION(1), 0x01,               // Application
+                USAGE(1), 0x01,                    // Pointer
+                COLLECTION(1), 0x00,               // Physical
+                REPORT_ID(1),       REPORT_ID_MOUSE,
+
+                USAGE_PAGE(1), 0x01,                // Generic Desktop
+                USAGE(1), 0x30,                     // X
+                USAGE(1), 0x31,                     // Y
+                LOGICAL_MINIMUM(1), 0x00,           // 0
+                LOGICAL_MAXIMUM(2), 0xff, 0x7f,     // 32767
+                REPORT_SIZE(1), 0x10,
+                REPORT_COUNT(1), 0x02,
+                INPUT(1), 0x02,                     // Data, Variable, Absolute
+
+                USAGE_PAGE(1), 0x01,                // Generic Desktop
+                USAGE(1), 0x38,                     // scroll
+                LOGICAL_MINIMUM(1), 0x81,           // -127
+                LOGICAL_MAXIMUM(1), 0x7f,           // 127
+                REPORT_SIZE(1), 0x08,
+                REPORT_COUNT(1), 0x01,
+                INPUT(1), 0x06,                     // Data, Variable, Relative
+
+                USAGE_PAGE(1), 0x09,                // Buttons
+                USAGE_MINIMUM(1), 0x01,
+                USAGE_MAXIMUM(1), 0x03,
+                LOGICAL_MINIMUM(1), 0x00,           // 0
+                LOGICAL_MAXIMUM(1), 0x01,           // 1
+                REPORT_COUNT(1), 0x03,
+                REPORT_SIZE(1), 0x01,
+                INPUT(1), 0x02,                     // Data, Variable, Absolute
+                REPORT_COUNT(1), 0x01,
+                REPORT_SIZE(1), 0x05,
+                INPUT(1), 0x01,                     // Constant
+
+                END_COLLECTION(0),
+                END_COLLECTION(0),
+
+                // Media Control
+                USAGE_PAGE(1), 0x0C,
+                USAGE(1), 0x01,
+                COLLECTION(1), 0x01,
+                REPORT_ID(1), REPORT_ID_VOLUME,
+                USAGE_PAGE(1), 0x0C,
+                LOGICAL_MINIMUM(1), 0x00,
+                LOGICAL_MAXIMUM(1), 0x01,
+                REPORT_SIZE(1), 0x01,
+                REPORT_COUNT(1), 0x07,
+                USAGE(1), 0xB5,             // Next Track
+                USAGE(1), 0xB6,             // Previous Track
+                USAGE(1), 0xB7,             // Stop
+                USAGE(1), 0xCD,             // Play / Pause
+                USAGE(1), 0xE2,             // Mute
+                USAGE(1), 0xE9,             // Volume Up
+                USAGE(1), 0xEA,             // Volume Down
+                INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
+                REPORT_COUNT(1), 0x01,
+                INPUT(1), 0x01,
+                END_COLLECTION(0),
+        };
+        reportLength = sizeof(reportDescriptor);
+        return reportDescriptor;
+    }
+
+    return NULL;
+}
+
+bool USBMouseKeyboard::EPINT_OUT_callback() {
+    uint32_t bytesRead = 0;
+    uint8_t led[65];
+    USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
+
+    // we take led[1] because led[0] is the report ID
+    lock_status = led[1] & 0x07;
+
+    // We activate the endpoint to be able to recceive data
+    if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
+        return false;
+    return true;
+}
+
+uint8_t USBMouseKeyboard::lockStatus() {
+    return lock_status;
+}
+
+bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
+    switch (mouse_type) {
+    case REL_MOUSE:
+        while (x > 127) {
+            if (!mouseSend(127, 0, button, z)) return false;
+            x = x - 127;
+        }
+        while (x < -128) {
+            if (!mouseSend(-128, 0, button, z)) return false;
+            x = x + 128;
+        }
+        while (y > 127) {
+            if (!mouseSend(0, 127, button, z)) return false;
+            y = y - 127;
+        }
+        while (y < -128) {
+            if (!mouseSend(0, -128, button, z)) return false;
+            y = y + 128;
+        }
+        return mouseSend(x, y, button, z);
+    case ABS_MOUSE:
+        HID_REPORT report;
+
+        report.data[0] = REPORT_ID_MOUSE;
+        report.data[1] = x & 0xff;
+        report.data[2] = (x >> 8) & 0xff;
+        report.data[3] = y & 0xff;
+        report.data[4] = (y >> 8) & 0xff;
+        report.data[5] = -z;
+        report.data[6] = button & 0x07;
+
+        report.length = 7;
+
+        return send(&report);
+    default:
+        return false;
+    }
+}
+
+bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
+    HID_REPORT report;
+    report.data[0] = REPORT_ID_MOUSE;
+    report.data[1] = buttons & 0x07;
+    report.data[2] = x;
+    report.data[3] = y;
+    report.data[4] = -z; // >0 to scroll down, <0 to scroll up
+
+    report.length = 5;
+
+    return send(&report);
+}
+
+bool USBMouseKeyboard::move(int16_t x, int16_t y) {
+    return update(x, y, button, 0);
+}
+
+bool USBMouseKeyboard::scroll(int8_t z) {
+    return update(0, 0, button, z);
+}
+
+bool USBMouseKeyboard::doubleClick() {
+    if (!click(MOUSE_LEFT))
+        return false;
+    wait(0.1);
+    return click(MOUSE_LEFT);
+}
+
+bool USBMouseKeyboard::click(uint8_t button) {
+    if (!update(0, 0, button, 0))
+        return false;
+    wait(0.01);
+    return update(0, 0, 0, 0);
+}
+
+bool USBMouseKeyboard::press(uint8_t button_) {
+    button = button_ & 0x07;
+    return update(0, 0, button, 0);
+}
+
+bool USBMouseKeyboard::release(uint8_t button_) {
+    button = (button & (~button_)) & 0x07;
+    return update(0, 0, button, 0);
+}
+
+int USBMouseKeyboard::_putc(int c) {
+    return keyCode(c, keymap[c].modifier);
+}
+
+bool USBMouseKeyboard::keyCode(uint8_t key, uint8_t modifier) {
+    // Send a simulated keyboard keypress. Returns true if successful.
+
+    HID_REPORT report;
+
+    report.data[0] = REPORT_ID_KEYBOARD;
+    report.data[1] = modifier;
+    report.data[2] = 0;
+    report.data[3] = keymap[key].usage;
+    report.data[4] = 0;
+    report.data[5] = 0;
+    report.data[6] = 0;
+    report.data[7] = 0;
+    report.data[8] = 0;
+
+    report.length = 9;
+
+    if (!send(&report)) {
+        return false;
+    }
+
+    report.data[1] = 0;
+    report.data[3] = 0;
+
+    if (!send(&report)) {
+        return false;
+    }
+
+    return true;
+
+}
+
+
+bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {
+    HID_REPORT report;
+
+    report.data[0] = REPORT_ID_VOLUME;
+    report.data[1] = (1 << key) & 0x7f;
+
+    report.length = 2;
+
+    send(&report);
+
+    report.data[0] = REPORT_ID_VOLUME;
+    report.data[1] = 0;
+
+    report.length = 2;
+
+    return send(&report);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBHID/USBMouseKeyboard.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,220 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBMOUSEKEYBOARD_H
+#define USBMOUSEKEYBOARD_H
+
+#define REPORT_ID_KEYBOARD 1
+#define REPORT_ID_MOUSE 2
+#define REPORT_ID_VOLUME 3
+
+#include "USBMouse.h"
+#include "USBKeyboard.h"
+#include "Stream.h"
+#include "USBHID.h"
+
+/**
+ * USBMouseKeyboard example
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "USBMouseKeyboard.h"
+ *
+ * USBMouseKeyboard key_mouse;
+ *
+ * int main(void)
+ * {
+ *   while(1)
+ *   {
+ *       key_mouse.move(20, 0);
+ *       key_mouse.printf("Hello From MBED\r\n");
+ *       wait(1);
+ *   }
+ * }
+ * @endcode
+ *
+ *
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "USBMouseKeyboard.h"
+ *
+ * USBMouseKeyboard key_mouse(ABS_MOUSE);
+ *
+ * int main(void)
+ * {
+ *   while(1)
+ *   {
+ *       key_mouse.move(X_MAX_ABS/2, Y_MAX_ABS/2);
+ *       key_mouse.printf("Hello from MBED\r\n");
+ *       wait(1);
+ *   }
+ * }
+ * @endcode
+ */
+class USBMouseKeyboard: public USBHID, public Stream
+{
+    public:
+
+        /**
+        *   Constructor
+        *
+        * @param mouse_type Mouse type: ABS_MOUSE (absolute mouse) or REL_MOUSE (relative mouse) (default: REL_MOUSE)
+        * @param leds Leds bus: first: NUM_LOCK, second: CAPS_LOCK, third: SCROLL_LOCK
+        * @param vendor_id Your vendor_id (default: 0x1234)
+        * @param product_id Your product_id (default: 0x0001)
+        * @param product_release Your preoduct_release (default: 0x0001)
+        *
+        */
+        USBMouseKeyboard(MOUSE_TYPE mouse_type = REL_MOUSE, uint16_t vendor_id = 0x0021, uint16_t product_id = 0x0011, uint16_t product_release = 0x0001):
+            USBHID(0, 0, vendor_id, product_id, product_release, false)
+            {
+                lock_status = 0;
+                button = 0;
+                this->mouse_type = mouse_type;
+                connect();
+            };
+
+        /**
+        * Write a state of the mouse
+        *
+        * @param x x-axis position
+        * @param y y-axis position
+        * @param buttons buttons state (first bit represents MOUSE_LEFT, second bit MOUSE_RIGHT and third bit MOUSE_MIDDLE)
+        * @param z wheel state (>0 to scroll down, <0 to scroll up)
+        * @returns true if there is no error, false otherwise
+        */
+        bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
+
+
+        /**
+        * Move the cursor to (x, y)
+        *
+        * @param x x-axis position
+        * @param y y-axis position
+        * @returns true if there is no error, false otherwise
+        */
+        bool move(int16_t x, int16_t y);
+
+        /**
+        * Press one or several buttons
+        *
+        * @param button button state (ex: press(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool press(uint8_t button);
+
+        /**
+        * Release one or several buttons
+        *
+        * @param button button state (ex: release(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool release(uint8_t button);
+
+        /**
+        * Double click (MOUSE_LEFT)
+        *
+        * @returns true if there is no error, false otherwise
+        */
+        bool doubleClick();
+
+        /**
+        * Click
+        *
+        * @param button state of the buttons ( ex: clic(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool click(uint8_t button);
+
+        /**
+        * Scrolling
+        *
+        * @param z value of the wheel (>0 to go down, <0 to go up)
+        * @returns true if there is no error, false otherwise
+        */
+        bool scroll(int8_t z);
+
+        /**
+        * To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key
+        *
+        * @code
+        * //To send CTRL + s (save)
+        *  keyboard.keyCode('s', KEY_CTRL);
+        * @endcode
+        *
+        * @param modifier bit 0: KEY_CTRL, bit 1: KEY_SHIFT, bit 2: KEY_ALT (default: 0)
+        * @param key character to send
+        * @returns true if there is no error, false otherwise
+        */
+        bool keyCode(uint8_t key, uint8_t modifier = 0);
+
+        /**
+        * Send a character
+        *
+        * @param c character to be sent
+        * @returns true if there is no error, false otherwise
+        */
+        virtual int _putc(int c);
+
+        /**
+        * Control media keys
+        *
+        * @param key media key pressed (KEY_NEXT_TRACK, KEY_PREVIOUS_TRACK, KEY_STOP, KEY_PLAY_PAUSE, KEY_MUTE, KEY_VOLUME_UP, KEY_VOLUME_DOWN)
+        * @returns true if there is no error, false otherwise
+        */
+        bool mediaControl(MEDIA_KEY key);
+
+        /**
+        * Read status of lock keys. Useful to switch-on/off leds according to key pressed. Only the first three bits of the result is important:
+        *   - First bit: NUM_LOCK
+        *   - Second bit: CAPS_LOCK
+        *   - Third bit: SCROLL_LOCK
+        *
+        * @returns status of lock keys
+        */
+        uint8_t lockStatus();
+
+        /*
+        * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+        *
+        * @returns pointer to the report descriptor
+        */
+        virtual uint8_t * reportDesc();
+
+        /*
+        * Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
+        *
+        * @returns if handle by subclass, return true
+        */
+        virtual bool EPINT_OUT_callback();
+
+
+    private:
+        bool mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z);
+        MOUSE_TYPE mouse_type;
+        uint8_t button;
+        bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
+
+        uint8_t lock_status;
+
+        //dummy otherwise it doesn't compile (we must define all methods of an abstract class)
+        virtual int _getc() { return -1;}
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBMIDI/MIDIMessage.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,276 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef MIDIMESSAGE_H
+#define MIDIMESSAGE_H
+
+#include "mbed.h"
+
+#define MAX_MIDI_MESSAGE_SIZE 256 // Max message size. SysEx can be up to 65536 but 256 should be fine for most usage
+
+// MIDI Message Format
+//
+// [ msg(4) | channel(4) ] [ 0 | n(7) ] [ 0 | m(7) ]
+//
+// MIDI Data Messages (Channel Specific)
+//
+// Message               msg n          m
+// ---------------------------------------------
+// Note Off              0x8 Key        Velocity
+// Note On               0x9 Key        Velocity
+// Polyphonic Aftertouch 0xA Key        Pressure
+// Control Change        0xB Controller Value
+// Program Change        0xC Program    -
+// Channel Aftertouch    0xD Pressure   -
+// Pitch Wheel           0xE LSB        MSB
+
+#define CABLE_NUM (0<<4)
+
+/** A MIDI message container */
+class MIDIMessage {
+public:
+    MIDIMessage() : length(4) {}
+
+    MIDIMessage(uint8_t *buf) : length(4) {
+        for (int i = 0; i < 4; i++)
+            data[i] = buf[i];
+    }
+
+    // New constructor, buf is a true MIDI message (not USBMidi message) and buf_len true message length.
+    MIDIMessage(uint8_t *buf, int buf_len) {
+        length=buf_len+1;
+        // first byte keeped for retro-compatibility
+        data[0]=0;
+
+        for (int i = 0; i < buf_len; i++)
+            data[i+1] = buf[i];
+    }
+
+    // create messages
+
+    /** Create a NoteOff message
+     * @param key Key ID
+     * @param velocity Key velocity (0-127, default = 127)
+     * @param channel Key channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage NoteOff(int key, int velocity = 127, int channel = 0) {
+        MIDIMessage msg;
+        msg.data[0] = CABLE_NUM | 0x08;
+        msg.data[1] = 0x80 | (channel & 0x0F);
+        msg.data[2] = key & 0x7F;
+        msg.data[3] = velocity & 0x7F;
+        return msg;
+    }
+
+    /** Create a NoteOn message
+     * @param key Key ID
+     * @param velocity Key velocity (0-127, default = 127)
+     * @param channel Key channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage NoteOn(int key, int velocity = 127, int channel = 0) {
+        MIDIMessage msg;
+        msg.data[0] = CABLE_NUM | 0x09;
+        msg.data[1] = 0x90 | (channel & 0x0F);
+        msg.data[2] = key & 0x7F;
+        msg.data[3] = velocity & 0x7F;
+        return msg;
+    }
+
+    /** Create a PolyPhonic Aftertouch message
+     * @param key Key ID
+     * @param pressure Aftertouch pressure (0-127)
+     * @param channel Key channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage PolyphonicAftertouch(int key, int pressure, int channel = 0) {
+        MIDIMessage msg;
+        msg.data[0] = CABLE_NUM | 0x0A;
+        msg.data[1] = 0xA0 | (channel & 0x0F);
+        msg.data[2] = key & 0x7F;
+        msg.data[3] = pressure & 0x7F;
+        return msg;
+    }
+
+    /** Create a Control Change message
+     * @param control Controller ID
+     * @param value Controller value (0-127)
+     * @param channel Controller channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage ControlChange(int control, int value, int channel = 0) {
+        MIDIMessage msg;
+        msg.data[0] = CABLE_NUM | 0x0B;
+        msg.data[1] = 0xB0 | (channel & 0x0F);
+        msg.data[2] = control & 0x7F;
+        msg.data[3] = value & 0x7F;
+        return msg;
+    }
+
+    /** Create a Program Change message
+     * @param program Program ID
+     * @param channel Channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage ProgramChange(int program, int channel = 0) {
+        MIDIMessage msg;
+        msg.data[0] = CABLE_NUM | 0x0C;
+        msg.data[1] = 0xC0 | (channel & 0x0F);
+        msg.data[2] = program & 0x7F;
+        msg.data[3] = 0x00;
+        return msg;
+    }
+
+    /** Create a Channel Aftertouch message
+     * @param pressure Pressure
+     * @param channel Key channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage ChannelAftertouch(int pressure, int channel = 0) {
+        MIDIMessage msg;
+        msg.data[0] = CABLE_NUM | 0x0D;
+        msg.data[1] = 0xD0 | (channel & 0x0F);
+        msg.data[2] = pressure & 0x7F;
+        msg.data[3] = 0x00;
+        return msg;
+    }
+
+    /** Create a Pitch Wheel message
+     * @param pitch Pitch (-8192 - 8191, default = 0)
+     * @param channel Channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage PitchWheel(int pitch = 0, int channel = 0) {
+        MIDIMessage msg;
+        int p = pitch + 8192;    // 0 - 16383, 8192 is center
+        msg.data[0] = CABLE_NUM | 0x0E;
+        msg.data[1] = 0xE0 | (channel & 0x0F);
+        msg.data[2] = p & 0x7F;
+        msg.data[3] = (p >> 7) & 0x7F;
+        return msg;
+    }
+
+    /** Create an All Notes Off message
+     * @param channel Channel (0-15, default 0)
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage AllNotesOff(int channel = 0) {
+        return ControlChange(123, 0, channel);
+    }
+
+     /** Create a SysEx message
+     * @param data SysEx data (including 0xF0 .. 0xF7)
+     * @param len SysEx data length
+     * @returns A MIDIMessage
+     */
+    static MIDIMessage SysEx(uint8_t *data, int len) {
+        MIDIMessage msg=MIDIMessage(data,len);
+        return msg;
+    }
+
+    // decode messages
+
+    /** MIDI Message Types */
+    enum MIDIMessageType {
+        ErrorType,
+        NoteOffType,
+        NoteOnType,
+        PolyphonicAftertouchType,
+        ControlChangeType,
+        ProgramChangeType,
+        ChannelAftertouchType,
+        PitchWheelType,
+        AllNotesOffType,
+        SysExType
+    };
+
+    /** Read the message type
+     * @returns MIDIMessageType
+     */
+    MIDIMessageType type() {
+        switch((data[1] >> 4) & 0xF) {
+            case 0x8: return NoteOffType;
+            case 0x9: return NoteOnType;
+            case 0xA: return PolyphonicAftertouchType;
+            case 0xB:
+                if(controller() < 120) { // standard controllers
+                    return ControlChangeType;
+                } else if(controller() == 123) {
+                    return AllNotesOffType;
+                } else {
+                    return ErrorType; // unsupported atm
+                }
+            case 0xC: return ProgramChangeType;
+            case 0xD: return ChannelAftertouchType;
+            case 0xE: return PitchWheelType;
+            case 0xF: return SysExType;
+            default: return ErrorType;
+        }
+    }
+
+    /** Read the channel number */
+    int channel() {
+        return (data[1] & 0x0F);
+    }
+
+    /** Read the key ID */
+    int key() {
+        return (data[2] & 0x7F);
+    }
+
+    /** Read the velocity */
+    int velocity() {
+        return (data[3] & 0x7F);
+    }
+
+    /** Read the controller value */
+    int value() {
+        return (data[3] & 0x7F);
+    }
+
+    /** Read the aftertouch pressure */
+    int pressure() {
+        if(type() == PolyphonicAftertouchType) {
+            return (data[3] & 0x7F);
+        } else {
+            return (data[2] & 0x7F);
+        }
+    }
+
+    /** Read the controller number */
+    int controller() {
+        return (data[2] & 0x7F);
+    }
+
+    /** Read the program number */
+    int program() {
+        return (data[2] & 0x7F);
+    }
+
+    /** Read the pitch value */
+    int pitch() {
+        int p = ((data[3] & 0x7F) << 7) | (data[2] & 0x7F);
+        return p - 8192; // 0 - 16383, 8192 is center
+    }
+
+    uint8_t data[MAX_MIDI_MESSAGE_SIZE+1];
+    uint8_t length;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBMIDI/USBMIDI.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,207 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBMIDI.h"
+
+
+USBMIDI::USBMIDI(uint16_t vendor_id, uint16_t product_id, uint16_t product_release)
+ : USBDevice(vendor_id, product_id, product_release), cur_data(0), data_end(true)
+{
+    midi_evt = NULL;
+    USBDevice::connect();
+}
+
+// write plain MIDIMessage that will be converted to USBMidi event packet
+void USBMIDI::write(MIDIMessage m) {
+    // first byte keeped for retro-compatibility
+    for(int p=1; p < m.length; p+=3) {
+        uint8_t buf[4];
+        // Midi message to USBMidi event packet
+        buf[0]=m.data[1] >> 4;
+        // SysEx
+        if(buf[0] == 0xF) {
+            if((m.length - p) > 3) {
+                // SysEx start or continue
+                buf[0]=0x4;
+            } else {
+                switch(m.length - p) {
+                    case 1:
+                        // SysEx end with one byte
+                        buf[0]=0x5;
+                        break;
+                    case 2:
+                        // SysEx end with two bytes
+                        buf[0]=0x6;
+                        break;
+                    case 3:
+                        // SysEx end with three bytes
+                        buf[0]=0x7;
+                        break;
+                }
+            }
+        }
+        buf[1]=m.data[p];
+
+        if(p+1 < m.length)
+            buf[2]=m.data[p+1];
+        else
+            buf[2]=0;
+
+        if(p+2 < m.length)
+            buf[3]=m.data[p+2];
+        else
+            buf[3]=0;
+
+        USBDevice::write(EPBULK_IN, buf, 4, MAX_PACKET_SIZE_EPBULK);
+    }
+}
+
+
+void USBMIDI::attach(void (*fptr)(MIDIMessage)) {
+    midi_evt = fptr;
+}
+
+bool USBMIDI::EPBULK_OUT_callback() {
+    uint8_t buf[64];
+    uint32_t len;
+    readEP(EPBULK_OUT, buf, &len, 64);
+
+    if (midi_evt != NULL) {
+        for (uint32_t i=0; i<len; i+=4) {   
+            uint8_t data_read;
+            data_end=true;
+            switch(buf[i]) {
+            case 0x2:
+                // Two-bytes System Common Message - undefined in USBMidi 1.0
+                data_read=2;
+                break;
+            case 0x4:
+                // SysEx start or continue
+                data_end=false;
+                data_read=3;
+                break;
+            case 0x5:
+                 // Single-byte System Common Message or SysEx end with one byte
+                data_read=1;
+                break;
+            case 0x6:
+                // SysEx end with two bytes
+                data_read=2;
+                break;
+            case 0xC:
+                // Program change
+                data_read=2;
+                break;
+            case 0xD:
+                // Channel pressure
+                data_read=2;
+                break;      
+            case 0xF:
+                // Single byte
+                data_read=1;
+                break;    
+            default:
+                // Others three-bytes messages
+                data_read=3;
+                break;      
+            } 
+        
+            for(uint8_t j=1;j<data_read+1;j++) {
+                data[cur_data]=buf[i+j];
+                cur_data++;
+            }
+        
+            if(data_end) {
+                 midi_evt(MIDIMessage(data,cur_data));
+                 cur_data=0;            
+            }
+       }
+    }
+
+    // We reactivate the endpoint to receive next characters
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+    return true;
+}
+
+// Called in ISR context
+// Set configuration. Return false if the
+// configuration is not supported.
+bool USBMIDI::USBCallback_setConfiguration(uint8_t configuration) {
+    if (configuration != DEFAULT_CONFIGURATION) {
+        return false;
+    }
+
+    // Configure endpoints > 0
+    addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
+    addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+
+    // We activate the endpoint to be able to receive data
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+    return true;
+}
+
+
+uint8_t * USBMIDI::stringIinterfaceDesc() {
+    static uint8_t stringIinterfaceDescriptor[] = {
+        0x0c,                           //bLength
+        STRING_DESCRIPTOR,              //bDescriptorType 0x03
+        'A',0,'u',0,'d',0,'i',0,'o',0   //bString iInterface - Audio
+    };
+    return stringIinterfaceDescriptor;
+}
+
+uint8_t * USBMIDI::stringIproductDesc() {
+    static uint8_t stringIproductDescriptor[] = {
+        0x16,                                                       //bLength
+        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
+        'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
+    };
+    return stringIproductDescriptor;
+}
+
+
+uint8_t * USBMIDI::configurationDesc() {
+    static uint8_t configDescriptor[] = {
+        // configuration descriptor
+        0x09, 0x02, 0x65, 0x00, 0x02, 0x01, 0x00, 0xc0, 0x50,
+
+        // The Audio Interface Collection
+        0x09, 0x04, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, // Standard AC Interface Descriptor
+        0x09, 0x24, 0x01, 0x00, 0x01, 0x09, 0x00, 0x01, 0x01, // Class-specific AC Interface Descriptor
+        0x09, 0x04, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, // MIDIStreaming Interface Descriptors
+        0x07, 0x24, 0x01, 0x00, 0x01, 0x41, 0x00,             // Class-Specific MS Interface Header Descriptor
+
+        // MIDI IN JACKS
+        0x06, 0x24, 0x02, 0x01, 0x01, 0x00,
+        0x06, 0x24, 0x02, 0x02, 0x02, 0x00,
+
+        // MIDI OUT JACKS
+        0x09, 0x24, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x00,
+        0x09, 0x24, 0x03, 0x02, 0x06, 0x01, 0x01, 0x01, 0x00,
+
+        // OUT endpoint descriptor
+        0x09, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,
+        0x05, 0x25, 0x01, 0x01, 0x01,
+
+        // IN endpoint descriptor
+        0x09, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,
+        0x05, 0x25, 0x01, 0x01, 0x03,
+    };
+    return configDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBMIDI/USBMIDI.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,112 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBMIDI_H
+#define USBMIDI_H
+
+/* These headers are included for child class. */
+#include "USBEndpoints.h"
+#include "USBDescriptor.h"
+#include "USBDevice_Types.h"
+
+#include "USBDevice.h"
+#include "MIDIMessage.h"
+
+#define DEFAULT_CONFIGURATION (1)
+
+/**
+* USBMIDI example
+*
+* @code
+* #include "mbed.h"
+* #include "USBMIDI.h"
+*
+* USBMIDI midi;
+*
+* int main() {
+*    while (1) {
+*        for(int i=48; i<83; i++) {     // send some messages!
+*            midi.write(MIDIMessage::NoteOn(i));
+*            wait(0.25);
+*            midi.write(MIDIMessage::NoteOff(i));
+*            wait(0.5);
+*        }
+*    }
+* }
+* @endcode
+*/
+class USBMIDI: public USBDevice {
+public:
+
+    /**
+    * Constructor
+    *
+    * @param vendor_id Your vendor_id
+    * @param product_id Your product_id
+    * @param product_release Your preoduct_release
+    */
+    USBMIDI(uint16_t vendor_id = 0x0700, uint16_t product_id = 0x0101, uint16_t product_release = 0x0001);
+
+    /**
+     * Send a MIDIMessage
+     *
+     * @param m The MIDIMessage to send
+     */
+    void write(MIDIMessage m);
+
+    /**
+     * Attach a callback for when a MIDIEvent is received
+     *
+     * @param fptr function pointer
+     */
+    void attach(void (*fptr)(MIDIMessage));
+
+
+protected:
+    virtual bool EPBULK_OUT_callback();
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);
+    /*
+    * Get string product descriptor
+    *
+    * @returns pointer to the string product descriptor
+    */
+    virtual uint8_t * stringIproductDesc();
+
+    /*
+    * Get string interface descriptor
+    *
+    * @returns pointer to the string interface descriptor
+    */
+    virtual uint8_t * stringIinterfaceDesc();
+
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc();
+
+private:
+    uint8_t data[MAX_MIDI_MESSAGE_SIZE+1];
+    uint8_t cur_data;
+    bool data_end;
+    
+    void (*midi_evt)(MIDIMessage);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBMSD/USBMSD.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,655 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBMSD.h"
+
+#define DISK_OK         0x00
+#define NO_INIT         0x01
+#define NO_DISK         0x02
+#define WRITE_PROTECT   0x04
+
+#define CBW_Signature   0x43425355
+#define CSW_Signature   0x53425355
+
+// SCSI Commands
+#define TEST_UNIT_READY            0x00
+#define REQUEST_SENSE              0x03
+#define FORMAT_UNIT                0x04
+#define INQUIRY                    0x12
+#define MODE_SELECT6               0x15
+#define MODE_SENSE6                0x1A
+#define START_STOP_UNIT            0x1B
+#define MEDIA_REMOVAL              0x1E
+#define READ_FORMAT_CAPACITIES     0x23
+#define READ_CAPACITY              0x25
+#define READ10                     0x28
+#define WRITE10                    0x2A
+#define VERIFY10                   0x2F
+#define READ12                     0xA8
+#define WRITE12                    0xAA
+#define MODE_SELECT10              0x55
+#define MODE_SENSE10               0x5A
+
+// MSC class specific requests
+#define MSC_REQUEST_RESET          0xFF
+#define MSC_REQUEST_GET_MAX_LUN    0xFE
+
+#define DEFAULT_CONFIGURATION (1)
+
+// max packet size
+#define MAX_PACKET  MAX_PACKET_SIZE_EPBULK
+
+// CSW Status
+enum Status {
+    CSW_PASSED,
+    CSW_FAILED,
+    CSW_ERROR,
+};
+
+
+USBMSD::USBMSD(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
+    stage = READ_CBW;
+    memset((void *)&cbw, 0, sizeof(CBW));
+    memset((void *)&csw, 0, sizeof(CSW));
+    page = NULL;
+}
+
+USBMSD::~USBMSD() {
+    disconnect();
+}
+
+
+// Called in ISR context to process a class specific request
+bool USBMSD::USBCallback_request(void) {
+
+    bool success = false;
+    CONTROL_TRANSFER * transfer = getTransferPtr();
+    static uint8_t maxLUN[1] = {0};
+
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
+        switch (transfer->setup.bRequest) {
+            case MSC_REQUEST_RESET:
+                reset();
+                success = true;
+                break;
+            case MSC_REQUEST_GET_MAX_LUN:
+                transfer->remaining = 1;
+                transfer->ptr = maxLUN;
+                transfer->direction = DEVICE_TO_HOST;
+                success = true;
+                break;
+            default:
+                break;
+        }
+    }
+
+    return success;
+}
+
+
+bool USBMSD::connect(bool blocking) {
+    //disk initialization
+    if (disk_status() & NO_INIT) {
+        if (disk_initialize()) {
+            return false;
+        }
+    }
+
+    // get number of blocks
+    BlockCount = disk_sectors();
+
+    // get memory size
+    MemorySize = disk_size();
+
+    if (BlockCount > 0) {
+        BlockSize = MemorySize / BlockCount;
+        if (BlockSize != 0) {
+            free(page);
+            page = (uint8_t *)malloc(BlockSize * sizeof(uint8_t));
+            if (page == NULL)
+                return false;
+        }
+    } else {
+        return false;
+    }
+
+    //connect the device
+    USBDevice::connect(blocking);
+    return true;
+}
+
+void USBMSD::disconnect() {
+    USBDevice::disconnect();
+    //De-allocate MSD page size:
+    free(page);
+    page = NULL;
+}
+
+void USBMSD::reset() {
+    stage = READ_CBW;
+}
+
+
+// Called in ISR context called when a data is received
+bool USBMSD::EPBULK_OUT_callback() {
+    uint32_t size = 0;
+    uint8_t buf[MAX_PACKET_SIZE_EPBULK];
+    readEP(EPBULK_OUT, buf, &size, MAX_PACKET_SIZE_EPBULK);
+    switch (stage) {
+            // the device has to decode the CBW received
+        case READ_CBW:
+            CBWDecode(buf, size);
+            break;
+
+            // the device has to receive data from the host
+        case PROCESS_CBW:
+            switch (cbw.CB[0]) {
+                case WRITE10:
+                case WRITE12:
+                    memoryWrite(buf, size);
+                    break;
+                case VERIFY10:
+                    memoryVerify(buf, size);
+                    break;
+            }
+            break;
+
+            // an error has occured: stall endpoint and send CSW
+        default:
+            stallEndpoint(EPBULK_OUT);
+            csw.Status = CSW_ERROR;
+            sendCSW();
+            break;
+    }
+
+    //reactivate readings on the OUT bulk endpoint
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+    return true;
+}
+
+// Called in ISR context when a data has been transferred
+bool USBMSD::EPBULK_IN_callback() {
+    switch (stage) {
+
+            // the device has to send data to the host
+        case PROCESS_CBW:
+            switch (cbw.CB[0]) {
+                case READ10:
+                case READ12:
+                    memoryRead();
+                    break;
+            }
+            break;
+
+            //the device has to send a CSW
+        case SEND_CSW:
+            sendCSW();
+            break;
+
+        // the host has received the CSW -> we wait a CBW
+        case WAIT_CSW:
+            stage = READ_CBW;
+            break;
+
+        // an error has occured
+        default:
+            stallEndpoint(EPBULK_IN);
+            sendCSW();
+            break;
+    }
+    return true;
+}
+
+
+void USBMSD::memoryWrite (uint8_t * buf, uint16_t size) {
+
+    if ((addr + size) > MemorySize) {
+        size = MemorySize - addr;
+        stage = ERROR;
+        stallEndpoint(EPBULK_OUT);
+    }
+
+    // we fill an array in RAM of 1 block before writing it in memory
+    for (int i = 0; i < size; i++)
+        page[addr%BlockSize + i] = buf[i];
+
+    // if the array is filled, write it in memory
+    if (!((addr + size)%BlockSize)) {
+        if (!(disk_status() & WRITE_PROTECT)) {
+            disk_write(page, addr/BlockSize, 1);
+        }
+    }
+
+    addr += size;
+    length -= size;
+    csw.DataResidue -= size;
+
+    if ((!length) || (stage != PROCESS_CBW)) {
+        csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
+        sendCSW();
+    }
+}
+
+void USBMSD::memoryVerify (uint8_t * buf, uint16_t size) {
+    uint32_t n;
+
+    if ((addr + size) > MemorySize) {
+        size = MemorySize - addr;
+        stage = ERROR;
+        stallEndpoint(EPBULK_OUT);
+    }
+
+    // beginning of a new block -> load a whole block in RAM
+    if (!(addr%BlockSize))
+        disk_read(page, addr/BlockSize, 1);
+
+    // info are in RAM -> no need to re-read memory
+    for (n = 0; n < size; n++) {
+        if (page[addr%BlockSize + n] != buf[n]) {
+            memOK = false;
+            break;
+        }
+    }
+
+    addr += size;
+    length -= size;
+    csw.DataResidue -= size;
+
+    if ( !length || (stage != PROCESS_CBW)) {
+        csw.Status = (memOK && (stage == PROCESS_CBW)) ? CSW_PASSED : CSW_FAILED;
+        sendCSW();
+    }
+}
+
+
+bool USBMSD::inquiryRequest (void) {
+    uint8_t inquiry[] = { 0x00, 0x80, 0x00, 0x01,
+                          36 - 4, 0x80, 0x00, 0x00,
+                          'M', 'B', 'E', 'D', '.', 'O', 'R', 'G',
+                          'M', 'B', 'E', 'D', ' ', 'U', 'S', 'B', ' ', 'D', 'I', 'S', 'K', ' ', ' ', ' ',
+                          '1', '.', '0', ' ',
+                        };
+    if (!write(inquiry, sizeof(inquiry))) {
+        return false;
+    }
+    return true;
+}
+
+
+bool USBMSD::readFormatCapacity() {
+    uint8_t capacity[] = { 0x00, 0x00, 0x00, 0x08,
+                           (uint8_t)((BlockCount >> 24) & 0xff),
+                           (uint8_t)((BlockCount >> 16) & 0xff),
+                           (uint8_t)((BlockCount >> 8) & 0xff),
+                           (uint8_t)((BlockCount >> 0) & 0xff),
+
+                           0x02,
+                           (uint8_t)((BlockSize >> 16) & 0xff),
+                           (uint8_t)((BlockSize >> 8) & 0xff),
+                           (uint8_t)((BlockSize >> 0) & 0xff),
+                         };
+    if (!write(capacity, sizeof(capacity))) {
+        return false;
+    }
+    return true;
+}
+
+
+bool USBMSD::readCapacity (void) {
+    uint8_t capacity[] = {
+        (uint8_t)(((BlockCount - 1) >> 24) & 0xff),
+        (uint8_t)(((BlockCount - 1) >> 16) & 0xff),
+        (uint8_t)(((BlockCount - 1) >> 8) & 0xff),
+        (uint8_t)(((BlockCount - 1) >> 0) & 0xff),
+
+        (uint8_t)((BlockSize >> 24) & 0xff),
+        (uint8_t)((BlockSize >> 16) & 0xff),
+        (uint8_t)((BlockSize >> 8) & 0xff),
+        (uint8_t)((BlockSize >> 0) & 0xff),
+    };
+    if (!write(capacity, sizeof(capacity))) {
+        return false;
+    }
+    return true;
+}
+
+bool USBMSD::write (uint8_t * buf, uint16_t size) {
+
+    if (size >= cbw.DataLength) {
+        size = cbw.DataLength;
+    }
+    stage = SEND_CSW;
+
+    if (!writeNB(EPBULK_IN, buf, size, MAX_PACKET_SIZE_EPBULK)) {
+        return false;
+    }
+
+    csw.DataResidue -= size;
+    csw.Status = CSW_PASSED;
+    return true;
+}
+
+
+bool USBMSD::modeSense6 (void) {
+    uint8_t sense6[] = { 0x03, 0x00, 0x00, 0x00 };
+    if (!write(sense6, sizeof(sense6))) {
+        return false;
+    }
+    return true;
+}
+
+void USBMSD::sendCSW() {
+    csw.Signature = CSW_Signature;
+    writeNB(EPBULK_IN, (uint8_t *)&csw, sizeof(CSW), MAX_PACKET_SIZE_EPBULK);
+    stage = WAIT_CSW;
+}
+
+bool USBMSD::requestSense (void) {
+    uint8_t request_sense[] = {
+        0x70,
+        0x00,
+        0x05,   // Sense Key: illegal request
+        0x00,
+        0x00,
+        0x00,
+        0x00,
+        0x0A,
+        0x00,
+        0x00,
+        0x00,
+        0x00,
+        0x30,
+        0x01,
+        0x00,
+        0x00,
+        0x00,
+        0x00,
+    };
+
+    if (!write(request_sense, sizeof(request_sense))) {
+        return false;
+    }
+
+    return true;
+}
+
+void USBMSD::fail() {
+    csw.Status = CSW_FAILED;
+    sendCSW();
+}
+
+
+void USBMSD::CBWDecode(uint8_t * buf, uint16_t size) {
+    if (size == sizeof(cbw)) {
+        memcpy((uint8_t *)&cbw, buf, size);
+        if (cbw.Signature == CBW_Signature) {
+            csw.Tag = cbw.Tag;
+            csw.DataResidue = cbw.DataLength;
+            if ((cbw.CBLength <  1) || (cbw.CBLength > 16) ) {
+                fail();
+            } else {
+                switch (cbw.CB[0]) {
+                    case TEST_UNIT_READY:
+                        testUnitReady();
+                        break;
+                    case REQUEST_SENSE:
+                        requestSense();
+                        break;
+                    case INQUIRY:
+                        inquiryRequest();
+                        break;
+                    case MODE_SENSE6:
+                        modeSense6();
+                        break;
+                    case READ_FORMAT_CAPACITIES:
+                        readFormatCapacity();
+                        break;
+                    case READ_CAPACITY:
+                        readCapacity();
+                        break;
+                    case READ10:
+                    case READ12:
+                        if (infoTransfer()) {
+                            if ((cbw.Flags & 0x80)) {
+                                stage = PROCESS_CBW;
+                                memoryRead();
+                            } else {
+                                stallEndpoint(EPBULK_OUT);
+                                csw.Status = CSW_ERROR;
+                                sendCSW();
+                            }
+                        }
+                        break;
+                    case WRITE10:
+                    case WRITE12:
+                        if (infoTransfer()) {
+                            if (!(cbw.Flags & 0x80)) {
+                                stage = PROCESS_CBW;
+                            } else {
+                                stallEndpoint(EPBULK_IN);
+                                csw.Status = CSW_ERROR;
+                                sendCSW();
+                            }
+                        }
+                        break;
+                    case VERIFY10:
+                        if (!(cbw.CB[1] & 0x02)) {
+                            csw.Status = CSW_PASSED;
+                            sendCSW();
+                            break;
+                        }
+                        if (infoTransfer()) {
+                            if (!(cbw.Flags & 0x80)) {
+                                stage = PROCESS_CBW;
+                                memOK = true;
+                            } else {
+                                stallEndpoint(EPBULK_IN);
+                                csw.Status = CSW_ERROR;
+                                sendCSW();
+                            }
+                        }
+                        break;
+                    case MEDIA_REMOVAL:
+                        csw.Status = CSW_PASSED;
+                        sendCSW();
+                        break;
+                    default:
+                        fail();
+                        break;
+                }
+            }
+        }
+    }
+}
+
+void USBMSD::testUnitReady (void) {
+
+    if (cbw.DataLength != 0) {
+        if ((cbw.Flags & 0x80) != 0) {
+            stallEndpoint(EPBULK_IN);
+        } else {
+            stallEndpoint(EPBULK_OUT);
+        }
+    }
+
+    csw.Status = CSW_PASSED;
+    sendCSW();
+}
+
+
+void USBMSD::memoryRead (void) {
+    uint32_t n;
+
+    n = (length > MAX_PACKET) ? MAX_PACKET : length;
+
+    if ((addr + n) > MemorySize) {
+        n = MemorySize - addr;
+        stage = ERROR;
+    }
+
+    // we read an entire block
+    if (!(addr%BlockSize))
+        disk_read(page, addr/BlockSize, 1);
+
+    // write data which are in RAM
+    writeNB(EPBULK_IN, &page[addr%BlockSize], n, MAX_PACKET_SIZE_EPBULK);
+
+    addr += n;
+    length -= n;
+
+    csw.DataResidue -= n;
+
+    if ( !length || (stage != PROCESS_CBW)) {
+        csw.Status = (stage == PROCESS_CBW) ? CSW_PASSED : CSW_FAILED;
+        stage = (stage == PROCESS_CBW) ? SEND_CSW : stage;
+    }
+}
+
+
+bool USBMSD::infoTransfer (void) {
+    uint32_t n;
+
+    // Logical Block Address of First Block
+    n = (cbw.CB[2] << 24) | (cbw.CB[3] << 16) | (cbw.CB[4] <<  8) | (cbw.CB[5] <<  0);
+
+    addr = n * BlockSize;
+
+    // Number of Blocks to transfer
+    switch (cbw.CB[0]) {
+        case READ10:
+        case WRITE10:
+        case VERIFY10:
+            n = (cbw.CB[7] <<  8) | (cbw.CB[8] <<  0);
+            break;
+
+        case READ12:
+        case WRITE12:
+            n = (cbw.CB[6] << 24) | (cbw.CB[7] << 16) | (cbw.CB[8] <<  8) | (cbw.CB[9] <<  0);
+            break;
+    }
+
+    length = n * BlockSize;
+
+    if (!cbw.DataLength) {              // host requests no data
+        csw.Status = CSW_FAILED;
+        sendCSW();
+        return false;
+    }
+
+    if (cbw.DataLength != length) {
+        if ((cbw.Flags & 0x80) != 0) {
+            stallEndpoint(EPBULK_IN);
+        } else {
+            stallEndpoint(EPBULK_OUT);
+        }
+
+        csw.Status = CSW_FAILED;
+        sendCSW();
+        return false;
+    }
+
+    return true;
+}
+
+
+
+
+
+// Called in ISR context
+// Set configuration. Return false if the
+// configuration is not supported.
+bool USBMSD::USBCallback_setConfiguration(uint8_t configuration) {
+    if (configuration != DEFAULT_CONFIGURATION) {
+        return false;
+    }
+
+    // Configure endpoints > 0
+    addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
+    addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+
+    //activate readings
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+    return true;
+}
+
+
+uint8_t * USBMSD::stringIinterfaceDesc() {
+    static uint8_t stringIinterfaceDescriptor[] = {
+        0x08,                           //bLength
+        STRING_DESCRIPTOR,              //bDescriptorType 0x03
+        'M',0,'S',0,'D',0               //bString iInterface - MSD
+    };
+    return stringIinterfaceDescriptor;
+}
+
+uint8_t * USBMSD::stringIproductDesc() {
+    static uint8_t stringIproductDescriptor[] = {
+        0x12,                                           //bLength
+        STRING_DESCRIPTOR,                              //bDescriptorType 0x03
+        'M',0,'b',0,'e',0,'d',0,' ',0,'M',0,'S',0,'D',0 //bString iProduct - Mbed Audio
+    };
+    return stringIproductDescriptor;
+}
+
+
+uint8_t * USBMSD::configurationDesc() {
+    static uint8_t configDescriptor[] = {
+
+        // Configuration 1
+        9,      // bLength
+        2,      // bDescriptorType
+        LSB(9 + 9 + 7 + 7), // wTotalLength
+        MSB(9 + 9 + 7 + 7),
+        0x01,   // bNumInterfaces
+        0x01,   // bConfigurationValue: 0x01 is used to select this configuration
+        0x00,   // iConfiguration: no string to describe this configuration
+        0xC0,   // bmAttributes
+        100,    // bMaxPower, device power consumption is 100 mA
+
+        // Interface 0, Alternate Setting 0, MSC Class
+        9,      // bLength
+        4,      // bDescriptorType
+        0x00,   // bInterfaceNumber
+        0x00,   // bAlternateSetting
+        0x02,   // bNumEndpoints
+        0x08,   // bInterfaceClass
+        0x06,   // bInterfaceSubClass
+        0x50,   // bInterfaceProtocol
+        0x04,   // iInterface
+
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
+        7,                          // bLength
+        5,                          // bDescriptorType
+        PHY_TO_DESC(EPBULK_IN),     // bEndpointAddress
+        0x02,                       // bmAttributes (0x02=bulk)
+        LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
+        0,                          // bInterval
+
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
+        7,                          // bLength
+        5,                          // bDescriptorType
+        PHY_TO_DESC(EPBULK_OUT),    // bEndpointAddress
+        0x02,                       // bmAttributes (0x02=bulk)
+        LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
+        0                           // bInterval
+    };
+    return configDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBMSD/USBMSD.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,251 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+
+#ifndef USBMSD_H
+#define USBMSD_H
+
+/* These headers are included for child class. */
+#include "USBEndpoints.h"
+#include "USBDescriptor.h"
+#include "USBDevice_Types.h"
+
+#include "USBDevice.h"
+
+/**
+ * USBMSD class: generic class in order to use all kinds of blocks storage chip
+ *
+ * Introduction
+ *
+ * The USBMSD implements the MSD protocol. It permits to access a memory chip (flash, sdcard,...)
+ * from a computer over USB. But this class doesn't work standalone, you need to subclass this class
+ * and define virtual functions which are called in USBMSD.
+ *
+ * How to use this class with your chip ?
+ *
+ * You have to inherit and define some pure virtual functions (mandatory step):
+ *   - virtual int disk_read(char * data, int block): function to read a block
+ *   - virtual int disk_write(const char * data, int block): function to write a block
+ *   - virtual int disk_initialize(): function to initialize the memory
+ *   - virtual int disk_sectors(): return the number of blocks
+ *   - virtual int disk_size(): return the memory size
+ *   - virtual int disk_status(): return the status of the storage chip (0: OK, 1: not initialized, 2: no medium in the drive, 4: write protection)
+ *
+ * All functions names are compatible with the fat filesystem library. So you can imagine using your own class with
+ * USBMSD and the fat filesystem library in the same program. Just be careful because there are two different parts which
+ * will access the sd card. You can do a master/slave system using the disk_status method.
+ *
+ * Once these functions defined, you can call connect() (at the end of the constructor of your class for instance)
+ * of USBMSD to connect your mass storage device. connect() will first call disk_status() to test the status of the disk.
+ * If disk_status() returns 1 (disk not initialized), then disk_initialize() is called. After this step, connect() will collect information
+ * such as the number of blocks and the memory size.
+ */
+class USBMSD: public USBDevice {
+public:
+
+    /**
+    * Constructor
+    *
+    * @param vendor_id Your vendor_id
+    * @param product_id Your product_id
+    * @param product_release Your preoduct_release
+    */
+    USBMSD(uint16_t vendor_id = 0x0703, uint16_t product_id = 0x0104, uint16_t product_release = 0x0001);
+
+    /**
+    * Connect the USB MSD device. Establish disk initialization before really connect the device.
+    *
+    * @param blocking if not configured
+    * @returns true if successful
+    */
+    bool connect(bool blocking = true);
+
+    /**
+    * Disconnect the USB MSD device.
+    */
+    void disconnect();
+
+    /**
+    * Destructor
+    */
+    ~USBMSD();
+
+protected:
+
+    /*
+    * read one or more blocks on a storage chip
+    *
+    * @param data pointer where will be stored read data
+    * @param block starting block number
+    * @param count number of blocks to read
+    * @returns 0 if successful
+    */
+    virtual int disk_read(uint8_t* data, uint64_t block, uint8_t count) = 0;
+
+    /*
+    * write one or more blocks on a storage chip
+    *
+    * @param data data to write
+    * @param block starting block number
+    * @param count number of blocks to write
+    * @returns 0 if successful
+    */
+    virtual int disk_write(const uint8_t* data, uint64_t block, uint8_t count) = 0;
+
+    /*
+    * Disk initilization
+    */
+    virtual int disk_initialize() = 0;
+
+    /*
+    * Return the number of blocks
+    *
+    * @returns number of blocks
+    */
+    virtual uint64_t disk_sectors() = 0;
+
+    /*
+    * Return memory size
+    *
+    * @returns memory size
+    */
+    virtual uint64_t disk_size() = 0;
+
+
+    /*
+    * To check the status of the storage chip
+    *
+    * @returns status: 0: OK, 1: disk not initialized, 2: no medium in the drive, 4: write protected
+    */
+    virtual int disk_status() = 0;
+
+    /*
+    * Get string product descriptor
+    *
+    * @returns pointer to the string product descriptor
+    */
+    virtual uint8_t * stringIproductDesc();
+
+    /*
+    * Get string interface descriptor
+    *
+    * @returns pointer to the string interface descriptor
+    */
+    virtual uint8_t * stringIinterfaceDesc();
+
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc();
+
+    /*
+    * Callback called when a packet is received
+    */
+    virtual bool EPBULK_OUT_callback();
+
+    /*
+    * Callback called when a packet has been sent
+    */
+    virtual bool EPBULK_IN_callback();
+
+    /*
+    * Set configuration of device. Add endpoints
+    */
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);
+
+    /*
+    * Callback called to process class specific requests
+    */
+    virtual bool USBCallback_request();
+
+
+private:
+
+    // MSC Bulk-only Stage
+    enum Stage {
+        READ_CBW,     // wait a CBW
+        ERROR,        // error
+        PROCESS_CBW,  // process a CBW request
+        SEND_CSW,     // send a CSW
+        WAIT_CSW,     // wait that a CSW has been effectively sent
+    };
+
+    // Bulk-only CBW
+    typedef struct {
+        uint32_t Signature;
+        uint32_t Tag;
+        uint32_t DataLength;
+        uint8_t  Flags;
+        uint8_t  LUN;
+        uint8_t  CBLength;
+        uint8_t  CB[16];
+    } PACKED CBW;
+
+    // Bulk-only CSW
+    typedef struct {
+        uint32_t Signature;
+        uint32_t Tag;
+        uint32_t DataResidue;
+        uint8_t  Status;
+    } PACKED CSW;
+
+    //state of the bulk-only state machine
+    Stage stage;
+
+    // current CBW
+    CBW cbw;
+
+    // CSW which will be sent
+    CSW csw;
+
+    // addr where will be read or written data
+    uint32_t addr;
+
+    // length of a reading or writing
+    uint32_t length;
+
+    // memory OK (after a memoryVerify)
+    bool memOK;
+
+    // cache in RAM before writing in memory. Useful also to read a block.
+    uint8_t * page;
+
+    int BlockSize;
+    uint64_t MemorySize;
+    uint64_t BlockCount;
+
+    void CBWDecode(uint8_t * buf, uint16_t size);
+    void sendCSW (void);
+    bool inquiryRequest (void);
+    bool write (uint8_t * buf, uint16_t size);
+    bool readFormatCapacity();
+    bool readCapacity (void);
+    bool infoTransfer (void);
+    void memoryRead (void);
+    bool modeSense6 (void);
+    void testUnitReady (void);
+    bool requestSense (void);
+    void memoryVerify (uint8_t * buf, uint16_t size);
+    void memoryWrite (uint8_t * buf, uint16_t size);
+    void reset();
+    void fail();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBSerial/CircBuffer.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,63 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef CIRCBUFFER_H
+#define CIRCBUFFER_H
+
+template <class T, int Size>
+class CircBuffer {
+public:
+    CircBuffer():write(0), read(0){}
+    bool isFull() {
+        return ((write + 1) % size == read);
+    };
+
+    bool isEmpty() {
+        return (read == write);
+    };
+
+    void queue(T k) {
+        if (isFull()) {
+            read++;
+            read %= size;
+        }
+        buf[write++] = k;
+        write %= size;
+    }
+
+    uint16_t available() {
+        return (write >= read) ? write - read : size - read + write;
+    };
+
+    bool dequeue(T * c) {
+        bool empty = isEmpty();
+        if (!empty) {
+            *c = buf[read++];
+            read %= size;
+        }
+        return(!empty);
+    };
+
+private:
+    volatile uint16_t write;
+    volatile uint16_t read;
+    static const int size = Size+1;  //a modern optimizer should be able to remove this so it uses no ram.
+    T buf[Size+1];
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBSerial/USBCDC.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,286 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBCDC.h"
+
+static uint8_t cdc_line_coding[7]= {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08};
+
+#define DEFAULT_CONFIGURATION (1)
+
+#define CDC_SET_LINE_CODING        0x20
+#define CDC_GET_LINE_CODING        0x21
+#define CDC_SET_CONTROL_LINE_STATE 0x22
+
+// Control Line State bits
+#define CLS_DTR   (1 << 0)
+#define CLS_RTS   (1 << 1)
+
+#define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK
+
+USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking): USBDevice(vendor_id, product_id, product_release) {
+    terminal_connected = false;
+    USBDevice::connect(connect_blocking);
+}
+
+bool USBCDC::USBCallback_request(void) {
+    /* Called in ISR context */
+
+    bool success = false;
+    CONTROL_TRANSFER * transfer = getTransferPtr();
+
+    /* Process class-specific requests */
+
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
+        switch (transfer->setup.bRequest) {
+            case CDC_GET_LINE_CODING:
+                transfer->remaining = 7;
+                transfer->ptr = cdc_line_coding;
+                transfer->direction = DEVICE_TO_HOST;
+                success = true;
+                break;
+            case CDC_SET_LINE_CODING:
+                transfer->remaining = 7;
+                transfer->notify = true;
+                success = true;
+                break;
+            case CDC_SET_CONTROL_LINE_STATE:
+                if (transfer->setup.wValue & CLS_DTR) {
+                    terminal_connected = true;
+                } else {
+                    terminal_connected = false;
+                }
+                success = true;
+                break;
+            default:
+                break;
+        }
+    }
+
+    return success;
+}
+
+void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
+    // Request of setting line coding has 7 bytes
+    if (length != 7) {
+        return;
+    }
+
+    CONTROL_TRANSFER * transfer = getTransferPtr();
+
+    /* Process class-specific requests */
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
+        if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
+            if (memcmp(cdc_line_coding, buf, 7)) {
+                memcpy(cdc_line_coding, buf, 7);
+
+                int baud = buf[0] + (buf[1] << 8)
+                         + (buf[2] << 16) + (buf[3] << 24);
+                int stop = buf[4];
+                int bits = buf[6];
+                int parity = buf[5];
+
+                lineCodingChanged(baud, bits, parity, stop);
+            }
+        }
+    }
+}
+
+// Called in ISR context
+// Set configuration. Return false if the
+// configuration is not supported.
+bool USBCDC::USBCallback_setConfiguration(uint8_t configuration) {
+    if (configuration != DEFAULT_CONFIGURATION) {
+        return false;
+    }
+
+    // Configure endpoints > 0
+    addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
+    addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
+    addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+
+    // We activate the endpoint to be able to recceive data
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
+    return true;
+}
+
+bool USBCDC::send(uint8_t * buffer, uint32_t size) {
+    return USBDevice::write(EPBULK_IN, buffer, size, MAX_CDC_REPORT_SIZE);
+}
+
+bool USBCDC::readEP(uint8_t * buffer, uint32_t * size) {
+    if (!USBDevice::readEP(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
+        return false;
+    if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
+        return false;
+    return true;
+}
+
+bool USBCDC::readEP_NB(uint8_t * buffer, uint32_t * size) {
+    if (!USBDevice::readEP_NB(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
+        return false;
+    if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
+        return false;
+    return true;
+}
+
+
+uint8_t * USBCDC::deviceDesc() {
+    static uint8_t deviceDescriptor[] = {
+        18,                   // bLength
+        1,                    // bDescriptorType
+        0x10, 0x01,           // bcdUSB
+        2,                    // bDeviceClass
+        0,                    // bDeviceSubClass
+        0,                    // bDeviceProtocol
+        MAX_PACKET_SIZE_EP0,  // bMaxPacketSize0
+        (uint8_t)(LSB(VENDOR_ID)), (uint8_t)(MSB(VENDOR_ID)),  // idVendor
+        (uint8_t)(LSB(PRODUCT_ID)), (uint8_t)(MSB(PRODUCT_ID)),// idProduct
+        0x00, 0x01,           // bcdDevice
+        1,                    // iManufacturer
+        2,                    // iProduct
+        3,                    // iSerialNumber
+        1                     // bNumConfigurations
+    };
+    return deviceDescriptor;
+}
+
+uint8_t * USBCDC::stringIinterfaceDesc() {
+    static uint8_t stringIinterfaceDescriptor[] = {
+        0x08,
+        STRING_DESCRIPTOR,
+        'C',0,'D',0,'C',0,
+    };
+    return stringIinterfaceDescriptor;
+}
+
+uint8_t * USBCDC::stringIproductDesc() {
+    static uint8_t stringIproductDescriptor[] = {
+        0x16,
+        STRING_DESCRIPTOR,
+        'C',0,'D',0,'C',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0
+    };
+    return stringIproductDescriptor;
+}
+
+
+#define CONFIG1_DESC_SIZE (9+8+9+5+5+4+5+7+9+7+7)
+
+uint8_t * USBCDC::configurationDesc() {
+    static uint8_t configDescriptor[] = {
+        // configuration descriptor
+        9,                      // bLength
+        2,                      // bDescriptorType
+        LSB(CONFIG1_DESC_SIZE), // wTotalLength
+        MSB(CONFIG1_DESC_SIZE),
+        2,                      // bNumInterfaces
+        1,                      // bConfigurationValue
+        0,                      // iConfiguration
+        0x80,                   // bmAttributes
+        50,                     // bMaxPower
+
+        // IAD to associate the two CDC interfaces
+        0x08,                   // bLength
+        0x0b,                   // bDescriptorType
+        0x00,                   // bFirstInterface
+        0x02,                   // bInterfaceCount
+        0x02,                   // bFunctionClass
+        0x02,                   // bFunctionSubClass
+        0,                      // bFunctionProtocol
+        0,                      // iFunction
+
+        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
+        9,                      // bLength
+        4,                      // bDescriptorType
+        0,                      // bInterfaceNumber
+        0,                      // bAlternateSetting
+        1,                      // bNumEndpoints
+        0x02,                   // bInterfaceClass
+        0x02,                   // bInterfaceSubClass
+        0x01,                   // bInterfaceProtocol
+        0,                      // iInterface
+
+        // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26
+        5,                      // bFunctionLength
+        0x24,                   // bDescriptorType
+        0x00,                   // bDescriptorSubtype
+        0x10, 0x01,             // bcdCDC
+
+        // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27
+        5,                      // bFunctionLength
+        0x24,                   // bDescriptorType
+        0x01,                   // bDescriptorSubtype
+        0x03,                   // bmCapabilities
+        1,                      // bDataInterface
+
+        // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28
+        4,                      // bFunctionLength
+        0x24,                   // bDescriptorType
+        0x02,                   // bDescriptorSubtype
+        0x06,                   // bmCapabilities
+
+        // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33
+        5,                      // bFunctionLength
+        0x24,                   // bDescriptorType
+        0x06,                   // bDescriptorSubtype
+        0,                      // bMasterInterface
+        1,                      // bSlaveInterface0
+
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EPINT_IN),          // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes (0x03=intr)
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        16,                             // bInterval
+
+
+
+
+        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
+        9,                          // bLength
+        4,                          // bDescriptorType
+        1,                          // bInterfaceNumber
+        0,                          // bAlternateSetting
+        2,                          // bNumEndpoints
+        0x0A,                       // bInterfaceClass
+        0x00,                       // bInterfaceSubClass
+        0x00,                       // bInterfaceProtocol
+        0,                          // iInterface
+
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
+        ENDPOINT_DESCRIPTOR_LENGTH, // bLength
+        ENDPOINT_DESCRIPTOR,        // bDescriptorType
+        PHY_TO_DESC(EPBULK_IN),     // bEndpointAddress
+        E_BULK,                     // bmAttributes (0x02=bulk)
+        LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
+        0,                          // bInterval
+
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
+        ENDPOINT_DESCRIPTOR_LENGTH, // bLength
+        ENDPOINT_DESCRIPTOR,        // bDescriptorType
+        PHY_TO_DESC(EPBULK_OUT),    // bEndpointAddress
+        E_BULK,                     // bmAttributes (0x02=bulk)
+        LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
+        0                           // bInterval
+    };
+    return configDescriptor;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBSerial/USBCDC.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,124 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBCDC_H
+#define USBCDC_H
+
+/* These headers are included for child class. */
+#include "USBEndpoints.h"
+#include "USBDescriptor.h"
+#include "USBDevice_Types.h"
+
+#include "USBDevice.h"
+
+class USBCDC: public USBDevice {
+public:
+
+    /*
+    * Constructor
+    *
+    * @param vendor_id Your vendor_id
+    * @param product_id Your product_id
+    * @param product_release Your preoduct_release
+    * @param connect_blocking define if the connection must be blocked if USB not plugged in
+    */
+    USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking);
+	
+	volatile bool terminal_connected;
+
+protected:
+
+    /*
+    * Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+    *
+    * @returns pointer to the device descriptor
+    */
+    virtual uint8_t * deviceDesc();
+
+    /*
+    * Get string product descriptor
+    *
+    * @returns pointer to the string product descriptor
+    */
+    virtual uint8_t * stringIproductDesc();
+
+    /*
+    * Get string interface descriptor
+    *
+    * @returns pointer to the string interface descriptor
+    */
+    virtual uint8_t * stringIinterfaceDesc();
+
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc();
+
+    /*
+    * Send a buffer
+    *
+    * @param endpoint endpoint which will be sent the buffer
+    * @param buffer buffer to be sent
+    * @param size length of the buffer
+    * @returns true if successful
+    */
+    bool send(uint8_t * buffer, uint32_t size);
+
+    /*
+    * Read a buffer from a certain endpoint. Warning: blocking
+    *
+    * @param endpoint endpoint to read
+    * @param buffer buffer where will be stored bytes
+    * @param size the number of bytes read will be stored in *size
+    * @param maxSize the maximum length that can be read
+    * @returns true if successful
+    */
+    bool readEP(uint8_t * buffer, uint32_t * size);
+
+    /*
+    * Read a buffer from a certain endpoint. Warning: non blocking
+    *
+    * @param endpoint endpoint to read
+    * @param buffer buffer where will be stored bytes
+    * @param size the number of bytes read will be stored in *size
+    * @param maxSize the maximum length that can be read
+    * @returns true if successful
+    */
+    bool readEP_NB(uint8_t * buffer, uint32_t * size);
+
+    /*
+    * Called by USBCallback_requestCompleted when CDC line coding is changed
+    * Warning: Called in ISR
+    *
+    * @param baud The baud rate
+    * @param bits The number of bits in a word (5-8)
+    * @param parity The parity
+    * @param stop The number of stop bits (1 or 2)
+    */
+    virtual void lineCodingChanged(int baud, int bits, int parity, int stop) {};
+
+protected:
+    virtual bool USBCallback_request();
+    virtual void USBCallback_requestCompleted(uint8_t *buf, uint32_t length);
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBSerial/USBSerial.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,67 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBSerial.h"
+
+int USBSerial::_putc(int c) {
+    if (!terminal_connected)
+        return 0;
+    send((uint8_t *)&c, 1);
+    return 1;
+}
+
+int USBSerial::_getc() {
+    uint8_t c = 0;
+    while (buf.isEmpty());
+    buf.dequeue(&c);
+    return c;
+}
+
+
+bool USBSerial::writeBlock(uint8_t * buf, uint16_t size) {
+    if(size > MAX_PACKET_SIZE_EPBULK) {
+        return false;
+    }
+    if(!send(buf, size)) {
+        return false;
+    }
+    return true;
+}
+
+
+
+bool USBSerial::EPBULK_OUT_callback() {
+    uint8_t c[65];
+    uint32_t size = 0;
+
+    //we read the packet received and put it on the circular buffer
+    readEP(c, &size);
+    for (uint32_t i = 0; i < size; i++) {
+        buf.queue(c[i]);
+    }
+
+    //call a potential handler
+    rx.call();
+
+    return true;
+}
+
+uint8_t USBSerial::available() {
+    return buf.available();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice/USBSerial/USBSerial.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,161 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBSERIAL_H
+#define USBSERIAL_H
+
+#include "USBCDC.h"
+#include "Stream.h"
+#include "CircBuffer.h"
+
+
+/**
+* USBSerial example
+*
+* @code
+* #include "mbed.h"
+* #include "USBSerial.h"
+*
+* //Virtual serial port over USB
+* USBSerial serial;
+*
+* int main(void) {
+*
+*    while(1)
+*    {
+*        serial.printf("I am a virtual serial port\n");
+*        wait(1);
+*    }
+* }
+* @endcode
+*/
+class USBSerial: public USBCDC, public Stream {
+public:
+
+    /**
+    *   Constructor
+    *
+    * @param vendor_id Your vendor_id (default: 0x1f00)
+    * @param product_id Your product_id (default: 0x2012)
+    * @param product_release Your preoduct_release (default: 0x0001)
+    * @param connect_blocking define if the connection must be blocked if USB not plugged in
+    *
+    */
+    USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001, bool connect_blocking = true): USBCDC(vendor_id, product_id, product_release, connect_blocking){
+        settingsChangedCallback = 0;
+    };
+
+
+    /**
+    * Send a character. You can use puts, printf.
+    *
+    * @param c character to be sent
+    * @returns true if there is no error, false otherwise
+    */
+    virtual int _putc(int c);
+
+    /**
+    * Read a character: blocking
+    *
+    * @returns character read
+    */
+    virtual int _getc();
+
+    /**
+    * Check the number of bytes available.
+    *
+    * @returns the number of bytes available
+    */
+    uint8_t available();
+
+    /** Determine if there is a character available to read
+     *
+     *  @returns
+     *    1 if there is a character available to read,
+     *    0 otherwise
+     */
+    int readable() { return available() ? 1 : 0; }
+
+    /** Determine if there is space available to write a character
+     *
+     *  @returns
+     *    1 if there is space to write a character,
+     *    0 otherwise
+     */
+    int writeable() { return 1; } // always return 1, for write operation is blocking
+
+    /**
+    * Write a block of data.
+    *
+    * For more efficiency, a block of size 64 (maximum size of a bulk endpoint) has to be written.
+    *
+    * @param buf pointer on data which will be written
+    * @param size size of the buffer. The maximum size of a block is limited by the size of the endpoint (64 bytes)
+    *
+    * @returns true if successfull
+    */
+    bool writeBlock(uint8_t * buf, uint16_t size);
+
+    /**
+     *  Attach a member function to call when a packet is received.
+     *
+     *  @param tptr pointer to the object to call the member function on
+     *  @param mptr pointer to the member function to be called
+     */
+    template<typename T>
+    void attach(T* tptr, void (T::*mptr)(void)) {
+        if((mptr != NULL) && (tptr != NULL)) {
+            rx.attach(tptr, mptr);
+        }
+    }
+
+    /**
+     * Attach a callback called when a packet is received
+     *
+     * @param fptr function pointer
+     */
+    void attach(void (*fptr)(void)) {
+        if(fptr != NULL) {
+            rx.attach(fptr);
+        }
+    }
+
+    /**
+     * Attach a callback to call when serial's settings are changed.
+     *
+     * @param fptr function pointer
+     */
+    void attach(void (*fptr)(int baud, int bits, int parity, int stop)) {
+        settingsChangedCallback = fptr;
+    }
+
+protected:
+    virtual bool EPBULK_OUT_callback();
+    virtual void lineCodingChanged(int baud, int bits, int parity, int stop){
+        if (settingsChangedCallback) {
+            settingsChangedCallback(baud, bits, parity, stop);
+        }
+    }
+
+private:
+    FunctionPointer rx;
+    CircBuffer<uint8_t,128> buf;
+    void (*settingsChangedCallback)(int baud, int bits, int parity, int stop);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,62 @@
+/*******************************************************************************
+* Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+#include "mbed.h"
+#include "max32630fthr.h"
+#include "USBSerial.h"
+#include "Max4146x.h"
+#include "Max41460_regs.h"
+#include "Max41461_2_regs.h"
+#include "Max41463_4_regs.h"
+
+//using namespace MAX4146X<max41461_2_reg_map_t>;
+
+int main()
+{
+    max41461_2_reg_map_t max41461_reg;
+    I2C i2c(P5_7, P6_0);
+    i2c.frequency(400000);
+    
+    MAX4146X<max41461_2_reg_map_t> max41461(&max41461_reg, &i2c);
+    
+    /*initial programming for MAX41462*/
+    max41461.set_modmode(MAX4146X<max41461_2_reg_map_t>::MODMODE_ASK);
+    max41461.set_i2c_txen1(MAX4146X<max41461_2_reg_map_t>::I2C_TXEN1_DISABLE);
+    max41461.set_frequency(300000);
+    max41461.set_i2c_txen2(MAX4146X<max41461_2_reg_map_t>::I2C_TXEN2_ENABLE);
+    max41461.set_i2c_data(0);
+
+    while(1) {
+        wait(2);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max32630fthr/MAX14690.lib	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/teams/MaximIntegrated/code/MAX14690/#264f38840873
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max32630fthr/max32630fthr.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#include "mbed.h"
+#include "max3263x.h"
+#include "ioman_regs.h"
+#include "PinNames.h"
+#include "max32630fthr.h"
+
+//******************************************************************************
+MAX32630FTHR::MAX32630FTHR() : i2c(P5_7, P6_0), max14690(&i2c)
+{
+}
+
+//******************************************************************************
+MAX32630FTHR::MAX32630FTHR(vio_t vio) : i2c(P5_7, P6_0), max14690(&i2c)
+{
+    init(vio);
+}
+
+//******************************************************************************
+MAX32630FTHR::~MAX32630FTHR()
+{
+}
+
+//******************************************************************************
+int MAX32630FTHR::init(vio_t hdrVio)
+{
+    // Override the default values
+    max14690.ldo2Millivolts = 3300;
+    max14690.ldo3Millivolts = 3300;
+    max14690.ldo2Mode = MAX14690::LDO_ENABLED;
+    max14690.ldo3Mode = MAX14690::LDO_ENABLED;
+    max14690.monCfg = MAX14690::MON_HI_Z;
+    // Note that writing the local value does directly affect the part
+    // The buck-boost regulator will remain off until init is called
+
+    // Call init to apply all settings to the PMIC
+    if (max14690.init() == MAX14690_ERROR) {
+        printf("Error initializing MAX14690");
+    }
+
+    // Set micro SD card pins to 3.3V
+    vddioh(P0_4, VIO_3V3);
+    vddioh(P0_5, VIO_3V3);
+    vddioh(P0_6, VIO_3V3);
+    vddioh(P0_7, VIO_3V3);
+    // Set LED pins to 3.3V
+    vddioh(P2_4, VIO_3V3);
+    vddioh(P2_5, VIO_3V3);
+    vddioh(P2_6, VIO_3V3);
+    // Set header pins to hdrVio
+    vddioh(P3_0, hdrVio);
+    vddioh(P3_1, hdrVio);
+    vddioh(P3_2, hdrVio);
+    vddioh(P3_3, hdrVio);
+    vddioh(P3_4, hdrVio);
+    vddioh(P3_5, hdrVio);
+    vddioh(P4_0, hdrVio);
+    vddioh(P4_1, hdrVio);
+    vddioh(P4_2, hdrVio);
+    vddioh(P4_3, hdrVio);
+    vddioh(P4_4, hdrVio);
+    vddioh(P4_5, hdrVio);
+    vddioh(P4_6, hdrVio);
+    vddioh(P4_7, hdrVio);
+    vddioh(P5_0, hdrVio);
+    vddioh(P5_1, hdrVio);
+    vddioh(P5_2, hdrVio);
+    vddioh(P5_3, hdrVio);
+    vddioh(P5_4, hdrVio);
+    vddioh(P5_5, hdrVio);
+    vddioh(P5_6, hdrVio);
+
+    return 0;
+}
+
+//******************************************************************************
+int MAX32630FTHR::vddioh(PinName pin, vio_t vio)
+{
+    __IO uint32_t *use_vddioh = &((mxc_ioman_regs_t *)MXC_IOMAN)->use_vddioh_0;
+
+    if (pin == NOT_CONNECTED) {
+        return -1;
+    }
+
+    use_vddioh += PINNAME_TO_PORT(pin) >> 2;
+    if (vio) {
+        *use_vddioh |= (1 << (PINNAME_TO_PIN(pin) + ((PINNAME_TO_PORT(pin) & 0x3) << 3)));
+    } else {
+        *use_vddioh &= ~(1 << (PINNAME_TO_PIN(pin) + ((PINNAME_TO_PORT(pin) & 0x3) << 3)));
+    }
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max32630fthr/max32630fthr.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#ifndef _MAX32630FTHR_H_
+#define _MAX32630FTHR_H_
+
+#include "mbed.h"
+#include "MAX14690.h"
+
+/**
+ * @brief MAX32630FTHR Board Support Library
+ *
+ * @details The MAX32630FTHR is a rapid development application board for
+ * ultra low power wearable applications.  It includes common peripherals and
+ * expansion connectors all power optimized for getting the longest life from
+ * the battery.  This library configures the power and I/O for the board.
+ * <br>https://www.maximintegrated.com/max32630fthr
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "max32630fthr.h"
+ *
+ * DigitalOut led1(LED1);
+ * MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
+ *
+ * // main() runs in its own thread in the OS
+ * // (note the calls to Thread::wait below for delays)
+ * int main()
+ * {
+ *     // initialize power and I/O on MAX32630FTHR board
+ *     pegasus.init();
+ *
+ *     while (true) {
+ *         led1 = !led1;
+ *         Thread::wait(500);
+ *     }
+ * }
+ * @endcode
+ */
+class MAX32630FTHR
+{
+public:
+// max32630fthr configuration utilities
+
+    /**
+      * @brief   IO Voltage
+      * @details Enumerated options for operating voltage
+      */
+    typedef enum {
+        VIO_1V8 = 0x00,    ///< 1.8V IO voltage at headers (from BUCK2)
+        VIO_3V3 = 0x01,    ///< 3.3V IO voltage at headers (from LDO2)
+    } vio_t;
+
+    /**
+        * MAX32630FTHR constructor.
+        *
+        */
+    MAX32630FTHR();
+
+    /**
+        * MAX32630FTHR constructor.
+        *
+        */
+    MAX32630FTHR(vio_t vio);
+
+    /**
+        * MAX32630FTHR destructor.
+        */
+    ~MAX32630FTHR();
+
+    /**
+     * @brief   Initialize MAX32630FTHR board
+     * @details Initializes PMIC and I/O on MAX32630FTHR board.
+     *  Configures PMIC to enable LDO2 and LDO3 at 3.3V.
+     *  Disables resisitive pulldown on MON(AIN_0)
+     *  Sets default I/O voltages to 3V3 for micro SD card.
+     *  Sets I/O voltage for header pins to hdrVio specified.
+     * @param hdrVio I/O voltage for header pins
+     * @returns 0 if no errors, -1 if error.
+    */
+    int init(vio_t hdrVio);
+
+    /**
+     * @brief   Sets I/O Voltage
+     * @details Sets the voltage rail to be used for a given pin.
+     *  VIO_1V8 selects VDDIO which is supplied by Buck2, which is set at 1.8V,
+     *  VIO_3V3 selects VDDIOH which is supplied by LDO2, which is typically 3.3V/
+     * @param   pin Pin whose voltage supply is being assigned.
+     * @param   vio Voltage rail to be used for specified pin.
+     * @returns 0 if no errors, -1 if error.
+    */
+    int vddioh(PinName pin, vio_t vio);
+
+    /// Local I2C bus for configuring PMIC and accessing BMI160 IMU.
+    I2C i2c;
+
+    /// MAX14690 PMIC Instance
+    MAX14690 max14690;
+
+};
+
+#endif /* _MAX32630FTHR_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max4146x/Max41460_regs.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,440 @@
+/*******************************************************************************
+* Copyright (C) 2019 Maxim Integrated Products, Inc., All rights Reserved.
+*
+* This software is protected by copyright laws of the United States and
+* of foreign countries. This material may also be protected by patent laws
+* and technology transfer regulations of the United States and of foreign
+* countries. This software is furnished under a license agreement and/or a
+* nondisclosure agreement and may only be used or reproduced in accordance
+* with the terms of those agreements. Dissemination of this information to
+* any party or parties not specified in the license agreement and/or
+* nondisclosure agreement is expressly prohibited.
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+
+#ifndef MAX41460_REGS_H_
+#define MAX41460_REGS_H_
+
+/**
+ * @brief CFG1  (0x00)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char modmode    : 1;    /**< Configures modulator mode */
+        unsigned char sync       : 1;    /**< Controls if clock output acts as an input.
+                                              When an input, it will sample the DATA pin. */
+        unsigned char fskshape   : 1;    /**< Sets the state of FSK Gaussian Shaping */
+        unsigned char            : 1;
+        unsigned char xoclkdiv   : 2;    /**< XO clock division ratio for digital block */
+        unsigned char xoclkdelay : 2;    /**< Start delay before enabling XO clock to digital block */
+    } bits;
+} max41460_reg_cfg1_t;
+
+/**
+ * @brief CFG2  (0x01)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char bclk_postdiv : 3;    /**< Select the Baud Clock Post Division Ratio.
+                                                Valid values are from 1 to 5. */
+        unsigned char              : 3;
+        unsigned char clkout_delay : 2;    /**< Selects the delay when CLKOUT starts toggling upon
+                                                exiting SHUTDOWN mode, in divided XO clock cycles */
+    } bits;
+} max41460_reg_cfg2_t;
+
+/**
+ * @brief CFG3  (0x02)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char bclk_prediv : 8;
+    } bits;
+} max41460_reg_cfg3_t;
+
+/**
+ * @brief CFG4  (0x03)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pwdn_mode : 2;    /**< Power Down Mode Select */
+        unsigned char           : 6;
+    } bits;
+} max41460_reg_cfg4_t;
+
+/**
+ * @brief CFG5  (0x04)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tstep : 6;    /**< Controls GFSK shaping. See Digital FSK Modulation section. */
+        unsigned char       : 2;
+    } bits;
+} max41460_reg_cfg5_t;
+
+/**
+ * @brief SHDN  (0x05)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pa_boost        : 1;    /**< Enables a boost in PA output power for frequencies above 850MHz.
+                                                   This requires a different PA match compared to normal operation. */
+        unsigned char en_ldo          : 1;    /**< Write to 0 binary.Register based enable control for main 1.8V LDO.
+                                                   This register bit is an input to an "OR" gate.
+                                                   The other input to the "OR" gate is the internally generated
+                                                   functional signal for LDO enable. */
+        unsigned char dis_ldo_func_en : 1;    /**< Write to 1 binary.Active low disable signal for functional path
+                                                   generated LDO enable signal. This register bit is an input to an
+                                                   "AND" gate. The other input to the "AND" gate is the internally
+                                                   generated functional signal for LDO enable. */
+        unsigned char                 : 5;
+    } bits;
+} max41460_reg_shdn_t;
+
+/**
+ * @brief PA1  (0x06)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char papwr  : 3;    /**< Controls the PA output power by enabling parallel drivers. */
+        unsigned char        : 2;
+        unsigned char pabias : 3;    /**< Write to 100 binary.Adjusts cascode bias for PA.
+                                          Enumerations are a percentage of VDD */
+    } bits;
+} max41460_reg_pa1_t;
+
+/**
+ * @brief PA2  (0x07)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pacap     : 5;    /**< Controls shunt capacitance on PA output in fF. */
+        unsigned char pacapbias : 3;    /**< Write to 100 binary.Adjusts the amount of capacitance
+                                             on PA Cascode decoupling cap. */
+    } bits;
+} max41460_reg_pa2_t;
+
+/**
+ * @brief PLL1  (0x08)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char lomode      : 1;    /**< Sets LO generation. For lower power, choose LOWCURRENT.
+                                               For higher performance, choose LOWNOISE. */
+        unsigned char lodiv       : 2;
+        unsigned char loopbw      : 2;    /**< Write to 00 binary.Sets PLL loop bandwidth. */
+        unsigned char fracmode    : 1;    /**< Sets PLL between fractional-N and integer-N mode. */
+        unsigned char cplin       : 2;    /**< Sets the level of charge pump offset current for fractional N mode to
+                                               improve close in phase noise. Set to DISABLED for integer N mode. */
+    } bits;
+} max41460_reg_pll1_t;
+
+/**
+ * @brief PLL2  (0x09)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char cpval            : 2;    /**< Sets Charge Pump Current */
+        unsigned char                  : 4;
+        unsigned char lcvco_fast_start : 1;    /**< Write to 0 binary.Enables fast start of LC VCO
+                                                    because of bias filtering */
+        unsigned char lcvco_pwr        : 1;    /**< Write to 0 binary.Controls power in LC VCO */
+    } bits;
+} max41460_reg_pll2_t;
+
+/**
+ * @brief CFG6  (0x0A)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fourwire1 : 1;    /**< Four wire readback on CLKOUT pin mode */
+        unsigned char spi_txen1 : 1;    /**< Transmission enable */
+        unsigned char i2c_txen1 : 1;    /**< Write to 0 binary */
+        unsigned char           : 5;
+    } bits;
+} max41460_reg_cfg6_t;
+
+/**
+ * @brief PLL3  (0x0B)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_23_to_16 : 8;    /**< FREQ value to PLL. LO frequency= FREQ<23:0>2^16*fXTAL */
+    } bits;
+} max41460_reg_pll3_t;
+
+/**
+ * @brief PLL4  (0x0C)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_15_to_8 : 8;    /**< FREQ value to PLL */
+    } bits;
+} max41460_reg_pll4_t;
+
+/**
+ * @brief PLL5  (0x0D)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_7_to_0 : 8;    /**< FREQ value to PLL */
+    } bits;
+} max41460_reg_pll5_t;
+
+/**
+ * @brief PLL6  (0x0E)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char deltaf : 7;    /**< For FSK mode, MODMODE=1 and FSKSHAPE=0, sets the frequency deviation from
+                                          the space frequency for the mark frequency. fDELTA = DELTAF[6:0]*fXTAL/8192 */
+        unsigned char        : 1;
+    } bits;
+} max41460_reg_pll6_t;
+
+/**
+ * @brief PLL7  (0x0F)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char deltaf_shape : 4;    /**< For FSK mode, MODMODE = 1 and FSKSHAPE = 1, sets the frequency deviation
+                                                from the space frequency for the mark frequency.
+                                                fDELTA = DELTAF_SHAPE[3:0] * fXTAL / 81920 */
+        unsigned char              : 4;
+    } bits;
+} max41460_reg_pll7_t;
+
+/**
+ * @brief CFG7  (0x10)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fourwire2 : 1;    /**< Four wire readback on CLKOUT pin mode. Aliased address for FOURWIRE1 */
+        unsigned char spi_txen2 : 1;    /**< 0x00 Transmission disabled, 0x01 Transmission enabled */
+        unsigned char i2c_txen2 : 1;
+        unsigned char           : 5;
+    } bits;
+} max41460_reg_cfg7_t;
+
+/**
+ * @brief I2C1  (0x11)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pktlen_14_to_8 : 7;    /**< Packet Length */
+        unsigned char pktlen_mode    : 1;    /**< Packet Length Mode */
+    } bits;
+} max41460_reg_i2c1_t;
+
+/**
+ * @brief I2C2  (0x12)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pktlen_7_to_0 : 8;    /**< Packet Length */
+    } bits;
+} max41460_reg_i2c2_t;
+
+/**
+ * @brief I2C3  (0x13)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char i2c_tx_data : 8;
+    } bits;
+} max41460_reg_i2c3_t;
+
+/**
+ * @brief I2C4  (0x14)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tx_pktlen_14_to_8 : 7;    /**< Provides status information of bits transmitted
+                                                     for the current packet */
+        unsigned char pktcomplete       : 1;    /**< Indicates if Packet transmission is completed */
+    } bits;
+} max41460_reg_i2c4_t;
+
+/**
+ * @brief I2C5  (0x15)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tx_pktlen_7_to_0 : 8;    /**< Provides status information of bits transmitted
+                                                    for the current packet */
+    } bits;
+} max41460_reg_i2c5_t;
+
+/**
+ * @brief I2C6  (0x16)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fifo_words : 3;    /**< This field captures the number of locations currently filled in FIFO.
+                                              Each location corresponds to 8-bit data word */
+        unsigned char            : 1;
+        unsigned char fifo_full  : 1;    /**< FIFO Full Status */
+        unsigned char fifo_empty : 1;    /**< FIFO Empty Status */
+        unsigned char oflow      : 1;    /**< FIFO Overflow status */
+        unsigned char uflow      : 1;    /**< FIFO Underflow status */
+    } bits;
+} max41460_reg_i2c6_t;
+
+/**
+ * @brief CFG8  (0x17)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char softreset : 1;    /**< Places DUT into software reset. */
+        unsigned char           : 7;
+    } bits;
+} max41460_reg_cfg8_t;
+
+/**
+ * @brief CFG9  (0x18)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char xoen     : 1;    /**< Write to 0 binary.XO Enable register for test purpose */
+        unsigned char pllen    : 1;    /**< Write to 0 binary.PLL Enable register for test purpose */
+        unsigned char paen     : 1;    /**< Write to 0 binary.PA Enable register for test purpose */
+        unsigned char test_ana : 5;    /**< Write to 0_0000 binary.Test modes for analog block */
+    } bits;
+} max41460_reg_cfg9_t;
+
+/**
+ * @brief ADDL1  (0x19)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char ring_bias : 2;    /**< Write to 00 binary.Controls the current mirror ratio in Ring Oscillator
+                                             control. For lower frequencies, the number can be reduced
+                                             for slightly better phase noise. */
+        unsigned char ring_trim : 2;    /**< Write to 00 binary. Adjusts the current control value
+                                             for ring oscillator. */
+        unsigned char bias_trim : 2;    /**< Write to 00 binary. Adjusts bias current for PLL block. */
+        unsigned char xtal_gm   : 2;    /**< Write to 00 binary. Controls crystal oscillator GM current
+                                             for startup time control */
+    } bits;
+} max41460_reg_addl1_t;
+
+/**
+ * @brief ADDL2  (0x1A)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char addlctrl2       : 7;    /**< Write to 000_0000 binary. Additional control fields for future use */
+        unsigned char scl_stretch_dly : 1;    /**< Write to 1 binary. I2C SCL Stretch Release delay enable */
+    } bits;
+} max41460_reg_addl2_t;
+
+/**
+ * @brief Register Set
+ *
+ */
+typedef struct {
+    max41460_reg_cfg1_t     reg_cfg1;
+    max41460_reg_cfg2_t     reg_cfg2;
+    max41460_reg_cfg3_t     reg_cfg3;
+    max41460_reg_cfg4_t     reg_cfg4;
+    max41460_reg_cfg5_t     reg_cfg5;
+    max41460_reg_shdn_t     reg_shdn;
+    max41460_reg_pa1_t      reg_pa1;
+    max41460_reg_pa2_t      reg_pa2;
+    max41460_reg_pll1_t     reg_pll1;
+    max41460_reg_pll2_t     reg_pll2;
+    max41460_reg_cfg6_t     reg_cfg6;
+    max41460_reg_pll3_t     reg_pll3;
+    max41460_reg_pll4_t     reg_pll4;
+    max41460_reg_pll5_t     reg_pll5;
+    max41460_reg_pll6_t     reg_pll6;
+    max41460_reg_pll7_t     reg_pll7;
+    max41460_reg_cfg7_t     reg_cfg7;
+    max41460_reg_i2c1_t     reg_i2c1;
+    max41460_reg_i2c2_t     reg_i2c2;
+    max41460_reg_i2c3_t     reg_i2c3;
+    max41460_reg_i2c4_t     reg_i2c4;
+    max41460_reg_i2c5_t     reg_i2c5;
+    max41460_reg_i2c6_t     reg_i2c6;
+    max41460_reg_cfg8_t     reg_cfg8;
+    max41460_reg_cfg9_t     reg_cfg9;
+    max41460_reg_addl1_t    reg_addl1;
+    max41460_reg_addl2_t    reg_addl2;
+} max41460_reg_map_t;
+
+#endif /* MAX41460_REGS_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max4146x/Max41461_2_regs.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,434 @@
+/*******************************************************************************
+* Copyright (C) 2019 Maxim Integrated Products, Inc., All rights Reserved.
+*
+* This software is protected by copyright laws of the United States and
+* of foreign countries. This material may also be protected by patent laws
+* and technology transfer regulations of the United States and of foreign
+* countries. This software is furnished under a license agreement and/or a
+* nondisclosure agreement and may only be used or reproduced in accordance
+* with the terms of those agreements. Dissemination of this information to
+* any party or parties not specified in the license agreement and/or
+* nondisclosure agreement is expressly prohibited.
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+
+#ifndef MAX41461_2_REGS_H_
+#define MAX41461_2_REGS_H_
+
+/**
+ * @brief CFG1  (0X00)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char modmode    : 1;    /**< Configures modulator mode */
+        unsigned char sync       : 1;    /**< Controls if clock output acts as an input.
+                                              When an input, it will sample the DATA pin. */
+        unsigned char fskshape   : 1;    /**< Sets the state of FSK Gaussian Shaping */
+        unsigned char            : 1;
+        unsigned char xoclkdiv   : 2;    /**< XO clock division ratio for digital block */
+        unsigned char xoclkdelay : 2;    /**< Start delay before enabling XO clock to digital block */
+    } bits;
+} max41461_2_reg_cfg1_t;
+
+/**
+ * @brief CFG2  (0X01)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char bclk_postdiv : 3;    /**< Select the Baud Clock Post Division Ratio.
+                                                Valid values are from 1 to 5. */
+        unsigned char              : 3;
+        unsigned char clkout_delay : 2;    /**< Selects the delay when CLKOUT starts toggling upon
+                                                exiting SHUTDOWN mode, in divided XO clock cycles */
+    } bits;
+} max41461_2_reg_cfg2_t;
+
+/**
+ * @brief CFG3  (0X02)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char bclk_prediv : 8;    /**< Baud clock predivision ratio. Valid values are from 3 to 255 */
+    } bits;
+} max41461_2_reg_cfg3_t;
+
+/**
+ * @brief CFG4  (0X03)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pwdn_mode : 2;    /**< Power Down Mode Select */
+        unsigned char           : 6;
+    } bits;
+} max41461_2_reg_cfg4_t;
+
+/**
+ * @brief CFG5  (0X04)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tstep : 6;    /**< Controls GFSK shaping. See Digital FSK Modulation section. */
+        unsigned char       : 2;
+    } bits;
+} max41461_2_reg_cfg5_t;
+
+/**
+ * @brief SHDN  (0X05)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pa_boost        : 1;    /**< Enables a boost in PA output power for frequencies above 850MHz.
+                                                   This requires a different PA match compared to normal operation. */
+        unsigned char                 : 7;
+    } bits;
+} max41461_2_reg_shdn_t;
+
+/**
+ * @brief PA1  (0X06)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char papwr  : 3;    /**< Controls the PA output power by enabling parallel drivers. */
+        unsigned char        : 5;
+    } bits;
+} max41461_2_reg_pa1_t;
+
+/**
+ * @brief PA2  (0X07)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pacap     : 5;    /**< Controls shunt capacitance on PA output in fF. */
+        unsigned char           : 3;
+    } bits;
+} max41461_2_reg_pa2_t;
+
+/**
+ * @brief PLL1  (0X08)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char lomode      : 1;    /**< Sets LO generation. For lower power, choose LOWCURRENT.
+                                               For higher performance, choose LOWNOISE. */
+        unsigned char lodiv       : 2;    /**< LC VCO divider value*/
+        unsigned char loopbw      : 2;    /**< Write to 00 binary.Sets PLL loop bandwidth. */
+        unsigned char fracmode    : 1;    /**< Sets PLL between fractional-N and integer-N mode. */
+        unsigned char cplin       : 2;    /**< Sets the level of charge pump offset current for fractional N mode to
+                                               improve close in phase noise. Set to DISABLED for integer N mode. */
+    } bits;
+} max41461_2_reg_pll1_t;
+
+/**
+ * @brief PLL2  (0X09)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char cpval            : 2;    /**< Sets Charge Pump Current */
+        unsigned char                  : 4;
+        unsigned char lcvco_fast_start : 1;    /**< Write to 0 binary.Enables fast start of LC VCO
+                                                    because of bias filtering */
+        unsigned char lcvco_pwr        : 1;    /**< Write to 0 binary.Controls power in LC VCO */
+    } bits;
+} max41461_2_reg_pll2_t;
+
+/**
+ * @brief CFG6  (0X0A)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fourwire1 : 1;    /**<  */
+        unsigned char spi_txen1 : 1;    /**<  */
+        unsigned char i2c_txen1 : 1;    /**< Enables DATA transmission in I2C mode. Aliased address for I2C_TXEN1 */
+        unsigned char           : 5;
+    } bits;
+} max41461_2_reg_cfg6_t;
+
+/**
+ * @brief PLL3  (0X0B)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_23_to_16 : 8;    /**< FREQ value to PLL. LO frequency= FREQ<23:0>/2^16*fXTAL */
+    } bits;
+} max41461_2_reg_pll3_t;
+
+/**
+ * @brief PLL4  (0X0C)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_15_to_8 : 8;    /**< FREQ value to PLL */
+    } bits;
+} max41461_2_reg_pll4_t;
+
+/**
+ * @brief PLL5  (0X0D)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_7_to_0 : 8;    /**< FREQ value to PLL */
+    } bits;
+} max41461_2_reg_pll5_t;
+
+/**
+ * @brief PLL6  (0X0E)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char deltaf : 7;    /**< For FSK mode, MODMODE=1 and FSKSHAPE=0, sets the frequency deviation from the
+                                          space frequency for the mark frequency. fDELTA = DELTAF[6:0]*fXTAL/8192 */
+        unsigned char        : 1;
+    } bits;
+} max41461_2_reg_pll6_t;
+
+/**
+ * @brief PLL7  (0X0F)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char deltaf_shape : 4;    /**< For FSK mode, MODMODE = 1 and FSKSHAPE = 1, sets the frequency deviation
+                                                from the space frequency for the mark frequency.
+                                                fDELTA = DELTAF_SHAPE[3:0]*fXTAL/81920 */
+        unsigned char              : 4;
+    } bits;
+} max41461_2_reg_pll7_t;
+
+/**
+ * @brief CFG7  (0X10)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fourwire2 : 1;    /**<  */
+        unsigned char spi_txen2 : 1;    /**<  */
+        unsigned char i2c_txen2 : 1;    /**< When set, enables DATA transmission in I2C mode.
+                                             Aliased address for I2C_TXEN1 */
+        unsigned char           : 5;
+    } bits;
+} max41461_2_reg_cfg7_t;
+
+/**
+ * @brief I2C1  (0X11)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pktlen_14_to_8 : 7;    /**< Packet Length */
+        unsigned char pktlen_mode    : 1;    /**< Packet Length Mode */
+    } bits;
+} max41461_2_reg_i2c1_t;
+
+/**
+ * @brief I2C2  (0X012)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pktlen_7_to_0 : 8;    /**< Packet Length */
+    } bits;
+} max41461_2_reg_i2c2_t;
+
+/**
+ * @brief I2C3  (0X13)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char i2c_tx_data : 8;    /**< Transmit data to be written into FIFO for I2C mode of operation.
+                                               At this address, I2C register address will not auto increment within an
+                                               I2C transaction burst, and subsequent writes will keep going to FIFO */
+    } bits;
+} max41461_2_reg_i2c3_t;
+
+/**
+ * @brief I2C4  (0X14)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tx_pktlen_14_to_8 : 7;    /**< Provides status information of bits
+                                                     transmitted for the current packet */
+        unsigned char pktcomplete       : 1;    /**< Indicates if Packet transmission is completed */
+    } bits;
+} max41461_2_reg_i2c4_t;
+
+/**
+ * @brief I2C5  (0X15)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tx_pktlen_7_to_0 : 8;    /**< Provides status information of bits
+                                                    transmitted for the current packet */
+    } bits;
+} max41461_2_reg_i2c5_t;
+
+/**
+ * @brief I2C6  (0X16)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fifo_words : 3;    /**< This field captures the number of locations currently filled in FIFO.
+                                              Each location corresponds to 8-bit data word */
+        unsigned char            : 1;
+        unsigned char fifo_full  : 1;    /**< FIFO Full Status */
+        unsigned char fifo_empty : 1;    /**< FIFO Empty Status */
+        unsigned char oflow      : 1;    /**< FIFO Overflow status */
+        unsigned char uflow      : 1;    /**< FIFO Underflow status */
+    } bits;
+} max41461_2_reg_i2c6_t;
+
+/**
+ * @brief CFG8  (0X17)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char softreset : 1;    /**< Places DUT into software reset. */
+        unsigned char           : 7;
+    } bits;
+} max41461_2_reg_cfg8_t;
+
+/**
+ * @brief CFG9  (0X18)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char xoen     : 1;    /**< Write to 0 binary.XO Enable register for test purpose */
+        unsigned char pllen    : 1;    /**< Write to 0 binary.PLL Enable register for test purpose */
+        unsigned char paen     : 1;    /**< Write to 0 binary.PA Enable register for test purpose */
+        unsigned char test_ana : 5;    /**< Write to 0_0000 binary.Test modes for analog block */
+    } bits;
+} max41461_2_reg_cfg9_t;
+
+/**
+ * @brief ADDL1  (0X19)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char ring_bias : 2;    /**< Write to 00 binary.Controls the current mirror ratio in Ring Oscillator
+                                             control. For lower frequencies, the number can be reduced for
+                                             slightly better phase noise. */
+        unsigned char ring_trim : 2;    /**< Write to 00 binary.
+                                             Adjusts the current control value for ring oscillator. */
+        unsigned char bias_trim : 2;    /**< Write to 00 binary.
+                                             Adjusts bias current for PLL block. */
+        unsigned char xtal_gm   : 2;    /**< Write to 00 binary.
+                                             Controls crystal oscillator GM current for startup time control */
+    } bits;
+} max41461_2_reg_addl1_t;
+
+/**
+ * @brief ADDL2  (0X1A)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char addlctrl2       : 7;    /**< Write to 000_0000 binary.Additional control fields for future use */
+        unsigned char scl_stretch_dly : 1;    /**< Write to 1 binary. I2C SCL Stretch Release delay enable */
+    } bits;
+} max41461_2_reg_addl2_t;
+
+/**
+ * @brief Register Set
+ *
+ */
+typedef struct {
+    max41461_2_reg_cfg1_t reg_cfg1;
+    max41461_2_reg_cfg2_t reg_cfg2;
+    max41461_2_reg_cfg3_t reg_cfg3;
+    max41461_2_reg_cfg4_t reg_cfg4;
+    max41461_2_reg_cfg5_t reg_cfg5;
+    max41461_2_reg_shdn_t reg_shdn;
+    max41461_2_reg_pa1_t reg_pa1;
+    max41461_2_reg_pa2_t reg_pa2;
+    max41461_2_reg_pll1_t reg_pll1;
+    max41461_2_reg_pll2_t reg_pll2;
+    max41461_2_reg_cfg6_t reg_cfg6;
+    max41461_2_reg_pll3_t reg_pll3;
+    max41461_2_reg_pll4_t reg_pll4;
+    max41461_2_reg_pll5_t reg_pll5;
+    max41461_2_reg_pll6_t reg_pll6;
+    max41461_2_reg_pll7_t reg_pll7;
+    max41461_2_reg_cfg7_t reg_cfg7;
+    max41461_2_reg_i2c1_t reg_i2c1;
+    max41461_2_reg_i2c2_t reg_i2c2;
+    max41461_2_reg_i2c3_t reg_i2c3;
+    max41461_2_reg_i2c4_t reg_i2c4;
+    max41461_2_reg_i2c5_t reg_i2c5;
+    max41461_2_reg_i2c6_t reg_i2c6;
+    max41461_2_reg_cfg8_t reg_cfg8;
+    max41461_2_reg_cfg9_t reg_cfg9;
+    max41461_2_reg_addl1_t reg_addl1;
+    max41461_2_reg_addl2_t reg_addl2;
+} max41461_2_reg_map_t;
+
+
+#endif /* MAX41461_2_REGS_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max4146x/Max41463_4_regs.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,433 @@
+/*******************************************************************************
+* Copyright (C) 2019 Maxim Integrated Products, Inc., All rights Reserved.
+*
+* This software is protected by copyright laws of the United States and
+* of foreign countries. This material may also be protected by patent laws
+* and technology transfer regulations of the United States and of foreign
+* countries. This software is furnished under a license agreement and/or a
+* nondisclosure agreement and may only be used or reproduced in accordance
+* with the terms of those agreements. Dissemination of this information to
+* any party or parties not specified in the license agreement and/or
+* nondisclosure agreement is expressly prohibited.
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+
+#ifndef MAX41463_4_REGS_H_
+#define MAX41463_4_REGS_H_
+
+/**
+ * @brief CFG1  (0x00)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char modmode    : 1;    /**< Configures modulator mode */
+        unsigned char sync       : 1;    /**< Controls if clock output acts as an input.
+                                              When an input, it will sample the DATA pin. */
+        unsigned char fskshape   : 1;    /**< Sets the state of FSK Gaussian Shaping */
+        unsigned char            : 1;
+        unsigned char xoclkdiv   : 2;    /**< XO clock division ratio for digital block */
+        unsigned char xoclkdelay : 2;    /**< Start delay before enabling XO clock to digital block */
+    } bits;
+} max41463_4_reg_cfg1_t;
+
+/**
+ * @brief CFG2  (0x01)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char bclk_postdiv : 3;    /**< Select the Baud Clock Post Division Ratio.
+                                                Valid values are from 1 to 5. */
+        unsigned char              : 3;
+        unsigned char clkout_delay : 2;    /**< Selects the delay when CLKOUT starts toggling upon
+                                                exiting SHUTDOWN mode, in divided XO clock cycles */
+    } bits;
+} max41463_4_reg_cfg2_t;
+
+/**
+ * @brief CFG3  (0x02)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char bclk_prediv : 8;    /**< Baud clock predivision ratio. Valid values are from 3 to 255 */
+    } bits;
+} max41463_4_reg_cfg3_t;
+
+/**
+ * @brief CFG4  (0x03)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pwdn_mode : 2;    /**< Power Down Mode Select */
+        unsigned char           : 6;
+    } bits;
+} max41463_4_reg_cfg4_t;
+
+/**
+ * @brief CFG5  (0x04)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tstep : 6;    /**< Controls GFSK shaping. See Digital FSK Modulation section. */
+        unsigned char       : 2;
+    } bits;
+} max41463_4_reg_cfg5_t;
+
+/**
+ * @brief SHDN  (0x05)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pa_boost        : 1;    /**< Enables a boost in PA output power for frequencies above 850MHz.
+                                                   This requires a different PA match compared to normal operation. */
+        unsigned char                 : 7;
+    } bits;
+} max41463_4_reg_shdn_t;
+
+/**
+ * @brief PA1  (0x06)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char papwr  : 3;    /**< Controls the PA output power by enabling parallel drivers. */
+        unsigned char        : 5;
+    } bits;
+} max41463_4_reg_pa1_t;
+
+/**
+ * @brief PA2  (0x07)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pacap     : 5;    /**< Controls shunt capacitance on PA output in fF. */
+        unsigned char           : 3;
+    } bits;
+} max41463_4_reg_pa2_t;
+
+/**
+ * @brief PLL1  (0x08)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char lomode      : 1;    /**< Sets LO generation. For lower power, choose LOWCURRENT.
+                                               For higher performance, choose LOWNOISE. */
+        unsigned char lodiv       : 2;    /**<  */
+        unsigned char loopbw      : 2;    /**< Write to 00 binary.Sets PLL loop bandwidth. */
+        unsigned char fracmode    : 1;    /**< Sets PLL between fractional-N and integer-N mode. */
+        unsigned char cplin       : 2;    /**< Sets the level of charge pump offset current for fractional N mode
+                                               to improve close in phase noise. Set to DISABLED for integer N mode. */
+    } bits;
+} max41463_4_reg_pll1_t;
+
+/**
+ * @brief PLL2  (0x09)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char cpval            : 2;    /**< Sets Charge Pump Current */
+        unsigned char                  : 4;
+        unsigned char lcvco_fast_start : 1;    /**< Write to 0 binary.
+                                                    Enables fast start of LC VCO because of bias filtering */
+        unsigned char lcvco_pwr        : 1;    /**< Write to 0 binary. Controls power in LC VCO */
+    } bits;
+} max41463_4_reg_pll2_t;
+
+/**
+ * @brief CFG6  (0x0A)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fourwire1 : 1;    /**<  */
+        unsigned char spi_txen1 : 1;    /**<  */
+        unsigned char i2c_txen1 : 1;    /**< Enables DATA transmission in I2C mode. Aliased address for I2C_TXEN1 */
+        unsigned char           : 5;
+    } bits;
+} max41463_4_reg_cfg6_t;
+
+/**
+ * @brief PLL3  (0x0B)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_23_to_16 : 8;    /**< FREQ value to PLL. LO frequency= FREQ<23:0>/2^16*fXTAL */
+    } bits;
+} max41463_4_reg_pll3_t;
+
+/**
+ * @brief PLL4  (0x0C)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_15_to_8 : 8;    /**< FREQ value to PLL */
+    } bits;
+} max41463_4_reg_pll4_t;
+
+/**
+ * @brief PLL5  (0x0D)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char freq_7_to_0 : 8;    /**< FREQ value to PLL */
+    } bits;
+} max41463_4_reg_pll5_t;
+
+/**
+ * @brief PLL6  (0x0E)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char deltaf : 7;    /**< For FSK mode, MODMODE=1 and FSKSHAPE=0, sets the frequency deviation from the
+                                          space frequency for the mark frequency. fDELTA = DELTAF[6:0] * fXTAL/ 8192 */
+        unsigned char        : 1;
+    } bits;
+} max41463_4_reg_pll6_t;
+
+/**
+ * @brief PLL7  (0x0F)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char deltaf_shape : 4;    /**< For FSK mode, MODMODE = 1 and FSKSHAPE = 1, sets the frequency deviation
+                                                from the space frequency for the mark frequency.
+                                                fDELTA = DELTAF_SHAPE[3:0] * fXTAL / 81920 */
+        unsigned char              : 4;
+    } bits;
+} max41463_4_reg_pll7_t;
+
+/**
+ * @brief CFG7  (0x10)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fourwire2 : 1;    /**<  */
+        unsigned char spi_txen2 : 1;    /**<  */
+        unsigned char i2c_txen2 : 1;    /**< When set, enables DATA transmission in I2C mode.
+                                             Aliased address for I2C_TXEN1 */
+        unsigned char           : 5;
+    } bits;
+} max41463_4_reg_cfg7_t;
+
+/**
+ * @brief I2C1  (0x11)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pktlen_14_to_8 : 7;    /**< Packet Length */
+        unsigned char pktlen_mode    : 1;    /**< Packet Length Mode */
+    } bits;
+} max41463_4_reg_i2c1_t;
+
+/**
+ * @brief I2C2  (0x12)
+ *
+ * Detailed explanation.
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char pktlen_7_to_0 : 8;    /**< Packet Length */
+    } bits;
+} max41463_4_reg_i2c2_t;
+
+/**
+ * @brief I2C3  (0x13)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char i2c_tx_data : 8;    /**< Transmit data to be written into FIFO for I2C mode of operation.
+                                               At this address, I2C register address will not auto increment within an
+                                               I2C transaction burst, and subsequent writes will keep going to FIFO */
+    } bits;
+} max41463_4_reg_i2c3_t;
+
+/**
+ * @brief I2C4  (0x14)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tx_pktlen_14_to_8 : 7;    /**< Provides status information of bits transmitted
+                                                     for the current packet */
+        unsigned char pktcomplete       : 1;    /**< Indicates if Packet transmission is completed */
+    } bits;
+} max41463_4_reg_i2c4_t;
+
+/**
+ * @brief I2C5  (0x15)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char tx_pktlen_7_to_0 : 8;    /**< Provides status information of bits transmitted
+                                                    for the current packet */
+    } bits;
+} max41463_4_reg_i2c5_t;
+
+/**
+ * @brief I2C6  (0x16)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char fifo_words : 3;    /**< This field captures the number of locations currently filled in FIFO.
+                                              Each location corresponds to 8-bit data word */
+        unsigned char            : 1;
+        unsigned char fifo_full  : 1;    /**< FIFO Full Status */
+        unsigned char fifo_empty : 1;    /**< FIFO Empty Status */
+        unsigned char oflow      : 1;    /**< FIFO Overflow status */
+        unsigned char uflow      : 1;    /**< FIFO Underflow status */
+    } bits;
+} max41463_4_reg_i2c6_t;
+
+/**
+ * @brief CFG8  (0x17)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char softreset : 1;    /**< Places DUT into software reset. */
+        unsigned char           : 7;
+    } bits;
+} max41463_4_reg_cfg8_t;
+
+/**
+ * @brief CFG9  (0x18)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char xoen     : 1;    /**< Write to 0 binary.XO Enable register for test purpose */
+        unsigned char pllen    : 1;    /**< Write to 0 binary.PLL Enable register for test purpose */
+        unsigned char paen     : 1;    /**< Write to 0 binary.PA Enable register for test purpose */
+        unsigned char test_ana : 5;    /**< Write to 0_0000 binary.Test modes for analog block */
+    } bits;
+} max41463_4_reg_cfg9_t;
+
+/**
+ * @brief ADDL1  (0x19)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char ring_bias : 2;    /**< Write to 00 binary. Controls the current mirror ratio in Ring Oscillator
+                                             control.  For lower frequencies, the number can be reduced for slightly
+                                             better phase noise. */
+        unsigned char ring_trim : 2;    /**< Write to 00 binary.
+                                             Adjusts the current control value for ring oscillator. */
+        unsigned char bias_trim : 2;    /**< Write to 00 binary. Adjusts bias current for PLL block. */
+        unsigned char xtal_gm   : 2;    /**< Write to 00 binary.
+                                             Controls crystal oscillator GM current for startup time control */
+    } bits;
+} max41463_4_reg_addl1_t;
+
+/**
+ * @brief ADLL2  (0x1A)
+ *
+ */
+typedef union {
+    unsigned char raw;
+    struct {
+        unsigned char addlctrl2       : 7;    /**< Write to 000_0000 binary. Additional control fields for future use */
+        unsigned char scl_stretch_dly : 1;    /**< Write to 1 binary. I2C SCL Stretch Release delay enable */
+    } bits;
+} max41463_4_reg_addl2_t;
+
+/**
+ * @brief Register Set
+ *
+ */
+typedef struct {
+    max41463_4_reg_cfg1_t reg_cfg1;
+    max41463_4_reg_cfg2_t reg_cfg2;
+    max41463_4_reg_cfg3_t reg_cfg3;
+    max41463_4_reg_cfg4_t reg_cfg4;
+    max41463_4_reg_cfg5_t reg_cfg5;
+    max41463_4_reg_shdn_t reg_shdn;
+    max41463_4_reg_pa1_t reg_pa1;
+    max41463_4_reg_pa2_t reg_pa2;
+    max41463_4_reg_pll1_t reg_pll1;
+    max41463_4_reg_pll2_t reg_pll2;
+    max41463_4_reg_cfg6_t reg_cfg6;
+    max41463_4_reg_pll3_t reg_pll3;
+    max41463_4_reg_pll4_t reg_pll4;
+    max41463_4_reg_pll5_t reg_pll5;
+    max41463_4_reg_pll6_t reg_pll6;
+    max41463_4_reg_pll7_t reg_pll7;
+    max41463_4_reg_cfg7_t reg_cfg7;
+    max41463_4_reg_i2c1_t reg_i2c1;
+    max41463_4_reg_i2c2_t reg_i2c2;
+    max41463_4_reg_i2c3_t reg_i2c3;
+    max41463_4_reg_i2c4_t reg_i2c4;
+    max41463_4_reg_i2c5_t reg_i2c5;
+    max41463_4_reg_i2c6_t reg_i2c6;
+    max41463_4_reg_cfg8_t reg_cfg8;
+    max41463_4_reg_cfg9_t reg_cfg9;
+    max41463_4_reg_addl1_t reg_addl1;
+    max41463_4_reg_addl2_t reg_addl2;
+} max41463_4_reg_map_t;
+
+#endif /* MAX41463_4_REGS_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max4146x/Max4146x.cpp	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,1212 @@
+/*******************************************************************************
+* Copyright (C) 2019 Maxim Integrated Products, Inc., All rights Reserved.
+*
+* This software is protected by copyright laws of the United States and
+* of foreign countries. This material may also be protected by patent laws
+* and technology transfer regulations of the United States and of foreign
+* countries. This software is furnished under a license agreement and/or a
+* nondisclosure agreement and may only be used or reproduced in accordance
+* with the terms of those agreements. Dissemination of this information to
+* any party or parties not specified in the license agreement and/or
+* nondisclosure agreement is expressly prohibited.
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+
+#include "Max4146x.h"
+#include <iostream>
+
+using namespace std;
+
+const uint8_t default_register_value_0[17] = {0x90, 0x81, 0x03, 0x00, 0x00, 0x04, 0x80, 0x80, 0x60, 0x00,
+                                              0x00, 0xC4, 0xDE, 0x98, 0x28, 0x04, 0x02};
+const uint8_t default_register_value_1[20] = {0x90, 0x81, 0x03, 0x00, 0x00, 0x04, 0x80, 0x80, 0x60, 0x00,
+                                              0x00, 0xC4, 0xDE, 0x98, 0x28, 0x04, 0x04, 0x00, 0xFF, 0x00};
+
+template <class REG>
+MAX4146X<REG>::MAX4146X(REG *reg, SPI *spi, DigitalOut *cs)
+{
+    operation_mode = UNINITIALIZED;
+
+    if (reg == NULL) {
+        return;
+    }
+
+    if (cs == NULL) {
+        return;
+    }
+
+    this->reg = reg;
+    ssel = cs;
+
+    if (spi == NULL) {
+        return;
+    }
+
+    spi_handler = spi;
+    i2c_handler = NULL;
+    preset_mode = 0;
+
+    if (initial_programming() < 0) {
+        return;
+    }
+
+    this->crystal_frequency = 16.0;
+    this->center_frequency = 315.0;
+    this->baud_rate = 5000.0;  //5 kHz
+
+    operation_mode = INITIALIZED;
+}
+
+template <class REG>
+MAX4146X<REG>::MAX4146X(REG *reg, SPI *spi)
+{
+    operation_mode = UNINITIALIZED;
+
+    if (reg == NULL) {
+        return;
+    }
+
+    this->reg = reg;
+
+    if (spi == NULL) {
+        return;
+    }
+
+    spi_handler = spi;
+    i2c_handler = NULL;
+    ssel = NULL;
+    preset_mode = 0;
+
+    if (initial_programming() < 0) {
+        return;
+    }
+
+    this->crystal_frequency = 16.0;
+    this->center_frequency = 315.0;
+    this->baud_rate = 5000.0; //5 kHz
+
+    operation_mode = INITIALIZED;
+}
+
+template <class REG>
+MAX4146X<REG>::MAX4146X(REG *reg, I2C *i2c)
+{
+    operation_mode = UNINITIALIZED;
+
+    if (reg == NULL) {
+        return;
+    }
+
+    this->reg = reg;
+
+    if (i2c == NULL) {
+        return;
+    }
+
+    i2c_handler = i2c;
+    spi_handler = NULL;
+    ssel = NULL;
+    preset_mode = 0;
+
+    if (initial_programming() < 0) {
+        return;
+    }
+
+    this->crystal_frequency = 16.0;
+    this->center_frequency = 315.0;
+    this->baud_rate = 5000.0;  //5 kHz
+
+    operation_mode = INITIALIZED;
+}
+
+template <class REG>
+MAX4146X<REG>::MAX4146X(DigitalOut *cs)
+{
+    operation_mode = UNINITIALIZED;
+
+    if (cs == NULL) {
+        return;
+    }
+
+    data_sent = cs;
+
+    data_rate = 5;
+
+    this->reg = NULL;
+    this->ssel = NULL;
+    spi_handler = NULL;
+    i2c_handler = NULL;
+    preset_mode = 1;
+
+    operation_mode = INITIALIZED;
+}
+
+template <>
+int MAX4146X<max41460_reg_map_t>::read_register(uint8_t reg, uint8_t *value, uint8_t len)
+{
+    int rtn_val = -1;
+
+    if (value == NULL) {
+        return -1;
+    }
+
+    if (this->reg == NULL) {
+        return -1;
+    }
+
+    if (ssel != NULL) {
+        *ssel = 0;
+    }
+    spi_handler->write((uint8_t)0x80 | reg);
+    for (uint8_t i = 0; i < len; i++) {
+        *(value++) = spi_handler->write(0x00);     // read back  data bytes
+    }
+    if (ssel != NULL) {
+        *ssel = 1;
+    }
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::read_register(uint8_t reg, uint8_t *value, uint8_t len)
+{
+    int rtn_val = -1;
+
+    if (value == NULL) {
+        return -1;
+    }
+
+    if (this->reg == NULL) {
+        return -1;
+    }
+
+    rtn_val = i2c_handler->write(I2C_ADDRESS, (const char *)&reg, 1, true);
+    if (rtn_val != 0) {
+        return -1;
+    }
+
+    rtn_val = i2c_handler->read(I2C_ADDRESS, (char *) value, len, false);
+    if (rtn_val < 0) {
+        return rtn_val;
+    }
+
+    return 0;
+}
+
+template <>
+int MAX4146X<max41460_reg_map_t>::write_register(uint8_t reg, const uint8_t *value, uint8_t len)
+{
+    int rtn_val = -1;
+    uint8_t local_data[1 + len];
+
+    if (value == NULL) {
+        return -1;
+    }
+
+    memcpy(&local_data[0], value, len);
+
+    rtn_val = spi_handler->write(0x7F & reg); // write mode and adress send
+    for (int i = 0; i < len; i++) {
+        rtn_val = spi_handler->write(local_data[i]); // write adress
+    }
+    if (rtn_val != 0) {
+        return rtn_val;
+    }
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::write_register(uint8_t reg, const uint8_t *value, uint8_t len)
+{
+    int rtn_val = -1;
+    uint8_t local_data[1 + len];
+
+    if (value == NULL) {
+        return -1;
+    }
+
+    local_data[0] = reg;
+
+    memcpy(&local_data[1], value, len);
+
+    rtn_val = i2c_handler->write(I2C_ADDRESS, (const char *)local_data,
+            sizeof(local_data));
+    if (rtn_val != 0) {
+        return -1;
+    }
+
+    return 0;
+}
+
+#define SET_BIT_FIELD(address, reg_name, bit_field_name, value)                             \
+                int ret;                                                                    \
+                ret = read_register(address, (uint8_t *)&(reg_name), 1);                    \
+                if (ret) {                                                                  \
+                    return ret;                                                             \
+                }                                                                           \
+                bit_field_name = value;                                                     \
+                ret = write_register(address, (uint8_t *)&(reg_name), 1);                   \
+                if (ret) {                                                                  \
+                    return ret;                                                             \
+                }
+
+template <class REG>
+int MAX4146X<REG>::set_crystal_frequency(float freq)
+{
+    if (freq < 250 || freq > 950) {
+        return -1;
+    }
+    this->crystal_frequency = freq;
+
+    return 0;
+}
+
+template <class REG>
+float MAX4146X<REG>::get_crystal_frequency()
+{
+    return this->crystal_frequency;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_center_frequency(float freq)
+{
+    if (freq < 250 || freq > 950) {
+        return -1;
+    }
+
+    this->center_frequency = freq;
+
+    uint32_t value = (uint32_t)((65536 * freq) / this->crystal_frequency); //65536 is constant defined in the datasheet
+
+    return this->set_frequency(value);
+}
+
+template <class REG>
+float MAX4146X<REG>::get_center_frequency()
+{
+    return this->center_frequency;
+}
+
+template <class REG>
+int MAX4146X<REG>::adjust_baudrate(float rate)
+{
+    if (rate < 195.3 || rate > 200000.0) {
+        return -1;
+    }
+
+    if (this->preset_mode == 1) {
+        this->baud_rate = rate;
+    }
+
+    int error = 0;
+    uint8_t prediv = 3;
+
+    if (rate < 12500.0) {
+        error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_5);
+        prediv = (uint8_t)((50000.0 / rate) - 1);
+    } else if (rate < 25000.0) {
+        error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_4);
+        prediv = (uint8_t)((100000.0 / rate) - 1);
+    } else if (rate < 50000.0) {
+        error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_3);
+        prediv = (uint8_t)((200000.0 / rate) - 1);
+    } else if (rate < 100000.0) {
+        error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_2);
+        prediv = (uint8_t)((400000.0 / rate) - 1);
+    } else {
+        error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_1);
+        prediv = (uint8_t)((800000.0 / rate) - 1);
+    }
+
+    if (error < 0) {
+        return -1;
+    }
+
+    return this->set_bclk_prediv(prediv);
+}
+
+template <class REG>
+float MAX4146X<REG>::get_baudrate()
+{
+    return this->baud_rate;
+}
+
+template <class REG>
+int MAX4146X<REG>::adjust_frequency_deviation(float deviation)
+{
+    uint8_t dev = 0;
+
+    if (this->read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1) < 0) {
+        return -1;
+    }
+
+    if (this->reg->reg_cfg1.bits.fskshape == 0) {
+        dev = (uint8_t)(deviation * 8.192 / crystal_frequency);
+        if (dev < 127) {
+            return this->set_deltaf(dev);
+        }
+    } else {
+        dev = (uint8_t)(deviation * 81.92 / crystal_frequency); // crystal_frequency in MHz form
+        if (dev < 15) {
+            return this->set_deltaf_shape(dev);
+        }
+    }
+
+    return -1;
+}
+
+template <class REG>
+int MAX4146X<REG>::adjust_manchester_bitrate(char rate)
+{
+    this->data_rate = rate;
+
+    return 0;
+}
+
+template <class REG>
+char MAX4146X<REG>::get_manchester_bitrate()
+{
+    return this->data_rate;
+}
+
+template <>
+int MAX4146X<max41460_reg_map_t>::send_data(uint8_t *data, uint32_t length)
+{
+    if (this->preset_mode == 0) {
+
+        if (ssel != NULL) {
+            *ssel = 0;
+        }
+
+        spi_handler->write(0x7F & 0x0A); /*write mode and adress send*/
+
+        spi_handler->write(0x01); /*write data SPI_EN1 clear*/
+
+
+        if (ssel != NULL) {
+            *ssel = 1;
+        }
+
+        wait_us(300); /* for waiting another SPI operation*/
+
+        if (ssel != NULL) {
+            *ssel = 0;
+        }
+
+        spi_handler->write(0x7F & 0x10); /*write mode and adress send*/
+
+        spi_handler->write(0x03); /*write data SPI_EN2 set*/
+
+        if (ssel != NULL) {
+            *ssel = 0;
+        }
+
+        wait_us(300); /* for waiting another SPI operation*/
+
+    }
+
+    return this->io_write(data, length);
+}
+
+template <class REG>
+int MAX4146X<REG>::send_data(uint8_t *data, uint32_t length)
+{
+    if (this->preset_mode == 0) {
+        if (length > 32767) {
+            return -100;
+        }
+
+        this->adjust_baudrate(this->baud_rate);
+
+//        this->set_i2c_txen1(I2C_TXEN1_DISABLE);
+
+        char * value = (char *)malloc(17 * sizeof(char));
+
+        if (value == NULL) {
+        	return -99;
+        }
+
+        int rtn_val = i2c_handler->write(I2C_ADDRESS, (char *) 0x00, 1, true);
+        rtn_val = i2c_handler->read(I2C_ADDRESS, value, length, true);
+		if (rtn_val != 0) {
+			return rtn_val;
+		}
+
+		free(value);
+
+        uint8_t local_data[4+length];
+
+        local_data[0] = CFG7_ADDR;
+        local_data[1] = 0x04;
+        local_data[2] = (uint8_t)((length >> 8) | 0x80);
+        local_data[3] = (uint8_t)((length) & 0x0FF);
+
+        memcpy(&local_data[4], data, length);
+
+        i2c_handler->write(I2C_ADDRESS, (const char *)local_data, sizeof(local_data), false);
+
+    } else {
+        this->io_write(data, length);
+    }
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::io_write(uint8_t *data, uint32_t length)
+{
+    //manchester array
+    manchester_bit_array = new  unsigned char[length * 2 * 8];
+
+    //bit array
+    bits_array = new unsigned char[length * 8];
+
+    //byte to bit conversion
+    for (int i = 0; i < length; i++) {
+        for (int j = 0; j < 8; j++) {
+            // Mask each bit in the byte and store it
+            if (data[i] & (mask << j)) {
+                bits_array[i * 8 + j] = 1;
+            } else {
+                bits_array[i * 8 + j] = 0;
+            }
+        }
+    }
+
+    //manchester encode
+    for (int i = 0; i < length * 8; i++) {
+        if (bits_array[i] == 0) {
+            //falling edge
+            manchester_bit_array[2 * i] = 1;
+            manchester_bit_array[2 * i + 1] = 0;
+        } else {
+            //rising edge
+            manchester_bit_array[2 * i] = 0;
+            manchester_bit_array[2 * i + 1] = 1;
+        }
+    }
+
+    delete[] bits_array;  //delete bit array anymore not used
+
+    float result = (500.0 / data_rate);
+
+    bool rxFinished = false;
+    Timer t;
+    core_util_critical_section_enter();
+    *this->data_sent = 0;
+    wait_us(100);
+    *this->data_sent = 1;
+    wait_us(350);
+    *this->data_sent = 0;
+    wait_us(10);
+    t.start();
+    int manch_bit_counter = 0;
+    do {
+        if (t.read_us() >= (result * manch_bit_counter)) {
+            if (manchester_bit_array[manch_bit_counter] == 0) {
+                *this->data_sent = 0;
+            } else {
+                *this->data_sent = 1;
+            }
+
+            manch_bit_counter++;
+
+            if (manch_bit_counter >= (length * 2 * 8)) {
+                rxFinished = true;
+                t.stop();
+                if (this->ssel != NULL) {
+                    *this->ssel = 1;
+                }
+            }
+
+        }
+    } while (!rxFinished);
+    *this->data_sent = 0;
+    core_util_critical_section_exit();
+
+    delete[]  manchester_bit_array;  //manchester array clean
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_softreset(softreset_t softreset)
+{
+    SET_BIT_FIELD(CFG8_ADDR, this->reg->reg_cfg8, this->reg->reg_cfg8.bits.softreset, softreset);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_xoclkdelay(xoclkdelay_t delay)
+{
+    SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.xoclkdelay, delay);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_xoclkdelay(xoclkdelay_t *delay)
+{
+    int ret;
+
+    ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *delay = (xoclkdelay_t)this->reg->reg_cfg1.bits.xoclkdelay;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_fifo_flags(uint8_t *fifo_flags)
+{
+    return read_register(I2C6_ADDR, fifo_flags, 1);
+}
+
+template <class REG>
+int MAX4146X<REG>::get_pktcomplete(uint8_t *pktcomplete)
+{
+    int ret;
+
+    ret = read_register(I2C4_ADDR, (uint8_t *) & (this->reg->reg_i2c4), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *pktcomplete = (uint8_t)this->reg->reg_i2c4.bits.pktcomplete;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_tx_pktlen(uint16_t *pktlen)
+{
+    int ret;
+
+    ret = read_register(I2C4_ADDR, (uint8_t *) & (this->reg->reg_i2c4), 2);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *pktlen = (uint16_t)(((this->reg->reg_i2c4.bits.tx_pktlen_14_to_8) << 8) + (this->reg->reg_i2c5.raw)) ;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_xoclkdiv(xoclkdiv_t div)
+{
+    SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.xoclkdiv, div);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_xoclkdiv(xoclkdiv_t* div)
+{
+    int ret;
+
+    ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *div = (xoclkdiv_t)this->reg->reg_cfg1.bits.xoclkdiv;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_fskshape(fskshape_t shape)
+{
+    SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.fskshape, shape);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_fskshape(fskshape_t* shape)
+{
+    int ret;
+
+    ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *shape = (fskshape_t)this->reg->reg_cfg1.bits.fskshape;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_sync(sync_t state)
+{
+    SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.sync, state);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_sync(sync_t* state)
+{
+    int ret;
+
+    ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *state = (sync_t)this->reg->reg_cfg1.bits.sync;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_modmode(modmode_t mode)
+{
+    SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.modmode, mode);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_modmode(modmode_t* mode)
+{
+    int ret;
+
+    ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *mode = (modmode_t)this->reg->reg_cfg1.bits.modmode;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_clkout_delay(clkout_delay_t delay)
+{
+    SET_BIT_FIELD(CFG2_ADDR, this->reg->reg_cfg2, this->reg->reg_cfg2.bits.clkout_delay, delay);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_clkout_delay(clkout_delay_t* delay)
+{
+    int ret;
+
+    ret = read_register(CFG2_ADDR, (uint8_t *) & (this->reg->reg_cfg2), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *delay = (clkout_delay_t)this->reg->reg_cfg2.bits.clkout_delay;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_bclk_postdiv(bclk_postdiv_t div)
+{
+    SET_BIT_FIELD(CFG2_ADDR, this->reg->reg_cfg2, this->reg->reg_cfg2.bits.bclk_postdiv, div);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_bclk_postdiv(bclk_postdiv_t* div)
+{
+    int ret;
+
+    ret = read_register(CFG2_ADDR, (uint8_t *) & (this->reg->reg_cfg2), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *div = (bclk_postdiv_t)this->reg->reg_cfg2.bits.bclk_postdiv;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_bclk_prediv(uint8_t prediv)
+{
+    if (prediv < 3) {
+        return -1;
+    }
+
+    SET_BIT_FIELD(CFG3_ADDR, this->reg->reg_cfg3, this->reg->reg_cfg3.bits.bclk_prediv, prediv);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_bclk_prediv(uint8_t* prediv)
+{
+    int ret;
+
+    ret = read_register(CFG3_ADDR, (uint8_t *) & (this->reg->reg_cfg3), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *prediv = (uint8_t)this->reg->reg_cfg3.bits.bclk_prediv;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_pwdn_mode(pwdn_mode_t pwdn_mode)
+{
+    SET_BIT_FIELD(CFG4_ADDR, this->reg->reg_cfg4, this->reg->reg_cfg4.bits.pwdn_mode, pwdn_mode);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_pwdn_mode(pwdn_mode_t* pwdn_mode)
+{
+    int ret;
+
+    ret = read_register(CFG4_ADDR, (uint8_t *) & (this->reg->reg_cfg4), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *pwdn_mode = (pwdn_mode_t)this->reg->reg_cfg4.bits.pwdn_mode;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_tstep(uint8_t tstep)
+{
+    SET_BIT_FIELD(CFG5_ADDR, this->reg->reg_cfg5, this->reg->reg_cfg5.bits.tstep, tstep);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_tstep(uint8_t* tstep)
+{
+    int ret;
+
+    ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_cfg5), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *tstep = (uint8_t)this->reg->reg_cfg5.bits.tstep;
+
+    return 0;
+}
+/*sdivarci*/
+template <class REG>
+int MAX4146X<REG>::set_i2c_txen1(i2c_txen1_t setting)
+{
+    SET_BIT_FIELD(CFG6_ADDR, this->reg->reg_cfg6, this->reg->reg_cfg6.bits.i2c_txen1, setting);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_i2c_txen2(i2c_txen2_t setting)
+{
+    SET_BIT_FIELD(CFG7_ADDR, this->reg->reg_cfg7, this->reg->reg_cfg7.bits.i2c_txen2, setting);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_i2c_data(uint8_t setting)
+{
+	return write_register(I2C3_ADDR, (uint8_t *)&setting, 1);
+}
+
+
+
+
+template <class REG>
+int MAX4146X<REG>::set_pa_boost(pa_boost_t pa_boost)
+{
+    SET_BIT_FIELD(SHDN_ADDR, this->reg->reg_shdn, this->reg->reg_shdn.bits.pa_boost, pa_boost);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_pa_boost(pa_boost_t* pa_boost)
+{
+    int ret;
+
+    ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_shdn), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *pa_boost = (pa_boost_t)this->reg->reg_shdn.bits.pa_boost;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_papwr(papwr_t papwr)
+{
+    SET_BIT_FIELD(PA1_ADDR, this->reg->reg_pa1, this->reg->reg_pa1.bits.papwr, papwr);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_papwr(papwr_t* papwr)
+{
+    int ret;
+
+    ret = read_register(PA1_ADDR, (uint8_t *) & (this->reg->reg_pa1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *papwr = (papwr_t)this->reg->reg_pa1.bits.papwr;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_pacap(pacap_t pacap)
+{
+    SET_BIT_FIELD(PA2_ADDR, this->reg->reg_pa2, this->reg->reg_pa2.bits.pacap, pacap);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_pacap(pacap_t* pacap)
+{
+    int ret;
+
+    ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_pa2), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *pacap = (pacap_t)this->reg->reg_pa2.bits.pacap;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_cplin(cplin_t cplin)
+{
+    SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.cplin, cplin);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_cplin(cplin_t* cplin)
+{
+    int ret;
+
+    ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *cplin = (cplin_t)this->reg->reg_pll1.bits.cplin;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_fracmode(fracmode_t fracmode)
+{
+    SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.fracmode, fracmode);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_fracmode(fracmode_t* fracmode)
+{
+    int ret;
+
+    ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *fracmode = (fracmode_t)this->reg->reg_pll1.bits.fracmode;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_lodiv(lodiv_t lodiv)
+{
+    SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.lodiv, lodiv);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_lodiv(lodiv_t* lodiv)
+{
+    int ret;
+
+    ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *lodiv = (lodiv_t)this->reg->reg_pll1.bits.lodiv;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_lomode(lomode_t lomode)
+{
+    SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.lomode, lomode);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_lomode(lomode_t* lomode)
+{
+    int ret;
+
+    ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *lomode = (lomode_t)this->reg->reg_pll1.bits.lomode;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_cpval(cpval_t cpval)
+{
+
+    SET_BIT_FIELD(PLL2_ADDR, this->reg->reg_pll2, this->reg->reg_pll2.bits.cpval, cpval);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_cpval(cpval_t* cpval)
+{
+    int ret;
+
+    ret = read_register(PLL2_ADDR, (uint8_t *) & (this->reg->reg_pll2), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *cpval = (cpval_t)this->reg->reg_pll2.bits.cpval;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_frequency(uint32_t freq)
+{
+    uint8_t value[3] = {(uint8_t)(freq >> 16), (uint8_t)(freq >> 8), (uint8_t)freq};
+
+    return write_register(PLL3_ADDR, (uint8_t *)&value, 3);
+
+}
+
+template <class REG>
+int MAX4146X<REG>::get_frequency(uint32_t* freq)
+{
+    int ret;
+
+    uint8_t value[3];
+
+    ret =  read_register(PLL3_ADDR, (uint8_t *)&value, 3);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *freq = (uint32_t)((value[0] << 16) + (value[1] << 8) + value[2]);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_deltaf(uint8_t deltaf)
+{
+    if (deltaf > 127) {
+        return -1;
+    }
+
+    SET_BIT_FIELD(PLL6_ADDR, this->reg->reg_pll6, this->reg->reg_pll6.bits.deltaf, deltaf);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_deltaf(uint8_t* deltaf)
+{
+    int ret;
+
+    ret = read_register(PLL6_ADDR, (uint8_t *) & (this->reg->reg_pll6), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *deltaf = (uint8_t)this->reg->reg_pll6.bits.deltaf;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_deltaf_shape(uint8_t deltaf_shape)
+{
+    if (deltaf_shape > 15) {
+        return -1;
+    }
+
+    SET_BIT_FIELD(PLL7_ADDR, this->reg->reg_pll7, this->reg->reg_pll7.bits.deltaf_shape, deltaf_shape);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_deltaf_shape(uint8_t* deltaf_shape)
+{
+    int ret;
+
+    ret = read_register(PLL7_ADDR, (uint8_t *) & (this->reg->reg_pll7), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *deltaf_shape = (uint8_t)this->reg->reg_pll7.bits.deltaf_shape;
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::set_pktlen_mode(pktlen_mode_t pktlen_mode)
+{
+    SET_BIT_FIELD(I2C1_ADDR, this->reg->reg_i2c1, this->reg->reg_i2c1.bits.pktlen_mode, pktlen_mode);
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::get_pktlen_mode(pktlen_mode_t* pktlen_mode)
+{
+    int ret;
+
+    ret = read_register(I2C1_ADDR, (uint8_t *) & (this->reg->reg_i2c1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *pktlen_mode = (pktlen_mode_t)this->reg->reg_i2c1.bits.pktlen_mode;
+
+    return 0;
+}
+
+
+template <class REG>
+int MAX4146X<REG>::set_i2c_pktlen(uint16_t pktlen)
+{
+    if (pktlen > 0x7FF) {
+        return -1;
+    }
+
+    SET_BIT_FIELD(I2C1_ADDR, this->reg->reg_i2c1, this->reg->reg_i2c1.bits.pktlen_14_to_8, (uint8_t)((pktlen >> 8) & 0x07));
+
+    uint8_t value = (uint8_t)(pktlen & 0xFF);
+
+    return write_register(I2C2_ADDR, (uint8_t *)&value, 1);
+}
+
+template <class REG>
+int MAX4146X<REG>::get_i2c_pktlen(uint16_t* pktlen)
+{
+    int ret;
+
+    ret = read_register(I2C1_ADDR, (uint8_t *) & (this->reg->reg_i2c1), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    ret = read_register(I2C2_ADDR, (uint8_t *) & (this->reg->reg_i2c2), 1);
+    if (ret < 0) {
+        return ret;
+    }
+
+    *pktlen = (uint16_t)(((this->reg->reg_i2c1.raw & 0x7F)<<8) + (this->reg->reg_i2c2.raw &0x7F));
+
+    return 0;
+}
+
+template <class REG>
+int MAX4146X<REG>::initial_programming(void)
+{
+    uint8_t value = 0x80;
+    write_register(ADDL2_ADDR, (uint8_t *)&value, 1);
+
+    return write_register(CFG1_ADDR, default_register_value_1, 20);
+}
+
+template <>
+int MAX4146X<max41460_reg_map_t>::initial_programming(void)
+{
+    if (this->ssel != NULL){
+        *this->ssel = 0;
+        wait_us(100);
+    }
+
+    int rtn = write_register(CFG1_ADDR, default_register_value_0, 17);
+
+    if (this->ssel != NULL){
+        wait_us(90);
+        *this->ssel = 1;
+    }
+
+    return rtn;
+}
+
+
+template class MAX4146X<max41460_reg_map_t>;
+template class MAX4146X<max41461_2_reg_map_t>;
+template class MAX4146X<max41463_4_reg_map_t>;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max4146x/Max4146x.h	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,1232 @@
+/*******************************************************************************
+* Copyright (C) 2019 Maxim Integrated Products, Inc., All rights Reserved.
+*
+* This software is protected by copyright laws of the United States and
+* of foreign countries. This material may also be protected by patent laws
+* and technology transfer regulations of the United States and of foreign
+* countries. This software is furnished under a license agreement and/or a
+* nondisclosure agreement and may only be used or reproduced in accordance
+* with the terms of those agreements. Dissemination of this information to
+* any party or parties not specified in the license agreement and/or
+* nondisclosure agreement is expressly prohibited.
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+
+#ifndef MAX4146x_H_
+#define MAX4146x_H_
+
+#include "mbed.h"
+#include "Max41460_regs.h"
+#include "Max41461_2_regs.h"
+#include "Max41463_4_regs.h"
+
+#define I2C_ADDRESS    0xD2
+
+/**
+ * @brief Base Class for All Maxim Max4146x RF Transmitters
+ *
+ * @details The MAX4146X is a UHF sub-GHz ISM/SRD transmitter
+ */
+template <class REG>
+class MAX4146X
+{
+private:
+    REG *reg;
+    I2C *i2c_handler;
+    SPI *spi_handler;
+    DigitalOut *ssel;
+
+    //manchester coding variables
+    unsigned char *manchester_bit_array;
+    unsigned char *bits_array;
+    static const unsigned char mask = 1; // Bit mask
+    char data_rate;
+    DigitalOut *data_sent; // data sent pin
+
+    uint8_t preset_mode;
+    float crystal_frequency ;
+    float center_frequency;
+    float baud_rate;
+
+    typedef enum {
+        CFG1_ADDR       = 0x00,
+        CFG2_ADDR       = 0x01,
+        CFG3_ADDR       = 0x02,
+        CFG4_ADDR       = 0x03,
+        CFG5_ADDR       = 0x04,
+        SHDN_ADDR       = 0x05,
+        PA1_ADDR        = 0x06,
+        PA2_ADDR        = 0x07,
+        PLL1_ADDR       = 0x08,
+        PLL2_ADDR       = 0x09,
+        CFG6_ADDR       = 0x0A,
+        PLL3_ADDR       = 0x0B,
+        PLL4_ADDR       = 0x0C,
+        PLL5_ADDR       = 0x0D,
+        PLL6_ADDR       = 0x0E,
+        PLL7_ADDR       = 0x0F,
+        CFG7_ADDR       = 0x10,
+        I2C1_ADDR       = 0x11,
+        I2C2_ADDR       = 0x12,
+        I2C3_ADDR       = 0x13,
+        I2C4_ADDR       = 0x14,
+        I2C5_ADDR       = 0x15,
+        I2C6_ADDR       = 0x16,
+        CFG8_ADDR       = 0x17,
+        CFG9_ADDR       = 0x18,
+        ADDL1_ADDR      = 0x19,
+        ADDL2_ADDR      = 0x1A,
+    } register_address_t;
+
+//Functions
+
+protected:
+
+    //Functions
+    int io_write(uint8_t *data, uint32_t length);
+
+public:
+
+    //Constructors
+    MAX4146X(REG *reg, SPI *spi, DigitalOut *cs);
+
+    MAX4146X(REG *reg, SPI *spi);
+
+    MAX4146X(REG *reg, I2C *i2c);
+
+    MAX4146X(DigitalOut *cs);
+
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG1(0x00)
+     *  - Bit Fields    : [7:6]
+     *  - Default       : 0x2
+     *  - Description   : Start delay before enabling XO clock to digital block
+     */
+    typedef enum {
+        XOCLKDELAY_0_CYCLE,     /**< 0x0: No delay. XO clock is immediately enabled to rest of digital block */
+        XOCLKDELAY_16_CYCLE,    /**< 0x1: XO clock is enabled after 16 cycles to rest of digital block */
+        XOCLKDELAY_32_CYCLE,    /**< 0x2: XO clock is enabled after 32 cycles to rest of digital block */
+        XOCLKDELAY_64_CYCLE,    /**< 0x3: XO clock is enabled after 64 cycles to rest of digital block */
+    } xoclkdelay_t;
+
+    /**
+     * @brief Set start delay before enabling XO clock to digital block
+     *
+     * @param[in] delay delay cycle
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_xoclkdelay(xoclkdelay_t delay);
+
+    /**
+     * @brief Get start delay before enabling XO clock to digital block
+     *
+     * @param[in] delay delay cycle
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_xoclkdelay(xoclkdelay_t *delay);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  -Register       : CFG1(0x00)
+     *  - Bit Fields    : [5:4]
+     *  - Default       : 0x2
+     *  - Description   : XO clock division ratio for digital block
+     */
+    typedef enum {
+        XOCLKDIV_BY_4, /**< 0x0: Divide XO clock by 4 for digital clock */
+        XOCLKDIV_BY_5, /**< 0x1: Divide XO clock by 5 for digital clock. High time is 2 cycles, low time is 3 cycles */
+        XOCLKDIV_BY_6, /**< 0x2: Divide XO clock by 6 for digital clock */
+        XOCLKDIV_BY_7, /**< 0x3: Divide XO clock by 7 for digital clock. High time is 3 cycles,
+                            and low time is 4 cycles */
+    } xoclkdiv_t;
+
+    /**
+     * @brief Set XO clock division ratio for digital block
+     *
+     * @param[in] div division ratio
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_xoclkdiv(xoclkdiv_t div);
+
+    /**
+     * @brief Get XO clock division ratio for digital block
+     *
+     * @param[in] div division ratio
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_xoclkdiv(xoclkdiv_t *div);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG1(0x00)
+     *  - Bit Fields    : [2]
+     *  - Default       : 0b0
+     *  - Description   : Sets the state of FSK Gaussian Shaping
+     */
+    typedef enum {
+        FSKSHAPE_DISABLE,   /**< 0x0: FSK Shaping disabled */
+        FSKSHAPE_ENABLE,    /**< 0x1: FSK Shaping enabled */
+    } fskshape_t;
+
+    /**
+     * @brief Sets the state of FSK Gaussian Shaping
+     *
+     * @param[in] shape enable/disable fskshaping
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_fskshape(fskshape_t shape);
+
+    /**
+     * @brief Gets the state of FSK Gaussian Shaping
+     *
+     * @param[in] shape enable/disable fskshaping
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_fskshape(fskshape_t *shape);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG1(0x00)
+     *  - Bit Fields    : [1]
+     *  - Default       : 0b0
+     *  - Description   : Controls if clock output acts as an input. When an input,
+     *                    it will sample the DATA pin.
+     */
+    typedef enum {
+        SYNC_0,     /**< 0x0: asynchronous transmission mode */
+        SYNC_1,     /**< 0x1: synchronous transmission mode */
+    } sync_t;
+
+    /**
+     * @brief Sets the state of clock pin
+     *
+     * @param[in] state pin state async/sync
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_sync(sync_t state);
+
+    /**
+     * @brief Gets the state of clock pin
+     *
+     * @param[in] state pin state async/sync
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_sync(sync_t *state);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register       : CFG1(0x00)
+     *  - Bit Fields     : [0]
+     *  - Default        : 0b0
+     *  - Description    : Configures modulator mode
+     */
+    typedef enum {
+        MODMODE_ASK,    /**< 0x0: ASK Mode */
+        MODMODE_FSK,    /**< 0x1: FSK Mode */
+    } modmode_t;
+
+    /**
+     * @brief Sets modulator mode to ASK or FSK
+     *
+     * @param[in] mode ASK or FSK
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_modmode(modmode_t mode);
+
+    /**
+     * @brief Gets modulator mode
+     *
+     * @param[in] mode ASK or FSK
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_modmode(modmode_t* mode);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG2(0x01)
+     *  - Bit Fields    : [7:6]
+     *  - Default       : 0x2
+     *  - Description   : Selects the delay when CLKOUT starts
+     *                    toggling upon exiting SHUTDOWN mode,
+     *                    in divided XO clock cycles
+     */
+    typedef enum {
+        CLKOUT_DELAY_64_CYCLE,  /**< 0x0: CLKOUT will start toggling after 64 cycles
+                                     whenever moving into normal mode from shutdown mode */
+        CLKOUT_DELAY_128_CYCLE, /**< 0x1: CLKOUT will start toggling after 128 cycles
+                                     whenever moving into normal mode from shutdown mode */
+        CLKOUT_DELAY_256_CYCLE, /**< 0x2: CLKOUT will start toggling after 256 cycles
+                                     whenever moving into normal mode from shutdown mode */
+        CLKOUT_DELAY_512_CYCLE, /**< 0x3: CLKOUT will start toggling after 512 cycles
+                                     whenever moving into normal mode from shutdown mode */
+    } clkout_delay_t;
+
+    /**
+     * @brief Sets clkout delay
+     *
+     * @param[in] delay delay cycles
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_clkout_delay(clkout_delay_t delay);
+
+    /**
+     * @brief Gets clkout delay
+     *
+     * @param[in] delay delay cycles
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_clkout_delay(clkout_delay_t* delay);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG2(0x01)
+     *  - Bit Fields    : [2:0]
+     *  - Default       : 0x1
+     *  - Description   : Baud clock post-divider setting.
+     */
+    typedef enum {
+        BCLK_POSTDIV_RESERVED_0,    /**< 0x0: RESERVED */
+        BCLK_POSTDIV_BY_1,          /**< 0x1: Divide by 1 */
+        BCLK_POSTDIV_BY_2,          /**< 0x2: Divide by 2 */
+        BCLK_POSTDIV_BY_3,          /**< 0x3: Divide by 3 */
+        BCLK_POSTDIV_BY_4,          /**< 0x4: Divide by 4 */
+        BCLK_POSTDIV_BY_5,          /**< 0x5: Divide by 5 */
+        BCLK_POSTDIV_RESERVED_6,    /**< 0x6: RESERVED */
+        BCLK_POSTDIV_RESERVED_7,    /**< 0x7: RESERVED */
+    } bclk_postdiv_t;
+
+    /**
+     * @brief Sets baud clock post-divider
+     *
+     * @param[in] div divider value
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_bclk_postdiv(bclk_postdiv_t div);
+
+    /**
+     * @brief Gets baud clock post-divider
+     *
+     * @param[in] div divider value
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_bclk_postdiv(bclk_postdiv_t* div);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG4(0x03)
+     *  - Bit Fields    : [1:0]
+     *  - Default       : 0x0
+     *  - Description   : Power Down Mode Select.
+     */
+    typedef enum {
+        PWDN_MODE_SHUTDOWN,                 /**< 0x0: SHUTDOWN low power state is enabled. While entering
+                                                 low power state, XO, PLL, and PA are shutdown. */
+        PWDN_MODE_STANDBY,                  /**< 0x1: STANDBY low power state is enabled. While entering
+                                                 low power state, XO is enabled. PLL and PA are shutdown */
+        PWDN_MODE_FAST_WAKEUP,              /**< 0x2: FAST WAKEUP low power state is enabled. While entering
+                                                 low power state, XO and PLL are enabled. PA is shutdown. */
+        PWDN_MODE_REVERT_TO_FAST_WAKEUP,    /**< 0x3: Will revert to 0x2 */
+    } pwdn_mode_t;
+
+    /**
+     * @brief Sets power down mode
+     *
+     * @param[in] pwdn_mode power down mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_pwdn_mode(pwdn_mode_t pwdn_mode);
+
+    /**
+     * @brief Gets power down mode
+     *
+     * @param[in] pwdn_mode power down mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_pwdn_mode(pwdn_mode_t* pwdn_mode);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : SHDN(0x05)
+     *  - Bit Fields    : [0]
+     *  - Default       : 0x0
+     *  - Description   : Enables a boost in PA output power for frequencies above 850MHz.
+     *                    This requires a different PA match compared to normal operation.
+     */
+    typedef enum {
+        PA_BOOST_NORMAL_MODE,   /**< 0x0: PA Output power in normal operation. */
+        PA_BOOST_BOOST_MODE,    /**< 0x1: PA Output power in boost mode for more output power. */
+    } pa_boost_t;
+
+    /**
+     * @brief enable/disable boost mode
+     *
+     * @param[in] pa_boost power amplifier output mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_pa_boost(pa_boost_t pa_boost);
+
+    /**
+     * @brief Gets boost mode
+     *
+     * @param[in] pa_boost power amplifier output mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_pa_boost(pa_boost_t* pa_boost);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : PA1(0x06)
+     *  - Bit Fields    : [2:0]
+     *  - Default       : 0x0
+     *  - Description   : Controls the PA output power by enabling parallel drivers.
+     */
+    typedef enum {
+        PAPWR_1_DRIVER, /**< 0x0: Minimum, 1 driver */
+        PAPWR_2_DRIVER, /**< 0x1: 2 Drivers */
+        PAPWR_3_DRIVER, /**< 0x2: 3 Drivers */
+        PAPWR_4_DRIVER, /**< 0x3: 4 Drivers */
+        PAPWR_5_DRIVER, /**< 0x4: 5 Drivers */
+        PAPWR_6_DRIVER, /**< 0x5: 6 Drivers */
+        PAPWR_7_DRIVER, /**< 0x6: 7 Drivers */
+        PAPWR_8_DRIVER, /**< 0x7: 8 Drivers */
+    } papwr_t;
+
+    /**
+     * @brief set PA output power by enabling parallel drivers
+     *
+     * @param[in] papwr number of parallel drivers
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_papwr(papwr_t papwr);
+
+    /**
+     * @brief Gets PA output power
+     *
+     * @param[in] papwr number of parallel drivers
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_papwr(papwr_t* papwr);
+
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : PA2(0x07)
+     *  - Bit Fields    : [4:0]
+     *  - Default       : 0x00
+     *  - Description   : Controls shunt capacitance on PA output in fF.
+     */
+    typedef enum {
+        PACAP_0_fF,
+        PACAP_175_fF,
+        PACAP_350_fF,
+        PACAP_525_fF,
+        PACAP_700_fF,
+        PACAP_875_fF,
+        PACAP_1050_fF,
+        PACAP_1225_fF,
+        PACAP_1400_fF,
+        PACAP_1575_fF,
+        PACAP_1750_fF,
+        PACAP_1925_fF,
+        PACAP_2100_fF,
+        PACAP_2275_fF,
+        PACAP_2450_fF,
+        PACAP_2625_fF,
+        PACAP_2800_fF,
+        PACAP_2975_fF,
+        PACAP_3150_fF,
+        PACAP_3325_fF,
+        PACAP_3500_fF,
+        PACAP_3675_fF,
+        PACAP_3850_fF,
+        PACAP_4025_fF,
+        PACAP_4200_fF,
+        PACAP_4375_fF,
+        PACAP_4550_fF,
+        PACAP_4725_fF,
+        PACAP_4900_fF,
+        PACAP_5075_fF,
+        PACAP_5250_fF,
+        PACAP_5425_fF,
+    } pacap_t;
+
+    /**
+     * @brief set shunt capacitance value
+     *
+     * @param[in] pacap shunt capacitance value
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_pacap(pacap_t pacap);
+
+    /**
+     * @brief Gets shunt capacitance value
+     *
+     * @param[in] pacap shunt capacitance value
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_pacap(pacap_t* pacap);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : PLL1(0x08)
+     *  - Bit Fields    : [7:6]
+     *   -Default       : 0x1
+     *  - Description   : Sets the level of charge pump offset current
+     *                    for fractional N mode to improve close in
+     *                    phase noise. Set to 'DISABLED' for integer N mode.
+     */
+    typedef enum {
+        CPLIN_NO_EXTRA_CURRENT,                 /**< 0x0: No extra current */
+        CPLIN_CHARGE_PUMP_CURRENT_5_PERCENT,    /**< 0x1: 5% of charge pump current */
+        CPLIN_CHARGE_PUMP_CURRENT_10_PERCENT,   /**< 0x2: 10% of charge pump current */
+        CPLIN_CHARGE_PUMP_CURRENT_15_PERCENT,   /**< 0x3: 15% of charge pump current */
+    } cplin_t;
+
+    /**
+     * @brief set level of charge pump offset current
+     *
+     * @param[in] cplin percentage of charge pump current
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_cplin(cplin_t cplin);
+
+    /**
+     * @brief Gets level of charge pump offset current
+     *
+     * @param[in] cplin percentage of charge pump current
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_cplin(cplin_t* cplin);
+
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : PLL1(0x08)
+     *  - Bit Fields    : [5]
+     *  - Default       : 0b1
+     *  - Description   : Sets PLL between fractional-N and integer-N mode.
+     *
+     */
+    typedef enum {
+        FRACMODE_INTEGER_N,      /**< 0x0: Integer N Mode */
+        RACMODE_FRACTIONAL_N,    /**< 0x1: Fractional N Mode */
+    } fracmode_t;
+
+    /**
+     * @brief set PLL mode
+     *
+     * @param[in] fracmode Integer N/Fractional N mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_fracmode(fracmode_t fracmode);
+
+    /**
+     * @brief Gets PLL mode
+     *
+     * @param[in] fracmode Integer N/Fractional N mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_fracmode(fracmode_t* fracmode);
+
+    /*  Register Configuration
+     *
+     *  @Register       : PLL1(0x08)
+     *  @Bit Fields     : [2:1]
+     *  @Default        : 0x0
+     *  @Description    :
+     */
+    typedef enum {
+        LODIV_DISABLED,     /**< 0x0: Disabled */
+        LODIV_DIVIDE_BY_4,  /**< 0x1: LC VCO divided by 4 */
+        LODIV_DIVIDE_BY_8,  /**< 0x2: LC VCO divided by 8 */
+        LODIV_DIVIDE_BY_12, /**< 0x3: LC VCO divided by 12 */
+    } lodiv_t;
+
+    /**
+     * @brief set divider of LC VCO
+     *
+     * @param[in] lodiv divider value
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_lodiv(lodiv_t lodiv);
+
+    /**
+     * @brief Gets divider of LC VCO
+     *
+     * @param[in] lodiv divider value
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_lodiv(lodiv_t* lodiv);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : PLL1(0x08)
+     *  - Bit Fields    : [0]
+     *  - Default       : 0b0
+     *  - Description   : Sets LO generation. For lower power, choose LOWCURRENT.
+     *                    For higher performance, choose LOWNOISE
+     */
+    typedef enum {
+        LOMODE_RING_OSCILLATOR,     /**< 0x0: Ring Oscillator Mode */
+        LOMODE_LC_VCO,              /**< 0x1: LC VCO Mode */
+    } lomode_t;
+
+    /**
+     * @brief set LO generation
+     *
+     * @param[in] lomode selection of mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int set_lomode(lomode_t lomode);
+
+    /**
+     * @brief Gets LO generation
+     *
+     * @param[in] lomode selection of mode
+     *
+     * @returns 0 on success, negative error code on failure.
+     */
+    int get_lomode(lomode_t* lomode);
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : PLL2(0x09)
+     *  - Bit Fields    : [1:0]
+     *  - Default       : 0x0
+     *  - Description   : Sets Charge Pump Current in microAmpere
+     *
+     */
+    typedef enum {
+        CPVAL_5_UA,     /**< 0x0: 5�A */
+        CPVAL_10_UA,    /**< 0x1: 10�A */
+        CPVAL_15_UA,    /**< 0x2: 15�A */
+        CPVAL_20_UA,    /**< 0x3: 20�A */
+    } cpval_t;
+
+    /**
+     * @brief    set charge pump current
+     *
+     * @param[in]    cpval current value
+     *
+     * @returns    0 on success, negative error code on failure.
+     */
+    int set_cpval(cpval_t cpval);
+
+    /**
+     * @brief        Gets charge pump current
+     *
+     * @param[in]    cpval current value
+     *
+     * @returns      0 on success, negative error code on failure.
+     */
+    int get_cpval(cpval_t* cpval);
+
+    /**
+     * Register Configuration
+     *
+     * @details
+     *  - Register      : CFG6(0x0A)
+     *  - Bit Fields    : [2]
+     *  - Default       : 0b0
+     *  - Description   : Enables DATA transmission in I2C mode. Aliased address for I2C_TXEN1.
+     */
+    typedef enum {
+        I2C_TXEN1_DISABLE,  /**< 0x0: Data transmission not enabled in I2C mode. */
+        I2C_TXEN1_ENABLE,   /**< 0x1: Data transmission enabled in I2C mode. */
+    } i2c_txen1_t;
+
+	int set_i2c_txen1(i2c_txen1_t setting); //sdivarci
+
+    /** Register Configuration
+     *
+     * @details
+     *  - Register      : CFG6(0x0A)
+     *  - Bit Fields    : [1]
+     *  - Default       : 0b0
+     *  - Description   : Transmission enable.
+     */
+    typedef enum {
+        SPI_TXEN1_DISABLE,  /**< 0x0: Transmission disabled. */
+        SPI_TXEN1_ENABLE,   /**< 0x1: Transmission enabled. */
+    } spi_txen1_t;
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG6(0x0A)
+     *  - Bit Fields    : [0]
+     *  - Default       : 0b0
+     *  - Description   : Four wire readback on CLKOUT pin mode.
+     *
+     */
+    typedef enum {
+        FOURWIRE1_READBACK_DISABLE, /**< 0x0: Four wire readback disabled. */
+        FOURWIRE1_READBACK_ENABLE,  /**< 0x1: Four wire readback enabled. */
+    } fourwire1_t;
+
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG7(0x10)
+     *  - Bit Fields    : [2]
+     *  - Default       : 0b0
+     *  - Description   : Enables DATA transmission in I2C mode. Aliased address for I2C_TXEN1
+     */
+    typedef enum {
+        I2C_TXEN2_DISABLE,  /**< 0x0: Data transmission not enabled in I2C mode. */
+        I2C_TXEN2_ENABLE,   /**< 0x1: Data transmission enabled in I2C mode. */
+    } i2c_txen2_t;
+
+	int set_i2c_txen2(i2c_txen2_t setting); //sdivarci
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG7(0x10)
+     *  - Bit Fields    : [1]
+     *  - Default       : 0b0
+     *  - Description   : Transmission enable.
+     */
+    typedef enum {
+        SPI_TXEN2_DISABLE,    /**< 0x0: Transmission disabled. */
+        SPI_TXEN2_ENABLE,    /**< 0x1: Transmission enabled. */
+    } spi_txen2_t;
+
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG7(0x10)
+     *  - Bit Fields    : [0]
+     *  - Default       : 0b0
+     *  - Description   : Four wire readback on CLKOUT pin mode. Aliased address for FOURWIRE1
+     */
+    typedef enum {
+        FOURWIRE2_READBACK_DISABLE,    /**< 0x0: Four wire readback disabled. */
+        FOURWIRE2_READBACK_ENABLE,    /**< 0x1: Four wire readback enabled. */
+    } fourwire2_t;
+
+
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : I2C1(0x11)
+     *  - Bit Fields    : [7]
+     *  - Default       : 0b0
+     *  - Description   : Packet Length Mode
+     *
+     */
+    typedef enum {
+        PKTLEN_MODE_SET_LENGTH,        /**< 0x0: PKTLEN[14:0] need not be programmed. FIFO underflow event will
+                                            be treated as end of packet event. For cases where actual packet length
+                                            is greater than 32767 bits, it is expected that the �C will pad
+                                            such a packet to make it an integral multiple of 8-bits */
+        PKTLEN_MODE_NO_SET_LENGTH,    /**< 0x1: PKTLEN[14:0] will provide the length of packet. Once FIFO is
+                                           read for PKTLEN[14:0] bits, or if FIFO underflow, MAX4146x will consider
+                                           that as an end of packet event. */
+    } pktlen_mode_t;
+
+    /**
+    * @brief set packet length
+    *
+    * @param[in] pktlen_mode packet length mode
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int set_pktlen_mode(pktlen_mode_t pktlen_mode);
+
+    /**
+    * @brief Gets packet length
+    *
+    * @param[in] pktlen_mode packet length mode
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int get_pktlen_mode(pktlen_mode_t* pktlen_mode);
+
+
+    /**
+     * @brief Register Configuration
+     *
+     * @details
+     *  - Register      : CFG8(0x17)
+     *  - Bit Fields    : [0]
+     *  - Default       : 0b0
+     *  - Description   : Places DUT into software reset.
+     */
+    typedef enum {
+        SOFTRESET_DEASSERT,     /**< 0x0: Deassert the reset */
+        SOFTRESET_RESET,        /**< 0x1: Resets the entire digital, until this bit is set to 0 */
+    } softreset_t;
+
+    /**
+    * @brief set softreset bit
+    *
+    * @param[in] softreset enable/disable
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int set_softreset(softreset_t softreset);
+
+    /**
+     * @brief Operation state of the rf transmitter
+     *
+     * @details
+     *  - Default       : 0b0
+     *  - Description   : Places DUT into software reset.
+     */
+    typedef enum {
+        INITIALIZED = 0,
+        UNINITIALIZED = 1,
+        UNKNOWN = 2,
+    } operation_mode_t;
+
+
+    // Indicates whether initialization is successful
+    operation_mode_t operation_mode;
+
+    /**
+    * @brief get fifo flags (I2C6) Read only
+    *
+    * @param[in] fifo_flags 8-bit fifo flags
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int get_fifo_flags(uint8_t *fifo_flags);
+
+    /**
+    * @brief get pktcomplete bit field flags (I2C4) Read only
+    *
+    * @param[in] pktcomplete  0x0: Packet transmission is not completed
+    *                         0x1: Packet transmission is completed
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int get_pktcomplete(uint8_t *pktcomplete);
+
+    /**
+    * @brief get packet length of transmitted packet
+    *
+    * @param[in] pktlen Provides status information of bits transmitted for the current packet
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int get_tx_pktlen(uint16_t *pktlen);
+
+
+    /* PUBLIC FUNCTION DECLARATIONS */
+
+    /**
+    * @brief Read from a register.
+    *
+    * @param[in] reg Address of a register to be read.
+    * @param[out] value Pointer to save result value.
+    * @param[in] len Size of result to be read.
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int read_register(uint8_t reg, uint8_t *value, uint8_t len);
+
+    /**
+    * @brief Write to a register.
+    *
+    * @param[in] reg Address of a register to be written.
+    * @param[out] value Pointer of value to be written to register.
+    * @param[in] len Size of result to be written.
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int write_register(uint8_t reg, const uint8_t *value, uint8_t len);
+
+    /**
+    * @brief Initial programming steps after power on or soft reset.
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int initial_programming(void);
+
+    /**
+    * @brief Set Baud clock predivision ratio
+    *
+    * @param[in] prediv values between 3 and 255
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int set_bclk_prediv(uint8_t prediv);
+
+    /**
+    * @brief Gets Baud clock predivision ratio
+    *
+    * @param[in] prediv values between 3 and 255
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int get_bclk_prediv(uint8_t* prediv);
+
+    /**
+    * @brief Controls GFSK shaping
+    *
+    * @param[in] tstep values between 0 and 31
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int set_tstep(uint8_t tstep);
+
+    /**
+    * @brief Gets tstep
+    *
+    * @param[in] tstep values between 0 and 31
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int get_tstep(uint8_t* tstep);
+
+    /**
+    * @brief Set PLL frequency
+    *
+    * @param[in] freq FREQ value to PLL between 0x00 and 0xFFFFFF
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description LO frequency = FREQ<23:0>/2^16*fXTAL
+    */
+    int set_frequency(uint32_t freq);
+
+    /**
+    * @brief Gets PLL frequency
+    *
+    * @param[in] freq FREQ value to PLL between 0x00 and 0xFFFFFF
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description LO frequency = FREQ<23:0>/2^16*fXTAL
+    */
+    int get_frequency(uint32_t* freq);
+
+    /**
+    * @brief Set frequency deviation from the space frequency for the mark frequency
+    *
+    * @param[in] deltaf frequency deviation value
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description fDELTA = DELTAF[6:0]* fXTAL/8192
+    */
+    int set_deltaf(uint8_t deltaf);
+
+    /**
+    * @brief Get frequency deviation from the space frequency for the mark frequency
+    *
+    * @param[in] deltaf frequency deviation value
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description fDELTA = DELTAF[6:0]* fXTAL/8192
+    */
+    int get_deltaf(uint8_t* deltaf);
+
+    /**
+    * @brief Set frequency deviation from the space frequency for the mark frequency
+    *
+    * @param[in] deltaf_shape frequency deviation value
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description fDELTA = DELTAF_SHAPE[3:0]* fXTAL/81920
+    */
+    int set_deltaf_shape(uint8_t deltaf_shape);
+
+    /**
+    * @brief Gets frequency deviation from the space frequency for the mark frequency
+    *
+    * @param[in] deltaf_shape frequency deviation value
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description fDELTA = DELTAF_SHAPE[3:0]* fXTAL/81920
+    */
+    int get_deltaf_shape(uint8_t* deltaf_shape);
+
+    /**
+    * @brief Set Packet Length for I2C communication
+    *
+    * @param[in] pktlen values between 0x00 and 0x7FF
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int set_i2c_pktlen(uint16_t pktlen);
+
+    /**
+    * @brief Gets Packet Length for I2C communication
+    *
+    * @param[in] pktlen values between 0x00 and 0x7FF
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int get_i2c_pktlen(uint16_t* pktlen);
+
+    /**
+    * @brief Adjust baud rate
+    *
+    * @param[in] baud_rate preferred baud rate
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description It changes only the values of BCLK_PREDIV and BCLK_POSTDIV
+    *              Baud_rate = f_clk/((1+BCLK_PREDIV)x2^(1+BCLK_POSTDIV))
+    *              where f_clk = f_xtal/XOCLKDIV_ratio
+    *              Note that to maintain the internal 3.2MHz time base,
+    *              XOCLKDIV[1:0] (register CFG1, 0x00, bit 4) must be programmed,
+    *              based on the crystal frequency
+    */
+    int adjust_baudrate(float rate);
+
+    /**
+	* @brief Gets baud rate
+	*
+	* @returns baud rate.
+	*
+	*/
+	float get_baudrate();
+
+    /**
+    * @brief Adjust Manchester Bitrate
+    *
+    * @param[in] data_rate preferred data rate in (1-50)kbps
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int adjust_manchester_bitrate(char rate);
+
+    /**
+    * @brief Get Manchester Bitrate
+    *
+    * @returns data rate in (1-50)kbps
+    */
+    char get_manchester_bitrate();
+
+    /**
+    * @brief Configures the crystal frequency of the chip (Fxtal)
+    *
+    * @param[in] freq crystal frequency values between 12.8 MHz and 19.2 MHz
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int set_crystal_frequency(float freq);
+
+    /**
+    * @brief Get the crystal frequency of the chip (Fxtal)
+    *
+    * @returns crystal frequency values between 12.8 MHz and 19.2 MHz
+    */
+    float get_crystal_frequency();
+
+    /**
+    * @brief Adjust center/carrier frequency of the chip
+    *
+    * @param[in] freq center/carrier frequency value between 250 MHz and 950 MHz
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int set_center_frequency(float freq);
+
+    /**
+    * @brief Gets center/carrier frequency of the chip
+    *
+    * @returns center/carrier frequency value between 250 MHz and 950 MHz
+    */
+    float get_center_frequency();
+
+    /**
+    * @brief set the FSK deviation values (Delta_f)
+    *
+    * @param[in] deviation deviation value in in kHz baud rate
+    *
+    * @returns 0 on success, negative error code on failure.
+    *
+    * @description The mark frequency is defined by the space frequency
+    *              plus a frequency deviation. If frequency shaping is
+    *              disabled by setting FSKSHAPE = 0 (register CFG1, bit 2),
+    *              the frequency deviation is defined by DELTAF[6:0]
+    *              (register PLL6, bits 6:0).
+    *              DELTAF[6 : 0] = (Delta_f * 8192)f_xtal
+    *              If frequency shaping is enabled by setting FSKSHAPE = 1
+    *              (register CFG1, bit 2), the frequency deviation is defined
+    *              by DETLAF_SHAPE[3:0] (register PLL7, bits 3:0).
+    *              DELTAF_SHAPE[3 : 0] = (Delta_f * 8192)/(f_xtal * 10)
+    */
+    int adjust_frequency_deviation(float deviation);
+
+    /**
+    * @brief Send data for selected Preset/I2C/SPI mode
+    *
+    * @param[in] data data pointer for data to be transferred
+    * @param[in] length legth of data to be transferred
+    *
+    * @returns 0 on success, negative error code on failure.
+    */
+    int send_data(uint8_t *data, uint32_t length);
+    
+    int set_i2c_data(uint8_t setting); //sdivarci
+};
+
+
+/** MAX41460 Device Class
+ *
+ * Hold configurations for the MAX41460
+ */
+class MAX41460 : public MAX4146X <max41460_reg_map_t>
+{
+    max41460_reg_map_t regmap;
+public:
+    MAX41460(SPI *spi, DigitalOut *cs) : MAX4146X<max41460_reg_map_t>(&regmap, spi, cs) {}
+
+    MAX41460(SPI *spi) : MAX4146X<max41460_reg_map_t>(&regmap, spi) {}
+
+    MAX41460(DigitalOut *cs) : MAX4146X(cs) {}
+
+};
+
+/** MAX41461 Device Class
+ *
+ * Hold configurations for the MAX41461
+ */
+class MAX41461 : public MAX4146X <max41461_2_reg_map_t>
+{
+    max41461_2_reg_map_t regmap;
+public:
+    MAX41461(I2C *i2c) : MAX4146X<max41461_2_reg_map_t>(&regmap, i2c) {}
+
+    MAX41461(DigitalOut *cs) : MAX4146X(cs) {}
+};
+
+/** MAX41462 Device Class
+ *
+ * Hold configurations for the MAX41462
+ */
+class MAX41462 : public MAX41461
+{
+public:
+    MAX41462(I2C *i2c) : MAX41461(i2c) {}
+
+    MAX41462(DigitalOut *cs) : MAX41461(cs) {}
+
+};
+
+/** MAX41463 Device Class
+ *
+ * Hold configurations for the MAX41463
+ */
+class MAX41463 : public MAX4146X <max41463_4_reg_map_t>
+{
+    max41463_4_reg_map_t regmap;
+public:
+    MAX41463(I2C *i2c) : MAX4146X<max41463_4_reg_map_t>(&regmap, i2c) {}
+
+    MAX41463(DigitalOut *cs) : MAX4146X(cs) {}
+
+};
+
+/** MAX41464 Device Class
+ *
+ * Hold configurations for the MAX41464
+ */
+class MAX41464 : public MAX41463
+{
+public:
+    MAX41464(I2C *i2c) : MAX41463(i2c) {}
+
+    MAX41464(DigitalOut *cs) : MAX41463(cs) {}
+
+};
+
+
+#endif /* MAX4146x_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Sun Oct 25 20:10:02 2020 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#78474a5129e18e136cc7e872adbaa5b74fbb8f6a