Revision 72:53949e6131f6, committed 2017-07-27
- Comitter:
- Kojto
- Date:
- Thu Jul 27 12:14:04 2017 +0100
- Parent:
- 71:2c525a50f1b6
- Commit message:
- Update libraries
Fixes the previous commmit, as some devices were not copied. USBDevice contains
now targets directory with all targets implementations
Changed in this revision
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/devdrv_usb_function_api.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,365 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function_version.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_api.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dataio.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2933 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dma.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_intrn.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_lib.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2026 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_api.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_global.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sig.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sub.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,453 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,698 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,762 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_api.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dataio.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2932 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dma.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_intrn.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_lib.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2044 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_api.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_global.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sig.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sub.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,453 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,698 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,762 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/usb_function_setting.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/devdrv_usb_function_api.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,365 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function_version.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_api.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dataio.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2933 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dma.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_intrn.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_lib.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2026 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_api.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_global.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sig.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sub.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,453 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,698 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,762 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_api.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dataio.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2932 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dma.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_intrn.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_lib.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2044 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_api.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_global.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sig.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sub.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,453 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,698 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,762 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb_function_setting.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-/*******************************************************************************
-* 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 */
--- a/USBDevice/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/USBHAL_STM32F103RB.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32F103RB
-#define USBHAL_STM32F103RB
-
-#define USBHAL_IRQn USB_LP_CAN1_RX0_IRQn
-
-
-#define NB_ENDPOINT 8
-/* must be multiple of 4 bytes */
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
- uint8_t epComplete[8];
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
- gpio_t usb_switch;
-}USBHAL_Private_t;
-
-void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- gpio_write(&(priv->usb_switch),!state);
-}
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- return 1024;
-}
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
- void (USBHAL::*func)(int frame) = priv->sof;
- (obj->*func)(sofnum);
-}
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void)
-{
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- hpcd.Instance = USB;
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd.Init.Sof_enable = 1;
- hpcd.Init.speed = PCD_SPEED_FULL;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
-
-
- /* Configure USB VBUS GPIO */
- gpio_init_out(&HALPriv->usb_switch,PB_14);
- gpio_mode(&HALPriv->usb_switch,OpenDrain);
- /* Configure USB FS GPIOs */
-
- /* Configure DM DP Pins
- * - USB-DP (D+ of the USB connector) <======> PA12 (Nucleo board)
- * Make sure to connect a 1.5KOhm pull up to USB-DP PA12 pin
- * (permanent pull-up)
- - USB-DM (D- of the USB connector) <======> PA11 (Nucleo board)
- */
-
- pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_MODE_AF_INPUT));
- pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_MODE_AF_INPUT));
-
- __HAL_RCC_USB_CLK_ENABLE();
-
- hpcd.State = HAL_PCD_STATE_RESET;
-
- HAL_PCD_Init(&hpcd);
- /* hardcoded size of FIFO according definition*/
- HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
- HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
- HAL_PCDEx_PMAConfig(&hpcd , 0x01 , PCD_SNG_BUF, 0x90);
- HAL_PCDEx_PMAConfig(&hpcd , 0x81 , PCD_SNG_BUF, 0xb0);
-#if 0
- HAL_PCDEx_PMAConfig(&hpcd , 0x2, PCD_DBL_BUF, 0x018000b0);
-#else
- HAL_PCDEx_PMAConfig(&hpcd , 0x2, PCD_SNG_BUF, 0x100);
-#endif
- HAL_PCDEx_PMAConfig(&hpcd , 0x82, PCD_SNG_BUF, 0x120);
-
- NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
- NVIC_SetPriority( USBHAL_IRQn, 1);
-
- HAL_PCD_Start(&hpcd);
-}
-
-#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM32F103RB.h"
-
--- a/USBDevice/TARGET_STM/TARGET_STM32F2/TARGET_NUCLEO_F207ZG/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
-
--- a/USBDevice/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/TARGET_NUCLEO_F303ZE/USBHAL_STM32F303ZE.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32F303ZE_H
-#define USBHAL_STM32F303ZE_H
-#define USBHAL_IRQn USB_LP_CAN_RX0_IRQn
-/* must be multiple of 4 bytes */
-#define NB_ENDPOINT 8
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[6])(void);
- uint8_t epComplete[2*NB_ENDPOINT];
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
- gpio_t usb_switch;
-}USBHAL_Private_t;
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- return 1024;
-}
-
-void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state){
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- gpio_write(&(priv->usb_switch),state);
-}
-
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) {
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
- void (USBHAL::*func)(int frame) = priv->sof;
- (obj->*func)(sofnum);
-}
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void) {
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- hpcd.Instance = USB;
- /* initialized Init to zero (constructor does not zero initialized the
- * area */
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd.Init.Sof_enable = 1;
- hpcd.Init.speed = PCD_SPEED_FULL;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /* Configure USB DM pin. This is optional, and maintained only for user guidance. */
- pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF14_USB));
- pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF14_USB));
- __HAL_RCC_GPIOG_CLK_ENABLE();
- gpio_init_out(&HALPriv->usb_switch,PG_6);
- /* Enable USB Clock */
- __HAL_RCC_USB_CLK_ENABLE();
- /* Enable SYSCFG Clock */
- __HAL_RCC_SYSCFG_CLK_ENABLE();
- hpcd.State = HAL_PCD_STATE_RESET;
- HAL_PCD_Init(&hpcd);
- /* hardcoded size of FIFO according definition*/
- HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
- HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
-#if 1
- HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_DBL_BUF, 0x018000b0);
-#else
- HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_SNG_BUF, 0x180);
-#endif
- HAL_PCDEx_PMAConfig(&hpcd , 0x83, PCD_SNG_BUF, 0xb0);
- NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
- NVIC_SetPriority(USBHAL_IRQn, 1);
- HAL_PCD_Start(&hpcd);
-}
-#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/TARGET_NUCLEO_F303ZE/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM32F303ZE.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TARGET_NUCLEO_F401RE/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F407xG/TARGET_DISCO_F407VG/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_NUCLEO_F411RE/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/TARGET_NUCLEO_F412ZG/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_NUCLEO_F429ZI/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_NUCLEO_F439ZI/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446RE/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446ZE/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/TARGET_NUCLEO_F746ZG/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
-
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F756xG/TARGET_NUCLEO_F756ZG/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
-
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F767xI/TARGET_NUCLEO_F767ZI/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/TARGET_DISCO_F769NI/USBHAL_STM32F769NI.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32F769NI_H
-#define USBHAL_STM32F769NI_H
-#define USBHAL_IRQn OTG_HS_IRQn
-/* must be multiple of 4 bytes */
-#define NB_ENDPOINT 4
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
- uint8_t epComplete[2*NB_ENDPOINT];
-}USBHAL_Private_t;
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- uint32_t len;
- if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
- else
- len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
- return len*4;
-}
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
- uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
- void (USBHAL::*func)(int frame) = priv->sof;
- /* fix me call with same frame number */
- (obj->*func)(sofnum);
-}
-
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void) {
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- hpcd.Instance = USB_OTG_HS;
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_ULPI;
- hpcd.Init.Sof_enable = 0;
-
- hpcd.Init.speed = PCD_SPEED_HIGH;
- //hpcd.Init.vbus_sensing_enable = 0;
- //hpcd.Init.lpm_enable = 0;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
- /* Enable power and clocking */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOH_CLK_ENABLE();
- __HAL_RCC_GPIOI_CLK_ENABLE();
-
- pin_function(PA_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // CLK
- pin_function(PA_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D0
-
- pin_function(PB_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D1
- pin_function(PB_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D2
- pin_function(PB_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D3
- pin_function(PB_10, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D4
- pin_function(PB_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D5
- pin_function(PB_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D6
- pin_function(PB_13, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D7
-
- pin_function(PC_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // STP
- pin_function(PH_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // NXT
- pin_function(PI_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // DIR
-
- __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE();
- __HAL_RCC_USB_OTG_HS_CLK_ENABLE();
-
- __HAL_RCC_SYSCFG_CLK_ENABLE();
- hpcd.State = HAL_PCD_STATE_RESET;
- HAL_PCD_Init(&hpcd);
- /* 1.25kbytes */
- /* min value 16 (= 16 x 4 bytes) */
- /* max value 256 (= 1K bytes ) */
- /* maximum sum is 0x140 */
- HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
- /* bulk/int 64 bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
- /* bulk/int bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
- HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
- /* ISOchronous */
- HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
- NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr);
- NVIC_SetPriority(USBHAL_IRQn, 1);
- HAL_PCD_Start(&hpcd);
-}
-#endif
-
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/TARGET_DISCO_F769NI/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM32F769NI.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/USBHAL_STM32L053C8.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32L053C8_H
-#define USBHAL_STM32L053C8_H
-
-#define USBHAL_IRQn USB_IRQn
-
-/* must be multiple of 4 bytes */
-#define NB_ENDPOINT 8
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[6])(void);
- uint8_t epComplete[2*NB_ENDPOINT];
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
- gpio_t usb_switch;
-}USBHAL_Private_t;
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- return 1024;
-}
-
-void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- gpio_write(&(priv->usb_switch),state);
-}
-
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
- void (USBHAL::*func)(int frame) = priv->sof;
- (obj->*func)(sofnum);
-}
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void)
-{
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- hpcd.Instance = USB;
- /* initialized Init to zero (constructor does not zero initialized the
- * area */
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd.Init.Sof_enable = 1;
- hpcd.Init.speed = PCD_SPEED_FULL;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
-
- /* Configure USB DM pin. This is optional, and maintained only for user guidance. */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
- pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
-
- /* Enable USB Clock */
- __HAL_RCC_USB_CLK_ENABLE();
-
- /* Enable SYSCFG Clock */
- __HAL_RCC_SYSCFG_CLK_ENABLE();
- hpcd.State = HAL_PCD_STATE_RESET;
- HAL_PCD_Init(&hpcd);
-
- /* hardcoded size of FIFO according definition*/
- HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
- HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
-#if 1
- HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_DBL_BUF, 0x018000b0);
-#else
- HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_SNG_BUF, 0x180);
-#endif
- HAL_PCDEx_PMAConfig(&hpcd , 0x83, PCD_SNG_BUF, 0xb0);
- NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
- NVIC_SetPriority(USBHAL_IRQn, 1);
- HAL_PCD_Start(&hpcd);
-}
-#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM32L053C8.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L072CZ_LRWAN1/USBHAL_STM32L072CZ.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32L072CZ_H
-#define USBHAL_STM32L072CZ_H
-
-#define USBHAL_IRQn USB_IRQn
-
-/* must be multiple of 4 bytes */
-#define NB_ENDPOINT 8
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[6])(void);
- uint8_t epComplete[2*NB_ENDPOINT];
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
- gpio_t usb_switch;
-}USBHAL_Private_t;
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- return 1024;
-}
-
-void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- gpio_write(&(priv->usb_switch),state);
-}
-
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
- void (USBHAL::*func)(int frame) = priv->sof;
- (obj->*func)(sofnum);
-}
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void)
-{
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- hpcd.Instance = USB;
- /* initialized Init to zero (constructor does not zero initialized the
- * area */
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd.Init.Sof_enable = 1;
- hpcd.Init.speed = PCD_SPEED_FULL;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
-
- /* Configure USB DM pin. This is optional, and maintained only for user guidance. */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
- pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
-
- /* Enable USB Clock */
- __HAL_RCC_USB_CLK_ENABLE();
-
- /* Enable SYSCFG Clock */
- __HAL_RCC_SYSCFG_CLK_ENABLE();
- hpcd.State = HAL_PCD_STATE_RESET;
- HAL_PCD_Init(&hpcd);
-
- /* hardcoded size of FIFO according definition*/
- HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
- HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
- HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_DBL_BUF, 0x018000b0);
- HAL_PCDEx_PMAConfig(&hpcd , 0x83, PCD_SNG_BUF, 0xb0);
-
- NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
- NVIC_SetPriority(USBHAL_IRQn, 1);
- HAL_PCD_Start(&hpcd);
-}
-#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L072CZ_LRWAN1/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM32L072CZ.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_DISCO_L475VG_IOT01A/USBHAL_STM32L475VG.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32L475VG
-#define USBHAL_STM32L475VG
-
-#define USBHAL_IRQn OTG_FS_IRQn
-
-
-#define NB_ENDPOINT 4
-/* must be multiple of 4 bytes */
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
- uint8_t epComplete[8];
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
-}USBHAL_Private_t;
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- uint32_t len;
- if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
- else
- len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
- return len*4;
-}
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) {
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
- uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
- void (USBHAL::*func)(int frame) = priv->sof;
- /* fix me call with same frame number */
- (obj->*func)(sofnum);
-}
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void) {
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- hpcd.Instance = USB_OTG_FS;
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd.Init.Sof_enable = 1;
- hpcd.Init.speed = PCD_SPEED_FULL;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
-
- __HAL_RCC_PWR_CLK_ENABLE();
-
- HAL_PWREx_EnableVddUSB();
- /* Configure USB VBUS GPIO */
- __HAL_RCC_GPIOC_CLK_ENABLE();
-
- /* Configure USB FS GPIOs */
- __HAL_RCC_GPIOA_CLK_ENABLE();
-
- /* Configure DM DP Pins */
- 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));
-
- /* Configure VBUS Pin */
- pin_function(PC_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
-
- __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
-
- hpcd.State = HAL_PCD_STATE_RESET;
-
- HAL_PCD_Init(&hpcd);
- /* 1.25kbytes */
- /* min value 16 (= 16 x 4 bytes) */
- /* max value 256 (= 1K bytes ) */
- /* maximum sum is 0x140 */
- HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
- /* bulk/int 64 bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
- /* bulk/int bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
- HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
- /* ISOchronous */
- HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
-
- NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
- NVIC_SetPriority( USBHAL_IRQn, 1);
-
- HAL_PCD_Start(&hpcd);
-}
-
-#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_DISCO_L475VG_IOT01A/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM32L475VG.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHAL_STM32L476VG.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32L476VG
-#define USBHAL_STM32L476VG
-
-#define USBHAL_IRQn OTG_FS_IRQn
-
-
-#define NB_ENDPOINT 4
-/* must be multiple of 4 bytes */
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
- uint8_t epComplete[8];
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
-}USBHAL_Private_t;
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- uint32_t len;
- if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
- else
- len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
- return len*4;
-}
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) {
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
- uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
- void (USBHAL::*func)(int frame) = priv->sof;
- /* fix me call with same frame number */
- (obj->*func)(sofnum);
-}
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void) {
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- hpcd.Instance = USB_OTG_FS;
- /* initialized all field of init including 0 field */
- /* constructor does not fill with zero */
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd.Init.Sof_enable = 1;
- hpcd.Init.speed = PCD_SPEED_FULL;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
-
- __HAL_RCC_PWR_CLK_ENABLE();
-
- HAL_PWREx_EnableVddUSB();
- /* Configure USB VBUS GPIO */
- __HAL_RCC_GPIOC_CLK_ENABLE();
-
- /* Configure USB FS GPIOs */
- __HAL_RCC_GPIOA_CLK_ENABLE();
-
- /* Configure DM DP Pins */
- 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));
-
- /* Configure VBUS Pin */
- pin_function(PC_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
-
- __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
-
- hpcd.State = HAL_PCD_STATE_RESET;
-
- HAL_PCD_Init(&hpcd);
- /* 1.25kbytes */
- /* min value 16 (= 16 x 4 bytes) */
- /* max value 256 (= 1K bytes ) */
- /* maximum sum is 0x140 */
- HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
- /* bulk/int 64 bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
- /* bulk/int bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
- HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
- /* ISOchronous */
- HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
-
- NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
- NVIC_SetPriority( USBHAL_IRQn, 1);
-
- HAL_PCD_Start(&hpcd);
-}
-
-#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHAL_STM_TARGET.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016 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 "USBHAL_STM32L476VG.h"
--- a/USBDevice/TARGET_STM/USBHAL_STM32.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,332 +0,0 @@
-/* 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.
-*/
-/* TARGET NOT STM does not support this HAL */
-#ifndef TARGET_STM
-#define USBSTM_HAL_UNSUPPORTED
-#endif
-/* F4 famlily wihtout USB_STM_HAL use another HAL*/
-#if defined(TARGET_STM) && defined(TARGET_STM32F4) && !defined(USB_STM_HAL)
-#define USBSTM_HAL_UNSUPPORTED
-#endif
-
-#ifndef USBSTM_HAL_UNSUPPORTED
-#include "USBHAL.h"
-#include "pinmap.h"
-/* mbed endpoint definition to hal definition */
-#define EP_ADDR(ep) (((ep) >> 1)|((ep) & 1) << 7)
-/* from hal definition to mbed definition */
-#define ADDR_EPIN(ep) (((ep) << 1) | 1)
-#define ADDR_EPOUT(ep) (((ep) << 1))
-/* id to detect if rx buffer is used or not */
-
-#include "USBHAL_STM_TARGET.h"
-
-
-/* this call at device reception completion on a Out Enpoint */
-void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- uint8_t endpoint = ADDR_EPOUT(epnum);
- priv->epComplete[endpoint] = 1;
- /* -2 endpoint 0 In out are not in call back list */
- if (epnum) {
- bool (USBHAL::*func)(void) = priv->epCallback[endpoint-2];
- (obj->*func)();
- } else {
- void (USBHAL::*func)(void) = priv->ep0_out;
- (obj->*func)();
- }
-}
-
-/* this is call at device transmission completion on In endpoint */
-void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- uint8_t endpoint = ADDR_EPIN(epnum);
- priv->epComplete[endpoint] = 1;
- /* -2 endpoint 0 In out are not in call back list */
- if (epnum) {
- bool (USBHAL::*func)(void) = priv->epCallback[endpoint-2];
- (obj->*func)();
- } else {
- void (USBHAL::*func)(void) = priv->ep0_in;
- (obj->*func)();
- }
-}
-/* This is call at device set up reception */
-void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- void (USBHAL::*func)(void)=priv->ep0_setup;
- void (USBHAL::*func1)(void)=priv->ep0_read;
- (obj->*func)();
- (obj->*func1)();
-}
-
-void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
- (obj->*func)(1);
-}
-
-void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
- (obj->*func)(0);
-}
-
-void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
- (obj->*func)(1);
-}
-
-void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
- (obj->*func)(0);
-}
-
-void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- unsigned int i;
- for(i=0;i<hpcd->Init.dev_endpoints;i++) {
- priv->epComplete[2*i]=0;
- HAL_PCD_EP_Close(hpcd,EP_ADDR(2*i));
- HAL_PCD_EP_Flush(hpcd,EP_ADDR(2*i));
- priv->epComplete[2*i+1]=0;
- HAL_PCD_EP_Close(hpcd,EP_ADDR(2*i+1));
- HAL_PCD_EP_Flush(hpcd,EP_ADDR(2*i+1));
-
- }
- void (USBHAL::*func)(void)=priv->bus_reset;
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) = priv->ep_realise;
- (obj->*func)();
- (obj->*ep_realise)(EP0IN, MAX_PACKET_SIZE_EP0,0);
- (obj->*ep_realise)(EP0OUT, MAX_PACKET_SIZE_EP0,0);
-}
-
-
-/* hal pcd handler , used for STM32 HAL PCD Layer */
-
-uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
- return 0;
-}
-
-USBHAL::~USBHAL(void) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
- HAL_PCD_DeInit(&hpcd);
- delete HALPriv;
-}
-
-void USBHAL::connect(void) {
- NVIC_EnableIRQ(USBHAL_IRQn);
-}
-
-void USBHAL::disconnect(void) {
- NVIC_DisableIRQ(USBHAL_IRQn);
-}
-
-void USBHAL::configureDevice(void) {
- // Not needed
-}
-
-void USBHAL::unconfigureDevice(void) {
- // Not needed
-}
-
-void USBHAL::setAddress(uint8_t address) {
- HAL_PCD_SetAddress(&hpcd, address);
- EP0write(0, 0);
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
- uint32_t epIndex = EP_ADDR(endpoint);
- uint32_t type;
- uint32_t len;
- HAL_StatusTypeDef ret;
- switch (endpoint) {
- case EP0IN:
- case EP0OUT:
- type = 0;
- break;
- case EPISO_IN:
- case EPISO_OUT:
- type = 1;
- break;
- case EPBULK_IN:
- case EPBULK_OUT:
- type = 2;
- break;
- case EPINT_IN:
- case EPINT_OUT:
- type = 3;
- break;
- }
- if (maxPacket > MAXTRANSFER_SIZE) return false;
- if (epIndex & 0x80) {
- len = HAL_PCDEx_GetTxFiFo(&hpcd,epIndex & 0x7f);
- MBED_ASSERT(len >= maxPacket);
- }
- ret = HAL_PCD_EP_Open(&hpcd, epIndex, maxPacket, type);
- MBED_ASSERT(ret!=HAL_BUSY);
- return (ret == HAL_OK) ? true:false;
-}
-
-// read setup packet
-void USBHAL::EP0setup(uint8_t *buffer) {
- memcpy(buffer, hpcd.Setup, MAX_PACKET_SIZE_SETUP);
- memset(hpcd.Setup,0,MAX_PACKET_SIZE_SETUP);
-}
-
-void USBHAL::EP0readStage(void) {
-}
-
-void USBHAL::EP0read(void) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
- uint32_t epIndex = EP_ADDR(EP0OUT);
- uint8_t *pBuf = (uint8_t *)HALPriv->pBufRx0;
- HAL_StatusTypeDef ret;
- HALPriv->epComplete[EP0OUT] = 2;
- ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, MAX_PACKET_SIZE_EP0 );
- MBED_ASSERT(ret!=HAL_BUSY);
-
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
- uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, 0);
- HALPriv->epComplete[EP0OUT] = 0;
- if (length) {
- uint8_t *buff = (uint8_t *)HALPriv->pBufRx0;
- memcpy(buffer, buff, length);
- }
- return length;
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
- /* check that endpoint maximum size is not exceeding TX fifo */
- MBED_ASSERT(hpcd.IN_ep[0].maxpacket >= size);
- endpointWrite(EP0IN, buffer, size);
-}
-
-void USBHAL::EP0getWriteResult(void) {
-
-}
-
-void USBHAL::EP0stall(void) {
- stallEndpoint(EP0IN);
-}
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
- uint32_t epIndex = EP_ADDR(endpoint);
- uint8_t* pBuf = (uint8_t *)HALPriv->pBufRx;
- HAL_StatusTypeDef ret;
- // clean reception end flag before requesting reception
- HALPriv->epComplete[endpoint] = 2;
- ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, maximumSize);
- MBED_ASSERT(ret!=HAL_BUSY);
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
- if (HALPriv->epComplete[endpoint]==0) {
- /* no reception possible !!! */
- bytesRead = 0;
- return EP_COMPLETED;
- }else if ((HALPriv->epComplete[endpoint]!=1))
- return EP_PENDING;
- uint32_t epIndex = EP_ADDR(endpoint);
- uint8_t *buff = (uint8_t *)HALPriv->pBufRx;
- uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, epIndex);
- memcpy(buffer, buff, length);
- *bytesRead = length;
- HALPriv->epComplete[endpoint]= 0;
- return EP_COMPLETED;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
- uint32_t epIndex = EP_ADDR(endpoint);
- HAL_StatusTypeDef ret;
- // clean transmission end flag before requesting transmission
- HALPriv->epComplete[endpoint] = 2;
- ret = HAL_PCD_EP_Transmit(&hpcd, epIndex, data, size);
- MBED_ASSERT(ret!=HAL_BUSY);
- // update the status
- if (ret != HAL_OK) return EP_INVALID;
- // fix me return is too simple
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
- if (HALPriv->epComplete[endpoint] == 1)
- return EP_COMPLETED;
- return EP_PENDING;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint) {
- USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
- HAL_StatusTypeDef ret;
- HALPriv->epComplete[endpoint] = 0;
- ret = HAL_PCD_EP_SetStall(&hpcd, EP_ADDR(endpoint));
- MBED_ASSERT(ret!=HAL_BUSY);
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint) {
- HAL_StatusTypeDef ret;
- ret = HAL_PCD_EP_ClrStall(&hpcd, EP_ADDR(endpoint));
- MBED_ASSERT(ret!=HAL_BUSY);
-
-}
-
-bool USBHAL::getEndpointStallState(uint8_t endpoint) {
- return false;
-}
-
-void USBHAL::remoteWakeup(void) {
-}
-
-
-void USBHAL::_usbisr(void) {
- instance->usbisr();
-}
-
-
-void USBHAL::usbisr(void) {
-
- HAL_PCD_IRQHandler(&instance->hpcd);
-}
-#endif
-
--- a/USBDevice/TARGET_STM/USBHAL_STM_144_64pins.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/* Copyright (c) 2016 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 USBHAL_STM32_144_64
-#define USBHAL_STM32_144_64
-
-#define USBHAL_IRQn OTG_FS_IRQn
-/* must be multiple of 4 bytes */
-#define NB_ENDPOINT 4
-#define MAXTRANSFER_SIZE 0x200
-#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
-#if (FIFO_USB_RAM_SIZE > 0x500)
-#error "FIFO dimensioning incorrect"
-#endif
-
-typedef struct
-{
- USBHAL *inst;
- void (USBHAL::*bus_reset)(void);
- void (USBHAL::*sof)(int frame);
- void (USBHAL::*connect_change)(unsigned int connected);
- void (USBHAL::*suspend_change)(unsigned int suspended);
- void (USBHAL::*ep0_setup)(void);
- void (USBHAL::*ep0_in)(void);
- void (USBHAL::*ep0_out)(void);
- void (USBHAL::*ep0_read)(void);
- bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
- bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
- /* memorize dummy buffer used for reception */
- uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
- uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
- uint8_t epComplete[2*NB_ENDPOINT];
-}USBHAL_Private_t;
-
-uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
-{
- uint32_t len;
- if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
- else
- len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
- return len*4;
-}
-void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
-{
- USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
- USBHAL *obj= priv->inst;
- USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
- uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
- void (USBHAL::*func)(int frame) = priv->sof;
- (obj->*func)(sofnum);
-}
-
-
-USBHAL * USBHAL::instance;
-
-USBHAL::USBHAL(void) {
- /* init parameter */
- USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
- hpcd.Instance = USB_OTG_FS;
- memset(&hpcd.Init, 0, sizeof(hpcd.Init));
- hpcd.Init.dev_endpoints = NB_ENDPOINT;
- hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
- hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd.Init.Sof_enable = 1;
-
- hpcd.Init.speed = PCD_SPEED_FULL;
- //hpcd.Init.vbus_sensing_enable = 0;
- //hpcd.Init.lpm_enable = 0;
- /* pass instance for usage inside call back */
- HALPriv->inst = this;
- HALPriv->bus_reset = &USBHAL::busReset;
- HALPriv->suspend_change = &USBHAL::suspendStateChanged;
- HALPriv->connect_change = &USBHAL::connectStateChanged;
- HALPriv->sof = &USBHAL::SOF;
- HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
- HALPriv->ep_realise = &USBHAL::realiseEndpoint;
- HALPriv->ep0_in = &USBHAL::EP0in;
- HALPriv->ep0_out = &USBHAL::EP0out;
- HALPriv->ep0_read = &USBHAL::EP0read;
- hpcd.pData = (void*)HALPriv;
- HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
- HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
- HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
- HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
- HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
- HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
- instance = this;
- // Enable power and clocking
- /* board 144 pin all similar */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- 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_NOPULL, 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));
-
- __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
- __HAL_RCC_SYSCFG_CLK_ENABLE();
- hpcd.State = HAL_PCD_STATE_RESET;
- HAL_PCD_Init(&hpcd);
- /* 1.25kbytes */
- /* min value 16 (= 16 x 4 bytes) */
- /* max value 256 (= 1K bytes ) */
- /* maximum sum is 0x140 */
- HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
- /* bulk/int 64 bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
- /* bulk/int bytes in FS */
- HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
- HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
- /* ISOchronous */
- HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
- NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr);
- NVIC_SetPriority(USBHAL_IRQn, 1);
- HAL_PCD_Start(&hpcd);
-}
-#endif
-
--- a/USBDevice/TARGET_Silicon_Labs/inc/em_usb.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1011 +0,0 @@
-/***************************************************************************//**
- * @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"
-/* Workaround for em_common naming change so that we don't need to rework the
- entire USB HAL */
-#define EFM32_PACK_START(x) SL_PACK_START(x)
-#define EFM32_PACK_END() SL_PACK_END()
-#define EFM32_MIN(a, b) SL_MIN(a, b)
-#define EFM32_MAX(a, b) SL_MAX(a, b)
-#define EFM32_ATTRIBUTE_PACKED SL_ATTRIBUTE_PACKED
-#define EFM32_ATTRIBUTE_ALIGN(X) SL_ATTRIBUTE_ALIGN(X)
-#define EFM32_ALIGN(X) SL_ALIGN(X)
-#define EFM32_WEAK SL_WEAK
-#define EFM32_ATTRIBUTE_SECTION(X) SL_ATTRIBUTE_SECTION(X)
-
-#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 */
--- a/USBDevice/TARGET_Silicon_Labs/inc/em_usbd.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-/***************************************************************************//**
- * @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 */
--- a/USBDevice/TARGET_Silicon_Labs/inc/em_usbh.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/***************************************************************************//**
- * @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 */
--- a/USBDevice/TARGET_Silicon_Labs/inc/em_usbhal.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,757 +0,0 @@
-/***************************************************************************//**
- * @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 */
--- a/USBDevice/TARGET_Silicon_Labs/inc/em_usbtypes.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,230 +0,0 @@
-/***************************************************************************//**
- * @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 */
--- a/USBDevice/TARGET_Silicon_Labs/inc/usbconfig.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/***************************************************************************//**
- * @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 */
--- a/USBDevice/TARGET_Silicon_Labs/src/em_usbd.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1438 +0,0 @@
-/**************************************************************************//**
- * @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 ) */
--- a/USBDevice/TARGET_Silicon_Labs/src/em_usbdep.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,446 +0,0 @@
-/**************************************************************************//**
- * @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 ) */
--- a/USBDevice/TARGET_Silicon_Labs/src/em_usbdint.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,946 +0,0 @@
-/**************************************************************************//**
- * @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 ) */
--- a/USBDevice/TARGET_Silicon_Labs/src/em_usbhal.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,799 +0,0 @@
-/**************************************************************************//**
- * @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 ) */
--- a/USBDevice/TARGET_Silicon_Labs/src/em_usbtimer.c Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,381 +0,0 @@
-/***************************************************************************//**
- * @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 ) */
--- a/USBDevice/USBEndpoints_EFM32.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-
-#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
--- a/USBDevice/USBEndpoints_KL25Z.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/* 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. */
-/* ---------------- */
-#define EP0OUT (0)
-#define EP0IN (1)
-#define EP1OUT (2)
-#define EP1IN (3)
-#define EP2OUT (4)
-#define EP2IN (5)
-#define EP3OUT (6)
-#define EP3IN (7)
-
-/* 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)
-
-/* 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)
--- a/USBDevice/USBEndpoints_LPC11U.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/* 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)
--- a/USBDevice/USBEndpoints_LPC17_LPC23.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/* 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)
--- a/USBDevice/USBEndpoints_M453.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2015-2016 Nuvoton
- *
- * 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.
- */
-#define NU_MAX_EPX_BUFSIZE 4096
-#define NU_EP2EPL(ep) ((ep) >> 1)
-#define NU_EP2EPH(ep) (((ep) >> 1) + 1)
-#define NU_EPL2EPH(ep) ((ep) + 1)
-#define NU_EPH2EPL(ep) ((ep) - 1)
-#define NU_EP_DIR_Pos 0
-#define NU_EP_DIR_Msk (1 << NU_EP_DIR_Pos)
-#define NU_EP_DIR_OUT 0
-#define NU_EP_DIR_IN 1
-
-#define NU_EP_TYPE(ep) (((ep) & NU_EP_TYPE_Msk) >> NU_EP_TYPE_Pos)
-#define NU_EP_NUM(ep) (((ep) & NU_EP_NUM_Msk) >> NU_EP_NUM_Pos)
-#define NU_EP_DIR(ep) (((ep) & NU_EP_DIR_Msk) >> NU_EP_DIR_Pos)
-#define NU_EP_NUM_DIR(ep) ((NU_EP_NUM(ep) << 1) | NU_EP_DIR(ep))
-
-#define NUMBER_OF_PHYSICAL_ENDPOINTS 8
-#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)
-
-/* 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 0x60
-#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 EP5OUT
-#define EPBULK_IN EP6IN
-#define EPBULK_OUT_callback EP5_OUT_callback
-#define EPBULK_IN_callback EP6_IN_callback
-/* Interrupt endpoints */
-#define EPINT_OUT EP1OUT
-#define EPINT_IN EP2IN
-#define EPINT_OUT_callback EP1_OUT_callback
-#define EPINT_IN_callback EP2_IN_callback
-/* Isochronous endpoints */
-#define EPISO_OUT EP3OUT
-#define EPISO_IN EP4IN
-#define EPISO_OUT_callback EP3_OUT_callback
-#define EPISO_IN_callback EP4_IN_callback
-
-#define MAX_PACKET_SIZE_EPBULK 64
-#define MAX_PACKET_SIZE_EPINT 64
-#define MAX_PACKET_SIZE_EPISO 1023
-
--- a/USBDevice/USBEndpoints_Maxim.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * 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)
--- a/USBDevice/USBEndpoints_NUC472.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2015-2016 Nuvoton
- *
- * 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.
- */
-#define NU_MAX_EPX_BUFSIZE 4096
-#define NU_EP2EPL(ep) ((ep) >> 1)
-#define NU_EP2EPH(ep) (((ep) >> 1) - 1)
-#define NU_EPX2EP(ep) ((ep == CEP) ? EP0OUT : ((ep) - EPA + EP1OUT))
-#define NU_EPL2EPH(ep) ((ep) - 1)
-#define NU_EPH2EPL(ep) ((ep) + 1)
-#define NU_EP_DIR_Pos 0
-#define NU_EP_DIR_Msk (1 << NU_EP_DIR_Pos)
-#define NU_EP_DIR_OUT 0
-#define NU_EP_DIR_IN 1
-
-#define NU_EP_TYPE(ep) (((ep) & NU_EP_TYPE_Msk) >> NU_EP_TYPE_Pos)
-#define NU_EP_NUM(ep) (((ep) & NU_EP_NUM_Msk) >> NU_EP_NUM_Pos)
-#define NU_EP_DIR(ep) (((ep) & NU_EP_DIR_Msk) >> NU_EP_DIR_Pos)
-#define NU_EP_NUM_DIR(ep) ((NU_EP_NUM(ep) << 1) | NU_EP_DIR(ep))
-
-#define NUMBER_OF_PHYSICAL_ENDPOINTS 12
-
-#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)
-
-/* 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 0x60
-#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
-
-/* Generic endpoints - intended to be portable accross devices */
-/* and be suitable for simple USB devices. */
-
-/* Bulk endpoints */
-#define EPBULK_OUT EP5OUT
-#define EPBULK_IN EP6IN
-#define EPBULK_OUT_callback EP5_OUT_callback
-#define EPBULK_IN_callback EP6_IN_callback
-/* Interrupt endpoints */
-#define EPINT_OUT EP1OUT
-#define EPINT_IN EP2IN
-#define EPINT_OUT_callback EP1_OUT_callback
-#define EPINT_IN_callback EP2_IN_callback
-/* Isochronous endpoints */
-#define EPISO_OUT EP3OUT
-#define EPISO_IN EP4IN
-#define EPISO_OUT_callback EP3_OUT_callback
-#define EPISO_IN_callback EP4_IN_callback
-
-#define MAX_PACKET_SIZE_EPBULK 64
-#define MAX_PACKET_SIZE_EPINT 64
-#define MAX_PACKET_SIZE_EPISO 1023
-
-#define USBD_GET_EP_MAX_PAYLOAD(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAMPS + (uint32_t)((ep)*0x28))))
-#define USBD_GET_EP_DATA_COUNT(ep) ((*((__IO uint32_t *) ((uint32_t)&USBD->EPADATCNT + (uint32_t)((ep)*0x28)))) & 0xFFFFF)
-#define USBD_SET_EP_SHORT_PACKET(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EPARSPCTL + (uint32_t)((ep)*0x28))) = (*((__IO uint32_t *) ((uint32_t)&USBD->EPARSPCTL + (uint32_t)((ep)*0x28)))) & 0x10 | 0x40)
-#define USBD_GET_EP_INT_EN(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAINTEN + (uint32_t)((ep)*0x28))))
--- a/USBDevice/USBEndpoints_RZ_A1H.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/* 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*/
--- a/USBDevice/USBEndpoints_STM32.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/* 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_SETUP (48)
-#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 (200) /* Int/Bulk/iso (44100 stereo 16 bits) */
-
-#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)
--- a/USBDevice/USBEndpoints_STM32F4.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/* 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)
--- a/USBDevice/USBHAL_EFM32.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,775 +0,0 @@
-/* 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
--- a/USBDevice/USBHAL_KL25Z.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,507 +0,0 @@
-/* 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)
-
-#if defined(TARGET_KSDK2_MCUS)
-#include "fsl_common.h"
-#endif
-#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:
-// * 4 bidirectionnal endpt -> 8 physical endpt
-// * as there are ODD and EVEN buffer -> 8*2 bdt
-MBED_ALIGN(512) BDT bdt[NUMBER_OF_PHYSICAL_ENDPOINTS * 2]; // 512 bytes aligned!
-
-uint8_t * endpoint_buffer[NUMBER_OF_PHYSICAL_ENDPOINTS * 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(FSL_FEATURE_SOC_MPU_COUNT) && (FSL_FEATURE_SOC_MPU_COUNT > 0U))
- 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;
-
-#if defined(TARGET_KL43Z) || defined(TARGET_K22F) || defined(TARGET_K64F)
- // enable USBFS clock
- CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000U);
-#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
- // 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;
-
- /* Allocate control endpoint buffers */
- endpoint_buffer[EP_BDT_IDX(0, TX, ODD)] = (uint8_t *)malloc(MAX_PACKET_SIZE_EP0);
- endpoint_buffer[EP_BDT_IDX(0, RX, ODD)] = (uint8_t *)malloc(MAX_PACKET_SIZE_EP0);
-}
-
-USBHAL::~USBHAL(void) { }
-
-void USBHAL::connect(void) {
- // enable USB
- USB0->CTL |= USB_CTL_USBENSOFEN_MASK;
- // Pull up enable
- USB0->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;
-
- // Allocate endpoint buffers; do allocate control endpoint buffers
- for (int i = 4; i < (NUMBER_OF_PHYSICAL_ENDPOINTS * 2); i++) {
- if ((i == EPISO_OUT) || (i == EPISO_IN)) {
- endpoint_buffer[i] = (uint8_t *)malloc(MAX_PACKET_SIZE_EPISO);
- } else {
- endpoint_buffer[i] = (uint8_t *)malloc(MAX_PACKET_SIZE_EPBULK);
- }
- }
-}
-
-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; do not free the control endpoint buffers
- for (int i = 4; i < (NUMBER_OF_PHYSICAL_ENDPOINTS * 2); i++) {
- free(endpoint_buffer[i]);
- endpoint_buffer[i] = 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)) {
- buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)][0];
- } else {
- buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)][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;
- }
-
- ep_buf = endpoint_buffer[idx];
-
- 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;
-
- ep_buf = endpoint_buffer[idx];
-
- 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
-
- // reset bus for USBDevice layer
- busReset();
-
- 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
--- a/USBDevice/USBHAL_LPC11U.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,738 +0,0 @@
-/* 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
--- a/USBDevice/USBHAL_LPC17.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,623 +0,0 @@
-/* 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
--- a/USBDevice/USBHAL_LPC40.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,628 +0,0 @@
-/* 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
--- a/USBDevice/USBHAL_M453.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,465 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2015-2016 Nuvoton
- *
- * 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_NUMAKER_PFM_M453)
-
-#include "USBHAL.h"
-#include "M451Series.h"
-#include "pinmap.h"
-
-/**
- * EP: mbed USBD defined endpoint, e.g. EP0OUT/IN, EP1OUT/IN, EP2OUT/IN.
- * EPX: BSP defined endpoint, e.g. CEP, EPA, EPB, EPC.
- */
-
-USBHAL * USBHAL::instance;
-
-/* Global variables for Control Pipe */
-extern uint8_t g_usbd_SetupPacket[]; /*!< Setup packet buffer */
-
-static volatile uint32_t s_ep_compl = 0;
-static volatile uint32_t s_ep_buf_ind = 8;
-static volatile uint8_t s_usb_addr = 0;
-static volatile uint8_t s_ep_data_bit[NUMBER_OF_PHYSICAL_ENDPOINTS] = {1};
-static volatile uint8_t s_ep_mxp[NUMBER_OF_PHYSICAL_ENDPOINTS] = {0};
-
-extern volatile uint8_t *g_usbd_CtrlInPointer;
-extern volatile uint32_t g_usbd_CtrlInSize;
-extern volatile uint8_t *g_usbd_CtrlOutPointer;
-extern volatile uint32_t g_usbd_CtrlOutSize;
-extern volatile uint32_t g_usbd_CtrlOutSizeLimit;
-extern volatile uint32_t g_usbd_UsbConfig;
-extern volatile uint32_t g_usbd_CtrlMaxPktSize;
-extern volatile uint32_t g_usbd_UsbAltInterface;
-volatile uint32_t g_usbd_CepTransferLen = 0;
-volatile uint32_t frame_cnt = 0;
-USBHAL::USBHAL(void)
-{
- SYS_UnlockReg();
-
- s_ep_buf_ind = 8;
-
- memset(epCallback, 0x00, sizeof (epCallback));
- epCallback[0] = &USBHAL::EP1_OUT_callback;
- epCallback[1] = &USBHAL::EP2_IN_callback;
- epCallback[2] = &USBHAL::EP3_OUT_callback;
- epCallback[3] = &USBHAL::EP4_IN_callback;
- epCallback[4] = &USBHAL::EP5_OUT_callback;
- epCallback[5] = &USBHAL::EP6_IN_callback;
-
- instance = this;
- /* Enable USBD module clock */
- CLK_EnableModuleClock(USBD_MODULE);
-
- CLK_SetModuleClock(USBD_MODULE, 0, CLK_CLKDIV0_USB(3));
-
- /* Enable USB LDO33 */
- SYS->USBPHY = SYS_USBPHY_LDO33EN_Msk;
-
- /* Initial USB engine */
- USBD->ATTR = 0x7D0;
-
- /* Set SE0 (disconnect) */
- USBD_SET_SE0();
-
- //NVIC_SetVector(OTG_FS_IRQn, (uint32_t) &_usbisr);
- NVIC_SetVector(USBD_IRQn, (uint32_t) &_usbisr);
- NVIC_EnableIRQ(USBD_IRQn);
-}
-
-USBHAL::~USBHAL(void)
-{
- NVIC_DisableIRQ(USBD_IRQn);
- USBD_SET_SE0();
- USBD_DISABLE_PHY();
-}
-
-void USBHAL::connect(void)
-{
- USBD->STBUFSEG = 0;
- frame_cnt = 0;
- /* EP0 ==> control IN endpoint, address 0 */
- USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0);
- /* Buffer range for EP0 */
- USBD_SET_EP_BUF_ADDR(EP0, s_ep_buf_ind);
-
- /* EP1 ==> control OUT endpoint, address 0 */
- USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0);
- /* Buffer range for EP1 */
- USBD_SET_EP_BUF_ADDR(EP1, s_ep_buf_ind);
-
- s_ep_buf_ind += MAX_PACKET_SIZE_EP0;
-
- /* Disable software-disconnect function */
- USBD_CLR_SE0();
-
- /* Clear USB-related interrupts before enable interrupt */
- USBD_CLR_INT_FLAG(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP);
-
- /* Enable USB-related interrupts. */
- USBD_ENABLE_INT(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP);
-}
-
-void USBHAL::disconnect(void)
-{
- /* Set SE0 (disconnect) */
- USBD_SET_SE0();
-}
-
-void USBHAL::configureDevice(void)
-{
- /**
- * In USBDevice.cpp > USBDevice::requestSetConfiguration, configureDevice() is called after realiseEndpoint() (in USBCallback_setConfiguration()).
- * So we have the following USB buffer management policy:
- * 1. Allocate for CEP on connect().
- * 2. Allocate for EPX in realiseEndpoint().
- * 3. Deallocate all except for CEP in unconfigureDevice().
- */
-}
-
-void USBHAL::unconfigureDevice(void)
-{
- s_ep_buf_ind = 8;
-}
-
-void USBHAL::setAddress(uint8_t address)
-{
- // NOTE: Delay address setting; otherwise, USB controller won't ack.
- s_usb_addr = address;
-}
-
-void USBHAL::remoteWakeup(void)
-{
-#if 0
- USBD->OPER |= USBD_OPER_RESUMEEN_Msk;
-#endif
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
-{
- uint32_t ep_type = 0;
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- uint32_t ep_logic_index = NU_EP2EPL(endpoint);
- uint32_t ep_dir = (NU_EP_DIR(endpoint) == NU_EP_DIR_IN) ? USBD_CFG_EPMODE_IN : USBD_CFG_EPMODE_OUT;
-
- if (ep_logic_index == 3 || ep_logic_index == 4)
- ep_type = USBD_CFG_TYPE_ISO;
-
- USBD_CONFIG_EP(ep_hw_index, ep_dir | ep_type | ep_logic_index);
- /* Buffer range */
- USBD_SET_EP_BUF_ADDR(ep_hw_index, s_ep_buf_ind);
-
- if (ep_dir == USBD_CFG_EPMODE_OUT)
- USBD_SET_PAYLOAD_LEN(ep_hw_index, maxPacket);
-
- s_ep_mxp[ep_logic_index] = maxPacket;
-
- s_ep_buf_ind += maxPacket;
-
- return true;
-}
-
-void USBHAL::EP0setup(uint8_t *buffer)
-{
- uint32_t sz;
- endpointReadResult(EP0OUT, buffer, &sz);
-}
-
-void USBHAL::EP0read(void)
-{
-
-
-}
-
-void USBHAL::EP0readStage(void)
-{
- // N/A
-
- USBD_PrepareCtrlOut(0,0);
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
-{
- uint32_t i;
- uint8_t *buf = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP1));
- uint32_t ceprxcnt = USBD_GET_PAYLOAD_LEN(EP1);
- for (i = 0; i < ceprxcnt; i ++)
- buffer[i] = buf[i];
- USBD_SET_PAYLOAD_LEN(EP1, MAX_PACKET_SIZE_EP0);
- return ceprxcnt;
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
-{
- if (buffer && size)
- {
- if (s_ep_data_bit[0] & 1)
- USBD_SET_DATA1(EP0);
- else
- USBD_SET_DATA0(EP0);
- s_ep_data_bit[0]++;
-
- USBD_MemCopy((uint8_t *)USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0), buffer, size);
- USBD_SET_PAYLOAD_LEN(EP0, size);
- if (size < MAX_PACKET_SIZE_EP0)
- s_ep_data_bit[0] = 1;
-
- }
- else
- {
- if (g_usbd_SetupPacket[0] & 0x80) //Device to Host
- {
- // Status stage
- // USBD_PrepareCtrlOut(0,0);
- } else
- {
- USBD_SET_DATA1(EP0);
- USBD_SET_PAYLOAD_LEN(EP0, 0);
- }
- }
-}
-
-void USBHAL::EP0getWriteResult(void)
-{
- // N/A
-}
-
-void USBHAL::EP0stall(void)
-{
- 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) //spcheng
-{
- if (endpoint == EP0OUT)
- {
- USBD_MemCopy(g_usbd_SetupPacket, (uint8_t *)USBD_BUF_BASE, 8);
- if (buffer) {
- USBD_MemCopy(buffer, g_usbd_SetupPacket, 8);
- }
- USBD_SET_PAYLOAD_LEN(EP1, MAX_PACKET_SIZE_EP0);
- }
- else
- {
- uint32_t i;
- uint8_t *buf = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(NU_EP2EPH(endpoint)));
- uint32_t eprxcnt = USBD_GET_PAYLOAD_LEN(NU_EP2EPH(endpoint));
- for (i = 0; i < eprxcnt; i ++)
- buffer[i] = buf[i];
-
- *bytesRead = eprxcnt;
-
- USBD_SET_PAYLOAD_LEN(NU_EP2EPH(endpoint),s_ep_mxp[NU_EPH2EPL(NU_EP2EPL(endpoint))]);
- }
- return EP_COMPLETED;
-}
-
-
-uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer)
-{
- return 0;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
-{
- uint32_t ep_logic_index = NU_EP2EPL(endpoint);
- if (ep_logic_index == 0)
- return EP_INVALID;
- else
- {
- uint8_t *buf;
- uint32_t i=0;
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- s_ep_compl |= (1 << ep_logic_index);
- buf = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(ep_hw_index));
- for (i=0;i<size;i++)
- buf[i] = data[i];
-
- /* Set transfer length and trigger IN transfer */
- USBD_SET_PAYLOAD_LEN(ep_hw_index, size);
-
- }
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
-{
- if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
- return EP_COMPLETED;
- return EP_PENDING;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint)
-{
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
- return;
-
- USBD_SetStall(NU_EPH2EPL(ep_hw_index));
-
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint)
-{
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
- return;
- USBD_ClearStall(NU_EPH2EPL(ep_hw_index));
-}
-
-bool USBHAL::getEndpointStallState(uint8_t endpoint)
-{
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
- return false;
-
- return USBD_GetStall(NU_EPH2EPL(ep_hw_index)) ? 1 : 0;
-}
-
-void USBHAL::_usbisr(void)
-{
- MBED_ASSERT(instance);
- instance->usbisr();
-}
-
-void USBHAL::usbisr(void)
-{
- uint32_t u32IntSts = USBD_GET_INT_FLAG();
- uint32_t u32State = USBD_GET_BUS_STATE();
-
-//------------------------------------------------------------------
- if (u32IntSts & USBD_INTSTS_VBDETIF_Msk)
- {
- // Floating detect
- USBD_CLR_INT_FLAG(USBD_INTSTS_VBDETIF_Msk);
-
- if (USBD_IS_ATTACHED())
- {
- /* USB Plug In */
- USBD_ENABLE_USB();
- }
- else
- {
- /* USB Un-plug */
- USBD_DISABLE_USB();
- }
- }
-
-//------------------------------------------------------------------
- if (u32IntSts & USBD_INTSTS_BUSIF_Msk)
- {
- /* Clear event flag */
- USBD_CLR_INT_FLAG(USBD_INTSTS_BUSIF_Msk);
-
- if (u32State & USBD_ATTR_USBRST_Msk)
- {
- /* Bus reset */
- USBD_ENABLE_USB();
- USBD_SwReset();
- }
- if (u32State & USBD_ATTR_SUSPEND_Msk)
- {
- /* Enable USB but disable PHY */
- USBD_DISABLE_PHY();
- }
- if (u32State & USBD_ATTR_RESUME_Msk)
- {
- /* Enable USB and enable PHY */
- USBD_ENABLE_USB();
- }
- }
-
- if (u32IntSts & USBD_INTSTS_USBIF_Msk)
- {
- // USB event
- if (u32IntSts & USBD_INTSTS_SETUP_Msk)
- {
- // Setup packet
- /* Clear event flag */
- USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP_Msk);
-
- /* Clear the data IN/OUT ready flag of control end-points */
- USBD_STOP_TRANSACTION(EP0);
- USBD_STOP_TRANSACTION(EP1);
- EP0setupCallback();
- }
-
- // EP events
- if (u32IntSts & USBD_INTSTS_EP0)
- {
- /* Clear event flag */
- USBD_CLR_INT_FLAG(USBD_INTSTS_EP0);
- // control IN
- EP0in();
-
- // In ACK for Set address
- if ((g_usbd_SetupPacket[0] == REQ_STANDARD) && (g_usbd_SetupPacket[1] == USBD_SET_ADDRESS))
- {
- if ((USBD_GET_ADDR() != s_usb_addr) && (USBD_GET_ADDR() == 0))
- {
- USBD_SET_ADDR(s_usb_addr);
- }
- }
- }
- if (u32IntSts & USBD_INTSTS_EP1)
- {
- /* Clear event flag */
- USBD_CLR_INT_FLAG(USBD_INTSTS_EP1);
-
- // control OUT
- EP0out();
- }
-
- uint32_t gintsts_epx = (u32IntSts >> 18) & 0x3F;
- uint32_t ep_hw_index = 2;
- while (gintsts_epx) {
- if (gintsts_epx & 0x01)
- {
- uint32_t ep_status = (USBD_GET_EP_FLAG() >> (ep_hw_index * 3 + 8)) & 0x7;
- /* Clear event flag */
- USBD_CLR_INT_FLAG(1 << (ep_hw_index + 16));
-
- if (ep_status == 0x02 || ep_status == 0x06 || (ep_status == 0x07 && NU_EPH2EPL(ep_hw_index) == 3)) //RX
- {
- if (ep_status == 0x07)
- SOF(frame_cnt++);
- if ((instance->*(epCallback[ep_hw_index-2]))())
- {
-
- }
- USBD_SET_PAYLOAD_LEN(ep_hw_index,s_ep_mxp[NU_EPH2EPL(ep_hw_index)]);
- }
- else if (ep_status == 0x00 || ep_status == 0x07) //TX
- {
- s_ep_compl &= ~(1 << (NU_EPH2EPL(ep_hw_index)));
- if ((instance->*(epCallback[ep_hw_index-2]))())
- {
- }
- }
- }
-
- gintsts_epx = gintsts_epx >> 1;
- ep_hw_index++;
- }
- }
-}
-#endif
-
--- a/USBDevice/USBHAL_Maxim.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,492 +0,0 @@
-/*******************************************************************************
- * 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, &_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
--- a/USBDevice/USBHAL_NUC472.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,730 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2015-2016 Nuvoton
- *
- * 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_NUMAKER_PFM_NUC472)
-
-#include "USBHAL.h"
-#include "NUC472_442.h"
-#include "pinmap.h"
-
-/**
- * EP: mbed USBD defined endpoint, e.g. EP0OUT/IN, EP1OUT/IN, EP2OUT/IN.
- * EPX: BSP defined endpoint, e.g. CEP, EPA, EPB, EPC.
- */
-
-USBHAL * USBHAL::instance;
-
-static volatile uint32_t s_ep_compl = 0;
-static volatile uint32_t s_ep_buf_ind = 0;
-static volatile uint8_t s_usb_addr = 0;
-static volatile S_USBD_CMD_T s_setup;
-static volatile uint16_t s_ctrlin_packetsize;
-static uint8_t *g_usbd_CtrlInPointer = 0;
-static uint32_t g_usbd_CtrlMaxPktSize = 64;
-static uint32_t g_usbd_ShortPkt = 0;
-static uint32_t gEpRead = 0;
-static uint32_t gEpReadCnt = 0;
-
-void USBD_CtrlInput(void)
-{
- int volatile i;
- uint32_t volatile count;
-
- // Process remained data
- if (g_usbd_CtrlInSize >= g_usbd_CtrlMaxPktSize)
- {
- // Data size > MXPLD
- for (i=0; i<(g_usbd_CtrlMaxPktSize >> 2); i++, g_usbd_CtrlInPointer+=4)
- USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
- USBD_START_CEP_IN(g_usbd_CtrlMaxPktSize);
- g_usbd_CtrlInSize -= g_usbd_CtrlMaxPktSize;
- }
- else
- {
- // Data size <= MXPLD
- for (i=0; i<(g_usbd_CtrlInSize >> 2); i++, g_usbd_CtrlInPointer+=4)
- USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
-
- count = g_usbd_CtrlInSize % 4;
- for (i=0; i<count; i++)
- USBD->CEPDAT_BYTE = *(uint8_t *)(g_usbd_CtrlInPointer + i);
-
- USBD_START_CEP_IN(g_usbd_CtrlInSize);
- g_usbd_CtrlInPointer = 0;
- g_usbd_CtrlInSize = 0;
- }
-}
-
-USBHAL::USBHAL(void)
-{
- SYS_UnlockReg();
-
- s_ep_buf_ind = 0;
-
- memset(epCallback, 0x00, sizeof (epCallback));
- epCallback[0] = &USBHAL::EP1_OUT_callback;
- epCallback[1] = &USBHAL::EP2_IN_callback;
- epCallback[2] = &USBHAL::EP3_OUT_callback;
- epCallback[3] = &USBHAL::EP4_IN_callback;
- epCallback[4] = &USBHAL::EP5_OUT_callback;
- epCallback[5] = &USBHAL::EP6_IN_callback;
- epCallback[6] = &USBHAL::EP7_OUT_callback;
- epCallback[7] = &USBHAL::EP8_IN_callback;
- epCallback[8] = &USBHAL::EP9_OUT_callback;
- epCallback[9] = &USBHAL::EP10_IN_callback;
- epCallback[10] = &USBHAL::EP11_OUT_callback;
- epCallback[11] = &USBHAL::EP12_IN_callback;
-
- instance = this;
-
- /* Enable USBD module clock */
- CLK_EnableModuleClock(USBD_MODULE);
-
- /* Enable USB PHY's LDO33. Run as USB device. */
- SYS->USBPHY = SYS_USBPHY_USBROLE_OTG_V33_EN | SYS_USBPHY_USBROLE_STD_USBD;
-
- /* Enable USB PHY and wait for it ready */
- USBD_ENABLE_PHY();
- while (1)
- {
- USBD->EPAMPS = 0x20;
- if (USBD->EPAMPS == 0x20)
- break;
- }
-
- /* Force to full-speed */
- USBD->OPER = 0;//USBD_OPER_HISPDEN_Msk;
-
- /* Set SE0 (disconnect) */
- USBD_SET_SE0();
-
- NVIC_SetVector(USBD_IRQn, (uint32_t) &_usbisr);
- NVIC_EnableIRQ(USBD_IRQn);
-}
-
-USBHAL::~USBHAL(void)
-{
- NVIC_DisableIRQ(USBD_IRQn);
- USBD_SET_SE0();
- USBD_DISABLE_PHY();
-}
-
-void USBHAL::connect(void)
-{
- USBD_ResetDMA();
- USBD_SET_ADDR(0);
-
- /**
- * Control Transfer Packet Size Constraints
- * low-speed: 8
- * full-speed: 8, 16, 32, 64
- * high-speed: 64
- */
- /* Control endpoint */
- USBD_SetEpBufAddr(CEP, s_ep_buf_ind, MAX_PACKET_SIZE_EP0);
- s_ep_buf_ind = MAX_PACKET_SIZE_EP0;
-
- /* Enable USB/CEP interrupt */
- USBD_ENABLE_USB_INT(USBD_GINTEN_USBIE_Msk | USBD_GINTEN_CEPIE_Msk);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk);
-
- /* Enable BUS interrupt */
- USBD_ENABLE_BUS_INT(
- USBD_BUSINTEN_DMADONEIEN_Msk |
- USBD_BUSINTEN_RESUMEIEN_Msk |
- USBD_BUSINTEN_RSTIEN_Msk |
- USBD_BUSINTEN_VBUSDETIEN_Msk |
- USBD_BUSINTEN_SOFIEN_Msk
- );
-
- /* Clear SE0 (connect) */
- USBD_CLR_SE0();
-}
-
-void USBHAL::disconnect(void)
-{
- /* Set SE0 (disconnect) */
- USBD_SET_SE0();
-}
-
-void USBHAL::configureDevice(void)
-{
- /**
- * In USBDevice.cpp > USBDevice::requestSetConfiguration, configureDevice() is called after realiseEndpoint() (in USBCallback_setConfiguration()).
- * So we have the following USB buffer management policy:
- * 1. Allocate for CEP on connect().
- * 2. Allocate for EPX in realiseEndpoint().
- * 3. Deallocate all except for CEP in unconfigureDevice().
- */
-}
-
-void USBHAL::unconfigureDevice(void)
-{
- s_ep_buf_ind = MAX_PACKET_SIZE_EP0;
-}
-
-void USBHAL::setAddress(uint8_t address)
-{
- // NOTE: Delay address setting; otherwise, USB controller won't ack.
- s_usb_addr = address;
-}
-
-void USBHAL::remoteWakeup(void)
-{
- USBD->OPER |= USBD_OPER_RESUMEEN_Msk;
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
-{
- uint32_t ep_type;
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
-
- USBD_SetEpBufAddr(ep_hw_index, s_ep_buf_ind, maxPacket);
- s_ep_buf_ind += maxPacket;
- USBD_SET_MAX_PAYLOAD(ep_hw_index, maxPacket);
-
- switch (NU_EP2EPL(endpoint))
- {
- case 1: case 2:
- ep_type = USB_EP_CFG_TYPE_INT;
- break;
-
- case 3: case 4:
- ep_type = USB_EP_CFG_TYPE_ISO;
- break;
-
- default:
- ep_type = USB_EP_CFG_TYPE_BULK;
- }
- uint32_t ep_dir = (NU_EP_DIR(endpoint) == NU_EP_DIR_IN) ? USB_EP_CFG_DIR_IN : USB_EP_CFG_DIR_OUT;
- USBD_ConfigEp(ep_hw_index, NU_EP2EPL(endpoint), ep_type, ep_dir);
-
- /* Enable USB/EPX interrupt */
- // NOTE: Require USBD_GINTEN_EPAIE_Pos, USBD_GINTEN_EPBIE_Pos, ... USBD_GINTEN_EPLIE_Pos to be consecutive.
- USBD_ENABLE_USB_INT(USBD->GINTEN | USBD_GINTEN_USBIE_Msk |
- USBD_GINTEN_CEPIE_Msk |
- 1 << (ep_hw_index + USBD_GINTEN_EPAIE_Pos)); // Added USB/EPX interrupt
-
- if (ep_dir == 0)
- USBD_ENABLE_EP_INT(ep_hw_index, USBD_EPINTEN_RXPKIEN_Msk);
- else
- USBD_ENABLE_EP_INT(ep_hw_index, USBD_EPINTEN_TXPKIEN_Msk);
- return true;
-}
-
-void USBHAL::EP0setup(uint8_t *buffer)
-{
- uint32_t sz;
- endpointReadResult(EP0OUT, buffer, &sz);
-}
-
-void USBHAL::EP0read(void)
-{
- if (s_setup.wLength && ! (s_setup.bmRequestType & 0x80))
- {
- // Control OUT
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk | USBD_CEPINTEN_RXPKIEN_Msk);
- }
- else
- {
- // Status stage
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
- USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
- }
-}
-
-void USBHAL::EP0readStage(void)
-{
- // N/A
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
-{
- uint32_t i;
- uint32_t ceprxcnt = USBD->CEPRXCNT;
- for (i = 0; i < ceprxcnt; i ++)
- *buffer ++ = USBD->CEPDAT_BYTE;
- return ceprxcnt;
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
-{
- if (buffer && size)
- {
- g_usbd_CtrlInPointer = buffer;
- g_usbd_CtrlInSize = size;
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_INTKIEN_Msk);
- }
- else
- {
- /* Status stage */
- s_ctrlin_packetsize = 0;
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
- USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
- }
-}
-
-void USBHAL::EP0getWriteResult(void)
-{
- // N/A
-}
-
-void USBHAL::EP0stall(void)
-{
- 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) //spcheng
-{
- if (endpoint == EP0OUT)
- {
- if (buffer) {
- *((uint16_t *) (buffer + 0)) = (uint16_t) USBD->SETUP1_0;
- *((uint16_t *) (buffer + 2)) = (uint16_t) USBD->SETUP3_2;
- *((uint16_t *) (buffer + 4)) = (uint16_t) USBD->SETUP5_4;
- *((uint16_t *) (buffer + 6)) = (uint16_t) USBD->SETUP7_6;
- }
-
- s_setup.bmRequestType = (uint8_t) (USBD->SETUP1_0 & 0xff);
- s_setup.bRequest = (int8_t) (USBD->SETUP1_0 >> 8) & 0xff;
- s_setup.wValue = (uint16_t) USBD->SETUP3_2;
- s_setup.wIndex = (uint16_t) USBD->SETUP5_4;
- s_setup.wLength = (uint16_t) USBD->SETUP7_6;
- }
- else
- {
- if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
- {
- while (1)
- {
- if (!(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
- break;
- else
- if (!USBD_IS_ATTACHED())
- break;
- }
- gEpReadCnt = USBD_GET_EP_DATA_COUNT(NU_EP2EPH(endpoint));
- if (gEpReadCnt == 0)
- {
- *bytesRead = 0;
- return EP_COMPLETED;
- }
- s_ep_compl |= (1 << NU_EP2EPL(endpoint));
- USBD_SET_DMA_LEN(gEpReadCnt);
- USBD_SET_DMA_ADDR((uint32_t)buffer);
- USBD_SET_DMA_WRITE(NU_EP2EPL(endpoint));
- USBD_ENABLE_DMA();
- return EP_PENDING;;
-
- }
- else
- {
- if ((USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
- return EP_PENDING;;
-
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_DMADONEIF_Msk);
- s_ep_compl &= ~(1 << NU_EP2EPL(endpoint));
- *bytesRead = gEpReadCnt;
- }
- }
- return EP_COMPLETED;
-}
-
-
-uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer)
-{
- return 0;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
-{
- uint32_t ep_logic_index = NU_EP2EPL(endpoint);
- if (ep_logic_index == 0)
- return EP_INVALID;
- else
- {
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- uint32_t mps = USBD_GET_EP_MAX_PAYLOAD(ep_hw_index);
- if (size > mps) {
- return EP_INVALID;
- }
- if (size < mps)
- g_usbd_ShortPkt = 1;
- if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
- {
- s_ep_compl |= (1 << ep_logic_index);
-
- while (1)
- {
- if (!(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
- break;
- else
- if (!USBD_IS_ATTACHED())
- break;
- }
- USBD_SET_DMA_LEN(size);
- USBD_SET_DMA_ADDR((uint32_t)data);
- USBD_SET_DMA_READ(ep_logic_index);
- USBD_ENABLE_DMA();
- }
- }
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
-{
- if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
- return EP_COMPLETED;
- else
- {
- if ((USBD_GET_EP_DATA_COUNT(NU_EP2EPH(endpoint))) == 0 && !(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
- {
- s_ep_compl &= ~(s_ep_compl & (1 << NU_EP2EPL(endpoint)));
- return EP_COMPLETED;
- }
- }
- return EP_PENDING;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint)
-{
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
- return;
- USBD_SetStall(ep_hw_index);
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint)
-{
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
- return;
- USBD_ClearStall(ep_hw_index);
-}
-
-bool USBHAL::getEndpointStallState(uint8_t endpoint)
-{
- uint32_t ep_hw_index = NU_EP2EPH(endpoint);
- if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
- return false;
- return USBD_GetStall(ep_hw_index) ? 1 : 0;
-}
-
-void USBHAL::_usbisr(void)
-{
- MBED_ASSERT(instance);
- instance->usbisr();
-}
-
-void USBHAL::usbisr(void)
-{
- uint32_t gintsts = USBD->GINTSTS & USBD->GINTEN;
- if (! gintsts)
- return;
-
- if (gintsts & USBD_GINTSTS_USBIF_Msk)
- {
- uint32_t busintsts = USBD->BUSINTSTS & USBD->BUSINTEN;
-
- /* SOF */
- if (busintsts & USBD_BUSINTSTS_SOFIF_Msk)
- {
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SOFIF_Msk);
- // TODO
- SOF(USBD->FRAMECNT >> 3);
- }
-
- /* Reset */
- if (busintsts & USBD_BUSINTSTS_RSTIF_Msk)
- {
- connect();
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RSTIF_Msk);
- USBD_CLR_CEP_INT_FLAG(0x1ffc);
- }
-
- /* Resume */
- if (busintsts & USBD_BUSINTSTS_RESUMEIF_Msk)
- {
- USBD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk|USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_SOFIEN_Msk | USBD_BUSINTEN_SOFIEN_Msk);
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RESUMEIF_Msk);
- }
-
- /* Suspend */
- if (busintsts & USBD_BUSINTSTS_SUSPENDIF_Msk)
- {
- USBD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk |USBD_BUSINTEN_SOFIEN_Msk);
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SUSPENDIF_Msk);
- }
-
- /* High-speed */
- if (busintsts & USBD_BUSINTSTS_HISPDIF_Msk)
- {
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk);
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_HISPDIF_Msk);
- }
-
- /* DMA */
- if (busintsts & USBD_BUSINTSTS_DMADONEIF_Msk)
- {
- if (USBD->DMACTL & 0x10) /* IN - Read */
- {
- if (g_usbd_ShortPkt)
- {
- uint32_t ep_hw_index = NU_EPL2EPH((USBD->DMACTL & 0xF));
- USBD_SET_EP_SHORT_PACKET(ep_hw_index);
- g_usbd_ShortPkt = 0;
- }
- }
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_DMADONEIF_Msk);
- }
-
- /* PHY clock available */
- if (busintsts & USBD_BUSINTSTS_PHYCLKVLDIF_Msk)
- {
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_PHYCLKVLDIF_Msk);
- }
-
- /* VBUS plug-in */
- if (busintsts & USBD_BUSINTSTS_VBUSDETIF_Msk)
- {
- if (USBD_IS_ATTACHED())
- {
- // USB plug-in
- USBD_ENABLE_USB();
- }
- else
- {
- // USB unplug-out
- USBD_DISABLE_USB();
- }
- USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_VBUSDETIF_Msk);
- }
- }
-
- /* CEP interrupts */
- if (gintsts & USBD_GINTSTS_CEPIF_Msk)
- {
- uint32_t cepintsts = USBD->CEPINTSTS & USBD->CEPINTEN;
-
- /* SETUP token packet */
- if (cepintsts & USBD_CEPINTSTS_SETUPTKIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPTKIF_Msk);
- return;
- }
-
- /* SETUP transaction */
- if (cepintsts & USBD_CEPINTSTS_SETUPPKIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPPKIF_Msk);
- EP0setupCallback();
- return;
- }
-
- /* OUT token packet */
- if (cepintsts & USBD_CEPINTSTS_OUTTKIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_OUTTKIF_Msk);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
- return;
- }
-
- /* IN token packet */
- if (cepintsts & USBD_CEPINTSTS_INTKIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk);
- if (!(cepintsts & USBD_CEPINTSTS_STSDONEIF_Msk))
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk);
- USBD_CtrlInput();
- }
- else
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk);
- }
- return;
- }
-
- /* PING packet */
- if (cepintsts & USBD_CEPINTSTS_PINGIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_PINGIF_Msk);
- return;
- }
-
- /* IN transaction */
- if (cepintsts & USBD_CEPINTSTS_TXPKIF_Msk)
- {
- EP0in();
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
- return;
- }
-
- /* OUT transaction */
- if (cepintsts & USBD_CEPINTSTS_RXPKIF_Msk)
- {
- EP0out();
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_RXPKIF_Msk);
- return;
- }
-
- /* NAK handshake packet */
- if (cepintsts & USBD_CEPINTSTS_NAKIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_NAKIF_Msk);
- return;
- }
-
- /* STALL handshake packet */
- if (cepintsts & USBD_CEPINTSTS_STALLIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STALLIF_Msk);
- return;
- }
-
- /* ERR special packet */
- if (cepintsts & USBD_CEPINTSTS_ERRIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_ERRIF_Msk);
- return;
- }
-
- /* Status stage transaction */
- if (cepintsts & USBD_CEPINTSTS_STSDONEIF_Msk)
- {
- if (s_usb_addr)
- {
- USBD_SET_ADDR(s_usb_addr);
- s_usb_addr = 0;
- }
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
- USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk);
- return;
- }
-
- /* Buffer Full */
- if (cepintsts & USBD_CEPINTSTS_BUFFULLIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFFULLIF_Msk);
- return;
- }
-
- /* Buffer Empty */
- if (cepintsts & USBD_CEPINTSTS_BUFEMPTYIF_Msk)
- {
- USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFEMPTYIF_Msk);
- return;
- }
- }
- /* EPA, EPB, EPC, ... EPL interrupts */
- uint32_t gintsts_epx = gintsts >> 2;
- uint32_t ep_hw_index = 0;
- while (gintsts_epx) {
- if (gintsts_epx & 0x01)
- {
- uint32_t epxintsts = USBD_GET_EP_INT_FLAG(ep_hw_index) & USBD_GET_EP_INT_EN(ep_hw_index);
-
- USBD_CLR_EP_INT_FLAG(ep_hw_index, epxintsts);
-
- /* Buffer Full */
- if (epxintsts & USBD_EPINTSTS_BUFFULLIF_Msk)
- {
- }
-
- /* Buffer Empty */
- if (epxintsts & USBD_EPINTSTS_BUFEMPTYIF_Msk)
- {
- }
-
- /* Short Packet Transferred */
- if (epxintsts & USBD_EPINTSTS_SHORTTXIF_Msk)
- {
- }
-
- /* Data Packet Transmitted */
- if (epxintsts & USBD_EPINTSTS_TXPKIF_Msk)
- {
- s_ep_compl &= ~(1 << (NU_EPH2EPL(ep_hw_index)));
- if ((instance->*(epCallback[ep_hw_index]))())
- {
- }
- }
-
- /* Data Packet Received */
- if (epxintsts & USBD_EPINTSTS_RXPKIF_Msk)
- {
- if ((instance->*(epCallback[ep_hw_index]))())
- {
-
- }
- }
-
- /* OUT token packet */
- if (epxintsts & USBD_EPINTSTS_OUTTKIF_Msk)
- {
- }
-
- /* IN token packet */
- if (epxintsts & USBD_EPINTSTS_INTKIF_Msk)
- {
- }
-
- /* PING packet */
- if (epxintsts & USBD_EPINTSTS_PINGIF_Msk)
- {
- }
-
- /* NAK handshake packet sent to Host */
- if (epxintsts & USBD_EPINTSTS_NAKIF_Msk)
- {
- }
-
- /* STALL handshake packet sent to Host */
- if (epxintsts & USBD_EPINTSTS_STALLIF_Msk)
- {
- }
-
- /* NYET handshake packet sent to Host */
- if (epxintsts & USBD_EPINTSTS_NYETIF_Msk)
- {
- }
-
- /* ERR packet sent to Host */
- if (epxintsts & USBD_EPINTSTS_ERRIF_Msk)
- {
- }
-
- /* Bulk Out Short Packet Received */
- if (epxintsts & USBD_EPINTSTS_SHORTRXIF_Msk)
- {
- }
- }
- gintsts_epx = gintsts_epx >> 1;
- ep_hw_index++;
- }
-}
-#endif
-
--- a/USBDevice/USBHAL_RZ_A1H.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1497 +0,0 @@
-/* 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*/
--- a/USBDevice/USBHAL_STM32F4.cpp Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,416 +0,0 @@
-/* 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) && !defined(USB_STM_HAL)
-
-#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_STM32F412ZG) || 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
--- a/USBDevice/USBRegs_STM32.h Thu Jul 20 10:14:36 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/**
- ******************************************************************************
- * @file usb_regs.h
- * @author MCD Application Team
- * @version V2.1.0
- * @date 19-March-2012
- * @brief hardware registers
- ******************************************************************************
- * @attention
- *
- * <h2><center>© 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/targets/TARGET_Freescale/USBEndpoints_KL25Z.h Thu Jul 27 12:14:04 2017 +0100
@@ -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.
+*/
+
+#define NUMBER_OF_LOGICAL_ENDPOINTS (4)
+#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)
+
+/* 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)
+
+/* 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/targets/TARGET_Freescale/USBHAL_KL25Z.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,507 @@
+/* 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)
+
+#if defined(TARGET_KSDK2_MCUS)
+#include "fsl_common.h"
+#endif
+#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:
+// * 4 bidirectionnal endpt -> 8 physical endpt
+// * as there are ODD and EVEN buffer -> 8*2 bdt
+MBED_ALIGN(512) BDT bdt[NUMBER_OF_PHYSICAL_ENDPOINTS * 2]; // 512 bytes aligned!
+
+uint8_t * endpoint_buffer[NUMBER_OF_PHYSICAL_ENDPOINTS * 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(FSL_FEATURE_SOC_MPU_COUNT) && (FSL_FEATURE_SOC_MPU_COUNT > 0U))
+ 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;
+
+#if defined(TARGET_KL43Z) || defined(TARGET_K22F) || defined(TARGET_K64F)
+ // enable USBFS clock
+ CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000U);
+#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
+ // 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;
+
+ /* Allocate control endpoint buffers */
+ endpoint_buffer[EP_BDT_IDX(0, TX, ODD)] = (uint8_t *)malloc(MAX_PACKET_SIZE_EP0);
+ endpoint_buffer[EP_BDT_IDX(0, RX, ODD)] = (uint8_t *)malloc(MAX_PACKET_SIZE_EP0);
+}
+
+USBHAL::~USBHAL(void) { }
+
+void USBHAL::connect(void) {
+ // enable USB
+ USB0->CTL |= USB_CTL_USBENSOFEN_MASK;
+ // Pull up enable
+ USB0->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;
+
+ // Allocate endpoint buffers; do allocate control endpoint buffers
+ for (int i = 4; i < (NUMBER_OF_PHYSICAL_ENDPOINTS * 2); i++) {
+ if ((i == EPISO_OUT) || (i == EPISO_IN)) {
+ endpoint_buffer[i] = (uint8_t *)malloc(MAX_PACKET_SIZE_EPISO);
+ } else {
+ endpoint_buffer[i] = (uint8_t *)malloc(MAX_PACKET_SIZE_EPBULK);
+ }
+ }
+}
+
+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; do not free the control endpoint buffers
+ for (int i = 4; i < (NUMBER_OF_PHYSICAL_ENDPOINTS * 2); i++) {
+ free(endpoint_buffer[i]);
+ endpoint_buffer[i] = 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)) {
+ buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)][0];
+ } else {
+ buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)][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;
+ }
+
+ ep_buf = endpoint_buffer[idx];
+
+ 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;
+
+ ep_buf = endpoint_buffer[idx];
+
+ 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
+
+ // reset bus for USBDevice layer
+ busReset();
+
+ 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/targets/TARGET_Maxim/USBEndpoints_Maxim.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Maxim/USBHAL_Maxim.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,489 @@
+/*******************************************************************************
+ * 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;
+#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, &_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/targets/TARGET_NUVOTON/TARGET_M451/USBEndpoints_M453.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,79 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2015-2016 Nuvoton
+ *
+ * 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.
+ */
+#define NU_MAX_EPX_BUFSIZE 4096
+#define NU_EP2EPL(ep) ((ep) >> 1)
+#define NU_EP2EPH(ep) (((ep) >> 1) + 1)
+#define NU_EPL2EPH(ep) ((ep) + 1)
+#define NU_EPH2EPL(ep) ((ep) - 1)
+#define NU_EP_DIR_Pos 0
+#define NU_EP_DIR_Msk (1 << NU_EP_DIR_Pos)
+#define NU_EP_DIR_OUT 0
+#define NU_EP_DIR_IN 1
+
+#define NU_EP_TYPE(ep) (((ep) & NU_EP_TYPE_Msk) >> NU_EP_TYPE_Pos)
+#define NU_EP_NUM(ep) (((ep) & NU_EP_NUM_Msk) >> NU_EP_NUM_Pos)
+#define NU_EP_DIR(ep) (((ep) & NU_EP_DIR_Msk) >> NU_EP_DIR_Pos)
+#define NU_EP_NUM_DIR(ep) ((NU_EP_NUM(ep) << 1) | NU_EP_DIR(ep))
+
+#define NUMBER_OF_PHYSICAL_ENDPOINTS 8
+#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)
+
+/* 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 0x60
+#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 EP5OUT
+#define EPBULK_IN EP6IN
+#define EPBULK_OUT_callback EP5_OUT_callback
+#define EPBULK_IN_callback EP6_IN_callback
+/* Interrupt endpoints */
+#define EPINT_OUT EP1OUT
+#define EPINT_IN EP2IN
+#define EPINT_OUT_callback EP1_OUT_callback
+#define EPINT_IN_callback EP2_IN_callback
+/* Isochronous endpoints */
+#define EPISO_OUT EP3OUT
+#define EPISO_IN EP4IN
+#define EPISO_OUT_callback EP3_OUT_callback
+#define EPISO_IN_callback EP4_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/targets/TARGET_NUVOTON/TARGET_M451/USBHAL_M453.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,465 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2015-2016 Nuvoton
+ *
+ * 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_NUMAKER_PFM_M453)
+
+#include "USBHAL.h"
+#include "M451Series.h"
+#include "pinmap.h"
+
+/**
+ * EP: mbed USBD defined endpoint, e.g. EP0OUT/IN, EP1OUT/IN, EP2OUT/IN.
+ * EPX: BSP defined endpoint, e.g. CEP, EPA, EPB, EPC.
+ */
+
+USBHAL * USBHAL::instance;
+
+/* Global variables for Control Pipe */
+extern uint8_t g_usbd_SetupPacket[]; /*!< Setup packet buffer */
+
+static volatile uint32_t s_ep_compl = 0;
+static volatile uint32_t s_ep_buf_ind = 8;
+static volatile uint8_t s_usb_addr = 0;
+static volatile uint8_t s_ep_data_bit[NUMBER_OF_PHYSICAL_ENDPOINTS] = {1};
+static volatile uint8_t s_ep_mxp[NUMBER_OF_PHYSICAL_ENDPOINTS] = {0};
+
+extern volatile uint8_t *g_usbd_CtrlInPointer;
+extern volatile uint32_t g_usbd_CtrlInSize;
+extern volatile uint8_t *g_usbd_CtrlOutPointer;
+extern volatile uint32_t g_usbd_CtrlOutSize;
+extern volatile uint32_t g_usbd_CtrlOutSizeLimit;
+extern volatile uint32_t g_usbd_UsbConfig;
+extern volatile uint32_t g_usbd_CtrlMaxPktSize;
+extern volatile uint32_t g_usbd_UsbAltInterface;
+volatile uint32_t g_usbd_CepTransferLen = 0;
+volatile uint32_t frame_cnt = 0;
+USBHAL::USBHAL(void)
+{
+ SYS_UnlockReg();
+
+ s_ep_buf_ind = 8;
+
+ memset(epCallback, 0x00, sizeof (epCallback));
+ epCallback[0] = &USBHAL::EP1_OUT_callback;
+ epCallback[1] = &USBHAL::EP2_IN_callback;
+ epCallback[2] = &USBHAL::EP3_OUT_callback;
+ epCallback[3] = &USBHAL::EP4_IN_callback;
+ epCallback[4] = &USBHAL::EP5_OUT_callback;
+ epCallback[5] = &USBHAL::EP6_IN_callback;
+
+ instance = this;
+ /* Enable USBD module clock */
+ CLK_EnableModuleClock(USBD_MODULE);
+
+ CLK_SetModuleClock(USBD_MODULE, 0, CLK_CLKDIV0_USB(3));
+
+ /* Enable USB LDO33 */
+ SYS->USBPHY = SYS_USBPHY_LDO33EN_Msk;
+
+ /* Initial USB engine */
+ USBD->ATTR = 0x7D0;
+
+ /* Set SE0 (disconnect) */
+ USBD_SET_SE0();
+
+ //NVIC_SetVector(OTG_FS_IRQn, (uint32_t) &_usbisr);
+ NVIC_SetVector(USBD_IRQn, (uint32_t) &_usbisr);
+ NVIC_EnableIRQ(USBD_IRQn);
+}
+
+USBHAL::~USBHAL(void)
+{
+ NVIC_DisableIRQ(USBD_IRQn);
+ USBD_SET_SE0();
+ USBD_DISABLE_PHY();
+}
+
+void USBHAL::connect(void)
+{
+ USBD->STBUFSEG = 0;
+ frame_cnt = 0;
+ /* EP0 ==> control IN endpoint, address 0 */
+ USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0);
+ /* Buffer range for EP0 */
+ USBD_SET_EP_BUF_ADDR(EP0, s_ep_buf_ind);
+
+ /* EP1 ==> control OUT endpoint, address 0 */
+ USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0);
+ /* Buffer range for EP1 */
+ USBD_SET_EP_BUF_ADDR(EP1, s_ep_buf_ind);
+
+ s_ep_buf_ind += MAX_PACKET_SIZE_EP0;
+
+ /* Disable software-disconnect function */
+ USBD_CLR_SE0();
+
+ /* Clear USB-related interrupts before enable interrupt */
+ USBD_CLR_INT_FLAG(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP);
+
+ /* Enable USB-related interrupts. */
+ USBD_ENABLE_INT(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP);
+}
+
+void USBHAL::disconnect(void)
+{
+ /* Set SE0 (disconnect) */
+ USBD_SET_SE0();
+}
+
+void USBHAL::configureDevice(void)
+{
+ /**
+ * In USBDevice.cpp > USBDevice::requestSetConfiguration, configureDevice() is called after realiseEndpoint() (in USBCallback_setConfiguration()).
+ * So we have the following USB buffer management policy:
+ * 1. Allocate for CEP on connect().
+ * 2. Allocate for EPX in realiseEndpoint().
+ * 3. Deallocate all except for CEP in unconfigureDevice().
+ */
+}
+
+void USBHAL::unconfigureDevice(void)
+{
+ s_ep_buf_ind = 8;
+}
+
+void USBHAL::setAddress(uint8_t address)
+{
+ // NOTE: Delay address setting; otherwise, USB controller won't ack.
+ s_usb_addr = address;
+}
+
+void USBHAL::remoteWakeup(void)
+{
+#if 0
+ USBD->OPER |= USBD_OPER_RESUMEEN_Msk;
+#endif
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
+{
+ uint32_t ep_type = 0;
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ uint32_t ep_logic_index = NU_EP2EPL(endpoint);
+ uint32_t ep_dir = (NU_EP_DIR(endpoint) == NU_EP_DIR_IN) ? USBD_CFG_EPMODE_IN : USBD_CFG_EPMODE_OUT;
+
+ if (ep_logic_index == 3 || ep_logic_index == 4)
+ ep_type = USBD_CFG_TYPE_ISO;
+
+ USBD_CONFIG_EP(ep_hw_index, ep_dir | ep_type | ep_logic_index);
+ /* Buffer range */
+ USBD_SET_EP_BUF_ADDR(ep_hw_index, s_ep_buf_ind);
+
+ if (ep_dir == USBD_CFG_EPMODE_OUT)
+ USBD_SET_PAYLOAD_LEN(ep_hw_index, maxPacket);
+
+ s_ep_mxp[ep_logic_index] = maxPacket;
+
+ s_ep_buf_ind += maxPacket;
+
+ return true;
+}
+
+void USBHAL::EP0setup(uint8_t *buffer)
+{
+ uint32_t sz;
+ endpointReadResult(EP0OUT, buffer, &sz);
+}
+
+void USBHAL::EP0read(void)
+{
+
+
+}
+
+void USBHAL::EP0readStage(void)
+{
+ // N/A
+
+ USBD_PrepareCtrlOut(0,0);
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
+{
+ uint32_t i;
+ uint8_t *buf = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP1));
+ uint32_t ceprxcnt = USBD_GET_PAYLOAD_LEN(EP1);
+ for (i = 0; i < ceprxcnt; i ++)
+ buffer[i] = buf[i];
+ USBD_SET_PAYLOAD_LEN(EP1, MAX_PACKET_SIZE_EP0);
+ return ceprxcnt;
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
+{
+ if (buffer && size)
+ {
+ if (s_ep_data_bit[0] & 1)
+ USBD_SET_DATA1(EP0);
+ else
+ USBD_SET_DATA0(EP0);
+ s_ep_data_bit[0]++;
+
+ USBD_MemCopy((uint8_t *)USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0), buffer, size);
+ USBD_SET_PAYLOAD_LEN(EP0, size);
+ if (size < MAX_PACKET_SIZE_EP0)
+ s_ep_data_bit[0] = 1;
+
+ }
+ else
+ {
+ if (g_usbd_SetupPacket[0] & 0x80) //Device to Host
+ {
+ // Status stage
+ // USBD_PrepareCtrlOut(0,0);
+ } else
+ {
+ USBD_SET_DATA1(EP0);
+ USBD_SET_PAYLOAD_LEN(EP0, 0);
+ }
+ }
+}
+
+void USBHAL::EP0getWriteResult(void)
+{
+ // N/A
+}
+
+void USBHAL::EP0stall(void)
+{
+ 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) //spcheng
+{
+ if (endpoint == EP0OUT)
+ {
+ USBD_MemCopy(g_usbd_SetupPacket, (uint8_t *)USBD_BUF_BASE, 8);
+ if (buffer) {
+ USBD_MemCopy(buffer, g_usbd_SetupPacket, 8);
+ }
+ USBD_SET_PAYLOAD_LEN(EP1, MAX_PACKET_SIZE_EP0);
+ }
+ else
+ {
+ uint32_t i;
+ uint8_t *buf = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(NU_EP2EPH(endpoint)));
+ uint32_t eprxcnt = USBD_GET_PAYLOAD_LEN(NU_EP2EPH(endpoint));
+ for (i = 0; i < eprxcnt; i ++)
+ buffer[i] = buf[i];
+
+ *bytesRead = eprxcnt;
+
+ USBD_SET_PAYLOAD_LEN(NU_EP2EPH(endpoint),s_ep_mxp[NU_EPH2EPL(NU_EP2EPL(endpoint))]);
+ }
+ return EP_COMPLETED;
+}
+
+
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer)
+{
+ return 0;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
+{
+ uint32_t ep_logic_index = NU_EP2EPL(endpoint);
+ if (ep_logic_index == 0)
+ return EP_INVALID;
+ else
+ {
+ uint8_t *buf;
+ uint32_t i=0;
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ s_ep_compl |= (1 << ep_logic_index);
+ buf = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(ep_hw_index));
+ for (i=0;i<size;i++)
+ buf[i] = data[i];
+
+ /* Set transfer length and trigger IN transfer */
+ USBD_SET_PAYLOAD_LEN(ep_hw_index, size);
+
+ }
+ return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
+{
+ if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
+ return EP_COMPLETED;
+ return EP_PENDING;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint)
+{
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
+ return;
+
+ USBD_SetStall(NU_EPH2EPL(ep_hw_index));
+
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint)
+{
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
+ return;
+ USBD_ClearStall(NU_EPH2EPL(ep_hw_index));
+}
+
+bool USBHAL::getEndpointStallState(uint8_t endpoint)
+{
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
+ return false;
+
+ return USBD_GetStall(NU_EPH2EPL(ep_hw_index)) ? 1 : 0;
+}
+
+void USBHAL::_usbisr(void)
+{
+ MBED_ASSERT(instance);
+ instance->usbisr();
+}
+
+void USBHAL::usbisr(void)
+{
+ uint32_t u32IntSts = USBD_GET_INT_FLAG();
+ uint32_t u32State = USBD_GET_BUS_STATE();
+
+//------------------------------------------------------------------
+ if (u32IntSts & USBD_INTSTS_VBDETIF_Msk)
+ {
+ // Floating detect
+ USBD_CLR_INT_FLAG(USBD_INTSTS_VBDETIF_Msk);
+
+ if (USBD_IS_ATTACHED())
+ {
+ /* USB Plug In */
+ USBD_ENABLE_USB();
+ }
+ else
+ {
+ /* USB Un-plug */
+ USBD_DISABLE_USB();
+ }
+ }
+
+//------------------------------------------------------------------
+ if (u32IntSts & USBD_INTSTS_BUSIF_Msk)
+ {
+ /* Clear event flag */
+ USBD_CLR_INT_FLAG(USBD_INTSTS_BUSIF_Msk);
+
+ if (u32State & USBD_ATTR_USBRST_Msk)
+ {
+ /* Bus reset */
+ USBD_ENABLE_USB();
+ USBD_SwReset();
+ }
+ if (u32State & USBD_ATTR_SUSPEND_Msk)
+ {
+ /* Enable USB but disable PHY */
+ USBD_DISABLE_PHY();
+ }
+ if (u32State & USBD_ATTR_RESUME_Msk)
+ {
+ /* Enable USB and enable PHY */
+ USBD_ENABLE_USB();
+ }
+ }
+
+ if (u32IntSts & USBD_INTSTS_USBIF_Msk)
+ {
+ // USB event
+ if (u32IntSts & USBD_INTSTS_SETUP_Msk)
+ {
+ // Setup packet
+ /* Clear event flag */
+ USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP_Msk);
+
+ /* Clear the data IN/OUT ready flag of control end-points */
+ USBD_STOP_TRANSACTION(EP0);
+ USBD_STOP_TRANSACTION(EP1);
+ EP0setupCallback();
+ }
+
+ // EP events
+ if (u32IntSts & USBD_INTSTS_EP0)
+ {
+ /* Clear event flag */
+ USBD_CLR_INT_FLAG(USBD_INTSTS_EP0);
+ // control IN
+ EP0in();
+
+ // In ACK for Set address
+ if ((g_usbd_SetupPacket[0] == REQ_STANDARD) && (g_usbd_SetupPacket[1] == USBD_SET_ADDRESS))
+ {
+ if ((USBD_GET_ADDR() != s_usb_addr) && (USBD_GET_ADDR() == 0))
+ {
+ USBD_SET_ADDR(s_usb_addr);
+ }
+ }
+ }
+ if (u32IntSts & USBD_INTSTS_EP1)
+ {
+ /* Clear event flag */
+ USBD_CLR_INT_FLAG(USBD_INTSTS_EP1);
+
+ // control OUT
+ EP0out();
+ }
+
+ uint32_t gintsts_epx = (u32IntSts >> 18) & 0x3F;
+ uint32_t ep_hw_index = 2;
+ while (gintsts_epx) {
+ if (gintsts_epx & 0x01)
+ {
+ uint32_t ep_status = (USBD_GET_EP_FLAG() >> (ep_hw_index * 3 + 8)) & 0x7;
+ /* Clear event flag */
+ USBD_CLR_INT_FLAG(1 << (ep_hw_index + 16));
+
+ if (ep_status == 0x02 || ep_status == 0x06 || (ep_status == 0x07 && NU_EPH2EPL(ep_hw_index) == 3)) //RX
+ {
+ if (ep_status == 0x07)
+ SOF(frame_cnt++);
+ if ((instance->*(epCallback[ep_hw_index-2]))())
+ {
+
+ }
+ USBD_SET_PAYLOAD_LEN(ep_hw_index,s_ep_mxp[NU_EPH2EPL(ep_hw_index)]);
+ }
+ else if (ep_status == 0x00 || ep_status == 0x07) //TX
+ {
+ s_ep_compl &= ~(1 << (NU_EPH2EPL(ep_hw_index)));
+ if ((instance->*(epCallback[ep_hw_index-2]))())
+ {
+ }
+ }
+ }
+
+ gintsts_epx = gintsts_epx >> 1;
+ ep_hw_index++;
+ }
+ }
+}
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_NUVOTON/TARGET_NUC472/USBEndpoints_NUC472.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,89 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2015-2016 Nuvoton
+ *
+ * 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.
+ */
+#define NU_MAX_EPX_BUFSIZE 4096
+#define NU_EP2EPL(ep) ((ep) >> 1)
+#define NU_EP2EPH(ep) (((ep) >> 1) - 1)
+#define NU_EPX2EP(ep) ((ep == CEP) ? EP0OUT : ((ep) - EPA + EP1OUT))
+#define NU_EPL2EPH(ep) ((ep) - 1)
+#define NU_EPH2EPL(ep) ((ep) + 1)
+#define NU_EP_DIR_Pos 0
+#define NU_EP_DIR_Msk (1 << NU_EP_DIR_Pos)
+#define NU_EP_DIR_OUT 0
+#define NU_EP_DIR_IN 1
+
+#define NU_EP_TYPE(ep) (((ep) & NU_EP_TYPE_Msk) >> NU_EP_TYPE_Pos)
+#define NU_EP_NUM(ep) (((ep) & NU_EP_NUM_Msk) >> NU_EP_NUM_Pos)
+#define NU_EP_DIR(ep) (((ep) & NU_EP_DIR_Msk) >> NU_EP_DIR_Pos)
+#define NU_EP_NUM_DIR(ep) ((NU_EP_NUM(ep) << 1) | NU_EP_DIR(ep))
+
+#define NUMBER_OF_PHYSICAL_ENDPOINTS 12
+
+#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)
+
+/* 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 0x60
+#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
+
+/* Generic endpoints - intended to be portable accross devices */
+/* and be suitable for simple USB devices. */
+
+/* Bulk endpoints */
+#define EPBULK_OUT EP5OUT
+#define EPBULK_IN EP6IN
+#define EPBULK_OUT_callback EP5_OUT_callback
+#define EPBULK_IN_callback EP6_IN_callback
+/* Interrupt endpoints */
+#define EPINT_OUT EP1OUT
+#define EPINT_IN EP2IN
+#define EPINT_OUT_callback EP1_OUT_callback
+#define EPINT_IN_callback EP2_IN_callback
+/* Isochronous endpoints */
+#define EPISO_OUT EP3OUT
+#define EPISO_IN EP4IN
+#define EPISO_OUT_callback EP3_OUT_callback
+#define EPISO_IN_callback EP4_IN_callback
+
+#define MAX_PACKET_SIZE_EPBULK 64
+#define MAX_PACKET_SIZE_EPINT 64
+#define MAX_PACKET_SIZE_EPISO 1023
+
+#define USBD_GET_EP_MAX_PAYLOAD(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAMPS + (uint32_t)((ep)*0x28))))
+#define USBD_GET_EP_DATA_COUNT(ep) ((*((__IO uint32_t *) ((uint32_t)&USBD->EPADATCNT + (uint32_t)((ep)*0x28)))) & 0xFFFFF)
+#define USBD_SET_EP_SHORT_PACKET(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EPARSPCTL + (uint32_t)((ep)*0x28))) = (*((__IO uint32_t *) ((uint32_t)&USBD->EPARSPCTL + (uint32_t)((ep)*0x28)))) & 0x10 | 0x40)
+#define USBD_GET_EP_INT_EN(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAINTEN + (uint32_t)((ep)*0x28))))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_NUVOTON/TARGET_NUC472/USBHAL_NUC472.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,730 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2015-2016 Nuvoton
+ *
+ * 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_NUMAKER_PFM_NUC472)
+
+#include "USBHAL.h"
+#include "NUC472_442.h"
+#include "pinmap.h"
+
+/**
+ * EP: mbed USBD defined endpoint, e.g. EP0OUT/IN, EP1OUT/IN, EP2OUT/IN.
+ * EPX: BSP defined endpoint, e.g. CEP, EPA, EPB, EPC.
+ */
+
+USBHAL * USBHAL::instance;
+
+static volatile uint32_t s_ep_compl = 0;
+static volatile uint32_t s_ep_buf_ind = 0;
+static volatile uint8_t s_usb_addr = 0;
+static volatile S_USBD_CMD_T s_setup;
+static volatile uint16_t s_ctrlin_packetsize;
+static uint8_t *g_usbd_CtrlInPointer = 0;
+static uint32_t g_usbd_CtrlMaxPktSize = 64;
+static uint32_t g_usbd_ShortPkt = 0;
+static uint32_t gEpRead = 0;
+static uint32_t gEpReadCnt = 0;
+
+void USBD_CtrlInput(void)
+{
+ int volatile i;
+ uint32_t volatile count;
+
+ // Process remained data
+ if (g_usbd_CtrlInSize >= g_usbd_CtrlMaxPktSize)
+ {
+ // Data size > MXPLD
+ for (i=0; i<(g_usbd_CtrlMaxPktSize >> 2); i++, g_usbd_CtrlInPointer+=4)
+ USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
+ USBD_START_CEP_IN(g_usbd_CtrlMaxPktSize);
+ g_usbd_CtrlInSize -= g_usbd_CtrlMaxPktSize;
+ }
+ else
+ {
+ // Data size <= MXPLD
+ for (i=0; i<(g_usbd_CtrlInSize >> 2); i++, g_usbd_CtrlInPointer+=4)
+ USBD->CEPDAT = *(uint32_t *)g_usbd_CtrlInPointer;
+
+ count = g_usbd_CtrlInSize % 4;
+ for (i=0; i<count; i++)
+ USBD->CEPDAT_BYTE = *(uint8_t *)(g_usbd_CtrlInPointer + i);
+
+ USBD_START_CEP_IN(g_usbd_CtrlInSize);
+ g_usbd_CtrlInPointer = 0;
+ g_usbd_CtrlInSize = 0;
+ }
+}
+
+USBHAL::USBHAL(void)
+{
+ SYS_UnlockReg();
+
+ s_ep_buf_ind = 0;
+
+ memset(epCallback, 0x00, sizeof (epCallback));
+ epCallback[0] = &USBHAL::EP1_OUT_callback;
+ epCallback[1] = &USBHAL::EP2_IN_callback;
+ epCallback[2] = &USBHAL::EP3_OUT_callback;
+ epCallback[3] = &USBHAL::EP4_IN_callback;
+ epCallback[4] = &USBHAL::EP5_OUT_callback;
+ epCallback[5] = &USBHAL::EP6_IN_callback;
+ epCallback[6] = &USBHAL::EP7_OUT_callback;
+ epCallback[7] = &USBHAL::EP8_IN_callback;
+ epCallback[8] = &USBHAL::EP9_OUT_callback;
+ epCallback[9] = &USBHAL::EP10_IN_callback;
+ epCallback[10] = &USBHAL::EP11_OUT_callback;
+ epCallback[11] = &USBHAL::EP12_IN_callback;
+
+ instance = this;
+
+ /* Enable USBD module clock */
+ CLK_EnableModuleClock(USBD_MODULE);
+
+ /* Enable USB PHY's LDO33. Run as USB device. */
+ SYS->USBPHY = SYS_USBPHY_USBROLE_OTG_V33_EN | SYS_USBPHY_USBROLE_STD_USBD;
+
+ /* Enable USB PHY and wait for it ready */
+ USBD_ENABLE_PHY();
+ while (1)
+ {
+ USBD->EPAMPS = 0x20;
+ if (USBD->EPAMPS == 0x20)
+ break;
+ }
+
+ /* Force to full-speed */
+ USBD->OPER = 0;//USBD_OPER_HISPDEN_Msk;
+
+ /* Set SE0 (disconnect) */
+ USBD_SET_SE0();
+
+ NVIC_SetVector(USBD_IRQn, (uint32_t) &_usbisr);
+ NVIC_EnableIRQ(USBD_IRQn);
+}
+
+USBHAL::~USBHAL(void)
+{
+ NVIC_DisableIRQ(USBD_IRQn);
+ USBD_SET_SE0();
+ USBD_DISABLE_PHY();
+}
+
+void USBHAL::connect(void)
+{
+ USBD_ResetDMA();
+ USBD_SET_ADDR(0);
+
+ /**
+ * Control Transfer Packet Size Constraints
+ * low-speed: 8
+ * full-speed: 8, 16, 32, 64
+ * high-speed: 64
+ */
+ /* Control endpoint */
+ USBD_SetEpBufAddr(CEP, s_ep_buf_ind, MAX_PACKET_SIZE_EP0);
+ s_ep_buf_ind = MAX_PACKET_SIZE_EP0;
+
+ /* Enable USB/CEP interrupt */
+ USBD_ENABLE_USB_INT(USBD_GINTEN_USBIE_Msk | USBD_GINTEN_CEPIE_Msk);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk);
+
+ /* Enable BUS interrupt */
+ USBD_ENABLE_BUS_INT(
+ USBD_BUSINTEN_DMADONEIEN_Msk |
+ USBD_BUSINTEN_RESUMEIEN_Msk |
+ USBD_BUSINTEN_RSTIEN_Msk |
+ USBD_BUSINTEN_VBUSDETIEN_Msk |
+ USBD_BUSINTEN_SOFIEN_Msk
+ );
+
+ /* Clear SE0 (connect) */
+ USBD_CLR_SE0();
+}
+
+void USBHAL::disconnect(void)
+{
+ /* Set SE0 (disconnect) */
+ USBD_SET_SE0();
+}
+
+void USBHAL::configureDevice(void)
+{
+ /**
+ * In USBDevice.cpp > USBDevice::requestSetConfiguration, configureDevice() is called after realiseEndpoint() (in USBCallback_setConfiguration()).
+ * So we have the following USB buffer management policy:
+ * 1. Allocate for CEP on connect().
+ * 2. Allocate for EPX in realiseEndpoint().
+ * 3. Deallocate all except for CEP in unconfigureDevice().
+ */
+}
+
+void USBHAL::unconfigureDevice(void)
+{
+ s_ep_buf_ind = MAX_PACKET_SIZE_EP0;
+}
+
+void USBHAL::setAddress(uint8_t address)
+{
+ // NOTE: Delay address setting; otherwise, USB controller won't ack.
+ s_usb_addr = address;
+}
+
+void USBHAL::remoteWakeup(void)
+{
+ USBD->OPER |= USBD_OPER_RESUMEEN_Msk;
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
+{
+ uint32_t ep_type;
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+
+ USBD_SetEpBufAddr(ep_hw_index, s_ep_buf_ind, maxPacket);
+ s_ep_buf_ind += maxPacket;
+ USBD_SET_MAX_PAYLOAD(ep_hw_index, maxPacket);
+
+ switch (NU_EP2EPL(endpoint))
+ {
+ case 1: case 2:
+ ep_type = USB_EP_CFG_TYPE_INT;
+ break;
+
+ case 3: case 4:
+ ep_type = USB_EP_CFG_TYPE_ISO;
+ break;
+
+ default:
+ ep_type = USB_EP_CFG_TYPE_BULK;
+ }
+ uint32_t ep_dir = (NU_EP_DIR(endpoint) == NU_EP_DIR_IN) ? USB_EP_CFG_DIR_IN : USB_EP_CFG_DIR_OUT;
+ USBD_ConfigEp(ep_hw_index, NU_EP2EPL(endpoint), ep_type, ep_dir);
+
+ /* Enable USB/EPX interrupt */
+ // NOTE: Require USBD_GINTEN_EPAIE_Pos, USBD_GINTEN_EPBIE_Pos, ... USBD_GINTEN_EPLIE_Pos to be consecutive.
+ USBD_ENABLE_USB_INT(USBD->GINTEN | USBD_GINTEN_USBIE_Msk |
+ USBD_GINTEN_CEPIE_Msk |
+ 1 << (ep_hw_index + USBD_GINTEN_EPAIE_Pos)); // Added USB/EPX interrupt
+
+ if (ep_dir == 0)
+ USBD_ENABLE_EP_INT(ep_hw_index, USBD_EPINTEN_RXPKIEN_Msk);
+ else
+ USBD_ENABLE_EP_INT(ep_hw_index, USBD_EPINTEN_TXPKIEN_Msk);
+ return true;
+}
+
+void USBHAL::EP0setup(uint8_t *buffer)
+{
+ uint32_t sz;
+ endpointReadResult(EP0OUT, buffer, &sz);
+}
+
+void USBHAL::EP0read(void)
+{
+ if (s_setup.wLength && ! (s_setup.bmRequestType & 0x80))
+ {
+ // Control OUT
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk | USBD_CEPINTEN_RXPKIEN_Msk);
+ }
+ else
+ {
+ // Status stage
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
+ USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
+ }
+}
+
+void USBHAL::EP0readStage(void)
+{
+ // N/A
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
+{
+ uint32_t i;
+ uint32_t ceprxcnt = USBD->CEPRXCNT;
+ for (i = 0; i < ceprxcnt; i ++)
+ *buffer ++ = USBD->CEPDAT_BYTE;
+ return ceprxcnt;
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
+{
+ if (buffer && size)
+ {
+ g_usbd_CtrlInPointer = buffer;
+ g_usbd_CtrlInSize = size;
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_INTKIEN_Msk);
+ }
+ else
+ {
+ /* Status stage */
+ s_ctrlin_packetsize = 0;
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
+ USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
+ }
+}
+
+void USBHAL::EP0getWriteResult(void)
+{
+ // N/A
+}
+
+void USBHAL::EP0stall(void)
+{
+ 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) //spcheng
+{
+ if (endpoint == EP0OUT)
+ {
+ if (buffer) {
+ *((uint16_t *) (buffer + 0)) = (uint16_t) USBD->SETUP1_0;
+ *((uint16_t *) (buffer + 2)) = (uint16_t) USBD->SETUP3_2;
+ *((uint16_t *) (buffer + 4)) = (uint16_t) USBD->SETUP5_4;
+ *((uint16_t *) (buffer + 6)) = (uint16_t) USBD->SETUP7_6;
+ }
+
+ s_setup.bmRequestType = (uint8_t) (USBD->SETUP1_0 & 0xff);
+ s_setup.bRequest = (int8_t) (USBD->SETUP1_0 >> 8) & 0xff;
+ s_setup.wValue = (uint16_t) USBD->SETUP3_2;
+ s_setup.wIndex = (uint16_t) USBD->SETUP5_4;
+ s_setup.wLength = (uint16_t) USBD->SETUP7_6;
+ }
+ else
+ {
+ if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
+ {
+ while (1)
+ {
+ if (!(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
+ break;
+ else
+ if (!USBD_IS_ATTACHED())
+ break;
+ }
+ gEpReadCnt = USBD_GET_EP_DATA_COUNT(NU_EP2EPH(endpoint));
+ if (gEpReadCnt == 0)
+ {
+ *bytesRead = 0;
+ return EP_COMPLETED;
+ }
+ s_ep_compl |= (1 << NU_EP2EPL(endpoint));
+ USBD_SET_DMA_LEN(gEpReadCnt);
+ USBD_SET_DMA_ADDR((uint32_t)buffer);
+ USBD_SET_DMA_WRITE(NU_EP2EPL(endpoint));
+ USBD_ENABLE_DMA();
+ return EP_PENDING;;
+
+ }
+ else
+ {
+ if ((USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
+ return EP_PENDING;;
+
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_DMADONEIF_Msk);
+ s_ep_compl &= ~(1 << NU_EP2EPL(endpoint));
+ *bytesRead = gEpReadCnt;
+ }
+ }
+ return EP_COMPLETED;
+}
+
+
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer)
+{
+ return 0;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
+{
+ uint32_t ep_logic_index = NU_EP2EPL(endpoint);
+ if (ep_logic_index == 0)
+ return EP_INVALID;
+ else
+ {
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ uint32_t mps = USBD_GET_EP_MAX_PAYLOAD(ep_hw_index);
+ if (size > mps) {
+ return EP_INVALID;
+ }
+ if (size < mps)
+ g_usbd_ShortPkt = 1;
+ if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
+ {
+ s_ep_compl |= (1 << ep_logic_index);
+
+ while (1)
+ {
+ if (!(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
+ break;
+ else
+ if (!USBD_IS_ATTACHED())
+ break;
+ }
+ USBD_SET_DMA_LEN(size);
+ USBD_SET_DMA_ADDR((uint32_t)data);
+ USBD_SET_DMA_READ(ep_logic_index);
+ USBD_ENABLE_DMA();
+ }
+ }
+ return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
+{
+ if (!(s_ep_compl & (1 << NU_EP2EPL(endpoint))))
+ return EP_COMPLETED;
+ else
+ {
+ if ((USBD_GET_EP_DATA_COUNT(NU_EP2EPH(endpoint))) == 0 && !(USBD->DMACTL & USBD_DMACTL_DMAEN_Msk))
+ {
+ s_ep_compl &= ~(s_ep_compl & (1 << NU_EP2EPL(endpoint)));
+ return EP_COMPLETED;
+ }
+ }
+ return EP_PENDING;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint)
+{
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
+ return;
+ USBD_SetStall(ep_hw_index);
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint)
+{
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
+ return;
+ USBD_ClearStall(ep_hw_index);
+}
+
+bool USBHAL::getEndpointStallState(uint8_t endpoint)
+{
+ uint32_t ep_hw_index = NU_EP2EPH(endpoint);
+ if (ep_hw_index >= NUMBER_OF_PHYSICAL_ENDPOINTS)
+ return false;
+ return USBD_GetStall(ep_hw_index) ? 1 : 0;
+}
+
+void USBHAL::_usbisr(void)
+{
+ MBED_ASSERT(instance);
+ instance->usbisr();
+}
+
+void USBHAL::usbisr(void)
+{
+ uint32_t gintsts = USBD->GINTSTS & USBD->GINTEN;
+ if (! gintsts)
+ return;
+
+ if (gintsts & USBD_GINTSTS_USBIF_Msk)
+ {
+ uint32_t busintsts = USBD->BUSINTSTS & USBD->BUSINTEN;
+
+ /* SOF */
+ if (busintsts & USBD_BUSINTSTS_SOFIF_Msk)
+ {
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SOFIF_Msk);
+ // TODO
+ SOF(USBD->FRAMECNT >> 3);
+ }
+
+ /* Reset */
+ if (busintsts & USBD_BUSINTSTS_RSTIF_Msk)
+ {
+ connect();
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RSTIF_Msk);
+ USBD_CLR_CEP_INT_FLAG(0x1ffc);
+ }
+
+ /* Resume */
+ if (busintsts & USBD_BUSINTSTS_RESUMEIF_Msk)
+ {
+ USBD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk|USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_SOFIEN_Msk | USBD_BUSINTEN_SOFIEN_Msk);
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RESUMEIF_Msk);
+ }
+
+ /* Suspend */
+ if (busintsts & USBD_BUSINTSTS_SUSPENDIF_Msk)
+ {
+ USBD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk |USBD_BUSINTEN_SOFIEN_Msk);
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SUSPENDIF_Msk);
+ }
+
+ /* High-speed */
+ if (busintsts & USBD_BUSINTSTS_HISPDIF_Msk)
+ {
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk);
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_HISPDIF_Msk);
+ }
+
+ /* DMA */
+ if (busintsts & USBD_BUSINTSTS_DMADONEIF_Msk)
+ {
+ if (USBD->DMACTL & 0x10) /* IN - Read */
+ {
+ if (g_usbd_ShortPkt)
+ {
+ uint32_t ep_hw_index = NU_EPL2EPH((USBD->DMACTL & 0xF));
+ USBD_SET_EP_SHORT_PACKET(ep_hw_index);
+ g_usbd_ShortPkt = 0;
+ }
+ }
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_DMADONEIF_Msk);
+ }
+
+ /* PHY clock available */
+ if (busintsts & USBD_BUSINTSTS_PHYCLKVLDIF_Msk)
+ {
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_PHYCLKVLDIF_Msk);
+ }
+
+ /* VBUS plug-in */
+ if (busintsts & USBD_BUSINTSTS_VBUSDETIF_Msk)
+ {
+ if (USBD_IS_ATTACHED())
+ {
+ // USB plug-in
+ USBD_ENABLE_USB();
+ }
+ else
+ {
+ // USB unplug-out
+ USBD_DISABLE_USB();
+ }
+ USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_VBUSDETIF_Msk);
+ }
+ }
+
+ /* CEP interrupts */
+ if (gintsts & USBD_GINTSTS_CEPIF_Msk)
+ {
+ uint32_t cepintsts = USBD->CEPINTSTS & USBD->CEPINTEN;
+
+ /* SETUP token packet */
+ if (cepintsts & USBD_CEPINTSTS_SETUPTKIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPTKIF_Msk);
+ return;
+ }
+
+ /* SETUP transaction */
+ if (cepintsts & USBD_CEPINTSTS_SETUPPKIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPPKIF_Msk);
+ EP0setupCallback();
+ return;
+ }
+
+ /* OUT token packet */
+ if (cepintsts & USBD_CEPINTSTS_OUTTKIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_OUTTKIF_Msk);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk);
+ return;
+ }
+
+ /* IN token packet */
+ if (cepintsts & USBD_CEPINTSTS_INTKIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk);
+ if (!(cepintsts & USBD_CEPINTSTS_STSDONEIF_Msk))
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk);
+ USBD_CtrlInput();
+ }
+ else
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk);
+ }
+ return;
+ }
+
+ /* PING packet */
+ if (cepintsts & USBD_CEPINTSTS_PINGIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_PINGIF_Msk);
+ return;
+ }
+
+ /* IN transaction */
+ if (cepintsts & USBD_CEPINTSTS_TXPKIF_Msk)
+ {
+ EP0in();
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk);
+ return;
+ }
+
+ /* OUT transaction */
+ if (cepintsts & USBD_CEPINTSTS_RXPKIF_Msk)
+ {
+ EP0out();
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_RXPKIF_Msk);
+ return;
+ }
+
+ /* NAK handshake packet */
+ if (cepintsts & USBD_CEPINTSTS_NAKIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_NAKIF_Msk);
+ return;
+ }
+
+ /* STALL handshake packet */
+ if (cepintsts & USBD_CEPINTSTS_STALLIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STALLIF_Msk);
+ return;
+ }
+
+ /* ERR special packet */
+ if (cepintsts & USBD_CEPINTSTS_ERRIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_ERRIF_Msk);
+ return;
+ }
+
+ /* Status stage transaction */
+ if (cepintsts & USBD_CEPINTSTS_STSDONEIF_Msk)
+ {
+ if (s_usb_addr)
+ {
+ USBD_SET_ADDR(s_usb_addr);
+ s_usb_addr = 0;
+ }
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk);
+ USBD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk);
+ return;
+ }
+
+ /* Buffer Full */
+ if (cepintsts & USBD_CEPINTSTS_BUFFULLIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFFULLIF_Msk);
+ return;
+ }
+
+ /* Buffer Empty */
+ if (cepintsts & USBD_CEPINTSTS_BUFEMPTYIF_Msk)
+ {
+ USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFEMPTYIF_Msk);
+ return;
+ }
+ }
+ /* EPA, EPB, EPC, ... EPL interrupts */
+ uint32_t gintsts_epx = gintsts >> 2;
+ uint32_t ep_hw_index = 0;
+ while (gintsts_epx) {
+ if (gintsts_epx & 0x01)
+ {
+ uint32_t epxintsts = USBD_GET_EP_INT_FLAG(ep_hw_index) & USBD_GET_EP_INT_EN(ep_hw_index);
+
+ USBD_CLR_EP_INT_FLAG(ep_hw_index, epxintsts);
+
+ /* Buffer Full */
+ if (epxintsts & USBD_EPINTSTS_BUFFULLIF_Msk)
+ {
+ }
+
+ /* Buffer Empty */
+ if (epxintsts & USBD_EPINTSTS_BUFEMPTYIF_Msk)
+ {
+ }
+
+ /* Short Packet Transferred */
+ if (epxintsts & USBD_EPINTSTS_SHORTTXIF_Msk)
+ {
+ }
+
+ /* Data Packet Transmitted */
+ if (epxintsts & USBD_EPINTSTS_TXPKIF_Msk)
+ {
+ s_ep_compl &= ~(1 << (NU_EPH2EPL(ep_hw_index)));
+ if ((instance->*(epCallback[ep_hw_index]))())
+ {
+ }
+ }
+
+ /* Data Packet Received */
+ if (epxintsts & USBD_EPINTSTS_RXPKIF_Msk)
+ {
+ if ((instance->*(epCallback[ep_hw_index]))())
+ {
+
+ }
+ }
+
+ /* OUT token packet */
+ if (epxintsts & USBD_EPINTSTS_OUTTKIF_Msk)
+ {
+ }
+
+ /* IN token packet */
+ if (epxintsts & USBD_EPINTSTS_INTKIF_Msk)
+ {
+ }
+
+ /* PING packet */
+ if (epxintsts & USBD_EPINTSTS_PINGIF_Msk)
+ {
+ }
+
+ /* NAK handshake packet sent to Host */
+ if (epxintsts & USBD_EPINTSTS_NAKIF_Msk)
+ {
+ }
+
+ /* STALL handshake packet sent to Host */
+ if (epxintsts & USBD_EPINTSTS_STALLIF_Msk)
+ {
+ }
+
+ /* NYET handshake packet sent to Host */
+ if (epxintsts & USBD_EPINTSTS_NYETIF_Msk)
+ {
+ }
+
+ /* ERR packet sent to Host */
+ if (epxintsts & USBD_EPINTSTS_ERRIF_Msk)
+ {
+ }
+
+ /* Bulk Out Short Packet Received */
+ if (epxintsts & USBD_EPINTSTS_SHORTRXIF_Msk)
+ {
+ }
+ }
+ gintsts_epx = gintsts_epx >> 1;
+ ep_hw_index++;
+ }
+}
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_NXP/USBEndpoints_LPC11U.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_NXP/USBEndpoints_LPC17_LPC23.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_NXP/USBHAL_LPC11U.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_NXP/USBHAL_LPC17.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_NXP/USBHAL_LPC40.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/inc/devdrv_usb_function_api.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function_version.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_api.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dataio.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dma.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_intrn.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_lib.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_api.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_global.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sig.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sub.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_api.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dataio.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dma.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_intrn.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_lib.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_api.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_global.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sig.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sub.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb_function_setting.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/devdrv_usb_function_api.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function_version.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_api.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dataio.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dma.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_intrn.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_lib.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_api.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_global.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sig.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sub.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_api.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dataio.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dma.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_intrn.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_lib.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_api.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_global.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sig.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sub.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb_function_setting.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/USBEndpoints_RZ_A1H.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_RENESAS/USBHAL_RZ_A1H.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/USBHAL_STM32F103RB.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,147 @@
+/* Copyright (c) 2016 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 USBHAL_STM32F103RB
+#define USBHAL_STM32F103RB
+
+#define USBHAL_IRQn USB_LP_CAN1_RX0_IRQn
+
+
+#define NB_ENDPOINT 8
+/* must be multiple of 4 bytes */
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
+ uint8_t epComplete[8];
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+ gpio_t usb_switch;
+}USBHAL_Private_t;
+
+void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ gpio_write(&(priv->usb_switch),!state);
+}
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ return 1024;
+}
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ (obj->*func)(sofnum);
+}
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void)
+{
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ hpcd.Instance = USB;
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 1;
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+
+
+ /* Configure USB VBUS GPIO */
+ gpio_init_out(&HALPriv->usb_switch,PB_14);
+ gpio_mode(&HALPriv->usb_switch,OpenDrain);
+ /* Configure USB FS GPIOs */
+
+ /* Configure DM DP Pins
+ * - USB-DP (D+ of the USB connector) <======> PA12 (Nucleo board)
+ * Make sure to connect a 1.5KOhm pull up to USB-DP PA12 pin
+ * (permanent pull-up)
+ - USB-DM (D- of the USB connector) <======> PA11 (Nucleo board)
+ */
+
+ pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_MODE_AF_INPUT));
+ pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_MODE_AF_INPUT));
+
+ __HAL_RCC_USB_CLK_ENABLE();
+
+ hpcd.State = HAL_PCD_STATE_RESET;
+
+ HAL_PCD_Init(&hpcd);
+ /* hardcoded size of FIFO according definition*/
+ HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x01 , PCD_SNG_BUF, 0x90);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x81 , PCD_SNG_BUF, 0xb0);
+#if 0
+ HAL_PCDEx_PMAConfig(&hpcd , 0x2, PCD_DBL_BUF, 0x018000b0);
+#else
+ HAL_PCDEx_PMAConfig(&hpcd , 0x2, PCD_SNG_BUF, 0x100);
+#endif
+ HAL_PCDEx_PMAConfig(&hpcd , 0x82, PCD_SNG_BUF, 0x120);
+
+ NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
+ NVIC_SetPriority( USBHAL_IRQn, 1);
+
+ HAL_PCD_Start(&hpcd);
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,19 @@
+/* Copyright (c) 2016 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 "USBHAL_STM32F103RB.h"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F2/TARGET_NUCLEO_F207ZG/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,19 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/TARGET_NUCLEO_F303ZE/USBHAL_STM32F303ZE.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,127 @@
+/* Copyright (c) 2016 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 USBHAL_STM32F303ZE_H
+#define USBHAL_STM32F303ZE_H
+#define USBHAL_IRQn USB_LP_CAN_RX0_IRQn
+/* must be multiple of 4 bytes */
+#define NB_ENDPOINT 8
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[6])(void);
+ uint8_t epComplete[2*NB_ENDPOINT];
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+ gpio_t usb_switch;
+}USBHAL_Private_t;
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ return 1024;
+}
+
+void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state){
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ gpio_write(&(priv->usb_switch),state);
+}
+
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) {
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ (obj->*func)(sofnum);
+}
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void) {
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ hpcd.Instance = USB;
+ /* initialized Init to zero (constructor does not zero initialized the
+ * area */
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 1;
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /* Configure USB DM pin. This is optional, and maintained only for user guidance. */
+ pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF14_USB));
+ pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF14_USB));
+ __HAL_RCC_GPIOG_CLK_ENABLE();
+ gpio_init_out(&HALPriv->usb_switch,PG_6);
+ /* Enable USB Clock */
+ __HAL_RCC_USB_CLK_ENABLE();
+ /* Enable SYSCFG Clock */
+ __HAL_RCC_SYSCFG_CLK_ENABLE();
+ hpcd.State = HAL_PCD_STATE_RESET;
+ HAL_PCD_Init(&hpcd);
+ /* hardcoded size of FIFO according definition*/
+ HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
+#if 1
+ HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_DBL_BUF, 0x018000b0);
+#else
+ HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_SNG_BUF, 0x180);
+#endif
+ HAL_PCDEx_PMAConfig(&hpcd , 0x83, PCD_SNG_BUF, 0xb0);
+ NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
+ NVIC_SetPriority(USBHAL_IRQn, 1);
+ HAL_PCD_Start(&hpcd);
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/TARGET_NUCLEO_F303ZE/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM32F303ZE.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TARGET_NUCLEO_F401RE/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F407xG/TARGET_DISCO_F407VG/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_NUCLEO_F411RE/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,19 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/TARGET_NUCLEO_F412ZG/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_NUCLEO_F429ZI/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_NUCLEO_F439ZI/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446RE/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446ZE/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/TARGET_NUCLEO_F746ZG/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,19 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F756xG/TARGET_NUCLEO_F756ZG/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,19 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F767xI/TARGET_NUCLEO_F767ZI/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/TARGET_DISCO_F769NI/USBHAL_STM32F769NI.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,147 @@
+/* Copyright (c) 2016 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 USBHAL_STM32F769NI_H
+#define USBHAL_STM32F769NI_H
+#define USBHAL_IRQn OTG_HS_IRQn
+/* must be multiple of 4 bytes */
+#define NB_ENDPOINT 4
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+ uint8_t epComplete[2*NB_ENDPOINT];
+}USBHAL_Private_t;
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ uint32_t len;
+ if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
+ else
+ len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
+ return len*4;
+}
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
+ uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ /* fix me call with same frame number */
+ (obj->*func)(sofnum);
+}
+
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void) {
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ hpcd.Instance = USB_OTG_HS;
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_ULPI;
+ hpcd.Init.Sof_enable = 0;
+
+ hpcd.Init.speed = PCD_SPEED_HIGH;
+ //hpcd.Init.vbus_sensing_enable = 0;
+ //hpcd.Init.lpm_enable = 0;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+ /* Enable power and clocking */
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ __HAL_RCC_GPIOI_CLK_ENABLE();
+
+ pin_function(PA_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // CLK
+ pin_function(PA_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D0
+
+ pin_function(PB_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D1
+ pin_function(PB_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D2
+ pin_function(PB_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D3
+ pin_function(PB_10, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D4
+ pin_function(PB_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D5
+ pin_function(PB_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D6
+ pin_function(PB_13, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // D7
+
+ pin_function(PC_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // STP
+ pin_function(PH_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // NXT
+ pin_function(PI_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_HS)); // DIR
+
+ __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE();
+ __HAL_RCC_USB_OTG_HS_CLK_ENABLE();
+
+ __HAL_RCC_SYSCFG_CLK_ENABLE();
+ hpcd.State = HAL_PCD_STATE_RESET;
+ HAL_PCD_Init(&hpcd);
+ /* 1.25kbytes */
+ /* min value 16 (= 16 x 4 bytes) */
+ /* max value 256 (= 1K bytes ) */
+ /* maximum sum is 0x140 */
+ HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
+ /* bulk/int 64 bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
+ /* bulk/int bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
+ HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
+ /* ISOchronous */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
+ NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr);
+ NVIC_SetPriority(USBHAL_IRQn, 1);
+ HAL_PCD_Start(&hpcd);
+}
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/TARGET_DISCO_F769NI/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,19 @@
+/* Copyright (c) 2016 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 "USBHAL_STM32F769NI.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/USBHAL_STM32L053C8.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,134 @@
+/* Copyright (c) 2016 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 USBHAL_STM32L053C8_H
+#define USBHAL_STM32L053C8_H
+
+#define USBHAL_IRQn USB_IRQn
+
+/* must be multiple of 4 bytes */
+#define NB_ENDPOINT 8
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[6])(void);
+ uint8_t epComplete[2*NB_ENDPOINT];
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+ gpio_t usb_switch;
+}USBHAL_Private_t;
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ return 1024;
+}
+
+void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ gpio_write(&(priv->usb_switch),state);
+}
+
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ (obj->*func)(sofnum);
+}
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void)
+{
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ hpcd.Instance = USB;
+ /* initialized Init to zero (constructor does not zero initialized the
+ * area */
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 1;
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+
+ /* Configure USB DM pin. This is optional, and maintained only for user guidance. */
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
+ pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
+
+ /* Enable USB Clock */
+ __HAL_RCC_USB_CLK_ENABLE();
+
+ /* Enable SYSCFG Clock */
+ __HAL_RCC_SYSCFG_CLK_ENABLE();
+ hpcd.State = HAL_PCD_STATE_RESET;
+ HAL_PCD_Init(&hpcd);
+
+ /* hardcoded size of FIFO according definition*/
+ HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
+#if 1
+ HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_DBL_BUF, 0x018000b0);
+#else
+ HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_SNG_BUF, 0x180);
+#endif
+ HAL_PCDEx_PMAConfig(&hpcd , 0x83, PCD_SNG_BUF, 0xb0);
+ NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
+ NVIC_SetPriority(USBHAL_IRQn, 1);
+ HAL_PCD_Start(&hpcd);
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM32L053C8.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L072CZ_LRWAN1/USBHAL_STM32L072CZ.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,131 @@
+/* Copyright (c) 2016 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 USBHAL_STM32L072CZ_H
+#define USBHAL_STM32L072CZ_H
+
+#define USBHAL_IRQn USB_IRQn
+
+/* must be multiple of 4 bytes */
+#define NB_ENDPOINT 8
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[6])(void);
+ uint8_t epComplete[2*NB_ENDPOINT];
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+ gpio_t usb_switch;
+}USBHAL_Private_t;
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ return 1024;
+}
+
+void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ gpio_write(&(priv->usb_switch),state);
+}
+
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ uint32_t sofnum = (hpcd->Instance->FNR) & USB_FNR_FN;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ (obj->*func)(sofnum);
+}
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void)
+{
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ hpcd.Instance = USB;
+ /* initialized Init to zero (constructor does not zero initialized the
+ * area */
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 1;
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+
+ /* Configure USB DM pin. This is optional, and maintained only for user guidance. */
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
+ pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_USB));
+
+ /* Enable USB Clock */
+ __HAL_RCC_USB_CLK_ENABLE();
+
+ /* Enable SYSCFG Clock */
+ __HAL_RCC_SYSCFG_CLK_ENABLE();
+ hpcd.State = HAL_PCD_STATE_RESET;
+ HAL_PCD_Init(&hpcd);
+
+ /* hardcoded size of FIFO according definition*/
+ HAL_PCDEx_PMAConfig(&hpcd , 0x00 , PCD_SNG_BUF, 0x30);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x80 , PCD_SNG_BUF, 0x70);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x3, PCD_DBL_BUF, 0x018000b0);
+ HAL_PCDEx_PMAConfig(&hpcd , 0x83, PCD_SNG_BUF, 0xb0);
+
+ NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
+ NVIC_SetPriority(USBHAL_IRQn, 1);
+ HAL_PCD_Start(&hpcd);
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L072CZ_LRWAN1/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM32L072CZ.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_DISCO_L475VG_IOT01A/USBHAL_STM32L475VG.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,145 @@
+/* Copyright (c) 2016 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 USBHAL_STM32L475VG
+#define USBHAL_STM32L475VG
+
+#define USBHAL_IRQn OTG_FS_IRQn
+
+
+#define NB_ENDPOINT 4
+/* must be multiple of 4 bytes */
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
+ uint8_t epComplete[8];
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+}USBHAL_Private_t;
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ uint32_t len;
+ if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
+ else
+ len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
+ return len*4;
+}
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) {
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
+ uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ /* fix me call with same frame number */
+ (obj->*func)(sofnum);
+}
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void) {
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ hpcd.Instance = USB_OTG_FS;
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 1;
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+
+ __HAL_RCC_PWR_CLK_ENABLE();
+
+ HAL_PWREx_EnableVddUSB();
+ /* Configure USB VBUS GPIO */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+
+ /* Configure USB FS GPIOs */
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+
+ /* Configure DM DP Pins */
+ 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));
+
+ /* Configure VBUS Pin */
+ pin_function(PC_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
+
+ __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
+
+ hpcd.State = HAL_PCD_STATE_RESET;
+
+ HAL_PCD_Init(&hpcd);
+ /* 1.25kbytes */
+ /* min value 16 (= 16 x 4 bytes) */
+ /* max value 256 (= 1K bytes ) */
+ /* maximum sum is 0x140 */
+ HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
+ /* bulk/int 64 bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
+ /* bulk/int bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
+ HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
+ /* ISOchronous */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
+
+ NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
+ NVIC_SetPriority( USBHAL_IRQn, 1);
+
+ HAL_PCD_Start(&hpcd);
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_DISCO_L475VG_IOT01A/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM32L475VG.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHAL_STM32L476VG.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,145 @@
+/* Copyright (c) 2016 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 USBHAL_STM32L476VG
+#define USBHAL_STM32L476VG
+
+#define USBHAL_IRQn OTG_FS_IRQn
+
+
+#define NB_ENDPOINT 4
+/* must be multiple of 4 bytes */
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
+ uint8_t epComplete[8];
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+}USBHAL_Private_t;
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ uint32_t len;
+ if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
+ else
+ len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
+ return len*4;
+}
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) {
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
+ uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ /* fix me call with same frame number */
+ (obj->*func)(sofnum);
+}
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void) {
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ hpcd.Instance = USB_OTG_FS;
+ /* initialized all field of init including 0 field */
+ /* constructor does not fill with zero */
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 1;
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+
+ __HAL_RCC_PWR_CLK_ENABLE();
+
+ HAL_PWREx_EnableVddUSB();
+ /* Configure USB VBUS GPIO */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+
+ /* Configure USB FS GPIOs */
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+
+ /* Configure DM DP Pins */
+ 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));
+
+ /* Configure VBUS Pin */
+ pin_function(PC_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
+
+ __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
+
+ hpcd.State = HAL_PCD_STATE_RESET;
+
+ HAL_PCD_Init(&hpcd);
+ /* 1.25kbytes */
+ /* min value 16 (= 16 x 4 bytes) */
+ /* max value 256 (= 1K bytes ) */
+ /* maximum sum is 0x140 */
+ HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
+ /* bulk/int 64 bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
+ /* bulk/int bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
+ HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
+ /* ISOchronous */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
+
+ NVIC_SetVector(USBHAL_IRQn,(uint32_t)&_usbisr);
+ NVIC_SetPriority( USBHAL_IRQn, 1);
+
+ HAL_PCD_Start(&hpcd);
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHAL_STM_TARGET.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,18 @@
+/* Copyright (c) 2016 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 "USBHAL_STM32L476VG.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/USBEndpoints_STM32.h Thu Jul 27 12:14:04 2017 +0100
@@ -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_SETUP (48)
+#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 (200) /* Int/Bulk/iso (44100 stereo 16 bits) */
+
+#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/targets/TARGET_STM/USBEndpoints_STM32F4.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_STM/USBHAL_STM32.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,332 @@
+/* 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.
+*/
+/* TARGET NOT STM does not support this HAL */
+#ifndef TARGET_STM
+#define USBSTM_HAL_UNSUPPORTED
+#endif
+/* F4 famlily wihtout USB_STM_HAL use another HAL*/
+#if defined(TARGET_STM) && defined(TARGET_STM32F4) && !defined(USB_STM_HAL)
+#define USBSTM_HAL_UNSUPPORTED
+#endif
+
+#ifndef USBSTM_HAL_UNSUPPORTED
+#include "USBHAL.h"
+#include "pinmap.h"
+/* mbed endpoint definition to hal definition */
+#define EP_ADDR(ep) (((ep) >> 1)|((ep) & 1) << 7)
+/* from hal definition to mbed definition */
+#define ADDR_EPIN(ep) (((ep) << 1) | 1)
+#define ADDR_EPOUT(ep) (((ep) << 1))
+/* id to detect if rx buffer is used or not */
+
+#include "USBHAL_STM_TARGET.h"
+
+
+/* this call at device reception completion on a Out Enpoint */
+void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ uint8_t endpoint = ADDR_EPOUT(epnum);
+ priv->epComplete[endpoint] = 1;
+ /* -2 endpoint 0 In out are not in call back list */
+ if (epnum) {
+ bool (USBHAL::*func)(void) = priv->epCallback[endpoint-2];
+ (obj->*func)();
+ } else {
+ void (USBHAL::*func)(void) = priv->ep0_out;
+ (obj->*func)();
+ }
+}
+
+/* this is call at device transmission completion on In endpoint */
+void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ uint8_t endpoint = ADDR_EPIN(epnum);
+ priv->epComplete[endpoint] = 1;
+ /* -2 endpoint 0 In out are not in call back list */
+ if (epnum) {
+ bool (USBHAL::*func)(void) = priv->epCallback[endpoint-2];
+ (obj->*func)();
+ } else {
+ void (USBHAL::*func)(void) = priv->ep0_in;
+ (obj->*func)();
+ }
+}
+/* This is call at device set up reception */
+void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ void (USBHAL::*func)(void)=priv->ep0_setup;
+ void (USBHAL::*func1)(void)=priv->ep0_read;
+ (obj->*func)();
+ (obj->*func1)();
+}
+
+void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
+ (obj->*func)(1);
+}
+
+void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ void (USBHAL::*func)(unsigned int suspended) = priv->suspend_change;
+ (obj->*func)(0);
+}
+
+void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
+ (obj->*func)(1);
+}
+
+void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ void (USBHAL::*func)(unsigned int suspended) = priv->connect_change;
+ (obj->*func)(0);
+}
+
+void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ unsigned int i;
+ for(i=0;i<hpcd->Init.dev_endpoints;i++) {
+ priv->epComplete[2*i]=0;
+ HAL_PCD_EP_Close(hpcd,EP_ADDR(2*i));
+ HAL_PCD_EP_Flush(hpcd,EP_ADDR(2*i));
+ priv->epComplete[2*i+1]=0;
+ HAL_PCD_EP_Close(hpcd,EP_ADDR(2*i+1));
+ HAL_PCD_EP_Flush(hpcd,EP_ADDR(2*i+1));
+
+ }
+ void (USBHAL::*func)(void)=priv->bus_reset;
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) = priv->ep_realise;
+ (obj->*func)();
+ (obj->*ep_realise)(EP0IN, MAX_PACKET_SIZE_EP0,0);
+ (obj->*ep_realise)(EP0OUT, MAX_PACKET_SIZE_EP0,0);
+}
+
+
+/* hal pcd handler , used for STM32 HAL PCD Layer */
+
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
+ return 0;
+}
+
+USBHAL::~USBHAL(void) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
+ HAL_PCD_DeInit(&hpcd);
+ delete HALPriv;
+}
+
+void USBHAL::connect(void) {
+ NVIC_EnableIRQ(USBHAL_IRQn);
+}
+
+void USBHAL::disconnect(void) {
+ NVIC_DisableIRQ(USBHAL_IRQn);
+}
+
+void USBHAL::configureDevice(void) {
+ // Not needed
+}
+
+void USBHAL::unconfigureDevice(void) {
+ // Not needed
+}
+
+void USBHAL::setAddress(uint8_t address) {
+ HAL_PCD_SetAddress(&hpcd, address);
+ EP0write(0, 0);
+}
+
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
+ uint32_t epIndex = EP_ADDR(endpoint);
+ uint32_t type;
+ uint32_t len;
+ HAL_StatusTypeDef ret;
+ switch (endpoint) {
+ case EP0IN:
+ case EP0OUT:
+ type = 0;
+ break;
+ case EPISO_IN:
+ case EPISO_OUT:
+ type = 1;
+ break;
+ case EPBULK_IN:
+ case EPBULK_OUT:
+ type = 2;
+ break;
+ case EPINT_IN:
+ case EPINT_OUT:
+ type = 3;
+ break;
+ }
+ if (maxPacket > MAXTRANSFER_SIZE) return false;
+ if (epIndex & 0x80) {
+ len = HAL_PCDEx_GetTxFiFo(&hpcd,epIndex & 0x7f);
+ MBED_ASSERT(len >= maxPacket);
+ }
+ ret = HAL_PCD_EP_Open(&hpcd, epIndex, maxPacket, type);
+ MBED_ASSERT(ret!=HAL_BUSY);
+ return (ret == HAL_OK) ? true:false;
+}
+
+// read setup packet
+void USBHAL::EP0setup(uint8_t *buffer) {
+ memcpy(buffer, hpcd.Setup, MAX_PACKET_SIZE_SETUP);
+ memset(hpcd.Setup,0,MAX_PACKET_SIZE_SETUP);
+}
+
+void USBHAL::EP0readStage(void) {
+}
+
+void USBHAL::EP0read(void) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
+ uint32_t epIndex = EP_ADDR(EP0OUT);
+ uint8_t *pBuf = (uint8_t *)HALPriv->pBufRx0;
+ HAL_StatusTypeDef ret;
+ HALPriv->epComplete[EP0OUT] = 2;
+ ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, MAX_PACKET_SIZE_EP0 );
+ MBED_ASSERT(ret!=HAL_BUSY);
+
+}
+
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)hpcd.pData;
+ uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, 0);
+ HALPriv->epComplete[EP0OUT] = 0;
+ if (length) {
+ uint8_t *buff = (uint8_t *)HALPriv->pBufRx0;
+ memcpy(buffer, buff, length);
+ }
+ return length;
+}
+
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
+ /* check that endpoint maximum size is not exceeding TX fifo */
+ MBED_ASSERT(hpcd.IN_ep[0].maxpacket >= size);
+ endpointWrite(EP0IN, buffer, size);
+}
+
+void USBHAL::EP0getWriteResult(void) {
+
+}
+
+void USBHAL::EP0stall(void) {
+ stallEndpoint(EP0IN);
+}
+
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
+ uint32_t epIndex = EP_ADDR(endpoint);
+ uint8_t* pBuf = (uint8_t *)HALPriv->pBufRx;
+ HAL_StatusTypeDef ret;
+ // clean reception end flag before requesting reception
+ HALPriv->epComplete[endpoint] = 2;
+ ret = HAL_PCD_EP_Receive(&hpcd, epIndex, pBuf, maximumSize);
+ MBED_ASSERT(ret!=HAL_BUSY);
+ return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
+ if (HALPriv->epComplete[endpoint]==0) {
+ /* no reception possible !!! */
+ bytesRead = 0;
+ return EP_COMPLETED;
+ }else if ((HALPriv->epComplete[endpoint]!=1))
+ return EP_PENDING;
+ uint32_t epIndex = EP_ADDR(endpoint);
+ uint8_t *buff = (uint8_t *)HALPriv->pBufRx;
+ uint32_t length = (uint32_t) HAL_PCD_EP_GetRxCount(&hpcd, epIndex);
+ memcpy(buffer, buff, length);
+ *bytesRead = length;
+ HALPriv->epComplete[endpoint]= 0;
+ return EP_COMPLETED;
+}
+
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
+ uint32_t epIndex = EP_ADDR(endpoint);
+ HAL_StatusTypeDef ret;
+ // clean transmission end flag before requesting transmission
+ HALPriv->epComplete[endpoint] = 2;
+ ret = HAL_PCD_EP_Transmit(&hpcd, epIndex, data, size);
+ MBED_ASSERT(ret!=HAL_BUSY);
+ // update the status
+ if (ret != HAL_OK) return EP_INVALID;
+ // fix me return is too simple
+ return EP_PENDING;
+}
+
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
+ if (HALPriv->epComplete[endpoint] == 1)
+ return EP_COMPLETED;
+ return EP_PENDING;
+}
+
+void USBHAL::stallEndpoint(uint8_t endpoint) {
+ USBHAL_Private_t *HALPriv = (USBHAL_Private_t *)(hpcd.pData);
+ HAL_StatusTypeDef ret;
+ HALPriv->epComplete[endpoint] = 0;
+ ret = HAL_PCD_EP_SetStall(&hpcd, EP_ADDR(endpoint));
+ MBED_ASSERT(ret!=HAL_BUSY);
+}
+
+void USBHAL::unstallEndpoint(uint8_t endpoint) {
+ HAL_StatusTypeDef ret;
+ ret = HAL_PCD_EP_ClrStall(&hpcd, EP_ADDR(endpoint));
+ MBED_ASSERT(ret!=HAL_BUSY);
+
+}
+
+bool USBHAL::getEndpointStallState(uint8_t endpoint) {
+ return false;
+}
+
+void USBHAL::remoteWakeup(void) {
+}
+
+
+void USBHAL::_usbisr(void) {
+ instance->usbisr();
+}
+
+
+void USBHAL::usbisr(void) {
+
+ HAL_PCD_IRQHandler(&instance->hpcd);
+}
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/USBHAL_STM32F4.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -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) && !defined(USB_STM_HAL)
+
+#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_STM32F412ZG) || 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/targets/TARGET_STM/USBHAL_STM_144_64pins.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,132 @@
+/* Copyright (c) 2016 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 USBHAL_STM32_144_64
+#define USBHAL_STM32_144_64
+
+#define USBHAL_IRQn OTG_FS_IRQn
+/* must be multiple of 4 bytes */
+#define NB_ENDPOINT 4
+#define MAXTRANSFER_SIZE 0x200
+#define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
+#if (FIFO_USB_RAM_SIZE > 0x500)
+#error "FIFO dimensioning incorrect"
+#endif
+
+typedef struct
+{
+ USBHAL *inst;
+ void (USBHAL::*bus_reset)(void);
+ void (USBHAL::*sof)(int frame);
+ void (USBHAL::*connect_change)(unsigned int connected);
+ void (USBHAL::*suspend_change)(unsigned int suspended);
+ void (USBHAL::*ep0_setup)(void);
+ void (USBHAL::*ep0_in)(void);
+ void (USBHAL::*ep0_out)(void);
+ void (USBHAL::*ep0_read)(void);
+ bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
+ bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
+ /* memorize dummy buffer used for reception */
+ uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
+ uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
+ uint8_t epComplete[2*NB_ENDPOINT];
+}USBHAL_Private_t;
+
+uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
+{
+ uint32_t len;
+ if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
+ else
+ len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
+ return len*4;
+}
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
+ USBHAL *obj= priv->inst;
+ USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
+ uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
+ void (USBHAL::*func)(int frame) = priv->sof;
+ (obj->*func)(sofnum);
+}
+
+
+USBHAL * USBHAL::instance;
+
+USBHAL::USBHAL(void) {
+ /* init parameter */
+ USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
+ hpcd.Instance = USB_OTG_FS;
+ memset(&hpcd.Init, 0, sizeof(hpcd.Init));
+ hpcd.Init.dev_endpoints = NB_ENDPOINT;
+ hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 1;
+
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ //hpcd.Init.vbus_sensing_enable = 0;
+ //hpcd.Init.lpm_enable = 0;
+ /* pass instance for usage inside call back */
+ HALPriv->inst = this;
+ HALPriv->bus_reset = &USBHAL::busReset;
+ HALPriv->suspend_change = &USBHAL::suspendStateChanged;
+ HALPriv->connect_change = &USBHAL::connectStateChanged;
+ HALPriv->sof = &USBHAL::SOF;
+ HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
+ HALPriv->ep_realise = &USBHAL::realiseEndpoint;
+ HALPriv->ep0_in = &USBHAL::EP0in;
+ HALPriv->ep0_out = &USBHAL::EP0out;
+ HALPriv->ep0_read = &USBHAL::EP0read;
+ hpcd.pData = (void*)HALPriv;
+ HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
+ HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
+ HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
+ HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
+ HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
+ HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
+ instance = this;
+ // Enable power and clocking
+ /* board 144 pin all similar */
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ pin_function(PA_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); /* OTG_FS_SOF */
+ pin_function(PA_9, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF10_OTG_FS)); /* OTG_FS_VBUS */
+ pin_function(PA_10, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)); /* OTG_FS_ID */
+ pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); /* OTG_FS_DM */
+ pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); /* OTG_FS_DP */
+
+ __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
+ __HAL_RCC_SYSCFG_CLK_ENABLE();
+ hpcd.State = HAL_PCD_STATE_RESET;
+ HAL_PCD_Init(&hpcd);
+ /* 1.25kbytes */
+ /* min value 16 (= 16 x 4 bytes) */
+ /* max value 256 (= 1K bytes ) */
+ /* maximum sum is 0x140 */
+ HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
+ /* bulk/int 64 bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
+ /* bulk/int bytes in FS */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
+ HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
+ /* ISOchronous */
+ HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
+ NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr);
+ NVIC_SetPriority(USBHAL_IRQn, 1);
+ HAL_PCD_Start(&hpcd);
+}
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/USBRegs_STM32.h Thu Jul 27 12:14:04 2017 +0100
@@ -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>© 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/targets/TARGET_Silicon_Labs/USBEndpoints_EFM32.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/USBHAL_EFM32.cpp Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/inc/em_usb.h Thu Jul 27 12:14:04 2017 +0100
@@ -0,0 +1,1011 @@
+/***************************************************************************//**
+ * @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"
+/* Workaround for em_common naming change so that we don't need to rework the
+ entire USB HAL */
+#define EFM32_PACK_START(x) SL_PACK_START(x)
+#define EFM32_PACK_END() SL_PACK_END()
+#define EFM32_MIN(a, b) SL_MIN(a, b)
+#define EFM32_MAX(a, b) SL_MAX(a, b)
+#define EFM32_ATTRIBUTE_PACKED SL_ATTRIBUTE_PACKED
+#define EFM32_ATTRIBUTE_ALIGN(X) SL_ATTRIBUTE_ALIGN(X)
+#define EFM32_ALIGN(X) SL_ALIGN(X)
+#define EFM32_WEAK SL_WEAK
+#define EFM32_ATTRIBUTE_SECTION(X) SL_ATTRIBUTE_SECTION(X)
+
+#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/targets/TARGET_Silicon_Labs/inc/em_usbd.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/inc/em_usbh.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/inc/em_usbhal.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/inc/em_usbtypes.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/inc/usbconfig.h Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/src/em_usbd.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/src/em_usbdep.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/src/em_usbdint.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/src/em_usbhal.c Thu Jul 27 12:14:04 2017 +0100
@@ -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/targets/TARGET_Silicon_Labs/src/em_usbtimer.c Thu Jul 27 12:14:04 2017 +0100
@@ -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 ) */