Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of USBDevice by
Revision 76:f0fd8d911b24, committed 2017-04-28
- Comitter:
- screamer
- Date:
- Fri Apr 28 17:01:10 2017 +0000
- Branch:
- device-files
- Parent:
- 75:75970000c5b7
- Commit message:
- Changed the layout of USBDevice implementation for various targets to match mbed-os/targets. This also reduces the amount of files being compiled as USBDevice code for other targets is not compiled.
Changed in this revision
--- a/USBDevice/TARGET_RENESAS/TARGET_RZ_A1H/inc/devdrv_usb_function_api.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h" -
--- a/USBDevice/TARGET_STM/TARGET_STM32F2/TARGET_NUCLEO_F207ZG/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +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. -*/ -#define USBHALHOST_64pins -#include "USBHALHost_STM_144_64pins.h" -
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TARGET_NUCLEO_F401RE/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +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. -*/ - -/* 144 pins boards */ -#if defined(TARGET_NUCLEO_F429ZI) || defined(TARGET_NUCLEO_F446ZE) || defined(TARGET_NUCLEO_F207ZG) \ -|| defined(TARGET_NUCLEO_F767ZI) || defined(TARGET_NUCLEO_F746ZG) || defined(TARGET_NUCLEO_F412ZG) -#include "USBHALHost_STM_144_64pins.h" -#endif - -/* 64 pins boards */ -#if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_L476RG) || defined(TARGET_NUCLEO_F411RE) -#define USBHALHOST_64pins -#include "USBHALHost_STM_144_64pins.h" -#endif - -/* DISCO board */ - -#ifdef TARGET_DISCO_F429ZI -#include "USBHALHost_DISCOF429ZI.h" -#endif - -#ifdef TARGET_DISCO_L476VG -#include "USBHALHost_DISCOL476VG.h" -#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_NUCLEO_F411RE/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h" -
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/TARGET_NUCLEO_F412ZG/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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_DISCO_F429ZI/USBHALHost_DISCOF429ZI.h Fri Apr 28 16:21:32 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/* mbed USBHost Library - * Copyright (c) 2006-2013 ARM Limited - * - * 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 USBHALHOST_DISCOF429ZI -#define USBHALHOST_DISCOF429ZI - -#define USBHAL_IRQn OTG_HS_IRQn - -#define HCCA_SIZE sizeof(HCD_HandleTypeDef) -#define ED_SIZE sizeof(HCED) -#define TD_SIZE sizeof(HCTD) - -#define TOTAL_SIZE (HCCA_SIZE + (MAX_ENDPOINT*ED_SIZE) + (MAX_TD*TD_SIZE)) -/* STM device FS have 11 channels (definition is for 60 channels) */ -static volatile uint8_t usb_buf[TOTAL_SIZE]; -typedef struct -{ - /* store the request ongoing on each endpoit */ - /* 1st field of structure avoid giving knowledge of all structure to - * endpoint */ - volatile uint32_t addr[MAX_ENDPOINT]; - USBHALHost *inst; - void (USBHALHost::*deviceConnected)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent); - void (USBHALHost::*deviceDisconnected)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); - void (USBHALHost::*transferCompleted)(volatile uint32_t addr); -}USBHALHost_Private_t; -/* CONFIGURATION for USB_VBUS - * on 64 bits board PC_0 is used (0 VBUS on, 1 VBUS off) - * on 144 pins board PG_6 is used ( 1 VBUS on, 0 VBUS on) - */ -static gpio_t gpio_vbus; - -#define VBUS_OFF 1 -#define VBUS_ON 0 -#define USB_VBUS_CONFIG \ - do {__HAL_RCC_GPIOC_CLK_ENABLE();\ - gpio_init_out_ex(&gpio_vbus, PC_4, VBUS_OFF);\ - }while(0); - - -void usb_vbus( uint8_t state) -{ - if(state == 0) - { - gpio_write(&gpio_vbus, VBUS_OFF); - } - else - { - gpio_write(&gpio_vbus, VBUS_ON); - } - wait(0.2); -} - - -USBHALHost::USBHALHost() { - gpio_t pin_vbus; - instHost = this; - HCD_HandleTypeDef *hhcd; - USBHALHost_Private_t *HALPriv = new(USBHALHost_Private_t); - memset(HALPriv, 0, sizeof(USBHALHost_Private_t)); - memInit(); - memset((void*)usb_hcca, 0, HCCA_SIZE); - hhcd = (HCD_HandleTypeDef *)usb_hcca; - hhcd->Instance = USB_OTG_HS; - hhcd->pData = (void*)HALPriv; - hhcd->Init.Host_channels = 11; - /* for now failed with dma */ - hhcd->Init.dma_enable = 0; - hhcd->Init.speed = HCD_SPEED_HIGH; - hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; - hhcd->Init.use_external_vbus = 1; - HALPriv->inst = this; - HALPriv->deviceConnected = &USBHALHost::deviceConnected; - HALPriv->deviceDisconnected = &USBHALHost::deviceDisconnected; - HALPriv->transferCompleted = &USBHALHost::transferCompleted; - for (int i = 0; i < MAX_ENDPOINT; i++) { - edBufAlloc[i] = false; - HALPriv->addr[i]=(uint32_t)-1; - } - for (int i = 0; i < MAX_TD; i++) { - tdBufAlloc[i] = false; - } - /* Configure USB HS GPIOs */ - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /*USB DM and DP */ - pin_function(PB_14, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_OTG_HS_FS)); - pin_function(PB_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_OTG_HS_FS)); - /* Configure VBUS Pin */ - gpio_init_in(&pin_vbus, PB_13); - /* Configure POWER_SWITCH IO pin */ - USB_VBUS_CONFIG; - /* Enable USB HS Clocks */ - __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); - - /* Set USBFS Interrupt priority */ - HAL_NVIC_SetPriority(USBHAL_IRQn, 5, 0); - NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr); -} -#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_DISCO_F429ZI/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_DISCOF429ZI.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_NUCLEO_F429ZI/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_NUCLEO_F429ZI/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_NUCLEO_F439ZI/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446RE/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h" -
--- a/USBDevice/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446ZE/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/TARGET_NUCLEO_F746ZG/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F756xG/TARGET_NUCLEO_F756ZG/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_STM_144_64pins.h" -
--- a/USBDevice/TARGET_STM/TARGET_STM32F7/TARGET_STM32F767xI/TARGET_NUCLEO_F767ZI/USBHAL_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHALHost_DISCOL476VG.h Fri Apr 28 16:21:32 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +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 USBHALHOST_DISCOL476VG -#define USBHALHOST_DISCOL476VG - -#define USBHAL_IRQn OTG_FS_IRQn - -#define HCCA_SIZE sizeof(HCD_HandleTypeDef) -#define ED_SIZE sizeof(HCED) -#define TD_SIZE sizeof(HCTD) - -#define TOTAL_SIZE (HCCA_SIZE + (MAX_ENDPOINT*ED_SIZE) + (MAX_TD*TD_SIZE)) -/* STM device FS have 11 channels (definition is for 60 channels) */ -static volatile uint8_t usb_buf[TOTAL_SIZE]; -typedef struct -{ - /* store the request ongoing on each endpoit */ - /* 1st field of structure avoid giving knowledge of all structure to - * endpoint */ - volatile uint32_t addr[MAX_ENDPOINT]; - USBHALHost *inst; - void (USBHALHost::*deviceConnected)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent); - void (USBHALHost::*deviceDisconnected)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); - void (USBHALHost::*transferCompleted)(volatile uint32_t addr); -}USBHALHost_Private_t; - -static gpio_t gpio_vbus; - -#define VBUS_OFF 1 -#define VBUS_ON 0 -#define USB_VBUS_CONFIG \ - do {\ - gpio_init_out_ex(&gpio_vbus, PC_9, VBUS_OFF);\ - }while(0); - - -void usb_vbus( uint8_t state) -{ - if(state == 0) - { - gpio_write(&gpio_vbus, VBUS_OFF); - } - else - { - gpio_write(&gpio_vbus, VBUS_ON); - } - wait(0.2); -} - - -USBHALHost::USBHALHost() { - instHost = this; - HCD_HandleTypeDef *hhcd; - USBHALHost_Private_t *HALPriv = new(USBHALHost_Private_t); - memset(HALPriv, 0, sizeof(USBHALHost_Private_t)); - memInit(); - memset((void*)usb_hcca, 0, HCCA_SIZE); - hhcd = (HCD_HandleTypeDef *)usb_hcca; - hhcd->Instance = USB_OTG_FS; - hhcd->pData = (void*)HALPriv; - hhcd->Init.Host_channels = 11; - /* for now failed with dma */ - hhcd->Init.dma_enable = 0; - hhcd->Init.speed = HCD_SPEED_FULL; - hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; - hhcd->Init.use_external_vbus = 1; - HALPriv->inst = this; - HALPriv->deviceConnected = &USBHALHost::deviceConnected; - HALPriv->deviceDisconnected = &USBHALHost::deviceDisconnected; - HALPriv->transferCompleted = &USBHALHost::transferCompleted; - for (int i = 0; i < MAX_ENDPOINT; i++) { - edBufAlloc[i] = false; - HALPriv->addr[i]=(uint32_t)-1; - } - for (int i = 0; i < MAX_TD; i++) { - tdBufAlloc[i] = false; - } - __HAL_RCC_PWR_CLK_ENABLE(); -#ifdef TARGET_STM32L4 - HAL_PWREx_EnableVddUSB(); -#endif - - /* Configure USB HS GPIOs */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*USB DM and DP */ - 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 */ - __HAL_RCC_GPIOC_CLK_ENABLE(); - pin_function(PC_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); - /* Configure POWER_SWITCH IO pin */ - USB_VBUS_CONFIG; - __HAL_RCC_SYSCFG_CLK_ENABLE(); - - /* Enable USB FS Clocks */ - __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - /* Set USBFS Interrupt priority */ - HAL_NVIC_SetPriority(USBHAL_IRQn, 5, 0); - NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr); -} -#endif
--- a/USBDevice/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 "USBHALHost_DISCOL476VG.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHAL_STM32L476VG.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_NUCLEO_L476RG/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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. -*/ -#define USBHALHOST_64pins -#include "USBHALHost_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/TARGET_STM32L4/TARGET_STM32L486xG/TARGET_NUCLEO_L486RG/USBHALHost_STM_TARGET.h Fri Apr 28 16:21:32 2017 +0000 +++ /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. -*/ -#define USBHALHOST_64pins -#include "USBHALHost_STM_144_64pins.h"
--- a/USBDevice/TARGET_STM/USBHALHost_STM_144_64pins.h Fri Apr 28 16:21:32 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/* mbed USBHost Library - * Copyright (c) 2006-2013 ARM Limited - * - * 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 USBHALHOST_STM32_144_64 -#define USBHALHOST_STM32_144_64 - -#define USBHAL_IRQn OTG_FS_IRQn - -#define HCCA_SIZE sizeof(HCD_HandleTypeDef) -#define ED_SIZE sizeof(HCED) -#define TD_SIZE sizeof(HCTD) - -#define TOTAL_SIZE (HCCA_SIZE + (MAX_ENDPOINT*ED_SIZE) + (MAX_TD*TD_SIZE)) -/* STM device FS have 11 channels (definition is for 60 channels) */ -static volatile uint8_t usb_buf[TOTAL_SIZE]; -typedef struct -{ - /* store the request ongoing on each endpoit */ - /* 1st field of structure avoid giving knowledge of all structure to - * endpoint */ - volatile uint32_t addr[MAX_ENDPOINT]; - USBHALHost *inst; - void (USBHALHost::*deviceConnected)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent); - void (USBHALHost::*deviceDisconnected)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); - void (USBHALHost::*transferCompleted)(volatile uint32_t addr); -}USBHALHost_Private_t; - -/* CONFIGURATION for USB_VBUS - * on 64 bits board PC_0 is used (0 VBUS on, 1 VBUS off) - * on 144 pins board PG_6 is used ( 1 VBUS on, 0 VBUS on) - */ -static gpio_t gpio_vbus; - -#if defined(USBHALHOST_64pins) -#define VBUS_OFF 1 -#define VBUS_ON 0 -#define USB_VBUS_CONFIG \ - do {__HAL_RCC_GPIOC_CLK_ENABLE();\ - gpio_init_out_ex(&gpio_vbus, PC_0, VBUS_OFF);\ - }while(0); -#else -#define VBUS_OFF 0 -#define VBUS_ON 1 -#define USB_VBUS_CONFIG \ - do {__HAL_RCC_GPIOG_CLK_ENABLE();\ - gpio_init_out_ex(&gpio_vbus, PG_6, VBUS_OFF);\ - }while(0); -#endif - -void usb_vbus( uint8_t state) -{ - if(state == 0) - { - gpio_write(&gpio_vbus, VBUS_OFF); - } - else - { - gpio_write(&gpio_vbus, VBUS_ON); - } - wait(0.2); -} - -USBHALHost::USBHALHost() { - instHost = this; - HCD_HandleTypeDef *hhcd; - USBHALHost_Private_t *HALPriv = new(USBHALHost_Private_t); - memset(HALPriv, 0, sizeof(USBHALHost_Private_t)); - memInit(); - memset((void*)usb_hcca, 0, HCCA_SIZE); - hhcd = (HCD_HandleTypeDef *)usb_hcca; - hhcd->Instance = USB_OTG_FS; - hhcd->pData = (void*)HALPriv; - hhcd->Init.Host_channels = 11; - hhcd->Init.speed = HCD_SPEED_FULL; - hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; - HALPriv->inst = this; - HALPriv->deviceConnected = &USBHALHost::deviceConnected; - HALPriv->deviceDisconnected = &USBHALHost::deviceDisconnected; - HALPriv->transferCompleted = &USBHALHost::transferCompleted; - for (int i = 0; i < MAX_ENDPOINT; i++) { - edBufAlloc[i] = false; - HALPriv->addr[i]=(uint32_t)-1; - } - for (int i = 0; i < MAX_TD; i++) { - tdBufAlloc[i] = false; - } - __HAL_RCC_PWR_CLK_ENABLE(); -#ifdef TARGET_STM32L4 - HAL_PWREx_EnableVddUSB(); -#endif - /* Configure USB FS GPIOs */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*USB DM and DP */ - 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)); - /*USB ID */ - pin_function(PA_10, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)); - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - /* Configure POWER_SWITCH IO pin */ - USB_VBUS_CONFIG; - /* Enable USB FS Clocks */ - __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - - /* Set USBFS Interrupt priority */ - HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0); -} -#endif
--- a/USBDevice/TARGET_STM/USBHAL_STM32.cpp Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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. */ -/* ---------------- */ -#define EP0OUT (0) -#define EP0IN (1) -#define EP1OUT (2) -#define EP1IN (3) -#define EP2OUT (4) -#define EP2IN (5) -#define EP3OUT (6) -#define EP3IN (7) -#define EP4OUT (8) -#define EP4IN (9) -#define EP5OUT (10) -#define EP5IN (11) -#define EP6OUT (12) -#define EP6IN (13) -#define EP7OUT (14) -#define EP7IN (15) -#define EP8OUT (16) -#define EP8IN (17) -#define EP9OUT (18) -#define EP9IN (19) -#define EP10OUT (20) -#define EP10IN (21) -#define EP11OUT (22) -#define EP11IN (23) -#define EP12OUT (24) -#define EP12IN (25) -#define EP13OUT (26) -#define EP13IN (27) -#define EP14OUT (28) -#define EP14IN (29) -#define EP15OUT (30) -#define EP15IN (31) - -/* Maximum Packet sizes */ - -#define MAX_PACKET_SIZE_EP0 (64) -#define MAX_PACKET_SIZE_EP1 (64) -#define MAX_PACKET_SIZE_EP2 (64) -#define MAX_PACKET_SIZE_EP3 (1023) -#define MAX_PACKET_SIZE_EP4 (64) -#define MAX_PACKET_SIZE_EP5 (64) -#define MAX_PACKET_SIZE_EP6 (64) -#define MAX_PACKET_SIZE_EP7 (64) -#define MAX_PACKET_SIZE_EP8 (64) -#define MAX_PACKET_SIZE_EP9 (64) -#define MAX_PACKET_SIZE_EP10 (64) -#define MAX_PACKET_SIZE_EP11 (64) -#define MAX_PACKET_SIZE_EP12 (64) -#define MAX_PACKET_SIZE_EP13 (64) -#define MAX_PACKET_SIZE_EP14 (64) -#define MAX_PACKET_SIZE_EP15 (64) - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoints */ -#define EPBULK_OUT (EP2OUT) -#define EPBULK_IN (EP2IN) -#define EPBULK_OUT_callback EP2_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoints */ -#define EPINT_OUT (EP1OUT) -#define EPINT_IN (EP1IN) -#define EPINT_OUT_callback EP1_OUT_callback -#define EPINT_IN_callback EP1_IN_callback -/* Isochronous endpoints */ -#define EPISO_OUT (EP3OUT) -#define EPISO_IN (EP3IN) -#define EPISO_OUT_callback EP3_OUT_callback -#define EPISO_IN_callback EP3_IN_callback - -#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) -#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) -#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3)
--- a/USBDevice/USBEndpoints_LPC11U.h Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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.h Fri Apr 28 16:21:32 2017 +0000 +++ b/USBDevice/USBHAL.h Fri Apr 28 17:01:10 2017 +0000 @@ -21,7 +21,7 @@ #include "mbed.h" #include "USBEndpoints.h" -#include "mbed_toolchain.h" +#include "toolchain.h" //#ifdef __GNUC__ //#define __packed __attribute__ ((__packed__))
--- a/USBDevice/USBHAL_EFM32.cpp Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,543 +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: -// * 16 bidirectionnal endpt -> 32 physical endpt -// * as there are ODD and EVEN buffer -> 32*2 bdt -MBED_ALIGN(512) BDT bdt[NUMBER_OF_PHYSICAL_ENDPOINTS * 2]; // 512 bytes aligned! - -uint8_t * endpoint_buffer[(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2]; -uint8_t * endpoint_buffer_iso[2*2]; - -static uint8_t set_addr = 0; -static uint8_t addr = 0; - -static uint32_t Data1 = 0x55555555; - -static uint32_t frameNumber() { - return((USB0->FRMNUML | (USB0->FRMNUMH << 8)) & 0x07FF); -} - -uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) { - return 0; -} - -USBHAL::USBHAL(void) { - // Disable IRQ - NVIC_DisableIRQ(USB0_IRQn); - -#if (defined(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; - epCallback[8] = &USBHAL::EP5_OUT_callback; - epCallback[9] = &USBHAL::EP5_IN_callback; - epCallback[10] = &USBHAL::EP6_OUT_callback; - epCallback[11] = &USBHAL::EP6_IN_callback; - epCallback[12] = &USBHAL::EP7_OUT_callback; - epCallback[13] = &USBHAL::EP7_IN_callback; - epCallback[14] = &USBHAL::EP8_OUT_callback; - epCallback[15] = &USBHAL::EP8_IN_callback; - epCallback[16] = &USBHAL::EP9_OUT_callback; - epCallback[17] = &USBHAL::EP9_IN_callback; - epCallback[18] = &USBHAL::EP10_OUT_callback; - epCallback[19] = &USBHAL::EP10_IN_callback; - epCallback[20] = &USBHAL::EP11_OUT_callback; - epCallback[21] = &USBHAL::EP11_IN_callback; - epCallback[22] = &USBHAL::EP12_OUT_callback; - epCallback[23] = &USBHAL::EP12_IN_callback; - epCallback[24] = &USBHAL::EP13_OUT_callback; - epCallback[25] = &USBHAL::EP13_IN_callback; - epCallback[26] = &USBHAL::EP14_OUT_callback; - epCallback[27] = &USBHAL::EP14_IN_callback; - epCallback[28] = &USBHAL::EP15_OUT_callback; - epCallback[29] = &USBHAL::EP15_IN_callback; - -#if defined(TARGET_KL43Z) || 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; -} - -USBHAL::~USBHAL(void) { } - -void USBHAL::connect(void) { - // enable USB - USB0->CTL |= USB_CTL_USBENSOFEN_MASK; - // Pull up enable - USB0->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK; -} - -void USBHAL::disconnect(void) { - // disable USB - USB0->CTL &= ~USB_CTL_USBENSOFEN_MASK; - // Pull up disable - USB0->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK; - - //Free buffers if required: - for (int i = 0; i<(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2; i++) { - free(endpoint_buffer[i]); - endpoint_buffer[i] = NULL; - } - free(endpoint_buffer_iso[2]); - endpoint_buffer_iso[2] = NULL; - free(endpoint_buffer_iso[0]); - endpoint_buffer_iso[0] = NULL; -} - -void USBHAL::configureDevice(void) { - // not needed -} - -void USBHAL::unconfigureDevice(void) { - // not needed -} - -void USBHAL::setAddress(uint8_t address) { - // we don't set the address now otherwise the usb controller does not ack - // we set a flag instead - // see usbisr when an IN token is received - set_addr = 1; - addr = address; -} - -bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) { - uint32_t handshake_flag = 0; - uint8_t * buf; - - if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) { - return false; - } - - uint32_t log_endpoint = PHY_TO_LOG(endpoint); - - if ((flags & ISOCHRONOUS) == 0) { - handshake_flag = USB_ENDPT_EPHSHK_MASK; - if (IN_EP(endpoint)) { - if (endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] == NULL) - endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] = (uint8_t *) malloc (64); - buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)][0]; - } else { - if (endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] == NULL) - endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] = (uint8_t *) malloc (64); - buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)][0]; - } - } else { - if (IN_EP(endpoint)) { - if (endpoint_buffer_iso[2] == NULL) - endpoint_buffer_iso[2] = (uint8_t *) malloc (1023); - buf = &endpoint_buffer_iso[2][0]; - } else { - if (endpoint_buffer_iso[0] == NULL) - endpoint_buffer_iso[0] = (uint8_t *) malloc (1023); - buf = &endpoint_buffer_iso[0][0]; - } - } - - // IN endpt -> device to host (TX) - if (IN_EP(endpoint)) { - USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag | // ep handshaking (not if iso endpoint) - USB_ENDPT_EPTXEN_MASK; // en TX (IN) tran - bdt[EP_BDT_IDX(log_endpoint, TX, ODD )].address = (uint32_t) buf; - bdt[EP_BDT_IDX(log_endpoint, TX, EVEN)].address = 0; - } - // OUT endpt -> host to device (RX) - else { - USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag | // ep handshaking (not if iso endpoint) - USB_ENDPT_EPRXEN_MASK; // en RX (OUT) tran. - bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].byte_count = maxPacket; - bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].address = (uint32_t) buf; - bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].info = BD_OWN_MASK | BD_DTS_MASK; - bdt[EP_BDT_IDX(log_endpoint, RX, EVEN)].info = 0; - } - - Data1 |= (1 << endpoint); - - return true; -} - -// read setup packet -void USBHAL::EP0setup(uint8_t *buffer) { - uint32_t sz; - endpointReadResult(EP0OUT, buffer, &sz); -} - -void USBHAL::EP0readStage(void) { - Data1 &= ~1UL; // set DATA0 - bdt[0].info = (BD_DTS_MASK | BD_OWN_MASK); -} - -void USBHAL::EP0read(void) { - uint32_t idx = EP_BDT_IDX(PHY_TO_LOG(EP0OUT), RX, 0); - bdt[idx].byte_count = MAX_PACKET_SIZE_EP0; -} - -uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) { - uint32_t sz; - endpointReadResult(EP0OUT, buffer, &sz); - return sz; -} - -void USBHAL::EP0write(uint8_t *buffer, uint32_t size) { - endpointWrite(EP0IN, buffer, size); -} - -void USBHAL::EP0getWriteResult(void) { -} - -void USBHAL::EP0stall(void) { - stallEndpoint(EP0OUT); -} - -EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) { - endpoint = PHY_TO_LOG(endpoint); - uint32_t idx = EP_BDT_IDX(endpoint, RX, 0); - bdt[idx].byte_count = maximumSize; - return EP_PENDING; -} - -EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) { - uint32_t n, sz, idx, setup = 0; - uint8_t not_iso; - uint8_t * ep_buf; - - uint32_t log_endpoint = PHY_TO_LOG(endpoint); - - if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) { - return EP_INVALID; - } - - // if read on a IN endpoint -> error - if (IN_EP(endpoint)) { - return EP_INVALID; - } - - idx = EP_BDT_IDX(log_endpoint, RX, 0); - sz = bdt[idx].byte_count; - not_iso = USB0->ENDPOINT[log_endpoint].ENDPT & USB_ENDPT_EPHSHK_MASK; - - //for isochronous endpoint, we don't wait an interrupt - if ((log_endpoint != 0) && not_iso && !(epComplete & EP(endpoint))) { - return EP_PENDING; - } - - if ((log_endpoint == 0) && (TOK_PID(idx) == SETUP_TOKEN)) { - setup = 1; - } - - // non iso endpoint - if (not_iso) { - ep_buf = endpoint_buffer[idx]; - } else { - ep_buf = endpoint_buffer_iso[0]; - } - - for (n = 0; n < sz; n++) { - buffer[n] = ep_buf[n]; - } - - if (((Data1 >> endpoint) & 1) == ((bdt[idx].info >> 6) & 1)) { - if (setup && (buffer[6] == 0)) // if no setup data stage, - Data1 &= ~1UL; // set DATA0 - else - Data1 ^= (1 << endpoint); - } - - if (((Data1 >> endpoint) & 1)) { - bdt[idx].info = BD_DTS_MASK | BD_DATA01_MASK | BD_OWN_MASK; - } - else { - bdt[idx].info = BD_DTS_MASK | BD_OWN_MASK; - } - - USB0->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK; - *bytesRead = sz; - - epComplete &= ~EP(endpoint); - return EP_COMPLETED; -} - -EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) { - uint32_t idx, n; - uint8_t * ep_buf; - - if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) { - return EP_INVALID; - } - - // if write on a OUT endpoint -> error - if (OUT_EP(endpoint)) { - return EP_INVALID; - } - - idx = EP_BDT_IDX(PHY_TO_LOG(endpoint), TX, 0); - bdt[idx].byte_count = size; - - - // non iso endpoint - if (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPHSHK_MASK) { - ep_buf = endpoint_buffer[idx]; - } else { - ep_buf = endpoint_buffer_iso[2]; - } - - for (n = 0; n < size; n++) { - ep_buf[n] = data[n]; - } - - if ((Data1 >> endpoint) & 1) { - bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK; - } else { - bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK | BD_DATA01_MASK; - } - - Data1 ^= (1 << endpoint); - - return EP_PENDING; -} - -EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) { - if (epComplete & EP(endpoint)) { - epComplete &= ~EP(endpoint); - return EP_COMPLETED; - } - - return EP_PENDING; -} - -void USBHAL::stallEndpoint(uint8_t endpoint) { - USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT |= USB_ENDPT_EPSTALL_MASK; -} - -void USBHAL::unstallEndpoint(uint8_t endpoint) { - USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT &= ~USB_ENDPT_EPSTALL_MASK; -} - -bool USBHAL::getEndpointStallState(uint8_t endpoint) { - uint8_t stall = (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPSTALL_MASK); - return (stall) ? true : false; -} - -void USBHAL::remoteWakeup(void) { - // [TODO] -} - - -void USBHAL::_usbisr(void) { - instance->usbisr(); -} - - -void USBHAL::usbisr(void) { - uint8_t i; - uint8_t istat = USB0->ISTAT; - - // reset interrupt - if (istat & USB_ISTAT_USBRST_MASK) { - // disable all endpt - for(i = 0; i < 16; i++) { - USB0->ENDPOINT[i].ENDPT = 0x00; - } - - // enable control endpoint - realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0); - realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0); - - Data1 = 0x55555555; - USB0->CTL |= USB_CTL_ODDRST_MASK; - - USB0->ISTAT = 0xFF; // clear all interrupt status flags - USB0->ERRSTAT = 0xFF; // clear all error flags - USB0->ERREN = 0xFF; // enable error interrupt sources - USB0->ADDR = 0x00; // set default address - - return; - } - - // resume interrupt - if (istat & USB_ISTAT_RESUME_MASK) { - USB0->ISTAT = USB_ISTAT_RESUME_MASK; - } - - // SOF interrupt - if (istat & USB_ISTAT_SOFTOK_MASK) { - USB0->ISTAT = USB_ISTAT_SOFTOK_MASK; - // SOF event, read frame number - SOF(frameNumber()); - } - - // stall interrupt - if (istat & 1<<7) { - if (USB0->ENDPOINT[0].ENDPT & USB_ENDPT_EPSTALL_MASK) - USB0->ENDPOINT[0].ENDPT &= ~USB_ENDPT_EPSTALL_MASK; - USB0->ISTAT |= USB_ISTAT_STALL_MASK; - } - - // token interrupt - if (istat & 1<<3) { - uint32_t num = (USB0->STAT >> 4) & 0x0F; - uint32_t dir = (USB0->STAT >> 3) & 0x01; - uint32_t ev_odd = (USB0->STAT >> 2) & 0x01; - int endpoint = (num << 1) | dir; - - // setup packet - if ((num == 0) && (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == SETUP_TOKEN)) { - Data1 &= ~0x02; - bdt[EP_BDT_IDX(0, TX, EVEN)].info &= ~BD_OWN_MASK; - bdt[EP_BDT_IDX(0, TX, ODD)].info &= ~BD_OWN_MASK; - - // EP0 SETUP event (SETUP data received) - EP0setupCallback(); - - } else { - // OUT packet - if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == OUT_TOKEN) { - if (num == 0) - EP0out(); - else { - epComplete |= EP(endpoint); - if ((instance->*(epCallback[endpoint - 2]))()) { - epComplete &= ~EP(endpoint); - } - } - } - - // IN packet - if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == IN_TOKEN) { - if (num == 0) { - EP0in(); - if (set_addr == 1) { - USB0->ADDR = addr & 0x7F; - set_addr = 0; - } - } - else { - epComplete |= EP(endpoint); - if ((instance->*(epCallback[endpoint - 2]))()) { - epComplete &= ~EP(endpoint); - } - } - } - } - - USB0->ISTAT = USB_ISTAT_TOKDNE_MASK; - } - - // sleep interrupt - if (istat & 1<<4) { - USB0->ISTAT |= USB_ISTAT_SLEEP_MASK; - } - - // error interrupt - if (istat & USB_ISTAT_ERROR_MASK) { - USB0->ERRSTAT = 0xFF; - USB0->ISTAT |= USB_ISTAT_ERROR_MASK; - } -} - - -#endif
--- a/USBDevice/USBHAL_LPC11U.cpp Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,485 +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" - -#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, (uint32_t)&_usbisr); - NVIC_EnableIRQ(USB_IRQn); -} - -USBHAL::~USBHAL(void) -{ - MXC_USB->dev_cn = MXC_F_USB_DEV_CN_URST; - MXC_USB->dev_cn = 0; - MXC_USB->cn = 0; -} - -void USBHAL::connect(void) -{ - // enable interrupts - MXC_USB->dev_inten |= CONNECT_INTS; - - // allow interrupts on ep0 - MXC_USB->ep[0] |= MXC_F_USB_EP_INT_EN; - - // pullup enable - MXC_USB->dev_cn |= (MXC_F_USB_DEV_CN_CONNECT | MXC_F_USB_DEV_CN_FIFO_MODE); -} - -void USBHAL::disconnect(void) -{ - // disable interrupts - MXC_USB->dev_inten &= ~CONNECT_INTS; - - // disable pullup - MXC_USB->dev_cn &= ~MXC_F_USB_DEV_CN_CONNECT; -} - -void USBHAL::configureDevice(void) -{ - // do nothing -} - -void USBHAL::unconfigureDevice(void) -{ - // reset endpoints - for (int i = 0; i < MXC_USB_NUM_EP; i++) { - // Disable endpoint and clear the data toggle - MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR; - MXC_USB->ep[i] |= MXC_F_USB_EP_DT; - } -} - -void USBHAL::setAddress(uint8_t address) -{ - // do nothing -} - -void USBHAL::remoteWakeup(void) -{ - // do nothing -} - -static ep_buffer_t *get_desc(uint8_t endpoint) -{ - uint8_t epnum = EP_NUM(endpoint); - ep_buffer_t *desc; - - if (epnum == 0) { - if (IN_EP(endpoint)) { - desc = &ep_buffer_descriptor.ep0.in_buffer; - } else { - desc = &ep_buffer_descriptor.ep0.out_buffer; - } - } else { - desc = &ep_buffer_descriptor.ep[epnum - 1]; - } - - return desc; -} - -void USBHAL::EP0setup(uint8_t *buffer) -{ - // Setup packet is fixed at 8 bytes - // Setup registers cannot be read in byte mode - uint32_t *ptr32 = (uint32_t*)buffer; - ptr32[0] = (uint32_t)MXC_USB->setup0; - ptr32[1] = (uint32_t)MXC_USB->setup1; -} - -void USBHAL::EP0read(void) -{ - if (control_state == CTRL_IN) { - // This is the status stage. ACK. - MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK; - control_state = CTRL_NONE; - return; - } - - control_state = CTRL_OUT; - - endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0); -} - -void USBHAL::EP0readStage(void) -{ - // do nothing -} - -uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) -{ - uint32_t size; - - if (MXC_USB->out_owner & 1) { - return 0; - } - - // get the packet length and contents - ep_buffer_t *desc = get_desc(EP0OUT); - size = desc->buf0_desc; - memcpy(buffer, aligned_buffer[0], size); - - return size; -} - -void USBHAL::EP0write(uint8_t *buffer, uint32_t size) -{ - if ((size == 0) && (control_state != CTRL_IN)) { - // This is a status stage ACK. Handle in hardware. - MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK; - control_state = CTRL_NONE; - return; - } - - control_state = CTRL_IN; - - endpointWrite(EP0IN, buffer, size); -} - -void USBHAL::EP0stall(void) -{ - stallEndpoint(0); -} - -EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) -{ - uint8_t epnum = EP_NUM(endpoint); - - if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) { - return EP_INVALID; - } - - if (maximumSize > MXC_USB_MAX_PACKET) { - return EP_INVALID; - } - - uint32_t mask = (1 << epnum); - if (MXC_USB->out_owner & mask) { - return EP_INVALID; - } - - ep_buffer_t *desc = get_desc(endpoint); - desc->buf0_desc = maximumSize; - desc->buf0_address = (uint32_t)aligned_buffer[epnum]; - - MXC_USB->out_owner = mask; - - return EP_PENDING; -} - -EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead) -{ - if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) { - return EP_INVALID; - } - - uint32_t mask = (1 << EP_NUM(endpoint)); - if (MXC_USB->out_owner & mask) { - return EP_PENDING; - } - - // get the packet length and contents - ep_buffer_t *desc = get_desc(endpoint); - *bytesRead = desc->buf0_desc; - memcpy(data, aligned_buffer[EP_NUM(endpoint)], *bytesRead); - - return EP_COMPLETED; -} - -EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) -{ - uint8_t epnum = EP_NUM(endpoint); - - if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || OUT_EP(endpoint)) { - return EP_INVALID; - } - - if (size > MXC_USB_MAX_PACKET) { - return EP_INVALID; - } - - uint32_t mask = (1 << epnum); - if (MXC_USB->in_owner & mask) { - return EP_INVALID; - } - - memcpy(aligned_buffer[epnum], data, size); - - ep_buffer_t *desc = get_desc(endpoint); - desc->buf0_desc = size; - desc->buf0_address = (uint32_t)aligned_buffer[epnum]; - - // start the DMA - MXC_USB->in_owner = mask; - - return EP_PENDING; -} - -EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) -{ - uint32_t mask = (1 << EP_NUM(endpoint)); - if (MXC_USB->in_owner & mask) { - return EP_PENDING; - } - - return EP_COMPLETED; -} - -void USBHAL::stallEndpoint(uint8_t endpoint) -{ - uint8_t epnum = EP_NUM(endpoint); - - if (epnum == 0) { - MXC_USB->ep[epnum] |= MXC_F_USB_EP_ST_STALL; - } - - MXC_USB->ep[epnum] |= MXC_F_USB_EP_STALL; -} - -void USBHAL::unstallEndpoint(uint8_t endpoint) -{ - MXC_USB->ep[EP_NUM(endpoint)] &= ~MXC_F_USB_EP_STALL; -} - -bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options) -{ - uint8_t epnum = EP_NUM(endpoint); - uint32_t ep_ctrl; - - if (epnum >= NUMBER_OF_PHYSICAL_ENDPOINTS) { - return false; - } - - if (IN_EP(endpoint)) { - ep_ctrl = (MXC_V_USB_EP_DIR_IN << MXC_F_USB_EP_DIR_POS); - } else { - ep_ctrl = (MXC_S_USB_EP_DIR_OUT << MXC_F_USB_EP_DIR_POS); - } - - ep_ctrl |= (MXC_F_USB_EP_DT | MXC_F_USB_EP_INT_EN); - - MXC_USB->ep[epnum] = ep_ctrl; - - return true; -} - -bool USBHAL::getEndpointStallState(unsigned char endpoint) -{ - return !!(MXC_USB->ep[endpoint] & MXC_F_USB_EP_STALL); -} - -void USBHAL::_usbisr(void) -{ - instance->usbisr(); -} - -void USBHAL::usbisr(void) -{ - // get and clear irqs - uint32_t irq_flags = MXC_USB->dev_intfl; - MXC_USB->dev_intfl = irq_flags; - - // process only enabled interrupts - irq_flags &= MXC_USB->dev_inten; - - // suspend - if (irq_flags & MXC_F_USB_DEV_INTFL_SUSP) { - suspendStateChanged(1); - } - - // bus reset - if (irq_flags & MXC_F_USB_DEV_INTFL_BRST) { - - // reset endpoints - for (int i = 0; i < MXC_USB_NUM_EP; i++) { - // Disable endpoint and clear the data toggle - MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR; - MXC_USB->ep[i] |= MXC_F_USB_EP_DT; - } - - // clear driver state - control_state = CTRL_NONE; - - busReset(); - - // no need to process events after reset - return; - } - - // Setup packet - if (irq_flags & MXC_F_USB_DEV_INTFL_SETUP) { - control_state = CTRL_SETUP; - EP0setupCallback(); - } - - // IN packets - if (irq_flags & MXC_F_USB_DEV_INTFL_EP_IN) { - // get and clear IN irqs - uint32_t in_irqs = MXC_USB->in_int; - MXC_USB->in_int = in_irqs; - - if (in_irqs & 1) { - EP0in(); - } - - for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) { - uint32_t irq_mask = (1 << epnum); - if (in_irqs & irq_mask) { - uint8_t endpoint = (epnum << 1) | DIR_IN; - (instance->*(epCallback[endpoint]))(); - } - } - } - - // OUT packets - if (irq_flags & MXC_F_USB_DEV_INTFL_EP_OUT) { - // get and clear OUT irqs - uint32_t out_irqs = MXC_USB->out_int; - MXC_USB->out_int = out_irqs; - - if (out_irqs & 1) { - EP0out(); - } - - for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) { - uint32_t irq_mask = (1 << epnum); - if (out_irqs & irq_mask) { - uint8_t endpoint = (epnum << 1) | DIR_OUT; - (instance->*(epCallback[endpoint]))(); - } - } - } -} - -#endif
--- a/USBDevice/USBHAL_NUC472.cpp Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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 Fri Apr 28 16:21:32 2017 +0000 +++ /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/USBDevice/targets/TARGET_Freescale/USBEndpoints_KL25Z.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,99 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#define NUMBER_OF_LOGICAL_ENDPOINTS (16) +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) + +/* Define physical endpoint numbers */ + +/* Endpoint No. */ +/* ---------------- */ +#define EP0OUT (0) +#define EP0IN (1) +#define EP1OUT (2) +#define EP1IN (3) +#define EP2OUT (4) +#define EP2IN (5) +#define EP3OUT (6) +#define EP3IN (7) +#define EP4OUT (8) +#define EP4IN (9) +#define EP5OUT (10) +#define EP5IN (11) +#define EP6OUT (12) +#define EP6IN (13) +#define EP7OUT (14) +#define EP7IN (15) +#define EP8OUT (16) +#define EP8IN (17) +#define EP9OUT (18) +#define EP9IN (19) +#define EP10OUT (20) +#define EP10IN (21) +#define EP11OUT (22) +#define EP11IN (23) +#define EP12OUT (24) +#define EP12IN (25) +#define EP13OUT (26) +#define EP13IN (27) +#define EP14OUT (28) +#define EP14IN (29) +#define EP15OUT (30) +#define EP15IN (31) + +/* Maximum Packet sizes */ + +#define MAX_PACKET_SIZE_EP0 (64) +#define MAX_PACKET_SIZE_EP1 (64) +#define MAX_PACKET_SIZE_EP2 (64) +#define MAX_PACKET_SIZE_EP3 (1023) +#define MAX_PACKET_SIZE_EP4 (64) +#define MAX_PACKET_SIZE_EP5 (64) +#define MAX_PACKET_SIZE_EP6 (64) +#define MAX_PACKET_SIZE_EP7 (64) +#define MAX_PACKET_SIZE_EP8 (64) +#define MAX_PACKET_SIZE_EP9 (64) +#define MAX_PACKET_SIZE_EP10 (64) +#define MAX_PACKET_SIZE_EP11 (64) +#define MAX_PACKET_SIZE_EP12 (64) +#define MAX_PACKET_SIZE_EP13 (64) +#define MAX_PACKET_SIZE_EP14 (64) +#define MAX_PACKET_SIZE_EP15 (64) + +/* Generic endpoints - intended to be portable accross devices */ +/* and be suitable for simple USB devices. */ + +/* Bulk endpoints */ +#define EPBULK_OUT (EP2OUT) +#define EPBULK_IN (EP2IN) +#define EPBULK_OUT_callback EP2_OUT_callback +#define EPBULK_IN_callback EP2_IN_callback +/* Interrupt endpoints */ +#define EPINT_OUT (EP1OUT) +#define EPINT_IN (EP1IN) +#define EPINT_OUT_callback EP1_OUT_callback +#define EPINT_IN_callback EP1_IN_callback +/* Isochronous endpoints */ +#define EPISO_OUT (EP3OUT) +#define EPISO_IN (EP3IN) +#define EPISO_OUT_callback EP3_OUT_callback +#define EPISO_IN_callback EP3_IN_callback + +#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) +#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) +#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Freescale/USBHAL_KL25Z.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,543 @@ +/* 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: +// * 16 bidirectionnal endpt -> 32 physical endpt +// * as there are ODD and EVEN buffer -> 32*2 bdt +MBED_ALIGN(512) BDT bdt[NUMBER_OF_PHYSICAL_ENDPOINTS * 2]; // 512 bytes aligned! + +uint8_t * endpoint_buffer[(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2]; +uint8_t * endpoint_buffer_iso[2*2]; + +static uint8_t set_addr = 0; +static uint8_t addr = 0; + +static uint32_t Data1 = 0x55555555; + +static uint32_t frameNumber() { + return((USB0->FRMNUML | (USB0->FRMNUMH << 8)) & 0x07FF); +} + +uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) { + return 0; +} + +USBHAL::USBHAL(void) { + // Disable IRQ + NVIC_DisableIRQ(USB0_IRQn); + +#if (defined(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; + epCallback[8] = &USBHAL::EP5_OUT_callback; + epCallback[9] = &USBHAL::EP5_IN_callback; + epCallback[10] = &USBHAL::EP6_OUT_callback; + epCallback[11] = &USBHAL::EP6_IN_callback; + epCallback[12] = &USBHAL::EP7_OUT_callback; + epCallback[13] = &USBHAL::EP7_IN_callback; + epCallback[14] = &USBHAL::EP8_OUT_callback; + epCallback[15] = &USBHAL::EP8_IN_callback; + epCallback[16] = &USBHAL::EP9_OUT_callback; + epCallback[17] = &USBHAL::EP9_IN_callback; + epCallback[18] = &USBHAL::EP10_OUT_callback; + epCallback[19] = &USBHAL::EP10_IN_callback; + epCallback[20] = &USBHAL::EP11_OUT_callback; + epCallback[21] = &USBHAL::EP11_IN_callback; + epCallback[22] = &USBHAL::EP12_OUT_callback; + epCallback[23] = &USBHAL::EP12_IN_callback; + epCallback[24] = &USBHAL::EP13_OUT_callback; + epCallback[25] = &USBHAL::EP13_IN_callback; + epCallback[26] = &USBHAL::EP14_OUT_callback; + epCallback[27] = &USBHAL::EP14_IN_callback; + epCallback[28] = &USBHAL::EP15_OUT_callback; + epCallback[29] = &USBHAL::EP15_IN_callback; + +#if defined(TARGET_KL43Z) || 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; +} + +USBHAL::~USBHAL(void) { } + +void USBHAL::connect(void) { + // enable USB + USB0->CTL |= USB_CTL_USBENSOFEN_MASK; + // Pull up enable + USB0->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK; +} + +void USBHAL::disconnect(void) { + // disable USB + USB0->CTL &= ~USB_CTL_USBENSOFEN_MASK; + // Pull up disable + USB0->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK; + + //Free buffers if required: + for (int i = 0; i<(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2; i++) { + free(endpoint_buffer[i]); + endpoint_buffer[i] = NULL; + } + free(endpoint_buffer_iso[2]); + endpoint_buffer_iso[2] = NULL; + free(endpoint_buffer_iso[0]); + endpoint_buffer_iso[0] = NULL; +} + +void USBHAL::configureDevice(void) { + // not needed +} + +void USBHAL::unconfigureDevice(void) { + // not needed +} + +void USBHAL::setAddress(uint8_t address) { + // we don't set the address now otherwise the usb controller does not ack + // we set a flag instead + // see usbisr when an IN token is received + set_addr = 1; + addr = address; +} + +bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) { + uint32_t handshake_flag = 0; + uint8_t * buf; + + if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) { + return false; + } + + uint32_t log_endpoint = PHY_TO_LOG(endpoint); + + if ((flags & ISOCHRONOUS) == 0) { + handshake_flag = USB_ENDPT_EPHSHK_MASK; + if (IN_EP(endpoint)) { + if (endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] == NULL) + endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] = (uint8_t *) malloc (64); + buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)][0]; + } else { + if (endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] == NULL) + endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] = (uint8_t *) malloc (64); + buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)][0]; + } + } else { + if (IN_EP(endpoint)) { + if (endpoint_buffer_iso[2] == NULL) + endpoint_buffer_iso[2] = (uint8_t *) malloc (1023); + buf = &endpoint_buffer_iso[2][0]; + } else { + if (endpoint_buffer_iso[0] == NULL) + endpoint_buffer_iso[0] = (uint8_t *) malloc (1023); + buf = &endpoint_buffer_iso[0][0]; + } + } + + // IN endpt -> device to host (TX) + if (IN_EP(endpoint)) { + USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag | // ep handshaking (not if iso endpoint) + USB_ENDPT_EPTXEN_MASK; // en TX (IN) tran + bdt[EP_BDT_IDX(log_endpoint, TX, ODD )].address = (uint32_t) buf; + bdt[EP_BDT_IDX(log_endpoint, TX, EVEN)].address = 0; + } + // OUT endpt -> host to device (RX) + else { + USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag | // ep handshaking (not if iso endpoint) + USB_ENDPT_EPRXEN_MASK; // en RX (OUT) tran. + bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].byte_count = maxPacket; + bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].address = (uint32_t) buf; + bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].info = BD_OWN_MASK | BD_DTS_MASK; + bdt[EP_BDT_IDX(log_endpoint, RX, EVEN)].info = 0; + } + + Data1 |= (1 << endpoint); + + return true; +} + +// read setup packet +void USBHAL::EP0setup(uint8_t *buffer) { + uint32_t sz; + endpointReadResult(EP0OUT, buffer, &sz); +} + +void USBHAL::EP0readStage(void) { + Data1 &= ~1UL; // set DATA0 + bdt[0].info = (BD_DTS_MASK | BD_OWN_MASK); +} + +void USBHAL::EP0read(void) { + uint32_t idx = EP_BDT_IDX(PHY_TO_LOG(EP0OUT), RX, 0); + bdt[idx].byte_count = MAX_PACKET_SIZE_EP0; +} + +uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) { + uint32_t sz; + endpointReadResult(EP0OUT, buffer, &sz); + return sz; +} + +void USBHAL::EP0write(uint8_t *buffer, uint32_t size) { + endpointWrite(EP0IN, buffer, size); +} + +void USBHAL::EP0getWriteResult(void) { +} + +void USBHAL::EP0stall(void) { + stallEndpoint(EP0OUT); +} + +EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) { + endpoint = PHY_TO_LOG(endpoint); + uint32_t idx = EP_BDT_IDX(endpoint, RX, 0); + bdt[idx].byte_count = maximumSize; + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) { + uint32_t n, sz, idx, setup = 0; + uint8_t not_iso; + uint8_t * ep_buf; + + uint32_t log_endpoint = PHY_TO_LOG(endpoint); + + if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) { + return EP_INVALID; + } + + // if read on a IN endpoint -> error + if (IN_EP(endpoint)) { + return EP_INVALID; + } + + idx = EP_BDT_IDX(log_endpoint, RX, 0); + sz = bdt[idx].byte_count; + not_iso = USB0->ENDPOINT[log_endpoint].ENDPT & USB_ENDPT_EPHSHK_MASK; + + //for isochronous endpoint, we don't wait an interrupt + if ((log_endpoint != 0) && not_iso && !(epComplete & EP(endpoint))) { + return EP_PENDING; + } + + if ((log_endpoint == 0) && (TOK_PID(idx) == SETUP_TOKEN)) { + setup = 1; + } + + // non iso endpoint + if (not_iso) { + ep_buf = endpoint_buffer[idx]; + } else { + ep_buf = endpoint_buffer_iso[0]; + } + + for (n = 0; n < sz; n++) { + buffer[n] = ep_buf[n]; + } + + if (((Data1 >> endpoint) & 1) == ((bdt[idx].info >> 6) & 1)) { + if (setup && (buffer[6] == 0)) // if no setup data stage, + Data1 &= ~1UL; // set DATA0 + else + Data1 ^= (1 << endpoint); + } + + if (((Data1 >> endpoint) & 1)) { + bdt[idx].info = BD_DTS_MASK | BD_DATA01_MASK | BD_OWN_MASK; + } + else { + bdt[idx].info = BD_DTS_MASK | BD_OWN_MASK; + } + + USB0->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK; + *bytesRead = sz; + + epComplete &= ~EP(endpoint); + return EP_COMPLETED; +} + +EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) { + uint32_t idx, n; + uint8_t * ep_buf; + + if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) { + return EP_INVALID; + } + + // if write on a OUT endpoint -> error + if (OUT_EP(endpoint)) { + return EP_INVALID; + } + + idx = EP_BDT_IDX(PHY_TO_LOG(endpoint), TX, 0); + bdt[idx].byte_count = size; + + + // non iso endpoint + if (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPHSHK_MASK) { + ep_buf = endpoint_buffer[idx]; + } else { + ep_buf = endpoint_buffer_iso[2]; + } + + for (n = 0; n < size; n++) { + ep_buf[n] = data[n]; + } + + if ((Data1 >> endpoint) & 1) { + bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK; + } else { + bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK | BD_DATA01_MASK; + } + + Data1 ^= (1 << endpoint); + + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) { + if (epComplete & EP(endpoint)) { + epComplete &= ~EP(endpoint); + return EP_COMPLETED; + } + + return EP_PENDING; +} + +void USBHAL::stallEndpoint(uint8_t endpoint) { + USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT |= USB_ENDPT_EPSTALL_MASK; +} + +void USBHAL::unstallEndpoint(uint8_t endpoint) { + USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT &= ~USB_ENDPT_EPSTALL_MASK; +} + +bool USBHAL::getEndpointStallState(uint8_t endpoint) { + uint8_t stall = (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPSTALL_MASK); + return (stall) ? true : false; +} + +void USBHAL::remoteWakeup(void) { + // [TODO] +} + + +void USBHAL::_usbisr(void) { + instance->usbisr(); +} + + +void USBHAL::usbisr(void) { + uint8_t i; + uint8_t istat = USB0->ISTAT; + + // reset interrupt + if (istat & USB_ISTAT_USBRST_MASK) { + // disable all endpt + for(i = 0; i < 16; i++) { + USB0->ENDPOINT[i].ENDPT = 0x00; + } + + // enable control endpoint + realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0); + realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0); + + Data1 = 0x55555555; + USB0->CTL |= USB_CTL_ODDRST_MASK; + + USB0->ISTAT = 0xFF; // clear all interrupt status flags + USB0->ERRSTAT = 0xFF; // clear all error flags + USB0->ERREN = 0xFF; // enable error interrupt sources + USB0->ADDR = 0x00; // set default address + + return; + } + + // resume interrupt + if (istat & USB_ISTAT_RESUME_MASK) { + USB0->ISTAT = USB_ISTAT_RESUME_MASK; + } + + // SOF interrupt + if (istat & USB_ISTAT_SOFTOK_MASK) { + USB0->ISTAT = USB_ISTAT_SOFTOK_MASK; + // SOF event, read frame number + SOF(frameNumber()); + } + + // stall interrupt + if (istat & 1<<7) { + if (USB0->ENDPOINT[0].ENDPT & USB_ENDPT_EPSTALL_MASK) + USB0->ENDPOINT[0].ENDPT &= ~USB_ENDPT_EPSTALL_MASK; + USB0->ISTAT |= USB_ISTAT_STALL_MASK; + } + + // token interrupt + if (istat & 1<<3) { + uint32_t num = (USB0->STAT >> 4) & 0x0F; + uint32_t dir = (USB0->STAT >> 3) & 0x01; + uint32_t ev_odd = (USB0->STAT >> 2) & 0x01; + int endpoint = (num << 1) | dir; + + // setup packet + if ((num == 0) && (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == SETUP_TOKEN)) { + Data1 &= ~0x02; + bdt[EP_BDT_IDX(0, TX, EVEN)].info &= ~BD_OWN_MASK; + bdt[EP_BDT_IDX(0, TX, ODD)].info &= ~BD_OWN_MASK; + + // EP0 SETUP event (SETUP data received) + EP0setupCallback(); + + } else { + // OUT packet + if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == OUT_TOKEN) { + if (num == 0) + EP0out(); + else { + epComplete |= EP(endpoint); + if ((instance->*(epCallback[endpoint - 2]))()) { + epComplete &= ~EP(endpoint); + } + } + } + + // IN packet + if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == IN_TOKEN) { + if (num == 0) { + EP0in(); + if (set_addr == 1) { + USB0->ADDR = addr & 0x7F; + set_addr = 0; + } + } + else { + epComplete |= EP(endpoint); + if ((instance->*(epCallback[endpoint - 2]))()) { + epComplete &= ~EP(endpoint); + } + } + } + } + + USB0->ISTAT = USB_ISTAT_TOKDNE_MASK; + } + + // sleep interrupt + if (istat & 1<<4) { + USB0->ISTAT |= USB_ISTAT_SLEEP_MASK; + } + + // error interrupt + if (istat & USB_ISTAT_ERROR_MASK) { + USB0->ERRSTAT = 0xFF; + USB0->ISTAT |= USB_ISTAT_ERROR_MASK; + } +} + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Maxim/USBEndpoints_Maxim.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES + * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of Maxim Integrated + * Products, Inc. shall not be used except as stated in the Maxim Integrated + * Products, Inc. Branding Policy. + * + * The mere transfer of this software does not imply any licenses + * of trade secrets, proprietary technology, copyrights, patents, + * trademarks, maskwork rights, or any other form of intellectual + * property whatsoever. Maxim Integrated Products, Inc. retains all + * ownership rights. + ******************************************************************************* + */ + +#define NUMBER_OF_LOGICAL_ENDPOINTS (8) +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) + +#define DIR_OUT 0x00 +#define DIR_IN 0x01 +#define EP_NUM(ep) (ep >> 1) +#define IN_EP(ep) (ep & DIR_IN) +#define OUT_EP(ep) (!(ep & DIR_IN)) + +/* Define physical endpoint numbers */ + +/* Endpoint No. */ +/* ---------------- */ +#define EP0OUT ((0 << 1) | DIR_OUT) +#define EP0IN ((0 << 1) | DIR_IN) +#define EP1OUT ((1 << 1) | DIR_OUT) +#define EP1IN ((1 << 1) | DIR_IN) +#define EP2OUT ((2 << 1) | DIR_OUT) +#define EP2IN ((2 << 1) | DIR_IN) +#define EP3OUT ((3 << 1) | DIR_OUT) +#define EP3IN ((3 << 1) | DIR_IN) +#define EP4OUT ((4 << 1) | DIR_OUT) +#define EP4IN ((4 << 1) | DIR_IN) +#define EP5OUT ((5 << 1) | DIR_OUT) +#define EP5IN ((5 << 1) | DIR_IN) +#define EP6OUT ((6 << 1) | DIR_OUT) +#define EP6IN ((6 << 1) | DIR_IN) +#define EP7OUT ((7 << 1) | DIR_OUT) +#define EP7IN ((7 << 1) | DIR_IN) + +/* Maximum Packet sizes */ + +#define MAX_PACKET_SIZE_EP0 (64) +#define MAX_PACKET_SIZE_EP1 (64) +#define MAX_PACKET_SIZE_EP2 (64) +#define MAX_PACKET_SIZE_EP3 (64) +#define MAX_PACKET_SIZE_EP4 (64) +#define MAX_PACKET_SIZE_EP5 (64) +#define MAX_PACKET_SIZE_EP6 (64) +#define MAX_PACKET_SIZE_EP7 (64) + +/* Generic endpoints - intended to be portable accross devices */ +/* and be suitable for simple USB devices. */ + +/* Bulk endpoints */ +#define EPBULK_OUT (EP1OUT) +#define EPBULK_IN (EP2IN) +#define EPBULK_OUT_callback EP1_OUT_callback +#define EPBULK_IN_callback EP2_IN_callback +/* Interrupt endpoints */ +#define EPINT_OUT (EP3OUT) +#define EPINT_IN (EP4IN) +#define EPINT_OUT_callback EP3_OUT_callback +#define EPINT_IN_callback EP4_IN_callback +/* Isochronous endpoints */ +/* NOT SUPPORTED - use invalid endpoint number to prevent built errors */ +#define EPISO_OUT (EP0OUT) +#define EPISO_IN (EP0IN) + +#define MAX_PACKET_SIZE_EPBULK (64) +#define MAX_PACKET_SIZE_EPINT (64)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Maxim/USBHAL_Maxim.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,485 @@ +/******************************************************************************* + * 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" + +#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, (uint32_t)&_usbisr); + NVIC_EnableIRQ(USB_IRQn); +} + +USBHAL::~USBHAL(void) +{ + MXC_USB->dev_cn = MXC_F_USB_DEV_CN_URST; + MXC_USB->dev_cn = 0; + MXC_USB->cn = 0; +} + +void USBHAL::connect(void) +{ + // enable interrupts + MXC_USB->dev_inten |= CONNECT_INTS; + + // allow interrupts on ep0 + MXC_USB->ep[0] |= MXC_F_USB_EP_INT_EN; + + // pullup enable + MXC_USB->dev_cn |= (MXC_F_USB_DEV_CN_CONNECT | MXC_F_USB_DEV_CN_FIFO_MODE); +} + +void USBHAL::disconnect(void) +{ + // disable interrupts + MXC_USB->dev_inten &= ~CONNECT_INTS; + + // disable pullup + MXC_USB->dev_cn &= ~MXC_F_USB_DEV_CN_CONNECT; +} + +void USBHAL::configureDevice(void) +{ + // do nothing +} + +void USBHAL::unconfigureDevice(void) +{ + // reset endpoints + for (int i = 0; i < MXC_USB_NUM_EP; i++) { + // Disable endpoint and clear the data toggle + MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR; + MXC_USB->ep[i] |= MXC_F_USB_EP_DT; + } +} + +void USBHAL::setAddress(uint8_t address) +{ + // do nothing +} + +void USBHAL::remoteWakeup(void) +{ + // do nothing +} + +static ep_buffer_t *get_desc(uint8_t endpoint) +{ + uint8_t epnum = EP_NUM(endpoint); + ep_buffer_t *desc; + + if (epnum == 0) { + if (IN_EP(endpoint)) { + desc = &ep_buffer_descriptor.ep0.in_buffer; + } else { + desc = &ep_buffer_descriptor.ep0.out_buffer; + } + } else { + desc = &ep_buffer_descriptor.ep[epnum - 1]; + } + + return desc; +} + +void USBHAL::EP0setup(uint8_t *buffer) +{ + // Setup packet is fixed at 8 bytes + // Setup registers cannot be read in byte mode + uint32_t *ptr32 = (uint32_t*)buffer; + ptr32[0] = (uint32_t)MXC_USB->setup0; + ptr32[1] = (uint32_t)MXC_USB->setup1; +} + +void USBHAL::EP0read(void) +{ + if (control_state == CTRL_IN) { + // This is the status stage. ACK. + MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK; + control_state = CTRL_NONE; + return; + } + + control_state = CTRL_OUT; + + endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0); +} + +void USBHAL::EP0readStage(void) +{ + // do nothing +} + +uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) +{ + uint32_t size; + + if (MXC_USB->out_owner & 1) { + return 0; + } + + // get the packet length and contents + ep_buffer_t *desc = get_desc(EP0OUT); + size = desc->buf0_desc; + memcpy(buffer, aligned_buffer[0], size); + + return size; +} + +void USBHAL::EP0write(uint8_t *buffer, uint32_t size) +{ + if ((size == 0) && (control_state != CTRL_IN)) { + // This is a status stage ACK. Handle in hardware. + MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK; + control_state = CTRL_NONE; + return; + } + + control_state = CTRL_IN; + + endpointWrite(EP0IN, buffer, size); +} + +void USBHAL::EP0stall(void) +{ + stallEndpoint(0); +} + +EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) +{ + uint8_t epnum = EP_NUM(endpoint); + + if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) { + return EP_INVALID; + } + + if (maximumSize > MXC_USB_MAX_PACKET) { + return EP_INVALID; + } + + uint32_t mask = (1 << epnum); + if (MXC_USB->out_owner & mask) { + return EP_INVALID; + } + + ep_buffer_t *desc = get_desc(endpoint); + desc->buf0_desc = maximumSize; + desc->buf0_address = (uint32_t)aligned_buffer[epnum]; + + MXC_USB->out_owner = mask; + + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead) +{ + if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) { + return EP_INVALID; + } + + uint32_t mask = (1 << EP_NUM(endpoint)); + if (MXC_USB->out_owner & mask) { + return EP_PENDING; + } + + // get the packet length and contents + ep_buffer_t *desc = get_desc(endpoint); + *bytesRead = desc->buf0_desc; + memcpy(data, aligned_buffer[EP_NUM(endpoint)], *bytesRead); + + return EP_COMPLETED; +} + +EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) +{ + uint8_t epnum = EP_NUM(endpoint); + + if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || OUT_EP(endpoint)) { + return EP_INVALID; + } + + if (size > MXC_USB_MAX_PACKET) { + return EP_INVALID; + } + + uint32_t mask = (1 << epnum); + if (MXC_USB->in_owner & mask) { + return EP_INVALID; + } + + memcpy(aligned_buffer[epnum], data, size); + + ep_buffer_t *desc = get_desc(endpoint); + desc->buf0_desc = size; + desc->buf0_address = (uint32_t)aligned_buffer[epnum]; + + // start the DMA + MXC_USB->in_owner = mask; + + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) +{ + uint32_t mask = (1 << EP_NUM(endpoint)); + if (MXC_USB->in_owner & mask) { + return EP_PENDING; + } + + return EP_COMPLETED; +} + +void USBHAL::stallEndpoint(uint8_t endpoint) +{ + uint8_t epnum = EP_NUM(endpoint); + + if (epnum == 0) { + MXC_USB->ep[epnum] |= MXC_F_USB_EP_ST_STALL; + } + + MXC_USB->ep[epnum] |= MXC_F_USB_EP_STALL; +} + +void USBHAL::unstallEndpoint(uint8_t endpoint) +{ + MXC_USB->ep[EP_NUM(endpoint)] &= ~MXC_F_USB_EP_STALL; +} + +bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options) +{ + uint8_t epnum = EP_NUM(endpoint); + uint32_t ep_ctrl; + + if (epnum >= NUMBER_OF_PHYSICAL_ENDPOINTS) { + return false; + } + + if (IN_EP(endpoint)) { + ep_ctrl = (MXC_V_USB_EP_DIR_IN << MXC_F_USB_EP_DIR_POS); + } else { + ep_ctrl = (MXC_S_USB_EP_DIR_OUT << MXC_F_USB_EP_DIR_POS); + } + + ep_ctrl |= (MXC_F_USB_EP_DT | MXC_F_USB_EP_INT_EN); + + MXC_USB->ep[epnum] = ep_ctrl; + + return true; +} + +bool USBHAL::getEndpointStallState(unsigned char endpoint) +{ + return !!(MXC_USB->ep[endpoint] & MXC_F_USB_EP_STALL); +} + +void USBHAL::_usbisr(void) +{ + instance->usbisr(); +} + +void USBHAL::usbisr(void) +{ + // get and clear irqs + uint32_t irq_flags = MXC_USB->dev_intfl; + MXC_USB->dev_intfl = irq_flags; + + // process only enabled interrupts + irq_flags &= MXC_USB->dev_inten; + + // suspend + if (irq_flags & MXC_F_USB_DEV_INTFL_SUSP) { + suspendStateChanged(1); + } + + // bus reset + if (irq_flags & MXC_F_USB_DEV_INTFL_BRST) { + + // reset endpoints + for (int i = 0; i < MXC_USB_NUM_EP; i++) { + // Disable endpoint and clear the data toggle + MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR; + MXC_USB->ep[i] |= MXC_F_USB_EP_DT; + } + + // clear driver state + control_state = CTRL_NONE; + + busReset(); + + // no need to process events after reset + return; + } + + // Setup packet + if (irq_flags & MXC_F_USB_DEV_INTFL_SETUP) { + control_state = CTRL_SETUP; + EP0setupCallback(); + } + + // IN packets + if (irq_flags & MXC_F_USB_DEV_INTFL_EP_IN) { + // get and clear IN irqs + uint32_t in_irqs = MXC_USB->in_int; + MXC_USB->in_int = in_irqs; + + if (in_irqs & 1) { + EP0in(); + } + + for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) { + uint32_t irq_mask = (1 << epnum); + if (in_irqs & irq_mask) { + uint8_t endpoint = (epnum << 1) | DIR_IN; + (instance->*(epCallback[endpoint]))(); + } + } + } + + // OUT packets + if (irq_flags & MXC_F_USB_DEV_INTFL_EP_OUT) { + // get and clear OUT irqs + uint32_t out_irqs = MXC_USB->out_int; + MXC_USB->out_int = out_irqs; + + if (out_irqs & 1) { + EP0out(); + } + + for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) { + uint32_t irq_mask = (1 << epnum); + if (out_irqs & irq_mask) { + uint8_t endpoint = (epnum << 1) | DIR_OUT; + (instance->*(epCallback[endpoint]))(); + } + } + } +} + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_NUVOTON/USBEndpoints_M453.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_NUVOTON/USBEndpoints_NUC472.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_NUVOTON/USBHAL_M453.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_NUVOTON/USBHAL_NUC472.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_NXP/USBEndpoints_LPC11U.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,71 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#define NUMBER_OF_LOGICAL_ENDPOINTS (5) +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) + +/* Define physical endpoint numbers */ + +/* Endpoint No. Type(s) MaxPacket DoubleBuffer */ +/* ---------------- ------------ ---------- --- */ +#define EP0OUT (0) /* Control 64 No */ +#define EP0IN (1) /* Control 64 No */ +#define EP1OUT (2) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP1IN (3) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP2OUT (4) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP2IN (5) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP3OUT (6) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP3IN (7) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP4OUT (8) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP4IN (9) /* Int/Bulk/Iso 64/64/1023 Yes */ + +/* Maximum Packet sizes */ + +#define MAX_PACKET_SIZE_EP0 (64) +#define MAX_PACKET_SIZE_EP1 (64) /* Int/Bulk */ +#define MAX_PACKET_SIZE_EP2 (64) /* Int/Bulk */ +#define MAX_PACKET_SIZE_EP3 (64) /* Int/Bulk */ +#define MAX_PACKET_SIZE_EP4 (64) /* Int/Bulk */ + +#define MAX_PACKET_SIZE_EP1_ISO (1023) /* Isochronous */ +#define MAX_PACKET_SIZE_EP2_ISO (1023) /* Isochronous */ +#define MAX_PACKET_SIZE_EP3_ISO (1023) /* Isochronous */ +#define MAX_PACKET_SIZE_EP4_ISO (1023) /* Isochronous */ + +/* Generic endpoints - intended to be portable accross devices */ +/* and be suitable for simple USB devices. */ + +/* Bulk endpoint */ +#define EPBULK_OUT (EP2OUT) +#define EPBULK_IN (EP2IN) +#define EPBULK_OUT_callback EP2_OUT_callback +#define EPBULK_IN_callback EP2_IN_callback +/* Interrupt endpoint */ +#define EPINT_OUT (EP1OUT) +#define EPINT_IN (EP1IN) +#define EPINT_OUT_callback EP1_OUT_callback +#define EPINT_IN_callback EP1_IN_callback +/* Isochronous endpoint */ +#define EPISO_OUT (EP3OUT) +#define EPISO_IN (EP3IN) +#define EPISO_OUT_callback EP3_OUT_callback +#define EPISO_IN_callback EP3_IN_callback + +#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) +#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) +#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3_ISO)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_NXP/USBEndpoints_LPC17_LPC23.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,99 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#define NUMBER_OF_LOGICAL_ENDPOINTS (16) +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) + +/* Define physical endpoint numbers */ + +/* Endpoint No. Type(s) MaxPacket DoubleBuffer */ +/* ---------------- ------------ ---------- --- */ +#define EP0OUT (0) /* Control 64 No */ +#define EP0IN (1) /* Control 64 No */ +#define EP1OUT (2) /* Interrupt 64 No */ +#define EP1IN (3) /* Interrupt 64 No */ +#define EP2OUT (4) /* Bulk 64 Yes */ +#define EP2IN (5) /* Bulk 64 Yes */ +#define EP3OUT (6) /* Isochronous 1023 Yes */ +#define EP3IN (7) /* Isochronous 1023 Yes */ +#define EP4OUT (8) /* Interrupt 64 No */ +#define EP4IN (9) /* Interrupt 64 No */ +#define EP5OUT (10) /* Bulk 64 Yes */ +#define EP5IN (11) /* Bulk 64 Yes */ +#define EP6OUT (12) /* Isochronous 1023 Yes */ +#define EP6IN (13) /* Isochronous 1023 Yes */ +#define EP7OUT (14) /* Interrupt 64 No */ +#define EP7IN (15) /* Interrupt 64 No */ +#define EP8OUT (16) /* Bulk 64 Yes */ +#define EP8IN (17) /* Bulk 64 Yes */ +#define EP9OUT (18) /* Isochronous 1023 Yes */ +#define EP9IN (19) /* Isochronous 1023 Yes */ +#define EP10OUT (20) /* Interrupt 64 No */ +#define EP10IN (21) /* Interrupt 64 No */ +#define EP11OUT (22) /* Bulk 64 Yes */ +#define EP11IN (23) /* Bulk 64 Yes */ +#define EP12OUT (24) /* Isochronous 1023 Yes */ +#define EP12IN (25) /* Isochronous 1023 Yes */ +#define EP13OUT (26) /* Interrupt 64 No */ +#define EP13IN (27) /* Interrupt 64 No */ +#define EP14OUT (28) /* Bulk 64 Yes */ +#define EP14IN (29) /* Bulk 64 Yes */ +#define EP15OUT (30) /* Bulk 64 Yes */ +#define EP15IN (31) /* Bulk 64 Yes */ + +/* Maximum Packet sizes */ + +#define MAX_PACKET_SIZE_EP0 (64) +#define MAX_PACKET_SIZE_EP1 (64) +#define MAX_PACKET_SIZE_EP2 (64) +#define MAX_PACKET_SIZE_EP3 (1023) +#define MAX_PACKET_SIZE_EP4 (64) +#define MAX_PACKET_SIZE_EP5 (64) +#define MAX_PACKET_SIZE_EP6 (1023) +#define MAX_PACKET_SIZE_EP7 (64) +#define MAX_PACKET_SIZE_EP8 (64) +#define MAX_PACKET_SIZE_EP9 (1023) +#define MAX_PACKET_SIZE_EP10 (64) +#define MAX_PACKET_SIZE_EP11 (64) +#define MAX_PACKET_SIZE_EP12 (1023) +#define MAX_PACKET_SIZE_EP13 (64) +#define MAX_PACKET_SIZE_EP14 (64) +#define MAX_PACKET_SIZE_EP15 (64) + +/* Generic endpoints - intended to be portable accross devices */ +/* and be suitable for simple USB devices. */ + +/* Bulk endpoints */ +#define EPBULK_OUT (EP2OUT) +#define EPBULK_IN (EP2IN) +#define EPBULK_OUT_callback EP2_OUT_callback +#define EPBULK_IN_callback EP2_IN_callback +/* Interrupt endpoints */ +#define EPINT_OUT (EP1OUT) +#define EPINT_IN (EP1IN) +#define EPINT_OUT_callback EP1_OUT_callback +#define EPINT_IN_callback EP1_IN_callback +/* Isochronous endpoints */ +#define EPISO_OUT (EP3OUT) +#define EPISO_IN (EP3IN) +#define EPISO_OUT_callback EP3_OUT_callback +#define EPISO_IN_callback EP3_IN_callback + +#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) +#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) +#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_NXP/USBHAL_LPC11U.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,738 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#if defined(TARGET_LPC11UXX) || defined(TARGET_LPC11U6X) || defined(TARGET_LPC1347) || defined(TARGET_LPC1549) + +#if defined(TARGET_LPC1347) || defined(TARGET_LPC1549) +#define USB_IRQ USB_IRQ_IRQn +#else +#define USB_IRQ USB_IRQn +#endif + +#include "USBHAL.h" + +USBHAL * USBHAL::instance; +#if defined(TARGET_LPC1549) +static uint8_t usbmem[2048] __attribute__((aligned(2048))); +#endif + +// Valid physical endpoint numbers are 0 to (NUMBER_OF_PHYSICAL_ENDPOINTS-1) +#define LAST_PHYSICAL_ENDPOINT (NUMBER_OF_PHYSICAL_ENDPOINTS-1) + +// Convert physical endpoint number to register bit +#define EP(endpoint) (1UL<<endpoint) + +// Convert physical to logical +#define PHY_TO_LOG(endpoint) ((endpoint)>>1) + +// Get endpoint direction +#define IN_EP(endpoint) ((endpoint) & 1U ? true : false) +#define OUT_EP(endpoint) ((endpoint) & 1U ? false : true) + +// USB RAM +#if defined(TARGET_LPC1549) +#define USB_RAM_START ((uint32_t)usbmem) +#define USB_RAM_SIZE sizeof(usbmem) +#else +#define USB_RAM_START (0x20004000) +#define USB_RAM_SIZE (0x00000800) +#endif + +// SYSAHBCLKCTRL +#if defined(TARGET_LPC1549) +#define CLK_USB (1UL<<23) +#else +#define CLK_USB (1UL<<14) +#define CLK_USBRAM (1UL<<27) +#endif + +// USB Information register +#define FRAME_NR(a) ((a) & 0x7ff) // Frame number + +// USB Device Command/Status register +#define DEV_ADDR_MASK (0x7f) // Device address +#define DEV_ADDR(a) ((a) & DEV_ADDR_MASK) +#define DEV_EN (1UL<<7) // Device enable +#define SETUP (1UL<<8) // SETUP token received +#define PLL_ON (1UL<<9) // PLL enabled in suspend +#define DCON (1UL<<16) // Device status - connect +#define DSUS (1UL<<17) // Device status - suspend +#define DCON_C (1UL<<24) // Connect change +#define DSUS_C (1UL<<25) // Suspend change +#define DRES_C (1UL<<26) // Reset change +#define VBUSDEBOUNCED (1UL<<28) // Vbus detected + +// Endpoint Command/Status list +#define CMDSTS_A (1UL<<31) // Active +#define CMDSTS_D (1UL<<30) // Disable +#define CMDSTS_S (1UL<<29) // Stall +#define CMDSTS_TR (1UL<<28) // Toggle Reset +#define CMDSTS_RF (1UL<<27) // Rate Feedback mode +#define CMDSTS_TV (1UL<<27) // Toggle Value +#define CMDSTS_T (1UL<<26) // Endpoint Type +#define CMDSTS_NBYTES(n) (((n)&0x3ff)<<16) // Number of bytes +#define CMDSTS_ADDRESS_OFFSET(a) (((a)>>6)&0xffff) // Buffer start address + +#define BYTES_REMAINING(s) (((s)>>16)&0x3ff) // Bytes remaining after transfer + +// USB Non-endpoint interrupt sources +#define FRAME_INT (1UL<<30) +#define DEV_INT (1UL<<31) + +static volatile int epComplete = 0; + +// One entry for a double-buffered logical endpoint in the endpoint +// command/status list. Endpoint 0 is single buffered, out[1] is used +// for the SETUP packet and in[1] is not used +typedef struct { + uint32_t out[2]; + uint32_t in[2]; +} PACKED EP_COMMAND_STATUS; + +typedef struct { + uint8_t out[MAX_PACKET_SIZE_EP0]; + uint8_t in[MAX_PACKET_SIZE_EP0]; + uint8_t setup[SETUP_PACKET_SIZE]; +} PACKED CONTROL_TRANSFER; + +typedef struct { + uint32_t maxPacket; + uint32_t buffer[2]; + uint32_t options; +} PACKED EP_STATE; + +static volatile EP_STATE endpointState[NUMBER_OF_PHYSICAL_ENDPOINTS]; + +// Pointer to the endpoint command/status list +static EP_COMMAND_STATUS *ep = NULL; + +// Pointer to endpoint 0 data (IN/OUT and SETUP) +static CONTROL_TRANSFER *ct = NULL; + +// Shadow DEVCMDSTAT register to avoid accidentally clearing flags or +// initiating a remote wakeup event. +static volatile uint32_t devCmdStat; + +// Pointers used to allocate USB RAM +static uint32_t usbRamPtr = USB_RAM_START; +static uint32_t epRamPtr = 0; // Buffers for endpoints > 0 start here + +#define ROUND_UP_TO_MULTIPLE(x, m) ((((x)+((m)-1))/(m))*(m)) + +void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size); +void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size) { + if (size > 0) { + do { + *dst++ = *src++; + } while (--size > 0); + } +} + + +USBHAL::USBHAL(void) { + NVIC_DisableIRQ(USB_IRQ); + + // fill in callback array + epCallback[0] = &USBHAL::EP1_OUT_callback; + epCallback[1] = &USBHAL::EP1_IN_callback; + epCallback[2] = &USBHAL::EP2_OUT_callback; + epCallback[3] = &USBHAL::EP2_IN_callback; + epCallback[4] = &USBHAL::EP3_OUT_callback; + epCallback[5] = &USBHAL::EP3_IN_callback; + epCallback[6] = &USBHAL::EP4_OUT_callback; + epCallback[7] = &USBHAL::EP4_IN_callback; + +#if defined(TARGET_LPC1549) + /* Set USB PLL input to system oscillator */ + LPC_SYSCON->USBPLLCLKSEL = 0x01; + + /* Setup USB PLL (FCLKIN = 12MHz) * 4 = 48MHz + MSEL = 3 (this is pre-decremented), PSEL = 1 (for P = 2) + FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 4 = 48MHz + FCCO = FCLKOUT * 2 * P = 48MHz * 2 * 2 = 192MHz (within FCCO range) */ + LPC_SYSCON->USBPLLCTRL = (0x3 | (1UL << 6)); + + /* Powerup USB PLL */ + LPC_SYSCON->PDRUNCFG &= ~(CLK_USB); + + /* Wait for PLL to lock */ + while(!(LPC_SYSCON->USBPLLSTAT & 0x01)); + + /* enable USB main clock */ + LPC_SYSCON->USBCLKSEL = 0x02; + LPC_SYSCON->USBCLKDIV = 1; + + /* Enable AHB clock to the USB block. */ + LPC_SYSCON->SYSAHBCLKCTRL1 |= CLK_USB; + + /* power UP USB Phy */ + LPC_SYSCON->PDRUNCFG &= ~(1UL << 9); + + /* Reset USB block */ + LPC_SYSCON->PRESETCTRL1 |= (CLK_USB); + LPC_SYSCON->PRESETCTRL1 &= ~(CLK_USB); + +#else + #if defined(TARGET_LPC11U35_401) || defined(TARGET_LPC11U35_501) + // USB_VBUS input with pull-down + LPC_IOCON->PIO0_3 = 0x00000009; + #endif + + // nUSB_CONNECT output + LPC_IOCON->PIO0_6 = 0x00000001; + + // Enable clocks (USB registers, USB RAM) + LPC_SYSCON->SYSAHBCLKCTRL |= CLK_USB | CLK_USBRAM; + + // Ensure device disconnected (DCON not set) + LPC_USB->DEVCMDSTAT = 0; +#endif + // to ensure that the USB host sees the device as + // disconnected if the target CPU is reset. + wait(0.3); + + // Reserve space in USB RAM for endpoint command/status list + // Must be 256 byte aligned + usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 256); + ep = (EP_COMMAND_STATUS *)usbRamPtr; + usbRamPtr += (sizeof(EP_COMMAND_STATUS) * NUMBER_OF_LOGICAL_ENDPOINTS); + LPC_USB->EPLISTSTART = (uint32_t)(ep) & 0xffffff00; + + // Reserve space in USB RAM for Endpoint 0 + // Must be 64 byte aligned + usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 64); + ct = (CONTROL_TRANSFER *)usbRamPtr; + usbRamPtr += sizeof(CONTROL_TRANSFER); + LPC_USB->DATABUFSTART =(uint32_t)(ct) & 0xffc00000; + + // Setup command/status list for EP0 + ep[0].out[0] = 0; + ep[0].in[0] = 0; + ep[0].out[1] = CMDSTS_ADDRESS_OFFSET((uint32_t)ct->setup); + + // Route all interrupts to IRQ, some can be routed to + // USB_FIQ if you wish. + LPC_USB->INTROUTING = 0; + + // Set device address 0, enable USB device, no remote wakeup + devCmdStat = DEV_ADDR(0) | DEV_EN | DSUS; + LPC_USB->DEVCMDSTAT = devCmdStat; + + // Enable interrupts for device events and EP0 + LPC_USB->INTEN = DEV_INT | EP(EP0IN) | EP(EP0OUT) | FRAME_INT; + instance = this; + + //attach IRQ handler and enable interrupts + NVIC_SetVector(USB_IRQ, (uint32_t)&_usbisr); +} + +USBHAL::~USBHAL(void) { + // Ensure device disconnected (DCON not set) + LPC_USB->DEVCMDSTAT = 0; + // Disable USB interrupts + NVIC_DisableIRQ(USB_IRQ); +} + +void USBHAL::connect(void) { + NVIC_EnableIRQ(USB_IRQ); + devCmdStat |= DCON; + LPC_USB->DEVCMDSTAT = devCmdStat; +} + +void USBHAL::disconnect(void) { + NVIC_DisableIRQ(USB_IRQ); + devCmdStat &= ~DCON; + LPC_USB->DEVCMDSTAT = devCmdStat; +} + +void USBHAL::configureDevice(void) { + // Not required +} + +void USBHAL::unconfigureDevice(void) { + // Not required +} + +void USBHAL::EP0setup(uint8_t *buffer) { + // Copy setup packet data + USBMemCopy(buffer, ct->setup, SETUP_PACKET_SIZE); +} + +void USBHAL::EP0read(void) { + // Start an endpoint 0 read + + // The USB ISR will call USBDevice_EP0out() when a packet has been read, + // the USBDevice layer then calls USBBusInterface_EP0getReadResult() to + // read the data. + + ep[0].out[0] = CMDSTS_A |CMDSTS_NBYTES(MAX_PACKET_SIZE_EP0) \ + | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out); +} + +uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) { + // Complete an endpoint 0 read + uint32_t bytesRead; + + // Find how many bytes were read + bytesRead = MAX_PACKET_SIZE_EP0 - BYTES_REMAINING(ep[0].out[0]); + + // Copy data + USBMemCopy(buffer, ct->out, bytesRead); + return bytesRead; +} + + +void USBHAL::EP0readStage(void) { + // Not required +} + +void USBHAL::EP0write(uint8_t *buffer, uint32_t size) { + // Start and endpoint 0 write + + // The USB ISR will call USBDevice_EP0in() when the data has + // been written, the USBDevice layer then calls + // USBBusInterface_EP0getWriteResult() to complete the transaction. + + // Copy data + USBMemCopy(ct->in, buffer, size); + + // Start transfer + ep[0].in[0] = CMDSTS_A | CMDSTS_NBYTES(size) \ + | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->in); +} + + +EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) { + uint8_t bf = 0; + uint32_t flags = 0; + + //check which buffer must be filled + if (LPC_USB->EPBUFCFG & EP(endpoint)) { + // Double buffered + if (LPC_USB->EPINUSE & EP(endpoint)) { + bf = 1; + } else { + bf = 0; + } + } + + // if isochronous endpoint, T = 1 + if(endpointState[endpoint].options & ISOCHRONOUS) + { + flags |= CMDSTS_T; + } + + //Active the endpoint for reading + ep[PHY_TO_LOG(endpoint)].out[bf] = CMDSTS_A | CMDSTS_NBYTES(maximumSize) \ + | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out) | flags; + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead) { + + uint8_t bf = 0; + + if (!(epComplete & EP(endpoint))) + return EP_PENDING; + else { + epComplete &= ~EP(endpoint); + + //check which buffer has been filled + if (LPC_USB->EPBUFCFG & EP(endpoint)) { + // Double buffered (here we read the previous buffer which was used) + if (LPC_USB->EPINUSE & EP(endpoint)) { + bf = 0; + } else { + bf = 1; + } + } + + // Find how many bytes were read + *bytesRead = (uint32_t) (endpointState[endpoint].maxPacket - BYTES_REMAINING(ep[PHY_TO_LOG(endpoint)].out[bf])); + + // Copy data + USBMemCopy(data, ct->out, *bytesRead); + return EP_COMPLETED; + } +} + +void USBHAL::EP0getWriteResult(void) { + // Not required +} + +void USBHAL::EP0stall(void) { + ep[0].in[0] = CMDSTS_S; + ep[0].out[0] = CMDSTS_S; +} + +void USBHAL::setAddress(uint8_t address) { + devCmdStat &= ~DEV_ADDR_MASK; + devCmdStat |= DEV_ADDR(address); + LPC_USB->DEVCMDSTAT = devCmdStat; +} + +EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) { + uint32_t flags = 0; + uint32_t bf; + + // Validate parameters + if (data == NULL) { + return EP_INVALID; + } + + if (endpoint > LAST_PHYSICAL_ENDPOINT) { + return EP_INVALID; + } + + if ((endpoint==EP0IN) || (endpoint==EP0OUT)) { + return EP_INVALID; + } + + if (size > endpointState[endpoint].maxPacket) { + return EP_INVALID; + } + + if (LPC_USB->EPBUFCFG & EP(endpoint)) { + // Double buffered + if (LPC_USB->EPINUSE & EP(endpoint)) { + bf = 1; + } else { + bf = 0; + } + } else { + // Single buffered + bf = 0; + } + + // Check if already active + if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) { + return EP_INVALID; + } + + // Check if stalled + if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) { + return EP_STALLED; + } + + // Copy data to USB RAM + USBMemCopy((uint8_t *)endpointState[endpoint].buffer[bf], data, size); + + // Add options + if (endpointState[endpoint].options & RATE_FEEDBACK_MODE) { + flags |= CMDSTS_RF; + } + + if (endpointState[endpoint].options & ISOCHRONOUS) { + flags |= CMDSTS_T; + } + + // Add transfer + ep[PHY_TO_LOG(endpoint)].in[bf] = CMDSTS_ADDRESS_OFFSET( \ + endpointState[endpoint].buffer[bf]) \ + | CMDSTS_NBYTES(size) | CMDSTS_A | flags; + + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) { + uint32_t bf; + + // Validate parameters + if (endpoint > LAST_PHYSICAL_ENDPOINT) { + return EP_INVALID; + } + + if (OUT_EP(endpoint)) { + return EP_INVALID; + } + + if (LPC_USB->EPBUFCFG & EP(endpoint)) { + // Double buffered // TODO: FIX THIS + if (LPC_USB->EPINUSE & EP(endpoint)) { + bf = 1; + } else { + bf = 0; + } + } else { + // Single buffered + bf = 0; + } + + // Check if endpoint still active + if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) { + return EP_PENDING; + } + + // Check if stalled + if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) { + return EP_STALLED; + } + + return EP_COMPLETED; +} + +void USBHAL::stallEndpoint(uint8_t endpoint) { + + // FIX: should this clear active bit? + if (IN_EP(endpoint)) { + ep[PHY_TO_LOG(endpoint)].in[0] |= CMDSTS_S; + ep[PHY_TO_LOG(endpoint)].in[1] |= CMDSTS_S; + } else { + ep[PHY_TO_LOG(endpoint)].out[0] |= CMDSTS_S; + ep[PHY_TO_LOG(endpoint)].out[1] |= CMDSTS_S; + } +} + +void USBHAL::unstallEndpoint(uint8_t endpoint) { + if (LPC_USB->EPBUFCFG & EP(endpoint)) { + // Double buffered + if (IN_EP(endpoint)) { + ep[PHY_TO_LOG(endpoint)].in[0] = 0; // S = 0 + ep[PHY_TO_LOG(endpoint)].in[1] = 0; // S = 0 + + if (LPC_USB->EPINUSE & EP(endpoint)) { + ep[PHY_TO_LOG(endpoint)].in[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0 + } else { + ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0 + } + } else { + ep[PHY_TO_LOG(endpoint)].out[0] = 0; // S = 0 + ep[PHY_TO_LOG(endpoint)].out[1] = 0; // S = 0 + + if (LPC_USB->EPINUSE & EP(endpoint)) { + ep[PHY_TO_LOG(endpoint)].out[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0 + } else { + ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0 + } + } + } else { + // Single buffered + if (IN_EP(endpoint)) { + ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0 + } else { + ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0 + } + } +} + +bool USBHAL::getEndpointStallState(unsigned char endpoint) { + if (IN_EP(endpoint)) { + if (LPC_USB->EPINUSE & EP(endpoint)) { + if (ep[PHY_TO_LOG(endpoint)].in[1] & CMDSTS_S) { + return true; + } + } else { + if (ep[PHY_TO_LOG(endpoint)].in[0] & CMDSTS_S) { + return true; + } + } + } else { + if (LPC_USB->EPINUSE & EP(endpoint)) { + if (ep[PHY_TO_LOG(endpoint)].out[1] & CMDSTS_S) { + return true; + } + } else { + if (ep[PHY_TO_LOG(endpoint)].out[0] & CMDSTS_S) { + return true; + } + } + } + + return false; +} + +bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options) { + uint32_t tmpEpRamPtr; + + if (endpoint > LAST_PHYSICAL_ENDPOINT) { + return false; + } + + // Not applicable to the control endpoints + if ((endpoint==EP0IN) || (endpoint==EP0OUT)) { + return false; + } + + // Allocate buffers in USB RAM + tmpEpRamPtr = epRamPtr; + + // Must be 64 byte aligned + tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64); + + if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) { + // Out of memory + return false; + } + + // Allocate first buffer + endpointState[endpoint].buffer[0] = tmpEpRamPtr; + tmpEpRamPtr += maxPacket; + + if (!(options & SINGLE_BUFFERED)) { + // Must be 64 byte aligned + tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64); + + if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) { + // Out of memory + return false; + } + + // Allocate second buffer + endpointState[endpoint].buffer[1] = tmpEpRamPtr; + tmpEpRamPtr += maxPacket; + } + + // Commit to this USB RAM allocation + epRamPtr = tmpEpRamPtr; + + // Remaining endpoint state values + endpointState[endpoint].maxPacket = maxPacket; + endpointState[endpoint].options = options; + + // Enable double buffering if required + if (options & SINGLE_BUFFERED) { + LPC_USB->EPBUFCFG &= ~EP(endpoint); + } else { + // Double buffered + LPC_USB->EPBUFCFG |= EP(endpoint); + } + + // Enable interrupt + LPC_USB->INTEN |= EP(endpoint); + + // Enable endpoint + unstallEndpoint(endpoint); + return true; +} + +void USBHAL::remoteWakeup(void) { + // Clearing DSUS bit initiates a remote wakeup if the + // device is currently enabled and suspended - otherwise + // it has no effect. + LPC_USB->DEVCMDSTAT = devCmdStat & ~DSUS; +} + + +static void disableEndpoints(void) { + uint32_t logEp; + + // Ref. Table 158 "When a bus reset is received, software + // must set the disable bit of all endpoints to 1". + + for (logEp = 1; logEp < NUMBER_OF_LOGICAL_ENDPOINTS; logEp++) { + ep[logEp].out[0] = CMDSTS_D; + ep[logEp].out[1] = CMDSTS_D; + ep[logEp].in[0] = CMDSTS_D; + ep[logEp].in[1] = CMDSTS_D; + } + + // Start of USB RAM for endpoints > 0 + epRamPtr = usbRamPtr; +} + + + +void USBHAL::_usbisr(void) { + instance->usbisr(); +} + +void USBHAL::usbisr(void) { + // Start of frame + if (LPC_USB->INTSTAT & FRAME_INT) { + // Clear SOF interrupt + LPC_USB->INTSTAT = FRAME_INT; + + // SOF event, read frame number + SOF(FRAME_NR(LPC_USB->INFO)); + } + + // Device state + if (LPC_USB->INTSTAT & DEV_INT) { + LPC_USB->INTSTAT = DEV_INT; + + if (LPC_USB->DEVCMDSTAT & DSUS_C) { + // Suspend status changed + LPC_USB->DEVCMDSTAT = devCmdStat | DSUS_C; + if (LPC_USB->DEVCMDSTAT & DSUS) { + suspendStateChanged(1); + } else { + suspendStateChanged(0); + } + } + + if (LPC_USB->DEVCMDSTAT & DRES_C) { + // Bus reset + LPC_USB->DEVCMDSTAT = devCmdStat | DRES_C; + + // Disable endpoints > 0 + disableEndpoints(); + + // Bus reset event + busReset(); + } + } + + // Endpoint 0 + if (LPC_USB->INTSTAT & EP(EP0OUT)) { + // Clear EP0OUT/SETUP interrupt + LPC_USB->INTSTAT = EP(EP0OUT); + + // Check if SETUP + if (LPC_USB->DEVCMDSTAT & SETUP) { + // Clear Active and Stall bits for EP0 + // Documentation does not make it clear if we must use the + // EPSKIP register to achieve this, Fig. 16 and NXP reference + // code suggests we can just clear the Active bits - check with + // NXP to be sure. + ep[0].in[0] = 0; + ep[0].out[0] = 0; + + // Clear EP0IN interrupt + LPC_USB->INTSTAT = EP(EP0IN); + + // Clear SETUP (and INTONNAK_CI/O) in device status register + LPC_USB->DEVCMDSTAT = devCmdStat | SETUP; + + // EP0 SETUP event (SETUP data received) + EP0setupCallback(); + } else { + // EP0OUT ACK event (OUT data received) + EP0out(); + } + } + + if (LPC_USB->INTSTAT & EP(EP0IN)) { + // Clear EP0IN interrupt + LPC_USB->INTSTAT = EP(EP0IN); + + // EP0IN ACK event (IN data sent) + EP0in(); + } + + for (uint8_t num = 2; num < 5*2; num++) { + if (LPC_USB->INTSTAT & EP(num)) { + LPC_USB->INTSTAT = EP(num); + epComplete |= EP(num); + if ((instance->*(epCallback[num - 2]))()) { + epComplete &= ~EP(num); + } + } + } +} + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_NXP/USBHAL_LPC17.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,623 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC2460) + +#include "USBHAL.h" + + +// Get endpoint direction +#define IN_EP(endpoint) ((endpoint) & 1U ? true : false) +#define OUT_EP(endpoint) ((endpoint) & 1U ? false : true) + +// Convert physical endpoint number to register bit +#define EP(endpoint) (1UL<<endpoint) + +// Power Control for Peripherals register +#define PCUSB (1UL<<31) + +// USB Clock Control register +#define DEV_CLK_EN (1UL<<1) +#define AHB_CLK_EN (1UL<<4) + +// USB Clock Status register +#define DEV_CLK_ON (1UL<<1) +#define AHB_CLK_ON (1UL<<4) + +// USB Device Interupt registers +#define FRAME (1UL<<0) +#define EP_FAST (1UL<<1) +#define EP_SLOW (1UL<<2) +#define DEV_STAT (1UL<<3) +#define CCEMPTY (1UL<<4) +#define CDFULL (1UL<<5) +#define RxENDPKT (1UL<<6) +#define TxENDPKT (1UL<<7) +#define EP_RLZED (1UL<<8) +#define ERR_INT (1UL<<9) + +// USB Control register +#define RD_EN (1<<0) +#define WR_EN (1<<1) +#define LOG_ENDPOINT(endpoint) ((endpoint>>1)<<2) + +// USB Receive Packet Length register +#define DV (1UL<<10) +#define PKT_RDY (1UL<<11) +#define PKT_LNGTH_MASK (0x3ff) + +// Serial Interface Engine (SIE) +#define SIE_WRITE (0x01) +#define SIE_READ (0x02) +#define SIE_COMMAND (0x05) +#define SIE_CMD_CODE(phase, data) ((phase<<8)|(data<<16)) + +// SIE Command codes +#define SIE_CMD_SET_ADDRESS (0xD0) +#define SIE_CMD_CONFIGURE_DEVICE (0xD8) +#define SIE_CMD_SET_MODE (0xF3) +#define SIE_CMD_READ_FRAME_NUMBER (0xF5) +#define SIE_CMD_READ_TEST_REGISTER (0xFD) +#define SIE_CMD_SET_DEVICE_STATUS (0xFE) +#define SIE_CMD_GET_DEVICE_STATUS (0xFE) +#define SIE_CMD_GET_ERROR_CODE (0xFF) +#define SIE_CMD_READ_ERROR_STATUS (0xFB) + +#define SIE_CMD_SELECT_ENDPOINT(endpoint) (0x00+endpoint) +#define SIE_CMD_SELECT_ENDPOINT_CLEAR_INTERRUPT(endpoint) (0x40+endpoint) +#define SIE_CMD_SET_ENDPOINT_STATUS(endpoint) (0x40+endpoint) + +#define SIE_CMD_CLEAR_BUFFER (0xF2) +#define SIE_CMD_VALIDATE_BUFFER (0xFA) + +// SIE Device Status register +#define SIE_DS_CON (1<<0) +#define SIE_DS_CON_CH (1<<1) +#define SIE_DS_SUS (1<<2) +#define SIE_DS_SUS_CH (1<<3) +#define SIE_DS_RST (1<<4) + +// SIE Device Set Address register +#define SIE_DSA_DEV_EN (1<<7) + +// SIE Configue Device register +#define SIE_CONF_DEVICE (1<<0) + +// Select Endpoint register +#define SIE_SE_FE (1<<0) +#define SIE_SE_ST (1<<1) +#define SIE_SE_STP (1<<2) +#define SIE_SE_PO (1<<3) +#define SIE_SE_EPN (1<<4) +#define SIE_SE_B_1_FULL (1<<5) +#define SIE_SE_B_2_FULL (1<<6) + +// Set Endpoint Status command +#define SIE_SES_ST (1<<0) +#define SIE_SES_DA (1<<5) +#define SIE_SES_RF_MO (1<<6) +#define SIE_SES_CND_ST (1<<7) + + +USBHAL * USBHAL::instance; + +static volatile int epComplete; +static uint32_t endpointStallState; + +static void SIECommand(uint32_t command) { + // The command phase of a SIE transaction + LPC_USB->USBDevIntClr = CCEMPTY; + LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_COMMAND, command); + while (!(LPC_USB->USBDevIntSt & CCEMPTY)); +} + +static void SIEWriteData(uint8_t data) { + // The data write phase of a SIE transaction + LPC_USB->USBDevIntClr = CCEMPTY; + LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_WRITE, data); + while (!(LPC_USB->USBDevIntSt & CCEMPTY)); +} + +static uint8_t SIEReadData(uint32_t command) { + // The data read phase of a SIE transaction + LPC_USB->USBDevIntClr = CDFULL; + LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_READ, command); + while (!(LPC_USB->USBDevIntSt & CDFULL)); + return (uint8_t)LPC_USB->USBCmdData; +} + +static void SIEsetDeviceStatus(uint8_t status) { + // Write SIE device status register + SIECommand(SIE_CMD_SET_DEVICE_STATUS); + SIEWriteData(status); +} + +static uint8_t SIEgetDeviceStatus(void) { + // Read SIE device status register + SIECommand(SIE_CMD_GET_DEVICE_STATUS); + return SIEReadData(SIE_CMD_GET_DEVICE_STATUS); +} + +void SIEsetAddress(uint8_t address) { + // Write SIE device address register + SIECommand(SIE_CMD_SET_ADDRESS); + SIEWriteData((address & 0x7f) | SIE_DSA_DEV_EN); +} + +static uint8_t SIEselectEndpoint(uint8_t endpoint) { + // SIE select endpoint command + SIECommand(SIE_CMD_SELECT_ENDPOINT(endpoint)); + return SIEReadData(SIE_CMD_SELECT_ENDPOINT(endpoint)); +} + +static uint8_t SIEclearBuffer(void) { + // SIE clear buffer command + SIECommand(SIE_CMD_CLEAR_BUFFER); + return SIEReadData(SIE_CMD_CLEAR_BUFFER); +} + +static void SIEvalidateBuffer(void) { + // SIE validate buffer command + SIECommand(SIE_CMD_VALIDATE_BUFFER); +} + +static void SIEsetEndpointStatus(uint8_t endpoint, uint8_t status) { + // SIE set endpoint status command + SIECommand(SIE_CMD_SET_ENDPOINT_STATUS(endpoint)); + SIEWriteData(status); +} + +static uint16_t SIEgetFrameNumber(void) __attribute__ ((unused)); +static uint16_t SIEgetFrameNumber(void) { + // Read current frame number + uint16_t lowByte; + uint16_t highByte; + + SIECommand(SIE_CMD_READ_FRAME_NUMBER); + lowByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER); + highByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER); + + return (highByte << 8) | lowByte; +} + +static void SIEconfigureDevice(void) { + // SIE Configure device command + SIECommand(SIE_CMD_CONFIGURE_DEVICE); + SIEWriteData(SIE_CONF_DEVICE); +} + +static void SIEunconfigureDevice(void) { + // SIE Configure device command + SIECommand(SIE_CMD_CONFIGURE_DEVICE); + SIEWriteData(0); +} + +static void SIEconnect(void) { + // Connect USB device + uint8_t status = SIEgetDeviceStatus(); + SIEsetDeviceStatus(status | SIE_DS_CON); +} + + +static void SIEdisconnect(void) { + // Disconnect USB device + uint8_t status = SIEgetDeviceStatus(); + SIEsetDeviceStatus(status & ~SIE_DS_CON); +} + + +static uint8_t selectEndpointClearInterrupt(uint8_t endpoint) { + // Implemented using using EP_INT_CLR. + LPC_USB->USBEpIntClr = EP(endpoint); + while (!(LPC_USB->USBDevIntSt & CDFULL)); + return (uint8_t)LPC_USB->USBCmdData; +} + + +static void enableEndpointEvent(uint8_t endpoint) { + // Enable an endpoint interrupt + LPC_USB->USBEpIntEn |= EP(endpoint); +} + +static void disableEndpointEvent(uint8_t endpoint) __attribute__ ((unused)); +static void disableEndpointEvent(uint8_t endpoint) { + // Disable an endpoint interrupt + LPC_USB->USBEpIntEn &= ~EP(endpoint); +} + +static volatile uint32_t __attribute__((used)) dummyRead; +uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) { + // Read from an OUT endpoint + uint32_t size; + uint32_t i; + uint32_t data = 0; + uint8_t offset; + + LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | RD_EN; + while (!(LPC_USB->USBRxPLen & PKT_RDY)); + + size = LPC_USB->USBRxPLen & PKT_LNGTH_MASK; + + offset = 0; + + if (size > 0) { + for (i=0; i<size; i++) { + if (offset==0) { + // Fetch up to four bytes of data as a word + data = LPC_USB->USBRxData; + } + + // extract a byte + *buffer = (data>>offset) & 0xff; + buffer++; + + // move on to the next byte + offset = (offset + 8) % 32; + } + } else { + dummyRead = LPC_USB->USBRxData; + } + + LPC_USB->USBCtrl = 0; + + if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) { + SIEselectEndpoint(endpoint); + SIEclearBuffer(); + } + + return size; +} + +static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size) { + // Write to an IN endpoint + uint32_t temp, data; + uint8_t offset; + + LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | WR_EN; + + LPC_USB->USBTxPLen = size; + offset = 0; + data = 0; + + if (size>0) { + do { + // Fetch next data byte into a word-sized temporary variable + temp = *buffer++; + + // Add to current data word + temp = temp << offset; + data = data | temp; + + // move on to the next byte + offset = (offset + 8) % 32; + size--; + + if ((offset==0) || (size==0)) { + // Write the word to the endpoint + LPC_USB->USBTxData = data; + data = 0; + } + } while (size>0); + } else { + LPC_USB->USBTxData = 0; + } + + // Clear WR_EN to cover zero length packet case + LPC_USB->USBCtrl=0; + + SIEselectEndpoint(endpoint); + SIEvalidateBuffer(); +} + +USBHAL::USBHAL(void) { + // Disable IRQ + NVIC_DisableIRQ(USB_IRQn); + + // fill in callback array + epCallback[0] = &USBHAL::EP1_OUT_callback; + epCallback[1] = &USBHAL::EP1_IN_callback; + epCallback[2] = &USBHAL::EP2_OUT_callback; + epCallback[3] = &USBHAL::EP2_IN_callback; + epCallback[4] = &USBHAL::EP3_OUT_callback; + epCallback[5] = &USBHAL::EP3_IN_callback; + epCallback[6] = &USBHAL::EP4_OUT_callback; + epCallback[7] = &USBHAL::EP4_IN_callback; + epCallback[8] = &USBHAL::EP5_OUT_callback; + epCallback[9] = &USBHAL::EP5_IN_callback; + epCallback[10] = &USBHAL::EP6_OUT_callback; + epCallback[11] = &USBHAL::EP6_IN_callback; + epCallback[12] = &USBHAL::EP7_OUT_callback; + epCallback[13] = &USBHAL::EP7_IN_callback; + epCallback[14] = &USBHAL::EP8_OUT_callback; + epCallback[15] = &USBHAL::EP8_IN_callback; + epCallback[16] = &USBHAL::EP9_OUT_callback; + epCallback[17] = &USBHAL::EP9_IN_callback; + epCallback[18] = &USBHAL::EP10_OUT_callback; + epCallback[19] = &USBHAL::EP10_IN_callback; + epCallback[20] = &USBHAL::EP11_OUT_callback; + epCallback[21] = &USBHAL::EP11_IN_callback; + epCallback[22] = &USBHAL::EP12_OUT_callback; + epCallback[23] = &USBHAL::EP12_IN_callback; + epCallback[24] = &USBHAL::EP13_OUT_callback; + epCallback[25] = &USBHAL::EP13_IN_callback; + epCallback[26] = &USBHAL::EP14_OUT_callback; + epCallback[27] = &USBHAL::EP14_IN_callback; + epCallback[28] = &USBHAL::EP15_OUT_callback; + epCallback[29] = &USBHAL::EP15_IN_callback; + + // Enable power to USB device controller + LPC_SC->PCONP |= PCUSB; + + // Enable USB clocks + LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN; + while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON)); + + // Configure pins P0.29 and P0.30 to be USB D+ and USB D- + LPC_PINCON->PINSEL1 &= 0xc3ffffff; + LPC_PINCON->PINSEL1 |= 0x14000000; + + // Disconnect USB device + SIEdisconnect(); + + // Configure pin P2.9 to be Connect + LPC_PINCON->PINSEL4 &= 0xfffcffff; + LPC_PINCON->PINSEL4 |= 0x00040000; + + // Connect must be low for at least 2.5uS + wait(0.3); + + // Set the maximum packet size for the control endpoints + realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0); + realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0); + + // Attach IRQ + instance = this; + NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr); + + // Enable interrupts for device events and EP0 + LPC_USB->USBDevIntEn = EP_SLOW | DEV_STAT | FRAME; + enableEndpointEvent(EP0IN); + enableEndpointEvent(EP0OUT); +} + +USBHAL::~USBHAL(void) { + // Ensure device disconnected + SIEdisconnect(); + // Disable USB interrupts + NVIC_DisableIRQ(USB_IRQn); +} + +void USBHAL::connect(void) { + NVIC_EnableIRQ(USB_IRQn); + // Connect USB device + SIEconnect(); +} + +void USBHAL::disconnect(void) { + NVIC_DisableIRQ(USB_IRQn); + // Disconnect USB device + SIEdisconnect(); +} + +void USBHAL::configureDevice(void) { + SIEconfigureDevice(); +} + +void USBHAL::unconfigureDevice(void) { + SIEunconfigureDevice(); +} + +void USBHAL::setAddress(uint8_t address) { + SIEsetAddress(address); +} + +void USBHAL::EP0setup(uint8_t *buffer) { + endpointReadcore(EP0OUT, buffer); +} + +void USBHAL::EP0read(void) { + // Not required +} + +void USBHAL::EP0readStage(void) { + // Not required +} + +uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) { + return endpointReadcore(EP0OUT, buffer); +} + +void USBHAL::EP0write(uint8_t *buffer, uint32_t size) { + endpointWritecore(EP0IN, buffer, size); +} + +void USBHAL::EP0getWriteResult(void) { + // Not required +} + +void USBHAL::EP0stall(void) { + // This will stall both control endpoints + stallEndpoint(EP0OUT); +} + +EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) { + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) { + + //for isochronous endpoint, we don't wait an interrupt + if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) { + if (!(epComplete & EP(endpoint))) + return EP_PENDING; + } + + *bytesRead = endpointReadcore(endpoint, buffer); + epComplete &= ~EP(endpoint); + return EP_COMPLETED; +} + +EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) { + if (getEndpointStallState(endpoint)) { + return EP_STALLED; + } + + epComplete &= ~EP(endpoint); + + endpointWritecore(endpoint, data, size); + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) { + if (epComplete & EP(endpoint)) { + epComplete &= ~EP(endpoint); + return EP_COMPLETED; + } + + return EP_PENDING; +} + +bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) { + // Realise an endpoint + LPC_USB->USBDevIntClr = EP_RLZED; + LPC_USB->USBReEp |= EP(endpoint); + LPC_USB->USBEpInd = endpoint; + LPC_USB->USBMaxPSize = maxPacket; + + while (!(LPC_USB->USBDevIntSt & EP_RLZED)); + LPC_USB->USBDevIntClr = EP_RLZED; + + // Clear stall state + endpointStallState &= ~EP(endpoint); + + enableEndpointEvent(endpoint); + return true; +} + +void USBHAL::stallEndpoint(uint8_t endpoint) { + // Stall an endpoint + if ( (endpoint==EP0IN) || (endpoint==EP0OUT) ) { + // Conditionally stall both control endpoints + SIEsetEndpointStatus(EP0OUT, SIE_SES_CND_ST); + } else { + SIEsetEndpointStatus(endpoint, SIE_SES_ST); + + // Update stall state + endpointStallState |= EP(endpoint); + } +} + +void USBHAL::unstallEndpoint(uint8_t endpoint) { + // Unstall an endpoint. The endpoint will also be reinitialised + SIEsetEndpointStatus(endpoint, 0); + + // Update stall state + endpointStallState &= ~EP(endpoint); +} + +bool USBHAL::getEndpointStallState(uint8_t endpoint) { + // Returns true if endpoint stalled + return endpointStallState & EP(endpoint); +} + +void USBHAL::remoteWakeup(void) { + // Remote wakeup + uint8_t status; + + // Enable USB clocks + LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN; + while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON)); + + status = SIEgetDeviceStatus(); + SIEsetDeviceStatus(status & ~SIE_DS_SUS); +} + +void USBHAL::_usbisr(void) { + instance->usbisr(); +} + + +void USBHAL::usbisr(void) { + uint8_t devStat; + + if (LPC_USB->USBDevIntSt & FRAME) { + // Start of frame event + SOF(SIEgetFrameNumber()); + // Clear interrupt status flag + LPC_USB->USBDevIntClr = FRAME; + } + + if (LPC_USB->USBDevIntSt & DEV_STAT) { + // Device Status interrupt + // Must clear the interrupt status flag before reading the device status from the SIE + LPC_USB->USBDevIntClr = DEV_STAT; + + // Read device status from SIE + devStat = SIEgetDeviceStatus(); + //printf("devStat: %d\r\n", devStat); + + if (devStat & SIE_DS_SUS_CH) { + // Suspend status changed + if((devStat & SIE_DS_SUS) != 0) { + suspendStateChanged(0); + } + } + + if (devStat & SIE_DS_RST) { + // Bus reset + if((devStat & SIE_DS_SUS) == 0) { + suspendStateChanged(1); + } + busReset(); + } + } + + if (LPC_USB->USBDevIntSt & EP_SLOW) { + // (Slow) Endpoint Interrupt + + // Process each endpoint interrupt + if (LPC_USB->USBEpIntSt & EP(EP0OUT)) { + if (selectEndpointClearInterrupt(EP0OUT) & SIE_SE_STP) { + // this is a setup packet + EP0setupCallback(); + } else { + EP0out(); + } + LPC_USB->USBDevIntClr = EP_SLOW; + } + + if (LPC_USB->USBEpIntSt & EP(EP0IN)) { + selectEndpointClearInterrupt(EP0IN); + LPC_USB->USBDevIntClr = EP_SLOW; + EP0in(); + } + + for (uint8_t num = 2; num < 16*2; num++) { + if (LPC_USB->USBEpIntSt & EP(num)) { + selectEndpointClearInterrupt(num); + epComplete |= EP(num); + LPC_USB->USBDevIntClr = EP_SLOW; + if ((instance->*(epCallback[num - 2]))()) { + epComplete &= ~EP(num); + } + } + } + } +} + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_NXP/USBHAL_LPC40.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,628 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#if defined(TARGET_LPC4088) || defined(TARGET_LPC4088_DM) + +#include "USBHAL.h" + + +// Get endpoint direction +#define IN_EP(endpoint) ((endpoint) & 1U ? true : false) +#define OUT_EP(endpoint) ((endpoint) & 1U ? false : true) + +// Convert physical endpoint number to register bit +#define EP(endpoint) (1UL<<endpoint) + +// Power Control for Peripherals register +#define PCUSB (1UL<<31) + +// USB Clock Control register +#define DEV_CLK_EN (1UL<<1) +#define PORT_CLK_EN (1UL<<3) +#define AHB_CLK_EN (1UL<<4) + +// USB Clock Status register +#define DEV_CLK_ON (1UL<<1) +#define AHB_CLK_ON (1UL<<4) + +// USB Device Interupt registers +#define FRAME (1UL<<0) +#define EP_FAST (1UL<<1) +#define EP_SLOW (1UL<<2) +#define DEV_STAT (1UL<<3) +#define CCEMPTY (1UL<<4) +#define CDFULL (1UL<<5) +#define RxENDPKT (1UL<<6) +#define TxENDPKT (1UL<<7) +#define EP_RLZED (1UL<<8) +#define ERR_INT (1UL<<9) + +// USB Control register +#define RD_EN (1<<0) +#define WR_EN (1<<1) +#define LOG_ENDPOINT(endpoint) ((endpoint>>1)<<2) + +// USB Receive Packet Length register +#define DV (1UL<<10) +#define PKT_RDY (1UL<<11) +#define PKT_LNGTH_MASK (0x3ff) + +// Serial Interface Engine (SIE) +#define SIE_WRITE (0x01) +#define SIE_READ (0x02) +#define SIE_COMMAND (0x05) +#define SIE_CMD_CODE(phase, data) ((phase<<8)|(data<<16)) + +// SIE Command codes +#define SIE_CMD_SET_ADDRESS (0xD0) +#define SIE_CMD_CONFIGURE_DEVICE (0xD8) +#define SIE_CMD_SET_MODE (0xF3) +#define SIE_CMD_READ_FRAME_NUMBER (0xF5) +#define SIE_CMD_READ_TEST_REGISTER (0xFD) +#define SIE_CMD_SET_DEVICE_STATUS (0xFE) +#define SIE_CMD_GET_DEVICE_STATUS (0xFE) +#define SIE_CMD_GET_ERROR_CODE (0xFF) +#define SIE_CMD_READ_ERROR_STATUS (0xFB) + +#define SIE_CMD_SELECT_ENDPOINT(endpoint) (0x00+endpoint) +#define SIE_CMD_SELECT_ENDPOINT_CLEAR_INTERRUPT(endpoint) (0x40+endpoint) +#define SIE_CMD_SET_ENDPOINT_STATUS(endpoint) (0x40+endpoint) + +#define SIE_CMD_CLEAR_BUFFER (0xF2) +#define SIE_CMD_VALIDATE_BUFFER (0xFA) + +// SIE Device Status register +#define SIE_DS_CON (1<<0) +#define SIE_DS_CON_CH (1<<1) +#define SIE_DS_SUS (1<<2) +#define SIE_DS_SUS_CH (1<<3) +#define SIE_DS_RST (1<<4) + +// SIE Device Set Address register +#define SIE_DSA_DEV_EN (1<<7) + +// SIE Configue Device register +#define SIE_CONF_DEVICE (1<<0) + +// Select Endpoint register +#define SIE_SE_FE (1<<0) +#define SIE_SE_ST (1<<1) +#define SIE_SE_STP (1<<2) +#define SIE_SE_PO (1<<3) +#define SIE_SE_EPN (1<<4) +#define SIE_SE_B_1_FULL (1<<5) +#define SIE_SE_B_2_FULL (1<<6) + +// Set Endpoint Status command +#define SIE_SES_ST (1<<0) +#define SIE_SES_DA (1<<5) +#define SIE_SES_RF_MO (1<<6) +#define SIE_SES_CND_ST (1<<7) + + +USBHAL * USBHAL::instance; + +static volatile int epComplete; +static uint32_t endpointStallState; + +static void SIECommand(uint32_t command) { + // The command phase of a SIE transaction + LPC_USB->DevIntClr = CCEMPTY; + LPC_USB->CmdCode = SIE_CMD_CODE(SIE_COMMAND, command); + while (!(LPC_USB->DevIntSt & CCEMPTY)); +} + +static void SIEWriteData(uint8_t data) { + // The data write phase of a SIE transaction + LPC_USB->DevIntClr = CCEMPTY; + LPC_USB->CmdCode = SIE_CMD_CODE(SIE_WRITE, data); + while (!(LPC_USB->DevIntSt & CCEMPTY)); +} + +static uint8_t SIEReadData(uint32_t command) { + // The data read phase of a SIE transaction + LPC_USB->DevIntClr = CDFULL; + LPC_USB->CmdCode = SIE_CMD_CODE(SIE_READ, command); + while (!(LPC_USB->DevIntSt & CDFULL)); + return (uint8_t)LPC_USB->CmdData; +} + +static void SIEsetDeviceStatus(uint8_t status) { + // Write SIE device status register + SIECommand(SIE_CMD_SET_DEVICE_STATUS); + SIEWriteData(status); +} + +static uint8_t SIEgetDeviceStatus(void) { + // Read SIE device status register + SIECommand(SIE_CMD_GET_DEVICE_STATUS); + return SIEReadData(SIE_CMD_GET_DEVICE_STATUS); +} + +void SIEsetAddress(uint8_t address) { + // Write SIE device address register + SIECommand(SIE_CMD_SET_ADDRESS); + SIEWriteData((address & 0x7f) | SIE_DSA_DEV_EN); +} + +static uint8_t SIEselectEndpoint(uint8_t endpoint) { + // SIE select endpoint command + SIECommand(SIE_CMD_SELECT_ENDPOINT(endpoint)); + return SIEReadData(SIE_CMD_SELECT_ENDPOINT(endpoint)); +} + +static uint8_t SIEclearBuffer(void) { + // SIE clear buffer command + SIECommand(SIE_CMD_CLEAR_BUFFER); + return SIEReadData(SIE_CMD_CLEAR_BUFFER); +} + +static void SIEvalidateBuffer(void) { + // SIE validate buffer command + SIECommand(SIE_CMD_VALIDATE_BUFFER); +} + +static void SIEsetEndpointStatus(uint8_t endpoint, uint8_t status) { + // SIE set endpoint status command + SIECommand(SIE_CMD_SET_ENDPOINT_STATUS(endpoint)); + SIEWriteData(status); +} + +static uint16_t SIEgetFrameNumber(void) __attribute__ ((unused)); +static uint16_t SIEgetFrameNumber(void) { + // Read current frame number + uint16_t lowByte; + uint16_t highByte; + + SIECommand(SIE_CMD_READ_FRAME_NUMBER); + lowByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER); + highByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER); + + return (highByte << 8) | lowByte; +} + +static void SIEconfigureDevice(void) { + // SIE Configure device command + SIECommand(SIE_CMD_CONFIGURE_DEVICE); + SIEWriteData(SIE_CONF_DEVICE); +} + +static void SIEunconfigureDevice(void) { + // SIE Configure device command + SIECommand(SIE_CMD_CONFIGURE_DEVICE); + SIEWriteData(0); +} + +static void SIEconnect(void) { + // Connect USB device + uint8_t status = SIEgetDeviceStatus(); + SIEsetDeviceStatus(status | SIE_DS_CON); +} + + +static void SIEdisconnect(void) { + // Disconnect USB device + uint8_t status = SIEgetDeviceStatus(); + SIEsetDeviceStatus(status & ~SIE_DS_CON); +} + + +static uint8_t selectEndpointClearInterrupt(uint8_t endpoint) { + // Implemented using using EP_INT_CLR. + LPC_USB->EpIntClr = EP(endpoint); + while (!(LPC_USB->DevIntSt & CDFULL)); + return (uint8_t)LPC_USB->CmdData; +} + + +static void enableEndpointEvent(uint8_t endpoint) { + // Enable an endpoint interrupt + LPC_USB->EpIntEn |= EP(endpoint); +} + +static void disableEndpointEvent(uint8_t endpoint) __attribute__ ((unused)); +static void disableEndpointEvent(uint8_t endpoint) { + // Disable an endpoint interrupt + LPC_USB->EpIntEn &= ~EP(endpoint); +} + +static volatile uint32_t __attribute__((used)) dummyRead; +uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) { + // Read from an OUT endpoint + uint32_t size; + uint32_t i; + uint32_t data = 0; + uint8_t offset; + + LPC_USB->Ctrl = LOG_ENDPOINT(endpoint) | RD_EN; + while (!(LPC_USB->RxPLen & PKT_RDY)); + + size = LPC_USB->RxPLen & PKT_LNGTH_MASK; + + offset = 0; + + if (size > 0) { + for (i=0; i<size; i++) { + if (offset==0) { + // Fetch up to four bytes of data as a word + data = LPC_USB->RxData; + } + + // extract a byte + *buffer = (data>>offset) & 0xff; + buffer++; + + // move on to the next byte + offset = (offset + 8) % 32; + } + } else { + dummyRead = LPC_USB->RxData; + } + + LPC_USB->Ctrl = 0; + + if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) { + SIEselectEndpoint(endpoint); + SIEclearBuffer(); + } + + return size; +} + +static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size) { + // Write to an IN endpoint + uint32_t temp, data; + uint8_t offset; + + LPC_USB->Ctrl = LOG_ENDPOINT(endpoint) | WR_EN; + + LPC_USB->TxPLen = size; + offset = 0; + data = 0; + + if (size>0) { + do { + // Fetch next data byte into a word-sized temporary variable + temp = *buffer++; + + // Add to current data word + temp = temp << offset; + data = data | temp; + + // move on to the next byte + offset = (offset + 8) % 32; + size--; + + if ((offset==0) || (size==0)) { + // Write the word to the endpoint + LPC_USB->TxData = data; + data = 0; + } + } while (size>0); + } else { + LPC_USB->TxData = 0; + } + + // Clear WR_EN to cover zero length packet case + LPC_USB->Ctrl=0; + + SIEselectEndpoint(endpoint); + SIEvalidateBuffer(); +} + +USBHAL::USBHAL(void) { + // Disable IRQ + NVIC_DisableIRQ(USB_IRQn); + + // fill in callback array + epCallback[0] = &USBHAL::EP1_OUT_callback; + epCallback[1] = &USBHAL::EP1_IN_callback; + epCallback[2] = &USBHAL::EP2_OUT_callback; + epCallback[3] = &USBHAL::EP2_IN_callback; + epCallback[4] = &USBHAL::EP3_OUT_callback; + epCallback[5] = &USBHAL::EP3_IN_callback; + epCallback[6] = &USBHAL::EP4_OUT_callback; + epCallback[7] = &USBHAL::EP4_IN_callback; + epCallback[8] = &USBHAL::EP5_OUT_callback; + epCallback[9] = &USBHAL::EP5_IN_callback; + epCallback[10] = &USBHAL::EP6_OUT_callback; + epCallback[11] = &USBHAL::EP6_IN_callback; + epCallback[12] = &USBHAL::EP7_OUT_callback; + epCallback[13] = &USBHAL::EP7_IN_callback; + epCallback[14] = &USBHAL::EP8_OUT_callback; + epCallback[15] = &USBHAL::EP8_IN_callback; + epCallback[16] = &USBHAL::EP9_OUT_callback; + epCallback[17] = &USBHAL::EP9_IN_callback; + epCallback[18] = &USBHAL::EP10_OUT_callback; + epCallback[19] = &USBHAL::EP10_IN_callback; + epCallback[20] = &USBHAL::EP11_OUT_callback; + epCallback[21] = &USBHAL::EP11_IN_callback; + epCallback[22] = &USBHAL::EP12_OUT_callback; + epCallback[23] = &USBHAL::EP12_IN_callback; + epCallback[24] = &USBHAL::EP13_OUT_callback; + epCallback[25] = &USBHAL::EP13_IN_callback; + epCallback[26] = &USBHAL::EP14_OUT_callback; + epCallback[27] = &USBHAL::EP14_IN_callback; + epCallback[28] = &USBHAL::EP15_OUT_callback; + epCallback[29] = &USBHAL::EP15_IN_callback; + + // Enable power to USB device controller + LPC_SC->PCONP |= PCUSB; + + // Enable USB clocks + LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN | PORT_CLK_EN; + while ((LPC_USB->USBClkSt & (DEV_CLK_EN | AHB_CLK_EN | PORT_CLK_EN)) != (DEV_CLK_ON | AHB_CLK_ON | PORT_CLK_EN)); + + // Select port USB2 + LPC_USB->StCtrl |= 3; + + + // Configure pin P0.31 to be USB2 + LPC_IOCON->P0_31 &= ~0x07; + LPC_IOCON->P0_31 |= 0x01; + + // Disconnect USB device + SIEdisconnect(); + + // Configure pin P0.14 to be Connect + LPC_IOCON->P0_14 &= ~0x07; + LPC_IOCON->P0_14 |= 0x03; + + // Connect must be low for at least 2.5uS + wait(0.3); + + // Set the maximum packet size for the control endpoints + realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0); + realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0); + + // Attach IRQ + instance = this; + NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr); + + // Enable interrupts for device events and EP0 + LPC_USB->DevIntEn = EP_SLOW | DEV_STAT | FRAME; + enableEndpointEvent(EP0IN); + enableEndpointEvent(EP0OUT); +} + +USBHAL::~USBHAL(void) { + // Ensure device disconnected + SIEdisconnect(); + // Disable USB interrupts + NVIC_DisableIRQ(USB_IRQn); +} + +void USBHAL::connect(void) { + NVIC_EnableIRQ(USB_IRQn); + // Connect USB device + SIEconnect(); +} + +void USBHAL::disconnect(void) { + NVIC_DisableIRQ(USB_IRQn); + // Disconnect USB device + SIEdisconnect(); +} + +void USBHAL::configureDevice(void) { + SIEconfigureDevice(); +} + +void USBHAL::unconfigureDevice(void) { + SIEunconfigureDevice(); +} + +void USBHAL::setAddress(uint8_t address) { + SIEsetAddress(address); +} + +void USBHAL::EP0setup(uint8_t *buffer) { + endpointReadcore(EP0OUT, buffer); +} + +void USBHAL::EP0read(void) { + // Not required +} + +void USBHAL::EP0readStage(void) { + // Not required +} + +uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) { + return endpointReadcore(EP0OUT, buffer); +} + +void USBHAL::EP0write(uint8_t *buffer, uint32_t size) { + endpointWritecore(EP0IN, buffer, size); +} + +void USBHAL::EP0getWriteResult(void) { + // Not required +} + +void USBHAL::EP0stall(void) { + // This will stall both control endpoints + stallEndpoint(EP0OUT); +} + +EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) { + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) { + + //for isochronous endpoint, we don't wait an interrupt + if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) { + if (!(epComplete & EP(endpoint))) + return EP_PENDING; + } + + *bytesRead = endpointReadcore(endpoint, buffer); + epComplete &= ~EP(endpoint); + return EP_COMPLETED; +} + +EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) { + if (getEndpointStallState(endpoint)) { + return EP_STALLED; + } + + epComplete &= ~EP(endpoint); + + endpointWritecore(endpoint, data, size); + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) { + if (epComplete & EP(endpoint)) { + epComplete &= ~EP(endpoint); + return EP_COMPLETED; + } + + return EP_PENDING; +} + +bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) { + // Realise an endpoint + LPC_USB->DevIntClr = EP_RLZED; + LPC_USB->ReEp |= EP(endpoint); + LPC_USB->EpInd = endpoint; + LPC_USB->MaxPSize = maxPacket; + + while (!(LPC_USB->DevIntSt & EP_RLZED)); + LPC_USB->DevIntClr = EP_RLZED; + + // Clear stall state + endpointStallState &= ~EP(endpoint); + + enableEndpointEvent(endpoint); + return true; +} + +void USBHAL::stallEndpoint(uint8_t endpoint) { + // Stall an endpoint + if ( (endpoint==EP0IN) || (endpoint==EP0OUT) ) { + // Conditionally stall both control endpoints + SIEsetEndpointStatus(EP0OUT, SIE_SES_CND_ST); + } else { + SIEsetEndpointStatus(endpoint, SIE_SES_ST); + + // Update stall state + endpointStallState |= EP(endpoint); + } +} + +void USBHAL::unstallEndpoint(uint8_t endpoint) { + // Unstall an endpoint. The endpoint will also be reinitialised + SIEsetEndpointStatus(endpoint, 0); + + // Update stall state + endpointStallState &= ~EP(endpoint); +} + +bool USBHAL::getEndpointStallState(uint8_t endpoint) { + // Returns true if endpoint stalled + return endpointStallState & EP(endpoint); +} + +void USBHAL::remoteWakeup(void) { + // Remote wakeup + uint8_t status; + + // Enable USB clocks + LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN; + while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON)); + + status = SIEgetDeviceStatus(); + SIEsetDeviceStatus(status & ~SIE_DS_SUS); +} + +void USBHAL::_usbisr(void) { + instance->usbisr(); +} + + +void USBHAL::usbisr(void) { + uint8_t devStat; + + if (LPC_USB->DevIntSt & FRAME) { + // Start of frame event + SOF(SIEgetFrameNumber()); + // Clear interrupt status flag + LPC_USB->DevIntClr = FRAME; + } + + if (LPC_USB->DevIntSt & DEV_STAT) { + // Device Status interrupt + // Must clear the interrupt status flag before reading the device status from the SIE + LPC_USB->DevIntClr = DEV_STAT; + + // Read device status from SIE + devStat = SIEgetDeviceStatus(); + //printf("devStat: %d\r\n", devStat); + + if (devStat & SIE_DS_SUS_CH) { + // Suspend status changed + if((devStat & SIE_DS_SUS) != 0) { + suspendStateChanged(0); + } + } + + if (devStat & SIE_DS_RST) { + // Bus reset + if((devStat & SIE_DS_SUS) == 0) { + suspendStateChanged(1); + } + busReset(); + } + } + + if (LPC_USB->DevIntSt & EP_SLOW) { + // (Slow) Endpoint Interrupt + + // Process each endpoint interrupt + if (LPC_USB->EpIntSt & EP(EP0OUT)) { + if (selectEndpointClearInterrupt(EP0OUT) & SIE_SE_STP) { + // this is a setup packet + EP0setupCallback(); + } else { + EP0out(); + } + LPC_USB->DevIntClr = EP_SLOW; + } + + if (LPC_USB->EpIntSt & EP(EP0IN)) { + selectEndpointClearInterrupt(EP0IN); + LPC_USB->DevIntClr = EP_SLOW; + EP0in(); + } + + for (uint8_t num = 2; num < 16*2; num++) { + if (LPC_USB->EpIntSt & EP(num)) { + selectEndpointClearInterrupt(num); + epComplete |= EP(num); + LPC_USB->DevIntClr = EP_SLOW; + if ((instance->*(epCallback[num - 2]))()) { + epComplete &= ~EP(num); + } + } + } + } +} + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/inc/devdrv_usb_function_api.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,365 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : devdrv_usb_function_api.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB_FUNCTION_API_H +#define USB_FUNCTION_API_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <MBRZA1H.h> +#include "r_typedefs.h" +#include "usb0_function_api.h" +#include "usb1_function_api.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ +typedef struct +{ + uint32_t fifo; + uint32_t buffer; + uint32_t bytes; + uint32_t dir; + uint32_t size; +} USB_FUNCTION_DMA_t; + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define USBFCLOCK_X1_48MHZ (0x0000u) /* USB_X1_48MHz */ +#define USBFCLOCK_EXTAL_12MHZ (0x0004u) /* EXTAL_12MHz */ + +#define DEVDRV_USBF_ON (1) +#define DEVDRV_USBF_OFF (0) +#define DEVDRV_USBF_YES (1) +#define DEVDRV_USBF_NO (0) + +#define DEVDRV_USBF_STALL (-2) + +#define DEVDRV_USBF_WRITEEND (0) +#define DEVDRV_USBF_WRITESHRT (1) +#define DEVDRV_USBF_WRITING (2) +#define DEVDRV_USBF_WRITEDMA (3) + +#define DEVDRV_USBF_FIFOERROR (0xffff) + +#define DEVDRV_USBF_PIPE_IDLE (0x00) +#define DEVDRV_USBF_PIPE_WAIT (0x01) +#define DEVDRV_USBF_PIPE_DONE (0x02) +#define DEVDRV_USBF_PIPE_NORES (0x03) +#define DEVDRV_USBF_PIPE_STALL (0x04) + +#define DEVDRV_USBF_PID_NAK (0x0000u) +#define DEVDRV_USBF_PID_BUF (0x0001u) +#define DEVDRV_USBF_PID_STALL (0x0002u) +#define DEVDRV_USBF_PID_STALL2 (0x0003u) + +#define USB_FUNCTION_NON_SPEED (0) +#define USB_FUNCTION_LOW_SPEED (1) +#define USB_FUNCTION_FULL_SPEED (2) +#define USB_FUNCTION_HIGH_SPEED (3) + +#define USB_FUNCTION_READEND (0) +#define USB_FUNCTION_READSHRT (1) +#define USB_FUNCTION_READING (2) +#define USB_FUNCTION_READOVER (3) +#define USB_FUNCTION_READZERO (4) + +#define USB_FUNCTION_MAX_PIPE_NO (15u) +#define USB_FUNCTION_PIPE0 (0) +#define USB_FUNCTION_PIPE1 (1) +#define USB_FUNCTION_PIPE2 (2) +#define USB_FUNCTION_PIPE3 (3) +#define USB_FUNCTION_PIPE4 (4) +#define USB_FUNCTION_PIPE5 (5) +#define USB_FUNCTION_PIPE6 (6) +#define USB_FUNCTION_PIPE7 (7) +#define USB_FUNCTION_PIPE8 (8) +#define USB_FUNCTION_PIPE9 (9) +#define USB_FUNCTION_PIPEA (10) +#define USB_FUNCTION_PIPEB (11) +#define USB_FUNCTION_PIPEC (12) +#define USB_FUNCTION_PIPED (13) +#define USB_FUNCTION_PIPEE (14) +#define USB_FUNCTION_PIPEF (15) + +#define USB_FUNCTION_ISO (0xc000u) +#define USB_FUNCTION_INTERRUPT (0x8000u) +#define USB_FUNCTION_BULK (0x4000u) + +#define USB_FUNCTION_NONE (0x0000u) +#define USB_FUNCTON_BFREFIELD (0x0400u) +#define USB_FUNCTION_BFREON (0x0400u) +#define USB_FUNCTION_BFREOFF (0x0000u) +#define USB_FUNCTION_DBLBFIELD (0x0200u) +#define USB_FUNCTION_DBLBON (0x0200u) +#define USB_FUNCTION_DBLBOFF (0x0000u) +#define USB_FUNCTION_CNTMDFIELD (0x0100u) +#define USB_FUNCTION_CNTMDON (0x0100u) +#define USB_FUNCTION_CNTMDOFF (0x0000u) +#define USB_FUNCTION_SHTNAKON (0x0080u) +#define USB_FUNCTION_SHTNAKOFF (0x0000u) +#define USB_FUNCTION_DIRFIELD (0x0010u) +#define USB_FUNCTION_DIR_P_OUT (0x0000u) +#define USB_FUNCTION_DIR_P_IN (0x0010u) +#define USB_FUNCTION_EPNUMFIELD (0x000fu) +#define USB_FUNCTION_MAX_EP_NO (15u) +#define USB_FUNCTION_EP0 (0u) +#define USB_FUNCTION_EP1 (1u) +#define USB_FUNCTION_EP2 (2u) +#define USB_FUNCTION_EP3 (3u) +#define USB_FUNCTION_EP4 (4u) +#define USB_FUNCTION_EP5 (5u) +#define USB_FUNCTION_EP6 (6u) +#define USB_FUNCTION_EP7 (7u) +#define USB_FUNCTION_EP8 (8u) +#define USB_FUNCTION_EP9 (9u) +#define USB_FUNCTION_EP10 (10u) +#define USB_FUNCTION_EP11 (11u) +#define USB_FUNCTION_EP12 (12u) +#define USB_FUNCTION_EP13 (13u) +#define USB_FUNCTION_EP14 (14u) +#define USB_FUNCTION_EP15 (15u) + +#define USB_FUNCTION_EPTABLE_LENGTH (5u) + +#define USB_FUNCTION_CUSE (0) +#define USB_FUNCTION_D0USE (1) +#define USB_FUNCTION_D0DMA (2) +#define USB_FUNCTION_D1USE (3) +#define USB_FUNCTION_D1DMA (4) + +#define USB_FUNCTION_CFIFO_USE (0x0000) +#define USB_FUNCTION_D0FIFO_USE (0x1000) +#define USB_FUNCTION_D1FIFO_USE (0x2000) +#define USB_FUNCTION_D0FIFO_DMA (0x5000) +#define USB_FUNCTION_D1FIFO_DMA (0x6000) + +#define USB_FUNCTION_BUF2FIFO (0) +#define USB_FUNCTION_FIFO2BUF (1) + +#define USB_FUNCTION_DVST_POWERED (0x0001) +#define USB_FUNCTION_DVST_DEFAULT (0x0002) +#define USB_FUNCTION_DVST_ADDRESS (0x0003) +#define USB_FUNCTION_DVST_CONFIGURED (0x0004) +#define USB_FUNCTION_DVST_SUSPEND (0x0005) +#define USB_FUNCTION_DVST_CONFIGURED_SUSPEND (0x0006) + +#define USB_FUNCTION_FUNCTION_TEST_SELECT (0xff00u) +#define USB_FUNCTION_FUNCTION_TEST_J (0x0100u) +#define USB_FUNCTION_FUNCTION_TEST_K (0x0200u) +#define USB_FUNCTION_FUNCTION_TEST_SE0_NAK (0x0300u) +#define USB_FUNCTION_FUNCTION_TEST_PACKET (0x0400u) +#define USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE (0x0500u) +#define USB_FUNCTION_FUNCTION_TEST_STSelectors (0x0600u) +#define USB_FUNCTION_FUNCTION_TEST_Reserved (0x4000u) +#define USB_FUNCTION_FUNCTION_TEST_VSTModes (0xc000u) + +#define USB_FUNCTION_DT_TYPE (0xff00u) +#define USB_FUNCTION_DT_INDEX (0xff) +#define USB_FUNCTION_DT_DEVICE (0x01) +#define USB_FUNCTION_DT_CONFIGURATION (0x02) +#define USB_FUNCTION_DT_STRING (0x03) +#define USB_FUNCTION_DT_INTERFACE (0x04) +#define USB_FUNCTION_DT_ENDPOINT (0x05) +#define USB_FUNCTION_DT_DEVICE_QUALIFIER (0x06) +#define USB_FUNCTION_DT_OTHER_SPEED_CONFIGURATION (0x07) +#define USB_FUNCTION_DT_INTERFACE_POWER (0x08) + +#define USB_FUNCTION_CF_RESERVED (0x80) +#define USB_FUNCTION_CF_SELF (0x40) +#define USB_FUNCTION_CF_RWUP (0x20) +#define USB_FUNCTION_CF_NORWUP (0x00) +#define USB_FUNCTION_EP_ERROR (0xff) + +#define USB_FUNCTION_EP_OUT (0x00) +#define USB_FUNCTION_EP_IN (0x80) +#define USB_FUNCTION_EP_CNTRL (0x00) +#define USB_FUNCTION_EP_ISO (0x01) +#define USB_FUNCTION_EP_BULK (0x02) +#define USB_FUNCTION_EP_INT (0x03) + +#define USB_FUNCTION_STANDARD_REQUEST (0x0000u) +#define USB_FUNCTION_CLASS_REQUEST (0x0020u) +#define USB_FUNCTION_VENDOR_REQUEST (0x0040u) +#define USB_FUNCTION_DEVICE_REQUEST (0x0000u) +#define USB_FUNCTION_INTERFACE_REQUEST (0x0001u) +#define USB_FUNCTION_ENDPOINT_REQUEST (0x0002u) + +#define USB_FUNCTION_GETSTATUS_BUSPOWERD (0x0000u) +#define USB_FUNCTION_GETSTATUS_SELFPOWERD (0x0001u) +#define USB_FUNCTION_GETSTATUS_REMOTEWAKEUP (0x0002u) +#define USB_FUNCTION_GETSTATUS_NOTHALT (0x0000u) +#define USB_FUNCTION_GETSTATUS_HALT (0x0001u) + +#define USB_FUNCTION_FEATURE_ENDPOINT_HALT (0x0000u) +#define USB_FUNCTION_FEATURE_REMOTE_WAKEUP (0x0001u) +#define USB_FUNCTION_FEATURE_TEST_MODE (0x0002u) + +#define USB_FUNCTION_bRequest (0xff00u) /* b15-8:bRequest */ +#define USB_FUNCTION_bmRequestType (0x00ffu) /* b7-0: bmRequestType */ +#define USB_FUNCTION_bmRequestTypeDir (0x0080u) /* b7 : Data transfer direction */ +#define USB_FUNCTION_bmRequestTypeType (0x0060u) /* b6-5: Type */ +#define USB_FUNCTION_bmRequestTypeRecip (0x001fu) /* b4-0: Recipient */ + + +/******************************************************************************* +Variable Externs +*******************************************************************************/ + + +/******************************************************************************* +Functions Prototypes +*******************************************************************************/ +#if 0 +void R_USB_api_function_init(uint16_t root, uint8_t int_level, uint16_t mode, uint16_t clockmode); +uint16_t R_USB_api_function_IsConfigured(uint16_t root); +uint16_t R_USB_api_function_CtrlReadStart(uint16_t root, uint32_t size, uint8_t *data); +void R_USB_api_function_CtrlWriteStart(uint16_t root, uint32_t size, uint8_t *data); +uint16_t R_USB_api_function_start_send_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t R_USB_api_function_check_pipe_status(uint16_t root, uint16_t pipe, uint32_t *size); +void R_USB_api_function_clear_pipe_status(uint16_t root, uint16_t pipe); +void R_USB_api_function_start_receive_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data); +void R_USB_api_function_set_pid_buf(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_pid_nak(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_pid_stall(uint16_t root, uint16_t pipe); +void R_USB_api_function_clear_pid_stall(uint16_t root, uint16_t pipe); +uint16_t R_USB_api_function_get_pid(uint16_t root, uint16_t pipe); +int32_t R_USB_api_function_check_stall(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_sqclr(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_sqset(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_csclr(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_curpipe(uint16_t root, uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void R_USB_api_function_clear_brdy_sts(uint16_t root, uint16_t pipe); +void R_USB_api_function_clear_bemp_sts(uint16_t root, uint16_t pipe); +void R_USB_api_function_clear_nrdy_sts(uint16_t root, uint16_t pipe); +void R_USB_api_function_enable_brdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_disable_brdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_enable_bemp_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_disable_bemp_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_enable_nrdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_disable_nrdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_stop_transfer(uint16_t root, uint16_t pipe); +#endif + +#ifdef USB0_FUNCTION_API_H +void usb0_function_interrupt(uint32_t int_sense); +void usb0_function_dma_interrupt_d0fifo(uint32_t int_sense); +void usb0_function_dma_interrupt_d1fifo(uint32_t int_sense); + +void usb0_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_ResetDescriptor(uint16_t mode); + +IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid(void); +IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid(void); +void Userdef_USB_usb0_function_attach(void); +void Userdef_USB_usb0_function_detach(void); +void Userdef_USB_usb0_function_delay_1ms(void); +void Userdef_USB_usb0_function_delay_xms(uint32_t msec); +void Userdef_USB_usb0_function_delay_10us(uint32_t usec); +void Userdef_USB_usb0_function_delay_500ns(void); +void Userdef_USB_usb0_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc); +uint32_t Userdef_USB_usb0_function_stop_dma0(void); +uint32_t Userdef_USB_usb0_function_stop_dma1(void); + +void usb0_function_stop_transfer(uint16_t pipe); +void usb0_function_enable_brdy_int(uint16_t pipe); +void usb0_function_disable_brdy_int(uint16_t pipe); +void usb0_function_enable_bemp_int(uint16_t pipe); +void usb0_function_disable_bemp_int(uint16_t pipe); +void usb0_function_enable_nrdy_int(uint16_t pipe); +void usb0_function_disable_nrdy_int(uint16_t pipe); +#endif + +#ifdef USB1_FUNCTION_API_H +void usb1_function_interrupt(uint32_t int_sense); +void usb1_function_dma_interrupt_d0fifo(uint32_t int_sense); +void usb1_function_dma_interrupt_d1fifo(uint32_t int_sense); + +void usb1_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_ResetDescriptor(uint16_t mode); + +IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid(void); +IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid(void); +void Userdef_USB_usb1_function_attach(void); +void Userdef_USB_usb1_function_detach(void); +void Userdef_USB_usb1_function_delay_1ms(void); +void Userdef_USB_usb1_function_delay_xms(uint32_t msec); +void Userdef_USB_usb1_function_delay_10us(uint32_t usec); +void Userdef_USB_usb1_function_delay_500ns(void); +void Userdef_USB_usb1_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc); +uint32_t Userdef_USB_usb1_function_stop_dma0(void); +uint32_t Userdef_USB_usb1_function_stop_dma1(void); + +void usb1_function_stop_transfer(uint16_t pipe); +void usb1_function_enable_brdy_int(uint16_t pipe); +void usb1_function_disable_brdy_int(uint16_t pipe); +void usb1_function_enable_bemp_int(uint16_t pipe); +void usb1_function_disable_bemp_int(uint16_t pipe); +void usb1_function_enable_nrdy_int(uint16_t pipe); +void usb1_function_disable_nrdy_int(uint16_t pipe); +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* USB_FUNCTION_API_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,143 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb_function.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB_FUNCTION_H +#define USB_FUNCTION_H + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "r_typedefs.h" +#include "iodefine.h" +#include "rza_io_regrw.h" + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define USB_FUNCTION_ALT_NO (255) +#define USB_FUNCTION_ALT_SET (0xff) + +#define USB_FUNCTION_BITUPLLE (0x0002u) +#define USB_FUNCTION_BITUCKSEL (0x0004u) +#define USB_FUNCTION_BITBWAIT (0x003fu) + +#define USB_FUNCTION_BUSWAIT_02 (0x0000u) +#define USB_FUNCTION_BUSWAIT_03 (0x0001u) +#define USB_FUNCTION_BUSWAIT_04 (0x0002u) +#define USB_FUNCTION_BUSWAIT_05 (0x0003u) +#define USB_FUNCTION_BUSWAIT_06 (0x0004u) +#define USB_FUNCTION_BUSWAIT_07 (0x0005u) +#define USB_FUNCTION_BUSWAIT_08 (0x0006u) +#define USB_FUNCTION_BUSWAIT_09 (0x0007u) +#define USB_FUNCTION_BUSWAIT_10 (0x0008u) +#define USB_FUNCTION_BUSWAIT_11 (0x0009u) +#define USB_FUNCTION_BUSWAIT_12 (0x000au) +#define USB_FUNCTION_BUSWAIT_13 (0x000bu) +#define USB_FUNCTION_BUSWAIT_14 (0x000cu) +#define USB_FUNCTION_BUSWAIT_15 (0x000du) +#define USB_FUNCTION_BUSWAIT_16 (0x000eu) +#define USB_FUNCTION_BUSWAIT_17 (0x000fu) + +#define USB_FUNCTION_BITRESUME (0x0020u) +#define USB_FUNCTION_BITUACT (0x0010u) +#define USB_FUNCTION_HSPROC (0x0004u) +#define USB_FUNCTION_HSMODE (0x0003u) +#define USB_FUNCTION_FSMODE (0x0002u) +#define USB_FUNCTION_LSMODE (0x0001u) +#define USB_FUNCTION_UNDECID (0x0000u) + +#define USB_FUNCTION_BITRCNT (0x8000u) +#define USB_FUNCTION_BITDREQE (0x1000u) +#define USB_FUNCTION_BITMBW (0x0c00u) +#define USB_FUNCTION_BITMBW_8 (0x0000u) +#define USB_FUNCTION_BITMBW_16 (0x0400u) +#define USB_FUNCTION_BITMBW_32 (0x0800u) +#define USB_FUNCTION_BITBYTE_LITTLE (0x0000u) +#define USB_FUNCTION_BITBYTE_BIG (0x0100u) +#define USB_FUNCTION_BITISEL (0x0020u) +#define USB_FUNCTION_BITCURPIPE (0x000fu) + +#define USB_FUNCTION_CFIFO_READ (0x0000u) +#define USB_FUNCTION_CFIFO_WRITE (0x0020u) + +#define USB_FUNCTION_BITBVAL (0x8000u) +#define USB_FUNCTION_BITBCLR (0x4000u) +#define USB_FUNCTION_BITFRDY (0x2000u) +#define USB_FUNCTION_BITDTLN (0x0fffu) + +#define USB_FUNCTION_BITVBSE (0x8000u) +#define USB_FUNCTION_BITRSME (0x4000u) +#define USB_FUNCTION_BITSOFE (0x2000u) +#define USB_FUNCTION_BITDVSE (0x1000u) +#define USB_FUNCTION_BITCTRE (0x0800u) +#define USB_FUNCTION_BITVBINT (0x8000u) +#define USB_FUNCTION_BITRESM (0x4000u) +#define USB_FUNCTION_BITSOFR (0x2000u) +#define USB_FUNCTION_BITDVST (0x1000u) +#define USB_FUNCTION_BITCTRT (0x0800u) + +#define USB_FUNCTION_BITBEMPE (0x0400u) +#define USB_FUNCTION_BITNRDYE (0x0200u) +#define USB_FUNCTION_BITBRDYE (0x0100u) +#define USB_FUNCTION_BITBEMP (0x0400u) +#define USB_FUNCTION_BITNRDY (0x0200u) +#define USB_FUNCTION_BITBRDY (0x0100u) + +#define USB_FUNCTION_BITDVSQ (0x0070u) +#define USB_FUNCTION_BITDVSQS (0x0030u) +#define USB_FUNCTION_DS_SPD_CNFG (0x0070u) +#define USB_FUNCTION_DS_SPD_ADDR (0x0060u) +#define USB_FUNCTION_DS_SPD_DFLT (0x0050u) +#define USB_FUNCTION_DS_SPD_POWR (0x0040u) +#define USB_FUNCTION_DS_CNFG (0x0030u) +#define USB_FUNCTION_DS_ADDS (0x0020u) +#define USB_FUNCTION_DS_DFLT (0x0010u) +#define USB_FUNCTION_DS_POWR (0x0000u) +#define USB_FUNCTION_BITVALID (0x0008u) +#define USB_FUNCTION_BITCTSQ (0x0007u) +#define USB_FUNCTION_CS_SQER (0x0006u) +#define USB_FUNCTION_CS_WRND (0x0005u) +#define USB_FUNCTION_CS_WRSS (0x0004u) +#define USB_FUNCTION_CS_WRDS (0x0003u) +#define USB_FUNCTION_CS_RDSS (0x0002u) +#define USB_FUNCTION_CS_RDDS (0x0001u) +#define USB_FUNCTION_CS_IDST (0x0000u) + +#define USB_FUNCTION_PIPExBUF (64u) + +#define USB_FUNCTION_D0FIFO (0) +#define USB_FUNCTION_D1FIFO (1) +#define USB_FUNCTION_DMA_READY (0) +#define USB_FUNCTION_DMA_BUSY (1) +#define USB_FUNCTION_DMA_BUSYEND (2) + +#define USB_FUNCTION_FIFO_USE (0x7000) + +#endif /* USB_FUNCTION_FUNCTION_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/inc/usb_function_version.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,32 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb_function_version.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ + +#define USB_FUNCTION_LOCAL_Rev "VER080_140709" + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,171 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB0_FUNCTION_H +#define USB0_FUNCTION_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "devdrv_usb_function_api.h" +#include "usb_function.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern const uint16_t g_usb0_function_bit_set[]; +extern uint32_t g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint8_t *g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +extern uint16_t g_usb0_function_PipeIgnore[]; +extern uint16_t g_usb0_function_PipeTbl[]; +extern uint16_t g_usb0_function_pipe_status[]; +extern uint32_t g_usb0_function_PipeDataSize[]; + +extern USB_FUNCTION_DMA_t g_usb0_function_DmaInfo[]; +extern uint16_t g_usb0_function_DmaPipe[]; +extern uint16_t g_usb0_function_DmaBval[]; +extern uint16_t g_usb0_function_DmaStatus[]; + +extern uint16_t g_usb0_function_CtrZeroLengthFlag; + +extern uint16_t g_usb0_function_ConfigNum; +extern uint16_t g_usb0_function_Alternate[USB_FUNCTION_ALT_NO]; +extern uint16_t g_usb0_function_RemoteWakeupFlag; +extern uint16_t g_usb0_function_TestModeFlag; +extern uint16_t g_usb0_function_TestModeSelectors; + +extern uint16_t g_usb0_function_ReqType; +extern uint16_t g_usb0_function_ReqTypeType; +extern uint16_t g_usb0_function_ReqTypeRecip; +extern uint16_t g_usb0_function_ReqRequest; +extern uint16_t g_usb0_function_ReqValue; +extern uint16_t g_usb0_function_ReqIndex; +extern uint16_t g_usb0_function_ReqLength; + +extern uint16_t g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +extern uint16_t g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +/* ==== common ==== */ +void usb0_function_dma_stop_d0(uint16_t pipe, uint32_t remain); +void usb0_function_dma_stop_d1(uint16_t pipe, uint32_t remain); +uint16_t usb0_function_is_hispeed(void); +uint16_t usb0_function_is_hispeed_enable(void); +uint16_t usb0_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb0_function_write_buffer(uint16_t pipe); +uint16_t usb0_function_write_buffer_c(uint16_t pipe); +uint16_t usb0_function_write_buffer_d0(uint16_t pipe); +uint16_t usb0_function_write_buffer_d1(uint16_t pipe); +void usb0_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb0_function_read_buffer(uint16_t pipe); +uint16_t usb0_function_read_buffer_c(uint16_t pipe); +uint16_t usb0_function_read_buffer_d0(uint16_t pipe); +uint16_t usb0_function_read_buffer_d1(uint16_t pipe); +uint16_t usb0_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb0_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb0_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc); +uint16_t usb0_function_get_mbw(uint32_t trncount, uint32_t dtptr); +uint16_t usb0_function_read_dma(uint16_t pipe); +void usb0_function_brdy_int(uint16_t status, uint16_t int_enb); +void usb0_function_nrdy_int(uint16_t status, uint16_t int_enb); +void usb0_function_bemp_int(uint16_t status, uint16_t int_enb); +void usb0_function_setting_interrupt(uint8_t level); +void usb0_function_reset_module(uint16_t clockmode); +uint16_t usb0_function_get_buf_size(uint16_t pipe); +uint16_t usb0_function_get_mxps(uint16_t pipe); +void usb0_function_clear_brdy_sts(uint16_t pipe); +void usb0_function_clear_bemp_sts(uint16_t pipe); +void usb0_function_clear_nrdy_sts(uint16_t pipe); +void usb0_function_set_pid_buf(uint16_t pipe); +void usb0_function_set_pid_nak(uint16_t pipe); +void usb0_function_set_pid_stall(uint16_t pipe); +void usb0_function_clear_pid_stall(uint16_t pipe); +uint16_t usb0_function_get_pid(uint16_t pipe); +void usb0_function_set_sqclr(uint16_t pipe); +void usb0_function_set_sqset(uint16_t pipe); +void usb0_function_set_csclr(uint16_t pipe); +void usb0_function_aclrm(uint16_t pipe); +void usb0_function_set_aclrm(uint16_t pipe); +void usb0_function_clr_aclrm(uint16_t pipe); +uint16_t usb0_function_get_sqmon(uint16_t pipe); +uint16_t usb0_function_get_inbuf(uint16_t pipe); + +/* ==== function ==== */ +void usb0_function_init_status(void); +void usb0_function_InitModule(uint16_t mode); +uint16_t usb0_function_CheckVBUStaus(void); +void usb0_function_USB_FUNCTION_Attach(void); +void usb0_function_USB_FUNCTION_Detach(void); +void usb0_function_USB_FUNCTION_BusReset(void); +void usb0_function_USB_FUNCTION_Resume(void); +void usb0_function_USB_FUNCTION_Suspend(void); +void usb0_function_USB_FUNCTION_TestMode(void); +void usb0_function_ResetDCP(void); +void usb0_function_ResetEP(uint16_t num); +uint16_t usb0_function_EpToPipe(uint16_t ep); +void usb0_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num); +uint16_t usb0_function_GetConfigNum(void); +uint16_t usb0_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num); +uint16_t usb0_function_CheckRemoteWakeup(void); +void usb0_function_clear_alt(void); +void usb0_function_clear_pipe_tbl(void); +void usb0_function_clear_ep_table_index(void); +uint16_t usb0_function_GetInterfaceNum(uint16_t num); + +#ifdef __cplusplus +} +#endif + + +#endif /* USB0_FUNCTION_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_api.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,104 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_api.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB0_FUNCTION_API_H +#define USB0_FUNCTION_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Variable Externs +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb0_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode); +uint16_t usb0_api_function_IsConfigured(void); +uint16_t usb0_function_GetDeviceState(void); +uint16_t usb0_api_function_CtrlReadStart(uint32_t size, uint8_t *data); +void usb0_api_function_CtrlWriteStart(uint32_t size, uint8_t *data); +uint16_t usb0_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb0_api_function_check_pipe_status(uint16_t pipe, uint32_t *size); +void usb0_api_function_clear_pipe_status(uint16_t pipe); +void usb0_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +void usb0_api_function_set_pid_buf(uint16_t pipe); +void usb0_api_function_set_pid_nak(uint16_t pipe); +void usb0_api_function_set_pid_stall(uint16_t pipe); +void usb0_api_function_clear_pid_stall(uint16_t pipe); +uint16_t usb0_api_function_get_pid(uint16_t pipe); +int32_t usb0_api_function_check_stall(uint16_t pipe); +void usb0_api_function_set_sqclr(uint16_t pipe); +void usb0_api_function_set_sqset(uint16_t pipe); +void usb0_api_function_set_csclr(uint16_t pipe); +void usb0_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb0_api_function_clear_brdy_sts(uint16_t pipe); +void usb0_api_function_clear_bemp_sts(uint16_t pipe); +void usb0_api_function_clear_nrdy_sts(uint16_t pipe); + +void usb0_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* USB0_FUNCTION_API_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dmacdrv.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB0_FUNCTION_DMACDRV_H +#define USB0_FUNCTION_DMACDRV_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ +typedef struct dmac_transinfo +{ + uint32_t src_addr; /* Transfer source address */ + uint32_t dst_addr; /* Transfer destination address */ + uint32_t count; /* Transfer byte count */ + uint32_t src_size; /* Transfer source data size */ + uint32_t dst_size; /* Transfer destination data size */ + uint32_t saddr_dir; /* Transfer source address direction */ + uint32_t daddr_dir; /* Transfer destination address direction */ +} dmac_transinfo_t; + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +/* ==== Transfer specification of the sample program ==== */ +#define DMAC_SAMPLE_SINGLE (0) /* Single transfer */ +#define DMAC_SAMPLE_CONTINUATION (1) /* Continuous transfer (use REN bit) */ + +/* ==== DMA modes ==== */ +#define DMAC_MODE_REGISTER (0) /* Register mode */ +#define DMAC_MODE_LINK (1) /* Link mode */ + +/* ==== Transfer requests ==== */ +#define DMAC_REQ_MODE_EXT (0) /* External request */ +#define DMAC_REQ_MODE_PERI (1) /* On-chip peripheral module request */ +#define DMAC_REQ_MODE_SOFT (2) /* Auto-request (request by software) */ + +/* ==== DMAC transfer sizes ==== */ +#define DMAC_TRANS_SIZE_8 (0) /* 8 bits */ +#define DMAC_TRANS_SIZE_16 (1) /* 16 bits */ +#define DMAC_TRANS_SIZE_32 (2) /* 32 bits */ +#define DMAC_TRANS_SIZE_64 (3) /* 64 bits */ +#define DMAC_TRANS_SIZE_128 (4) /* 128 bits */ +#define DMAC_TRANS_SIZE_256 (5) /* 256 bits */ +#define DMAC_TRANS_SIZE_512 (6) /* 512 bits */ +#define DMAC_TRANS_SIZE_1024 (7) /* 1024 bits */ + +/* ==== Address increment for transferring ==== */ +#define DMAC_TRANS_ADR_NO_INC (1) /* Not increment */ +#define DMAC_TRANS_ADR_INC (0) /* Increment */ + +/* ==== Method for detecting DMA request ==== */ +#define DMAC_REQ_DET_FALL (0) /* Falling edge detection */ +#define DMAC_REQ_DET_RISE (1) /* Rising edge detection */ +#define DMAC_REQ_DET_LOW (2) /* Low level detection */ +#define DMAC_REQ_DET_HIGH (3) /* High level detection */ + +/* ==== Request Direction ==== */ +#define DMAC_REQ_DIR_SRC (0) /* DMAREQ is the source/ DMAACK is active when reading */ +#define DMAC_REQ_DIR_DST (1) /* DMAREQ is the destination/ DMAACK is active when writing */ + +/* ==== Descriptors ==== */ +#define DMAC_DESC_HEADER (0) /* Header */ +#define DMAC_DESC_SRC_ADDR (1) /* Source Address */ +#define DMAC_DESC_DST_ADDR (2) /* Destination Address */ +#define DMAC_DESC_COUNT (3) /* Transaction Byte */ +#define DMAC_DESC_CHCFG (4) /* Channel Confg */ +#define DMAC_DESC_CHITVL (5) /* Channel Interval */ +#define DMAC_DESC_CHEXT (6) /* Channel Extension */ +#define DMAC_DESC_LINK_ADDR (7) /* Link Address */ + +/* ==== On-chip peripheral module requests ===== */ +typedef enum dmac_request_factor +{ + DMAC_REQ_USB0_DMA0_TX, /* USB_0 channel 0 transmit FIFO empty */ + DMAC_REQ_USB0_DMA0_RX, /* USB_0 channel 0 receive FIFO full */ + DMAC_REQ_USB0_DMA1_TX, /* USB_0 channel 1 transmit FIFO empty */ + DMAC_REQ_USB0_DMA1_RX, /* USB_0 channel 1 receive FIFO full */ + DMAC_REQ_USB1_DMA0_TX, /* USB_1 channel 0 transmit FIFO empty */ + DMAC_REQ_USB1_DMA0_RX, /* USB_1 channel 0 receive FIFO full */ + DMAC_REQ_USB1_DMA1_TX, /* USB_1 channel 1 transmit FIFO empty */ + DMAC_REQ_USB1_DMA1_RX, /* USB_1 channel 1 receive FIFO full */ +} dmac_request_factor_t; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb0_function_DMAC1_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb0_function_DMAC1_Open(uint32_t req); +void usb0_function_DMAC1_Close(uint32_t *remain); +void usb0_function_DMAC1_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +void usb0_function_DMAC2_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb0_function_DMAC2_Open(uint32_t req); +void usb0_function_DMAC2_Close(uint32_t *remain); +void usb0_function_DMAC2_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* USB0_FUNCTION_DMACDRV_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dataio.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2933 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dataio.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static uint16_t g_usb0_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)]; + +static void usb0_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static uint16_t usb0_function_read_dma_d0(uint16_t pipe); +static uint16_t usb0_function_read_dma_d1(uint16_t pipe); +static uint16_t usb0_function_write_dma_d0(uint16_t pipe); +static uint16_t usb0_function_write_dma_d1(uint16_t pipe); + +static void usb0_function_read_c_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_write_c_fifo(uint16_t Pipe, uint16_t count); +static void usb0_function_read_d0_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_write_d0_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_read_d1_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_write_d1_fifo(uint16_t pipe, uint16_t count); + +static void usb0_function_clear_transaction_counter(uint16_t pipe); +static void usb0_function_set_transaction_counter(uint16_t pipe, uint32_t count); + +static uint32_t usb0_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr); + +static uint16_t usb0_function_set_dfacc_d0(uint16_t mbw, uint32_t count); +static uint16_t usb0_function_set_dfacc_d1(uint16_t mbw, uint32_t count); + + +/******************************************************************************* +* Function Name: usb0_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t usefifo; + uint16_t mbw; + + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + usb0_function_clear_bemp_sts(pipe); + usb0_function_clear_brdy_sts(pipe); + usb0_function_clear_nrdy_sts(pipe); + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + case USB_FUNCTION_D0FIFO_DMA: + usefifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + case USB_FUNCTION_D1FIFO_DMA: + usefifo = USB_FUNCTION_D1USE; + break; + + default: + usefifo = USB_FUNCTION_CUSE; + break; + }; + + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw); + + usb0_function_clear_transaction_counter(pipe); + + usb0_function_aclrm(pipe); + + status = usb0_function_write_buffer(pipe); + + if (status != DEVDRV_USBF_FIFOERROR) + { + usb0_function_set_pid_buf(pipe); + } + + return status; +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer +* Description : Writes data in the buffer allocated in the pipe specified by +* : the argument. The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer (uint16_t pipe) +{ + uint16_t status; + uint16_t usefifo; + + g_usb0_function_PipeIgnore[pipe] = 0; + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + status = usb0_function_write_buffer_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_USE: + status = usb0_function_write_buffer_d1(pipe); + break; + + case USB_FUNCTION_D0FIFO_DMA: + status = usb0_function_write_dma_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_DMA: + status = usb0_function_write_dma_d1(pipe); + break; + + default: + status = usb0_function_write_buffer_c(pipe); + break; + }; + + switch (status) + { + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + usb0_function_enable_brdy_int(pipe); /* Enable Ready Interrupt */ + break; + + case DEVDRV_USBF_WRITEEND: /* End of data write */ + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb0_function_clear_nrdy_sts(pipe); + usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + /* for last transfer */ + usb0_function_enable_bemp_int(pipe); /* Enable Empty Interrupt */ + break; + + case DEVDRV_USBF_WRITEDMA: /* DMA write */ + usb0_function_clear_nrdy_sts(pipe); + usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb0_function_disable_bemp_int(pipe); /* Disable Empty Interrupt */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer_c +* Description : Writes data in the buffer allocated in the pipe specified in +* : the argument. Writes data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + if (g_usb0_function_CtrZeroLengthFlag == 1) + { + g_usb0_function_CtrZeroLengthFlag = 0; /* Zero Length Packet Flag CLR */ + return DEVDRV_USBF_WRITEEND; + } + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + if (pipe == USB_FUNCTION_PIPE0) + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + } + else + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + } + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb0_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb0_function_write_c_fifo(pipe, (uint16_t)count); + + if (g_usb0_function_data_count[pipe] < (uint32_t)size) + { + g_usb0_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB200.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0) + { + USB200.CFIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + g_usb0_function_CtrZeroLengthFlag = 1; /* Zero Length Packet Flag */ + } + } + else + { + g_usb0_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb0_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb0_function_write_d0_fifo(pipe, (uint16_t)count); + + if (g_usb0_function_data_count[pipe] < (uint32_t)size) + { + g_usb0_function_data_count[pipe] = 0; + if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb0_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb0_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb0_function_write_d1_fifo(pipe, (uint16_t)count); + + if (g_usb0_function_data_count[pipe] < (uint32_t)size) + { + g_usb0_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb0_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D0FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb0_function_write_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb0_function_data_count[pipe]; + + if (count != 0) + { + g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; + + if ((count % size) != 0) + { + g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 1; + } + else + { + g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; + } + + dfacc = usb0_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb0_function_data_count[pipe] = 0; + g_usb0_function_data_pointer[pipe] += count; + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB200.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_dma_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D1FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb0_function_write_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc=0; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb0_function_data_count[pipe]; + + if (count != 0) + { + g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; + if ((count % size) != 0) + { + g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 1; + } + else + { + g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; + } + + dfacc = usb0_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb0_function_data_count[pipe] = 0; + g_usb0_function_data_pointer[pipe] += count; + + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB200.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb0_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t usefifo; + + usb0_function_clear_bemp_sts(pipe); + usb0_function_clear_brdy_sts(pipe); + usb0_function_clear_nrdy_sts(pipe); + + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb0_function_start_receive_trns_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_USE: + usb0_function_start_receive_trns_d1(pipe, size, data); + break; + + case USB_FUNCTION_D0FIFO_DMA: + usb0_function_start_receive_dma_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_DMA: + usb0_function_start_receive_dma_d1(pipe, size, data); + break; + + default: + usb0_function_start_receive_trns_c(pipe, size, data); + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_trns_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* : When storing data in the buffer allocated in the pipe specified in the +* : argument, BRDY interrupt is generated to read data +* : in the interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = size; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_trns_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data in the +* : interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = size; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_trns_d1 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D1FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = size; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_dma_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb0_function_read_dma(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + else + { + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_dma_d1 +* Description : Read data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb0_function_read_dma(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + else + { + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Uses FIF0 set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer (uint16_t pipe) +{ + uint16_t status; + + g_usb0_function_PipeIgnore[pipe] = 0; + + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + status = usb0_function_read_buffer_d0(pipe); + } + else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + status = usb0_function_read_buffer_d1(pipe); + } + else + { + status = usb0_function_read_buffer_c(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb0_function_disable_brdy_int(pipe); + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + } + + if (count == 0) /* 0 length packet */ + { + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb0_function_read_c_fifo(pipe, (uint16_t)count); + } + + g_usb0_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer_d0 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb0_function_read_d0_fifo(pipe, (uint16_t)count); + } + + g_usb0_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer_d1 +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb0_function_read_d1_fifo(pipe, (uint16_t)count); + } + + g_usb0_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_dma +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO or D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_dma (uint16_t pipe) +{ + uint16_t status; + + g_usb0_function_PipeIgnore[pipe] = 0; + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + status = usb0_function_read_dma_d0(pipe); + } + else + { + status = usb0_function_read_dma_d1(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READZERO: /* End of data read */ + usb0_function_disable_brdy_int(pipe); + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb0_function_disable_brdy_int(pipe); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + } + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + } + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb0_function_read_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + uint16_t pipebuf_size; + + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb0_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb0_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb0_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; /* not use in read operation */ + g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; /* not use in read operation */ + + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb0_function_data_count[pipe] -= count; + g_usb0_function_data_pointer[pipe] += count; + g_usb0_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_dma_d1 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by DMA transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb0_function_read_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc=0; + uint16_t pipebuf_size; + + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb0_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb0_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb0_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; /* not use in read operation */ + g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; /* not use in read operation */ + + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb0_function_data_count[pipe] -= count; + g_usb0_function_data_pointer[pipe] += count; + g_usb0_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_change_fifo_port +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. After allocating FIF0, waits in the software +* : till the corresponding pipe becomes ready. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : DEVDRV_USBF_FIFOERROR ; Error +* : Others ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value +*******************************************************************************/ +uint16_t usb0_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + usb0_function_set_curpipe(pipe, fifosel, isel, mbw); + + for (loop = 0; loop < 4; loop++) + { + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB200.CFIFOCTR; + break; + + case USB_FUNCTION_D0USE: + case USB_FUNCTION_D0DMA: + buffer = USB200.D0FIFOCTR; + break; + + case USB_FUNCTION_D1USE: + case USB_FUNCTION_D1DMA: + buffer = USB200.D1FIFOCTR; + break; + + default: + buffer = 0; + break; + } + + if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY) + { + return buffer; + } + + loop2 = 25; + while (loop2-- > 0) + { + /* wait */ + } + } + + return DEVDRV_USBF_FIFOERROR; +} + +/******************************************************************************* +* Function Name: usb0_function_set_curpipe +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb0_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + g_usb0_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB200.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB200.D0FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB200.D1FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_curpipe2 +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* : uint16_t dfacc ; DFACC Access mode +* Return Value : none +*******************************************************************************/ +void usb0_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc) +{ + uint16_t buffer; + uint32_t loop; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + uint32_t dummy; +#endif + volatile uint32_t loop2; + + g_usb0_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB200.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB200.D0FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB200.D0FIFO.UINT32; + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB200.D1FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB200.D1FIFO.UINT32; + loop = dummy; // avoid warning. + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_write_c_fifo +* Description : Writes data in CFIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_write_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB200.CFIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB200.CFIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB200.CFIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_read_c_fifo +* Description : Reads data from CFIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_read_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb0_function_data_pointer[pipe] = USB200.CFIFO.UINT8[HH]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT16[H]; + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT32; + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_write_d0_fifo +* Description : Writes data in D0FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_write_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB200.D0FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB200.D0FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB200.D0FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_read_d0_fifo +* Description : Reads data from D0FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating DOFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_read_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb0_function_data_pointer[pipe] = USB200.D0FIFO.UINT8[HH]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT16[H]; + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT32; + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_write_d1_fifo +* Description : Writes data in D1FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_write_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB200.D1FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB200.D1FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB200.D1FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_read_d1_fifo +* Description : Reads data from D1FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_read_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb0_function_data_pointer[pipe] = USB200.D1FIFO.UINT8[HH]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT16[H]; + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT32; + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_com_get_dmasize +* Description : Calculates access width of DMA transfer by the argument to +* : return as the Return Value. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : DMA transfer size : 0 8bit +* : : 1 16bit +* : : 2 32bit +*******************************************************************************/ +static uint32_t usb0_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + + if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0)) + { + /* When transfer byte count is odd */ + /* or transfer data area is 8-bit alignment */ + size = 0; /* 8bit */ + } + else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0)) + { + /* When the transfer byte count is multiples of 2 */ + /* or the transfer data area is 16-bit alignment */ + size = 1; /* 16bit */ + } + else + { + /* When the transfer byte count is multiples of 4 */ + /* or the transfer data area is 32-bit alignment */ + size = 2; /* 32bit */ + } + + return size; +} + +/******************************************************************************* +* Function Name: usb0_function_get_mbw +* Description : Calculates access width of DMA to return the value set in MBW. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : FIFO transfer size : USB_FUNCTION_BITMBW_8 8bit +* : : USB_FUNCTION_BITMBW_16 16bit +* : : USB_FUNCTION_BITMBW_32 32bit +*******************************************************************************/ +uint16_t usb0_function_get_mbw (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + uint16_t mbw; + + size = usb0_function_com_get_dmasize(trncount, dtptr); + + if (size == 0) + { + /* 8bit */ + mbw = USB_FUNCTION_BITMBW_8; + } + else if (size == 1) + { + /* 16bit */ + mbw = USB_FUNCTION_BITMBW_16; + } + else + { + /* 32bit */ + mbw = USB_FUNCTION_BITMBW_32; + } + + return mbw; +} + +/******************************************************************************* +* Function Name: usb0_function_set_transaction_counter +* Description : Sets transaction counter by the argument(PIPEnTRN). +* : Clears transaction before setting to enable transaction counter setting. +* Arguments : uint16_t pipe ; Pipe number +* : uint32_t bsize : Data transfer size +* Return Value : none +*******************************************************************************/ +static void usb0_function_set_transaction_counter (uint16_t pipe, uint32_t bsize) +{ + uint16_t mxps; + uint16_t cnt; + + if (bsize == 0) + { + return; + } + + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if ((bsize % mxps) == 0) + { + cnt = (uint16_t)(bsize / mxps); + } + else + { + cnt = (uint16_t)((bsize / mxps) + 1); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE1TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE2TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE3TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE4TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE5TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE9TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEATRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEBTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPECTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEDTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEETRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEFTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_clear_transaction_counter +* Description : Clears the transaction counter by the argument. +* : After executing this function, the transaction counter is invalid. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_transaction_counter (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_stop_transfer +* Description : Stops the USB transfer in the pipe specified by the argument. +* : After stopping the USB transfer, clears the buffer allocated in +* : the pipe. +* : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0; +* : invalid. After executing this function, BRDY/NRDY/BEMP interrupt +* : in the corresponding pipe becomes invalid. Sequence bit is also +* : cleared. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_stop_transfer (uint16_t pipe) +{ + uint16_t usefifo; + uint32_t remain; + uint16_t fifo; + + usb0_function_set_pid_nak(pipe); + + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb0_function_clear_transaction_counter(pipe); + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + usb0_function_clear_transaction_counter(pipe); + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1USE; + break; + + case USB_FUNCTION_D0FIFO_DMA: + remain = Userdef_USB_usb0_function_stop_dma0(); + usb0_function_dma_stop_d0(pipe, remain); + usb0_function_clear_transaction_counter(pipe); + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0DMA; + break; + + case USB_FUNCTION_D1FIFO_DMA: + remain = Userdef_USB_usb0_function_stop_dma1(); + usb0_function_dma_stop_d1(pipe, remain); + usb0_function_clear_transaction_counter(pipe); + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1DMA; + break; + + default: + usb0_function_clear_transaction_counter(pipe); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_CUSE; + break; + } + + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16); + + /* Interrupt of pipe set is disabled */ + usb0_function_disable_brdy_int(pipe); + usb0_function_disable_nrdy_int(pipe); + usb0_function_disable_bemp_int(pipe); + + usb0_function_aclrm(pipe); + usb0_function_set_csclr(pipe); + + if ( g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT ) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } + +} + +/******************************************************************************* +* Function Name: usb0_function_set_dfacc_d0 +* Description : Sets the DFACC setting value in D0FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb0_function_set_dfacc_d0 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + return dfacc; +} + +/******************************************************************************* +* Function Name: usb0_function_set_dfacc_d1 +* Description : Set the DFACC setting value in D1FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb0_function_set_dfacc_d1 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + + return dfacc; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_dma.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,346 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dma.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static void usb0_function_dmaint(uint16_t fifo); +static void usb0_function_dmaint_buf2fifo(uint16_t pipe); +static void usb0_function_dmaint_fifo2buf(uint16_t pipe); + + +/******************************************************************************* +* Function Name: usb0_function_dma_stop_d0 +* Description : D0FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_stop_d0 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB200.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB200.D0FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain); + g_usb0_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb0_function_dma_stop_d1 +* Description : D1FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_stop_d1 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB200.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB200.D1FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain); + g_usb0_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb0_function_dma_interrupt_d0fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb0_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_interrupt_d0fifo (uint32_t int_sense) +{ + usb0_function_dmaint(USB_FUNCTION_D0FIFO); + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb0_function_dma_interrupt_d1fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb0_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_interrupt_d1fifo (uint32_t int_sense) +{ + usb0_function_dmaint(USB_FUNCTION_D1FIFO); + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb0_function_dmaint +* Description : This function is DMA transfer end interrupt +* Arguments : uint16_t fifo ; fifo number +* : ; USB_FUNCTION_D0FIFO +* : ; USB_FUNCTION_D1FIFO +* Return Value : none +*******************************************************************************/ +static void usb0_function_dmaint (uint16_t fifo) +{ + uint16_t pipe; + + pipe = g_usb0_function_DmaPipe[fifo]; + + if (g_usb0_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO) + { + usb0_function_dmaint_buf2fifo(pipe); + } + else + { + usb0_function_dmaint_fifo2buf(pipe); + } +} + +/******************************************************************************* +* Function Name: usb0_function_dmaint_fifo2buf +* Description : Executes read completion from FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb0_function_dmaint_fifo2buf (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb0_function_stop_dma0(); + usb0_function_dma_stop_d0(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb0_function_enable_brdy_int(pipe); + } + } + } + else + { + remain = Userdef_USB_usb0_function_stop_dma1(); + usb0_function_dma_stop_d1(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb0_function_enable_brdy_int(pipe); + } + } + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_dmaint_buf2fifo +* Description : Executes write completion in FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb0_function_dmaint_buf2fifo (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb0_function_stop_dma0(); + usb0_function_dma_stop_d0(pipe, remain); + + if (g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB200.D0FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + else + { + remain = Userdef_USB_usb0_function_stop_dma1(); + usb0_function_dma_stop_d1(pipe, remain); + + if (g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB200.D1FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + + usb0_function_enable_bemp_int(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_intrn.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,249 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_intrn.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_brdy_int +* Description : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9). +* : According to the pipe that interrupt is generated in, +* : reads/writes buffer allocated in the pipe. +* : This function is executed in the BRDY interrupt handler. +* : This function clears BRDY interrupt status and BEMP interrupt +* : status. +* Arguments : uint16_t Status ; BRDYSTS Register Value +* : uint16_t Int_enbl ; BRDYENB Register Value +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_brdy_int (uint16_t status, uint16_t int_enb) +{ + uint32_t int_sense = 0; + uint16_t pipe; + uint16_t pipebit; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + pipebit = g_usb0_function_bit_set[pipe]; + + if ((status & pipebit) && (int_enb & pipebit)) + { + USB200.BRDYSTS = (uint16_t)~pipebit; + USB200.BEMPSTS = (uint16_t)~pipebit; + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) + { + usb0_function_dma_interrupt_d0fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb0_function_read_dma(pipe); + usb0_function_disable_brdy_int(pipe); + } + else + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) + { + usb0_function_dma_interrupt_d1fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb0_function_read_dma(pipe); + usb0_function_disable_brdy_int(pipe); + } + else + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) + { + usb0_function_read_buffer(pipe); + } + else + { + usb0_function_write_buffer(pipe); + } + } + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_nrdy_int +* Description : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9). +* : Checks NRDY interrupt cause by PID. When the cause if STALL, +* : regards the pipe state as STALL and ends the processing. +* : Then the cause is not STALL, increments the error count to +* : communicate again. When the error count is 3, determines +* : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing. +* : This function is executed in the NRDY interrupt handler. +* : This function clears NRDY interrupt status. +* Arguments : uint16_t status ; NRDYSTS Register Value +* : uint16_t int_enb ; NRDYENB Register Value +* Return Value : none +*******************************************************************************/ +void usb0_function_nrdy_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + + bitcheck = (uint16_t)(status & int_enb); + + USB200.NRDYSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe]) + { + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1) + { + if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT) + { + pid = usb0_function_get_pid(pipe); + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + g_usb0_function_PipeIgnore[pipe]++; + if (g_usb0_function_PipeIgnore[pipe] == 3) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } + else + { + usb0_function_set_pid_buf(pipe); + } + } + } + } + else + { + /* USB Function */ + } + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_bemp_int +* Description : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9). +* Arguments : uint16_t status ; BEMPSTS Register Value +* : uint16_t int_enb ; BEMPENB Register Value +* Return Value : none +*******************************************************************************/ +void usb0_function_bemp_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + uint16_t inbuf; + + bitcheck = (uint16_t)(status & int_enb); + + USB200.BEMPSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe]) + { + pid = usb0_function_get_pid(pipe); + + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + inbuf = usb0_function_get_inbuf(pipe); + + if (inbuf == 0) + { + usb0_function_disable_bemp_int(pipe); + usb0_function_set_pid_nak(pipe); + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + } + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/common/usb0_function_lib.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2026 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_lib.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_enable_brdy_int +* Description : Enables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_enable_brdy_int (uint16_t pipe) +{ + /* enable brdy interrupt */ + USB200.BRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_function_disable_brdy_int +* Description : Disables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_disable_brdy_int (uint16_t pipe) +{ + /* disable brdy interrupt */ + USB200.BRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_brdy_sts (uint16_t pipe) +{ + /* clear brdy status */ + USB200.BRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_enable_bemp_int +* Description : Enables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_enable_bemp_int (uint16_t pipe) +{ + /* enable bemp interrupt */ + USB200.BEMPENB |= (uint16_t)g_usb0_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_function_disable_bemp_int +* Description : Disables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_disable_bemp_int (uint16_t pipe) +{ + /* disable bemp interrupt */ + USB200.BEMPENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_bemp_sts (uint16_t pipe) +{ + /* clear bemp status */ + USB200.BEMPSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_enable_nrdy_int +* Description : Enables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : NRDY. Enables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_enable_nrdy_int (uint16_t pipe) +{ + /* enable nrdy interrupt */ + USB200.NRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_function_disable_nrdy_int +* Description : Disables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : NRDY. Disables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_disable_nrdy_int (uint16_t pipe) +{ + /* disable nrdy interrupt */ + USB200.NRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_nrdy_sts (uint16_t pipe) +{ + /* clear nrdy status */ + USB200.NRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_is_hispeed +* Description : Returns the result of USB reset hand shake (RHST) as +* : return value. +* Arguments : none +* Return Value : USB_FUNCTION_HIGH_SPEED ; Hi-Speed +* : USB_FUNCTION_FULL_SPEED ; Full-Speed +* : LOW_SPEED ; Low-Speed +* : USB_FUNCTION_NON_SPEED ; error +*******************************************************************************/ +uint16_t usb0_function_is_hispeed (void) +{ + uint16_t rhst; + uint16_t speed; + + rhst = RZA_IO_RegRead_16(&USB200.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST); + + if (rhst == USB_FUNCTION_HSMODE) + { + speed = USB_FUNCTION_HIGH_SPEED; + } + else if (rhst == USB_FUNCTION_FSMODE) + { + speed = USB_FUNCTION_FULL_SPEED; + } + else if (rhst == USB_FUNCTION_LSMODE) + { + speed = USB_FUNCTION_LOW_SPEED; + } + else + { + speed = USB_FUNCTION_NON_SPEED; + } + + return speed; +} + +/******************************************************************************* +* Function Name: usb0_function_is_hispeed_enable +* Description : Returns the USB High-Speed connection enabled status as +* : return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Hi-Speed Enable +* : DEVDRV_USBF_NO : Hi-Speed Disable +*******************************************************************************/ +uint16_t usb0_function_is_hispeed_enable (void) +{ + uint16_t ret; + + ret = DEVDRV_USBF_NO; + + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1) + { + ret = DEVDRV_USBF_YES; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb0_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_pid_buf (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb0_function_set_pid_nak(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_BUF, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_pid_nak (uint16_t pipe) +{ + uint16_t pid; + uint16_t pbusy; + uint32_t loop; + + pid = usb0_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb0_function_set_pid_stall(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_NAK, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + + if (pid == DEVDRV_USBF_PID_BUF) + { + for (loop = 0; loop < 200; loop++) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pbusy = RZA_IO_RegRead_16(&USB200.DCPCTR, + USB_DCPCTR_PBUSY_SHIFT, + USB_DCPCTR_PBUSY); + break; + + case USB_FUNCTION_PIPE1: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE2: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE3: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE4: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE5: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE6: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE6CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE7: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE7CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE8: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE8CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE9: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_PBUSY_SHIFT, + USB_PIPEnCTR_9_PBUSY); + break; + + case USB_FUNCTION_PIPEA: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEB: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEC: + pbusy = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPED: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEE: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEF: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + default: + pbusy = 1; + break; + } + + if (pbusy == 0) + { + break; + } + Userdef_USB_usb0_function_delay_500ns(); + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_pid_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + if (pid == DEVDRV_USBF_PID_BUF) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_STALL2, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } + else + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_STALL, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_pid_stall (uint16_t pipe) +{ + usb0_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb0_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pid = RZA_IO_RegRead_16(&USB200.DCPCTR, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + pid = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + pid = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + pid = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + pid = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + pid = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + pid = RZA_IO_RegRead_16(&USB200.PIPE6CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + pid = RZA_IO_RegRead_16(&USB200.PIPE7CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + pid = RZA_IO_RegRead_16(&USB200.PIPE8CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + pid = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + pid = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + pid = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + pid = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + pid = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + pid = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + pid = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + pid = 0; + break; + } + + return pid; +} + +/******************************************************************************* +* Function Name: usb0_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_csclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + 1, + USB_DCPCTR_CSCLR_SHIFT, + USB_DCPCTR_CSCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_CSCLR_SHIFT, + USB_PIPEnCTR_9_CSCLR); + break; + + default: + /* PIPEA-F have not CSCLR */ + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_sqclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + 1, + USB_DCPCTR_SQCLR_SHIFT, + USB_DCPCTR_SQCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQCLR_SHIFT, + USB_PIPEnCTR_9_SQCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_sqset (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + 1, + USB_DCPCTR_SQSET_SHIFT, + USB_DCPCTR_SQSET); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQSET_SHIFT, + USB_PIPEnCTR_9_SQSET); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_get_sqmon +* Description : Toggle bit of specified pipe is obtained +* Arguments : uint16_t pipe ; Pipe number +* Return Value : sqmon +*******************************************************************************/ +uint16_t usb0_function_get_sqmon (uint16_t pipe) +{ + uint16_t sqmon; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + sqmon = RZA_IO_RegRead_16(&USB200.DCPCTR, + USB_DCPCTR_SQMON_SHIFT, + USB_DCPCTR_SQMON); + break; + + case USB_FUNCTION_PIPE1: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE2: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE3: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE4: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE5: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE6: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE6CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE7: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE7CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE8: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE8CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE9: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_SQMON_SHIFT, + USB_PIPEnCTR_9_SQMON); + break; + + case USB_FUNCTION_PIPEA: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEB: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEC: + sqmon = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPED: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEE: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEF: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + default: + sqmon = 0; + break; + } + + return sqmon; +} + +/******************************************************************************* +* Function Name: usb0_function_aclrm +* Description : The buffer of specified pipe is initialized +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb0_function_aclrm (uint16_t pipe) +{ + usb0_function_set_aclrm(pipe); + usb0_function_clr_aclrm(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_set_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb0_function_set_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_clr_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb0_function_clr_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 0, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_get_inbuf +* Description : Returns INBUFM of the pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : inbuf +*******************************************************************************/ +uint16_t usb0_function_get_inbuf (uint16_t pipe) +{ + uint16_t inbuf; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE1: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE2: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE3: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE4: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE5: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE6: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE7: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE8: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE9: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_INBUFM_SHIFT, + USB_PIPEnCTR_9_INBUFM); + break; + + case USB_FUNCTION_PIPEA: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEB: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEC: + inbuf = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPED: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEE: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEF: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + default: + inbuf = 0; + break; + } + + return inbuf; +} + +/******************************************************************************* +* Function Name: usb0_function_setting_interrupt +* Description : Sets the USB module interrupt level. +* Arguments : uint8_t level ;interrupt level +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_setting_interrupt (uint8_t level) +{ + uint16_t d0fifo_dmaintid; + uint16_t d1fifo_dmaintid; + + R_INTC_RegistIntFunc(INTC_ID_USBI0, usb0_function_interrupt); + R_INTC_SetPriority(INTC_ID_USBI0, level); + R_INTC_Enable(INTC_ID_USBI0); + + d0fifo_dmaintid = Userdef_USB_usb0_function_d0fifo_dmaintid(); + + if (d0fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d0fifo_dmaintid, usb0_function_dma_interrupt_d0fifo); + R_INTC_SetPriority(d0fifo_dmaintid, level); + R_INTC_Enable(d0fifo_dmaintid); + } + + d1fifo_dmaintid = Userdef_USB_usb0_function_d1fifo_dmaintid(); + + if (d1fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d1fifo_dmaintid, usb0_function_dma_interrupt_d1fifo); + R_INTC_SetPriority(d1fifo_dmaintid, level); + R_INTC_Enable(d1fifo_dmaintid); + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_reset_module +* Description : Initializes the USB module. +* : Enables providing clock to the USB module. +* : Sets USB bus wait register. +* Arguments : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +void usb0_function_reset_module (uint16_t clockmode) +{ + /* UPLLE bit is only USB0 */ + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, + USB_SYSCFG_UPLLE_SHIFT, + USB_SYSCFG_UPLLE) == 1) + { + if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode) + { + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb0_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + else + { + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + Userdef_USB_usb0_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + } + else + { + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb0_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + + USB200.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT); +} + +/******************************************************************************* +* Function Name: usb0_function_get_buf_size +* Description : Obtains pipe buffer size specified by the argument and +* : maximum packet size of the USB device in use. +* : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum +* : packet size of the USB device using the corresponding pipe. +* : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the +* : corresponding pipe is in continuous transfer mode, +* : obtains the buffer size allocated in the corresponcing pipe, +* : when incontinuous transfer, obtains maximum packet size. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Maximum packet size or buffer size +*******************************************************************************/ +uint16_t usb0_function_get_buf_size (uint16_t pipe) +{ + uint16_t size; + uint16_t bufsize; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB200.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1) + { + bufsize = RZA_IO_RegRead_16(&g_usb0_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE); + size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF); + } + else + { + size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + } + return size; +} + +/******************************************************************************* +* Function Name: usb0_function_get_mxps +* Description : Obtains maximum packet size of the USB device using the pipe +* : specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Max Packet Size +*******************************************************************************/ +uint16_t usb0_function_get_mxps (uint16_t pipe) +{ + uint16_t size; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB200.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + return size; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_api.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,441 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_api.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" +#include "dev_drv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_api_function_init +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint8_t int_level ; interruput level +* : uint16_t mode : Speed modes +* : : USB_FUCNTION_HIGH_SPEED: High-speed device +* : : USB_FUCNTION_FULL_SPEED: Full-speed device +* : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode) +{ + volatile uint8_t dummy_buf; + + CPG.STBCR7 &= 0xfd; /* The clock of USB0 modules is permitted */ + dummy_buf = CPG.STBCR7; /* (Dummy read) */ + + usb0_function_setting_interrupt(int_level); + + usb0_function_reset_module(clockmode); /* reset USB module with setting tranciever */ + /* and HSE=1 */ + + usb0_function_init_status(); /* clear variables */ + + usb0_function_InitModule(mode); /* select USB Function and Interrupt Enable */ + /* Detect USB Device to attach or detach */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_api_function_IsConfigured +* Description : Checks if the USB device is configured to return the result as +* : the return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Configured & Configured Suspend +* : DEVDRV_USBF_NO : not Configured +*******************************************************************************/ +uint16_t usb0_api_function_IsConfigured (void) +{ + uint16_t dvst; + + dvst = usb0_function_GetDeviceState(); + + if ((dvst == USB_FUNCTION_DVST_CONFIGURED) || + (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND)) + { + return DEVDRV_USBF_YES; + } + + return DEVDRV_USBF_NO; +} + +/******************************************************************************* +* Function Name: usb0_function_GetDeviceState +* Description : Returns the state of USB device. +* Arguments : none +* Return Value : Device States +*******************************************************************************/ +uint16_t usb0_function_GetDeviceState (void) +{ + uint16_t dvsq; + uint16_t dvst; + + dvsq = USB200.INTSTS0; + switch(dvsq & USB_FUNCTION_BITDVSQ) + { + case USB_FUNCTION_DS_POWR: /* Power state *//* power-on */ + dvst = USB_FUNCTION_DVST_POWERED; + break; + + case USB_FUNCTION_DS_DFLT: /* Default state *//* bus-reset */ + dvst = USB_FUNCTION_DVST_DEFAULT; + break; + + case USB_FUNCTION_DS_ADDS: /* Address state */ + dvst = USB_FUNCTION_DVST_ADDRESS; + break; + + case USB_FUNCTION_DS_CNFG: /* Configured state */ + dvst = USB_FUNCTION_DVST_CONFIGURED; + break; + + case USB_FUNCTION_DS_SPD_CNFG: /* Configured Suspend state */ + dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND; + break; + + case USB_FUNCTION_DS_SPD_POWR: /* Power Suspend state */ + case USB_FUNCTION_DS_SPD_DFLT: /* Default Suspend state */ + case USB_FUNCTION_DS_SPD_ADDR: /* Address Suspend state */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + + default: /* error */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + } + + return dvst; +} + +/******************************************************************************* +* Function Name: usb0_api_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : none +*******************************************************************************/ +void usb0_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + usb0_function_start_receive_transfer(pipe, size, data); +} + +/******************************************************************************* +* Function Name: usb0_api_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + + status = usb0_function_start_send_transfer(pipe, size, data); + + return status; +} + +/******************************************************************************* +* Function Name: usb0_api_function_check_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t *size ; Data Size +* Return Value : Pipe Status +*******************************************************************************/ +uint16_t usb0_api_function_check_pipe_status (uint16_t pipe, uint32_t * size) +{ + if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE) + { + *size = g_usb0_function_PipeDataSize[pipe]; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_DONE; + } + else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES) + { + *size = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_NORES; + } + else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL) + { + *size = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_STALL; + } + else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR) + { + *size = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_FIFOERROR; + } + else + { + /* Do Nothing */ + } + + return g_usb0_function_pipe_status[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Pipe Status +*******************************************************************************/ +void usb0_api_function_clear_pipe_status (uint16_t pipe) +{ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb0_function_PipeDataSize[pipe] = 0; +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_pid_buf (uint16_t pipe) +{ + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_pid_nak (uint16_t pipe) +{ + usb0_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_pid_stall (uint16_t pipe) +{ + usb0_function_set_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_pid_stall (uint16_t pipe) +{ + usb0_function_clear_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb0_api_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + + return pid; +} + +/******************************************************************************* +* Function Name: usb0_api_function_check_stall +* Description : +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +int32_t usb0_api_function_check_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + + if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL) + { + return DEVDRV_USBF_STALL; + } + + return DEVDRV_SUCCESS; +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_sqclr (uint16_t pipe) +{ + usb0_function_set_sqclr(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_sqset (uint16_t pipe) +{ + usb0_function_set_sqset(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_csclr (uint16_t pipe) +{ + usb0_function_set_csclr(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_curpipe +* Description : Allocates FIF0 specifed by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + usb0_function_set_curpipe(pipe, fifosel, isel, mbw); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_brdy_sts (uint16_t pipe) +{ + usb0_function_clear_brdy_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_bemp_sts (uint16_t pipe) +{ + usb0_function_clear_bemp_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_nrdy_sts (uint16_t pipe) +{ + usb0_function_clear_nrdy_sts(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_controlrw.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_api_function_CtrlReadStart +* Description : Executes the USB control read transfer. +* : USB host controller <- USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; End of data write +* : DEVDRV_USBF_WRITESHRT ; End of short data write +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_FIFOERROR ; FIFO access error +*******************************************************************************/ +uint16_t usb0_api_function_CtrlReadStart (uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t mbw; + + usb0_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb0_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; + + status = usb0_function_write_buffer_c(USB_FUNCTION_PIPE0); + + /* Peripheral Control sequence */ + switch (status) + { + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + case DEVDRV_USBF_WRITEEND: /* End of data write (not null) */ + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0); /* Enable Empty Interrupt */ + usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); /* Set BUF */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access error */ + break; + + default: + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_api_function_CtrlWriteStart +* Description : Executes the USB control write transfer. +* : USB host controller -> USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb0_api_function_CtrlWriteStart (uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb0_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb0_function_enable_brdy_int(USB_FUNCTION_PIPE0); + usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_global.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,144 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_global.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +const uint16_t g_usb0_function_bit_set[16] = +{ + 0x0001, 0x0002, 0x0004, 0x0008, + 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, + 0x1000, 0x2000, 0x4000, 0x8000 +}; + +uint32_t g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint8_t * g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +uint16_t g_usb0_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint32_t g_usb0_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1]; + +USB_FUNCTION_DMA_t g_usb0_function_DmaInfo[2]; +uint16_t g_usb0_function_DmaPipe[2]; +uint16_t g_usb0_function_DmaBval[2]; +uint16_t g_usb0_function_DmaStatus[2]; + +uint16_t g_usb0_function_CtrZeroLengthFlag; + +//uint16_t g_usb0_function_ConfigNum; +//uint16_t g_usb0_function_Alternate[USB_FUNCTION_ALT_NO]; +//uint16_t g_usb0_function_RemoteWakeupFlag; +uint16_t g_usb0_function_TestModeFlag; +uint16_t g_usb0_function_TestModeSelectors; + +//uint16_t g_usb0_function_ReqType; +//uint16_t g_usb0_function_ReqTypeType; +//uint16_t g_usb0_function_ReqTypeRecip; +//uint16_t g_usb0_function_ReqRequest; +//uint16_t g_usb0_function_ReqValue; +//uint16_t g_usb0_function_ReqIndex; +//uint16_t g_usb0_function_ReqLength; + +//uint16_t g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +uint16_t g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +* Function Name: usb0_function_init_status +* Description : Initialization USB Sample Driver Variable. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_init_status (void) +{ + uint16_t pipe; + + //g_usb0_function_ConfigNum = 0; + //g_usb0_function_RemoteWakeupFlag = DEVDRV_USBF_OFF; + g_usb0_function_TestModeFlag = DEVDRV_USBF_OFF; + g_usb0_function_CtrZeroLengthFlag = 0; + +#if 0 + usb0_function_clear_alt(); +#endif + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb0_function_PipeDataSize[pipe] = 0; + g_usb0_function_data_count[pipe] = 0; + + /* pipe configuration in usb0_function_ResetEP() */ + g_usb0_function_pipecfg[pipe] = 0; + g_usb0_function_pipebuf[pipe] = 0; + g_usb0_function_pipemaxp[pipe] = 0; + g_usb0_function_pipeperi[pipe] = 0; + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sig.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,330 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_sig.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb0_function_EnableINTModule(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_InitModule +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint16_t mode ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode +* : ; other ; Full-speed Mode +* Return Value : none +*******************************************************************************/ +void usb0_function_InitModule (uint16_t mode) +{ + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); /* USB function */ + + /* USB module operation enabled */ + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + if (mode == USB_FUNCTION_HIGH_SPEED) + { + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); /* Hi-Speed Mode */ + } + else + { + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); + } + + /* for power-on */ + if (usb0_function_CheckVBUStaus() == DEVDRV_USBF_ON) + { + usb0_function_EnableINTModule(); /* Interrupt Enable */ + usb0_function_USB_FUNCTION_Attach(); /* pull-up D+ and open D- */ + } + else + { + usb0_function_USB_FUNCTION_Detach(); /* USB Detach */ + /* with Interrupt Enable */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_CheckVBUStaus +* Description : Checks the USB-VBUS state to returns the connection state to +* : the USB host. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : VBUS ON +* : DEVDRV_USBF_OFF : VBUS OFF +*******************************************************************************/ +uint16_t usb0_function_CheckVBUStaus (void) +{ + uint16_t buf1; + uint16_t buf2; + uint16_t buf3; + + /* monitor VBUS pins */ + do + { + buf1 = RZA_IO_RegRead_16(&USB200.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb0_function_delay_10us(1); + buf2 = RZA_IO_RegRead_16(&USB200.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb0_function_delay_10us(1); + buf3 = RZA_IO_RegRead_16(&USB200.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + } while ((buf1 != buf2) || (buf2 != buf3)); + + if (buf1 == DEVDRV_USBF_OFF) + { + return DEVDRV_USBF_OFF; /* detach */ + } + + return DEVDRV_USBF_ON; /* attach */ +} + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Attach +* Description : Connects to the USB host controller. +* : This function pulls up D+. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_USB_FUNCTION_Attach (void) +{ + Userdef_USB_usb0_function_attach(); + + Userdef_USB_usb0_function_delay_xms(10); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* Pull-up D+ and open D- */ +} + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Detach +* Description : Disconnects from the USB host controller. +* : This function opens D+/D-. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_USB_FUNCTION_Detach (void) +{ + uint16_t pipe; + + Userdef_USB_usb0_function_detach(); + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE) + { + usb0_function_stop_transfer(pipe); + } + } + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* open D+ and D- */ + + /* Detach Recovery */ + Userdef_USB_usb0_function_delay_500ns(); /* need 1us=500ns * 2 wait */ + Userdef_USB_usb0_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + Userdef_USB_usb0_function_delay_500ns(); /* need 100ns wait but 500ns S/W wait */ + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); /* soft reset module */ + Userdef_USB_usb0_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + usb0_function_EnableINTModule(); /* Interrupt Enable */ +} + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_BusReset +* Description : This function is executed when the USB device is transitioned +* : to POWERD_STATE. Sets the device descriptor according to the +* : connection speed determined by the USB reset hand shake. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb0_function_USB_FUNCTION_BusReset (void) +{ + usb0_function_init_status(); /* memory clear */ + + if (usb0_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) + { + usb0_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED); /* Device Descriptor reset */ + } + else + { + usb0_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED); /* Device Descriptor reset */ + } + + usb0_function_ResetDCP(); /* Default Control PIPE reset */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Resume +* Description : This function is executed when the USB device detects a resume +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb0_function_USB_FUNCTION_Resume (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Suspend +* Description : This function is executed when the USB device detects a suspend +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb0_function_USB_FUNCTION_Suspend (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_TestMode +* Description : This function is executed when the USB device is transitioned U +* : to TEST_MODE by the USB standard request. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_USB_FUNCTION_TestMode (void) +{ + switch (g_usb0_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT) + { + case USB_FUNCTION_FUNCTION_TEST_J: + case USB_FUNCTION_FUNCTION_TEST_K: + case USB_FUNCTION_FUNCTION_TEST_SE0_NAK: + case USB_FUNCTION_FUNCTION_TEST_PACKET: + RZA_IO_RegWrite_16(&USB200.TESTMODE, + (g_usb0_function_TestModeSelectors >> 8), + USB_TESTMODE_UTST_SHIFT, + USB_TESTMODE_UTST); + break; + + case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE: + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_EnableINTModule +* Description : Enables USB interrupt. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void usb0_function_EnableINTModule (void) +{ + uint16_t buf; + + buf = USB200.INTENB0; + buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE | + USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE); + USB200.INTENB0 = buf; + + usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/function/usb0_function_sub.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,453 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_sub.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +#if 0 +extern const uint16_t *g_usb0_function_EndPntPtr[]; +extern uint8_t g_usb0_function_DeviceDescriptor[]; +extern uint8_t *g_usb0_function_ConfigurationPtr[]; +#endif + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_ResetDCP +* Description : Initializes the default control pipe(DCP). +* Outline : Reset default control pipe +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_ResetDCP (void) +{ + USB200.DCPCFG = 0; +#if 0 + USB200.DCPMAXP = g_usb0_function_DeviceDescriptor[7]; +#else + USB200.DCPMAXP = 64; +#endif + + USB200.CFIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB200.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB200.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); +} + +/******************************************************************************* +* Function Name: usb0_function_ResetEP +* Description : Initializes the end point. +* Arguments : uint16_t num ; Configuration Number +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_ResetEP (uint16_t num) +{ + uint16_t pipe; + uint16_t ep; + uint16_t index; + uint16_t buf; + uint16_t * tbl; + + tbl = (uint16_t *)(g_usb0_function_EndPntPtr[num - 1]); + + for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + if (g_usb0_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR) + { + index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb0_function_EPTableIndex[ep]); + pipe = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE); + + g_usb0_function_PipeTbl[pipe] = (uint16_t)( ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) | + ep | + (tbl[index + 0] & USB_FUNCTION_FIFO_USE) ); + + if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT) + { + tbl[index + 1] |= USB_FUNCTION_SHTNAKON; +#ifdef __USB_DMA_BFRE_ENABLE__ + /* this routine cannnot be perfomred if read operation is executed in buffer size */ + if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) || + ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)) + { + tbl[index + 1] |= USB_FUNCTION_BFREON; + } +#endif + } + + /* Interrupt Disable */ + buf = USB200.BRDYENB; + buf &= (uint16_t)~g_usb0_function_bit_set[pipe]; + USB200.BRDYENB = buf; + buf = USB200.NRDYENB; + buf &= (uint16_t)~g_usb0_function_bit_set[pipe]; + USB200.NRDYENB = buf; + buf = USB200.BEMPENB; + buf &= (uint16_t)~g_usb0_function_bit_set[pipe]; + USB200.BEMPENB = buf; + + usb0_function_set_pid_nak(pipe); + + /* CurrentPIPE Clear */ + if (RZA_IO_RegRead_16(&USB200.CFIFOSEL, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB200.CFIFOSEL, + 0, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB200.D0FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB200.D1FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + /* PIPE Configuration */ + USB200.PIPESEL = pipe; + USB200.PIPECFG = tbl[index + 1]; + USB200.PIPEBUF = tbl[index + 2]; + USB200.PIPEMAXP = tbl[index + 3]; + USB200.PIPEPERI = tbl[index + 4]; + + g_usb0_function_pipecfg[pipe] = tbl[index + 1]; + g_usb0_function_pipebuf[pipe] = tbl[index + 2]; + g_usb0_function_pipemaxp[pipe] = tbl[index + 3]; + g_usb0_function_pipeperi[pipe] = tbl[index + 4]; + + /* Buffer Clear */ + usb0_function_set_sqclr(pipe); + usb0_function_aclrm(pipe); + + /* init Global */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb0_function_PipeDataSize[pipe] = 0; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_EpToPipe +* Description : Returns the pipe which end point specified by the argument is +* : allocated to. +* Arguments : uint16_t ep ; Direction + Endpoint Number +* Return Value : USB_FUNCTION_EP_ERROR : Error +* : Others : Pipe Number +*******************************************************************************/ +uint16_t usb0_function_EpToPipe (uint16_t ep) +{ + uint16_t pipe; + + for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((g_usb0_function_PipeTbl[pipe] & 0x00ff) == ep) + { + return pipe; + } + } + + return USB_FUNCTION_EP_ERROR; +} + +/******************************************************************************* +* Function Name: usb0_function_InitEPTable +* Description : Sets the end point by the Alternate setting value of the +* : configuration number and the interface number specified by the +* : argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* : uint16_t Alt_Num ; Alternate Setting +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num) +{ + uint8_t * ptr; + uint16_t point_interface; + uint16_t point_endpoint; + uint16_t length; + uint16_t start; + uint16_t numbers; + uint16_t endpoint; + + ptr = (uint8_t *)g_usb0_function_ConfigurationPtr[Con_Num - 1]; + point_interface = *ptr; + length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2)); + ptr += *ptr; + start = 0; + numbers = 0; + point_endpoint = 0; + + for (; point_interface < length;) + { + switch (*(ptr + 1)) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num)) + { + numbers = *(ptr + 4); + } + else + { + start += *(ptr + 4); + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + if (point_endpoint < numbers) + { + endpoint = (uint16_t)(*(ptr + 2) & 0x0f); + g_usb0_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint); + ++point_endpoint; + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + default: /* Class, Vendor, else */ + point_interface += *ptr; + ptr += *ptr; + break; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_GetConfigNum +* Description : Returns the number of configuration referring to the number of +* : configuration described in the device descriptor. +* Arguments : none +* Return Value : Number of possible configurations (bNumConfigurations). +*******************************************************************************/ +#if 0 +uint16_t usb0_function_GetConfigNum (void) +{ + return (uint16_t)g_usb0_function_DeviceDescriptor[17]; +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_GetInterfaceNum +* Description : Returns the number of interface referring to the number of +* : interface described in the configuration descriptor. +* Arguments : uint16_t num ; Configuration Number +* Return Value : Number of this interface (bNumInterfaces). +*******************************************************************************/ +#if 0 +uint16_t usb0_function_GetInterfaceNum (uint16_t num) +{ + return (uint16_t)(*(g_usb0_function_ConfigurationPtr[num - 1] + 4)); +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_GetAltNum +* Description : Returns the Alternate setting value of the configuration number +* : and the interface number specified by the argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* Return Value : Value used to select this alternate setting(bAlternateSetting). +*******************************************************************************/ +#if 0 +uint16_t usb0_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num) +{ + uint8_t * ptr; + uint16_t point; + uint16_t alt_num = 0; + uint16_t length; + + ptr = (uint8_t *)(g_usb0_function_ConfigurationPtr[Con_Num - 1]); + point = ptr[0]; + ptr += ptr[0]; /* InterfaceDescriptor[0] */ + length = (uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 2)); + length |= (uint16_t)((uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8); + + for (; point < length;) /* Search Descriptor Table size */ + { + switch (ptr[1]) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if (Int_Num == ptr[2]) + { + alt_num = (uint16_t)ptr[3]; /* Alternate Number count */ + } + point += ptr[0]; + ptr += ptr[0]; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + default: /* Class, Vendor, else */ + point += ptr[0]; + ptr += ptr[0]; + break; + } + } + return alt_num; +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_CheckRemoteWakeup +* Description : Returns the result of the remote wake up function is supported +* : or not referring to the configuration descriptor. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : Support Remote Wakeup +* : DEVDRV_USBF_OFF : not Support Remote Wakeup +*******************************************************************************/ +#if 0 +uint16_t usb0_function_CheckRemoteWakeup (void) +{ + uint8_t atr; + + if (g_usb0_function_ConfigNum == 0) + { + return DEVDRV_USBF_OFF; + } + + atr = *(g_usb0_function_ConfigurationPtr[g_usb0_function_ConfigNum - 1] + 7); + + if (atr & USB_FUNCTION_CF_RWUP) + { + return DEVDRV_USBF_ON; + } + + return DEVDRV_USBF_OFF; +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_clear_alt +* Description : Initializes the Alternate setting area. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_clear_alt (void) +{ + int i; + + for (i = 0; i < USB_FUNCTION_ALT_NO; ++i) + { + g_usb0_function_Alternate[i] = 0; /* Alternate */ + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_clear_pipe_tbl +* Description : Initializes pipe definition table. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_pipe_tbl (void) +{ + int pipe; + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb0_function_PipeTbl[pipe] = 0; + } +} + +/******************************************************************************* +* Function Name: usb0_function_clear_ep_table_index +* Description : Initializes the end point table index. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_clear_ep_table_index (void) +{ + int ep; + + for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + g_usb0_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR; + } +} +#endif + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,698 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dmacdrv.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "rza_io_regrw.h" +#include "usb0_function_dmacdrv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DMAC_INDEFINE (255) /* Macro definition when REQD bit is not used */ + +/* ==== Request setting information for on-chip peripheral module ==== */ +typedef enum dmac_peri_req_reg_type +{ + DMAC_REQ_MID, + DMAC_REQ_RID, + DMAC_REQ_AM, + DMAC_REQ_LVL, + DMAC_REQ_REQD +} dmac_peri_req_reg_type_t; + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +/* ==== Prototype declaration ==== */ + +/* ==== Global variable ==== */ +/* On-chip peripheral module request setting table */ +static const uint8_t usb0_function_dmac_peri_req_init_table[8][5] = +{ + /* MID,RID,AM,LVL,REQD */ + {32, 3, 2, 1, 1}, /* USB_0 channel 0 transmit FIFO empty */ + {32, 3, 2, 1, 0}, /* USB_0 channel 0 receive FIFO full */ + {33, 3, 2, 1, 1}, /* USB_0 channel 1 transmit FIFO empty */ + {33, 3, 2, 1, 0}, /* USB_0 channel 1 receive FIFO full */ + {34, 3, 2, 1, 1}, /* USB_1 channel 0 transmit FIFO empty */ + {34, 3, 2, 1, 0}, /* USB_1 channel 0 receive FIFO full */ + {35, 3, 2, 1, 1}, /* USB_1 channel 1 transmit FIFO empty */ + {35, 3, 2, 1, 0}, /* USB_1 channel 1 receive FIFO full */ +}; + + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 1. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 1 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t *trans_info : Setting information to DMAC register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous transfer +* : uint32_t request_factor : Factor for on-chip peripheral module request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction: Setting value of CHCFG_n register REQD bit +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC1_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC1.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC1.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC1.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->daddr_dir, + DMAC1_CHCFG_n_DAD_SHIFT, + DMAC1_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->saddr_dir, + DMAC1_CHCFG_n_SAD_SHIFT, + DMAC1_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->dst_size, + DMAC1_CHCFG_n_DDS_SHIFT, + DMAC1_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->src_size, + DMAC1_CHCFG_n_SDS_SHIFT, + DMAC1_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_DMS_SHIFT, + DMAC1_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_RSEL_SHIFT, + DMAC1_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_SBE_SHIFT, + DMAC1_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_DEM_SHIFT, + DMAC1_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_REN_SHIFT, + DMAC1_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_RSW_SHIFT, + DMAC1_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_REN_SHIFT, + DMAC1_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_RSW_SHIFT, + DMAC1_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_TM_SHIFT, + DMAC1_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_SEL_SHIFT, + DMAC1_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_HIEN_SHIFT, + DMAC1_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_LOEN_SHIFT, + DMAC1_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC1_CHCFG_n_AM_SHIFT, + DMAC1_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC1_CHCFG_n_LVL_SHIFT, + DMAC1_CHCFG_n_LVL); + + if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC1_CHCFG_n_REQD_SHIFT, + DMAC1_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + req_direction, + DMAC1_CHCFG_n_REQD_SHIFT, + DMAC1_CHCFG_n_REQD); + } + + RZA_IO_RegWrite_32(&DMAC01.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC01_DMARS_CH1_RID_SHIFT, + DMAC01_DMARS_CH1_RID); + RZA_IO_RegWrite_32(&DMAC01.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC01_DMARS_CH1_MID_SHIFT, + DMAC01_DMARS_CH1_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_Open +* Description : Enables DMAC channel 1 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb0_function_DMAC1_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_EN_SHIFT, + DMAC1_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_TACT_SHIFT, + DMAC1_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_SWRST_SHIFT, + DMAC1_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC1.CHCTRL_n, + DMAC1_CHCTRL_n_SWRST_SHIFT, + DMAC1_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_SETEN_SHIFT, + DMAC1_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_STG_SHIFT, + DMAC1_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_Close +* Description : Aborts DMAC channel 1 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC1_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_CLREN_SHIFT, + DMAC1_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_TACT_SHIFT, + DMAC1_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_EN_SHIFT, + DMAC1_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC1.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 1 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 1 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC1_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_SR_SHIFT, + DMAC1_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC1.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC1.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC1.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC1.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC1.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC1.N1TB_n = count; /* Total transfer byte count */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 2. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 2 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t * trans_info : Setting information to DMAC +* : : register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous +* : : transfer +* : uint32_t request_factor : Factor for on-chip peripheral module +* : : request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction : Setting value of CHCFG_n register +* : : REQD bit +*******************************************************************************/ +void usb0_function_DMAC2_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC2.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC2.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC2.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->daddr_dir, + DMAC2_CHCFG_n_DAD_SHIFT, + DMAC2_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->saddr_dir, + DMAC2_CHCFG_n_SAD_SHIFT, + DMAC2_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->dst_size, + DMAC2_CHCFG_n_DDS_SHIFT, + DMAC2_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->src_size, + DMAC2_CHCFG_n_SDS_SHIFT, + DMAC2_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_DMS_SHIFT, + DMAC2_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_RSEL_SHIFT, + DMAC2_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_SBE_SHIFT, + DMAC2_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_DEM_SHIFT, + DMAC2_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 1, + DMAC2_CHCFG_n_REN_SHIFT, + DMAC2_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 1, + DMAC2_CHCFG_n_RSW_SHIFT, + DMAC2_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_REN_SHIFT, + DMAC2_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_RSW_SHIFT, + DMAC2_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_TM_SHIFT, + DMAC2_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 2, + DMAC2_CHCFG_n_SEL_SHIFT, + DMAC2_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 1, + DMAC2_CHCFG_n_HIEN_SHIFT, + DMAC2_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_LOEN_SHIFT, + DMAC2_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC2_CHCFG_n_AM_SHIFT, + DMAC2_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC2_CHCFG_n_LVL_SHIFT, + DMAC2_CHCFG_n_LVL); + if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC2_CHCFG_n_REQD_SHIFT, + DMAC2_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + req_direction, + DMAC2_CHCFG_n_REQD_SHIFT, + DMAC2_CHCFG_n_REQD); + } + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC23_DMARS_CH2_RID_SHIFT, + DMAC23_DMARS_CH2_RID); + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC23_DMARS_CH2_MID_SHIFT, + DMAC23_DMARS_CH2_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_Open +* Description : Enables DMAC channel 2 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb0_function_DMAC2_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2, + DMAC2_CHSTAT_n_EN_SHIFT, + DMAC2_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2, + DMAC2_CHSTAT_n_TACT_SHIFT, + DMAC2_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_SWRST_SHIFT, + DMAC2_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC2.CHCTRL_n, + DMAC2_CHCTRL_n_SWRST_SHIFT, + DMAC2_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_SETEN_SHIFT, + DMAC2_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_STG_SHIFT, + DMAC2_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_Close +* Description : Aborts DMAC channel 2 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC2_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_CLREN_SHIFT, + DMAC2_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n, + DMAC2_CHSTAT_n_TACT_SHIFT, + DMAC2_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n, + DMAC2_CHSTAT_n_EN_SHIFT, + DMAC2_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC2.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 2 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 2 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC2_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC2.CHSTAT_n, + DMAC2_CHSTAT_n_SR_SHIFT, + DMAC2_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC2.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC2.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC2.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC2.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC2.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC2.N1TB_n = count; /* Total transfer byte count */ + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,762 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_userdef.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "devdrv_usb_function_api.h" +#include "usb0_function_dmacdrv.h" /* common DMAC driver for USB */ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DUMMY_ACCESS OSTM0CNT + +/* #define CACHE_WRITEBACK */ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern int32_t io_cwb(unsigned long start, unsigned long end); + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb0_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void usb0_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void Userdef_USB_usb0_function_delay_10us_2(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_d0fifo_dmaintid +* Description : get D0FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D0FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_d1fifo_dmaintid +* Description : get D1FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D1FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_attach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_attach (void) +{ + printf("\n"); + printf("channel 0 attach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_detach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_detach (void) +{ + printf("\n"); + printf("channel 0 detach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_1ms +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_1ms (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* + * Wait 1ms (Please change for your MCU). + */ + for (i = 0; i < 1440; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_xms +* Description : Wait for the software in the period of time specified by the +* : argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t msec ; Wait Time (msec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_xms (uint32_t msec) +{ + volatile unsigned short i; + + for (i = 0; i < msec; ++i) + { + Userdef_USB_usb0_function_delay_1ms(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_10us +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t usec ; Wait Time(x 10usec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_10us (uint32_t usec) +{ + volatile int i; + + /* Wait 10us (Please change for your MCU) */ + for (i = 0; i < usec; ++i) + { + Userdef_USB_usb0_function_delay_10us_2(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_10us_2 +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void Userdef_USB_usb0_function_delay_10us_2 (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 1us (Please change for your MCU) */ + for (i = 0; i < 14; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_500ns +* Description : Wait for software for 500ns. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_500ns (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 500ns (Please change for your MCU) */ + /* Wait 500ns I clock 266MHz */ + tmp = DUMMY_ACCESS; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_start_dma +* Description : Enables DMA transfer on the information specified by the argument. +* : Set DMAC register by this function to enable DMA transfer. +* : After executing this function, USB module is set to start DMA +* : transfer. DMA transfer should not wait for DMA transfer complete. +* Arguments : USB_FUNCTION_DMA_t *dma : DMA parameter +* : typedef struct{ +* : uint32_t fifo; FIFO for using +* : uint32_t buffer; Start address of transfer source/destination +* : uint32_t bytes; Transfer size(Byte) +* : uint32_t dir; Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer) +* : uint32_t size; DMA transfer size +* : } USB_FUNCTION_DMA_t; +* : uint16_t dfacc ; 0 : cycle steal mode +* : 1 : 16byte continuous mode +* : 2 : 32byte continuous mode +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc) +{ + uint32_t trncount; + uint32_t src; + uint32_t dst; + uint32_t size; + uint32_t dir; +#ifdef CACHE_WRITEBACK + uint32_t ptr; +#endif + + trncount = dma->bytes; + dir = dma->dir; + + if (dir == USB_FUNCTION_FIFO2BUF) + { + /* DxFIFO determination */ + dst = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + src += 3; /* byte access */ + } + else if (size == 1) + { + src += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB200.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB200.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + src += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + src += 3; /* byte access */ + } +#endif + } + else + { + /* DxFIFO determination */ + src = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + dst += 3; /* byte access */ + } + else if (size == 1) + { + dst += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB200.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB200.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + dst += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + dst += 3; /* byte access */ + } +#endif + } + +#ifdef CACHE_WRITEBACK + ptr = (uint32_t)dma->buffer; + + if ((ptr & 0x20000000ul) == 0) + { + io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount); + } +#endif + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + usb0_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc); + } + else + { + usb0_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc); + } +} + +/******************************************************************************* +* Function Name: usb0_function_enable_dmac0 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb0_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB0_DMA0_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB0_DMA0_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb0_function_DMAC1_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb0_function_DMAC1_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb0_function_DMAC1_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC1 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: usb0_function_enable_dmac1 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb0_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB0_DMA1_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB0_DMA1_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb0_function_DMAC2_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb0_function_DMAC1_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb0_function_DMAC2_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC2 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_stop_dma0 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D0_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb0_function_stop_dma0 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb0_function_DMAC1_Close(&remain); + + return remain; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_stop_dma1 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D1_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb0_function_stop_dma1 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb0_function_DMAC2_Close(&remain); + + return remain; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,171 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB1_FUNCTION_H +#define USB1_FUNCTION_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "devdrv_usb_function_api.h" +#include "usb_function.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern const uint16_t g_usb1_function_bit_set[]; +extern uint32_t g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint8_t *g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +extern uint16_t g_usb1_function_PipeIgnore[]; +extern uint16_t g_usb1_function_PipeTbl[]; +extern uint16_t g_usb1_function_pipe_status[]; +extern uint32_t g_usb1_function_PipeDataSize[]; + +extern USB_FUNCTION_DMA_t g_usb1_function_DmaInfo[]; +extern uint16_t g_usb1_function_DmaPipe[]; +extern uint16_t g_usb1_function_DmaBval[]; +extern uint16_t g_usb1_function_DmaStatus[]; + +extern uint16_t g_usb1_function_CtrZeroLengthFlag; + +extern uint16_t g_usb1_function_ConfigNum; +extern uint16_t g_usb1_function_Alternate[USB_FUNCTION_ALT_NO]; +extern uint16_t g_usb1_function_RemoteWakeupFlag; +extern uint16_t g_usb1_function_TestModeFlag; +extern uint16_t g_usb1_function_TestModeSelectors; + +extern uint16_t g_usb1_function_ReqType; +extern uint16_t g_usb1_function_ReqTypeType; +extern uint16_t g_usb1_function_ReqTypeRecip; +extern uint16_t g_usb1_function_ReqRequest; +extern uint16_t g_usb1_function_ReqValue; +extern uint16_t g_usb1_function_ReqIndex; +extern uint16_t g_usb1_function_ReqLength; + +extern uint16_t g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +extern uint16_t g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +/* ==== common ==== */ +void usb1_function_dma_stop_d0(uint16_t pipe, uint32_t remain); +void usb1_function_dma_stop_d1(uint16_t pipe, uint32_t remain); +uint16_t usb1_function_is_hispeed(void); +uint16_t usb1_function_is_hispeed_enable(void); +uint16_t usb1_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb1_function_write_buffer(uint16_t pipe); +uint16_t usb1_function_write_buffer_c(uint16_t pipe); +uint16_t usb1_function_write_buffer_d0(uint16_t pipe); +uint16_t usb1_function_write_buffer_d1(uint16_t pipe); +void usb1_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb1_function_read_buffer(uint16_t pipe); +uint16_t usb1_function_read_buffer_c(uint16_t pipe); +uint16_t usb1_function_read_buffer_d0(uint16_t pipe); +uint16_t usb1_function_read_buffer_d1(uint16_t pipe); +uint16_t usb1_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb1_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb1_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc); +uint16_t usb1_function_get_mbw(uint32_t trncount, uint32_t dtptr); +uint16_t usb1_function_read_dma(uint16_t pipe); +void usb1_function_brdy_int(uint16_t status, uint16_t int_enb); +void usb1_function_nrdy_int(uint16_t status, uint16_t int_enb); +void usb1_function_bemp_int(uint16_t status, uint16_t int_enb); +void usb1_function_setting_interrupt(uint8_t level); +void usb1_function_reset_module(uint16_t clockmode); +uint16_t usb1_function_get_buf_size(uint16_t pipe); +uint16_t usb1_function_get_mxps(uint16_t pipe); +void usb1_function_clear_brdy_sts(uint16_t pipe); +void usb1_function_clear_bemp_sts(uint16_t pipe); +void usb1_function_clear_nrdy_sts(uint16_t pipe); +void usb1_function_set_pid_buf(uint16_t pipe); +void usb1_function_set_pid_nak(uint16_t pipe); +void usb1_function_set_pid_stall(uint16_t pipe); +void usb1_function_clear_pid_stall(uint16_t pipe); +uint16_t usb1_function_get_pid(uint16_t pipe); +void usb1_function_set_sqclr(uint16_t pipe); +void usb1_function_set_sqset(uint16_t pipe); +void usb1_function_set_csclr(uint16_t pipe); +void usb1_function_aclrm(uint16_t pipe); +void usb1_function_set_aclrm(uint16_t pipe); +void usb1_function_clr_aclrm(uint16_t pipe); +uint16_t usb1_function_get_sqmon(uint16_t pipe); +uint16_t usb1_function_get_inbuf(uint16_t pipe); + +/* ==== function ==== */ +void usb1_function_init_status(void); +void usb1_function_InitModule(uint16_t mode); +uint16_t usb1_function_CheckVBUStaus(void); +void usb1_function_USB_FUNCTION_Attach(void); +void usb1_function_USB_FUNCTION_Detach(void); +void usb1_function_USB_FUNCTION_BusReset(void); +void usb1_function_USB_FUNCTION_Resume(void); +void usb1_function_USB_FUNCTION_Suspend(void); +void usb1_function_USB_FUNCTION_TestMode(void); +void usb1_function_ResetDCP(void); +void usb1_function_ResetEP(uint16_t num); +uint16_t usb1_function_EpToPipe(uint16_t ep); +void usb1_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num); +uint16_t usb1_function_GetConfigNum(void); +uint16_t usb1_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num); +uint16_t usb1_function_CheckRemoteWakeup(void); +void usb1_function_clear_alt(void); +void usb1_function_clear_pipe_tbl(void); +void usb1_function_clear_ep_table_index(void); +uint16_t usb1_function_GetInterfaceNum(uint16_t num); + +#ifdef __cplusplus +} +#endif + + +#endif /* USB1_FUNCTION_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_api.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,104 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_api.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB1_FUNCTION_API_H +#define USB1_FUNCTION_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Variable Externs +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb1_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode); +uint16_t usb1_api_function_IsConfigured(void); +uint16_t usb1_function_GetDeviceState(void); +uint16_t usb1_api_function_CtrlReadStart(uint32_t size, uint8_t *data); +void usb1_api_function_CtrlWriteStart(uint32_t size, uint8_t *data); +uint16_t usb1_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb1_api_function_check_pipe_status(uint16_t pipe, uint32_t *size); +void usb1_api_function_clear_pipe_status(uint16_t pipe); +void usb1_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +void usb1_api_function_set_pid_buf(uint16_t pipe); +void usb1_api_function_set_pid_nak(uint16_t pipe); +void usb1_api_function_set_pid_stall(uint16_t pipe); +void usb1_api_function_clear_pid_stall(uint16_t pipe); +uint16_t usb1_api_function_get_pid(uint16_t pipe); +int32_t usb1_api_function_check_stall(uint16_t pipe); +void usb1_api_function_set_sqclr(uint16_t pipe); +void usb1_api_function_set_sqset(uint16_t pipe); +void usb1_api_function_set_csclr(uint16_t pipe); +void usb1_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb1_api_function_clear_brdy_sts(uint16_t pipe); +void usb1_api_function_clear_bemp_sts(uint16_t pipe); +void usb1_api_function_clear_nrdy_sts(uint16_t pipe); + +void usb1_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* USB1_FUNCTION_API_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dmacdrv.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB1_FUNCTION_DMACDRV_H +#define USB1_FUNCTION_DMACDRV_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ +typedef struct dmac_transinfo +{ + uint32_t src_addr; /* Transfer source address */ + uint32_t dst_addr; /* Transfer destination address */ + uint32_t count; /* Transfer byte count */ + uint32_t src_size; /* Transfer source data size */ + uint32_t dst_size; /* Transfer destination data size */ + uint32_t saddr_dir; /* Transfer source address direction */ + uint32_t daddr_dir; /* Transfer destination address direction */ +} dmac_transinfo_t; + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +/* ==== Transfer specification of the sample program ==== */ +#define DMAC_SAMPLE_SINGLE (0) /* Single transfer */ +#define DMAC_SAMPLE_CONTINUATION (1) /* Continuous transfer (use REN bit) */ + +/* ==== DMA modes ==== */ +#define DMAC_MODE_REGISTER (0) /* Register mode */ +#define DMAC_MODE_LINK (1) /* Link mode */ + +/* ==== Transfer requests ==== */ +#define DMAC_REQ_MODE_EXT (0) /* External request */ +#define DMAC_REQ_MODE_PERI (1) /* On-chip peripheral module request */ +#define DMAC_REQ_MODE_SOFT (2) /* Auto-request (request by software) */ + +/* ==== DMAC transfer sizes ==== */ +#define DMAC_TRANS_SIZE_8 (0) /* 8 bits */ +#define DMAC_TRANS_SIZE_16 (1) /* 16 bits */ +#define DMAC_TRANS_SIZE_32 (2) /* 32 bits */ +#define DMAC_TRANS_SIZE_64 (3) /* 64 bits */ +#define DMAC_TRANS_SIZE_128 (4) /* 128 bits */ +#define DMAC_TRANS_SIZE_256 (5) /* 256 bits */ +#define DMAC_TRANS_SIZE_512 (6) /* 512 bits */ +#define DMAC_TRANS_SIZE_1024 (7) /* 1024 bits */ + +/* ==== Address increment for transferring ==== */ +#define DMAC_TRANS_ADR_NO_INC (1) /* Not increment */ +#define DMAC_TRANS_ADR_INC (0) /* Increment */ + +/* ==== Method for detecting DMA request ==== */ +#define DMAC_REQ_DET_FALL (0) /* Falling edge detection */ +#define DMAC_REQ_DET_RISE (1) /* Rising edge detection */ +#define DMAC_REQ_DET_LOW (2) /* Low level detection */ +#define DMAC_REQ_DET_HIGH (3) /* High level detection */ + +/* ==== Request Direction ==== */ +#define DMAC_REQ_DIR_SRC (0) /* DMAREQ is the source/ DMAACK is active when reading */ +#define DMAC_REQ_DIR_DST (1) /* DMAREQ is the destination/ DMAACK is active when writing */ + +/* ==== Descriptors ==== */ +#define DMAC_DESC_HEADER (0) /* Header */ +#define DMAC_DESC_SRC_ADDR (1) /* Source Address */ +#define DMAC_DESC_DST_ADDR (2) /* Destination Address */ +#define DMAC_DESC_COUNT (3) /* Transaction Byte */ +#define DMAC_DESC_CHCFG (4) /* Channel Confg */ +#define DMAC_DESC_CHITVL (5) /* Channel Interval */ +#define DMAC_DESC_CHEXT (6) /* Channel Extension */ +#define DMAC_DESC_LINK_ADDR (7) /* Link Address */ + +/* ==== On-chip peripheral module requests ===== */ +typedef enum dmac_request_factor +{ + DMAC_REQ_USB0_DMA0_TX, /* USB_0 channel 0 transmit FIFO empty */ + DMAC_REQ_USB0_DMA0_RX, /* USB_0 channel 0 receive FIFO full */ + DMAC_REQ_USB0_DMA1_TX, /* USB_0 channel 1 transmit FIFO empty */ + DMAC_REQ_USB0_DMA1_RX, /* USB_0 channel 1 receive FIFO full */ + DMAC_REQ_USB1_DMA0_TX, /* USB_1 channel 0 transmit FIFO empty */ + DMAC_REQ_USB1_DMA0_RX, /* USB_1 channel 0 receive FIFO full */ + DMAC_REQ_USB1_DMA1_TX, /* USB_1 channel 1 transmit FIFO empty */ + DMAC_REQ_USB1_DMA1_RX, /* USB_1 channel 1 receive FIFO full */ +} dmac_request_factor_t; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb1_function_DMAC3_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb1_function_DMAC3_Open(uint32_t req); +void usb1_function_DMAC3_Close(uint32_t *remain); +void usb1_function_DMAC3_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +void usb1_function_DMAC4_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb1_function_DMAC4_Open(uint32_t req); +void usb1_function_DMAC4_Close(uint32_t *remain); +void usb1_function_DMAC4_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* USB1_FUNCTION_DMACDRV_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dataio.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2932 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dataio.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static uint16_t g_usb1_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)]; + +static void usb1_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static uint16_t usb1_function_read_dma_d0(uint16_t pipe); +static uint16_t usb1_function_read_dma_d1(uint16_t pipe); +static uint16_t usb1_function_write_dma_d0(uint16_t pipe); +static uint16_t usb1_function_write_dma_d1(uint16_t pipe); + +static void usb1_function_read_c_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_write_c_fifo(uint16_t Pipe, uint16_t count); +static void usb1_function_read_d0_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_write_d0_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_read_d1_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_write_d1_fifo(uint16_t pipe, uint16_t count); + +static void usb1_function_clear_transaction_counter(uint16_t pipe); +static void usb1_function_set_transaction_counter(uint16_t pipe, uint32_t count); + +static uint32_t usb1_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr); + +static uint16_t usb1_function_set_dfacc_d0(uint16_t mbw, uint32_t count); +static uint16_t usb1_function_set_dfacc_d1(uint16_t mbw, uint32_t count); + + +/******************************************************************************* +* Function Name: usb1_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t usefifo; + uint16_t mbw; + + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + usb1_function_clear_bemp_sts(pipe); + usb1_function_clear_brdy_sts(pipe); + usb1_function_clear_nrdy_sts(pipe); + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + case USB_FUNCTION_D0FIFO_DMA: + usefifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + case USB_FUNCTION_D1FIFO_DMA: + usefifo = USB_FUNCTION_D1USE; + break; + + default: + usefifo = USB_FUNCTION_CUSE; + break; + }; + + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw); + + usb1_function_clear_transaction_counter(pipe); + + usb1_function_aclrm(pipe); + + status = usb1_function_write_buffer(pipe); + + if (status != DEVDRV_USBF_FIFOERROR) + { + usb1_function_set_pid_buf(pipe); + } + + return status; +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer +* Description : Writes data in the buffer allocated in the pipe specified by +* : the argument. The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer (uint16_t pipe) +{ + uint16_t status; + uint16_t usefifo; + + g_usb1_function_PipeIgnore[pipe] = 0; + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + status = usb1_function_write_buffer_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_USE: + status = usb1_function_write_buffer_d1(pipe); + break; + + case USB_FUNCTION_D0FIFO_DMA: + status = usb1_function_write_dma_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_DMA: + status = usb1_function_write_dma_d1(pipe); + break; + + default: + status = usb1_function_write_buffer_c(pipe); + break; + }; + + switch (status) + { + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb1_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + usb1_function_enable_brdy_int(pipe); /* Enable Ready Interrupt */ + break; + + case DEVDRV_USBF_WRITEEND: /* End of data write */ + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb1_function_clear_nrdy_sts(pipe); + usb1_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + /* for last transfer */ + usb1_function_enable_bemp_int(pipe); /* Enable Empty Interrupt */ + break; + + case DEVDRV_USBF_WRITEDMA: /* DMA write */ + usb1_function_clear_nrdy_sts(pipe); + usb1_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb1_function_disable_bemp_int(pipe); /* Disable Empty Interrupt */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer_c +* Description : Writes data in the buffer allocated in the pipe specified in +* : the argument. Writes data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + if (g_usb1_function_CtrZeroLengthFlag == 1) + { + g_usb1_function_CtrZeroLengthFlag = 0; /* Zero Length Packet Flag CLR */ + return DEVDRV_USBF_WRITEEND; + } + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + if (pipe == USB_FUNCTION_PIPE0) + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + } + else + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + } + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb1_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb1_function_write_c_fifo(pipe, (uint16_t)count); + + if (g_usb1_function_data_count[pipe] < (uint32_t)size) + { + g_usb1_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB201.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0) + { + USB201.CFIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + g_usb1_function_CtrZeroLengthFlag = 1; /* Zero Length Packet Flag */ + } + } + else + { + g_usb1_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb1_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb1_function_write_d0_fifo(pipe, (uint16_t)count); + + if (g_usb1_function_data_count[pipe] < (uint32_t)size) + { + g_usb1_function_data_count[pipe] = 0; + if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb1_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb1_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb1_function_write_d1_fifo(pipe, (uint16_t)count); + + if (g_usb1_function_data_count[pipe] < (uint32_t)size) + { + g_usb1_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb1_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D0FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb1_function_write_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb1_function_data_count[pipe]; + + if (count != 0) + { + g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; + + if ((count % size) != 0) + { + g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 1; + } + else + { + g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; + } + + dfacc = usb1_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb1_function_data_count[pipe] = 0; + g_usb1_function_data_pointer[pipe] += count; + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB201.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_dma_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D1FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb1_function_write_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc=0; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb1_function_data_count[pipe]; + + if (count != 0) + { + g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; + if ((count % size) != 0) + { + g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 1; + } + else + { + g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; + } + + dfacc = usb1_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb1_function_data_count[pipe] = 0; + g_usb1_function_data_pointer[pipe] += count; + + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB201.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb1_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t usefifo; + + usb1_function_clear_bemp_sts(pipe); + usb1_function_clear_brdy_sts(pipe); + usb1_function_clear_nrdy_sts(pipe); + + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb1_function_start_receive_trns_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_USE: + usb1_function_start_receive_trns_d1(pipe, size, data); + break; + + case USB_FUNCTION_D0FIFO_DMA: + usb1_function_start_receive_dma_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_DMA: + usb1_function_start_receive_dma_d1(pipe, size, data); + break; + + default: + usb1_function_start_receive_trns_c(pipe, size, data); + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_trns_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* : When storing data in the buffer allocated in the pipe specified in the +* : argument, BRDY interrupt is generated to read data +* : in the interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = size; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_trns_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data in the +* : interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = size; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_trns_d1 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D1FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = size; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_dma_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb1_function_read_dma(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + else + { + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_dma_d1 +* Description : Read data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb1_function_read_dma(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + else + { + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Uses FIF0 set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer (uint16_t pipe) +{ + uint16_t status; + + g_usb1_function_PipeIgnore[pipe] = 0; + + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + status = usb1_function_read_buffer_d0(pipe); + } + else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + status = usb1_function_read_buffer_d1(pipe); + } + else + { + status = usb1_function_read_buffer_c(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb1_function_disable_brdy_int(pipe); + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + } + + if (count == 0) /* 0 length packet */ + { + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb1_function_read_c_fifo(pipe, (uint16_t)count); + } + + g_usb1_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer_d0 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb1_function_read_d0_fifo(pipe, (uint16_t)count); + } + + g_usb1_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer_d1 +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb1_function_read_d1_fifo(pipe, (uint16_t)count); + } + + g_usb1_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_dma +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO or D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_dma (uint16_t pipe) +{ + uint16_t status; + + g_usb1_function_PipeIgnore[pipe] = 0; + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + status = usb1_function_read_dma_d0(pipe); + } + else + { + status = usb1_function_read_dma_d1(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READZERO: /* End of data read */ + usb1_function_disable_brdy_int(pipe); + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb1_function_disable_brdy_int(pipe); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + } + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + } + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb1_function_read_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + uint16_t pipebuf_size; + + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb1_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb1_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb1_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; /* not use in read operation */ + g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; /* not use in read operation */ + + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb1_function_data_count[pipe] -= count; + g_usb1_function_data_pointer[pipe] += count; + g_usb1_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_dma_d1 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by DMA transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb1_function_read_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + uint16_t pipebuf_size; + + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb1_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb1_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb1_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; /* not use in read operation */ + g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; /* not use in read operation */ + + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb1_function_data_count[pipe] -= count; + g_usb1_function_data_pointer[pipe] += count; + g_usb1_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_change_fifo_port +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. After allocating FIF0, waits in the software +* : till the corresponding pipe becomes ready. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : DEVDRV_USBF_FIFOERROR ; Error +* : Others ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value +*******************************************************************************/ +uint16_t usb1_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + usb1_function_set_curpipe(pipe, fifosel, isel, mbw); + + for (loop = 0; loop < 4; loop++) + { + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB201.CFIFOCTR; + break; + + case USB_FUNCTION_D0USE: + case USB_FUNCTION_D0DMA: + buffer = USB201.D0FIFOCTR; + break; + + case USB_FUNCTION_D1USE: + case USB_FUNCTION_D1DMA: + buffer = USB201.D1FIFOCTR; + break; + + default: + buffer = 0; + break; + } + + if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY) + { + return buffer; + } + + loop2 = 25; + while (loop2-- > 0) + { + /* wait */ + } + } + + return DEVDRV_USBF_FIFOERROR; +} + +/******************************************************************************* +* Function Name: usb1_function_set_curpipe +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb1_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + g_usb1_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB201.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB201.D0FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB201.D1FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_curpipe2 +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* : uint16_t dfacc ; DFACC Access mode +* Return Value : none +*******************************************************************************/ +void usb1_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc) +{ + uint16_t buffer; + uint32_t loop; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + uint32_t dummy; +#endif + volatile uint32_t loop2; + + g_usb1_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB201.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB201.D0FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB201.D0FIFO.UINT32; + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB201.D1FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB201.D1FIFO.UINT32; + loop = dummy; // avoid warning. + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_write_c_fifo +* Description : Writes data in CFIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_write_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB201.CFIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB201.CFIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB201.CFIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_read_c_fifo +* Description : Reads data from CFIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_read_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb1_function_data_pointer[pipe] = USB201.CFIFO.UINT8[HH]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT16[H]; + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT32; + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_write_d0_fifo +* Description : Writes data in D0FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_write_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB201.D0FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB201.D0FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB201.D0FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_read_d0_fifo +* Description : Reads data from D0FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating DOFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_read_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb1_function_data_pointer[pipe] = USB201.D0FIFO.UINT8[HH]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT16[H]; + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT32; + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_write_d1_fifo +* Description : Writes data in D1FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_write_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB201.D1FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB201.D1FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB201.D1FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_read_d1_fifo +* Description : Reads data from D1FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_read_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb1_function_data_pointer[pipe] = USB201.D1FIFO.UINT8[HH]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT16[H]; + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT32; + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_com_get_dmasize +* Description : Calculates access width of DMA transfer by the argument to +* : return as the Return Value. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : DMA transfer size : 0 8bit +* : : 1 16bit +* : : 2 32bit +*******************************************************************************/ +static uint32_t usb1_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + + if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0)) + { + /* When transfer byte count is odd */ + /* or transfer data area is 8-bit alignment */ + size = 0; /* 8bit */ + } + else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0)) + { + /* When the transfer byte count is multiples of 2 */ + /* or the transfer data area is 16-bit alignment */ + size = 1; /* 16bit */ + } + else + { + /* When the transfer byte count is multiples of 4 */ + /* or the transfer data area is 32-bit alignment */ + size = 2; /* 32bit */ + } + + return size; +} + +/******************************************************************************* +* Function Name: usb1_function_get_mbw +* Description : Calculates access width of DMA to return the value set in MBW. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : FIFO transfer size : USB_FUNCTION_BITMBW_8 8bit +* : : USB_FUNCTION_BITMBW_16 16bit +* : : USB_FUNCTION_BITMBW_32 32bit +*******************************************************************************/ +uint16_t usb1_function_get_mbw (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + uint16_t mbw; + + size = usb1_function_com_get_dmasize(trncount, dtptr); + + if (size == 0) + { + /* 8bit */ + mbw = USB_FUNCTION_BITMBW_8; + } + else if (size == 1) + { + /* 16bit */ + mbw = USB_FUNCTION_BITMBW_16; + } + else + { + /* 32bit */ + mbw = USB_FUNCTION_BITMBW_32; + } + + return mbw; +} + +/******************************************************************************* +* Function Name: usb1_function_set_transaction_counter +* Description : Sets transaction counter by the argument(PIPEnTRN). +* : Clears transaction before setting to enable transaction counter setting. +* Arguments : uint16_t pipe ; Pipe number +* : uint32_t bsize : Data transfer size +* Return Value : none +*******************************************************************************/ +static void usb1_function_set_transaction_counter (uint16_t pipe, uint32_t bsize) +{ + uint16_t mxps; + uint16_t cnt; + + if (bsize == 0) + { + return; + } + + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if ((bsize % mxps) == 0) + { + cnt = (uint16_t)(bsize / mxps); + } + else + { + cnt = (uint16_t)((bsize / mxps) + 1); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE1TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE2TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE3TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE4TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE5TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE9TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEATRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEBTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPECTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEDTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEETRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEFTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_clear_transaction_counter +* Description : Clears the transaction counter by the argument. +* : After executing this function, the transaction counter is invalid. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_transaction_counter (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_stop_transfer +* Description : Stops the USB transfer in the pipe specified by the argument. +* : After stopping the USB transfer, clears the buffer allocated in +* : the pipe. +* : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0; +* : invalid. After executing this function, BRDY/NRDY/BEMP interrupt +* : in the corresponding pipe becomes invalid. Sequence bit is also +* : cleared. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_stop_transfer (uint16_t pipe) +{ + uint16_t usefifo; + uint32_t remain; + uint16_t fifo; + + usb1_function_set_pid_nak(pipe); + + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb1_function_clear_transaction_counter(pipe); + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + usb1_function_clear_transaction_counter(pipe); + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1USE; + break; + + case USB_FUNCTION_D0FIFO_DMA: + remain = Userdef_USB_usb1_function_stop_dma0(); + usb1_function_dma_stop_d0(pipe, remain); + usb1_function_clear_transaction_counter(pipe); + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0DMA; + break; + + case USB_FUNCTION_D1FIFO_DMA: + remain = Userdef_USB_usb1_function_stop_dma1(); + usb1_function_dma_stop_d1(pipe, remain); + usb1_function_clear_transaction_counter(pipe); + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1DMA; + break; + + default: + usb1_function_clear_transaction_counter(pipe); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_CUSE; + break; + } + + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16); + + /* Interrupt of pipe set is disabled */ + usb1_function_disable_brdy_int(pipe); + usb1_function_disable_nrdy_int(pipe); + usb1_function_disable_bemp_int(pipe); + + usb1_function_aclrm(pipe); + usb1_function_set_csclr(pipe); + + if ( g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT ) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_dfacc_d0 +* Description : Sets the DFACC setting value in D0FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb1_function_set_dfacc_d0 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + return dfacc; +} + +/******************************************************************************* +* Function Name: usb1_function_set_dfacc_d1 +* Description : Set the DFACC setting value in D1FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb1_function_set_dfacc_d1 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + + return dfacc; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_dma.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,346 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dma.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static void usb1_function_dmaint(uint16_t fifo); +static void usb1_function_dmaint_buf2fifo(uint16_t pipe); +static void usb1_function_dmaint_fifo2buf(uint16_t pipe); + + +/******************************************************************************* +* Function Name: usb1_function_dma_stop_d0 +* Description : D0FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_stop_d0 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB201.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB201.D0FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain); + g_usb1_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb1_function_dma_stop_d1 +* Description : D1FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_stop_d1 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB201.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB201.D1FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain); + g_usb1_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb1_function_dma_interrupt_d0fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb1_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_interrupt_d0fifo (uint32_t int_sense) +{ + usb1_function_dmaint(USB_FUNCTION_D0FIFO); + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb1_function_dma_interrupt_d1fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb1_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_interrupt_d1fifo (uint32_t int_sense) +{ + usb1_function_dmaint(USB_FUNCTION_D1FIFO); + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb1_function_dmaint +* Description : This function is DMA transfer end interrupt +* Arguments : uint16_t fifo ; fifo number +* : ; USB_FUNCTION_D0FIFO +* : ; USB_FUNCTION_D1FIFO +* Return Value : none +*******************************************************************************/ +static void usb1_function_dmaint (uint16_t fifo) +{ + uint16_t pipe; + + pipe = g_usb1_function_DmaPipe[fifo]; + + if (g_usb1_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO) + { + usb1_function_dmaint_buf2fifo(pipe); + } + else + { + usb1_function_dmaint_fifo2buf(pipe); + } +} + +/******************************************************************************* +* Function Name: usb1_function_dmaint_fifo2buf +* Description : Executes read completion from FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb1_function_dmaint_fifo2buf (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb1_function_stop_dma0(); + usb1_function_dma_stop_d0(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb1_function_enable_brdy_int(pipe); + } + } + } + else + { + remain = Userdef_USB_usb1_function_stop_dma1(); + usb1_function_dma_stop_d1(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb1_function_enable_brdy_int(pipe); + } + } + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_dmaint_buf2fifo +* Description : Executes write completion in FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb1_function_dmaint_buf2fifo (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb1_function_stop_dma0(); + usb1_function_dma_stop_d0(pipe, remain); + + if (g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB201.D0FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + else + { + remain = Userdef_USB_usb1_function_stop_dma1(); + usb1_function_dma_stop_d1(pipe, remain); + + if (g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB201.D1FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + + usb1_function_enable_bemp_int(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_intrn.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,249 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_intrn.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_brdy_int +* Description : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9). +* : According to the pipe that interrupt is generated in, +* : reads/writes buffer allocated in the pipe. +* : This function is executed in the BRDY interrupt handler. +* : This function clears BRDY interrupt status and BEMP interrupt +* : status. +* Arguments : uint16_t Status ; BRDYSTS Register Value +* : uint16_t Int_enbl ; BRDYENB Register Value +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_brdy_int (uint16_t status, uint16_t int_enb) +{ + uint32_t int_sense = 0; + uint16_t pipe; + uint16_t pipebit; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + pipebit = g_usb1_function_bit_set[pipe]; + + if ((status & pipebit) && (int_enb & pipebit)) + { + USB201.BRDYSTS = (uint16_t)~pipebit; + USB201.BEMPSTS = (uint16_t)~pipebit; + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) + { + usb1_function_dma_interrupt_d0fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb1_function_read_dma(pipe); + usb1_function_disable_brdy_int(pipe); + } + else + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) + { + usb1_function_dma_interrupt_d1fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb1_function_read_dma(pipe); + usb1_function_disable_brdy_int(pipe); + } + else + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) + { + usb1_function_read_buffer(pipe); + } + else + { + usb1_function_write_buffer(pipe); + } + } + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_nrdy_int +* Description : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9). +* : Checks NRDY interrupt cause by PID. When the cause if STALL, +* : regards the pipe state as STALL and ends the processing. +* : Then the cause is not STALL, increments the error count to +* : communicate again. When the error count is 3, determines +* : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing. +* : This function is executed in the NRDY interrupt handler. +* : This function clears NRDY interrupt status. +* Arguments : uint16_t status ; NRDYSTS Register Value +* : uint16_t int_enb ; NRDYENB Register Value +* Return Value : none +*******************************************************************************/ +void usb1_function_nrdy_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + + bitcheck = (uint16_t)(status & int_enb); + + USB201.NRDYSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe]) + { + if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1) + { + if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT) + { + pid = usb1_function_get_pid(pipe); + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + g_usb1_function_PipeIgnore[pipe]++; + if (g_usb1_function_PipeIgnore[pipe] == 3) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } + else + { + usb1_function_set_pid_buf(pipe); + } + } + } + } + else + { + /* USB Function */ + } + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_bemp_int +* Description : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9). +* Arguments : uint16_t status ; BEMPSTS Register Value +* : uint16_t int_enb ; BEMPENB Register Value +* Return Value : none +*******************************************************************************/ +void usb1_function_bemp_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + uint16_t inbuf; + + bitcheck = (uint16_t)(status & int_enb); + + USB201.BEMPSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe]) + { + pid = usb1_function_get_pid(pipe); + + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + inbuf = usb1_function_get_inbuf(pipe); + + if (inbuf == 0) + { + usb1_function_disable_bemp_int(pipe); + usb1_function_set_pid_nak(pipe); + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + } + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/common/usb1_function_lib.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2044 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_lib.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_enable_brdy_int +* Description : Enables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_enable_brdy_int (uint16_t pipe) +{ + /* enable brdy interrupt */ + USB201.BRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_function_disable_brdy_int +* Description : Disables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_disable_brdy_int (uint16_t pipe) +{ + /* disable brdy interrupt */ + USB201.BRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_brdy_sts (uint16_t pipe) +{ + /* clear brdy status */ + USB201.BRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_enable_bemp_int +* Description : Enables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_enable_bemp_int (uint16_t pipe) +{ + /* enable bemp interrupt */ + USB201.BEMPENB |= (uint16_t)g_usb1_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_function_disable_bemp_int +* Description : Disables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_disable_bemp_int (uint16_t pipe) +{ + /* disable bemp interrupt */ + USB201.BEMPENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_bemp_sts (uint16_t pipe) +{ + /* clear bemp status */ + USB201.BEMPSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_enable_nrdy_int +* Description : Enables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : NRDY. Enables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_enable_nrdy_int (uint16_t pipe) +{ + /* enable nrdy interrupt */ + USB201.NRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_function_disable_nrdy_int +* Description : Disables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : NRDY. Disables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_disable_nrdy_int (uint16_t pipe) +{ + /* disable nrdy interrupt */ + USB201.NRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_nrdy_sts (uint16_t pipe) +{ + /* clear nrdy status */ + USB201.NRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_is_hispeed +* Description : Returns the result of USB reset hand shake (RHST) as +* : return value. +* Arguments : none +* Return Value : USB_FUNCTION_HIGH_SPEED ; Hi-Speed +* : USB_FUNCTION_FULL_SPEED ; Full-Speed +* : LOW_SPEED ; Low-Speed +* : USB_FUNCTION_NON_SPEED ; error +*******************************************************************************/ +uint16_t usb1_function_is_hispeed (void) +{ + uint16_t rhst; + uint16_t speed; + + rhst = RZA_IO_RegRead_16(&USB201.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST); + + if (rhst == USB_FUNCTION_HSMODE) + { + speed = USB_FUNCTION_HIGH_SPEED; + } + else if (rhst == USB_FUNCTION_FSMODE) + { + speed = USB_FUNCTION_FULL_SPEED; + } + else if (rhst == USB_FUNCTION_LSMODE) + { + speed = USB_FUNCTION_LOW_SPEED; + } + else + { + speed = USB_FUNCTION_NON_SPEED; + } + + return speed; +} + +/******************************************************************************* +* Function Name: usb1_function_is_hispeed_enable +* Description : Returns the USB High-Speed connection enabled status as +* : return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Hi-Speed Enable +* : DEVDRV_USBF_NO : Hi-Speed Disable +*******************************************************************************/ +uint16_t usb1_function_is_hispeed_enable (void) +{ + uint16_t ret; + + ret = DEVDRV_USBF_NO; + + if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1) + { + ret = DEVDRV_USBF_YES; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb1_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_pid_buf (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb1_function_set_pid_nak(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_BUF, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_pid_nak (uint16_t pipe) +{ + uint16_t pid; + uint16_t pbusy; + uint32_t loop; + + pid = usb1_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb1_function_set_pid_stall(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_NAK, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + + if (pid == DEVDRV_USBF_PID_BUF) + { + for (loop = 0; loop < 200; loop++) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pbusy = RZA_IO_RegRead_16(&USB201.DCPCTR, + USB_DCPCTR_PBUSY_SHIFT, + USB_DCPCTR_PBUSY); + break; + + case USB_FUNCTION_PIPE1: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE2: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE3: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE4: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE5: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE6: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE6CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE7: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE7CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE8: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE8CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE9: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_PBUSY_SHIFT, + USB_PIPEnCTR_9_PBUSY); + break; + + case USB_FUNCTION_PIPEA: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEB: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEC: + pbusy = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPED: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEE: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEF: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + default: + pbusy = 1; + break; + } + + if (pbusy == 0) + { + break; + } + Userdef_USB_usb1_function_delay_500ns(); + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_pid_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + if (pid == DEVDRV_USBF_PID_BUF) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_STALL2, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } + else + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_STALL, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_pid_stall (uint16_t pipe) +{ + usb1_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb1_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pid = RZA_IO_RegRead_16(&USB201.DCPCTR, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + pid = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + pid = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + pid = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + pid = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + pid = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + pid = RZA_IO_RegRead_16(&USB201.PIPE6CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + pid = RZA_IO_RegRead_16(&USB201.PIPE7CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + pid = RZA_IO_RegRead_16(&USB201.PIPE8CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + pid = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + pid = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + pid = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + pid = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + pid = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + pid = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + pid = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + pid = 0; + break; + } + + return pid; +} + +/******************************************************************************* +* Function Name: usb1_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_csclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + 1, + USB_DCPCTR_CSCLR_SHIFT, + USB_DCPCTR_CSCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_CSCLR_SHIFT, + USB_PIPEnCTR_9_CSCLR); + break; + + default: + /* PIPEA-F have not CSCLR */ + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_sqclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + 1, + USB_DCPCTR_SQCLR_SHIFT, + USB_DCPCTR_SQCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQCLR_SHIFT, + USB_PIPEnCTR_9_SQCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_sqset (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + 1, + USB_DCPCTR_SQSET_SHIFT, + USB_DCPCTR_SQSET); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQSET_SHIFT, + USB_PIPEnCTR_9_SQSET); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_get_sqmon +* Description : Toggle bit of specified pipe is obtained +* Arguments : uint16_t pipe ; Pipe number +* Return Value : sqmon +*******************************************************************************/ +uint16_t usb1_function_get_sqmon (uint16_t pipe) +{ + uint16_t sqmon; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + sqmon = RZA_IO_RegRead_16(&USB201.DCPCTR, + USB_DCPCTR_SQMON_SHIFT, + USB_DCPCTR_SQMON); + break; + + case USB_FUNCTION_PIPE1: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE2: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE3: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE4: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE5: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE6: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE6CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE7: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE7CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE8: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE8CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE9: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_SQMON_SHIFT, + USB_PIPEnCTR_9_SQMON); + break; + + case USB_FUNCTION_PIPEA: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEB: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEC: + sqmon = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPED: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEE: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEF: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + default: + sqmon = 0; + break; + } + + return sqmon; +} + +/******************************************************************************* +* Function Name: usb1_function_aclrm +* Description : The buffer of specified pipe is initialized +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb1_function_aclrm (uint16_t pipe) +{ + usb1_function_set_aclrm(pipe); + usb1_function_clr_aclrm(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_set_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb1_function_set_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_clr_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb1_function_clr_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 0, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_get_inbuf +* Description : Returns INBUFM of the pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : inbuf +*******************************************************************************/ +uint16_t usb1_function_get_inbuf (uint16_t pipe) +{ + uint16_t inbuf; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE1: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE2: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE3: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE4: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE5: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE6: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE7: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE8: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE9: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_INBUFM_SHIFT, + USB_PIPEnCTR_9_INBUFM); + break; + + case USB_FUNCTION_PIPEA: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEB: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEC: + inbuf = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPED: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEE: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEF: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + default: + inbuf = 0; + break; + } + + return inbuf; +} + +/******************************************************************************* +* Function Name: usb1_function_setting_interrupt +* Description : Sets the USB module interrupt level. +* Arguments : uint8_t level +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_setting_interrupt (uint8_t level) +{ + uint16_t d0fifo_dmaintid; + uint16_t d1fifo_dmaintid; + + R_INTC_RegistIntFunc(INTC_ID_USBI1, usb1_function_interrupt); + R_INTC_SetPriority(INTC_ID_USBI1, level); + R_INTC_Enable(INTC_ID_USBI1); + + d0fifo_dmaintid = Userdef_USB_usb1_function_d0fifo_dmaintid(); + + if (d0fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d0fifo_dmaintid, usb1_function_dma_interrupt_d0fifo); + R_INTC_SetPriority(d0fifo_dmaintid, level); + R_INTC_Enable(d0fifo_dmaintid); + } + + d1fifo_dmaintid = Userdef_USB_usb1_function_d1fifo_dmaintid(); + + if (d1fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d1fifo_dmaintid, usb1_function_dma_interrupt_d1fifo); + R_INTC_SetPriority(d1fifo_dmaintid, level); + R_INTC_Enable(d1fifo_dmaintid); + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_reset_module +* Description : Initializes the USB module. +* : Enables providing clock to the USB module. +* : Sets USB bus wait register. +* Arguments : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +void usb1_function_reset_module (uint16_t clockmode) +{ + /* UPLLE bit is only USB0 */ + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, + USB_SYSCFG_UPLLE_SHIFT, + USB_SYSCFG_UPLLE) == 1) + { + if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode) + { + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB201.SYSCFG0 = 0; + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb1_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + else + { + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + Userdef_USB_usb1_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + } + else + { + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB201.SYSCFG0 = 0; + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb1_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + + USB201.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT); +} + +/******************************************************************************* +* Function Name: usb1_function_get_buf_size +* Description : Obtains pipe buffer size specified by the argument and +* : maximum packet size of the USB device in use. +* : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum +* : packet size of the USB device using the corresponding pipe. +* : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the +* : corresponding pipe is in continuous transfer mode, +* : obtains the buffer size allocated in the corresponcing pipe, +* : when incontinuous transfer, obtains maximum packet size. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Maximum packet size or buffer size +*******************************************************************************/ +uint16_t usb1_function_get_buf_size (uint16_t pipe) +{ + uint16_t size; + uint16_t bufsize; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB201.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1) + { + bufsize = RZA_IO_RegRead_16(&g_usb1_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE); + size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF); + } + else + { + size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + } + return size; +} + +/******************************************************************************* +* Function Name: usb1_function_get_mxps +* Description : Obtains maximum packet size of the USB device using the pipe +* : specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Max Packet Size +*******************************************************************************/ +uint16_t usb1_function_get_mxps (uint16_t pipe) +{ + uint16_t size; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB201.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + return size; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_api.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,441 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_api.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" +#include "dev_drv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_api_function_init +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint8_t int_level ; interruput level +* : uint16_t mode : Speed modes +* : : USB_FUCNTION_HIGH_SPEED: High-speed device +* : : USB_FUCNTION_FULL_SPEED: Full-speed device +* : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode) +{ + volatile uint8_t dummy_buf; + + CPG.STBCR7 &= 0xfc; /*The clock of USB0/1 modules is permitted */ + dummy_buf = CPG.STBCR7; /* (Dummy read) */ + + usb1_function_setting_interrupt(int_level); + + usb1_function_reset_module(clockmode); /* reset USB module with setting tranciever */ + /* and HSE=1 */ + + usb1_function_init_status(); /* clear variables */ + + usb1_function_InitModule(mode); /* select USB Function and Interrupt Enable */ + /* Detect USB Device to attach or detach */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_api_function_IsConfigured +* Description : Checks if the USB device is configured to return the result as +* : the return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Configured & Configured Suspend +* : DEVDRV_USBF_NO : not Configured +*******************************************************************************/ +uint16_t usb1_api_function_IsConfigured (void) +{ + uint16_t dvst; + + dvst = usb1_function_GetDeviceState(); + + if ((dvst == USB_FUNCTION_DVST_CONFIGURED) || + (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND)) + { + return DEVDRV_USBF_YES; + } + + return DEVDRV_USBF_NO; +} + +/******************************************************************************* +* Function Name: usb1_function_GetDeviceState +* Description : Returns the state of USB device. +* Arguments : none +* Return Value : Device States +*******************************************************************************/ +uint16_t usb1_function_GetDeviceState (void) +{ + uint16_t dvsq; + uint16_t dvst; + + dvsq = USB201.INTSTS0; + switch (dvsq & USB_FUNCTION_BITDVSQ) + { + case USB_FUNCTION_DS_POWR: /* Power state *//* power-on */ + dvst = USB_FUNCTION_DVST_POWERED; + break; + + case USB_FUNCTION_DS_DFLT: /* Default state *//* bus-reset */ + dvst = USB_FUNCTION_DVST_DEFAULT; + break; + + case USB_FUNCTION_DS_ADDS: /* Address state */ + dvst = USB_FUNCTION_DVST_ADDRESS; + break; + + case USB_FUNCTION_DS_CNFG: /* Configured state */ + dvst = USB_FUNCTION_DVST_CONFIGURED; + break; + + case USB_FUNCTION_DS_SPD_CNFG: /* Configured Suspend state */ + dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND; + break; + + case USB_FUNCTION_DS_SPD_POWR: /* Power Suspend state */ + case USB_FUNCTION_DS_SPD_DFLT: /* Default Suspend state */ + case USB_FUNCTION_DS_SPD_ADDR: /* Address Suspend state */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + + default: /* error */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + } + + return dvst; +} + +/******************************************************************************* +* Function Name: usb1_api_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : none +*******************************************************************************/ +void usb1_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + usb1_function_start_receive_transfer(pipe, size, data); +} + +/******************************************************************************* +* Function Name: usb1_api_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + + status = usb1_function_start_send_transfer(pipe, size, data); + + return status; +} + +/******************************************************************************* +* Function Name: usb1_api_function_check_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t *size ; Data Size +* Return Value : Pipe Status +*******************************************************************************/ +uint16_t usb1_api_function_check_pipe_status (uint16_t pipe, uint32_t * size) +{ + if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE) + { + *size = g_usb1_function_PipeDataSize[pipe]; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_DONE; + } + else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES) + { + *size = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_NORES; + } + else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL) + { + *size = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_STALL; + } + else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR) + { + *size = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_FIFOERROR; + } + else + { + /* Do Nothing */ + } + + return g_usb1_function_pipe_status[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Pipe Status +*******************************************************************************/ +void usb1_api_function_clear_pipe_status (uint16_t pipe) +{ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb1_function_PipeDataSize[pipe] = 0; +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_pid_buf (uint16_t pipe) +{ + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_pid_nak (uint16_t pipe) +{ + usb1_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_pid_stall (uint16_t pipe) +{ + usb1_function_set_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_pid_stall (uint16_t pipe) +{ + usb1_function_clear_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb1_api_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + + return pid; +} + +/******************************************************************************* +* Function Name: usb1_api_function_check_stall +* Description : +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +int32_t usb1_api_function_check_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + + if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL) + { + return DEVDRV_USBF_STALL; + } + + return DEVDRV_SUCCESS; +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_sqclr (uint16_t pipe) +{ + usb1_function_set_sqclr(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_sqset (uint16_t pipe) +{ + usb1_function_set_sqset(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_csclr (uint16_t pipe) +{ + usb1_function_set_csclr(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_curpipe +* Description : Allocates FIF0 specifed by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + usb1_function_set_curpipe(pipe, fifosel, isel, mbw); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_brdy_sts (uint16_t pipe) +{ + usb1_function_clear_brdy_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_bemp_sts (uint16_t pipe) +{ + usb1_function_clear_bemp_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_nrdy_sts (uint16_t pipe) +{ + usb1_function_clear_nrdy_sts(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_controlrw.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_api_function_CtrlReadStart +* Description : Executes the USB control read transfer. +* : USB host controller <- USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; End of data write +* : DEVDRV_USBF_WRITESHRT ; End of short data write +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_FIFOERROR ; FIFO access error +*******************************************************************************/ +uint16_t usb1_api_function_CtrlReadStart (uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t mbw; + + usb1_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb1_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; + + status = usb1_function_write_buffer_c(USB_FUNCTION_PIPE0); + + /* Peripheral Control sequence */ + switch (status) + { + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + case DEVDRV_USBF_WRITEEND: /* End of data write (not null) */ + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0); /* Enable Empty Interrupt */ + usb1_function_set_pid_buf(USB_FUNCTION_PIPE0); /* Set BUF */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access error */ + break; + + default: + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_api_function_CtrlWriteStart +* Description : Executes the USB control write transfer. +* : USB host controller -> USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb1_api_function_CtrlWriteStart (uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb1_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb1_function_enable_brdy_int(USB_FUNCTION_PIPE0); + usb1_function_set_pid_buf(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_global.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,144 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_global.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +const uint16_t g_usb1_function_bit_set[16] = +{ + 0x0001, 0x0002, 0x0004, 0x0008, + 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, + 0x1000, 0x2000, 0x4000, 0x8000 +}; + +uint32_t g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint8_t * g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +uint16_t g_usb1_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint32_t g_usb1_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1]; + +USB_FUNCTION_DMA_t g_usb1_function_DmaInfo[2]; +uint16_t g_usb1_function_DmaPipe[2]; +uint16_t g_usb1_function_DmaBval[2]; +uint16_t g_usb1_function_DmaStatus[2]; + +uint16_t g_usb1_function_CtrZeroLengthFlag; + +//uint16_t g_usb1_function_ConfigNum; +//uint16_t g_usb1_function_Alternate[USB_FUNCTION_ALT_NO]; +//uint16_t g_usb1_function_RemoteWakeupFlag; +uint16_t g_usb1_function_TestModeFlag; +uint16_t g_usb1_function_TestModeSelectors; + +//uint16_t g_usb1_function_ReqType; +//uint16_t g_usb1_function_ReqTypeType; +//uint16_t g_usb1_function_ReqTypeRecip; +//uint16_t g_usb1_function_ReqRequest; +//uint16_t g_usb1_function_ReqValue; +//uint16_t g_usb1_function_ReqIndex; +//uint16_t g_usb1_function_ReqLength; + +//uint16_t g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +uint16_t g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +* Function Name: usb1_function_init_status +* Description : Initialization USB Sample Driver Variable. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_init_status (void) +{ + uint16_t pipe; + + //g_usb1_function_ConfigNum = 0; + //g_usb1_function_RemoteWakeupFlag = DEVDRV_USBF_OFF; + g_usb1_function_TestModeFlag = DEVDRV_USBF_OFF; + g_usb1_function_CtrZeroLengthFlag = 0; + +#if 0 + usb1_function_clear_alt(); +#endif + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb1_function_PipeDataSize[pipe] = 0; + g_usb1_function_data_count[pipe] = 0; + + /* pipe configuration in usb1_function_ResetEP() */ + g_usb1_function_pipecfg[pipe] = 0; + g_usb1_function_pipebuf[pipe] = 0; + g_usb1_function_pipemaxp[pipe] = 0; + g_usb1_function_pipeperi[pipe] = 0; + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sig.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,330 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_sig.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb1_function_EnableINTModule(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_InitModule +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint16_t mode ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode +* : ; other ; Full-speed Mode +* Return Value : none +*******************************************************************************/ +void usb1_function_InitModule (uint16_t mode) +{ + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); /* USB function */ + + /* USB module operation enabled */ + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + if (mode == USB_FUNCTION_HIGH_SPEED) + { + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); /* Hi-Speed Mode */ + } + else + { + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); + } + + /* for power-on */ + if (usb1_function_CheckVBUStaus() == DEVDRV_USBF_ON) + { + usb1_function_EnableINTModule(); /* Interrupt Enable */ + usb1_function_USB_FUNCTION_Attach(); /* pull-up D+ and open D- */ + } + else + { + usb1_function_USB_FUNCTION_Detach(); /* USB Detach */ + /* with Interrupt Enable */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_CheckVBUStaus +* Description : Checks the USB-VBUS state to returns the connection state to +* : the USB host. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : VBUS ON +* : DEVDRV_USBF_OFF : VBUS OFF +*******************************************************************************/ +uint16_t usb1_function_CheckVBUStaus (void) +{ + uint16_t buf1; + uint16_t buf2; + uint16_t buf3; + + /* monitor VBUS pins */ + do + { + buf1 = RZA_IO_RegRead_16(&USB201.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb1_function_delay_10us(1); + buf2 = RZA_IO_RegRead_16(&USB201.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb1_function_delay_10us(1); + buf3 = RZA_IO_RegRead_16(&USB201.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + } while ((buf1 != buf2) || (buf2 != buf3)); + + if (buf1 == DEVDRV_USBF_OFF) + { + return DEVDRV_USBF_OFF; /* detach */ + } + + return DEVDRV_USBF_ON; /* attach */ +} + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Attach +* Description : Connects to the USB host controller. +* : This function pulls up D+. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_USB_FUNCTION_Attach (void) +{ + Userdef_USB_usb1_function_attach(); + + Userdef_USB_usb1_function_delay_xms(10); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* Pull-up D+ and open D- */ +} + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Detach +* Description : Disconnects from the USB host controller. +* : This function opens D+/D-. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_USB_FUNCTION_Detach (void) +{ + uint16_t pipe; + + Userdef_USB_usb1_function_detach(); + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE) + { + usb1_function_stop_transfer(pipe); + } + } + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* open D+ and D- */ + + /* Detach Recovery */ + Userdef_USB_usb1_function_delay_500ns(); /* need 1us=500ns * 2 wait */ + Userdef_USB_usb1_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + Userdef_USB_usb1_function_delay_500ns(); /* need 100ns wait but 500ns S/W wait */ + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); /* soft reset module */ + Userdef_USB_usb1_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + usb1_function_EnableINTModule(); /* Interrupt Enable */ +} + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_BusReset +* Description : This function is executed when the USB device is transitioned +* : to POWERD_STATE. Sets the device descriptor according to the +* : connection speed determined by the USB reset hand shake. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb1_function_USB_FUNCTION_BusReset (void) +{ + usb1_function_init_status(); /* memory clear */ + + if (usb1_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) + { + usb1_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED); /* Device Descriptor reset */ + } + else + { + usb1_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED); /* Device Descriptor reset */ + } + + usb1_function_ResetDCP(); /* Default Control PIPE reset */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Resume +* Description : This function is executed when the USB device detects a resume +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb1_function_USB_FUNCTION_Resume (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Suspend +* Description : This function is executed when the USB device detects a suspend +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb1_function_USB_FUNCTION_Suspend (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_TestMode +* Description : This function is executed when the USB device is transitioned U +* : to TEST_MODE by the USB standard request. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_USB_FUNCTION_TestMode (void) +{ + switch (g_usb1_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT) + { + case USB_FUNCTION_FUNCTION_TEST_J: + case USB_FUNCTION_FUNCTION_TEST_K: + case USB_FUNCTION_FUNCTION_TEST_SE0_NAK: + case USB_FUNCTION_FUNCTION_TEST_PACKET: + RZA_IO_RegWrite_16(&USB201.TESTMODE, + (g_usb1_function_TestModeSelectors >> 8), + USB_TESTMODE_UTST_SHIFT, + USB_TESTMODE_UTST); + break; + + case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE: + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_EnableINTModule +* Description : Enables USB interrupt. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void usb1_function_EnableINTModule (void) +{ + uint16_t buf; + + buf = USB201.INTENB0; + buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE | + USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE); + USB201.INTENB0 = buf; + + usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/function/usb1_function_sub.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,453 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_sub.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +#if 0 +extern const uint16_t *g_usb1_function_EndPntPtr[]; +extern uint8_t g_usb1_function_DeviceDescriptor[]; +extern uint8_t *g_usb1_function_ConfigurationPtr[]; +#endif + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_ResetDCP +* Description : Initializes the default control pipe(DCP). +* Outline : Reset default control pipe +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_ResetDCP (void) +{ + USB201.DCPCFG = 0; +#if 0 + USB201.DCPMAXP = g_usb1_function_DeviceDescriptor[7]; +#else + USB201.DCPMAXP = 64; +#endif + + USB201.CFIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB201.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB201.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); +} + +/******************************************************************************* +* Function Name: usb1_function_ResetEP +* Description : Initializes the end point. +* Arguments : uint16_t num ; Configuration Number +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_ResetEP (uint16_t num) +{ + uint16_t pipe; + uint16_t ep; + uint16_t index; + uint16_t buf; + uint16_t * tbl; + + tbl = (uint16_t *)(g_usb1_function_EndPntPtr[num - 1]); + + for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + if (g_usb1_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR) + { + index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb1_function_EPTableIndex[ep]); + pipe = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE); + + g_usb1_function_PipeTbl[pipe] = (uint16_t)(((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) | + ep | + (tbl[index + 0] & USB_FUNCTION_FIFO_USE)); + + if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT) + { + tbl[index + 1] |= USB_FUNCTION_SHTNAKON; +#ifdef __USB_DMA_BFRE_ENABLE__ + /* this routine cannnot be perfomred if read operation is executed in buffer size */ + if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) || + ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)) + { + tbl[index + 1] |= USB_FUNCTION_BFREON; + } +#endif + } + + /* Interrupt Disable */ + buf = USB201.BRDYENB; + buf &= (uint16_t)~g_usb1_function_bit_set[pipe]; + USB201.BRDYENB = buf; + buf = USB201.NRDYENB; + buf &= (uint16_t)~g_usb1_function_bit_set[pipe]; + USB201.NRDYENB = buf; + buf = USB201.BEMPENB; + buf &= (uint16_t)~g_usb1_function_bit_set[pipe]; + USB201.BEMPENB = buf; + + usb1_function_set_pid_nak(pipe); + + /* CurrentPIPE Clear */ + if (RZA_IO_RegRead_16(&USB201.CFIFOSEL, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB201.CFIFOSEL, + 0, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB201.D0FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB201.D1FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + /* PIPE Configuration */ + USB201.PIPESEL = pipe; + USB201.PIPECFG = tbl[index + 1]; + USB201.PIPEBUF = tbl[index + 2]; + USB201.PIPEMAXP = tbl[index + 3]; + USB201.PIPEPERI = tbl[index + 4]; + + g_usb1_function_pipecfg[pipe] = tbl[index + 1]; + g_usb1_function_pipebuf[pipe] = tbl[index + 2]; + g_usb1_function_pipemaxp[pipe] = tbl[index + 3]; + g_usb1_function_pipeperi[pipe] = tbl[index + 4]; + + /* Buffer Clear */ + usb1_function_set_sqclr(pipe); + usb1_function_aclrm(pipe); + + /* init Global */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb1_function_PipeDataSize[pipe] = 0; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_EpToPipe +* Description : Returns the pipe which end point specified by the argument is +* : allocated to. +* Arguments : uint16_t ep ; Direction + Endpoint Number +* Return Value : USB_FUNCTION_EP_ERROR : Error +* : Others : Pipe Number +*******************************************************************************/ +uint16_t usb1_function_EpToPipe (uint16_t ep) +{ + uint16_t pipe; + + for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((g_usb1_function_PipeTbl[pipe] & 0x00ff) == ep) + { + return pipe; + } + } + + return USB_FUNCTION_EP_ERROR; +} + +/******************************************************************************* +* Function Name: usb1_function_InitEPTable +* Description : Sets the end point by the Alternate setting value of the +* : configuration number and the interface number specified by the +* : argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* : uint16_t Alt_Num ; Alternate Setting +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num) +{ + uint8_t * ptr; + uint16_t point_interface; + uint16_t point_endpoint; + uint16_t length; + uint16_t start; + uint16_t numbers; + uint16_t endpoint; + + ptr = (uint8_t *)g_usb1_function_ConfigurationPtr[Con_Num - 1]; + point_interface = *ptr; + length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2)); + ptr += *ptr; + start = 0; + numbers = 0; + point_endpoint = 0; + + for (; point_interface < length;) + { + switch (*(ptr + 1)) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num)) + { + numbers = *(ptr + 4); + } + else + { + start += *(ptr + 4); + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + if (point_endpoint < numbers) + { + endpoint = (uint16_t)(*(ptr + 2) & 0x0f); + g_usb1_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint); + ++point_endpoint; + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + default: /* Class, Vendor, else */ + point_interface += *ptr; + ptr += *ptr; + break; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_GetConfigNum +* Description : Returns the number of configuration referring to the number of +* : configuration described in the device descriptor. +* Arguments : none +* Return Value : Number of possible configurations (bNumConfigurations). +*******************************************************************************/ +#if 0 +uint16_t usb1_function_GetConfigNum (void) +{ + return (uint16_t)g_usb1_function_DeviceDescriptor[17]; +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_GetInterfaceNum +* Description : Returns the number of interface referring to the number of +* : interface described in the configuration descriptor. +* Arguments : uint16_t num ; Configuration Number +* Return Value : Number of this interface (bNumInterfaces). +*******************************************************************************/ +#if 0 +uint16_t usb1_function_GetInterfaceNum (uint16_t num) +{ + return (uint16_t)(*(g_usb1_function_ConfigurationPtr[num - 1] + 4)); +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_GetAltNum +* Description : Returns the Alternate setting value of the configuration number +* : and the interface number specified by the argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* Return Value : Value used to select this alternate setting(bAlternateSetting). +*******************************************************************************/ +#if 0 +uint16_t usb1_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num) +{ + uint8_t * ptr; + uint16_t point; + uint16_t alt_num = 0; + uint16_t length; + + ptr = (uint8_t *)(g_usb1_function_ConfigurationPtr[Con_Num - 1]); + point = ptr[0]; + ptr += ptr[0]; /* InterfaceDescriptor[0] */ + length = (uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 2)); + length |= (uint16_t)((uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8); + + for (; point < length;) /* Search Descriptor Table size */ + { + switch (ptr[1]) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if (Int_Num == ptr[2]) + { + alt_num = (uint16_t)ptr[3]; /* Alternate Number count */ + } + point += ptr[0]; + ptr += ptr[0]; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + default: /* Class, Vendor, else */ + point += ptr[0]; + ptr += ptr[0]; + break; + } + } + return alt_num; +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_CheckRemoteWakeup +* Description : Returns the result of the remote wake up function is supported +* : or not referring to the configuration descriptor. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : Support Remote Wakeup +* : DEVDRV_USBF_OFF : not Support Remote Wakeup +*******************************************************************************/ +#if 0 +uint16_t usb1_function_CheckRemoteWakeup (void) +{ + uint8_t atr; + + if (g_usb1_function_ConfigNum == 0) + { + return DEVDRV_USBF_OFF; + } + + atr = *(g_usb1_function_ConfigurationPtr[g_usb1_function_ConfigNum - 1] + 7); + + if (atr & USB_FUNCTION_CF_RWUP) + { + return DEVDRV_USBF_ON; + } + + return DEVDRV_USBF_OFF; +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_clear_alt +* Description : Initializes the Alternate setting area. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_clear_alt (void) +{ + int i; + + for (i = 0; i < USB_FUNCTION_ALT_NO; ++i) + { + g_usb1_function_Alternate[i] = 0; /* Alternate */ + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_clear_pipe_tbl +* Description : Initializes pipe definition table. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_pipe_tbl (void) +{ + int pipe; + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb1_function_PipeTbl[pipe] = 0; + } +} + +/******************************************************************************* +* Function Name: usb1_function_clear_ep_table_index +* Description : Initializes the end point table index. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_clear_ep_table_index (void) +{ + int ep; + + for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + g_usb1_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR; + } +} +#endif + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,698 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dmacdrv.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "rza_io_regrw.h" +#include "usb1_function_dmacdrv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DMAC_INDEFINE (255) /* Macro definition when REQD bit is not used */ + +/* ==== Request setting information for on-chip peripheral module ==== */ +typedef enum dmac_peri_req_reg_type +{ + DMAC_REQ_MID, + DMAC_REQ_RID, + DMAC_REQ_AM, + DMAC_REQ_LVL, + DMAC_REQ_REQD +} dmac_peri_req_reg_type_t; + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +/* ==== Prototype declaration ==== */ + +/* ==== Global variable ==== */ +/* On-chip peripheral module request setting table */ +static const uint8_t usb1_function_dmac_peri_req_init_table[8][5] = +{ + /* MID,RID,AM,LVL,REQD */ + {32, 3, 2, 1, 1}, /* USB_0 channel 0 transmit FIFO empty */ + {32, 3, 2, 1, 0}, /* USB_0 channel 0 receive FIFO full */ + {33, 3, 2, 1, 1}, /* USB_0 channel 1 transmit FIFO empty */ + {33, 3, 2, 1, 0}, /* USB_0 channel 1 receive FIFO full */ + {34, 3, 2, 1, 1}, /* USB_1 channel 0 transmit FIFO empty */ + {34, 3, 2, 1, 0}, /* USB_1 channel 0 receive FIFO full */ + {35, 3, 2, 1, 1}, /* USB_1 channel 1 transmit FIFO empty */ + {35, 3, 2, 1, 0}, /* USB_1 channel 1 receive FIFO full */ +}; + + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 1. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 1 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t *trans_info : Setting information to DMAC register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous transfer +* : uint32_t request_factor : Factor for on-chip peripheral module request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction: Setting value of CHCFG_n register REQD bit +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC3_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC3.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC3.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC3.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->daddr_dir, + DMAC3_CHCFG_n_DAD_SHIFT, + DMAC3_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->saddr_dir, + DMAC3_CHCFG_n_SAD_SHIFT, + DMAC3_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->dst_size, + DMAC3_CHCFG_n_DDS_SHIFT, + DMAC3_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->src_size, + DMAC3_CHCFG_n_SDS_SHIFT, + DMAC3_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_DMS_SHIFT, + DMAC3_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_RSEL_SHIFT, + DMAC3_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_SBE_SHIFT, + DMAC3_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_DEM_SHIFT, + DMAC3_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 1, + DMAC3_CHCFG_n_REN_SHIFT, + DMAC3_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 1, + DMAC3_CHCFG_n_RSW_SHIFT, + DMAC3_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_REN_SHIFT, + DMAC3_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_RSW_SHIFT, + DMAC3_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_TM_SHIFT, + DMAC3_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 3, + DMAC3_CHCFG_n_SEL_SHIFT, + DMAC3_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 1, + DMAC3_CHCFG_n_HIEN_SHIFT, + DMAC3_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_LOEN_SHIFT, + DMAC3_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC3_CHCFG_n_AM_SHIFT, + DMAC3_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC3_CHCFG_n_LVL_SHIFT, + DMAC3_CHCFG_n_LVL); + + if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC3_CHCFG_n_REQD_SHIFT, + DMAC3_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + req_direction, + DMAC3_CHCFG_n_REQD_SHIFT, + DMAC3_CHCFG_n_REQD); + } + + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC23_DMARS_CH3_RID_SHIFT, + DMAC23_DMARS_CH3_RID); + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC23_DMARS_CH3_MID_SHIFT, + DMAC23_DMARS_CH3_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_Open +* Description : Enables DMAC channel 3 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb1_function_DMAC3_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_EN_SHIFT, + DMAC3_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_TACT_SHIFT, + DMAC3_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_SWRST_SHIFT, + DMAC3_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC3.CHCTRL_n, + DMAC3_CHCTRL_n_SWRST_SHIFT, + DMAC3_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_SETEN_SHIFT, + DMAC3_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_STG_SHIFT, + DMAC3_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_Close +* Description : Aborts DMAC channel 3 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC3_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_CLREN_SHIFT, + DMAC3_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_TACT_SHIFT, + DMAC3_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_EN_SHIFT, + DMAC3_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC3.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 3 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 3 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC3_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_SR_SHIFT, + DMAC3_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC3.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC3.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC3.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC3.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC3.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC3.N1TB_n = count; /* Total transfer byte count */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 2. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 2 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t * trans_info : Setting information to DMAC +* : : register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous +* : : transfer +* : uint32_t request_factor : Factor for on-chip peripheral module +* : : request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction : Setting value of CHCFG_n register +* : : REQD bit +*******************************************************************************/ +void usb1_function_DMAC4_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC4.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC4.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC4.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->daddr_dir, + DMAC4_CHCFG_n_DAD_SHIFT, + DMAC4_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->saddr_dir, + DMAC4_CHCFG_n_SAD_SHIFT, + DMAC4_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->dst_size, + DMAC4_CHCFG_n_DDS_SHIFT, + DMAC4_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->src_size, + DMAC4_CHCFG_n_SDS_SHIFT, + DMAC4_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_DMS_SHIFT, + DMAC4_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_RSEL_SHIFT, + DMAC4_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_SBE_SHIFT, + DMAC4_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_DEM_SHIFT, + DMAC4_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 1, + DMAC4_CHCFG_n_REN_SHIFT, + DMAC4_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 1, + DMAC4_CHCFG_n_RSW_SHIFT, + DMAC4_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_REN_SHIFT, + DMAC4_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_RSW_SHIFT, + DMAC4_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_TM_SHIFT, + DMAC4_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 4, + DMAC4_CHCFG_n_SEL_SHIFT, + DMAC4_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 1, + DMAC4_CHCFG_n_HIEN_SHIFT, + DMAC4_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_LOEN_SHIFT, + DMAC4_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC4_CHCFG_n_AM_SHIFT, + DMAC4_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC4_CHCFG_n_LVL_SHIFT, + DMAC4_CHCFG_n_LVL); + if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC4_CHCFG_n_REQD_SHIFT, + DMAC4_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + req_direction, + DMAC4_CHCFG_n_REQD_SHIFT, + DMAC4_CHCFG_n_REQD); + } + RZA_IO_RegWrite_32(&DMAC45.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC45_DMARS_CH4_RID_SHIFT, + DMAC45_DMARS_CH4_RID); + RZA_IO_RegWrite_32(&DMAC45.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC45_DMARS_CH4_MID_SHIFT, + DMAC45_DMARS_CH4_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_Open +* Description : Enables DMAC channel 4 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb1_function_DMAC4_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_EN_SHIFT, + DMAC4_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_TACT_SHIFT, + DMAC4_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_SWRST_SHIFT, + DMAC4_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC4.CHCTRL_n, + DMAC4_CHCTRL_n_SWRST_SHIFT, + DMAC4_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_SETEN_SHIFT, + DMAC4_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_STG_SHIFT, + DMAC4_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_Close +* Description : Aborts DMAC channel 4 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC4_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_CLREN_SHIFT, + DMAC4_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_TACT_SHIFT, + DMAC4_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_EN_SHIFT, + DMAC4_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC4.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 4 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 4 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC4_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_SR_SHIFT, + DMAC4_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC4.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC4.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC4.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC4.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC4.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC4.N1TB_n = count; /* Total transfer byte count */ + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,762 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_userdef.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "devdrv_usb_function_api.h" +#include "usb1_function_dmacdrv.h" /* common DMAC driver for USB */ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DUMMY_ACCESS OSTM0CNT + +/* #define CACHE_WRITEBACK */ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern int32_t io_cwb(unsigned long start, unsigned long end); + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb1_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void usb1_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void Userdef_USB_usb1_function_delay_10us_2(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_d0fifo_dmaintid +* Description : get D0FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D0FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_d1fifo_dmaintid +* Description : get D1FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D1FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_attach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_attach (void) +{ + printf("\n"); + printf("channel 1 attach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_detach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_detach (void) +{ + printf("\n"); + printf("channel 1 detach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_1ms +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_1ms (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* + * Wait 1ms (Please change for your MCU). + */ + for (i = 0; i < 1440; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_xms +* Description : Wait for the software in the period of time specified by the +* : argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t msec ; Wait Time (msec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_xms (uint32_t msec) +{ + volatile unsigned short i; + + for (i = 0; i < msec; ++i) + { + Userdef_USB_usb1_function_delay_1ms(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_10us +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t usec ; Wait Time(x 10usec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_10us (uint32_t usec) +{ + volatile int i; + + /* Wait 10us (Please change for your MCU) */ + for (i = 0; i < usec; ++i) + { + Userdef_USB_usb1_function_delay_10us_2(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_10us_2 +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void Userdef_USB_usb1_function_delay_10us_2 (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 1us (Please change for your MCU) */ + for (i = 0; i < 14; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_500ns +* Description : Wait for software for 500ns. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_500ns (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 500ns (Please change for your MCU) */ + /* Wait 500ns I clock 266MHz */ + tmp = DUMMY_ACCESS; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_start_dma +* Description : Enables DMA transfer on the information specified by the argument. +* : Set DMAC register by this function to enable DMA transfer. +* : After executing this function, USB module is set to start DMA +* : transfer. DMA transfer should not wait for DMA transfer complete. +* Arguments : USB_FUNCTION_DMA_t *dma : DMA parameter +* : typedef struct{ +* : uint32_t fifo; FIFO for using +* : uint32_t buffer; Start address of transfer source/destination +* : uint32_t bytes; Transfer size(Byte) +* : uint32_t dir; Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer) +* : uint32_t size; DMA transfer size +* : } USB_FUNCTION_DMA_t; +* : uint16_t dfacc ; 0 : cycle steal mode +* : 1 : 16byte continuous mode +* : 2 : 32byte continuous mode +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc) +{ + uint32_t trncount; + uint32_t src; + uint32_t dst; + uint32_t size; + uint32_t dir; +#ifdef CACHE_WRITEBACK + uint32_t ptr; +#endif + + trncount = dma->bytes; + dir = dma->dir; + + if (dir == USB_FUNCTION_FIFO2BUF) + { + /* DxFIFO determination */ + dst = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + src += 3; /* byte access */ + } + else if (size == 1) + { + src += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB201.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB201.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + src += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + src += 3; /* byte access */ + } +#endif + } + else + { + /* DxFIFO determination */ + src = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + dst += 3; /* byte access */ + } + else if (size == 1) + { + dst += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB201.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB201.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + dst += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + dst += 3; /* byte access */ + } +#endif + } + +#ifdef CACHE_WRITEBACK + ptr = (uint32_t)dma->buffer; + + if ((ptr & 0x20000000ul) == 0) + { + io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount); + } +#endif + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + usb1_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc); + } + else + { + usb1_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc); + } +} + +/******************************************************************************* +* Function Name: usb1_function_enable_dmac0 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb1_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB1_DMA0_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB1_DMA0_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb1_function_DMAC3_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb1_function_DMAC3_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb1_function_DMAC3_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC3 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: usb1_function_enable_dmac1 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb1_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB1_DMA1_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB1_DMA1_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb1_function_DMAC4_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb1_function_DMAC4_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb1_function_DMAC4_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC4 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_stop_dma0 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D0_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb1_function_stop_dma0 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb1_function_DMAC3_Close(&remain); + + return remain; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_stop_dma1 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D1_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb1_function_stop_dma1 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb1_function_DMAC4_Close(&remain); + + return remain; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_RZ_A1H/usb_function_setting.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,173 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2014 - 2015 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ + +#ifndef USB_FUNCTION_SETTING_H +#define USB_FUNCTION_SETTING_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define USB_FUNCTION_CH 0 +#define USB_FUNCTION_HISPEED 1 + +#if (USB_FUNCTION_CH == 0) +#include "usb0_function.h" +#define USB20X USB200 +#define USBIX_IRQn USBI0_IRQn +#define g_usbx_function_bit_set g_usb0_function_bit_set +#define g_usbx_function_PipeDataSize g_usb0_function_PipeDataSize +#define g_usbx_function_data_count g_usb0_function_data_count +#define g_usbx_function_PipeTbl g_usb0_function_PipeTbl +#define g_usbx_function_DmaStatus g_usb0_function_DmaStatus +#define g_usbx_function_pipecfg g_usb0_function_pipecfg +#define g_usbx_function_pipe_status g_usb0_function_pipe_status +#define g_usbx_function_data_pointer g_usb0_function_data_pointer +#define g_usbx_function_pipebuf g_usb0_function_pipebuf +#define g_usbx_function_pipemaxp g_usb0_function_pipemaxp +#define g_usbx_function_pipeperi g_usb0_function_pipeperi +#define g_usbx_function_TestModeFlag g_usb0_function_TestModeFlag +#define usbx_function_BRDYInterruptPIPE0 usb0_function_BRDYInterruptPIPE0 +#define usbx_function_BRDYInterrupt usb0_function_BRDYInterrupt +#define usbx_function_NRDYInterruptPIPE0 usb0_function_NRDYInterruptPIPE0 +#define usbx_function_NRDYInterrupt usb0_function_NRDYInterrupt +#define usbx_function_BEMPInterruptPIPE0 usb0_function_BEMPInterruptPIPE0 +#define usbx_function_BEMPInterrupt usb0_function_BEMPInterrupt +#define usbx_function_read_buffer_c usb0_function_read_buffer_c +#define usbx_function_set_pid_buf usb0_function_set_pid_buf +#define usbx_function_disable_brdy_int usb0_function_disable_brdy_int +#define usbx_function_set_pid_stall usb0_function_set_pid_stall +#define usbx_function_dma_interrupt_d0fifo usb0_function_dma_interrupt_d0fifo +#define usbx_function_read_dma usb0_function_read_dma +#define usbx_function_dma_interrupt_d1fifo usb0_function_dma_interrupt_d1fifo +#define usbx_function_write_buffer usb0_function_write_buffer +#define usbx_function_set_pid_nak usb0_function_set_pid_nak +#define usbx_function_get_mbw usb0_function_get_mbw +#define usbx_function_set_curpipe usb0_function_set_curpipe +#define usbx_function_aclrm usb0_function_aclrm +#define usbx_function_enable_nrdy_int usb0_function_enable_nrdy_int +#define usbx_function_enable_brdy_int usb0_function_enable_brdy_int +#define usbx_function_get_pid usb0_function_get_pid +#define usbx_function_get_inbuf usb0_function_get_inbuf +#define usbx_function_disable_bemp_int usb0_function_disable_bemp_int +#define usbx_function_EpToPipe usb0_function_EpToPipe +#define usbx_function_clear_pipe_tbl usb0_function_clear_pipe_tbl +#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb0_function_d0fifo_dmaintid +#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb0_function_d1fifo_dmaintid +#define usbx_function_reset_module usb0_function_reset_module +#define usbx_function_init_status usb0_function_init_status +#define usbx_function_InitModule usb0_function_InitModule +#define usbx_function_clear_alt usb0_function_clear_alt +#define usbx_function_set_sqclr usb0_function_set_sqclr +#define usbx_api_function_CtrlWriteStart usb0_api_function_CtrlWriteStart +#define usbx_api_function_CtrlReadStart usb0_api_function_CtrlReadStart +#define usbx_function_write_buffer_c usb0_function_write_buffer_c +#define usbx_api_function_check_pipe_status usb0_api_function_check_pipe_status +#define usbx_api_function_set_pid_nak usb0_api_function_set_pid_nak +#define usbx_api_function_clear_pipe_status usb0_api_function_clear_pipe_status +#define usbx_api_function_start_receive_transfer usb0_api_function_start_receive_transfer +#define usbx_function_read_buffer usb0_function_read_buffer +#define usbx_api_function_start_send_transfer usb0_api_function_start_send_transfer +#define usbx_function_stop_transfer usb0_function_stop_transfer +#define usbx_function_clear_pid_stall usb0_function_clear_pid_stall +#define usbx_function_CheckVBUStaus usb0_function_CheckVBUStaus +#define usbx_function_USB_FUNCTION_Attach usb0_function_USB_FUNCTION_Attach +#define usbx_function_USB_FUNCTION_Detach usb0_function_USB_FUNCTION_Detach +#define usbx_function_is_hispeed usb0_function_is_hispeed +#define usbx_function_ResetDescriptor usb0_function_ResetDescriptor +#define usbx_function_USB_FUNCTION_Suspend usb0_function_USB_FUNCTION_Suspend +#define usbx_function_USB_FUNCTION_TestMode usb0_function_USB_FUNCTION_TestMode +#else +#include "usb1_function.h" +#define USB20X USB201 +#define USBIX_IRQn USBI1_IRQn +#define g_usbx_function_bit_set g_usb1_function_bit_set +#define g_usbx_function_PipeDataSize g_usb1_function_PipeDataSize +#define g_usbx_function_data_count g_usb1_function_data_count +#define g_usbx_function_PipeTbl g_usb1_function_PipeTbl +#define g_usbx_function_DmaStatus g_usb1_function_DmaStatus +#define g_usbx_function_pipecfg g_usb1_function_pipecfg +#define g_usbx_function_pipe_status g_usb1_function_pipe_status +#define g_usbx_function_data_pointer g_usb1_function_data_pointer +#define g_usbx_function_pipebuf g_usb1_function_pipebuf +#define g_usbx_function_pipemaxp g_usb1_function_pipemaxp +#define g_usbx_function_pipeperi g_usb1_function_pipeperi +#define g_usbx_function_TestModeFlag g_usb1_function_TestModeFlag +#define usbx_function_BRDYInterruptPIPE0 usb1_function_BRDYInterruptPIPE0 +#define usbx_function_BRDYInterrupt usb1_function_BRDYInterrupt +#define usbx_function_NRDYInterruptPIPE0 usb1_function_NRDYInterruptPIPE0 +#define usbx_function_NRDYInterrupt usb1_function_NRDYInterrupt +#define usbx_function_BEMPInterruptPIPE0 usb1_function_BEMPInterruptPIPE0 +#define usbx_function_BEMPInterrupt usb1_function_BEMPInterrupt +#define usbx_function_read_buffer_c usb1_function_read_buffer_c +#define usbx_function_set_pid_buf usb1_function_set_pid_buf +#define usbx_function_disable_brdy_int usb1_function_disable_brdy_int +#define usbx_function_set_pid_stall usb1_function_set_pid_stall +#define usbx_function_dma_interrupt_d0fifo usb1_function_dma_interrupt_d0fifo +#define usbx_function_read_dma usb1_function_read_dma +#define usbx_function_dma_interrupt_d1fifo usb1_function_dma_interrupt_d1fifo +#define usbx_function_write_buffer usb1_function_write_buffer +#define usbx_function_set_pid_nak usb1_function_set_pid_nak +#define usbx_function_get_mbw usb1_function_get_mbw +#define usbx_function_set_curpipe usb1_function_set_curpipe +#define usbx_function_aclrm usb1_function_aclrm +#define usbx_function_enable_nrdy_int usb1_function_enable_nrdy_int +#define usbx_function_enable_brdy_int usb1_function_enable_brdy_int +#define usbx_function_get_pid usb1_function_get_pid +#define usbx_function_get_inbuf usb1_function_get_inbuf +#define usbx_function_disable_bemp_int usb1_function_disable_bemp_int +#define usbx_function_EpToPipe usb1_function_EpToPipe +#define usbx_function_clear_pipe_tbl usb1_function_clear_pipe_tbl +#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb1_function_d0fifo_dmaintid +#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb1_function_d1fifo_dmaintid +#define usbx_function_reset_module usb1_function_reset_module +#define usbx_function_init_status usb1_function_init_status +#define usbx_function_InitModule usb1_function_InitModule +#define usbx_function_clear_alt usb1_function_clear_alt +#define usbx_function_set_sqclr usb1_function_set_sqclr +#define usbx_api_function_CtrlWriteStart usb1_api_function_CtrlWriteStart +#define usbx_api_function_CtrlReadStart usb1_api_function_CtrlReadStart +#define usbx_function_write_buffer_c usb1_function_write_buffer_c +#define usbx_api_function_check_pipe_status usb1_api_function_check_pipe_status +#define usbx_api_function_set_pid_nak usb1_api_function_set_pid_nak +#define usbx_api_function_clear_pipe_status usb1_api_function_clear_pipe_status +#define usbx_api_function_start_receive_transfer usb1_api_function_start_receive_transfer +#define usbx_function_read_buffer usb1_function_read_buffer +#define usbx_api_function_start_send_transfer usb1_api_function_start_send_transfer +#define usbx_function_stop_transfer usb1_function_stop_transfer +#define usbx_function_clear_pid_stall usb1_function_clear_pid_stall +#define usbx_function_CheckVBUStaus usb1_function_CheckVBUStaus +#define usbx_function_USB_FUNCTION_Attach usb1_function_USB_FUNCTION_Attach +#define usbx_function_USB_FUNCTION_Detach usb1_function_USB_FUNCTION_Detach +#define usbx_function_is_hispeed usb1_function_is_hispeed +#define usbx_function_ResetDescriptor usb1_function_ResetDescriptor +#define usbx_function_USB_FUNCTION_Suspend usb1_function_USB_FUNCTION_Suspend +#define usbx_function_USB_FUNCTION_TestMode usb1_function_USB_FUNCTION_TestMode +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* USB_FUNCTION_SETTING_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/devdrv_usb_function_api.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,365 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : devdrv_usb_function_api.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB_FUNCTION_API_H +#define USB_FUNCTION_API_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <VKRZA1H.h> +#include "r_typedefs.h" +#include "usb0_function_api.h" +#include "usb1_function_api.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ +typedef struct +{ + uint32_t fifo; + uint32_t buffer; + uint32_t bytes; + uint32_t dir; + uint32_t size; +} USB_FUNCTION_DMA_t; + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define USBFCLOCK_X1_48MHZ (0x0000u) /* USB_X1_48MHz */ +#define USBFCLOCK_EXTAL_12MHZ (0x0004u) /* EXTAL_12MHz */ + +#define DEVDRV_USBF_ON (1) +#define DEVDRV_USBF_OFF (0) +#define DEVDRV_USBF_YES (1) +#define DEVDRV_USBF_NO (0) + +#define DEVDRV_USBF_STALL (-2) + +#define DEVDRV_USBF_WRITEEND (0) +#define DEVDRV_USBF_WRITESHRT (1) +#define DEVDRV_USBF_WRITING (2) +#define DEVDRV_USBF_WRITEDMA (3) + +#define DEVDRV_USBF_FIFOERROR (0xffff) + +#define DEVDRV_USBF_PIPE_IDLE (0x00) +#define DEVDRV_USBF_PIPE_WAIT (0x01) +#define DEVDRV_USBF_PIPE_DONE (0x02) +#define DEVDRV_USBF_PIPE_NORES (0x03) +#define DEVDRV_USBF_PIPE_STALL (0x04) + +#define DEVDRV_USBF_PID_NAK (0x0000u) +#define DEVDRV_USBF_PID_BUF (0x0001u) +#define DEVDRV_USBF_PID_STALL (0x0002u) +#define DEVDRV_USBF_PID_STALL2 (0x0003u) + +#define USB_FUNCTION_NON_SPEED (0) +#define USB_FUNCTION_LOW_SPEED (1) +#define USB_FUNCTION_FULL_SPEED (2) +#define USB_FUNCTION_HIGH_SPEED (3) + +#define USB_FUNCTION_READEND (0) +#define USB_FUNCTION_READSHRT (1) +#define USB_FUNCTION_READING (2) +#define USB_FUNCTION_READOVER (3) +#define USB_FUNCTION_READZERO (4) + +#define USB_FUNCTION_MAX_PIPE_NO (15u) +#define USB_FUNCTION_PIPE0 (0) +#define USB_FUNCTION_PIPE1 (1) +#define USB_FUNCTION_PIPE2 (2) +#define USB_FUNCTION_PIPE3 (3) +#define USB_FUNCTION_PIPE4 (4) +#define USB_FUNCTION_PIPE5 (5) +#define USB_FUNCTION_PIPE6 (6) +#define USB_FUNCTION_PIPE7 (7) +#define USB_FUNCTION_PIPE8 (8) +#define USB_FUNCTION_PIPE9 (9) +#define USB_FUNCTION_PIPEA (10) +#define USB_FUNCTION_PIPEB (11) +#define USB_FUNCTION_PIPEC (12) +#define USB_FUNCTION_PIPED (13) +#define USB_FUNCTION_PIPEE (14) +#define USB_FUNCTION_PIPEF (15) + +#define USB_FUNCTION_ISO (0xc000u) +#define USB_FUNCTION_INTERRUPT (0x8000u) +#define USB_FUNCTION_BULK (0x4000u) + +#define USB_FUNCTION_NONE (0x0000u) +#define USB_FUNCTON_BFREFIELD (0x0400u) +#define USB_FUNCTION_BFREON (0x0400u) +#define USB_FUNCTION_BFREOFF (0x0000u) +#define USB_FUNCTION_DBLBFIELD (0x0200u) +#define USB_FUNCTION_DBLBON (0x0200u) +#define USB_FUNCTION_DBLBOFF (0x0000u) +#define USB_FUNCTION_CNTMDFIELD (0x0100u) +#define USB_FUNCTION_CNTMDON (0x0100u) +#define USB_FUNCTION_CNTMDOFF (0x0000u) +#define USB_FUNCTION_SHTNAKON (0x0080u) +#define USB_FUNCTION_SHTNAKOFF (0x0000u) +#define USB_FUNCTION_DIRFIELD (0x0010u) +#define USB_FUNCTION_DIR_P_OUT (0x0000u) +#define USB_FUNCTION_DIR_P_IN (0x0010u) +#define USB_FUNCTION_EPNUMFIELD (0x000fu) +#define USB_FUNCTION_MAX_EP_NO (15u) +#define USB_FUNCTION_EP0 (0u) +#define USB_FUNCTION_EP1 (1u) +#define USB_FUNCTION_EP2 (2u) +#define USB_FUNCTION_EP3 (3u) +#define USB_FUNCTION_EP4 (4u) +#define USB_FUNCTION_EP5 (5u) +#define USB_FUNCTION_EP6 (6u) +#define USB_FUNCTION_EP7 (7u) +#define USB_FUNCTION_EP8 (8u) +#define USB_FUNCTION_EP9 (9u) +#define USB_FUNCTION_EP10 (10u) +#define USB_FUNCTION_EP11 (11u) +#define USB_FUNCTION_EP12 (12u) +#define USB_FUNCTION_EP13 (13u) +#define USB_FUNCTION_EP14 (14u) +#define USB_FUNCTION_EP15 (15u) + +#define USB_FUNCTION_EPTABLE_LENGTH (5u) + +#define USB_FUNCTION_CUSE (0) +#define USB_FUNCTION_D0USE (1) +#define USB_FUNCTION_D0DMA (2) +#define USB_FUNCTION_D1USE (3) +#define USB_FUNCTION_D1DMA (4) + +#define USB_FUNCTION_CFIFO_USE (0x0000) +#define USB_FUNCTION_D0FIFO_USE (0x1000) +#define USB_FUNCTION_D1FIFO_USE (0x2000) +#define USB_FUNCTION_D0FIFO_DMA (0x5000) +#define USB_FUNCTION_D1FIFO_DMA (0x6000) + +#define USB_FUNCTION_BUF2FIFO (0) +#define USB_FUNCTION_FIFO2BUF (1) + +#define USB_FUNCTION_DVST_POWERED (0x0001) +#define USB_FUNCTION_DVST_DEFAULT (0x0002) +#define USB_FUNCTION_DVST_ADDRESS (0x0003) +#define USB_FUNCTION_DVST_CONFIGURED (0x0004) +#define USB_FUNCTION_DVST_SUSPEND (0x0005) +#define USB_FUNCTION_DVST_CONFIGURED_SUSPEND (0x0006) + +#define USB_FUNCTION_FUNCTION_TEST_SELECT (0xff00u) +#define USB_FUNCTION_FUNCTION_TEST_J (0x0100u) +#define USB_FUNCTION_FUNCTION_TEST_K (0x0200u) +#define USB_FUNCTION_FUNCTION_TEST_SE0_NAK (0x0300u) +#define USB_FUNCTION_FUNCTION_TEST_PACKET (0x0400u) +#define USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE (0x0500u) +#define USB_FUNCTION_FUNCTION_TEST_STSelectors (0x0600u) +#define USB_FUNCTION_FUNCTION_TEST_Reserved (0x4000u) +#define USB_FUNCTION_FUNCTION_TEST_VSTModes (0xc000u) + +#define USB_FUNCTION_DT_TYPE (0xff00u) +#define USB_FUNCTION_DT_INDEX (0xff) +#define USB_FUNCTION_DT_DEVICE (0x01) +#define USB_FUNCTION_DT_CONFIGURATION (0x02) +#define USB_FUNCTION_DT_STRING (0x03) +#define USB_FUNCTION_DT_INTERFACE (0x04) +#define USB_FUNCTION_DT_ENDPOINT (0x05) +#define USB_FUNCTION_DT_DEVICE_QUALIFIER (0x06) +#define USB_FUNCTION_DT_OTHER_SPEED_CONFIGURATION (0x07) +#define USB_FUNCTION_DT_INTERFACE_POWER (0x08) + +#define USB_FUNCTION_CF_RESERVED (0x80) +#define USB_FUNCTION_CF_SELF (0x40) +#define USB_FUNCTION_CF_RWUP (0x20) +#define USB_FUNCTION_CF_NORWUP (0x00) +#define USB_FUNCTION_EP_ERROR (0xff) + +#define USB_FUNCTION_EP_OUT (0x00) +#define USB_FUNCTION_EP_IN (0x80) +#define USB_FUNCTION_EP_CNTRL (0x00) +#define USB_FUNCTION_EP_ISO (0x01) +#define USB_FUNCTION_EP_BULK (0x02) +#define USB_FUNCTION_EP_INT (0x03) + +#define USB_FUNCTION_STANDARD_REQUEST (0x0000u) +#define USB_FUNCTION_CLASS_REQUEST (0x0020u) +#define USB_FUNCTION_VENDOR_REQUEST (0x0040u) +#define USB_FUNCTION_DEVICE_REQUEST (0x0000u) +#define USB_FUNCTION_INTERFACE_REQUEST (0x0001u) +#define USB_FUNCTION_ENDPOINT_REQUEST (0x0002u) + +#define USB_FUNCTION_GETSTATUS_BUSPOWERD (0x0000u) +#define USB_FUNCTION_GETSTATUS_SELFPOWERD (0x0001u) +#define USB_FUNCTION_GETSTATUS_REMOTEWAKEUP (0x0002u) +#define USB_FUNCTION_GETSTATUS_NOTHALT (0x0000u) +#define USB_FUNCTION_GETSTATUS_HALT (0x0001u) + +#define USB_FUNCTION_FEATURE_ENDPOINT_HALT (0x0000u) +#define USB_FUNCTION_FEATURE_REMOTE_WAKEUP (0x0001u) +#define USB_FUNCTION_FEATURE_TEST_MODE (0x0002u) + +#define USB_FUNCTION_bRequest (0xff00u) /* b15-8:bRequest */ +#define USB_FUNCTION_bmRequestType (0x00ffu) /* b7-0: bmRequestType */ +#define USB_FUNCTION_bmRequestTypeDir (0x0080u) /* b7 : Data transfer direction */ +#define USB_FUNCTION_bmRequestTypeType (0x0060u) /* b6-5: Type */ +#define USB_FUNCTION_bmRequestTypeRecip (0x001fu) /* b4-0: Recipient */ + + +/******************************************************************************* +Variable Externs +*******************************************************************************/ + + +/******************************************************************************* +Functions Prototypes +*******************************************************************************/ +#if 0 +void R_USB_api_function_init(uint16_t root, uint8_t int_level, uint16_t mode, uint16_t clockmode); +uint16_t R_USB_api_function_IsConfigured(uint16_t root); +uint16_t R_USB_api_function_CtrlReadStart(uint16_t root, uint32_t size, uint8_t *data); +void R_USB_api_function_CtrlWriteStart(uint16_t root, uint32_t size, uint8_t *data); +uint16_t R_USB_api_function_start_send_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t R_USB_api_function_check_pipe_status(uint16_t root, uint16_t pipe, uint32_t *size); +void R_USB_api_function_clear_pipe_status(uint16_t root, uint16_t pipe); +void R_USB_api_function_start_receive_transfer(uint16_t root, uint16_t pipe, uint32_t size, uint8_t *data); +void R_USB_api_function_set_pid_buf(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_pid_nak(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_pid_stall(uint16_t root, uint16_t pipe); +void R_USB_api_function_clear_pid_stall(uint16_t root, uint16_t pipe); +uint16_t R_USB_api_function_get_pid(uint16_t root, uint16_t pipe); +int32_t R_USB_api_function_check_stall(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_sqclr(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_sqset(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_csclr(uint16_t root, uint16_t pipe); +void R_USB_api_function_set_curpipe(uint16_t root, uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void R_USB_api_function_clear_brdy_sts(uint16_t root, uint16_t pipe); +void R_USB_api_function_clear_bemp_sts(uint16_t root, uint16_t pipe); +void R_USB_api_function_clear_nrdy_sts(uint16_t root, uint16_t pipe); +void R_USB_api_function_enable_brdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_disable_brdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_enable_bemp_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_disable_bemp_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_enable_nrdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_disable_nrdy_int(uint16_t root, uint16_t pipe); +void R_USB_api_function_stop_transfer(uint16_t root, uint16_t pipe); +#endif + +#ifdef USB0_FUNCTION_API_H +void usb0_function_interrupt(uint32_t int_sense); +void usb0_function_dma_interrupt_d0fifo(uint32_t int_sense); +void usb0_function_dma_interrupt_d1fifo(uint32_t int_sense); + +void usb0_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_ResetDescriptor(uint16_t mode); + +IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid(void); +IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid(void); +void Userdef_USB_usb0_function_attach(void); +void Userdef_USB_usb0_function_detach(void); +void Userdef_USB_usb0_function_delay_1ms(void); +void Userdef_USB_usb0_function_delay_xms(uint32_t msec); +void Userdef_USB_usb0_function_delay_10us(uint32_t usec); +void Userdef_USB_usb0_function_delay_500ns(void); +void Userdef_USB_usb0_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc); +uint32_t Userdef_USB_usb0_function_stop_dma0(void); +uint32_t Userdef_USB_usb0_function_stop_dma1(void); + +void usb0_function_stop_transfer(uint16_t pipe); +void usb0_function_enable_brdy_int(uint16_t pipe); +void usb0_function_disable_brdy_int(uint16_t pipe); +void usb0_function_enable_bemp_int(uint16_t pipe); +void usb0_function_disable_bemp_int(uint16_t pipe); +void usb0_function_enable_nrdy_int(uint16_t pipe); +void usb0_function_disable_nrdy_int(uint16_t pipe); +#endif + +#ifdef USB1_FUNCTION_API_H +void usb1_function_interrupt(uint32_t int_sense); +void usb1_function_dma_interrupt_d0fifo(uint32_t int_sense); +void usb1_function_dma_interrupt_d1fifo(uint32_t int_sense); + +void usb1_function_Class0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Class5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor0(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor1(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor2(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor3(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor4(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Vendor5(uint16_t type, uint16_t req, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_ResetDescriptor(uint16_t mode); + +IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid(void); +IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid(void); +void Userdef_USB_usb1_function_attach(void); +void Userdef_USB_usb1_function_detach(void); +void Userdef_USB_usb1_function_delay_1ms(void); +void Userdef_USB_usb1_function_delay_xms(uint32_t msec); +void Userdef_USB_usb1_function_delay_10us(uint32_t usec); +void Userdef_USB_usb1_function_delay_500ns(void); +void Userdef_USB_usb1_function_start_dma(USB_FUNCTION_DMA_t *dma, uint16_t dfacc); +uint32_t Userdef_USB_usb1_function_stop_dma0(void); +uint32_t Userdef_USB_usb1_function_stop_dma1(void); + +void usb1_function_stop_transfer(uint16_t pipe); +void usb1_function_enable_brdy_int(uint16_t pipe); +void usb1_function_disable_brdy_int(uint16_t pipe); +void usb1_function_enable_bemp_int(uint16_t pipe); +void usb1_function_disable_bemp_int(uint16_t pipe); +void usb1_function_enable_nrdy_int(uint16_t pipe); +void usb1_function_disable_nrdy_int(uint16_t pipe); +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* USB_FUNCTION_API_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,143 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb_function.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB_FUNCTION_H +#define USB_FUNCTION_H + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "r_typedefs.h" +#include "iodefine.h" +#include "rza_io_regrw.h" + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define USB_FUNCTION_ALT_NO (255) +#define USB_FUNCTION_ALT_SET (0xff) + +#define USB_FUNCTION_BITUPLLE (0x0002u) +#define USB_FUNCTION_BITUCKSEL (0x0004u) +#define USB_FUNCTION_BITBWAIT (0x003fu) + +#define USB_FUNCTION_BUSWAIT_02 (0x0000u) +#define USB_FUNCTION_BUSWAIT_03 (0x0001u) +#define USB_FUNCTION_BUSWAIT_04 (0x0002u) +#define USB_FUNCTION_BUSWAIT_05 (0x0003u) +#define USB_FUNCTION_BUSWAIT_06 (0x0004u) +#define USB_FUNCTION_BUSWAIT_07 (0x0005u) +#define USB_FUNCTION_BUSWAIT_08 (0x0006u) +#define USB_FUNCTION_BUSWAIT_09 (0x0007u) +#define USB_FUNCTION_BUSWAIT_10 (0x0008u) +#define USB_FUNCTION_BUSWAIT_11 (0x0009u) +#define USB_FUNCTION_BUSWAIT_12 (0x000au) +#define USB_FUNCTION_BUSWAIT_13 (0x000bu) +#define USB_FUNCTION_BUSWAIT_14 (0x000cu) +#define USB_FUNCTION_BUSWAIT_15 (0x000du) +#define USB_FUNCTION_BUSWAIT_16 (0x000eu) +#define USB_FUNCTION_BUSWAIT_17 (0x000fu) + +#define USB_FUNCTION_BITRESUME (0x0020u) +#define USB_FUNCTION_BITUACT (0x0010u) +#define USB_FUNCTION_HSPROC (0x0004u) +#define USB_FUNCTION_HSMODE (0x0003u) +#define USB_FUNCTION_FSMODE (0x0002u) +#define USB_FUNCTION_LSMODE (0x0001u) +#define USB_FUNCTION_UNDECID (0x0000u) + +#define USB_FUNCTION_BITRCNT (0x8000u) +#define USB_FUNCTION_BITDREQE (0x1000u) +#define USB_FUNCTION_BITMBW (0x0c00u) +#define USB_FUNCTION_BITMBW_8 (0x0000u) +#define USB_FUNCTION_BITMBW_16 (0x0400u) +#define USB_FUNCTION_BITMBW_32 (0x0800u) +#define USB_FUNCTION_BITBYTE_LITTLE (0x0000u) +#define USB_FUNCTION_BITBYTE_BIG (0x0100u) +#define USB_FUNCTION_BITISEL (0x0020u) +#define USB_FUNCTION_BITCURPIPE (0x000fu) + +#define USB_FUNCTION_CFIFO_READ (0x0000u) +#define USB_FUNCTION_CFIFO_WRITE (0x0020u) + +#define USB_FUNCTION_BITBVAL (0x8000u) +#define USB_FUNCTION_BITBCLR (0x4000u) +#define USB_FUNCTION_BITFRDY (0x2000u) +#define USB_FUNCTION_BITDTLN (0x0fffu) + +#define USB_FUNCTION_BITVBSE (0x8000u) +#define USB_FUNCTION_BITRSME (0x4000u) +#define USB_FUNCTION_BITSOFE (0x2000u) +#define USB_FUNCTION_BITDVSE (0x1000u) +#define USB_FUNCTION_BITCTRE (0x0800u) +#define USB_FUNCTION_BITVBINT (0x8000u) +#define USB_FUNCTION_BITRESM (0x4000u) +#define USB_FUNCTION_BITSOFR (0x2000u) +#define USB_FUNCTION_BITDVST (0x1000u) +#define USB_FUNCTION_BITCTRT (0x0800u) + +#define USB_FUNCTION_BITBEMPE (0x0400u) +#define USB_FUNCTION_BITNRDYE (0x0200u) +#define USB_FUNCTION_BITBRDYE (0x0100u) +#define USB_FUNCTION_BITBEMP (0x0400u) +#define USB_FUNCTION_BITNRDY (0x0200u) +#define USB_FUNCTION_BITBRDY (0x0100u) + +#define USB_FUNCTION_BITDVSQ (0x0070u) +#define USB_FUNCTION_BITDVSQS (0x0030u) +#define USB_FUNCTION_DS_SPD_CNFG (0x0070u) +#define USB_FUNCTION_DS_SPD_ADDR (0x0060u) +#define USB_FUNCTION_DS_SPD_DFLT (0x0050u) +#define USB_FUNCTION_DS_SPD_POWR (0x0040u) +#define USB_FUNCTION_DS_CNFG (0x0030u) +#define USB_FUNCTION_DS_ADDS (0x0020u) +#define USB_FUNCTION_DS_DFLT (0x0010u) +#define USB_FUNCTION_DS_POWR (0x0000u) +#define USB_FUNCTION_BITVALID (0x0008u) +#define USB_FUNCTION_BITCTSQ (0x0007u) +#define USB_FUNCTION_CS_SQER (0x0006u) +#define USB_FUNCTION_CS_WRND (0x0005u) +#define USB_FUNCTION_CS_WRSS (0x0004u) +#define USB_FUNCTION_CS_WRDS (0x0003u) +#define USB_FUNCTION_CS_RDSS (0x0002u) +#define USB_FUNCTION_CS_RDDS (0x0001u) +#define USB_FUNCTION_CS_IDST (0x0000u) + +#define USB_FUNCTION_PIPExBUF (64u) + +#define USB_FUNCTION_D0FIFO (0) +#define USB_FUNCTION_D1FIFO (1) +#define USB_FUNCTION_DMA_READY (0) +#define USB_FUNCTION_DMA_BUSY (1) +#define USB_FUNCTION_DMA_BUSYEND (2) + +#define USB_FUNCTION_FIFO_USE (0x7000) + +#endif /* USB_FUNCTION_FUNCTION_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/inc/usb_function_version.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,32 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb_function_version.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ + +#define USB_FUNCTION_LOCAL_Rev "VER080_140709" + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,171 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB0_FUNCTION_H +#define USB0_FUNCTION_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "devdrv_usb_function_api.h" +#include "usb_function.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern const uint16_t g_usb0_function_bit_set[]; +extern uint32_t g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint8_t *g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +extern uint16_t g_usb0_function_PipeIgnore[]; +extern uint16_t g_usb0_function_PipeTbl[]; +extern uint16_t g_usb0_function_pipe_status[]; +extern uint32_t g_usb0_function_PipeDataSize[]; + +extern USB_FUNCTION_DMA_t g_usb0_function_DmaInfo[]; +extern uint16_t g_usb0_function_DmaPipe[]; +extern uint16_t g_usb0_function_DmaBval[]; +extern uint16_t g_usb0_function_DmaStatus[]; + +extern uint16_t g_usb0_function_CtrZeroLengthFlag; + +extern uint16_t g_usb0_function_ConfigNum; +extern uint16_t g_usb0_function_Alternate[USB_FUNCTION_ALT_NO]; +extern uint16_t g_usb0_function_RemoteWakeupFlag; +extern uint16_t g_usb0_function_TestModeFlag; +extern uint16_t g_usb0_function_TestModeSelectors; + +extern uint16_t g_usb0_function_ReqType; +extern uint16_t g_usb0_function_ReqTypeType; +extern uint16_t g_usb0_function_ReqTypeRecip; +extern uint16_t g_usb0_function_ReqRequest; +extern uint16_t g_usb0_function_ReqValue; +extern uint16_t g_usb0_function_ReqIndex; +extern uint16_t g_usb0_function_ReqLength; + +extern uint16_t g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +extern uint16_t g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +/* ==== common ==== */ +void usb0_function_dma_stop_d0(uint16_t pipe, uint32_t remain); +void usb0_function_dma_stop_d1(uint16_t pipe, uint32_t remain); +uint16_t usb0_function_is_hispeed(void); +uint16_t usb0_function_is_hispeed_enable(void); +uint16_t usb0_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb0_function_write_buffer(uint16_t pipe); +uint16_t usb0_function_write_buffer_c(uint16_t pipe); +uint16_t usb0_function_write_buffer_d0(uint16_t pipe); +uint16_t usb0_function_write_buffer_d1(uint16_t pipe); +void usb0_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb0_function_read_buffer(uint16_t pipe); +uint16_t usb0_function_read_buffer_c(uint16_t pipe); +uint16_t usb0_function_read_buffer_d0(uint16_t pipe); +uint16_t usb0_function_read_buffer_d1(uint16_t pipe); +uint16_t usb0_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb0_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb0_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc); +uint16_t usb0_function_get_mbw(uint32_t trncount, uint32_t dtptr); +uint16_t usb0_function_read_dma(uint16_t pipe); +void usb0_function_brdy_int(uint16_t status, uint16_t int_enb); +void usb0_function_nrdy_int(uint16_t status, uint16_t int_enb); +void usb0_function_bemp_int(uint16_t status, uint16_t int_enb); +void usb0_function_setting_interrupt(uint8_t level); +void usb0_function_reset_module(uint16_t clockmode); +uint16_t usb0_function_get_buf_size(uint16_t pipe); +uint16_t usb0_function_get_mxps(uint16_t pipe); +void usb0_function_clear_brdy_sts(uint16_t pipe); +void usb0_function_clear_bemp_sts(uint16_t pipe); +void usb0_function_clear_nrdy_sts(uint16_t pipe); +void usb0_function_set_pid_buf(uint16_t pipe); +void usb0_function_set_pid_nak(uint16_t pipe); +void usb0_function_set_pid_stall(uint16_t pipe); +void usb0_function_clear_pid_stall(uint16_t pipe); +uint16_t usb0_function_get_pid(uint16_t pipe); +void usb0_function_set_sqclr(uint16_t pipe); +void usb0_function_set_sqset(uint16_t pipe); +void usb0_function_set_csclr(uint16_t pipe); +void usb0_function_aclrm(uint16_t pipe); +void usb0_function_set_aclrm(uint16_t pipe); +void usb0_function_clr_aclrm(uint16_t pipe); +uint16_t usb0_function_get_sqmon(uint16_t pipe); +uint16_t usb0_function_get_inbuf(uint16_t pipe); + +/* ==== function ==== */ +void usb0_function_init_status(void); +void usb0_function_InitModule(uint16_t mode); +uint16_t usb0_function_CheckVBUStaus(void); +void usb0_function_USB_FUNCTION_Attach(void); +void usb0_function_USB_FUNCTION_Detach(void); +void usb0_function_USB_FUNCTION_BusReset(void); +void usb0_function_USB_FUNCTION_Resume(void); +void usb0_function_USB_FUNCTION_Suspend(void); +void usb0_function_USB_FUNCTION_TestMode(void); +void usb0_function_ResetDCP(void); +void usb0_function_ResetEP(uint16_t num); +uint16_t usb0_function_EpToPipe(uint16_t ep); +void usb0_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num); +uint16_t usb0_function_GetConfigNum(void); +uint16_t usb0_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num); +uint16_t usb0_function_CheckRemoteWakeup(void); +void usb0_function_clear_alt(void); +void usb0_function_clear_pipe_tbl(void); +void usb0_function_clear_ep_table_index(void); +uint16_t usb0_function_GetInterfaceNum(uint16_t num); + +#ifdef __cplusplus +} +#endif + + +#endif /* USB0_FUNCTION_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_api.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,104 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_api.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB0_FUNCTION_API_H +#define USB0_FUNCTION_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Variable Externs +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb0_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode); +uint16_t usb0_api_function_IsConfigured(void); +uint16_t usb0_function_GetDeviceState(void); +uint16_t usb0_api_function_CtrlReadStart(uint32_t size, uint8_t *data); +void usb0_api_function_CtrlWriteStart(uint32_t size, uint8_t *data); +uint16_t usb0_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb0_api_function_check_pipe_status(uint16_t pipe, uint32_t *size); +void usb0_api_function_clear_pipe_status(uint16_t pipe); +void usb0_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +void usb0_api_function_set_pid_buf(uint16_t pipe); +void usb0_api_function_set_pid_nak(uint16_t pipe); +void usb0_api_function_set_pid_stall(uint16_t pipe); +void usb0_api_function_clear_pid_stall(uint16_t pipe); +uint16_t usb0_api_function_get_pid(uint16_t pipe); +int32_t usb0_api_function_check_stall(uint16_t pipe); +void usb0_api_function_set_sqclr(uint16_t pipe); +void usb0_api_function_set_sqset(uint16_t pipe); +void usb0_api_function_set_csclr(uint16_t pipe); +void usb0_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb0_api_function_clear_brdy_sts(uint16_t pipe); +void usb0_api_function_clear_bemp_sts(uint16_t pipe); +void usb0_api_function_clear_nrdy_sts(uint16_t pipe); + +void usb0_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb0_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* USB0_FUNCTION_API_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/inc/usb0_function_dmacdrv.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dmacdrv.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB0_FUNCTION_DMACDRV_H +#define USB0_FUNCTION_DMACDRV_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ +typedef struct dmac_transinfo +{ + uint32_t src_addr; /* Transfer source address */ + uint32_t dst_addr; /* Transfer destination address */ + uint32_t count; /* Transfer byte count */ + uint32_t src_size; /* Transfer source data size */ + uint32_t dst_size; /* Transfer destination data size */ + uint32_t saddr_dir; /* Transfer source address direction */ + uint32_t daddr_dir; /* Transfer destination address direction */ +} dmac_transinfo_t; + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +/* ==== Transfer specification of the sample program ==== */ +#define DMAC_SAMPLE_SINGLE (0) /* Single transfer */ +#define DMAC_SAMPLE_CONTINUATION (1) /* Continuous transfer (use REN bit) */ + +/* ==== DMA modes ==== */ +#define DMAC_MODE_REGISTER (0) /* Register mode */ +#define DMAC_MODE_LINK (1) /* Link mode */ + +/* ==== Transfer requests ==== */ +#define DMAC_REQ_MODE_EXT (0) /* External request */ +#define DMAC_REQ_MODE_PERI (1) /* On-chip peripheral module request */ +#define DMAC_REQ_MODE_SOFT (2) /* Auto-request (request by software) */ + +/* ==== DMAC transfer sizes ==== */ +#define DMAC_TRANS_SIZE_8 (0) /* 8 bits */ +#define DMAC_TRANS_SIZE_16 (1) /* 16 bits */ +#define DMAC_TRANS_SIZE_32 (2) /* 32 bits */ +#define DMAC_TRANS_SIZE_64 (3) /* 64 bits */ +#define DMAC_TRANS_SIZE_128 (4) /* 128 bits */ +#define DMAC_TRANS_SIZE_256 (5) /* 256 bits */ +#define DMAC_TRANS_SIZE_512 (6) /* 512 bits */ +#define DMAC_TRANS_SIZE_1024 (7) /* 1024 bits */ + +/* ==== Address increment for transferring ==== */ +#define DMAC_TRANS_ADR_NO_INC (1) /* Not increment */ +#define DMAC_TRANS_ADR_INC (0) /* Increment */ + +/* ==== Method for detecting DMA request ==== */ +#define DMAC_REQ_DET_FALL (0) /* Falling edge detection */ +#define DMAC_REQ_DET_RISE (1) /* Rising edge detection */ +#define DMAC_REQ_DET_LOW (2) /* Low level detection */ +#define DMAC_REQ_DET_HIGH (3) /* High level detection */ + +/* ==== Request Direction ==== */ +#define DMAC_REQ_DIR_SRC (0) /* DMAREQ is the source/ DMAACK is active when reading */ +#define DMAC_REQ_DIR_DST (1) /* DMAREQ is the destination/ DMAACK is active when writing */ + +/* ==== Descriptors ==== */ +#define DMAC_DESC_HEADER (0) /* Header */ +#define DMAC_DESC_SRC_ADDR (1) /* Source Address */ +#define DMAC_DESC_DST_ADDR (2) /* Destination Address */ +#define DMAC_DESC_COUNT (3) /* Transaction Byte */ +#define DMAC_DESC_CHCFG (4) /* Channel Confg */ +#define DMAC_DESC_CHITVL (5) /* Channel Interval */ +#define DMAC_DESC_CHEXT (6) /* Channel Extension */ +#define DMAC_DESC_LINK_ADDR (7) /* Link Address */ + +/* ==== On-chip peripheral module requests ===== */ +typedef enum dmac_request_factor +{ + DMAC_REQ_USB0_DMA0_TX, /* USB_0 channel 0 transmit FIFO empty */ + DMAC_REQ_USB0_DMA0_RX, /* USB_0 channel 0 receive FIFO full */ + DMAC_REQ_USB0_DMA1_TX, /* USB_0 channel 1 transmit FIFO empty */ + DMAC_REQ_USB0_DMA1_RX, /* USB_0 channel 1 receive FIFO full */ + DMAC_REQ_USB1_DMA0_TX, /* USB_1 channel 0 transmit FIFO empty */ + DMAC_REQ_USB1_DMA0_RX, /* USB_1 channel 0 receive FIFO full */ + DMAC_REQ_USB1_DMA1_TX, /* USB_1 channel 1 transmit FIFO empty */ + DMAC_REQ_USB1_DMA1_RX, /* USB_1 channel 1 receive FIFO full */ +} dmac_request_factor_t; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb0_function_DMAC1_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb0_function_DMAC1_Open(uint32_t req); +void usb0_function_DMAC1_Close(uint32_t *remain); +void usb0_function_DMAC1_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +void usb0_function_DMAC2_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb0_function_DMAC2_Open(uint32_t req); +void usb0_function_DMAC2_Close(uint32_t *remain); +void usb0_function_DMAC2_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* USB0_FUNCTION_DMACDRV_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dataio.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2933 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dataio.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static uint16_t g_usb0_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)]; + +static void usb0_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb0_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static uint16_t usb0_function_read_dma_d0(uint16_t pipe); +static uint16_t usb0_function_read_dma_d1(uint16_t pipe); +static uint16_t usb0_function_write_dma_d0(uint16_t pipe); +static uint16_t usb0_function_write_dma_d1(uint16_t pipe); + +static void usb0_function_read_c_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_write_c_fifo(uint16_t Pipe, uint16_t count); +static void usb0_function_read_d0_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_write_d0_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_read_d1_fifo(uint16_t pipe, uint16_t count); +static void usb0_function_write_d1_fifo(uint16_t pipe, uint16_t count); + +static void usb0_function_clear_transaction_counter(uint16_t pipe); +static void usb0_function_set_transaction_counter(uint16_t pipe, uint32_t count); + +static uint32_t usb0_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr); + +static uint16_t usb0_function_set_dfacc_d0(uint16_t mbw, uint32_t count); +static uint16_t usb0_function_set_dfacc_d1(uint16_t mbw, uint32_t count); + + +/******************************************************************************* +* Function Name: usb0_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t usefifo; + uint16_t mbw; + + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + usb0_function_clear_bemp_sts(pipe); + usb0_function_clear_brdy_sts(pipe); + usb0_function_clear_nrdy_sts(pipe); + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + case USB_FUNCTION_D0FIFO_DMA: + usefifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + case USB_FUNCTION_D1FIFO_DMA: + usefifo = USB_FUNCTION_D1USE; + break; + + default: + usefifo = USB_FUNCTION_CUSE; + break; + }; + + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw); + + usb0_function_clear_transaction_counter(pipe); + + usb0_function_aclrm(pipe); + + status = usb0_function_write_buffer(pipe); + + if (status != DEVDRV_USBF_FIFOERROR) + { + usb0_function_set_pid_buf(pipe); + } + + return status; +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer +* Description : Writes data in the buffer allocated in the pipe specified by +* : the argument. The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer (uint16_t pipe) +{ + uint16_t status; + uint16_t usefifo; + + g_usb0_function_PipeIgnore[pipe] = 0; + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + status = usb0_function_write_buffer_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_USE: + status = usb0_function_write_buffer_d1(pipe); + break; + + case USB_FUNCTION_D0FIFO_DMA: + status = usb0_function_write_dma_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_DMA: + status = usb0_function_write_dma_d1(pipe); + break; + + default: + status = usb0_function_write_buffer_c(pipe); + break; + }; + + switch (status) + { + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + usb0_function_enable_brdy_int(pipe); /* Enable Ready Interrupt */ + break; + + case DEVDRV_USBF_WRITEEND: /* End of data write */ + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb0_function_clear_nrdy_sts(pipe); + usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + /* for last transfer */ + usb0_function_enable_bemp_int(pipe); /* Enable Empty Interrupt */ + break; + + case DEVDRV_USBF_WRITEDMA: /* DMA write */ + usb0_function_clear_nrdy_sts(pipe); + usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb0_function_disable_bemp_int(pipe); /* Disable Empty Interrupt */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer_c +* Description : Writes data in the buffer allocated in the pipe specified in +* : the argument. Writes data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + if (g_usb0_function_CtrZeroLengthFlag == 1) + { + g_usb0_function_CtrZeroLengthFlag = 0; /* Zero Length Packet Flag CLR */ + return DEVDRV_USBF_WRITEEND; + } + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + if (pipe == USB_FUNCTION_PIPE0) + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + } + else + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + } + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb0_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb0_function_write_c_fifo(pipe, (uint16_t)count); + + if (g_usb0_function_data_count[pipe] < (uint32_t)size) + { + g_usb0_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB200.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0) + { + USB200.CFIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + g_usb0_function_CtrZeroLengthFlag = 1; /* Zero Length Packet Flag */ + } + } + else + { + g_usb0_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb0_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb0_function_write_d0_fifo(pipe, (uint16_t)count); + + if (g_usb0_function_data_count[pipe] < (uint32_t)size) + { + g_usb0_function_data_count[pipe] = 0; + if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb0_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_buffer_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_write_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb0_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb0_function_write_d1_fifo(pipe, (uint16_t)count); + + if (g_usb0_function_data_count[pipe] < (uint32_t)size) + { + g_usb0_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb0_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D0FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb0_function_write_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb0_function_data_count[pipe]; + + if (count != 0) + { + g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; + + if ((count % size) != 0) + { + g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 1; + } + else + { + g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; + } + + dfacc = usb0_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb0_function_data_count[pipe] = 0; + g_usb0_function_data_pointer[pipe] += count; + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB200.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_write_dma_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D1FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb0_function_write_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc=0; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb0_function_data_count[pipe]; + + if (count != 0) + { + g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; + if ((count % size) != 0) + { + g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 1; + } + else + { + g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; + } + + dfacc = usb0_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb0_function_data_count[pipe] = 0; + g_usb0_function_data_pointer[pipe] += count; + + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB200.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb0_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t usefifo; + + usb0_function_clear_bemp_sts(pipe); + usb0_function_clear_brdy_sts(pipe); + usb0_function_clear_nrdy_sts(pipe); + + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb0_function_start_receive_trns_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_USE: + usb0_function_start_receive_trns_d1(pipe, size, data); + break; + + case USB_FUNCTION_D0FIFO_DMA: + usb0_function_start_receive_dma_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_DMA: + usb0_function_start_receive_dma_d1(pipe, size, data); + break; + + default: + usb0_function_start_receive_trns_c(pipe, size, data); + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_trns_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* : When storing data in the buffer allocated in the pipe specified in the +* : argument, BRDY interrupt is generated to read data +* : in the interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = size; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_trns_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data in the +* : interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = size; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_trns_d1 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D1FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = size; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_dma_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb0_function_read_dma(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + else + { + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_start_receive_dma_d1 +* Description : Read data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb0_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(pipe); + g_usb0_function_data_count[pipe] = size; + g_usb0_function_data_pointer[pipe] = (uint8_t *)data; + g_usb0_function_PipeIgnore[pipe] = 0; + + g_usb0_function_PipeDataSize[pipe] = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb0_function_get_mbw(size, (uint32_t)data); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb0_function_set_transaction_counter(pipe, size); + + usb0_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb0_function_read_dma(pipe); + + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + else + { + usb0_function_enable_nrdy_int(pipe); + usb0_function_enable_brdy_int(pipe); + } + + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Uses FIF0 set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer (uint16_t pipe) +{ + uint16_t status; + + g_usb0_function_PipeIgnore[pipe] = 0; + + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + status = usb0_function_read_buffer_d0(pipe); + } + else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + status = usb0_function_read_buffer_d1(pipe); + } + else + { + status = usb0_function_read_buffer_c(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb0_function_disable_brdy_int(pipe); + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + } + + if (count == 0) /* 0 length packet */ + { + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb0_function_read_c_fifo(pipe, (uint16_t)count); + } + + g_usb0_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer_d0 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb0_function_read_d0_fifo(pipe, (uint16_t)count); + } + + g_usb0_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_buffer_d1 +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb0_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb0_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb0_function_read_d1_fifo(pipe, (uint16_t)count); + } + + g_usb0_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_dma +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO or D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_function_read_dma (uint16_t pipe) +{ + uint16_t status; + + g_usb0_function_PipeIgnore[pipe] = 0; + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + status = usb0_function_read_dma_d0(pipe); + } + else + { + status = usb0_function_read_dma_d1(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READZERO: /* End of data read */ + usb0_function_disable_brdy_int(pipe); + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb0_function_disable_brdy_int(pipe); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + } + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe]; + } + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb0_function_read_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + uint16_t pipebuf_size; + + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb0_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb0_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb0_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; /* not use in read operation */ + g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; /* not use in read operation */ + + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb0_function_data_count[pipe] -= count; + g_usb0_function_data_pointer[pipe] += count; + g_usb0_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_read_dma_d1 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by DMA transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb0_function_read_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc=0; + uint16_t pipebuf_size; + + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb0_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb0_function_data_count[pipe]; + } + else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb0_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb0_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; /* not use in read operation */ + g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; /* not use in read operation */ + + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe]; + g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb0_function_data_count[pipe] -= count; + g_usb0_function_data_pointer[pipe] += count; + g_usb0_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_function_change_fifo_port +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. After allocating FIF0, waits in the software +* : till the corresponding pipe becomes ready. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : DEVDRV_USBF_FIFOERROR ; Error +* : Others ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value +*******************************************************************************/ +uint16_t usb0_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + usb0_function_set_curpipe(pipe, fifosel, isel, mbw); + + for (loop = 0; loop < 4; loop++) + { + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB200.CFIFOCTR; + break; + + case USB_FUNCTION_D0USE: + case USB_FUNCTION_D0DMA: + buffer = USB200.D0FIFOCTR; + break; + + case USB_FUNCTION_D1USE: + case USB_FUNCTION_D1DMA: + buffer = USB200.D1FIFOCTR; + break; + + default: + buffer = 0; + break; + } + + if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY) + { + return buffer; + } + + loop2 = 25; + while (loop2-- > 0) + { + /* wait */ + } + } + + return DEVDRV_USBF_FIFOERROR; +} + +/******************************************************************************* +* Function Name: usb0_function_set_curpipe +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb0_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + g_usb0_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB200.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB200.D0FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB200.D1FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_curpipe2 +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* : uint16_t dfacc ; DFACC Access mode +* Return Value : none +*******************************************************************************/ +void usb0_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc) +{ + uint16_t buffer; + uint32_t loop; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + uint32_t dummy; +#endif + volatile uint32_t loop2; + + g_usb0_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB200.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB200.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB200.D0FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB200.D0FIFO.UINT32; + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB200.D1FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB200.D1FIFO.UINT32; + loop = dummy; // avoid warning. + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB200.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_write_c_fifo +* Description : Writes data in CFIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_write_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB200.CFIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB200.CFIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB200.CFIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_read_c_fifo +* Description : Reads data from CFIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_read_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb0_function_data_pointer[pipe] = USB200.CFIFO.UINT8[HH]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT16[H]; + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT32; + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_write_d0_fifo +* Description : Writes data in D0FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_write_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB200.D0FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB200.D0FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB200.D0FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_read_d0_fifo +* Description : Reads data from D0FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating DOFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_read_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb0_function_data_pointer[pipe] = USB200.D0FIFO.UINT8[HH]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT16[H]; + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT32; + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_write_d1_fifo +* Description : Writes data in D1FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_write_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB200.D1FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB200.D1FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB200.D1FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]); + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_read_d1_fifo +* Description : Reads data from D1FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb0_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb0_function_read_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb0_function_data_pointer[pipe] = USB200.D1FIFO.UINT8[HH]; + g_usb0_function_data_pointer[pipe] += 1; + } + } + else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT16[H]; + g_usb0_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT32; + g_usb0_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_com_get_dmasize +* Description : Calculates access width of DMA transfer by the argument to +* : return as the Return Value. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : DMA transfer size : 0 8bit +* : : 1 16bit +* : : 2 32bit +*******************************************************************************/ +static uint32_t usb0_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + + if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0)) + { + /* When transfer byte count is odd */ + /* or transfer data area is 8-bit alignment */ + size = 0; /* 8bit */ + } + else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0)) + { + /* When the transfer byte count is multiples of 2 */ + /* or the transfer data area is 16-bit alignment */ + size = 1; /* 16bit */ + } + else + { + /* When the transfer byte count is multiples of 4 */ + /* or the transfer data area is 32-bit alignment */ + size = 2; /* 32bit */ + } + + return size; +} + +/******************************************************************************* +* Function Name: usb0_function_get_mbw +* Description : Calculates access width of DMA to return the value set in MBW. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : FIFO transfer size : USB_FUNCTION_BITMBW_8 8bit +* : : USB_FUNCTION_BITMBW_16 16bit +* : : USB_FUNCTION_BITMBW_32 32bit +*******************************************************************************/ +uint16_t usb0_function_get_mbw (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + uint16_t mbw; + + size = usb0_function_com_get_dmasize(trncount, dtptr); + + if (size == 0) + { + /* 8bit */ + mbw = USB_FUNCTION_BITMBW_8; + } + else if (size == 1) + { + /* 16bit */ + mbw = USB_FUNCTION_BITMBW_16; + } + else + { + /* 32bit */ + mbw = USB_FUNCTION_BITMBW_32; + } + + return mbw; +} + +/******************************************************************************* +* Function Name: usb0_function_set_transaction_counter +* Description : Sets transaction counter by the argument(PIPEnTRN). +* : Clears transaction before setting to enable transaction counter setting. +* Arguments : uint16_t pipe ; Pipe number +* : uint32_t bsize : Data transfer size +* Return Value : none +*******************************************************************************/ +static void usb0_function_set_transaction_counter (uint16_t pipe, uint32_t bsize) +{ + uint16_t mxps; + uint16_t cnt; + + if (bsize == 0) + { + return; + } + + mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */ + + if ((bsize % mxps) == 0) + { + cnt = (uint16_t)(bsize / mxps); + } + else + { + cnt = (uint16_t)((bsize / mxps) + 1); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE1TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE2TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE3TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE4TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE5TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPE9TRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEATRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEBTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPECTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEDTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEETRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB200.PIPEFTRN = cnt; + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_clear_transaction_counter +* Description : Clears the transaction counter by the argument. +* : After executing this function, the transaction counter is invalid. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_transaction_counter (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB200.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_stop_transfer +* Description : Stops the USB transfer in the pipe specified by the argument. +* : After stopping the USB transfer, clears the buffer allocated in +* : the pipe. +* : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0; +* : invalid. After executing this function, BRDY/NRDY/BEMP interrupt +* : in the corresponding pipe becomes invalid. Sequence bit is also +* : cleared. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_stop_transfer (uint16_t pipe) +{ + uint16_t usefifo; + uint32_t remain; + uint16_t fifo; + + usb0_function_set_pid_nak(pipe); + + usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb0_function_clear_transaction_counter(pipe); + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + usb0_function_clear_transaction_counter(pipe); + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1USE; + break; + + case USB_FUNCTION_D0FIFO_DMA: + remain = Userdef_USB_usb0_function_stop_dma0(); + usb0_function_dma_stop_d0(pipe, remain); + usb0_function_clear_transaction_counter(pipe); + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0DMA; + break; + + case USB_FUNCTION_D1FIFO_DMA: + remain = Userdef_USB_usb0_function_stop_dma1(); + usb0_function_dma_stop_d1(pipe, remain); + usb0_function_clear_transaction_counter(pipe); + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1DMA; + break; + + default: + usb0_function_clear_transaction_counter(pipe); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_CUSE; + break; + } + + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16); + + /* Interrupt of pipe set is disabled */ + usb0_function_disable_brdy_int(pipe); + usb0_function_disable_nrdy_int(pipe); + usb0_function_disable_bemp_int(pipe); + + usb0_function_aclrm(pipe); + usb0_function_set_csclr(pipe); + + if ( g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT ) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } + +} + +/******************************************************************************* +* Function Name: usb0_function_set_dfacc_d0 +* Description : Sets the DFACC setting value in D0FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb0_function_set_dfacc_d0 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + return dfacc; +} + +/******************************************************************************* +* Function Name: usb0_function_set_dfacc_d1 +* Description : Set the DFACC setting value in D1FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb0_function_set_dfacc_d1 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB200.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + + return dfacc; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_dma.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,346 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dma.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static void usb0_function_dmaint(uint16_t fifo); +static void usb0_function_dmaint_buf2fifo(uint16_t pipe); +static void usb0_function_dmaint_fifo2buf(uint16_t pipe); + + +/******************************************************************************* +* Function Name: usb0_function_dma_stop_d0 +* Description : D0FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_stop_d0 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB200.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB200.D0FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain); + g_usb0_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb0_function_dma_stop_d1 +* Description : D1FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_stop_d1 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB200.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB200.D1FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb0_function_PipeDataSize[pipe] = (g_usb0_function_data_count[pipe] - remain); + g_usb0_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb0_function_dma_interrupt_d0fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb0_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_interrupt_d0fifo (uint32_t int_sense) +{ + usb0_function_dmaint(USB_FUNCTION_D0FIFO); + g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb0_function_dma_interrupt_d1fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb0_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb0_function_dma_interrupt_d1fifo (uint32_t int_sense) +{ + usb0_function_dmaint(USB_FUNCTION_D1FIFO); + g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb0_function_dmaint +* Description : This function is DMA transfer end interrupt +* Arguments : uint16_t fifo ; fifo number +* : ; USB_FUNCTION_D0FIFO +* : ; USB_FUNCTION_D1FIFO +* Return Value : none +*******************************************************************************/ +static void usb0_function_dmaint (uint16_t fifo) +{ + uint16_t pipe; + + pipe = g_usb0_function_DmaPipe[fifo]; + + if (g_usb0_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO) + { + usb0_function_dmaint_buf2fifo(pipe); + } + else + { + usb0_function_dmaint_fifo2buf(pipe); + } +} + +/******************************************************************************* +* Function Name: usb0_function_dmaint_fifo2buf +* Description : Executes read completion from FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb0_function_dmaint_fifo2buf (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb0_function_stop_dma0(); + usb0_function_dma_stop_d0(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb0_function_enable_brdy_int(pipe); + } + } + } + else + { + remain = Userdef_USB_usb0_function_stop_dma1(); + usb0_function_dma_stop_d1(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb0_function_enable_brdy_int(pipe); + } + } + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_dmaint_buf2fifo +* Description : Executes write completion in FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb0_function_dmaint_buf2fifo (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + useport = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb0_function_stop_dma0(); + usb0_function_dma_stop_d0(pipe, remain); + + if (g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB200.D0FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + else + { + remain = Userdef_USB_usb0_function_stop_dma1(); + usb0_function_dma_stop_d1(pipe, remain); + + if (g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB200.D1FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + + usb0_function_enable_bemp_int(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_intrn.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,249 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_intrn.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_brdy_int +* Description : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9). +* : According to the pipe that interrupt is generated in, +* : reads/writes buffer allocated in the pipe. +* : This function is executed in the BRDY interrupt handler. +* : This function clears BRDY interrupt status and BEMP interrupt +* : status. +* Arguments : uint16_t Status ; BRDYSTS Register Value +* : uint16_t Int_enbl ; BRDYENB Register Value +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_brdy_int (uint16_t status, uint16_t int_enb) +{ + uint32_t int_sense = 0; + uint16_t pipe; + uint16_t pipebit; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + pipebit = g_usb0_function_bit_set[pipe]; + + if ((status & pipebit) && (int_enb & pipebit)) + { + USB200.BRDYSTS = (uint16_t)~pipebit; + USB200.BEMPSTS = (uint16_t)~pipebit; + if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) + { + usb0_function_dma_interrupt_d0fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb0_function_read_dma(pipe); + usb0_function_disable_brdy_int(pipe); + } + else + { + USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA) + { + if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) + { + usb0_function_dma_interrupt_d1fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb0_function_read_dma(pipe); + usb0_function_disable_brdy_int(pipe); + } + else + { + USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) + { + usb0_function_read_buffer(pipe); + } + else + { + usb0_function_write_buffer(pipe); + } + } + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_nrdy_int +* Description : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9). +* : Checks NRDY interrupt cause by PID. When the cause if STALL, +* : regards the pipe state as STALL and ends the processing. +* : Then the cause is not STALL, increments the error count to +* : communicate again. When the error count is 3, determines +* : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing. +* : This function is executed in the NRDY interrupt handler. +* : This function clears NRDY interrupt status. +* Arguments : uint16_t status ; NRDYSTS Register Value +* : uint16_t int_enb ; NRDYENB Register Value +* Return Value : none +*******************************************************************************/ +void usb0_function_nrdy_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + + bitcheck = (uint16_t)(status & int_enb); + + USB200.NRDYSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe]) + { + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1) + { + if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT) + { + pid = usb0_function_get_pid(pipe); + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + g_usb0_function_PipeIgnore[pipe]++; + if (g_usb0_function_PipeIgnore[pipe] == 3) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } + else + { + usb0_function_set_pid_buf(pipe); + } + } + } + } + else + { + /* USB Function */ + } + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_bemp_int +* Description : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9). +* Arguments : uint16_t status ; BEMPSTS Register Value +* : uint16_t int_enb ; BEMPENB Register Value +* Return Value : none +*******************************************************************************/ +void usb0_function_bemp_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + uint16_t inbuf; + + bitcheck = (uint16_t)(status & int_enb); + + USB200.BEMPSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb0_function_bit_set[pipe]) == g_usb0_function_bit_set[pipe]) + { + pid = usb0_function_get_pid(pipe); + + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + inbuf = usb0_function_get_inbuf(pipe); + + if (inbuf == 0) + { + usb0_function_disable_bemp_int(pipe); + usb0_function_set_pid_nak(pipe); + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + } + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/common/usb0_function_lib.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2026 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_lib.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_enable_brdy_int +* Description : Enables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_enable_brdy_int (uint16_t pipe) +{ + /* enable brdy interrupt */ + USB200.BRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_function_disable_brdy_int +* Description : Disables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_disable_brdy_int (uint16_t pipe) +{ + /* disable brdy interrupt */ + USB200.BRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_brdy_sts (uint16_t pipe) +{ + /* clear brdy status */ + USB200.BRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_enable_bemp_int +* Description : Enables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_enable_bemp_int (uint16_t pipe) +{ + /* enable bemp interrupt */ + USB200.BEMPENB |= (uint16_t)g_usb0_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_function_disable_bemp_int +* Description : Disables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_disable_bemp_int (uint16_t pipe) +{ + /* disable bemp interrupt */ + USB200.BEMPENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_bemp_sts (uint16_t pipe) +{ + /* clear bemp status */ + USB200.BEMPSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_enable_nrdy_int +* Description : Enables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : NRDY. Enables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_enable_nrdy_int (uint16_t pipe) +{ + /* enable nrdy interrupt */ + USB200.NRDYENB |= (uint16_t)g_usb0_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_function_disable_nrdy_int +* Description : Disables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : NRDY. Disables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_disable_nrdy_int (uint16_t pipe) +{ + /* disable nrdy interrupt */ + USB200.NRDYENB &= (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_nrdy_sts (uint16_t pipe) +{ + /* clear nrdy status */ + USB200.NRDYSTS = (uint16_t)~(g_usb0_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb0_function_is_hispeed +* Description : Returns the result of USB reset hand shake (RHST) as +* : return value. +* Arguments : none +* Return Value : USB_FUNCTION_HIGH_SPEED ; Hi-Speed +* : USB_FUNCTION_FULL_SPEED ; Full-Speed +* : LOW_SPEED ; Low-Speed +* : USB_FUNCTION_NON_SPEED ; error +*******************************************************************************/ +uint16_t usb0_function_is_hispeed (void) +{ + uint16_t rhst; + uint16_t speed; + + rhst = RZA_IO_RegRead_16(&USB200.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST); + + if (rhst == USB_FUNCTION_HSMODE) + { + speed = USB_FUNCTION_HIGH_SPEED; + } + else if (rhst == USB_FUNCTION_FSMODE) + { + speed = USB_FUNCTION_FULL_SPEED; + } + else if (rhst == USB_FUNCTION_LSMODE) + { + speed = USB_FUNCTION_LOW_SPEED; + } + else + { + speed = USB_FUNCTION_NON_SPEED; + } + + return speed; +} + +/******************************************************************************* +* Function Name: usb0_function_is_hispeed_enable +* Description : Returns the USB High-Speed connection enabled status as +* : return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Hi-Speed Enable +* : DEVDRV_USBF_NO : Hi-Speed Disable +*******************************************************************************/ +uint16_t usb0_function_is_hispeed_enable (void) +{ + uint16_t ret; + + ret = DEVDRV_USBF_NO; + + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1) + { + ret = DEVDRV_USBF_YES; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb0_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_pid_buf (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb0_function_set_pid_nak(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_BUF, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_pid_nak (uint16_t pipe) +{ + uint16_t pid; + uint16_t pbusy; + uint32_t loop; + + pid = usb0_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb0_function_set_pid_stall(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_NAK, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + + if (pid == DEVDRV_USBF_PID_BUF) + { + for (loop = 0; loop < 200; loop++) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pbusy = RZA_IO_RegRead_16(&USB200.DCPCTR, + USB_DCPCTR_PBUSY_SHIFT, + USB_DCPCTR_PBUSY); + break; + + case USB_FUNCTION_PIPE1: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE2: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE3: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE4: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE5: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE6: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE6CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE7: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE7CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE8: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE8CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE9: + pbusy = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_PBUSY_SHIFT, + USB_PIPEnCTR_9_PBUSY); + break; + + case USB_FUNCTION_PIPEA: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEB: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEC: + pbusy = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPED: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEE: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEF: + pbusy = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + default: + pbusy = 1; + break; + } + + if (pbusy == 0) + { + break; + } + Userdef_USB_usb0_function_delay_500ns(); + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_pid_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + if (pid == DEVDRV_USBF_PID_BUF) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_STALL2, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } + else + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + DEVDRV_USBF_PID_STALL, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } +} + +/******************************************************************************* +* Function Name: usb0_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_pid_stall (uint16_t pipe) +{ + usb0_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb0_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pid = RZA_IO_RegRead_16(&USB200.DCPCTR, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + pid = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + pid = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + pid = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + pid = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + pid = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + pid = RZA_IO_RegRead_16(&USB200.PIPE6CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + pid = RZA_IO_RegRead_16(&USB200.PIPE7CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + pid = RZA_IO_RegRead_16(&USB200.PIPE8CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + pid = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + pid = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + pid = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + pid = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + pid = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + pid = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + pid = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + pid = 0; + break; + } + + return pid; +} + +/******************************************************************************* +* Function Name: usb0_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_csclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + 1, + USB_DCPCTR_CSCLR_SHIFT, + USB_DCPCTR_CSCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_CSCLR_SHIFT, + USB_PIPEnCTR_9_CSCLR); + break; + + default: + /* PIPEA-F have not CSCLR */ + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_sqclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + 1, + USB_DCPCTR_SQCLR_SHIFT, + USB_DCPCTR_SQCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQCLR_SHIFT, + USB_PIPEnCTR_9_SQCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_function_set_sqset (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB200.DCPCTR, + 1, + USB_DCPCTR_SQSET_SHIFT, + USB_DCPCTR_SQSET); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQSET_SHIFT, + USB_PIPEnCTR_9_SQSET); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_get_sqmon +* Description : Toggle bit of specified pipe is obtained +* Arguments : uint16_t pipe ; Pipe number +* Return Value : sqmon +*******************************************************************************/ +uint16_t usb0_function_get_sqmon (uint16_t pipe) +{ + uint16_t sqmon; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + sqmon = RZA_IO_RegRead_16(&USB200.DCPCTR, + USB_DCPCTR_SQMON_SHIFT, + USB_DCPCTR_SQMON); + break; + + case USB_FUNCTION_PIPE1: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE2: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE3: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE4: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE5: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE6: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE6CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE7: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE7CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE8: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE8CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE9: + sqmon = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_SQMON_SHIFT, + USB_PIPEnCTR_9_SQMON); + break; + + case USB_FUNCTION_PIPEA: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEB: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEC: + sqmon = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPED: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEE: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEF: + sqmon = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + default: + sqmon = 0; + break; + } + + return sqmon; +} + +/******************************************************************************* +* Function Name: usb0_function_aclrm +* Description : The buffer of specified pipe is initialized +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb0_function_aclrm (uint16_t pipe) +{ + usb0_function_set_aclrm(pipe); + usb0_function_clr_aclrm(pipe); +} + +/******************************************************************************* +* Function Name: usb0_function_set_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb0_function_set_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 1, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_clr_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb0_function_clr_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB200.PIPE1CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB200.PIPE2CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB200.PIPE3CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB200.PIPE4CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB200.PIPE5CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB200.PIPE6CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB200.PIPE7CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB200.PIPE8CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB200.PIPE9CTR, + 0, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB200.PIPEACTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB200.PIPEBCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB200.PIPECCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB200.PIPEDCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB200.PIPEECTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB200.PIPEFCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_get_inbuf +* Description : Returns INBUFM of the pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : inbuf +*******************************************************************************/ +uint16_t usb0_function_get_inbuf (uint16_t pipe) +{ + uint16_t inbuf; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE1: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE1CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE2: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE2CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE3: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE3CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE4: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE4CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE5: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE5CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE6: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE7: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE8: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE9: + inbuf = RZA_IO_RegRead_16(&USB200.PIPE9CTR, + USB_PIPEnCTR_9_INBUFM_SHIFT, + USB_PIPEnCTR_9_INBUFM); + break; + + case USB_FUNCTION_PIPEA: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEACTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEB: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEBCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEC: + inbuf = RZA_IO_RegRead_16(&USB200.PIPECCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPED: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEDCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEE: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEECTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEF: + inbuf = RZA_IO_RegRead_16(&USB200.PIPEFCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + default: + inbuf = 0; + break; + } + + return inbuf; +} + +/******************************************************************************* +* Function Name: usb0_function_setting_interrupt +* Description : Sets the USB module interrupt level. +* Arguments : uint8_t level ;interrupt level +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_setting_interrupt (uint8_t level) +{ + uint16_t d0fifo_dmaintid; + uint16_t d1fifo_dmaintid; + + R_INTC_RegistIntFunc(INTC_ID_USBI0, usb0_function_interrupt); + R_INTC_SetPriority(INTC_ID_USBI0, level); + R_INTC_Enable(INTC_ID_USBI0); + + d0fifo_dmaintid = Userdef_USB_usb0_function_d0fifo_dmaintid(); + + if (d0fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d0fifo_dmaintid, usb0_function_dma_interrupt_d0fifo); + R_INTC_SetPriority(d0fifo_dmaintid, level); + R_INTC_Enable(d0fifo_dmaintid); + } + + d1fifo_dmaintid = Userdef_USB_usb0_function_d1fifo_dmaintid(); + + if (d1fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d1fifo_dmaintid, usb0_function_dma_interrupt_d1fifo); + R_INTC_SetPriority(d1fifo_dmaintid, level); + R_INTC_Enable(d1fifo_dmaintid); + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_reset_module +* Description : Initializes the USB module. +* : Enables providing clock to the USB module. +* : Sets USB bus wait register. +* Arguments : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +void usb0_function_reset_module (uint16_t clockmode) +{ + /* UPLLE bit is only USB0 */ + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, + USB_SYSCFG_UPLLE_SHIFT, + USB_SYSCFG_UPLLE) == 1) + { + if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode) + { + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb0_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + else + { + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + Userdef_USB_usb0_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + } + else + { + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb0_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + + USB200.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT); +} + +/******************************************************************************* +* Function Name: usb0_function_get_buf_size +* Description : Obtains pipe buffer size specified by the argument and +* : maximum packet size of the USB device in use. +* : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum +* : packet size of the USB device using the corresponding pipe. +* : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the +* : corresponding pipe is in continuous transfer mode, +* : obtains the buffer size allocated in the corresponcing pipe, +* : when incontinuous transfer, obtains maximum packet size. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Maximum packet size or buffer size +*******************************************************************************/ +uint16_t usb0_function_get_buf_size (uint16_t pipe) +{ + uint16_t size; + uint16_t bufsize; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB200.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1) + { + bufsize = RZA_IO_RegRead_16(&g_usb0_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE); + size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF); + } + else + { + size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + } + return size; +} + +/******************************************************************************* +* Function Name: usb0_function_get_mxps +* Description : Obtains maximum packet size of the USB device using the pipe +* : specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Max Packet Size +*******************************************************************************/ +uint16_t usb0_function_get_mxps (uint16_t pipe) +{ + uint16_t size; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB200.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + size = RZA_IO_RegRead_16(&g_usb0_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + return size; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_api.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,441 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_api.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" +#include "dev_drv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_api_function_init +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint8_t int_level ; interruput level +* : uint16_t mode : Speed modes +* : : USB_FUCNTION_HIGH_SPEED: High-speed device +* : : USB_FUCNTION_FULL_SPEED: Full-speed device +* : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode) +{ + volatile uint8_t dummy_buf; + + CPG.STBCR7 &= 0xfd; /* The clock of USB0 modules is permitted */ + dummy_buf = CPG.STBCR7; /* (Dummy read) */ + + usb0_function_setting_interrupt(int_level); + + usb0_function_reset_module(clockmode); /* reset USB module with setting tranciever */ + /* and HSE=1 */ + + usb0_function_init_status(); /* clear variables */ + + usb0_function_InitModule(mode); /* select USB Function and Interrupt Enable */ + /* Detect USB Device to attach or detach */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_api_function_IsConfigured +* Description : Checks if the USB device is configured to return the result as +* : the return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Configured & Configured Suspend +* : DEVDRV_USBF_NO : not Configured +*******************************************************************************/ +uint16_t usb0_api_function_IsConfigured (void) +{ + uint16_t dvst; + + dvst = usb0_function_GetDeviceState(); + + if ((dvst == USB_FUNCTION_DVST_CONFIGURED) || + (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND)) + { + return DEVDRV_USBF_YES; + } + + return DEVDRV_USBF_NO; +} + +/******************************************************************************* +* Function Name: usb0_function_GetDeviceState +* Description : Returns the state of USB device. +* Arguments : none +* Return Value : Device States +*******************************************************************************/ +uint16_t usb0_function_GetDeviceState (void) +{ + uint16_t dvsq; + uint16_t dvst; + + dvsq = USB200.INTSTS0; + switch(dvsq & USB_FUNCTION_BITDVSQ) + { + case USB_FUNCTION_DS_POWR: /* Power state *//* power-on */ + dvst = USB_FUNCTION_DVST_POWERED; + break; + + case USB_FUNCTION_DS_DFLT: /* Default state *//* bus-reset */ + dvst = USB_FUNCTION_DVST_DEFAULT; + break; + + case USB_FUNCTION_DS_ADDS: /* Address state */ + dvst = USB_FUNCTION_DVST_ADDRESS; + break; + + case USB_FUNCTION_DS_CNFG: /* Configured state */ + dvst = USB_FUNCTION_DVST_CONFIGURED; + break; + + case USB_FUNCTION_DS_SPD_CNFG: /* Configured Suspend state */ + dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND; + break; + + case USB_FUNCTION_DS_SPD_POWR: /* Power Suspend state */ + case USB_FUNCTION_DS_SPD_DFLT: /* Default Suspend state */ + case USB_FUNCTION_DS_SPD_ADDR: /* Address Suspend state */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + + default: /* error */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + } + + return dvst; +} + +/******************************************************************************* +* Function Name: usb0_api_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : none +*******************************************************************************/ +void usb0_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + usb0_function_start_receive_transfer(pipe, size, data); +} + +/******************************************************************************* +* Function Name: usb0_api_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb0_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + + status = usb0_function_start_send_transfer(pipe, size, data); + + return status; +} + +/******************************************************************************* +* Function Name: usb0_api_function_check_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t *size ; Data Size +* Return Value : Pipe Status +*******************************************************************************/ +uint16_t usb0_api_function_check_pipe_status (uint16_t pipe, uint32_t * size) +{ + if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE) + { + *size = g_usb0_function_PipeDataSize[pipe]; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_DONE; + } + else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES) + { + *size = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_NORES; + } + else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL) + { + *size = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_STALL; + } + else if (g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR) + { + *size = 0; + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_FIFOERROR; + } + else + { + /* Do Nothing */ + } + + return g_usb0_function_pipe_status[pipe]; +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Pipe Status +*******************************************************************************/ +void usb0_api_function_clear_pipe_status (uint16_t pipe) +{ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb0_function_PipeDataSize[pipe] = 0; +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_pid_buf (uint16_t pipe) +{ + usb0_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_pid_nak (uint16_t pipe) +{ + usb0_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_pid_stall (uint16_t pipe) +{ + usb0_function_set_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_pid_stall (uint16_t pipe) +{ + usb0_function_clear_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb0_api_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + + return pid; +} + +/******************************************************************************* +* Function Name: usb0_api_function_check_stall +* Description : +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +int32_t usb0_api_function_check_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb0_function_get_pid(pipe); + + if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL) + { + return DEVDRV_USBF_STALL; + } + + return DEVDRV_SUCCESS; +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_sqclr (uint16_t pipe) +{ + usb0_function_set_sqclr(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_sqset (uint16_t pipe) +{ + usb0_function_set_sqset(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_csclr (uint16_t pipe) +{ + usb0_function_set_csclr(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_set_curpipe +* Description : Allocates FIF0 specifed by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb0_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + usb0_function_set_curpipe(pipe, fifosel, isel, mbw); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_brdy_sts (uint16_t pipe) +{ + usb0_function_clear_brdy_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_bemp_sts (uint16_t pipe) +{ + usb0_function_clear_bemp_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb0_api_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb0_api_function_clear_nrdy_sts (uint16_t pipe) +{ + usb0_function_clear_nrdy_sts(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_controlrw.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_controlrw.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_api_function_CtrlReadStart +* Description : Executes the USB control read transfer. +* : USB host controller <- USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; End of data write +* : DEVDRV_USBF_WRITESHRT ; End of short data write +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_FIFOERROR ; FIFO access error +*******************************************************************************/ +uint16_t usb0_api_function_CtrlReadStart (uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t mbw; + + usb0_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb0_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; + + status = usb0_function_write_buffer_c(USB_FUNCTION_PIPE0); + + /* Peripheral Control sequence */ + switch (status) + { + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + case DEVDRV_USBF_WRITEEND: /* End of data write (not null) */ + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0); /* Enable Empty Interrupt */ + usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); /* Set BUF */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access error */ + break; + + default: + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb0_api_function_CtrlWriteStart +* Description : Executes the USB control write transfer. +* : USB host controller -> USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb0_api_function_CtrlWriteStart (uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb0_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb0_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb0_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb0_function_get_mbw(g_usb0_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb0_function_data_pointer[USB_FUNCTION_PIPE0]); + usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb0_function_enable_brdy_int(USB_FUNCTION_PIPE0); + usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_global.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,144 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_global.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +const uint16_t g_usb0_function_bit_set[16] = +{ + 0x0001, 0x0002, 0x0004, 0x0008, + 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, + 0x1000, 0x2000, 0x4000, 0x8000 +}; + +uint32_t g_usb0_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint8_t * g_usb0_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +uint16_t g_usb0_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint32_t g_usb0_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1]; + +USB_FUNCTION_DMA_t g_usb0_function_DmaInfo[2]; +uint16_t g_usb0_function_DmaPipe[2]; +uint16_t g_usb0_function_DmaBval[2]; +uint16_t g_usb0_function_DmaStatus[2]; + +uint16_t g_usb0_function_CtrZeroLengthFlag; + +//uint16_t g_usb0_function_ConfigNum; +//uint16_t g_usb0_function_Alternate[USB_FUNCTION_ALT_NO]; +//uint16_t g_usb0_function_RemoteWakeupFlag; +uint16_t g_usb0_function_TestModeFlag; +uint16_t g_usb0_function_TestModeSelectors; + +//uint16_t g_usb0_function_ReqType; +//uint16_t g_usb0_function_ReqTypeType; +//uint16_t g_usb0_function_ReqTypeRecip; +//uint16_t g_usb0_function_ReqRequest; +//uint16_t g_usb0_function_ReqValue; +//uint16_t g_usb0_function_ReqIndex; +//uint16_t g_usb0_function_ReqLength; + +//uint16_t g_usb0_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +uint16_t g_usb0_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb0_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +* Function Name: usb0_function_init_status +* Description : Initialization USB Sample Driver Variable. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_init_status (void) +{ + uint16_t pipe; + + //g_usb0_function_ConfigNum = 0; + //g_usb0_function_RemoteWakeupFlag = DEVDRV_USBF_OFF; + g_usb0_function_TestModeFlag = DEVDRV_USBF_OFF; + g_usb0_function_CtrZeroLengthFlag = 0; + +#if 0 + usb0_function_clear_alt(); +#endif + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb0_function_PipeDataSize[pipe] = 0; + g_usb0_function_data_count[pipe] = 0; + + /* pipe configuration in usb0_function_ResetEP() */ + g_usb0_function_pipecfg[pipe] = 0; + g_usb0_function_pipebuf[pipe] = 0; + g_usb0_function_pipemaxp[pipe] = 0; + g_usb0_function_pipeperi[pipe] = 0; + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sig.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,330 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_sig.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb0_function_EnableINTModule(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_InitModule +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint16_t mode ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode +* : ; other ; Full-speed Mode +* Return Value : none +*******************************************************************************/ +void usb0_function_InitModule (uint16_t mode) +{ + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); /* USB function */ + + /* USB module operation enabled */ + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + if (mode == USB_FUNCTION_HIGH_SPEED) + { + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); /* Hi-Speed Mode */ + } + else + { + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); + } + + /* for power-on */ + if (usb0_function_CheckVBUStaus() == DEVDRV_USBF_ON) + { + usb0_function_EnableINTModule(); /* Interrupt Enable */ + usb0_function_USB_FUNCTION_Attach(); /* pull-up D+ and open D- */ + } + else + { + usb0_function_USB_FUNCTION_Detach(); /* USB Detach */ + /* with Interrupt Enable */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_CheckVBUStaus +* Description : Checks the USB-VBUS state to returns the connection state to +* : the USB host. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : VBUS ON +* : DEVDRV_USBF_OFF : VBUS OFF +*******************************************************************************/ +uint16_t usb0_function_CheckVBUStaus (void) +{ + uint16_t buf1; + uint16_t buf2; + uint16_t buf3; + + /* monitor VBUS pins */ + do + { + buf1 = RZA_IO_RegRead_16(&USB200.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb0_function_delay_10us(1); + buf2 = RZA_IO_RegRead_16(&USB200.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb0_function_delay_10us(1); + buf3 = RZA_IO_RegRead_16(&USB200.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + } while ((buf1 != buf2) || (buf2 != buf3)); + + if (buf1 == DEVDRV_USBF_OFF) + { + return DEVDRV_USBF_OFF; /* detach */ + } + + return DEVDRV_USBF_ON; /* attach */ +} + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Attach +* Description : Connects to the USB host controller. +* : This function pulls up D+. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_USB_FUNCTION_Attach (void) +{ + Userdef_USB_usb0_function_attach(); + + Userdef_USB_usb0_function_delay_xms(10); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* Pull-up D+ and open D- */ +} + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Detach +* Description : Disconnects from the USB host controller. +* : This function opens D+/D-. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_USB_FUNCTION_Detach (void) +{ + uint16_t pipe; + + Userdef_USB_usb0_function_detach(); + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE) + { + usb0_function_stop_transfer(pipe); + } + } + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* open D+ and D- */ + + /* Detach Recovery */ + Userdef_USB_usb0_function_delay_500ns(); /* need 1us=500ns * 2 wait */ + Userdef_USB_usb0_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + Userdef_USB_usb0_function_delay_500ns(); /* need 100ns wait but 500ns S/W wait */ + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 0, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); /* soft reset module */ + Userdef_USB_usb0_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB200.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + usb0_function_EnableINTModule(); /* Interrupt Enable */ +} + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_BusReset +* Description : This function is executed when the USB device is transitioned +* : to POWERD_STATE. Sets the device descriptor according to the +* : connection speed determined by the USB reset hand shake. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb0_function_USB_FUNCTION_BusReset (void) +{ + usb0_function_init_status(); /* memory clear */ + + if (usb0_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) + { + usb0_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED); /* Device Descriptor reset */ + } + else + { + usb0_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED); /* Device Descriptor reset */ + } + + usb0_function_ResetDCP(); /* Default Control PIPE reset */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Resume +* Description : This function is executed when the USB device detects a resume +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb0_function_USB_FUNCTION_Resume (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_Suspend +* Description : This function is executed when the USB device detects a suspend +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb0_function_USB_FUNCTION_Suspend (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_USB_FUNCTION_TestMode +* Description : This function is executed when the USB device is transitioned U +* : to TEST_MODE by the USB standard request. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_USB_FUNCTION_TestMode (void) +{ + switch (g_usb0_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT) + { + case USB_FUNCTION_FUNCTION_TEST_J: + case USB_FUNCTION_FUNCTION_TEST_K: + case USB_FUNCTION_FUNCTION_TEST_SE0_NAK: + case USB_FUNCTION_FUNCTION_TEST_PACKET: + RZA_IO_RegWrite_16(&USB200.TESTMODE, + (g_usb0_function_TestModeSelectors >> 8), + USB_TESTMODE_UTST_SHIFT, + USB_TESTMODE_UTST); + break; + + case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE: + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb0_function_EnableINTModule +* Description : Enables USB interrupt. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void usb0_function_EnableINTModule (void) +{ + uint16_t buf; + + buf = USB200.INTENB0; + buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE | + USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE); + USB200.INTENB0 = buf; + + usb0_function_enable_bemp_int(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/function/usb0_function_sub.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,453 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_sub.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb0_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +#if 0 +extern const uint16_t *g_usb0_function_EndPntPtr[]; +extern uint8_t g_usb0_function_DeviceDescriptor[]; +extern uint8_t *g_usb0_function_ConfigurationPtr[]; +#endif + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb0_function_ResetDCP +* Description : Initializes the default control pipe(DCP). +* Outline : Reset default control pipe +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_ResetDCP (void) +{ + USB200.DCPCFG = 0; +#if 0 + USB200.DCPMAXP = g_usb0_function_DeviceDescriptor[7]; +#else + USB200.DCPMAXP = 64; +#endif + + USB200.CFIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB200.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB200.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); +} + +/******************************************************************************* +* Function Name: usb0_function_ResetEP +* Description : Initializes the end point. +* Arguments : uint16_t num ; Configuration Number +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_ResetEP (uint16_t num) +{ + uint16_t pipe; + uint16_t ep; + uint16_t index; + uint16_t buf; + uint16_t * tbl; + + tbl = (uint16_t *)(g_usb0_function_EndPntPtr[num - 1]); + + for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + if (g_usb0_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR) + { + index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb0_function_EPTableIndex[ep]); + pipe = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE); + + g_usb0_function_PipeTbl[pipe] = (uint16_t)( ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) | + ep | + (tbl[index + 0] & USB_FUNCTION_FIFO_USE) ); + + if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT) + { + tbl[index + 1] |= USB_FUNCTION_SHTNAKON; +#ifdef __USB_DMA_BFRE_ENABLE__ + /* this routine cannnot be perfomred if read operation is executed in buffer size */ + if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) || + ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)) + { + tbl[index + 1] |= USB_FUNCTION_BFREON; + } +#endif + } + + /* Interrupt Disable */ + buf = USB200.BRDYENB; + buf &= (uint16_t)~g_usb0_function_bit_set[pipe]; + USB200.BRDYENB = buf; + buf = USB200.NRDYENB; + buf &= (uint16_t)~g_usb0_function_bit_set[pipe]; + USB200.NRDYENB = buf; + buf = USB200.BEMPENB; + buf &= (uint16_t)~g_usb0_function_bit_set[pipe]; + USB200.BEMPENB = buf; + + usb0_function_set_pid_nak(pipe); + + /* CurrentPIPE Clear */ + if (RZA_IO_RegRead_16(&USB200.CFIFOSEL, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB200.CFIFOSEL, + 0, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB200.D0FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB200.D1FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + /* PIPE Configuration */ + USB200.PIPESEL = pipe; + USB200.PIPECFG = tbl[index + 1]; + USB200.PIPEBUF = tbl[index + 2]; + USB200.PIPEMAXP = tbl[index + 3]; + USB200.PIPEPERI = tbl[index + 4]; + + g_usb0_function_pipecfg[pipe] = tbl[index + 1]; + g_usb0_function_pipebuf[pipe] = tbl[index + 2]; + g_usb0_function_pipemaxp[pipe] = tbl[index + 3]; + g_usb0_function_pipeperi[pipe] = tbl[index + 4]; + + /* Buffer Clear */ + usb0_function_set_sqclr(pipe); + usb0_function_aclrm(pipe); + + /* init Global */ + g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb0_function_PipeDataSize[pipe] = 0; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_EpToPipe +* Description : Returns the pipe which end point specified by the argument is +* : allocated to. +* Arguments : uint16_t ep ; Direction + Endpoint Number +* Return Value : USB_FUNCTION_EP_ERROR : Error +* : Others : Pipe Number +*******************************************************************************/ +uint16_t usb0_function_EpToPipe (uint16_t ep) +{ + uint16_t pipe; + + for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((g_usb0_function_PipeTbl[pipe] & 0x00ff) == ep) + { + return pipe; + } + } + + return USB_FUNCTION_EP_ERROR; +} + +/******************************************************************************* +* Function Name: usb0_function_InitEPTable +* Description : Sets the end point by the Alternate setting value of the +* : configuration number and the interface number specified by the +* : argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* : uint16_t Alt_Num ; Alternate Setting +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num) +{ + uint8_t * ptr; + uint16_t point_interface; + uint16_t point_endpoint; + uint16_t length; + uint16_t start; + uint16_t numbers; + uint16_t endpoint; + + ptr = (uint8_t *)g_usb0_function_ConfigurationPtr[Con_Num - 1]; + point_interface = *ptr; + length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2)); + ptr += *ptr; + start = 0; + numbers = 0; + point_endpoint = 0; + + for (; point_interface < length;) + { + switch (*(ptr + 1)) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num)) + { + numbers = *(ptr + 4); + } + else + { + start += *(ptr + 4); + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + if (point_endpoint < numbers) + { + endpoint = (uint16_t)(*(ptr + 2) & 0x0f); + g_usb0_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint); + ++point_endpoint; + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + default: /* Class, Vendor, else */ + point_interface += *ptr; + ptr += *ptr; + break; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_GetConfigNum +* Description : Returns the number of configuration referring to the number of +* : configuration described in the device descriptor. +* Arguments : none +* Return Value : Number of possible configurations (bNumConfigurations). +*******************************************************************************/ +#if 0 +uint16_t usb0_function_GetConfigNum (void) +{ + return (uint16_t)g_usb0_function_DeviceDescriptor[17]; +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_GetInterfaceNum +* Description : Returns the number of interface referring to the number of +* : interface described in the configuration descriptor. +* Arguments : uint16_t num ; Configuration Number +* Return Value : Number of this interface (bNumInterfaces). +*******************************************************************************/ +#if 0 +uint16_t usb0_function_GetInterfaceNum (uint16_t num) +{ + return (uint16_t)(*(g_usb0_function_ConfigurationPtr[num - 1] + 4)); +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_GetAltNum +* Description : Returns the Alternate setting value of the configuration number +* : and the interface number specified by the argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* Return Value : Value used to select this alternate setting(bAlternateSetting). +*******************************************************************************/ +#if 0 +uint16_t usb0_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num) +{ + uint8_t * ptr; + uint16_t point; + uint16_t alt_num = 0; + uint16_t length; + + ptr = (uint8_t *)(g_usb0_function_ConfigurationPtr[Con_Num - 1]); + point = ptr[0]; + ptr += ptr[0]; /* InterfaceDescriptor[0] */ + length = (uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 2)); + length |= (uint16_t)((uint16_t)(*(g_usb0_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8); + + for (; point < length;) /* Search Descriptor Table size */ + { + switch (ptr[1]) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if (Int_Num == ptr[2]) + { + alt_num = (uint16_t)ptr[3]; /* Alternate Number count */ + } + point += ptr[0]; + ptr += ptr[0]; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + default: /* Class, Vendor, else */ + point += ptr[0]; + ptr += ptr[0]; + break; + } + } + return alt_num; +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_CheckRemoteWakeup +* Description : Returns the result of the remote wake up function is supported +* : or not referring to the configuration descriptor. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : Support Remote Wakeup +* : DEVDRV_USBF_OFF : not Support Remote Wakeup +*******************************************************************************/ +#if 0 +uint16_t usb0_function_CheckRemoteWakeup (void) +{ + uint8_t atr; + + if (g_usb0_function_ConfigNum == 0) + { + return DEVDRV_USBF_OFF; + } + + atr = *(g_usb0_function_ConfigurationPtr[g_usb0_function_ConfigNum - 1] + 7); + + if (atr & USB_FUNCTION_CF_RWUP) + { + return DEVDRV_USBF_ON; + } + + return DEVDRV_USBF_OFF; +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_clear_alt +* Description : Initializes the Alternate setting area. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_clear_alt (void) +{ + int i; + + for (i = 0; i < USB_FUNCTION_ALT_NO; ++i) + { + g_usb0_function_Alternate[i] = 0; /* Alternate */ + } +} +#endif + +/******************************************************************************* +* Function Name: usb0_function_clear_pipe_tbl +* Description : Initializes pipe definition table. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb0_function_clear_pipe_tbl (void) +{ + int pipe; + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb0_function_PipeTbl[pipe] = 0; + } +} + +/******************************************************************************* +* Function Name: usb0_function_clear_ep_table_index +* Description : Initializes the end point table index. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb0_function_clear_ep_table_index (void) +{ + int ep; + + for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + g_usb0_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR; + } +} +#endif + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_dmacdrv.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,698 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_dmacdrv.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "rza_io_regrw.h" +#include "usb0_function_dmacdrv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DMAC_INDEFINE (255) /* Macro definition when REQD bit is not used */ + +/* ==== Request setting information for on-chip peripheral module ==== */ +typedef enum dmac_peri_req_reg_type +{ + DMAC_REQ_MID, + DMAC_REQ_RID, + DMAC_REQ_AM, + DMAC_REQ_LVL, + DMAC_REQ_REQD +} dmac_peri_req_reg_type_t; + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +/* ==== Prototype declaration ==== */ + +/* ==== Global variable ==== */ +/* On-chip peripheral module request setting table */ +static const uint8_t usb0_function_dmac_peri_req_init_table[8][5] = +{ + /* MID,RID,AM,LVL,REQD */ + {32, 3, 2, 1, 1}, /* USB_0 channel 0 transmit FIFO empty */ + {32, 3, 2, 1, 0}, /* USB_0 channel 0 receive FIFO full */ + {33, 3, 2, 1, 1}, /* USB_0 channel 1 transmit FIFO empty */ + {33, 3, 2, 1, 0}, /* USB_0 channel 1 receive FIFO full */ + {34, 3, 2, 1, 1}, /* USB_1 channel 0 transmit FIFO empty */ + {34, 3, 2, 1, 0}, /* USB_1 channel 0 receive FIFO full */ + {35, 3, 2, 1, 1}, /* USB_1 channel 1 transmit FIFO empty */ + {35, 3, 2, 1, 0}, /* USB_1 channel 1 receive FIFO full */ +}; + + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 1. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 1 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t *trans_info : Setting information to DMAC register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous transfer +* : uint32_t request_factor : Factor for on-chip peripheral module request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction: Setting value of CHCFG_n register REQD bit +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC1_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC1.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC1.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC1.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->daddr_dir, + DMAC1_CHCFG_n_DAD_SHIFT, + DMAC1_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->saddr_dir, + DMAC1_CHCFG_n_SAD_SHIFT, + DMAC1_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->dst_size, + DMAC1_CHCFG_n_DDS_SHIFT, + DMAC1_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + trans_info->src_size, + DMAC1_CHCFG_n_SDS_SHIFT, + DMAC1_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_DMS_SHIFT, + DMAC1_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_RSEL_SHIFT, + DMAC1_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_SBE_SHIFT, + DMAC1_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_DEM_SHIFT, + DMAC1_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_REN_SHIFT, + DMAC1_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_RSW_SHIFT, + DMAC1_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_REN_SHIFT, + DMAC1_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_RSW_SHIFT, + DMAC1_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_TM_SHIFT, + DMAC1_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_SEL_SHIFT, + DMAC1_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 1, + DMAC1_CHCFG_n_HIEN_SHIFT, + DMAC1_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + 0, + DMAC1_CHCFG_n_LOEN_SHIFT, + DMAC1_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC1_CHCFG_n_AM_SHIFT, + DMAC1_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC1_CHCFG_n_LVL_SHIFT, + DMAC1_CHCFG_n_LVL); + + if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC1_CHCFG_n_REQD_SHIFT, + DMAC1_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC1.CHCFG_n, + req_direction, + DMAC1_CHCFG_n_REQD_SHIFT, + DMAC1_CHCFG_n_REQD); + } + + RZA_IO_RegWrite_32(&DMAC01.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC01_DMARS_CH1_RID_SHIFT, + DMAC01_DMARS_CH1_RID); + RZA_IO_RegWrite_32(&DMAC01.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC01_DMARS_CH1_MID_SHIFT, + DMAC01_DMARS_CH1_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_Open +* Description : Enables DMAC channel 1 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb0_function_DMAC1_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_EN_SHIFT, + DMAC1_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_TACT_SHIFT, + DMAC1_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_SWRST_SHIFT, + DMAC1_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC1.CHCTRL_n, + DMAC1_CHCTRL_n_SWRST_SHIFT, + DMAC1_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_SETEN_SHIFT, + DMAC1_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_STG_SHIFT, + DMAC1_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_Close +* Description : Aborts DMAC channel 1 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC1_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC1.CHCTRL_n, + 1, + DMAC1_CHCTRL_n_CLREN_SHIFT, + DMAC1_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_TACT_SHIFT, + DMAC1_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_EN_SHIFT, + DMAC1_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC1.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC1_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 1 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 1 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC1_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC1.CHSTAT_n, + DMAC1_CHSTAT_n_SR_SHIFT, + DMAC1_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC1.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC1.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC1.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC1.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC1.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC1.N1TB_n = count; /* Total transfer byte count */ + } +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 2. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 2 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t * trans_info : Setting information to DMAC +* : : register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous +* : : transfer +* : uint32_t request_factor : Factor for on-chip peripheral module +* : : request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction : Setting value of CHCFG_n register +* : : REQD bit +*******************************************************************************/ +void usb0_function_DMAC2_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC2.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC2.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC2.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->daddr_dir, + DMAC2_CHCFG_n_DAD_SHIFT, + DMAC2_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->saddr_dir, + DMAC2_CHCFG_n_SAD_SHIFT, + DMAC2_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->dst_size, + DMAC2_CHCFG_n_DDS_SHIFT, + DMAC2_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + trans_info->src_size, + DMAC2_CHCFG_n_SDS_SHIFT, + DMAC2_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_DMS_SHIFT, + DMAC2_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_RSEL_SHIFT, + DMAC2_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_SBE_SHIFT, + DMAC2_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_DEM_SHIFT, + DMAC2_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 1, + DMAC2_CHCFG_n_REN_SHIFT, + DMAC2_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 1, + DMAC2_CHCFG_n_RSW_SHIFT, + DMAC2_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_REN_SHIFT, + DMAC2_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_RSW_SHIFT, + DMAC2_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_TM_SHIFT, + DMAC2_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 2, + DMAC2_CHCFG_n_SEL_SHIFT, + DMAC2_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 1, + DMAC2_CHCFG_n_HIEN_SHIFT, + DMAC2_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + 0, + DMAC2_CHCFG_n_LOEN_SHIFT, + DMAC2_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC2_CHCFG_n_AM_SHIFT, + DMAC2_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC2_CHCFG_n_LVL_SHIFT, + DMAC2_CHCFG_n_LVL); + if (usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC2_CHCFG_n_REQD_SHIFT, + DMAC2_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC2.CHCFG_n, + req_direction, + DMAC2_CHCFG_n_REQD_SHIFT, + DMAC2_CHCFG_n_REQD); + } + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC23_DMARS_CH2_RID_SHIFT, + DMAC23_DMARS_CH2_RID); + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb0_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC23_DMARS_CH2_MID_SHIFT, + DMAC23_DMARS_CH2_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_Open +* Description : Enables DMAC channel 2 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb0_function_DMAC2_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2, + DMAC2_CHSTAT_n_EN_SHIFT, + DMAC2_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC.CHSTAT_2, + DMAC2_CHSTAT_n_TACT_SHIFT, + DMAC2_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_SWRST_SHIFT, + DMAC2_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC2.CHCTRL_n, + DMAC2_CHCTRL_n_SWRST_SHIFT, + DMAC2_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_SETEN_SHIFT, + DMAC2_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_STG_SHIFT, + DMAC2_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_Close +* Description : Aborts DMAC channel 2 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC2_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC2.CHCTRL_n, + 1, + DMAC2_CHCTRL_n_CLREN_SHIFT, + DMAC2_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n, + DMAC2_CHSTAT_n_TACT_SHIFT, + DMAC2_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC2.CHSTAT_n, + DMAC2_CHSTAT_n_EN_SHIFT, + DMAC2_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC2.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb0_function_DMAC2_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 2 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 2 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb0_function_DMAC2_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC2.CHSTAT_n, + DMAC2_CHSTAT_n_SR_SHIFT, + DMAC2_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC2.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC2.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC2.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC2.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC2.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC2.N1TB_n = count; /* Total transfer byte count */ + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb0/src/userdef/usb0_function_userdef.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,762 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb0_function_userdef.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "devdrv_usb_function_api.h" +#include "usb0_function_dmacdrv.h" /* common DMAC driver for USB */ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DUMMY_ACCESS OSTM0CNT + +/* #define CACHE_WRITEBACK */ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern int32_t io_cwb(unsigned long start, unsigned long end); + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb0_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void usb0_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void Userdef_USB_usb0_function_delay_10us_2(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_d0fifo_dmaintid +* Description : get D0FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D0FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb0_function_d0fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_d1fifo_dmaintid +* Description : get D1FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D1FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb0_function_d1fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_attach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_attach (void) +{ + printf("\n"); + printf("channel 0 attach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_detach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_detach (void) +{ + printf("\n"); + printf("channel 0 detach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_1ms +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_1ms (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* + * Wait 1ms (Please change for your MCU). + */ + for (i = 0; i < 1440; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_xms +* Description : Wait for the software in the period of time specified by the +* : argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t msec ; Wait Time (msec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_xms (uint32_t msec) +{ + volatile unsigned short i; + + for (i = 0; i < msec; ++i) + { + Userdef_USB_usb0_function_delay_1ms(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_10us +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t usec ; Wait Time(x 10usec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_10us (uint32_t usec) +{ + volatile int i; + + /* Wait 10us (Please change for your MCU) */ + for (i = 0; i < usec; ++i) + { + Userdef_USB_usb0_function_delay_10us_2(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_10us_2 +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void Userdef_USB_usb0_function_delay_10us_2 (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 1us (Please change for your MCU) */ + for (i = 0; i < 14; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_delay_500ns +* Description : Wait for software for 500ns. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_delay_500ns (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 500ns (Please change for your MCU) */ + /* Wait 500ns I clock 266MHz */ + tmp = DUMMY_ACCESS; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_start_dma +* Description : Enables DMA transfer on the information specified by the argument. +* : Set DMAC register by this function to enable DMA transfer. +* : After executing this function, USB module is set to start DMA +* : transfer. DMA transfer should not wait for DMA transfer complete. +* Arguments : USB_FUNCTION_DMA_t *dma : DMA parameter +* : typedef struct{ +* : uint32_t fifo; FIFO for using +* : uint32_t buffer; Start address of transfer source/destination +* : uint32_t bytes; Transfer size(Byte) +* : uint32_t dir; Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer) +* : uint32_t size; DMA transfer size +* : } USB_FUNCTION_DMA_t; +* : uint16_t dfacc ; 0 : cycle steal mode +* : 1 : 16byte continuous mode +* : 2 : 32byte continuous mode +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb0_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc) +{ + uint32_t trncount; + uint32_t src; + uint32_t dst; + uint32_t size; + uint32_t dir; +#ifdef CACHE_WRITEBACK + uint32_t ptr; +#endif + + trncount = dma->bytes; + dir = dma->dir; + + if (dir == USB_FUNCTION_FIFO2BUF) + { + /* DxFIFO determination */ + dst = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + src += 3; /* byte access */ + } + else if (size == 1) + { + src += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB200.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB200.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + src += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB200.D1FIFO.UINT32); + } + src += 3; /* byte access */ + } +#endif + } + else + { + /* DxFIFO determination */ + src = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + dst += 3; /* byte access */ + } + else if (size == 1) + { + dst += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB200.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB200.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + dst += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB200.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB200.D1FIFO.UINT32); + } + dst += 3; /* byte access */ + } +#endif + } + +#ifdef CACHE_WRITEBACK + ptr = (uint32_t)dma->buffer; + + if ((ptr & 0x20000000ul) == 0) + { + io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount); + } +#endif + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + usb0_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc); + } + else + { + usb0_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc); + } +} + +/******************************************************************************* +* Function Name: usb0_function_enable_dmac0 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb0_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB0_DMA0_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB0_DMA0_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb0_function_DMAC1_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb0_function_DMAC1_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb0_function_DMAC1_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC1 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: usb0_function_enable_dmac1 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb0_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB0_DMA1_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB0_DMA1_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb0_function_DMAC2_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb0_function_DMAC1_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb0_function_DMAC2_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC2 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_stop_dma0 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D0_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb0_function_stop_dma0 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb0_function_DMAC1_Close(&remain); + + return remain; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb0_function_stop_dma1 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D1_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb0_function_stop_dma1 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb0_function_DMAC2_Close(&remain); + + return remain; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,171 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB1_FUNCTION_H +#define USB1_FUNCTION_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "devdrv_usb_function_api.h" +#include "usb_function.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern const uint16_t g_usb1_function_bit_set[]; +extern uint32_t g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint8_t *g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +extern uint16_t g_usb1_function_PipeIgnore[]; +extern uint16_t g_usb1_function_PipeTbl[]; +extern uint16_t g_usb1_function_pipe_status[]; +extern uint32_t g_usb1_function_PipeDataSize[]; + +extern USB_FUNCTION_DMA_t g_usb1_function_DmaInfo[]; +extern uint16_t g_usb1_function_DmaPipe[]; +extern uint16_t g_usb1_function_DmaBval[]; +extern uint16_t g_usb1_function_DmaStatus[]; + +extern uint16_t g_usb1_function_CtrZeroLengthFlag; + +extern uint16_t g_usb1_function_ConfigNum; +extern uint16_t g_usb1_function_Alternate[USB_FUNCTION_ALT_NO]; +extern uint16_t g_usb1_function_RemoteWakeupFlag; +extern uint16_t g_usb1_function_TestModeFlag; +extern uint16_t g_usb1_function_TestModeSelectors; + +extern uint16_t g_usb1_function_ReqType; +extern uint16_t g_usb1_function_ReqTypeType; +extern uint16_t g_usb1_function_ReqTypeRecip; +extern uint16_t g_usb1_function_ReqRequest; +extern uint16_t g_usb1_function_ReqValue; +extern uint16_t g_usb1_function_ReqIndex; +extern uint16_t g_usb1_function_ReqLength; + +extern uint16_t g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +extern uint16_t g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +extern uint16_t g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +/* ==== common ==== */ +void usb1_function_dma_stop_d0(uint16_t pipe, uint32_t remain); +void usb1_function_dma_stop_d1(uint16_t pipe, uint32_t remain); +uint16_t usb1_function_is_hispeed(void); +uint16_t usb1_function_is_hispeed_enable(void); +uint16_t usb1_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb1_function_write_buffer(uint16_t pipe); +uint16_t usb1_function_write_buffer_c(uint16_t pipe); +uint16_t usb1_function_write_buffer_d0(uint16_t pipe); +uint16_t usb1_function_write_buffer_d1(uint16_t pipe); +void usb1_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb1_function_read_buffer(uint16_t pipe); +uint16_t usb1_function_read_buffer_c(uint16_t pipe); +uint16_t usb1_function_read_buffer_d0(uint16_t pipe); +uint16_t usb1_function_read_buffer_d1(uint16_t pipe); +uint16_t usb1_function_change_fifo_port(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb1_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb1_function_set_curpipe2(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc); +uint16_t usb1_function_get_mbw(uint32_t trncount, uint32_t dtptr); +uint16_t usb1_function_read_dma(uint16_t pipe); +void usb1_function_brdy_int(uint16_t status, uint16_t int_enb); +void usb1_function_nrdy_int(uint16_t status, uint16_t int_enb); +void usb1_function_bemp_int(uint16_t status, uint16_t int_enb); +void usb1_function_setting_interrupt(uint8_t level); +void usb1_function_reset_module(uint16_t clockmode); +uint16_t usb1_function_get_buf_size(uint16_t pipe); +uint16_t usb1_function_get_mxps(uint16_t pipe); +void usb1_function_clear_brdy_sts(uint16_t pipe); +void usb1_function_clear_bemp_sts(uint16_t pipe); +void usb1_function_clear_nrdy_sts(uint16_t pipe); +void usb1_function_set_pid_buf(uint16_t pipe); +void usb1_function_set_pid_nak(uint16_t pipe); +void usb1_function_set_pid_stall(uint16_t pipe); +void usb1_function_clear_pid_stall(uint16_t pipe); +uint16_t usb1_function_get_pid(uint16_t pipe); +void usb1_function_set_sqclr(uint16_t pipe); +void usb1_function_set_sqset(uint16_t pipe); +void usb1_function_set_csclr(uint16_t pipe); +void usb1_function_aclrm(uint16_t pipe); +void usb1_function_set_aclrm(uint16_t pipe); +void usb1_function_clr_aclrm(uint16_t pipe); +uint16_t usb1_function_get_sqmon(uint16_t pipe); +uint16_t usb1_function_get_inbuf(uint16_t pipe); + +/* ==== function ==== */ +void usb1_function_init_status(void); +void usb1_function_InitModule(uint16_t mode); +uint16_t usb1_function_CheckVBUStaus(void); +void usb1_function_USB_FUNCTION_Attach(void); +void usb1_function_USB_FUNCTION_Detach(void); +void usb1_function_USB_FUNCTION_BusReset(void); +void usb1_function_USB_FUNCTION_Resume(void); +void usb1_function_USB_FUNCTION_Suspend(void); +void usb1_function_USB_FUNCTION_TestMode(void); +void usb1_function_ResetDCP(void); +void usb1_function_ResetEP(uint16_t num); +uint16_t usb1_function_EpToPipe(uint16_t ep); +void usb1_function_InitEPTable(uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num); +uint16_t usb1_function_GetConfigNum(void); +uint16_t usb1_function_GetAltNum(uint16_t Con_Num, uint16_t Int_Num); +uint16_t usb1_function_CheckRemoteWakeup(void); +void usb1_function_clear_alt(void); +void usb1_function_clear_pipe_tbl(void); +void usb1_function_clear_ep_table_index(void); +uint16_t usb1_function_GetInterfaceNum(uint16_t num); + +#ifdef __cplusplus +} +#endif + + +#endif /* USB1_FUNCTION_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_api.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,104 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_api.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB1_FUNCTION_API_H +#define USB1_FUNCTION_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Variable Externs +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb1_api_function_init(uint8_t int_level, uint16_t mode, uint16_t clockmode); +uint16_t usb1_api_function_IsConfigured(void); +uint16_t usb1_function_GetDeviceState(void); +uint16_t usb1_api_function_CtrlReadStart(uint32_t size, uint8_t *data); +void usb1_api_function_CtrlWriteStart(uint32_t size, uint8_t *data); +uint16_t usb1_api_function_start_send_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +uint16_t usb1_api_function_check_pipe_status(uint16_t pipe, uint32_t *size); +void usb1_api_function_clear_pipe_status(uint16_t pipe); +void usb1_api_function_start_receive_transfer(uint16_t pipe, uint32_t size, uint8_t *data); +void usb1_api_function_set_pid_buf(uint16_t pipe); +void usb1_api_function_set_pid_nak(uint16_t pipe); +void usb1_api_function_set_pid_stall(uint16_t pipe); +void usb1_api_function_clear_pid_stall(uint16_t pipe); +uint16_t usb1_api_function_get_pid(uint16_t pipe); +int32_t usb1_api_function_check_stall(uint16_t pipe); +void usb1_api_function_set_sqclr(uint16_t pipe); +void usb1_api_function_set_sqset(uint16_t pipe); +void usb1_api_function_set_csclr(uint16_t pipe); +void usb1_api_function_set_curpipe(uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw); +void usb1_api_function_clear_brdy_sts(uint16_t pipe); +void usb1_api_function_clear_bemp_sts(uint16_t pipe); +void usb1_api_function_clear_nrdy_sts(uint16_t pipe); + +void usb1_function_ClearFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetFeature(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetAddress(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_SynchFrame(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetStatus(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetDescriptor(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetConfiguration(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_GetInterface(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_0(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_123(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_4(uint16_t type, uint16_t value, uint16_t index, uint16_t length); +void usb1_function_Resrv_5(uint16_t type, uint16_t value, uint16_t index, uint16_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* USB1_FUNCTION_API_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/inc/usb1_function_dmacdrv.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dmacdrv.h +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Description : RZ/A1H R7S72100 USB Sample Program +*******************************************************************************/ +#ifndef USB1_FUNCTION_DMACDRV_H +#define USB1_FUNCTION_DMACDRV_H + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ +typedef struct dmac_transinfo +{ + uint32_t src_addr; /* Transfer source address */ + uint32_t dst_addr; /* Transfer destination address */ + uint32_t count; /* Transfer byte count */ + uint32_t src_size; /* Transfer source data size */ + uint32_t dst_size; /* Transfer destination data size */ + uint32_t saddr_dir; /* Transfer source address direction */ + uint32_t daddr_dir; /* Transfer destination address direction */ +} dmac_transinfo_t; + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +/* ==== Transfer specification of the sample program ==== */ +#define DMAC_SAMPLE_SINGLE (0) /* Single transfer */ +#define DMAC_SAMPLE_CONTINUATION (1) /* Continuous transfer (use REN bit) */ + +/* ==== DMA modes ==== */ +#define DMAC_MODE_REGISTER (0) /* Register mode */ +#define DMAC_MODE_LINK (1) /* Link mode */ + +/* ==== Transfer requests ==== */ +#define DMAC_REQ_MODE_EXT (0) /* External request */ +#define DMAC_REQ_MODE_PERI (1) /* On-chip peripheral module request */ +#define DMAC_REQ_MODE_SOFT (2) /* Auto-request (request by software) */ + +/* ==== DMAC transfer sizes ==== */ +#define DMAC_TRANS_SIZE_8 (0) /* 8 bits */ +#define DMAC_TRANS_SIZE_16 (1) /* 16 bits */ +#define DMAC_TRANS_SIZE_32 (2) /* 32 bits */ +#define DMAC_TRANS_SIZE_64 (3) /* 64 bits */ +#define DMAC_TRANS_SIZE_128 (4) /* 128 bits */ +#define DMAC_TRANS_SIZE_256 (5) /* 256 bits */ +#define DMAC_TRANS_SIZE_512 (6) /* 512 bits */ +#define DMAC_TRANS_SIZE_1024 (7) /* 1024 bits */ + +/* ==== Address increment for transferring ==== */ +#define DMAC_TRANS_ADR_NO_INC (1) /* Not increment */ +#define DMAC_TRANS_ADR_INC (0) /* Increment */ + +/* ==== Method for detecting DMA request ==== */ +#define DMAC_REQ_DET_FALL (0) /* Falling edge detection */ +#define DMAC_REQ_DET_RISE (1) /* Rising edge detection */ +#define DMAC_REQ_DET_LOW (2) /* Low level detection */ +#define DMAC_REQ_DET_HIGH (3) /* High level detection */ + +/* ==== Request Direction ==== */ +#define DMAC_REQ_DIR_SRC (0) /* DMAREQ is the source/ DMAACK is active when reading */ +#define DMAC_REQ_DIR_DST (1) /* DMAREQ is the destination/ DMAACK is active when writing */ + +/* ==== Descriptors ==== */ +#define DMAC_DESC_HEADER (0) /* Header */ +#define DMAC_DESC_SRC_ADDR (1) /* Source Address */ +#define DMAC_DESC_DST_ADDR (2) /* Destination Address */ +#define DMAC_DESC_COUNT (3) /* Transaction Byte */ +#define DMAC_DESC_CHCFG (4) /* Channel Confg */ +#define DMAC_DESC_CHITVL (5) /* Channel Interval */ +#define DMAC_DESC_CHEXT (6) /* Channel Extension */ +#define DMAC_DESC_LINK_ADDR (7) /* Link Address */ + +/* ==== On-chip peripheral module requests ===== */ +typedef enum dmac_request_factor +{ + DMAC_REQ_USB0_DMA0_TX, /* USB_0 channel 0 transmit FIFO empty */ + DMAC_REQ_USB0_DMA0_RX, /* USB_0 channel 0 receive FIFO full */ + DMAC_REQ_USB0_DMA1_TX, /* USB_0 channel 1 transmit FIFO empty */ + DMAC_REQ_USB0_DMA1_RX, /* USB_0 channel 1 receive FIFO full */ + DMAC_REQ_USB1_DMA0_TX, /* USB_1 channel 0 transmit FIFO empty */ + DMAC_REQ_USB1_DMA0_RX, /* USB_1 channel 0 receive FIFO full */ + DMAC_REQ_USB1_DMA1_TX, /* USB_1 channel 1 transmit FIFO empty */ + DMAC_REQ_USB1_DMA1_RX, /* USB_1 channel 1 receive FIFO full */ +} dmac_request_factor_t; + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +void usb1_function_DMAC3_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb1_function_DMAC3_Open(uint32_t req); +void usb1_function_DMAC3_Close(uint32_t *remain); +void usb1_function_DMAC3_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +void usb1_function_DMAC4_PeriReqInit(const dmac_transinfo_t *trans_info, uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction); +int32_t usb1_function_DMAC4_Open(uint32_t req); +void usb1_function_DMAC4_Close(uint32_t *remain); +void usb1_function_DMAC4_Load_Set(uint32_t src_addr, uint32_t dst_addr, uint32_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* USB1_FUNCTION_DMACDRV_H */ + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dataio.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2932 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dataio.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static uint16_t g_usb1_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)]; + +static void usb1_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data); +static void usb1_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data); +static uint16_t usb1_function_read_dma_d0(uint16_t pipe); +static uint16_t usb1_function_read_dma_d1(uint16_t pipe); +static uint16_t usb1_function_write_dma_d0(uint16_t pipe); +static uint16_t usb1_function_write_dma_d1(uint16_t pipe); + +static void usb1_function_read_c_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_write_c_fifo(uint16_t Pipe, uint16_t count); +static void usb1_function_read_d0_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_write_d0_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_read_d1_fifo(uint16_t pipe, uint16_t count); +static void usb1_function_write_d1_fifo(uint16_t pipe, uint16_t count); + +static void usb1_function_clear_transaction_counter(uint16_t pipe); +static void usb1_function_set_transaction_counter(uint16_t pipe, uint32_t count); + +static uint32_t usb1_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr); + +static uint16_t usb1_function_set_dfacc_d0(uint16_t mbw, uint32_t count); +static uint16_t usb1_function_set_dfacc_d1(uint16_t mbw, uint32_t count); + + +/******************************************************************************* +* Function Name: usb1_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t usefifo; + uint16_t mbw; + + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + usb1_function_clear_bemp_sts(pipe); + usb1_function_clear_brdy_sts(pipe); + usb1_function_clear_nrdy_sts(pipe); + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + case USB_FUNCTION_D0FIFO_DMA: + usefifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + case USB_FUNCTION_D1FIFO_DMA: + usefifo = USB_FUNCTION_D1USE; + break; + + default: + usefifo = USB_FUNCTION_CUSE; + break; + }; + + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw); + + usb1_function_clear_transaction_counter(pipe); + + usb1_function_aclrm(pipe); + + status = usb1_function_write_buffer(pipe); + + if (status != DEVDRV_USBF_FIFOERROR) + { + usb1_function_set_pid_buf(pipe); + } + + return status; +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer +* Description : Writes data in the buffer allocated in the pipe specified by +* : the argument. The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer (uint16_t pipe) +{ + uint16_t status; + uint16_t usefifo; + + g_usb1_function_PipeIgnore[pipe] = 0; + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + status = usb1_function_write_buffer_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_USE: + status = usb1_function_write_buffer_d1(pipe); + break; + + case USB_FUNCTION_D0FIFO_DMA: + status = usb1_function_write_dma_d0(pipe); + break; + + case USB_FUNCTION_D1FIFO_DMA: + status = usb1_function_write_dma_d1(pipe); + break; + + default: + status = usb1_function_write_buffer_c(pipe); + break; + }; + + switch (status) + { + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb1_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + usb1_function_enable_brdy_int(pipe); /* Enable Ready Interrupt */ + break; + + case DEVDRV_USBF_WRITEEND: /* End of data write */ + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb1_function_clear_nrdy_sts(pipe); + usb1_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + /* for last transfer */ + usb1_function_enable_bemp_int(pipe); /* Enable Empty Interrupt */ + break; + + case DEVDRV_USBF_WRITEDMA: /* DMA write */ + usb1_function_clear_nrdy_sts(pipe); + usb1_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + usb1_function_disable_bemp_int(pipe); /* Disable Empty Interrupt */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer_c +* Description : Writes data in the buffer allocated in the pipe specified in +* : the argument. Writes data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + if (g_usb1_function_CtrZeroLengthFlag == 1) + { + g_usb1_function_CtrZeroLengthFlag = 0; /* Zero Length Packet Flag CLR */ + return DEVDRV_USBF_WRITEEND; + } + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + if (pipe == USB_FUNCTION_PIPE0) + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + } + else + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + } + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb1_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb1_function_write_c_fifo(pipe, (uint16_t)count); + + if (g_usb1_function_data_count[pipe] < (uint32_t)size) + { + g_usb1_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB201.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0) + { + USB201.CFIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + g_usb1_function_CtrZeroLengthFlag = 1; /* Zero Length Packet Flag */ + } + } + else + { + g_usb1_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb1_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb1_function_write_d0_fifo(pipe, (uint16_t)count); + + if (g_usb1_function_data_count[pipe] < (uint32_t)size) + { + g_usb1_function_data_count[pipe] = 0; + if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb1_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_buffer_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_write_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] <= (uint32_t)size) + { + status = DEVDRV_USBF_WRITEEND; /* write continues */ + count = g_usb1_function_data_count[pipe]; + + if (count == 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */ + } + + if ((count % mxps) != 0) + { + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + } + else + { + status = DEVDRV_USBF_WRITING; /* write continues */ + count = (uint32_t)size; + } + + usb1_function_write_d1_fifo(pipe, (uint16_t)count); + + if (g_usb1_function_data_count[pipe] < (uint32_t)size) + { + g_usb1_function_data_count[pipe] = 0; + + if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */ + } + } + else + { + g_usb1_function_data_count[pipe] -= count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D0FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb1_function_write_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb1_function_data_count[pipe]; + + if (count != 0) + { + g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; + + if ((count % size) != 0) + { + g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 1; + } + else + { + g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; + } + + dfacc = usb1_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb1_function_data_count[pipe] = 0; + g_usb1_function_data_pointer[pipe] += count; + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB201.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB201.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_write_dma_d1 +* Description : Writes data in the buffer allocated in the pipe specified in the argument. +* : Writes data by DMA transfer using D1FIFO. +* : The DMA-ch for using is specified by Userdef_USB_usb1_function_start_dma(). +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : DEVDRV_USBF_WRITEEND : Write end +* : DEVDRV_USBF_WRITESHRT : short data +* : DEVDRV_USBF_WRITING : Continue of data write +* : DEVDRV_USBF_WRITEDMA : Write DMA +* : DEVDRV_USBF_FIFOERROR : FIFO status +*******************************************************************************/ +static uint16_t usb1_function_write_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint16_t size; + uint16_t buffer; + uint16_t status; + uint16_t mbw; + uint16_t dfacc=0; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + count = g_usb1_function_data_count[pipe]; + + if (count != 0) + { + g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; + if ((count % size) != 0) + { + g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 1; + } + else + { + g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; + } + + dfacc = usb1_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_BUF2FIFO; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); + + g_usb1_function_data_count[pipe] = 0; + g_usb1_function_data_pointer[pipe] += count; + + status = DEVDRV_USBF_WRITEDMA; /* DMA write */ + } + else + { + if (RZA_IO_RegRead_16(&USB201.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0) + { + RZA_IO_RegWrite_16(&USB201.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */ + } + status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */ + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb1_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t usefifo; + + usb1_function_clear_bemp_sts(pipe); + usb1_function_clear_brdy_sts(pipe); + usb1_function_clear_nrdy_sts(pipe); + + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb1_function_start_receive_trns_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_USE: + usb1_function_start_receive_trns_d1(pipe, size, data); + break; + + case USB_FUNCTION_D0FIFO_DMA: + usb1_function_start_receive_dma_d0(pipe, size, data); + break; + + case USB_FUNCTION_D1FIFO_DMA: + usb1_function_start_receive_dma_d1(pipe, size, data); + break; + + default: + usb1_function_start_receive_trns_c(pipe, size, data); + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_trns_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* : When storing data in the buffer allocated in the pipe specified in the +* : argument, BRDY interrupt is generated to read data +* : in the interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = size; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_trns_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data in the +* : interrupt. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = size; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_trns_d1 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using D1FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, BRDY interrupt is generated to read data. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = size; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_dma_d0 +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb1_function_read_dma(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + else + { + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_start_receive_dma_d1 +* Description : Read data from the buffer allocated in the pipe specified in the argument. +* : Reads data by DMA transfer using D0FIFO. +* : This function does not read data from the buffer. +* : When storing data in the buffer allocated in the pipe specified +* : in the argument, delivered read request to DMAC to read data from +* : the buffer by DMAC. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +static void usb1_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(pipe); + g_usb1_function_data_count[pipe] = size; + g_usb1_function_data_pointer[pipe] = (uint8_t *)data; + g_usb1_function_PipeIgnore[pipe] = 0; + + g_usb1_function_PipeDataSize[pipe] = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT; + + mbw = usb1_function_get_mbw(size, (uint32_t)data); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + usb1_function_set_transaction_counter(pipe, size); + + usb1_function_aclrm(pipe); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + usb1_function_read_dma(pipe); + + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + else + { + usb1_function_enable_nrdy_int(pipe); + usb1_function_enable_brdy_int(pipe); + } + + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Uses FIF0 set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer (uint16_t pipe) +{ + uint16_t status; + + g_usb1_function_PipeIgnore[pipe] = 0; + + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + status = usb1_function_read_buffer_d0(pipe); + } + else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + status = usb1_function_read_buffer_d1(pipe); + } + else + { + status = usb1_function_read_buffer_c(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb1_function_disable_brdy_int(pipe); + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer_c +* Description : Reads data from the buffer allocated in the pipe specified in the argument. +* : Reads data by CPU transfer using CFIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer_c (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + } + + if (count == 0) /* 0 length packet */ + { + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb1_function_read_c_fifo(pipe, (uint16_t)count); + } + + g_usb1_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer_d0 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by CPU transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb1_function_read_d0_fifo(pipe, (uint16_t)count); + } + + g_usb1_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_buffer_d1 +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by CPU transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_buffer_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t pipebuf_size; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + usb1_function_set_pid_nak(pipe); /* Set NAK */ + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + usb1_function_set_pid_nak(pipe); /* Set NAK */ + } + } + } + + if (count == 0) /* 0 length packet */ + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + } + else + { + usb1_function_read_d1_fifo(pipe, (uint16_t)count); + } + + g_usb1_function_data_count[pipe] -= count; + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_dma +* Description : Reads data from the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO or D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_function_read_dma (uint16_t pipe) +{ + uint16_t status; + + g_usb1_function_PipeIgnore[pipe] = 0; + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + status = usb1_function_read_dma_d0(pipe); + } + else + { + status = usb1_function_read_dma_d1(pipe); + } + + switch (status) + { + case USB_FUNCTION_READING: /* Continue of data read */ + break; + + case USB_FUNCTION_READZERO: /* End of data read */ + usb1_function_disable_brdy_int(pipe); + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + break; + + case USB_FUNCTION_READEND: /* End of data read */ + case USB_FUNCTION_READSHRT: /* End of data read */ + usb1_function_disable_brdy_int(pipe); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + } + break; + + case USB_FUNCTION_READOVER: /* buffer over */ + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + g_usb1_function_PipeDataSize[pipe] -= g_usb1_function_data_count[pipe]; + } + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access status */ + default: + usb1_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR; + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_dma_d0 +* Description : Writes data in the buffer allocated in the pipe specified +* : in the argument. +* : Reads data by DMA transfer using D0FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb1_function_read_dma_d0 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + uint16_t pipebuf_size; + + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb1_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb1_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb1_function_set_dfacc_d0(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; /* not use in read operation */ + g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; /* not use in read operation */ + + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb1_function_data_count[pipe] -= count; + g_usb1_function_data_pointer[pipe] += count; + g_usb1_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_read_dma_d1 +* Description : Reads data from the buffer allocated in the pipe specified in +* : the argument. +* : Reads data by DMA transfer using D1FIFO. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : USB_FUNCTION_READEND ; Read end +* : USB_FUNCTION_READSHRT ; short data +* : USB_FUNCTION_READZERO ; zero data +* : USB_FUNCTION_READING ; Continue of data read +* : USB_FUNCTION_READOVER ; buffer over +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +static uint16_t usb1_function_read_dma_d1 (uint16_t pipe) +{ + uint32_t count; + uint32_t dtln; + uint16_t buffer; + uint16_t mxps; + uint16_t status; + uint16_t mbw; + uint16_t dfacc = 0; + uint16_t pipebuf_size; + + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[pipe], (uint32_t)g_usb1_function_data_pointer[pipe]); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + count = g_usb1_function_data_count[pipe]; + status = USB_FUNCTION_READING; + } + else + { + buffer = usb1_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */ + { + return DEVDRV_USBF_FIFOERROR; + } + + dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN); + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if (g_usb1_function_data_count[pipe] < dtln) /* Buffer Over ? */ + { + status = USB_FUNCTION_READOVER; + count = g_usb1_function_data_count[pipe]; + } + else if (g_usb1_function_data_count[pipe] == dtln) /* just Receive Size */ + { + status = USB_FUNCTION_READEND; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + else /* continue Receive data */ + { + status = USB_FUNCTION_READING; + count = dtln; + if (count == 0) + { + status = USB_FUNCTION_READSHRT; /* Null Packet receive */ + } + + if ((count % mxps) != 0) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + else + { + pipebuf_size = usb1_function_get_buf_size(pipe); /* Data buffer size */ + if (count != pipebuf_size) + { + status = USB_FUNCTION_READSHRT; /* Short Packet receive */ + } + } + } + } + + if (count == 0) /* 0 length packet */ + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */ + status = USB_FUNCTION_READZERO; /* Null Packet receive */ + } + else + { + usb1_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw); + /* transaction counter No set */ + /* FRDY = 1, DTLN = 0 -> BRDY */ + } + } + else + { + dfacc = usb1_function_set_dfacc_d1(mbw, count); + + if (mbw == USB_FUNCTION_BITMBW_32) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */ + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */ + } + else + { + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */ + } + + g_usb1_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; /* not use in read operation */ + g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; /* not use in read operation */ + + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_FIFO2BUF; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb1_function_data_pointer[pipe]; + g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count; + + if (status == USB_FUNCTION_READING) + { + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY; + } + else + { + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND; + } + + Userdef_USB_usb1_function_start_dma(&g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc); + + usb1_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc); + + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, + 1, + USB_DnFIFOSEL_DREQE_SHIFT, + USB_DnFIFOSEL_DREQE); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + g_usb1_function_data_count[pipe] -= count; + g_usb1_function_data_pointer[pipe] += count; + g_usb1_function_PipeDataSize[pipe] += count; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_function_change_fifo_port +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. After allocating FIF0, waits in the software +* : till the corresponding pipe becomes ready. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : DEVDRV_USBF_FIFOERROR ; Error +* : Others ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value +*******************************************************************************/ +uint16_t usb1_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + usb1_function_set_curpipe(pipe, fifosel, isel, mbw); + + for (loop = 0; loop < 4; loop++) + { + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB201.CFIFOCTR; + break; + + case USB_FUNCTION_D0USE: + case USB_FUNCTION_D0DMA: + buffer = USB201.D0FIFOCTR; + break; + + case USB_FUNCTION_D1USE: + case USB_FUNCTION_D1DMA: + buffer = USB201.D1FIFOCTR; + break; + + default: + buffer = 0; + break; + } + + if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY) + { + return buffer; + } + + loop2 = 25; + while (loop2-- > 0) + { + /* wait */ + } + } + + return DEVDRV_USBF_FIFOERROR; +} + +/******************************************************************************* +* Function Name: usb1_function_set_curpipe +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb1_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + uint16_t buffer; + uint32_t loop; + volatile uint32_t loop2; + + g_usb1_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB201.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB201.D0FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB201.D1FIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == + (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_curpipe2 +* Description : Allocates FIF0 specified by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* : uint16_t dfacc ; DFACC Access mode +* Return Value : none +*******************************************************************************/ +void usb1_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc) +{ + uint16_t buffer; + uint32_t loop; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + uint32_t dummy; +#endif + volatile uint32_t loop2; + + g_usb1_function_mbw[pipe] = mbw; + + switch (fifosel) + { + case USB_FUNCTION_CUSE: + buffer = USB201.CFIFOSEL; + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE); + buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + while (loop2-- > 0) + { + /* wait */ + } + } + buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(isel | pipe | mbw); + USB201.CFIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) == + (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE))) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D0DMA: + case USB_FUNCTION_D0USE: + buffer = USB201.D0FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB201.D0FIFO.UINT32; + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D0FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + case USB_FUNCTION_D1DMA: + case USB_FUNCTION_D1USE: + buffer = USB201.D1FIFOSEL; +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + + if (dfacc != 0) + { + buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32); + } +#else + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE); +#endif + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } +#ifdef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dfacc != 0) + { + dummy = USB201.D1FIFO.UINT32; + loop = dummy; // avoid warning. + } +#endif + buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW); + buffer |= (uint16_t)(pipe | mbw); + USB201.D1FIFOSEL = buffer; + + for (loop = 0; loop < 4; loop++) + { + if ((USB201.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE)) + { + break; + } + + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } + } + break; + + default: + break; + } + + /* Cautions !!! + * Depending on the external bus speed of CPU, you may need to wait for 450ns here. + * For details, please look at the data sheet. */ + loop2 = 100; + + while (loop2-- > 0) + { + /* wait */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_write_c_fifo +* Description : Writes data in CFIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_write_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB201.CFIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB201.CFIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB201.CFIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_read_c_fifo +* Description : Reads data from CFIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_read_c_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb1_function_data_pointer[pipe] = USB201.CFIFO.UINT8[HH]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT16[H]; + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.CFIFO.UINT32; + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_write_d0_fifo +* Description : Writes data in D0FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating CFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_write_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB201.D0FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB201.D0FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB201.D0FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_read_d0_fifo +* Description : Reads data from D0FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating DOFIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_read_d0_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb1_function_data_pointer[pipe] = USB201.D0FIFO.UINT8[HH]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT16[H]; + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D0FIFO.UINT32; + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_write_d1_fifo +* Description : Writes data in D1FIFO. +* : Writes data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_write_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + USB201.D1FIFO.UINT8[HH] = *g_usb1_function_data_pointer[pipe]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)(count / 2); even; --even) + { + USB201.D1FIFO.UINT16[H] = *((uint16_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)(count / 4); even; --even) + { + USB201.D1FIFO.UINT32 = *((uint32_t *)g_usb1_function_data_pointer[pipe]); + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_read_d1_fifo +* Description : Reads data from D1FIFO. +* : Reads data by BYTE/WORD/LONG according to access size +* : to the pipe specified by the arguments. +* : Before executing this function, allocating D1FIF0 in the specified pipe +* : should be completed. +* : Before executing this function, access size to the specified pipe +* : should be fixed and set in g_usb1_function_mbw[]. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t count ; Data Size(Byte) +* Return Value : none +*******************************************************************************/ +static void usb1_function_read_d1_fifo (uint16_t pipe, uint16_t count) +{ + uint16_t even; + + if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_8) + { + for (even = count; even; --even) + { + *g_usb1_function_data_pointer[pipe] = USB201.D1FIFO.UINT8[HH]; + g_usb1_function_data_pointer[pipe] += 1; + } + } + else if (g_usb1_function_mbw[pipe] == USB_FUNCTION_BITMBW_16) + { + for (even = (uint16_t)((count + 1) / 2); even; --even) + { + *((uint16_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT16[H]; + g_usb1_function_data_pointer[pipe] += 2; + } + } + else + { + for (even = (uint16_t)((count + 3) / 4); even; --even) + { + *((uint32_t *)g_usb1_function_data_pointer[pipe]) = USB201.D1FIFO.UINT32; + g_usb1_function_data_pointer[pipe] += 4; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_com_get_dmasize +* Description : Calculates access width of DMA transfer by the argument to +* : return as the Return Value. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : DMA transfer size : 0 8bit +* : : 1 16bit +* : : 2 32bit +*******************************************************************************/ +static uint32_t usb1_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + + if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0)) + { + /* When transfer byte count is odd */ + /* or transfer data area is 8-bit alignment */ + size = 0; /* 8bit */ + } + else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0)) + { + /* When the transfer byte count is multiples of 2 */ + /* or the transfer data area is 16-bit alignment */ + size = 1; /* 16bit */ + } + else + { + /* When the transfer byte count is multiples of 4 */ + /* or the transfer data area is 32-bit alignment */ + size = 2; /* 32bit */ + } + + return size; +} + +/******************************************************************************* +* Function Name: usb1_function_get_mbw +* Description : Calculates access width of DMA to return the value set in MBW. +* Arguments : uint32_t trncount : transfer byte +* : uint32_t dtptr : transfer data pointer +* Return Value : FIFO transfer size : USB_FUNCTION_BITMBW_8 8bit +* : : USB_FUNCTION_BITMBW_16 16bit +* : : USB_FUNCTION_BITMBW_32 32bit +*******************************************************************************/ +uint16_t usb1_function_get_mbw (uint32_t trncount, uint32_t dtptr) +{ + uint32_t size; + uint16_t mbw; + + size = usb1_function_com_get_dmasize(trncount, dtptr); + + if (size == 0) + { + /* 8bit */ + mbw = USB_FUNCTION_BITMBW_8; + } + else if (size == 1) + { + /* 16bit */ + mbw = USB_FUNCTION_BITMBW_16; + } + else + { + /* 32bit */ + mbw = USB_FUNCTION_BITMBW_32; + } + + return mbw; +} + +/******************************************************************************* +* Function Name: usb1_function_set_transaction_counter +* Description : Sets transaction counter by the argument(PIPEnTRN). +* : Clears transaction before setting to enable transaction counter setting. +* Arguments : uint16_t pipe ; Pipe number +* : uint32_t bsize : Data transfer size +* Return Value : none +*******************************************************************************/ +static void usb1_function_set_transaction_counter (uint16_t pipe, uint32_t bsize) +{ + uint16_t mxps; + uint16_t cnt; + + if (bsize == 0) + { + return; + } + + mxps = usb1_function_get_mxps(pipe); /* Max Packet Size */ + + if ((bsize % mxps) == 0) + { + cnt = (uint16_t)(bsize / mxps); + } + else + { + cnt = (uint16_t)((bsize / mxps) + 1); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE1TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE2TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE3TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE4TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE5TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPE9TRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEATRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEBTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPECTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEDTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEETRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + USB201.PIPEFTRN = cnt; + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 1, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_clear_transaction_counter +* Description : Clears the transaction counter by the argument. +* : After executing this function, the transaction counter is invalid. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_transaction_counter (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE1TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE2TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE3TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE4TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE5TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPE9TRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEATRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEBTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPECTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEDTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEETRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 0, + USB_PIPEnTRE_TRENB_SHIFT, + USB_PIPEnTRE_TRENB); + RZA_IO_RegWrite_16(&USB201.PIPEFTRE, + 1, + USB_PIPEnTRE_TRCLR_SHIFT, + USB_PIPEnTRE_TRCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_stop_transfer +* Description : Stops the USB transfer in the pipe specified by the argument. +* : After stopping the USB transfer, clears the buffer allocated in +* : the pipe. +* : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0; +* : invalid. After executing this function, BRDY/NRDY/BEMP interrupt +* : in the corresponding pipe becomes invalid. Sequence bit is also +* : cleared. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_stop_transfer (uint16_t pipe) +{ + uint16_t usefifo; + uint32_t remain; + uint16_t fifo; + + usb1_function_set_pid_nak(pipe); + + usefifo = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + switch (usefifo) + { + case USB_FUNCTION_D0FIFO_USE: + usb1_function_clear_transaction_counter(pipe); + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0USE; + break; + + case USB_FUNCTION_D1FIFO_USE: + usb1_function_clear_transaction_counter(pipe); + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1USE; + break; + + case USB_FUNCTION_D0FIFO_DMA: + remain = Userdef_USB_usb1_function_stop_dma0(); + usb1_function_dma_stop_d0(pipe, remain); + usb1_function_clear_transaction_counter(pipe); + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D0DMA; + break; + + case USB_FUNCTION_D1FIFO_DMA: + remain = Userdef_USB_usb1_function_stop_dma1(); + usb1_function_dma_stop_d1(pipe, remain); + usb1_function_clear_transaction_counter(pipe); + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_D1DMA; + break; + + default: + usb1_function_clear_transaction_counter(pipe); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */ + fifo = USB_FUNCTION_CUSE; + break; + } + + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16); + + /* Interrupt of pipe set is disabled */ + usb1_function_disable_brdy_int(pipe); + usb1_function_disable_nrdy_int(pipe); + usb1_function_disable_bemp_int(pipe); + + usb1_function_aclrm(pipe); + usb1_function_set_csclr(pipe); + + if ( g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT ) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_dfacc_d0 +* Description : Sets the DFACC setting value in D0FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb1_function_set_dfacc_d0 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D0FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + return dfacc; +} + +/******************************************************************************* +* Function Name: usb1_function_set_dfacc_d1 +* Description : Set the DFACC setting value in D1FIFO using the transfer size. +* Arguments : uint16_t mbw ; MBW +* : uint16_t count ; data count +* Return Value : DFACC Access mode +*******************************************************************************/ +static uint16_t usb1_function_set_dfacc_d1 (uint16_t mbw, uint32_t count) +{ + uint16_t dfacc = 0; + +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; +#else + if (mbw == USB_FUNCTION_BITMBW_32) + { + if ((count % 32) == 0) + { + /* 32byte transfer */ + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 2, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 2; + } + else if ((count % 16) == 0) + { + /* 16byte transfer */ + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 1, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 1; + } + else + { + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + } + else if (mbw == USB_FUNCTION_BITMBW_16) + { + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } + else + { + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_DFACC_SHIFT, + USB_DnFBCFG_DFACC); + RZA_IO_RegWrite_16(&USB201.D1FBCFG, + 0, + USB_DnFBCFG_TENDE_SHIFT, + USB_DnFBCFG_TENDE); + dfacc = 0; + } +#endif + + return dfacc; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_dma.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,346 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dma.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +static void usb1_function_dmaint(uint16_t fifo); +static void usb1_function_dmaint_buf2fifo(uint16_t pipe); +static void usb1_function_dmaint_fifo2buf(uint16_t pipe); + + +/******************************************************************************* +* Function Name: usb1_function_dma_stop_d0 +* Description : D0FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_stop_d0 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB201.D0FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb1_function_DmaInfo[USB_FUNCTION_D0FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB201.D0FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain); + g_usb1_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb1_function_dma_stop_d1 +* Description : D1FIFO DMA stop +* Arguments : uint16_t pipe : pipe number +* : uint32_t remain : transfer byte +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_stop_d1 (uint16_t pipe, uint32_t remain) +{ + uint16_t dtln; + uint16_t dfacc; + uint16_t buffer; + uint16_t sds_b = 1; + + dfacc = RZA_IO_RegRead_16(&USB201.D1FBCFG, USB_DnFBCFG_DFACC_SHIFT, USB_DnFBCFG_DFACC); + + if (dfacc == 2) + { + sds_b = 32; + } + else if (dfacc == 1) + { + sds_b = 16; + } + else + { + if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 2) + { + sds_b = 4; + } + else if (g_usb1_function_DmaInfo[USB_FUNCTION_D1FIFO].size == 1) + { + sds_b = 2; + } + else + { + sds_b = 1; + } + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1) + { + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + buffer = USB201.D1FIFOCTR; + dtln = (buffer & USB_FUNCTION_BITDTLN); + + if ((dtln % sds_b) != 0) + { + remain += (sds_b - (dtln % sds_b)); + } + g_usb1_function_PipeDataSize[pipe] = (g_usb1_function_data_count[pipe] - remain); + g_usb1_function_data_count[pipe] = remain; + } + } + + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, 0, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE); +} + +/******************************************************************************* +* Function Name: usb1_function_dma_interrupt_d0fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb1_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D0FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_interrupt_d0fifo (uint32_t int_sense) +{ + usb1_function_dmaint(USB_FUNCTION_D0FIFO); + g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb1_function_dma_interrupt_d1fifo +* Description : This function is DMA interrupt handler entry. +* : Execute usb1_function_dmaint() after disabling DMA interrupt in this function. +* : Disable DMA interrupt to DMAC executed when USB_FUNCTION_D1FIFO_DMA is +* : specified by dma->fifo. +* : Register this function as DMA complete interrupt. +* Arguments : uint32_t int_sense ; Interrupts detection mode +* : ; INTC_LEVEL_SENSITIVE : Level sense +* : ; INTC_EDGE_TRIGGER : Edge trigger +* Return Value : none +*******************************************************************************/ +void usb1_function_dma_interrupt_d1fifo (uint32_t int_sense) +{ + usb1_function_dmaint(USB_FUNCTION_D1FIFO); + g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY; +} + +/******************************************************************************* +* Function Name: usb1_function_dmaint +* Description : This function is DMA transfer end interrupt +* Arguments : uint16_t fifo ; fifo number +* : ; USB_FUNCTION_D0FIFO +* : ; USB_FUNCTION_D1FIFO +* Return Value : none +*******************************************************************************/ +static void usb1_function_dmaint (uint16_t fifo) +{ + uint16_t pipe; + + pipe = g_usb1_function_DmaPipe[fifo]; + + if (g_usb1_function_DmaInfo[fifo].dir == USB_FUNCTION_BUF2FIFO) + { + usb1_function_dmaint_buf2fifo(pipe); + } + else + { + usb1_function_dmaint_fifo2buf(pipe); + } +} + +/******************************************************************************* +* Function Name: usb1_function_dmaint_fifo2buf +* Description : Executes read completion from FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb1_function_dmaint_fifo2buf (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_DONE) + { + useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb1_function_stop_dma0(); + usb1_function_dma_stop_d0(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb1_function_enable_brdy_int(pipe); + } + } + } + else + { + remain = Userdef_USB_usb1_function_stop_dma1(); + usb1_function_dma_stop_d1(pipe, remain); + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] == USB_FUNCTION_DMA_BUSYEND) + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + else + { + usb1_function_enable_brdy_int(pipe); + } + } + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_dmaint_buf2fifo +* Description : Executes write completion in FIFO by DMAC. +* Arguments : uint16_t pipe : pipe number +* Return Value : none +*******************************************************************************/ +static void usb1_function_dmaint_buf2fifo (uint16_t pipe) +{ + uint32_t remain; + uint16_t useport; + + useport = (uint16_t)(g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + + if (useport == USB_FUNCTION_D0FIFO_DMA) + { + remain = Userdef_USB_usb1_function_stop_dma0(); + usb1_function_dma_stop_d0(pipe, remain); + + if (g_usb1_function_DmaBval[USB_FUNCTION_D0FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB201.D0FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + else + { + remain = Userdef_USB_usb1_function_stop_dma1(); + usb1_function_dma_stop_d1(pipe, remain); + + if (g_usb1_function_DmaBval[USB_FUNCTION_D1FIFO] != 0) + { + RZA_IO_RegWrite_16(&USB201.D1FIFOCTR, + 1, + USB_DnFIFOCTR_BVAL_SHIFT, + USB_DnFIFOCTR_BVAL); + } + } + + usb1_function_enable_bemp_int(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_intrn.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,249 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_intrn.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_brdy_int +* Description : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9). +* : According to the pipe that interrupt is generated in, +* : reads/writes buffer allocated in the pipe. +* : This function is executed in the BRDY interrupt handler. +* : This function clears BRDY interrupt status and BEMP interrupt +* : status. +* Arguments : uint16_t Status ; BRDYSTS Register Value +* : uint16_t Int_enbl ; BRDYENB Register Value +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_brdy_int (uint16_t status, uint16_t int_enb) +{ + uint32_t int_sense = 0; + uint16_t pipe; + uint16_t pipebit; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + pipebit = g_usb1_function_bit_set[pipe]; + + if ((status & pipebit) && (int_enb & pipebit)) + { + USB201.BRDYSTS = (uint16_t)~pipebit; + USB201.BEMPSTS = (uint16_t)~pipebit; + if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) + { + usb1_function_dma_interrupt_d0fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb1_function_read_dma(pipe); + usb1_function_disable_brdy_int(pipe); + } + else + { + USB201.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else if ((g_usb1_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA) + { + if (g_usb1_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) + { + usb1_function_dma_interrupt_d1fifo(int_sense); + } + + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) + { + usb1_function_read_dma(pipe); + usb1_function_disable_brdy_int(pipe); + } + else + { + USB201.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + else + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) + { + usb1_function_read_buffer(pipe); + } + else + { + usb1_function_write_buffer(pipe); + } + } + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_nrdy_int +* Description : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9). +* : Checks NRDY interrupt cause by PID. When the cause if STALL, +* : regards the pipe state as STALL and ends the processing. +* : Then the cause is not STALL, increments the error count to +* : communicate again. When the error count is 3, determines +* : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing. +* : This function is executed in the NRDY interrupt handler. +* : This function clears NRDY interrupt status. +* Arguments : uint16_t status ; NRDYSTS Register Value +* : uint16_t int_enb ; NRDYENB Register Value +* Return Value : none +*******************************************************************************/ +void usb1_function_nrdy_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + + bitcheck = (uint16_t)(status & int_enb); + + USB201.NRDYSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe]) + { + if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1) + { + if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT) + { + pid = usb1_function_get_pid(pipe); + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + g_usb1_function_PipeIgnore[pipe]++; + if (g_usb1_function_PipeIgnore[pipe] == 3) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES; + } + else + { + usb1_function_set_pid_buf(pipe); + } + } + } + } + else + { + /* USB Function */ + } + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_bemp_int +* Description : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9). +* Arguments : uint16_t status ; BEMPSTS Register Value +* : uint16_t int_enb ; BEMPENB Register Value +* Return Value : none +*******************************************************************************/ +void usb1_function_bemp_int (uint16_t status, uint16_t int_enb) +{ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + uint16_t inbuf; + + bitcheck = (uint16_t)(status & int_enb); + + USB201.BEMPSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((bitcheck&g_usb1_function_bit_set[pipe]) == g_usb1_function_bit_set[pipe]) + { + pid = usb1_function_get_pid(pipe); + + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } + else + { + inbuf = usb1_function_get_inbuf(pipe); + + if (inbuf == 0) + { + usb1_function_disable_bemp_int(pipe); + usb1_function_set_pid_nak(pipe); + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + } + } + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/common/usb1_function_lib.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,2044 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_lib.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_enable_brdy_int +* Description : Enables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_enable_brdy_int (uint16_t pipe) +{ + /* enable brdy interrupt */ + USB201.BRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_function_disable_brdy_int +* Description : Disables BRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BRDY. Enables BRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling BRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_disable_brdy_int (uint16_t pipe) +{ + /* disable brdy interrupt */ + USB201.BRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_brdy_sts (uint16_t pipe) +{ + /* clear brdy status */ + USB201.BRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_enable_bemp_int +* Description : Enables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_enable_bemp_int (uint16_t pipe) +{ + /* enable bemp interrupt */ + USB201.BEMPENB |= (uint16_t)g_usb1_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_function_disable_bemp_int +* Description : Disables BEMP interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : BEMP. Enables BEMP interrupt in the pipe specified by the argument +* : in the disabled status. After enabling BEMP, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_disable_bemp_int (uint16_t pipe) +{ + /* disable bemp interrupt */ + USB201.BEMPENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_bemp_sts (uint16_t pipe) +{ + /* clear bemp status */ + USB201.BEMPSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_enable_nrdy_int +* Description : Enables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before enabling +* : NRDY. Enables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After enabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_enable_nrdy_int (uint16_t pipe) +{ + /* enable nrdy interrupt */ + USB201.NRDYENB |= (uint16_t)g_usb1_function_bit_set[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_function_disable_nrdy_int +* Description : Disables NRDY interrupt in the pipe spceified by the argument. +* : Disables BEMP/NRDY/BRDY interrupts in all pipes before disabling +* : NRDY. Disables NRDY interrupt in the pipe specified by the argument +* : in the disabled status. After disabling NRDY, recover all +* : BEMP/NRDY/BRDY disabled/enabled status. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_disable_nrdy_int (uint16_t pipe) +{ + /* disable nrdy interrupt */ + USB201.NRDYENB &= (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_nrdy_sts (uint16_t pipe) +{ + /* clear nrdy status */ + USB201.NRDYSTS = (uint16_t)~(g_usb1_function_bit_set[pipe]); +} + +/******************************************************************************* +* Function Name: usb1_function_is_hispeed +* Description : Returns the result of USB reset hand shake (RHST) as +* : return value. +* Arguments : none +* Return Value : USB_FUNCTION_HIGH_SPEED ; Hi-Speed +* : USB_FUNCTION_FULL_SPEED ; Full-Speed +* : LOW_SPEED ; Low-Speed +* : USB_FUNCTION_NON_SPEED ; error +*******************************************************************************/ +uint16_t usb1_function_is_hispeed (void) +{ + uint16_t rhst; + uint16_t speed; + + rhst = RZA_IO_RegRead_16(&USB201.DVSTCTR0, USB_DVSTCTR0_RHST_SHIFT, USB_DVSTCTR0_RHST); + + if (rhst == USB_FUNCTION_HSMODE) + { + speed = USB_FUNCTION_HIGH_SPEED; + } + else if (rhst == USB_FUNCTION_FSMODE) + { + speed = USB_FUNCTION_FULL_SPEED; + } + else if (rhst == USB_FUNCTION_LSMODE) + { + speed = USB_FUNCTION_LOW_SPEED; + } + else + { + speed = USB_FUNCTION_NON_SPEED; + } + + return speed; +} + +/******************************************************************************* +* Function Name: usb1_function_is_hispeed_enable +* Description : Returns the USB High-Speed connection enabled status as +* : return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Hi-Speed Enable +* : DEVDRV_USBF_NO : Hi-Speed Disable +*******************************************************************************/ +uint16_t usb1_function_is_hispeed_enable (void) +{ + uint16_t ret; + + ret = DEVDRV_USBF_NO; + + if (RZA_IO_RegRead_16(&USB201.SYSCFG0, USB_SYSCFG_HSE_SHIFT, USB_SYSCFG_HSE) == 1) + { + ret = DEVDRV_USBF_YES; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb1_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_pid_buf (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb1_function_set_pid_nak(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_BUF, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_BUF, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_pid_nak (uint16_t pipe) +{ + uint16_t pid; + uint16_t pbusy; + uint32_t loop; + + pid = usb1_function_get_pid(pipe); + + if (pid == DEVDRV_USBF_PID_STALL2) + { + usb1_function_set_pid_stall(pipe); + } + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_NAK, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_NAK, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + + if (pid == DEVDRV_USBF_PID_BUF) + { + for (loop = 0; loop < 200; loop++) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pbusy = RZA_IO_RegRead_16(&USB201.DCPCTR, + USB_DCPCTR_PBUSY_SHIFT, + USB_DCPCTR_PBUSY); + break; + + case USB_FUNCTION_PIPE1: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE2: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE3: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE4: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE5: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_PBUSY_SHIFT, + USB_PIPEnCTR_1_5_PBUSY); + break; + + case USB_FUNCTION_PIPE6: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE6CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE7: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE7CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE8: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE8CTR, + USB_PIPEnCTR_6_8_PBUSY_SHIFT, + USB_PIPEnCTR_6_8_PBUSY); + break; + + case USB_FUNCTION_PIPE9: + pbusy = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_PBUSY_SHIFT, + USB_PIPEnCTR_9_PBUSY); + break; + + case USB_FUNCTION_PIPEA: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEB: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEC: + pbusy = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPED: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEE: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + case USB_FUNCTION_PIPEF: + pbusy = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_PBUSY_SHIFT, + USB_PIPEnCTR_A_F_PBUSY); + break; + + default: + pbusy = 1; + break; + } + + if (pbusy == 0) + { + break; + } + Userdef_USB_usb1_function_delay_500ns(); + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_pid_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + if (pid == DEVDRV_USBF_PID_BUF) + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_STALL2, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_STALL2, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } + else + { + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + DEVDRV_USBF_PID_STALL, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + DEVDRV_USBF_PID_STALL, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + break; + } + } +} + +/******************************************************************************* +* Function Name: usb1_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_pid_stall (uint16_t pipe) +{ + usb1_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb1_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + pid = RZA_IO_RegRead_16(&USB201.DCPCTR, + USB_DCPCTR_PID_SHIFT, + USB_DCPCTR_PID); + break; + + case USB_FUNCTION_PIPE1: + pid = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE2: + pid = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE3: + pid = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE4: + pid = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE5: + pid = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_PID_SHIFT, + USB_PIPEnCTR_1_5_PID); + break; + + case USB_FUNCTION_PIPE6: + pid = RZA_IO_RegRead_16(&USB201.PIPE6CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE7: + pid = RZA_IO_RegRead_16(&USB201.PIPE7CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE8: + pid = RZA_IO_RegRead_16(&USB201.PIPE8CTR, + USB_PIPEnCTR_6_8_PID_SHIFT, + USB_PIPEnCTR_6_8_PID); + break; + + case USB_FUNCTION_PIPE9: + pid = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_PID_SHIFT, + USB_PIPEnCTR_9_PID); + break; + + case USB_FUNCTION_PIPEA: + pid = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEB: + pid = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEC: + pid = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPED: + pid = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEE: + pid = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + case USB_FUNCTION_PIPEF: + pid = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_PID_SHIFT, + USB_PIPEnCTR_A_F_PID); + break; + + default: + pid = 0; + break; + } + + return pid; +} + +/******************************************************************************* +* Function Name: usb1_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_csclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + 1, + USB_DCPCTR_CSCLR_SHIFT, + USB_DCPCTR_CSCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_CSCLR_SHIFT, + USB_PIPEnCTR_1_5_CSCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_CSCLR_SHIFT, + USB_PIPEnCTR_6_8_CSCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_CSCLR_SHIFT, + USB_PIPEnCTR_9_CSCLR); + break; + + default: + /* PIPEA-F have not CSCLR */ + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_sqclr (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + 1, + USB_DCPCTR_SQCLR_SHIFT, + USB_DCPCTR_SQCLR); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQCLR_SHIFT, + USB_PIPEnCTR_1_5_SQCLR); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQCLR_SHIFT, + USB_PIPEnCTR_6_8_SQCLR); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQCLR_SHIFT, + USB_PIPEnCTR_9_SQCLR); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQCLR_SHIFT, + USB_PIPEnCTR_A_F_SQCLR); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_function_set_sqset (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + RZA_IO_RegWrite_16(&USB201.DCPCTR, + 1, + USB_DCPCTR_SQSET_SHIFT, + USB_DCPCTR_SQSET); + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_SQSET_SHIFT, + USB_PIPEnCTR_1_5_SQSET); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_SQSET_SHIFT, + USB_PIPEnCTR_6_8_SQSET); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_SQSET_SHIFT, + USB_PIPEnCTR_9_SQSET); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_SQSET_SHIFT, + USB_PIPEnCTR_A_F_SQSET); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_get_sqmon +* Description : Toggle bit of specified pipe is obtained +* Arguments : uint16_t pipe ; Pipe number +* Return Value : sqmon +*******************************************************************************/ +uint16_t usb1_function_get_sqmon (uint16_t pipe) +{ + uint16_t sqmon; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + sqmon = RZA_IO_RegRead_16(&USB201.DCPCTR, + USB_DCPCTR_SQMON_SHIFT, + USB_DCPCTR_SQMON); + break; + + case USB_FUNCTION_PIPE1: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE2: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE3: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE4: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE5: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_SQMON_SHIFT, + USB_PIPEnCTR_1_5_SQMON); + break; + + case USB_FUNCTION_PIPE6: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE6CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE7: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE7CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE8: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE8CTR, + USB_PIPEnCTR_6_8_SQMON_SHIFT, + USB_PIPEnCTR_6_8_SQMON); + break; + + case USB_FUNCTION_PIPE9: + sqmon = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_SQMON_SHIFT, + USB_PIPEnCTR_9_SQMON); + break; + + case USB_FUNCTION_PIPEA: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEB: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEC: + sqmon = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPED: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEE: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + case USB_FUNCTION_PIPEF: + sqmon = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_SQMON_SHIFT, + USB_PIPEnCTR_A_F_SQMON); + break; + + default: + sqmon = 0; + break; + } + + return sqmon; +} + +/******************************************************************************* +* Function Name: usb1_function_aclrm +* Description : The buffer of specified pipe is initialized +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb1_function_aclrm (uint16_t pipe) +{ + usb1_function_set_aclrm(pipe); + usb1_function_clr_aclrm(pipe); +} + +/******************************************************************************* +* Function Name: usb1_function_set_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb1_function_set_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 1, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 1, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 1, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 1, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_clr_aclrm +* Description : The auto buffer clear mode of specified pipe is enabled +* Arguments : uint16_t pipe : Pipe +* Return Value : none +*******************************************************************************/ +void usb1_function_clr_aclrm (uint16_t pipe) +{ + switch (pipe) + { + case USB_FUNCTION_PIPE0: + break; + + case USB_FUNCTION_PIPE1: + RZA_IO_RegWrite_16(&USB201.PIPE1CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE2: + RZA_IO_RegWrite_16(&USB201.PIPE2CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE3: + RZA_IO_RegWrite_16(&USB201.PIPE3CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE4: + RZA_IO_RegWrite_16(&USB201.PIPE4CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE5: + RZA_IO_RegWrite_16(&USB201.PIPE5CTR, + 0, + USB_PIPEnCTR_1_5_ACLRM_SHIFT, + USB_PIPEnCTR_1_5_ACLRM); + break; + + case USB_FUNCTION_PIPE6: + RZA_IO_RegWrite_16(&USB201.PIPE6CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE7: + RZA_IO_RegWrite_16(&USB201.PIPE7CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE8: + RZA_IO_RegWrite_16(&USB201.PIPE8CTR, + 0, + USB_PIPEnCTR_6_8_ACLRM_SHIFT, + USB_PIPEnCTR_6_8_ACLRM); + break; + + case USB_FUNCTION_PIPE9: + RZA_IO_RegWrite_16(&USB201.PIPE9CTR, + 0, + USB_PIPEnCTR_9_ACLRM_SHIFT, + USB_PIPEnCTR_9_ACLRM); + break; + + case USB_FUNCTION_PIPEA: + RZA_IO_RegWrite_16(&USB201.PIPEACTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEB: + RZA_IO_RegWrite_16(&USB201.PIPEBCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEC: + RZA_IO_RegWrite_16(&USB201.PIPECCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPED: + RZA_IO_RegWrite_16(&USB201.PIPEDCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEE: + RZA_IO_RegWrite_16(&USB201.PIPEECTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + case USB_FUNCTION_PIPEF: + RZA_IO_RegWrite_16(&USB201.PIPEFCTR, + 0, + USB_PIPEnCTR_A_F_ACLRM_SHIFT, + USB_PIPEnCTR_A_F_ACLRM); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_get_inbuf +* Description : Returns INBUFM of the pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : inbuf +*******************************************************************************/ +uint16_t usb1_function_get_inbuf (uint16_t pipe) +{ + uint16_t inbuf; + + switch (pipe) + { + case USB_FUNCTION_PIPE0: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE1: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE1CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE2: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE2CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE3: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE3CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE4: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE4CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE5: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE5CTR, + USB_PIPEnCTR_1_5_INBUFM_SHIFT, + USB_PIPEnCTR_1_5_INBUFM); + break; + + case USB_FUNCTION_PIPE6: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE7: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE8: + inbuf = 0; + break; + + case USB_FUNCTION_PIPE9: + inbuf = RZA_IO_RegRead_16(&USB201.PIPE9CTR, + USB_PIPEnCTR_9_INBUFM_SHIFT, + USB_PIPEnCTR_9_INBUFM); + break; + + case USB_FUNCTION_PIPEA: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEACTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEB: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEBCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEC: + inbuf = RZA_IO_RegRead_16(&USB201.PIPECCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPED: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEDCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEE: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEECTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + case USB_FUNCTION_PIPEF: + inbuf = RZA_IO_RegRead_16(&USB201.PIPEFCTR, + USB_PIPEnCTR_A_F_INBUFM_SHIFT, + USB_PIPEnCTR_A_F_INBUFM); + break; + + default: + inbuf = 0; + break; + } + + return inbuf; +} + +/******************************************************************************* +* Function Name: usb1_function_setting_interrupt +* Description : Sets the USB module interrupt level. +* Arguments : uint8_t level +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_setting_interrupt (uint8_t level) +{ + uint16_t d0fifo_dmaintid; + uint16_t d1fifo_dmaintid; + + R_INTC_RegistIntFunc(INTC_ID_USBI1, usb1_function_interrupt); + R_INTC_SetPriority(INTC_ID_USBI1, level); + R_INTC_Enable(INTC_ID_USBI1); + + d0fifo_dmaintid = Userdef_USB_usb1_function_d0fifo_dmaintid(); + + if (d0fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d0fifo_dmaintid, usb1_function_dma_interrupt_d0fifo); + R_INTC_SetPriority(d0fifo_dmaintid, level); + R_INTC_Enable(d0fifo_dmaintid); + } + + d1fifo_dmaintid = Userdef_USB_usb1_function_d1fifo_dmaintid(); + + if (d1fifo_dmaintid != 0xFFFF) + { + R_INTC_RegistIntFunc(d1fifo_dmaintid, usb1_function_dma_interrupt_d1fifo); + R_INTC_SetPriority(d1fifo_dmaintid, level); + R_INTC_Enable(d1fifo_dmaintid); + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_reset_module +* Description : Initializes the USB module. +* : Enables providing clock to the USB module. +* : Sets USB bus wait register. +* Arguments : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +void usb1_function_reset_module (uint16_t clockmode) +{ + /* UPLLE bit is only USB0 */ + if (RZA_IO_RegRead_16(&USB200.SYSCFG0, + USB_SYSCFG_UPLLE_SHIFT, + USB_SYSCFG_UPLLE) == 1) + { + if ((USB200.SYSCFG0 & USB_FUNCTION_BITUCKSEL) != clockmode) + { + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB201.SYSCFG0 = 0; + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb1_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + else + { + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + Userdef_USB_usb1_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + } + else + { + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 0, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + USB201.SYSCFG0 = 0; + USB200.SYSCFG0 = 0; + USB200.SYSCFG0 = (USB_FUNCTION_BITUPLLE | clockmode); + Userdef_USB_usb1_function_delay_xms(1); + RZA_IO_RegWrite_16(&USB200.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + RZA_IO_RegWrite_16(&USB201.SUSPMODE, + 1, + USB_SUSPMODE_SUSPM_SHIFT, + USB_SUSPMODE_SUSPM); + } + + USB201.BUSWAIT = (uint16_t)(USB_FUNCTION_BUSWAIT_05 & USB_FUNCTION_BITBWAIT); +} + +/******************************************************************************* +* Function Name: usb1_function_get_buf_size +* Description : Obtains pipe buffer size specified by the argument and +* : maximum packet size of the USB device in use. +* : When USB_FUNCTION_PIPE0 is specified by the argument, obtains the maximum +* : packet size of the USB device using the corresponding pipe. +* : For the case that USB_FUNCTION_PIPE0 is not assigned by the argument, when the +* : corresponding pipe is in continuous transfer mode, +* : obtains the buffer size allocated in the corresponcing pipe, +* : when incontinuous transfer, obtains maximum packet size. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Maximum packet size or buffer size +*******************************************************************************/ +uint16_t usb1_function_get_buf_size (uint16_t pipe) +{ + uint16_t size; + uint16_t bufsize; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB201.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + if (RZA_IO_RegRead_16(&g_usb1_function_pipecfg[pipe], USB_PIPECFG_CNTMD_SHIFT, USB_PIPECFG_CNTMD) == 1) + { + bufsize = RZA_IO_RegRead_16(&g_usb1_function_pipebuf[pipe], USB_PIPEBUF_BUFSIZE_SHIFT, USB_PIPEBUF_BUFSIZE); + size = (uint16_t)((bufsize + 1) * USB_FUNCTION_PIPExBUF); + } + else + { + size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + } + return size; +} + +/******************************************************************************* +* Function Name: usb1_function_get_mxps +* Description : Obtains maximum packet size of the USB device using the pipe +* : specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Max Packet Size +*******************************************************************************/ +uint16_t usb1_function_get_mxps (uint16_t pipe) +{ + uint16_t size; + + if (pipe == USB_FUNCTION_PIPE0) + { + size = RZA_IO_RegRead_16(&USB201.DCPMAXP, + USB_DCPMAXP_MXPS_SHIFT, + USB_DCPMAXP_MXPS); + } + else + { + size = RZA_IO_RegRead_16(&g_usb1_function_pipemaxp[pipe], USB_PIPEMAXP_MXPS_SHIFT, USB_PIPEMAXP_MXPS); + } + return size; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_api.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,441 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_api.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" +#include "dev_drv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_api_function_init +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint8_t int_level ; interruput level +* : uint16_t mode : Speed modes +* : : USB_FUCNTION_HIGH_SPEED: High-speed device +* : : USB_FUCNTION_FULL_SPEED: Full-speed device +* : uint16_t clockmode ; 48MHz ; USBFCLOCK_X1_48MHZ +* : ; 12MHz ; USBFCLOCK_EXTAL_12MHZ +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_api_function_init (uint8_t int_level, uint16_t mode, uint16_t clockmode) +{ + volatile uint8_t dummy_buf; + + CPG.STBCR7 &= 0xfc; /*The clock of USB0/1 modules is permitted */ + dummy_buf = CPG.STBCR7; /* (Dummy read) */ + + usb1_function_setting_interrupt(int_level); + + usb1_function_reset_module(clockmode); /* reset USB module with setting tranciever */ + /* and HSE=1 */ + + usb1_function_init_status(); /* clear variables */ + + usb1_function_InitModule(mode); /* select USB Function and Interrupt Enable */ + /* Detect USB Device to attach or detach */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_api_function_IsConfigured +* Description : Checks if the USB device is configured to return the result as +* : the return value. +* Arguments : none +* Return Value : DEVDRV_USBF_YES : Configured & Configured Suspend +* : DEVDRV_USBF_NO : not Configured +*******************************************************************************/ +uint16_t usb1_api_function_IsConfigured (void) +{ + uint16_t dvst; + + dvst = usb1_function_GetDeviceState(); + + if ((dvst == USB_FUNCTION_DVST_CONFIGURED) || + (dvst == USB_FUNCTION_DVST_CONFIGURED_SUSPEND)) + { + return DEVDRV_USBF_YES; + } + + return DEVDRV_USBF_NO; +} + +/******************************************************************************* +* Function Name: usb1_function_GetDeviceState +* Description : Returns the state of USB device. +* Arguments : none +* Return Value : Device States +*******************************************************************************/ +uint16_t usb1_function_GetDeviceState (void) +{ + uint16_t dvsq; + uint16_t dvst; + + dvsq = USB201.INTSTS0; + switch (dvsq & USB_FUNCTION_BITDVSQ) + { + case USB_FUNCTION_DS_POWR: /* Power state *//* power-on */ + dvst = USB_FUNCTION_DVST_POWERED; + break; + + case USB_FUNCTION_DS_DFLT: /* Default state *//* bus-reset */ + dvst = USB_FUNCTION_DVST_DEFAULT; + break; + + case USB_FUNCTION_DS_ADDS: /* Address state */ + dvst = USB_FUNCTION_DVST_ADDRESS; + break; + + case USB_FUNCTION_DS_CNFG: /* Configured state */ + dvst = USB_FUNCTION_DVST_CONFIGURED; + break; + + case USB_FUNCTION_DS_SPD_CNFG: /* Configured Suspend state */ + dvst = USB_FUNCTION_DVST_CONFIGURED_SUSPEND; + break; + + case USB_FUNCTION_DS_SPD_POWR: /* Power Suspend state */ + case USB_FUNCTION_DS_SPD_DFLT: /* Default Suspend state */ + case USB_FUNCTION_DS_SPD_ADDR: /* Address Suspend state */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + + default: /* error */ + dvst = USB_FUNCTION_DVST_SUSPEND; + break; + } + + return dvst; +} + +/******************************************************************************* +* Function Name: usb1_api_function_start_receive_transfer +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : none +*******************************************************************************/ +void usb1_api_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + usb1_function_start_receive_transfer(pipe, size, data); +} + +/******************************************************************************* +* Function Name: usb1_api_function_start_send_transfer +* Description : Starts the USB data communication using pipe specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t size ; Data Size +* : uint8_t *data ; Data data Address +* Return Value : DEVDRV_USBF_WRITEEND ; Write end +* : DEVDRV_USBF_WRITESHRT ; short data +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_WRITEDMA ; Write DMA +* : DEVDRV_USBF_FIFOERROR ; FIFO status +*******************************************************************************/ +uint16_t usb1_api_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data) +{ + uint16_t status; + + status = usb1_function_start_send_transfer(pipe, size, data); + + return status; +} + +/******************************************************************************* +* Function Name: usb1_api_function_check_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* : uint32_t *size ; Data Size +* Return Value : Pipe Status +*******************************************************************************/ +uint16_t usb1_api_function_check_pipe_status (uint16_t pipe, uint32_t * size) +{ + if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_DONE) + { + *size = g_usb1_function_PipeDataSize[pipe]; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_DONE; + } + else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_NORES) + { + *size = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_NORES; + } + else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_STALL) + { + *size = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_PIPE_STALL; + } + else if (g_usb1_function_pipe_status[pipe] == DEVDRV_USBF_FIFOERROR) + { + *size = 0; + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + + return DEVDRV_USBF_FIFOERROR; + } + else + { + /* Do Nothing */ + } + + return g_usb1_function_pipe_status[pipe]; +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_pipe_status +* Description : Starts USB data reception using the pipe specified in the argument. +* : The FIFO for using is set in the pipe definition table. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : Pipe Status +*******************************************************************************/ +void usb1_api_function_clear_pipe_status (uint16_t pipe) +{ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb1_function_PipeDataSize[pipe] = 0; +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_pid_buf +* Description : Enables communicaqtion in the pipe specified by the argument +* : (BUF). +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_pid_buf (uint16_t pipe) +{ + usb1_function_set_pid_buf(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_pid_nak +* Description : Disables communication (NAK) in the pipe specified by the argument. +* : When the pipe status was enabling communication (BUF) before +* : executing before executing this function, waits in the software +* : until the pipe becomes ready after setting disabled. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_pid_nak (uint16_t pipe) +{ + usb1_function_set_pid_nak(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_pid_stall +* Description : Disables communication (STALL) in the pipe specified by the +* : argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_pid_stall (uint16_t pipe) +{ + usb1_function_set_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_pid_stall +* Description : Disables communication (NAK) in the pipe specified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_pid_stall (uint16_t pipe) +{ + usb1_function_clear_pid_stall(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_get_pid +* Description : Returns the pipe state specified by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +uint16_t usb1_api_function_get_pid (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + + return pid; +} + +/******************************************************************************* +* Function Name: usb1_api_function_check_stall +* Description : +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : PID +*******************************************************************************/ +int32_t usb1_api_function_check_stall (uint16_t pipe) +{ + uint16_t pid; + + pid = usb1_function_get_pid(pipe); + + if ((pid & DEVDRV_USBF_PID_STALL) == DEVDRV_USBF_PID_STALL) + { + return DEVDRV_USBF_STALL; + } + + return DEVDRV_SUCCESS; +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_sqclr +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA0. +* Arguments : uint16_t pipe ; Pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_sqclr (uint16_t pipe) +{ + usb1_function_set_sqclr(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_sqset +* Description : Sets the sequence bit of the pipe specified by the argument to +* : DATA1. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_sqset (uint16_t pipe) +{ + usb1_function_set_sqset(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_csclr +* Description : CSPLIT status clear setting of sprit transaction in specified +* : pipe is performed. +* : When SQSET bit or SQCLR bit, and SQSET bit or SQCLR bit +* : in DCPCTR register are continuously changed (when the sequence +* : toggle bit of data PID is continuously changed over two or more pipes), +* : the access cycle with 120 ns and more than 5 cycle bus clock is necessary. +* : Do not set both SQCLR bit and SQSET bit to 1 at the same time. +* : In addition, both bits should be operated after PID is set to NAK. +* : However, when it is set to the isochronous transfer as the transfer type +* : (TYPE=11), writing in SQSET bit is disabled. +* Arguments : uint16_t pipe ; Pipe number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_csclr (uint16_t pipe) +{ + usb1_function_set_csclr(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_set_curpipe +* Description : Allocates FIF0 specifed by the argument in the pipe assigned +* : by the argument. +* Arguments : uint16_t pipe ; Pipe Number +* : uint16_t fifosel ; Select FIFO +* : uint16_t isel ; FIFO Access Direction +* : uint16_t mbw ; FIFO Port Access Bit Width +* Return Value : none +*******************************************************************************/ +void usb1_api_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw) +{ + usb1_function_set_curpipe(pipe, fifosel, isel, mbw); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_brdy_sts +* Description : Clear BRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_brdy_sts (uint16_t pipe) +{ + usb1_function_clear_brdy_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_bemp_sts +* Description : Clear BEMP interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_bemp_sts (uint16_t pipe) +{ + usb1_function_clear_bemp_sts(pipe); +} + +/******************************************************************************* +* Function Name: usb1_api_function_clear_nrdy_sts +* Description : Clear NRDY interrupt status in the pipe spceified by the argument. +* Arguments : uint16_t pipe ; pipe Number +* Return Value : none +*******************************************************************************/ +void usb1_api_function_clear_nrdy_sts (uint16_t pipe) +{ + usb1_function_clear_nrdy_sts(pipe); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_controlrw.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,142 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_controlrw.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_api_function_CtrlReadStart +* Description : Executes the USB control read transfer. +* : USB host controller <- USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : DEVDRV_USBF_WRITEEND ; End of data write +* : DEVDRV_USBF_WRITESHRT ; End of short data write +* : DEVDRV_USBF_WRITING ; Continue of data write +* : DEVDRV_USBF_FIFOERROR ; FIFO access error +*******************************************************************************/ +uint16_t usb1_api_function_CtrlReadStart (uint32_t size, uint8_t * data) +{ + uint16_t status; + uint16_t mbw; + + usb1_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb1_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; + + status = usb1_function_write_buffer_c(USB_FUNCTION_PIPE0); + + /* Peripheral Control sequence */ + switch (status) + { + case DEVDRV_USBF_WRITESHRT: /* End of data write */ + case DEVDRV_USBF_WRITEEND: /* End of data write (not null) */ + case DEVDRV_USBF_WRITING: /* Continue of data write */ + usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0); /* Enable Empty Interrupt */ + usb1_function_set_pid_buf(USB_FUNCTION_PIPE0); /* Set BUF */ + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access error */ + break; + + default: + break; + } + + return status; /* End or Err or Continue */ +} + +/******************************************************************************* +* Function Name: usb1_api_function_CtrlWriteStart +* Description : Executes the USB control write transfer. +* : USB host controller -> USB device +* Arguments : uint16_t size ; Data Size +* : uint8_t *data ; Data Address +* Return Value : none +*******************************************************************************/ +void usb1_api_function_CtrlWriteStart (uint32_t size, uint8_t * data) +{ + uint16_t mbw; + + usb1_function_set_pid_nak(USB_FUNCTION_PIPE0); + + g_usb1_function_data_count[USB_FUNCTION_PIPE0] = size; + g_usb1_function_data_pointer[USB_FUNCTION_PIPE0] = data; + + mbw = usb1_function_get_mbw(g_usb1_function_data_count[USB_FUNCTION_PIPE0], + (uint32_t)g_usb1_function_data_pointer[USB_FUNCTION_PIPE0]); + usb1_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw); + USB201.CFIFOCTR = USB_FUNCTION_BITBCLR; + + usb1_function_enable_brdy_int(USB_FUNCTION_PIPE0); + usb1_function_set_pid_buf(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_global.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,144 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_global.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +const uint16_t g_usb1_function_bit_set[16] = +{ + 0x0001, 0x0002, 0x0004, 0x0008, + 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, + 0x1000, 0x2000, 0x4000, 0x8000 +}; + +uint32_t g_usb1_function_data_count[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint8_t * g_usb1_function_data_pointer[USB_FUNCTION_MAX_PIPE_NO + 1]; + +uint16_t g_usb1_function_PipeIgnore[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_PipeTbl[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipe_status[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint32_t g_usb1_function_PipeDataSize[USB_FUNCTION_MAX_PIPE_NO + 1]; + +USB_FUNCTION_DMA_t g_usb1_function_DmaInfo[2]; +uint16_t g_usb1_function_DmaPipe[2]; +uint16_t g_usb1_function_DmaBval[2]; +uint16_t g_usb1_function_DmaStatus[2]; + +uint16_t g_usb1_function_CtrZeroLengthFlag; + +//uint16_t g_usb1_function_ConfigNum; +//uint16_t g_usb1_function_Alternate[USB_FUNCTION_ALT_NO]; +//uint16_t g_usb1_function_RemoteWakeupFlag; +uint16_t g_usb1_function_TestModeFlag; +uint16_t g_usb1_function_TestModeSelectors; + +//uint16_t g_usb1_function_ReqType; +//uint16_t g_usb1_function_ReqTypeType; +//uint16_t g_usb1_function_ReqTypeRecip; +//uint16_t g_usb1_function_ReqRequest; +//uint16_t g_usb1_function_ReqValue; +//uint16_t g_usb1_function_ReqIndex; +//uint16_t g_usb1_function_ReqLength; + +//uint16_t g_usb1_function_EPTableIndex[USB_FUNCTION_MAX_EP_NO + 1]; + +uint16_t g_usb1_function_pipecfg[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipebuf[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipemaxp[USB_FUNCTION_MAX_PIPE_NO + 1]; +uint16_t g_usb1_function_pipeperi[USB_FUNCTION_MAX_PIPE_NO + 1]; + + +/******************************************************************************* +* Function Name: usb1_function_init_status +* Description : Initialization USB Sample Driver Variable. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_init_status (void) +{ + uint16_t pipe; + + //g_usb1_function_ConfigNum = 0; + //g_usb1_function_RemoteWakeupFlag = DEVDRV_USBF_OFF; + g_usb1_function_TestModeFlag = DEVDRV_USBF_OFF; + g_usb1_function_CtrZeroLengthFlag = 0; + +#if 0 + usb1_function_clear_alt(); +#endif + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb1_function_PipeDataSize[pipe] = 0; + g_usb1_function_data_count[pipe] = 0; + + /* pipe configuration in usb1_function_ResetEP() */ + g_usb1_function_pipecfg[pipe] = 0; + g_usb1_function_pipebuf[pipe] = 0; + g_usb1_function_pipemaxp[pipe] = 0; + g_usb1_function_pipeperi[pipe] = 0; + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sig.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,330 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_sig.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb1_function_EnableINTModule(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_InitModule +* Description : Initializes the USB module in the USB function mode. +* Arguments : uint16_t mode ; USB_FUNCTION_HIGH_SPEED ; Hi-Speed Mode +* : ; other ; Full-speed Mode +* Return Value : none +*******************************************************************************/ +void usb1_function_InitModule (uint16_t mode) +{ + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); /* USB function */ + + /* USB module operation enabled */ + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + if (mode == USB_FUNCTION_HIGH_SPEED) + { + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); /* Hi-Speed Mode */ + } + else + { + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_HSE_SHIFT, + USB_SYSCFG_HSE); + } + + /* for power-on */ + if (usb1_function_CheckVBUStaus() == DEVDRV_USBF_ON) + { + usb1_function_EnableINTModule(); /* Interrupt Enable */ + usb1_function_USB_FUNCTION_Attach(); /* pull-up D+ and open D- */ + } + else + { + usb1_function_USB_FUNCTION_Detach(); /* USB Detach */ + /* with Interrupt Enable */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_CheckVBUStaus +* Description : Checks the USB-VBUS state to returns the connection state to +* : the USB host. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : VBUS ON +* : DEVDRV_USBF_OFF : VBUS OFF +*******************************************************************************/ +uint16_t usb1_function_CheckVBUStaus (void) +{ + uint16_t buf1; + uint16_t buf2; + uint16_t buf3; + + /* monitor VBUS pins */ + do + { + buf1 = RZA_IO_RegRead_16(&USB201.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb1_function_delay_10us(1); + buf2 = RZA_IO_RegRead_16(&USB201.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + Userdef_USB_usb1_function_delay_10us(1); + buf3 = RZA_IO_RegRead_16(&USB201.INTSTS0, + USB_INTSTS0_VBSTS_SHIFT, + USB_INTSTS0_VBSTS); + } while ((buf1 != buf2) || (buf2 != buf3)); + + if (buf1 == DEVDRV_USBF_OFF) + { + return DEVDRV_USBF_OFF; /* detach */ + } + + return DEVDRV_USBF_ON; /* attach */ +} + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Attach +* Description : Connects to the USB host controller. +* : This function pulls up D+. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_USB_FUNCTION_Attach (void) +{ + Userdef_USB_usb1_function_attach(); + + Userdef_USB_usb1_function_delay_xms(10); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* Pull-up D+ and open D- */ +} + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Detach +* Description : Disconnects from the USB host controller. +* : This function opens D+/D-. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_USB_FUNCTION_Detach (void) +{ + uint16_t pipe; + + Userdef_USB_usb1_function_detach(); + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + if (g_usb1_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_IDLE) + { + usb1_function_stop_transfer(pipe); + } + } + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_DPRPU_SHIFT, + USB_SYSCFG_DPRPU); /* open D+ and D- */ + + /* Detach Recovery */ + Userdef_USB_usb1_function_delay_500ns(); /* need 1us=500ns * 2 wait */ + Userdef_USB_usb1_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + Userdef_USB_usb1_function_delay_500ns(); /* need 100ns wait but 500ns S/W wait */ + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_DCFM_SHIFT, + USB_SYSCFG_DCFM); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 0, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); /* soft reset module */ + Userdef_USB_usb1_function_delay_500ns(); + + RZA_IO_RegWrite_16(&USB201.SYSCFG0, + 1, + USB_SYSCFG_USBE_SHIFT, + USB_SYSCFG_USBE); + + usb1_function_EnableINTModule(); /* Interrupt Enable */ +} + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_BusReset +* Description : This function is executed when the USB device is transitioned +* : to POWERD_STATE. Sets the device descriptor according to the +* : connection speed determined by the USB reset hand shake. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb1_function_USB_FUNCTION_BusReset (void) +{ + usb1_function_init_status(); /* memory clear */ + + if (usb1_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) + { + usb1_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED); /* Device Descriptor reset */ + } + else + { + usb1_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED); /* Device Descriptor reset */ + } + + usb1_function_ResetDCP(); /* Default Control PIPE reset */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Resume +* Description : This function is executed when the USB device detects a resume +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb1_function_USB_FUNCTION_Resume (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_Suspend +* Description : This function is executed when the USB device detects a suspend +* : signal. +* : The USB sample driver does not operate for this function. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 /*The USBHAL in mbed does not need this function*/ +void usb1_function_USB_FUNCTION_Suspend (void) +{ + /* NOP */ +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_USB_FUNCTION_TestMode +* Description : This function is executed when the USB device is transitioned U +* : to TEST_MODE by the USB standard request. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_USB_FUNCTION_TestMode (void) +{ + switch (g_usb1_function_TestModeSelectors & USB_FUNCTION_FUNCTION_TEST_SELECT) + { + case USB_FUNCTION_FUNCTION_TEST_J: + case USB_FUNCTION_FUNCTION_TEST_K: + case USB_FUNCTION_FUNCTION_TEST_SE0_NAK: + case USB_FUNCTION_FUNCTION_TEST_PACKET: + RZA_IO_RegWrite_16(&USB201.TESTMODE, + (g_usb1_function_TestModeSelectors >> 8), + USB_TESTMODE_UTST_SHIFT, + USB_TESTMODE_UTST); + break; + + case USB_FUNCTION_FUNCTION_TEST_FORCE_ENABLE: + default: + break; + } +} + +/******************************************************************************* +* Function Name: usb1_function_EnableINTModule +* Description : Enables USB interrupt. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void usb1_function_EnableINTModule (void) +{ + uint16_t buf; + + buf = USB201.INTENB0; + buf |= (USB_FUNCTION_BITVBSE | USB_FUNCTION_BITDVSE | USB_FUNCTION_BITCTRE | + USB_FUNCTION_BITBEMPE | USB_FUNCTION_BITNRDYE | USB_FUNCTION_BITBRDYE); + USB201.INTENB0 = buf; + + usb1_function_enable_bemp_int(USB_FUNCTION_PIPE0); +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/function/usb1_function_sub.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,453 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_sub.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include "usb1_function.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +#if 0 +extern const uint16_t *g_usb1_function_EndPntPtr[]; +extern uint8_t g_usb1_function_DeviceDescriptor[]; +extern uint8_t *g_usb1_function_ConfigurationPtr[]; +#endif + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: usb1_function_ResetDCP +* Description : Initializes the default control pipe(DCP). +* Outline : Reset default control pipe +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_ResetDCP (void) +{ + USB201.DCPCFG = 0; +#if 0 + USB201.DCPMAXP = g_usb1_function_DeviceDescriptor[7]; +#else + USB201.DCPMAXP = 64; +#endif + + USB201.CFIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB201.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB201.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); +} + +/******************************************************************************* +* Function Name: usb1_function_ResetEP +* Description : Initializes the end point. +* Arguments : uint16_t num ; Configuration Number +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_ResetEP (uint16_t num) +{ + uint16_t pipe; + uint16_t ep; + uint16_t index; + uint16_t buf; + uint16_t * tbl; + + tbl = (uint16_t *)(g_usb1_function_EndPntPtr[num - 1]); + + for (ep = 1; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + if (g_usb1_function_EPTableIndex[ep] != USB_FUNCTION_EP_ERROR) + { + index = (uint16_t)(USB_FUNCTION_EPTABLE_LENGTH * g_usb1_function_EPTableIndex[ep]); + pipe = (uint16_t)(tbl[index + 0] & USB_FUNCTION_BITCURPIPE); + + g_usb1_function_PipeTbl[pipe] = (uint16_t)(((tbl[index + 1] & USB_FUNCTION_DIRFIELD) << 3) | + ep | + (tbl[index + 0] & USB_FUNCTION_FIFO_USE)); + + if ((tbl[index + 1] & USB_FUNCTION_DIRFIELD) == USB_FUNCTION_DIR_P_OUT) + { + tbl[index + 1] |= USB_FUNCTION_SHTNAKON; +#ifdef __USB_DMA_BFRE_ENABLE__ + /* this routine cannnot be perfomred if read operation is executed in buffer size */ + if (((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA) || + ((tbl[index + 0] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_DMA)) + { + tbl[index + 1] |= USB_FUNCTION_BFREON; + } +#endif + } + + /* Interrupt Disable */ + buf = USB201.BRDYENB; + buf &= (uint16_t)~g_usb1_function_bit_set[pipe]; + USB201.BRDYENB = buf; + buf = USB201.NRDYENB; + buf &= (uint16_t)~g_usb1_function_bit_set[pipe]; + USB201.NRDYENB = buf; + buf = USB201.BEMPENB; + buf &= (uint16_t)~g_usb1_function_bit_set[pipe]; + USB201.BEMPENB = buf; + + usb1_function_set_pid_nak(pipe); + + /* CurrentPIPE Clear */ + if (RZA_IO_RegRead_16(&USB201.CFIFOSEL, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB201.CFIFOSEL, + 0, + USB_CFIFOSEL_CURPIPE_SHIFT, + USB_CFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB201.D0FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB201.D0FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB201.D1FIFOSEL, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE) == pipe) + { + RZA_IO_RegWrite_16(&USB201.D1FIFOSEL, + 0, + USB_DnFIFOSEL_CURPIPE_SHIFT, + USB_DnFIFOSEL_CURPIPE); + } + + /* PIPE Configuration */ + USB201.PIPESEL = pipe; + USB201.PIPECFG = tbl[index + 1]; + USB201.PIPEBUF = tbl[index + 2]; + USB201.PIPEMAXP = tbl[index + 3]; + USB201.PIPEPERI = tbl[index + 4]; + + g_usb1_function_pipecfg[pipe] = tbl[index + 1]; + g_usb1_function_pipebuf[pipe] = tbl[index + 2]; + g_usb1_function_pipemaxp[pipe] = tbl[index + 3]; + g_usb1_function_pipeperi[pipe] = tbl[index + 4]; + + /* Buffer Clear */ + usb1_function_set_sqclr(pipe); + usb1_function_aclrm(pipe); + + /* init Global */ + g_usb1_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usb1_function_PipeDataSize[pipe] = 0; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_EpToPipe +* Description : Returns the pipe which end point specified by the argument is +* : allocated to. +* Arguments : uint16_t ep ; Direction + Endpoint Number +* Return Value : USB_FUNCTION_EP_ERROR : Error +* : Others : Pipe Number +*******************************************************************************/ +uint16_t usb1_function_EpToPipe (uint16_t ep) +{ + uint16_t pipe; + + for (pipe = 1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) + { + if ((g_usb1_function_PipeTbl[pipe] & 0x00ff) == ep) + { + return pipe; + } + } + + return USB_FUNCTION_EP_ERROR; +} + +/******************************************************************************* +* Function Name: usb1_function_InitEPTable +* Description : Sets the end point by the Alternate setting value of the +* : configuration number and the interface number specified by the +* : argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* : uint16_t Alt_Num ; Alternate Setting +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_InitEPTable (uint16_t Con_Num, uint16_t Int_Num, uint16_t Alt_Num) +{ + uint8_t * ptr; + uint16_t point_interface; + uint16_t point_endpoint; + uint16_t length; + uint16_t start; + uint16_t numbers; + uint16_t endpoint; + + ptr = (uint8_t *)g_usb1_function_ConfigurationPtr[Con_Num - 1]; + point_interface = *ptr; + length = (uint16_t)((uint16_t)*(ptr + 3) << 8 | (uint16_t)*(ptr + 2)); + ptr += *ptr; + start = 0; + numbers = 0; + point_endpoint = 0; + + for (; point_interface < length;) + { + switch (*(ptr + 1)) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if ((*(ptr + 2) == Int_Num) && (*(ptr + 3) == Alt_Num)) + { + numbers = *(ptr + 4); + } + else + { + start += *(ptr + 4); + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + if (point_endpoint < numbers) + { + endpoint = (uint16_t)(*(ptr + 2) & 0x0f); + g_usb1_function_EPTableIndex[endpoint] = (uint16_t)(start + point_endpoint); + ++point_endpoint; + } + point_interface += *ptr; + ptr += *ptr; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + default: /* Class, Vendor, else */ + point_interface += *ptr; + ptr += *ptr; + break; + } + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_GetConfigNum +* Description : Returns the number of configuration referring to the number of +* : configuration described in the device descriptor. +* Arguments : none +* Return Value : Number of possible configurations (bNumConfigurations). +*******************************************************************************/ +#if 0 +uint16_t usb1_function_GetConfigNum (void) +{ + return (uint16_t)g_usb1_function_DeviceDescriptor[17]; +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_GetInterfaceNum +* Description : Returns the number of interface referring to the number of +* : interface described in the configuration descriptor. +* Arguments : uint16_t num ; Configuration Number +* Return Value : Number of this interface (bNumInterfaces). +*******************************************************************************/ +#if 0 +uint16_t usb1_function_GetInterfaceNum (uint16_t num) +{ + return (uint16_t)(*(g_usb1_function_ConfigurationPtr[num - 1] + 4)); +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_GetAltNum +* Description : Returns the Alternate setting value of the configuration number +* : and the interface number specified by the argument. +* Arguments : uint16_t Con_Num ; Configuration Number +* : uint16_t Int_Num ; Interface Number +* Return Value : Value used to select this alternate setting(bAlternateSetting). +*******************************************************************************/ +#if 0 +uint16_t usb1_function_GetAltNum (uint16_t Con_Num, uint16_t Int_Num) +{ + uint8_t * ptr; + uint16_t point; + uint16_t alt_num = 0; + uint16_t length; + + ptr = (uint8_t *)(g_usb1_function_ConfigurationPtr[Con_Num - 1]); + point = ptr[0]; + ptr += ptr[0]; /* InterfaceDescriptor[0] */ + length = (uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 2)); + length |= (uint16_t)((uint16_t)(*(g_usb1_function_ConfigurationPtr[Con_Num - 1] + 3)) << 8); + + for (; point < length;) /* Search Descriptor Table size */ + { + switch (ptr[1]) /* Descriptor Type ? */ + { + case USB_FUNCTION_DT_INTERFACE: /* Interface */ + if (Int_Num == ptr[2]) + { + alt_num = (uint16_t)ptr[3]; /* Alternate Number count */ + } + point += ptr[0]; + ptr += ptr[0]; + break; + + case USB_FUNCTION_DT_DEVICE: /* Device */ + case USB_FUNCTION_DT_CONFIGURATION: /* Configuration */ + case USB_FUNCTION_DT_STRING: /* String */ + case USB_FUNCTION_DT_ENDPOINT: /* Endpoint */ + default: /* Class, Vendor, else */ + point += ptr[0]; + ptr += ptr[0]; + break; + } + } + return alt_num; +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_CheckRemoteWakeup +* Description : Returns the result of the remote wake up function is supported +* : or not referring to the configuration descriptor. +* Arguments : none +* Return Value : DEVDRV_USBF_ON : Support Remote Wakeup +* : DEVDRV_USBF_OFF : not Support Remote Wakeup +*******************************************************************************/ +#if 0 +uint16_t usb1_function_CheckRemoteWakeup (void) +{ + uint8_t atr; + + if (g_usb1_function_ConfigNum == 0) + { + return DEVDRV_USBF_OFF; + } + + atr = *(g_usb1_function_ConfigurationPtr[g_usb1_function_ConfigNum - 1] + 7); + + if (atr & USB_FUNCTION_CF_RWUP) + { + return DEVDRV_USBF_ON; + } + + return DEVDRV_USBF_OFF; +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_clear_alt +* Description : Initializes the Alternate setting area. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_clear_alt (void) +{ + int i; + + for (i = 0; i < USB_FUNCTION_ALT_NO; ++i) + { + g_usb1_function_Alternate[i] = 0; /* Alternate */ + } +} +#endif + +/******************************************************************************* +* Function Name: usb1_function_clear_pipe_tbl +* Description : Initializes pipe definition table. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void usb1_function_clear_pipe_tbl (void) +{ + int pipe; + + for (pipe = 0; pipe < (USB_FUNCTION_MAX_PIPE_NO + 1); ++pipe) + { + g_usb1_function_PipeTbl[pipe] = 0; + } +} + +/******************************************************************************* +* Function Name: usb1_function_clear_ep_table_index +* Description : Initializes the end point table index. +* Arguments : none +* Return Value : none +*******************************************************************************/ +#if 0 +void usb1_function_clear_ep_table_index (void) +{ + int ep; + + for (ep = 0; ep <= USB_FUNCTION_MAX_EP_NO; ++ep) + { + g_usb1_function_EPTableIndex[ep] = USB_FUNCTION_EP_ERROR; + } +} +#endif + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_dmacdrv.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,698 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_dmacdrv.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "rza_io_regrw.h" +#include "usb1_function_dmacdrv.h" + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DMAC_INDEFINE (255) /* Macro definition when REQD bit is not used */ + +/* ==== Request setting information for on-chip peripheral module ==== */ +typedef enum dmac_peri_req_reg_type +{ + DMAC_REQ_MID, + DMAC_REQ_RID, + DMAC_REQ_AM, + DMAC_REQ_LVL, + DMAC_REQ_REQD +} dmac_peri_req_reg_type_t; + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ +/* ==== Prototype declaration ==== */ + +/* ==== Global variable ==== */ +/* On-chip peripheral module request setting table */ +static const uint8_t usb1_function_dmac_peri_req_init_table[8][5] = +{ + /* MID,RID,AM,LVL,REQD */ + {32, 3, 2, 1, 1}, /* USB_0 channel 0 transmit FIFO empty */ + {32, 3, 2, 1, 0}, /* USB_0 channel 0 receive FIFO full */ + {33, 3, 2, 1, 1}, /* USB_0 channel 1 transmit FIFO empty */ + {33, 3, 2, 1, 0}, /* USB_0 channel 1 receive FIFO full */ + {34, 3, 2, 1, 1}, /* USB_1 channel 0 transmit FIFO empty */ + {34, 3, 2, 1, 0}, /* USB_1 channel 0 receive FIFO full */ + {35, 3, 2, 1, 1}, /* USB_1 channel 1 transmit FIFO empty */ + {35, 3, 2, 1, 0}, /* USB_1 channel 1 receive FIFO full */ +}; + + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 1. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 1 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t *trans_info : Setting information to DMAC register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous transfer +* : uint32_t request_factor : Factor for on-chip peripheral module request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction: Setting value of CHCFG_n register REQD bit +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC3_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC3.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC3.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC3.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->daddr_dir, + DMAC3_CHCFG_n_DAD_SHIFT, + DMAC3_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->saddr_dir, + DMAC3_CHCFG_n_SAD_SHIFT, + DMAC3_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->dst_size, + DMAC3_CHCFG_n_DDS_SHIFT, + DMAC3_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + trans_info->src_size, + DMAC3_CHCFG_n_SDS_SHIFT, + DMAC3_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_DMS_SHIFT, + DMAC3_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_RSEL_SHIFT, + DMAC3_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_SBE_SHIFT, + DMAC3_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_DEM_SHIFT, + DMAC3_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 1, + DMAC3_CHCFG_n_REN_SHIFT, + DMAC3_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 1, + DMAC3_CHCFG_n_RSW_SHIFT, + DMAC3_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_REN_SHIFT, + DMAC3_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_RSW_SHIFT, + DMAC3_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_TM_SHIFT, + DMAC3_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 3, + DMAC3_CHCFG_n_SEL_SHIFT, + DMAC3_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 1, + DMAC3_CHCFG_n_HIEN_SHIFT, + DMAC3_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + 0, + DMAC3_CHCFG_n_LOEN_SHIFT, + DMAC3_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC3_CHCFG_n_AM_SHIFT, + DMAC3_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC3_CHCFG_n_LVL_SHIFT, + DMAC3_CHCFG_n_LVL); + + if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC3_CHCFG_n_REQD_SHIFT, + DMAC3_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC3.CHCFG_n, + req_direction, + DMAC3_CHCFG_n_REQD_SHIFT, + DMAC3_CHCFG_n_REQD); + } + + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC23_DMARS_CH3_RID_SHIFT, + DMAC23_DMARS_CH3_RID); + RZA_IO_RegWrite_32(&DMAC23.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC23_DMARS_CH3_MID_SHIFT, + DMAC23_DMARS_CH3_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_Open +* Description : Enables DMAC channel 3 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb1_function_DMAC3_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_EN_SHIFT, + DMAC3_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_TACT_SHIFT, + DMAC3_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_SWRST_SHIFT, + DMAC3_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC3.CHCTRL_n, + DMAC3_CHCTRL_n_SWRST_SHIFT, + DMAC3_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_SETEN_SHIFT, + DMAC3_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_STG_SHIFT, + DMAC3_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_Close +* Description : Aborts DMAC channel 3 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC3_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC3.CHCTRL_n, + 1, + DMAC3_CHCTRL_n_CLREN_SHIFT, + DMAC3_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_TACT_SHIFT, + DMAC3_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_EN_SHIFT, + DMAC3_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC3.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC3_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 3 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 3 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC3_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC3.CHSTAT_n, + DMAC3_CHSTAT_n_SR_SHIFT, + DMAC3_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC3.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC3.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC3.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC3.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC3.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC3.N1TB_n = count; /* Total transfer byte count */ + } +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_PeriReqInit +* Description : Sets the register mode for DMA mode and the on-chip peripheral +* : module request for transfer request for DMAC channel 2. +* : Executes DMAC initial setting using the DMA information +* : specified by the argument *trans_info and the enabled/disabled +* : continuous transfer specified by the argument continuation. +* : Registers DMAC channel 2 interrupt handler function and sets +* : the interrupt priority level. Then enables transfer completion +* : interrupt. +* Arguments : dmac_transinfo_t * trans_info : Setting information to DMAC +* : : register +* : uint32_t dmamode : DMA mode (only for DMAC_MODE_REGISTER) +* : uint32_t continuation : Set continuous transfer to be valid +* : : after DMA transfer has been completed +* : DMAC_SAMPLE_CONTINUATION : Execute continuous transfer +* : DMAC_SAMPLE_SINGLE : Do not execute continuous +* : : transfer +* : uint32_t request_factor : Factor for on-chip peripheral module +* : : request +* : DMAC_REQ_OSTM0TINT : OSTM_0 compare match +* : DMAC_REQ_OSTM1TINT : OSTM_1 compare match +* : DMAC_REQ_TGI0A : MTU2_0 input capture/compare match +* : : +* : uint32_t req_direction : Setting value of CHCFG_n register +* : : REQD bit +*******************************************************************************/ +void usb1_function_DMAC4_PeriReqInit (const dmac_transinfo_t * trans_info, + uint32_t dmamode, uint32_t continuation, + uint32_t request_factor, uint32_t req_direction) +{ + /* ==== Register mode ==== */ + if (DMAC_MODE_REGISTER == dmamode) + { + /* ==== Next0 register set ==== */ + DMAC4.N0SA_n = trans_info->src_addr; /* Start address of transfer source */ + DMAC4.N0DA_n = trans_info->dst_addr; /* Start address of transfer destination */ + DMAC4.N0TB_n = trans_info->count; /* Total transfer byte count */ + + /* DAD : Transfer destination address counting direction */ + /* SAD : Transfer source address counting direction */ + /* DDS : Transfer destination transfer size */ + /* SDS : Transfer source transfer size */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->daddr_dir, + DMAC4_CHCFG_n_DAD_SHIFT, + DMAC4_CHCFG_n_DAD); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->saddr_dir, + DMAC4_CHCFG_n_SAD_SHIFT, + DMAC4_CHCFG_n_SAD); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->dst_size, + DMAC4_CHCFG_n_DDS_SHIFT, + DMAC4_CHCFG_n_DDS); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + trans_info->src_size, + DMAC4_CHCFG_n_SDS_SHIFT, + DMAC4_CHCFG_n_SDS); + + /* DMS : Register mode */ + /* RSEL : Select Next0 register set */ + /* SBE : No discharge of buffer data when aborted */ + /* DEM : No DMA interrupt mask */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_DMS_SHIFT, + DMAC4_CHCFG_n_DMS); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_RSEL_SHIFT, + DMAC4_CHCFG_n_RSEL); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_SBE_SHIFT, + DMAC4_CHCFG_n_SBE); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_DEM_SHIFT, + DMAC4_CHCFG_n_DEM); + + /* ---- Continuous transfer ---- */ + if (DMAC_SAMPLE_CONTINUATION == continuation) + { + /* REN : Execute continuous transfer */ + /* RSW : Change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 1, + DMAC4_CHCFG_n_REN_SHIFT, + DMAC4_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 1, + DMAC4_CHCFG_n_RSW_SHIFT, + DMAC4_CHCFG_n_RSW); + } + /* ---- Single transfer ---- */ + else + { + /* REN : Do not execute continuous transfer */ + /* RSW : Do not change register set when DMA transfer is completed. */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_REN_SHIFT, + DMAC4_CHCFG_n_REN); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_RSW_SHIFT, + DMAC4_CHCFG_n_RSW); + } + + /* TM : Single transfer */ + /* SEL : Channel setting */ + /* HIEN, LOEN : On-chip peripheral module request */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_TM_SHIFT, + DMAC4_CHCFG_n_TM); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 4, + DMAC4_CHCFG_n_SEL_SHIFT, + DMAC4_CHCFG_n_SEL); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 1, + DMAC4_CHCFG_n_HIEN_SHIFT, + DMAC4_CHCFG_n_HIEN); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + 0, + DMAC4_CHCFG_n_LOEN_SHIFT, + DMAC4_CHCFG_n_LOEN); + + /* ---- Set factor by specified on-chip peripheral module request ---- */ + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_AM], + DMAC4_CHCFG_n_AM_SHIFT, + DMAC4_CHCFG_n_AM); + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_LVL], + DMAC4_CHCFG_n_LVL_SHIFT, + DMAC4_CHCFG_n_LVL); + if (usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD] != DMAC_INDEFINE) + { + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_REQD], + DMAC4_CHCFG_n_REQD_SHIFT, + DMAC4_CHCFG_n_REQD); + } + else + { + RZA_IO_RegWrite_32(&DMAC4.CHCFG_n, + req_direction, + DMAC4_CHCFG_n_REQD_SHIFT, + DMAC4_CHCFG_n_REQD); + } + RZA_IO_RegWrite_32(&DMAC45.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_RID], + DMAC45_DMARS_CH4_RID_SHIFT, + DMAC45_DMARS_CH4_RID); + RZA_IO_RegWrite_32(&DMAC45.DMARS, + usb1_function_dmac_peri_req_init_table[request_factor][DMAC_REQ_MID], + DMAC45_DMARS_CH4_MID_SHIFT, + DMAC45_DMARS_CH4_MID); + + /* PR : Round robin mode */ + RZA_IO_RegWrite_32(&DMAC07.DCTRL_0_7, + 1, + DMAC07_DCTRL_0_7_PR_SHIFT, + DMAC07_DCTRL_0_7_PR); + } +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_Open +* Description : Enables DMAC channel 4 transfer. +* Arguments : uint32_t req : DMAC request mode +* Return Value : 0 : Succeeded in enabling DMA transfer +* : -1 : Failed to enable DMA transfer (due to DMA operation) +*******************************************************************************/ +int32_t usb1_function_DMAC4_Open (uint32_t req) +{ + int32_t ret; + volatile uint8_t dummy; + + /* Transferable? */ + if ((0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_EN_SHIFT, + DMAC4_CHSTAT_n_EN)) && + (0 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_TACT_SHIFT, + DMAC4_CHSTAT_n_TACT))) + { + /* Clear Channel Status Register */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_SWRST_SHIFT, + DMAC4_CHCTRL_n_SWRST); + dummy = RZA_IO_RegRead_32(&DMAC4.CHCTRL_n, + DMAC4_CHCTRL_n_SWRST_SHIFT, + DMAC4_CHCTRL_n_SWRST); + /* Enable DMA transfer */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_SETEN_SHIFT, + DMAC4_CHCTRL_n_SETEN); + + /* ---- Request by software ---- */ + if (DMAC_REQ_MODE_SOFT == req) + { + /* DMA transfer Request by software */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_STG_SHIFT, + DMAC4_CHCTRL_n_STG); + } + + ret = 0; + } + else + { + ret = -1; + } + + return ret; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_Close +* Description : Aborts DMAC channel 4 transfer. Returns the remaining transfer +* : byte count at the time of DMA transfer abort to the argument +* : *remain. +* Arguments : uint32_t * remain : Remaining transfer byte count when +* : : DMA transfer is aborted +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC4_Close (uint32_t * remain) +{ + + /* ==== Abort transfer ==== */ + RZA_IO_RegWrite_32(&DMAC4.CHCTRL_n, + 1, + DMAC4_CHCTRL_n_CLREN_SHIFT, + DMAC4_CHCTRL_n_CLREN); + + while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_TACT_SHIFT, + DMAC4_CHSTAT_n_TACT)) + { + /* Loop until transfer is aborted */ + } + + while (1 == RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_EN_SHIFT, + DMAC4_CHSTAT_n_EN)) + { + /* Loop until 0 is set in EN before checking the remaining transfer byte count */ + } + /* ==== Obtain remaining transfer byte count ==== */ + *remain = DMAC4.CRTB_n; +} + +/******************************************************************************* +* Function Name: usb1_function_DMAC4_Load_Set +* Description : Sets the transfer source address, transfer destination +* : address, and total transfer byte count respectively +* : specified by the argument src_addr, dst_addr, and count to +* : DMAC channel 4 as DMA transfer information. +* : Sets the register set selected by the CHCFG_n register +* : RSEL bit from the Next0 or Next1 register set. +* : This function should be called when DMA transfer of DMAC +* : channel 4 is aboted. +* Arguments : uint32_t src_addr : Transfer source address +* : uint32_t dst_addr : Transfer destination address +* : uint32_t count : Total transfer byte count +* Return Value : none +*******************************************************************************/ +void usb1_function_DMAC4_Load_Set (uint32_t src_addr, uint32_t dst_addr, uint32_t count) +{ + uint8_t reg_set; + + /* Obtain register set in use */ + reg_set = RZA_IO_RegRead_32(&DMAC4.CHSTAT_n, + DMAC4_CHSTAT_n_SR_SHIFT, + DMAC4_CHSTAT_n_SR); + + /* ==== Load ==== */ + if (0 == reg_set) + { + /* ---- Next0 Register Set ---- */ + DMAC4.N0SA_n = src_addr; /* Start address of transfer source */ + DMAC4.N0DA_n = dst_addr; /* Start address of transfer destination */ + DMAC4.N0TB_n = count; /* Total transfer byte count */ + } + else + { + /* ---- Next1 Register Set ---- */ + DMAC4.N1SA_n = src_addr; /* Start address of transfer source */ + DMAC4.N1DA_n = dst_addr; /* Start address of transfer destination */ + DMAC4.N1TB_n = count; /* Total transfer byte count */ + } +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb1/src/userdef/usb1_function_userdef.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,762 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ +/******************************************************************************* +* File Name : usb1_function_userdef.c +* $Rev: 1116 $ +* $Date:: 2014-07-09 16:29:19 +0900#$ +* Device(s) : RZ/A1H +* Tool-Chain : +* OS : None +* H/W Platform : +* Description : RZ/A1H R7S72100 USB Sample Program +* Operation : +* Limitations : +*******************************************************************************/ + + +/******************************************************************************* +Includes <System Includes> , "Project Includes" +*******************************************************************************/ +#include <stdio.h> +#include "r_typedefs.h" +#include "iodefine.h" +#include "devdrv_usb_function_api.h" +#include "usb1_function_dmacdrv.h" /* common DMAC driver for USB */ + + +/******************************************************************************* +Typedef definitions +*******************************************************************************/ + + +/******************************************************************************* +Macro definitions +*******************************************************************************/ +#define DUMMY_ACCESS OSTM0CNT + +/* #define CACHE_WRITEBACK */ + + +/******************************************************************************* +Imported global variables and functions (from other files) +*******************************************************************************/ +extern int32_t io_cwb(unsigned long start, unsigned long end); + + +/******************************************************************************* +Exported global variables and functions (to be accessed by other files) +*******************************************************************************/ +static void usb1_function_enable_dmac0(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void usb1_function_enable_dmac1(uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc); +static void Userdef_USB_usb1_function_delay_10us_2(void); + + +/******************************************************************************* +Private global variables and functions +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_d0fifo_dmaintid +* Description : get D0FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D0FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb1_function_d0fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_d1fifo_dmaintid +* Description : get D1FIFO DMA Interrupt ID +* Arguments : none +* Return Value : D1FIFO DMA Interrupt ID +*******************************************************************************/ +IRQn_Type Userdef_USB_usb1_function_d1fifo_dmaintid (void) +{ +#if 0 + return DMAINT1_IRQn; +#else + return 0xFFFF; +#endif +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_attach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_attach (void) +{ + printf("\n"); + printf("channel 1 attach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_detach +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_detach (void) +{ + printf("\n"); + printf("channel 1 detach device\n"); + printf("\n"); +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_1ms +* Description : Wait for the software of 1ms. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_1ms (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* + * Wait 1ms (Please change for your MCU). + */ + for (i = 0; i < 1440; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_xms +* Description : Wait for the software in the period of time specified by the +* : argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t msec ; Wait Time (msec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_xms (uint32_t msec) +{ + volatile unsigned short i; + + for (i = 0; i < msec; ++i) + { + Userdef_USB_usb1_function_delay_1ms(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_10us +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : uint32_t usec ; Wait Time(x 10usec) +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_10us (uint32_t usec) +{ + volatile int i; + + /* Wait 10us (Please change for your MCU) */ + for (i = 0; i < usec; ++i) + { + Userdef_USB_usb1_function_delay_10us_2(); + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_10us_2 +* Description : Waits for software for the period specified by the argument. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +static void Userdef_USB_usb1_function_delay_10us_2 (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 1us (Please change for your MCU) */ + for (i = 0; i < 14; ++i) + { + tmp = DUMMY_ACCESS; + } +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_delay_500ns +* Description : Wait for software for 500ns. +* : Alter this function according to the user's system. +* Arguments : none +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_delay_500ns (void) +{ + volatile int i; + volatile unsigned long tmp; + + /* Wait 500ns (Please change for your MCU) */ + /* Wait 500ns I clock 266MHz */ + tmp = DUMMY_ACCESS; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_start_dma +* Description : Enables DMA transfer on the information specified by the argument. +* : Set DMAC register by this function to enable DMA transfer. +* : After executing this function, USB module is set to start DMA +* : transfer. DMA transfer should not wait for DMA transfer complete. +* Arguments : USB_FUNCTION_DMA_t *dma : DMA parameter +* : typedef struct{ +* : uint32_t fifo; FIFO for using +* : uint32_t buffer; Start address of transfer source/destination +* : uint32_t bytes; Transfer size(Byte) +* : uint32_t dir; Transfer direction(0:Buffer->FIFO, 1:FIFO->Buffer) +* : uint32_t size; DMA transfer size +* : } USB_FUNCTION_DMA_t; +* : uint16_t dfacc ; 0 : cycle steal mode +* : 1 : 16byte continuous mode +* : 2 : 32byte continuous mode +* Return Value : none +*******************************************************************************/ +void Userdef_USB_usb1_function_start_dma (USB_FUNCTION_DMA_t * dma, uint16_t dfacc) +{ + uint32_t trncount; + uint32_t src; + uint32_t dst; + uint32_t size; + uint32_t dir; +#ifdef CACHE_WRITEBACK + uint32_t ptr; +#endif + + trncount = dma->bytes; + dir = dma->dir; + + if (dir == USB_FUNCTION_FIFO2BUF) + { + /* DxFIFO determination */ + dst = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + src += 3; /* byte access */ + } + else if (size == 1) + { + src += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB201.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + src = (uint32_t)(&USB201.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + src += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + src = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + src = (uint32_t)(&USB201.D1FIFO.UINT32); + } + src += 3; /* byte access */ + } +#endif + } + else + { + /* DxFIFO determination */ + src = dma->buffer; +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + size = dma->size; + + if (size == 0) + { + dst += 3; /* byte access */ + } + else if (size == 1) + { + dst += 2; /* short access */ + } + else + { + /* Do Nothing */ + } +#else + size = dma->size; + + if (size == 2) + { + /* 32bit access */ + if (dfacc == 2) + { + /* 32byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB201.D1FIFOB0); + } + } + else if (dfacc == 1) + { + /* 16byte access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFOB0); + } + else + { + dst = (uint32_t)(&USB201.D1FIFOB0); + } + } + else + { + /* normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + } + } + else if (size == 1) + { + /* 16bit access */ + dfacc = 0; /* force normal access */ + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + dst += 2; /* short access */ + } + else + { + /* 8bit access */ + dfacc = 0; /* force normal access */ + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + dst = (uint32_t)(&USB201.D0FIFO.UINT32); + } + else + { + dst = (uint32_t)(&USB201.D1FIFO.UINT32); + } + dst += 3; /* byte access */ + } +#endif + } + +#ifdef CACHE_WRITEBACK + ptr = (uint32_t)dma->buffer; + + if ((ptr & 0x20000000ul) == 0) + { + io_cwb((uint32_t)ptr, (uint32_t)(ptr) + trncount); + } +#endif + + if (dma->fifo == USB_FUNCTION_D0FIFO_DMA) + { + usb1_function_enable_dmac0(src, dst, trncount, size, dir, dma->fifo, dfacc); + } + else + { + usb1_function_enable_dmac1(src, dst, trncount, size, dir, dma->fifo, dfacc); + } +} + +/******************************************************************************* +* Function Name: usb1_function_enable_dmac0 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb1_function_enable_dmac0 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB1_DMA0_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB1_DMA0_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb1_function_DMAC3_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb1_function_DMAC3_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb1_function_DMAC3_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC3 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: usb1_function_enable_dmac1 +* Description : Enables DMA transfer on the information specified by the argument. +* Arguments : uint32_t src : src address +* : uint32_t dst : dst address +* : uint32_t count : transfer byte +* : uint32_t size : transfer size +* : uint32_t dir : direction +* : uint32_t fifo : FIFO(D0FIFO or D1FIFO) +* : uint16_t dfacc : 0 : normal access +* : : 1 : 16byte access +* : : 2 : 32byte access +* Return Value : none +*******************************************************************************/ +static void usb1_function_enable_dmac1 (uint32_t src, uint32_t dst, uint32_t count, + uint32_t size, uint32_t dir, uint32_t fifo, uint16_t dfacc) +{ + dmac_transinfo_t trans_info; + uint32_t request_factor = 0; + int32_t ret; + + /* ==== Variable setting for DMAC initialization ==== */ + trans_info.src_addr = (uint32_t)src; /* Start address of transfer source */ + trans_info.dst_addr = (uint32_t)dst; /* Start address of transfer destination */ + trans_info.count = (uint32_t)count; /* Total byte count to be transferred */ +#ifndef __USB_FUNCTION_DF_ACC_ENABLE__ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } +#else + if (dfacc == 2) + { + /* 32byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_256; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_256; /* Transfer destination transfer size */ + } + else if (dfacc == 1) + { + /* 16byte access */ + trans_info.src_size = DMAC_TRANS_SIZE_128; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_128; /* Transfer destination transfer size */ + } + else + { + /* normal access */ + if (size == 0) + { + trans_info.src_size = DMAC_TRANS_SIZE_8; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_8; /* Transfer destination transfer size */ + } + else if (size == 1) + { + trans_info.src_size = DMAC_TRANS_SIZE_16; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_16; /* Transfer destination transfer size */ + } + else if (size == 2) + { + trans_info.src_size = DMAC_TRANS_SIZE_32; /* Transfer source transfer size */ + trans_info.dst_size = DMAC_TRANS_SIZE_32; /* Transfer destination transfer size */ + } + else + { + printf("size error!!\n"); + } + } +#endif + + if (dir == USB_FUNCTION_FIFO2BUF) + { + request_factor =DMAC_REQ_USB1_DMA1_RX; /* USB_0 channel 0 receive FIFO full */ + trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer destination address */ + } + else if (dir == USB_FUNCTION_BUF2FIFO) + { + request_factor =DMAC_REQ_USB1_DMA1_TX; /* USB_0 channel 0 receive FIFO empty */ + trans_info.saddr_dir = DMAC_TRANS_ADR_INC; /* Count direction of transfer source address */ + trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC; /* Count direction of transfer destination address */ + } + else + { + /* Do Nothing */ + } + + /* ==== DMAC initialization ==== */ + usb1_function_DMAC4_PeriReqInit((const dmac_transinfo_t *)&trans_info, + DMAC_MODE_REGISTER, + DMAC_SAMPLE_SINGLE, + request_factor, + 0); /* Don't care DMAC_REQ_REQD is setting in + usb1_function_DMAC4_PeriReqInit() */ + + /* ==== DMAC startup ==== */ + ret = usb1_function_DMAC4_Open(DMAC_REQ_MODE_PERI); + if (ret != 0) + { + printf("DMAC4 Open error!!\n"); + } + + return; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_stop_dma0 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D0_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb1_function_stop_dma0 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb1_function_DMAC3_Close(&remain); + + return remain; +} + +/******************************************************************************* +* Function Name: Userdef_USB_usb1_function_stop_dma1 +* Description : Disables DMA transfer. +* : This function should be executed to DMAC executed at the time +* : of specification of D1_FIF0_DMA in dma->fifo. +* Arguments : none +* Return Value : uint32_t return Transfer Counter register(DMATCRn) value +* : regarding to the bus width. +*******************************************************************************/ +uint32_t Userdef_USB_usb1_function_stop_dma1 (void) +{ + uint32_t remain; + + /* ==== DMAC release ==== */ + usb1_function_DMAC4_Close(&remain); + + return remain; +} + +/* End of File */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/usb_function_setting.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,173 @@ +/******************************************************************************* +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only +* intended for use with Renesas products. No other uses are authorized. This +* software is owned by Renesas Electronics Corporation and is protected under +* all applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT +* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. +* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS +* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE +* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR +* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE +* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software +* and to discontinue the availability of this software. By using this software, +* you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* Copyright (C) 2014 - 2015 Renesas Electronics Corporation. All rights reserved. +*******************************************************************************/ + +#ifndef USB_FUNCTION_SETTING_H +#define USB_FUNCTION_SETTING_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define USB_FUNCTION_CH 0 +#define USB_FUNCTION_HISPEED 1 + +#if (USB_FUNCTION_CH == 0) +#include "usb0_function.h" +#define USB20X USB200 +#define USBIX_IRQn USBI0_IRQn +#define g_usbx_function_bit_set g_usb0_function_bit_set +#define g_usbx_function_PipeDataSize g_usb0_function_PipeDataSize +#define g_usbx_function_data_count g_usb0_function_data_count +#define g_usbx_function_PipeTbl g_usb0_function_PipeTbl +#define g_usbx_function_DmaStatus g_usb0_function_DmaStatus +#define g_usbx_function_pipecfg g_usb0_function_pipecfg +#define g_usbx_function_pipe_status g_usb0_function_pipe_status +#define g_usbx_function_data_pointer g_usb0_function_data_pointer +#define g_usbx_function_pipebuf g_usb0_function_pipebuf +#define g_usbx_function_pipemaxp g_usb0_function_pipemaxp +#define g_usbx_function_pipeperi g_usb0_function_pipeperi +#define g_usbx_function_TestModeFlag g_usb0_function_TestModeFlag +#define usbx_function_BRDYInterruptPIPE0 usb0_function_BRDYInterruptPIPE0 +#define usbx_function_BRDYInterrupt usb0_function_BRDYInterrupt +#define usbx_function_NRDYInterruptPIPE0 usb0_function_NRDYInterruptPIPE0 +#define usbx_function_NRDYInterrupt usb0_function_NRDYInterrupt +#define usbx_function_BEMPInterruptPIPE0 usb0_function_BEMPInterruptPIPE0 +#define usbx_function_BEMPInterrupt usb0_function_BEMPInterrupt +#define usbx_function_read_buffer_c usb0_function_read_buffer_c +#define usbx_function_set_pid_buf usb0_function_set_pid_buf +#define usbx_function_disable_brdy_int usb0_function_disable_brdy_int +#define usbx_function_set_pid_stall usb0_function_set_pid_stall +#define usbx_function_dma_interrupt_d0fifo usb0_function_dma_interrupt_d0fifo +#define usbx_function_read_dma usb0_function_read_dma +#define usbx_function_dma_interrupt_d1fifo usb0_function_dma_interrupt_d1fifo +#define usbx_function_write_buffer usb0_function_write_buffer +#define usbx_function_set_pid_nak usb0_function_set_pid_nak +#define usbx_function_get_mbw usb0_function_get_mbw +#define usbx_function_set_curpipe usb0_function_set_curpipe +#define usbx_function_aclrm usb0_function_aclrm +#define usbx_function_enable_nrdy_int usb0_function_enable_nrdy_int +#define usbx_function_enable_brdy_int usb0_function_enable_brdy_int +#define usbx_function_get_pid usb0_function_get_pid +#define usbx_function_get_inbuf usb0_function_get_inbuf +#define usbx_function_disable_bemp_int usb0_function_disable_bemp_int +#define usbx_function_EpToPipe usb0_function_EpToPipe +#define usbx_function_clear_pipe_tbl usb0_function_clear_pipe_tbl +#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb0_function_d0fifo_dmaintid +#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb0_function_d1fifo_dmaintid +#define usbx_function_reset_module usb0_function_reset_module +#define usbx_function_init_status usb0_function_init_status +#define usbx_function_InitModule usb0_function_InitModule +#define usbx_function_clear_alt usb0_function_clear_alt +#define usbx_function_set_sqclr usb0_function_set_sqclr +#define usbx_api_function_CtrlWriteStart usb0_api_function_CtrlWriteStart +#define usbx_api_function_CtrlReadStart usb0_api_function_CtrlReadStart +#define usbx_function_write_buffer_c usb0_function_write_buffer_c +#define usbx_api_function_check_pipe_status usb0_api_function_check_pipe_status +#define usbx_api_function_set_pid_nak usb0_api_function_set_pid_nak +#define usbx_api_function_clear_pipe_status usb0_api_function_clear_pipe_status +#define usbx_api_function_start_receive_transfer usb0_api_function_start_receive_transfer +#define usbx_function_read_buffer usb0_function_read_buffer +#define usbx_api_function_start_send_transfer usb0_api_function_start_send_transfer +#define usbx_function_stop_transfer usb0_function_stop_transfer +#define usbx_function_clear_pid_stall usb0_function_clear_pid_stall +#define usbx_function_CheckVBUStaus usb0_function_CheckVBUStaus +#define usbx_function_USB_FUNCTION_Attach usb0_function_USB_FUNCTION_Attach +#define usbx_function_USB_FUNCTION_Detach usb0_function_USB_FUNCTION_Detach +#define usbx_function_is_hispeed usb0_function_is_hispeed +#define usbx_function_ResetDescriptor usb0_function_ResetDescriptor +#define usbx_function_USB_FUNCTION_Suspend usb0_function_USB_FUNCTION_Suspend +#define usbx_function_USB_FUNCTION_TestMode usb0_function_USB_FUNCTION_TestMode +#else +#include "usb1_function.h" +#define USB20X USB201 +#define USBIX_IRQn USBI1_IRQn +#define g_usbx_function_bit_set g_usb1_function_bit_set +#define g_usbx_function_PipeDataSize g_usb1_function_PipeDataSize +#define g_usbx_function_data_count g_usb1_function_data_count +#define g_usbx_function_PipeTbl g_usb1_function_PipeTbl +#define g_usbx_function_DmaStatus g_usb1_function_DmaStatus +#define g_usbx_function_pipecfg g_usb1_function_pipecfg +#define g_usbx_function_pipe_status g_usb1_function_pipe_status +#define g_usbx_function_data_pointer g_usb1_function_data_pointer +#define g_usbx_function_pipebuf g_usb1_function_pipebuf +#define g_usbx_function_pipemaxp g_usb1_function_pipemaxp +#define g_usbx_function_pipeperi g_usb1_function_pipeperi +#define g_usbx_function_TestModeFlag g_usb1_function_TestModeFlag +#define usbx_function_BRDYInterruptPIPE0 usb1_function_BRDYInterruptPIPE0 +#define usbx_function_BRDYInterrupt usb1_function_BRDYInterrupt +#define usbx_function_NRDYInterruptPIPE0 usb1_function_NRDYInterruptPIPE0 +#define usbx_function_NRDYInterrupt usb1_function_NRDYInterrupt +#define usbx_function_BEMPInterruptPIPE0 usb1_function_BEMPInterruptPIPE0 +#define usbx_function_BEMPInterrupt usb1_function_BEMPInterrupt +#define usbx_function_read_buffer_c usb1_function_read_buffer_c +#define usbx_function_set_pid_buf usb1_function_set_pid_buf +#define usbx_function_disable_brdy_int usb1_function_disable_brdy_int +#define usbx_function_set_pid_stall usb1_function_set_pid_stall +#define usbx_function_dma_interrupt_d0fifo usb1_function_dma_interrupt_d0fifo +#define usbx_function_read_dma usb1_function_read_dma +#define usbx_function_dma_interrupt_d1fifo usb1_function_dma_interrupt_d1fifo +#define usbx_function_write_buffer usb1_function_write_buffer +#define usbx_function_set_pid_nak usb1_function_set_pid_nak +#define usbx_function_get_mbw usb1_function_get_mbw +#define usbx_function_set_curpipe usb1_function_set_curpipe +#define usbx_function_aclrm usb1_function_aclrm +#define usbx_function_enable_nrdy_int usb1_function_enable_nrdy_int +#define usbx_function_enable_brdy_int usb1_function_enable_brdy_int +#define usbx_function_get_pid usb1_function_get_pid +#define usbx_function_get_inbuf usb1_function_get_inbuf +#define usbx_function_disable_bemp_int usb1_function_disable_bemp_int +#define usbx_function_EpToPipe usb1_function_EpToPipe +#define usbx_function_clear_pipe_tbl usb1_function_clear_pipe_tbl +#define Userdef_USB_usbx_function_d0fifo_dmaintid Userdef_USB_usb1_function_d0fifo_dmaintid +#define Userdef_USB_usbx_function_d1fifo_dmaintid Userdef_USB_usb1_function_d1fifo_dmaintid +#define usbx_function_reset_module usb1_function_reset_module +#define usbx_function_init_status usb1_function_init_status +#define usbx_function_InitModule usb1_function_InitModule +#define usbx_function_clear_alt usb1_function_clear_alt +#define usbx_function_set_sqclr usb1_function_set_sqclr +#define usbx_api_function_CtrlWriteStart usb1_api_function_CtrlWriteStart +#define usbx_api_function_CtrlReadStart usb1_api_function_CtrlReadStart +#define usbx_function_write_buffer_c usb1_function_write_buffer_c +#define usbx_api_function_check_pipe_status usb1_api_function_check_pipe_status +#define usbx_api_function_set_pid_nak usb1_api_function_set_pid_nak +#define usbx_api_function_clear_pipe_status usb1_api_function_clear_pipe_status +#define usbx_api_function_start_receive_transfer usb1_api_function_start_receive_transfer +#define usbx_function_read_buffer usb1_function_read_buffer +#define usbx_api_function_start_send_transfer usb1_api_function_start_send_transfer +#define usbx_function_stop_transfer usb1_function_stop_transfer +#define usbx_function_clear_pid_stall usb1_function_clear_pid_stall +#define usbx_function_CheckVBUStaus usb1_function_CheckVBUStaus +#define usbx_function_USB_FUNCTION_Attach usb1_function_USB_FUNCTION_Attach +#define usbx_function_USB_FUNCTION_Detach usb1_function_USB_FUNCTION_Detach +#define usbx_function_is_hispeed usb1_function_is_hispeed +#define usbx_function_ResetDescriptor usb1_function_ResetDescriptor +#define usbx_function_USB_FUNCTION_Suspend usb1_function_USB_FUNCTION_Suspend +#define usbx_function_USB_FUNCTION_TestMode usb1_function_USB_FUNCTION_TestMode +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* USB_FUNCTION_SETTING_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/USBEndpoints_RZ_A1H.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,85 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#define NUMBER_OF_LOGICAL_ENDPOINTS (16) +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) + +/* Define physical endpoint numbers */ + +/* Endpoint No. Type(s) MaxSiz DoubleBuf pipe */ +/* ---------------- --------- ------ --------- ---- */ +#define EP0OUT (0) /* Control 256 No 0 */ +#define EP0IN (1) /* Control 256 No 0 */ +#define EP1OUT (2) /* Int 64 No 6 */ +#define EP1IN (3) /* Int 64 No 7 */ +#define EP2OUT (4) /* Bulk 2048 Yes 3 */ +#define EP2IN (5) /* Bulk 2048 Yes 4 */ +#define EP3OUT (6) /* Bulk/Iso 2048 Yes 1 */ +#define EP3IN (7) /* Bulk/Iso 2048 Yes 2 */ +/*following EP is not configured in sample program*/ +#define EP6IN (8) /* Bulk 2048 Yes 5 */ +#define EP8IN (9) /* Int 64 No 8 */ +#define EP9IN (10) /* Bulk 512 Bulk 9 */ +#define EP10IN (11) /* Int/Bulk 2048 Bulk 10 */ +#define EP11IN (12) /* Bulk 2048 Yes 11 */ +#define EP12IN (13) /* Bulk 2048 Yes 12 */ +#define EP13IN (14) /* Bulk 2048 Yes 13 */ +#define EP14IN (15) /* Bulk 2048 Yes 14 */ +#define EP15IN (16) /* Bulk 2048 Yes 15 */ + +/* Maximum Packet sizes */ +#define MAX_PACKET_SIZE_EP0 (64) /*pipe0/pipe0: control */ +#define MAX_PACKET_SIZE_EP1 (64) /*pipe6/pipe7: interrupt */ +#define MAX_PACKET_SIZE_EP2 (512) /*pipe3/pipe4: bulk */ +#define MAX_PACKET_SIZE_EP3 (512) /*pipe1/pipe2: isochronous */ +#define MAX_PACKET_SIZE_EP6 (64) /*pipe5: Note *1 */ +#define MAX_PACKET_SIZE_EP8 (64) /*pipe7: Note *1 */ +#define MAX_PACKET_SIZE_EP9 (512) /*pipe8: Note *1 */ +#define MAX_PACKET_SIZE_EP10 (512) /*pipe9: Note *1 */ +#define MAX_PACKET_SIZE_EP11 (512) /*pipe10: Note *1 */ +#define MAX_PACKET_SIZE_EP12 (512) /*pipe11: Note *1 */ +#define MAX_PACKET_SIZE_EP13 (512) /*pipe12: Note *1 */ +#define MAX_PACKET_SIZE_EP14 (512) /*pipe13: Note *1 */ +#define MAX_PACKET_SIZE_EP15 (512) /*pipe14: Note *1 */ +/* Note *1: This pipe is not configure in sample program */ + + +/* Generic endpoints - intended to be portable accross devices */ +/* and be suitable for simple USB devices. */ + +/* Bulk endpoints */ +#define EPBULK_OUT (EP2OUT) +#define EPBULK_IN (EP2IN) +#define EPBULK_OUT_callback EP2_OUT_callback +#define EPBULK_IN_callback EP2_IN_callback +/* Interrupt endpoints */ +#define EPINT_OUT (EP1OUT) +#define EPINT_IN (EP1IN) +#define EPINT_OUT_callback EP1_OUT_callback +#define EPINT_IN_callback EP1_IN_callback +/* Isochronous endpoints */ +#define EPISO_OUT (EP3OUT) +#define EPISO_IN (EP3IN) +#define EPISO_OUT_callback EP3_OUT_callback +#define EPISO_IN_callback EP3_IN_callback + +#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) +#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) +#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3) + +/*EOF*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_RENESAS/USBHAL_RZ_A1H.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,1497 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following +* conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#if defined(TARGET_RZ_A1H) || defined(TARGET_VK_RZ_A1H) + +/* + This class can use the pipe1, pipe3 and pipe6 only. You should + re-program this class if you wanted to use other pipe. + */ + +/*************************************************************************/ +extern "C" +{ +#include "r_typedefs.h" +#include "iodefine.h" +} +#include "USBHAL.h" +#include "devdrv_usb_function_api.h" +#include "usb_iobitmask.h" +#include "rza_io_regrw.h" +#include "USBDevice_Types.h" +#include "usb_function_setting.h" + + +/*************************************************************************/ +/* constants */ +const struct PIPECFGREC { + uint16_t endpoint; + uint16_t pipesel; + uint16_t pipecfg; + uint16_t pipebuf; + uint16_t pipemaxp; + uint16_t pipeperi; +} def_pipecfg[] = { + /*EP0OUT and EP0IN are configured by USB IP*/ + { + EP1OUT, /*EP1: Host -> Func, INT*/ + 6 | USB_FUNCTION_D0FIFO_USE, + USB_FUNCTION_INTERRUPT | + USB_FUNCTION_BFREOFF | + USB_FUNCTION_DBLBOFF | + USB_FUNCTION_CNTMDON | + USB_FUNCTION_SHTNAKOFF | + USB_FUNCTION_DIR_P_OUT | + USB_FUNCTION_EP1, + ( ( ( 64) / 64 - 1 ) << 10 ) | 0x04u, + MAX_PACKET_SIZE_EP1, + DEVDRV_USBF_OFF | + ( 3 << USB_PIPEPERI_IITV_SHIFT ), + }, + { + EP1IN, /*EP1: Host <- Func, INT*/ + 7 | USB_FUNCTION_D1FIFO_USE, + USB_FUNCTION_INTERRUPT | + USB_FUNCTION_BFREOFF | + USB_FUNCTION_DBLBOFF | + USB_FUNCTION_CNTMDOFF | + USB_FUNCTION_SHTNAKOFF | + USB_FUNCTION_DIR_P_IN | + USB_FUNCTION_EP1, + ( ( ( 64) / 64 - 1 ) << 10 ) | 0x05u, + MAX_PACKET_SIZE_EP1, + DEVDRV_USBF_OFF | + ( 3 << USB_PIPEPERI_IITV_SHIFT ), + }, + { + EP2OUT, /*EP2: Host -> Func, BULK*/ + 3 | USB_FUNCTION_D0FIFO_USE, + USB_FUNCTION_BULK | + USB_FUNCTION_BFREOFF | + USB_FUNCTION_DBLBON | + USB_FUNCTION_CNTMDON | + USB_FUNCTION_SHTNAKON | + USB_FUNCTION_DIR_P_OUT | + USB_FUNCTION_EP2, + ( ( (2048) / 64 - 1 ) << 10 ) | 0x30u, + MAX_PACKET_SIZE_EP2, + DEVDRV_USBF_OFF | + ( 0 << USB_PIPEPERI_IITV_SHIFT ), + }, + { + EP2IN, /*EP2: Host <- Func, BULK*/ + 4 | USB_FUNCTION_D1FIFO_USE, + USB_FUNCTION_BULK | + USB_FUNCTION_BFREOFF | + USB_FUNCTION_DBLBOFF | + USB_FUNCTION_CNTMDON | + USB_FUNCTION_SHTNAKOFF | + USB_FUNCTION_DIR_P_IN | + USB_FUNCTION_EP2, + ( ( (2048) / 64 - 1 ) << 10 ) | 0x50u, + MAX_PACKET_SIZE_EP2, + DEVDRV_USBF_OFF | + ( 0 << USB_PIPEPERI_IITV_SHIFT ), + }, + { + EP3OUT, /*EP3: Host -> Func, ISO*/ + 1 | USB_FUNCTION_D0FIFO_USE, + USB_FUNCTION_ISO | + USB_FUNCTION_BFREOFF | + USB_FUNCTION_DBLBON | + USB_FUNCTION_CNTMDOFF | + USB_FUNCTION_SHTNAKON | + USB_FUNCTION_DIR_P_OUT | + USB_FUNCTION_EP3, + ( ( ( 512) / 64 - 1 ) << 10 ) | 0x10u, + MAX_PACKET_SIZE_EP3, + DEVDRV_USBF_OFF | + ( 0 << USB_PIPEPERI_IITV_SHIFT ), + }, + { + EP3IN, /*EP3: Host <- Func, ISO*/ + 2 | USB_FUNCTION_D1FIFO_USE, + USB_FUNCTION_ISO | + USB_FUNCTION_BFREOFF | + USB_FUNCTION_DBLBON | + USB_FUNCTION_CNTMDOFF | + USB_FUNCTION_SHTNAKOFF | + USB_FUNCTION_DIR_P_IN | + USB_FUNCTION_EP3, + ( ( ( 512) / 64 - 1 ) << 10 ) | 0x20u, + MAX_PACKET_SIZE_EP3, + DEVDRV_USBF_OFF | + ( 0 << USB_PIPEPERI_IITV_SHIFT ), + }, + { /*terminator*/ + 0, 0, 0, 0, 0, + }, +}; + + +/*************************************************************************/ +/* workareas */ +USBHAL * USBHAL::instance; + +static IRQn_Type int_id; /* interrupt ID */ +static uint16_t int_level; /* initerrupt level */ +static uint16_t clock_mode; /* input clock selector */ +static uint16_t mode; /* USB speed (HIGH/FULL) */ + +//static DigitalOut *usbx_en; + +static uint16_t EP0_read_status; +static uint16_t EPx_read_status; + +static uint16_t setup_buffer[MAX_PACKET_SIZE_EP0 / 2]; + +/* 0: not used / other: a pipe number to use recv_buffer*/ +static uint8_t recv_buffer[MAX_PACKET_SIZE_EPBULK]; +volatile static uint16_t recv_error; + + +/*************************************************************************/ +/* prototypes for C */ +extern "C" { + void usbx_function_BRDYInterruptPIPE0 (uint16_t status, uint16_t intenb, + USBHAL *object, void (USBHAL::*EP0func)(void)); + + void usbx_function_BRDYInterrupt (uint16_t status, uint16_t intenb, + USBHAL *object, bool (USBHAL::*epCallback[])(void)); + + void usbx_function_NRDYInterruptPIPE0(uint16_t status, uint16_t intenb, + USBHAL *object, void (USBHAL::*EP0func)(void)); + + void usbx_function_NRDYInterrupt (uint16_t status, uint16_t intenb, + USBHAL *object, bool (USBHAL::*epCallback[])(void)); + + void usbx_function_BEMPInterruptPIPE0(uint16_t status, uint16_t intenb, + USBHAL *object, void (USBHAL::*EP0func)(void)); + + void usbx_function_BEMPInterrupt (uint16_t status, uint16_t intenb, + USBHAL *object, bool (USBHAL::*epCallback[])(void)); +} + + +/*************************************************************************/ +/* macros */ + +/****************************************************************************** + * Function Name: usbx_function_BRDYInterruptPIPE0 + * Description : Executes BRDY interrupt for pipe0. + * Arguments : uint16_t status ; BRDYSTS Register Value + * : uint16_t intenb ; BRDYENB Register Value + * Return Value : none + *****************************************************************************/ +extern "C" { + void usbx_function_BRDYInterruptPIPE0 ( + uint16_t status, + uint16_t intenb, + USBHAL *object, + void (USBHAL::*EP0func)(void) + ) + { + volatile uint16_t dumy_sts; + uint16_t read_status; + + USB20X.BRDYSTS = + (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0]; + RZA_IO_RegWrite_16( + &USB20X.CFIFOSEL, USB_FUNCTION_PIPE0, + USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE); + + g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0] = + g_usbx_function_data_count[USB_FUNCTION_PIPE0]; + + read_status = usbx_function_read_buffer_c(USB_FUNCTION_PIPE0); + + g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0] -= + g_usbx_function_data_count[USB_FUNCTION_PIPE0]; + + switch (read_status) { + case USB_FUNCTION_READING: /* Continue of data read */ + case USB_FUNCTION_READEND: /* End of data read */ + /* PID = BUF */ + usbx_function_set_pid_buf(USB_FUNCTION_PIPE0); + + /*callback*/ + (object->*EP0func)(); + break; + + case USB_FUNCTION_READSHRT: /* End of data read */ + usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0); + /* PID = BUF */ + usbx_function_set_pid_buf(USB_FUNCTION_PIPE0); + + /*callback*/ + (object->*EP0func)(); + break; + + case USB_FUNCTION_READOVER: /* FIFO access error */ + /* Buffer Clear */ + USB20X.CFIFOCTR = USB_FUNCTION_BITBCLR; + usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0); + /* Req Error */ + usbx_function_set_pid_stall(USB_FUNCTION_PIPE0); + + /*callback*/ + (object->*EP0func)(); + break; + + case DEVDRV_USBF_FIFOERROR: /* FIFO access error */ + default: + usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0); + /* Req Error */ + usbx_function_set_pid_stall(USB_FUNCTION_PIPE0); + break; + } + /* Three dummy reads for clearing interrupt requests */ + dumy_sts = USB20X.BRDYSTS; + } +} + + +/****************************************************************************** + * Function Name: usbx_function_BRDYInterrupt + * Description : Executes BRDY interrupt uxclude pipe0. + * Arguments : uint16_t status ; BRDYSTS Register Value + * : uint16_t intenb ; BRDYENB Register Value + * Return Value : none + *****************************************************************************/ +extern "C" { + void usbx_function_BRDYInterrupt( + uint16_t status, + uint16_t intenb, + USBHAL *object, + bool (USBHAL::*epCallback[])(void) + ) + { + volatile uint16_t dumy_sts; + + /************************************************************** + * Function Name: usbx_function_brdy_int + * Description : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9). + * : According to the pipe that interrupt is generated in, + * : reads/writes buffer allocated in the pipe. + * : This function is executed in the BRDY + * : interrupt handler. This function + * : clears BRDY interrupt status and BEMP + * : interrupt status. + * Arguments : uint16_t Status ; BRDYSTS Register Value + * : uint16_t Int_enbl ; BRDYENB Register Value + * Return Value : none + *************************************************************/ + /* copied from usbx_function_intrn.c */ + uint32_t int_sense = 0; + uint16_t pipe; + uint16_t pipebit; + uint16_t ep; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) { + pipebit = g_usbx_function_bit_set[pipe]; + + if ((status & pipebit) && (intenb & pipebit)) { + USB20X.BRDYSTS = (uint16_t)~pipebit; + USB20X.BEMPSTS = (uint16_t)~pipebit; + + switch (g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) { + case USB_FUNCTION_D0FIFO_DMA: + if (g_usbx_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) { + /*now, DMA is not supported*/ + usbx_function_dma_interrupt_d0fifo(int_sense); + } + + if (RZA_IO_RegRead_16( + &g_usbx_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) { + /*now, DMA is not supported*/ + usbx_function_read_dma(pipe); + usbx_function_disable_brdy_int(pipe); + } else { + USB20X.D0FIFOCTR = USB_FUNCTION_BITBCLR; + g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + break; + + case USB_FUNCTION_D1FIFO_DMA: + if (g_usbx_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) { + /*now, DMA is not supported*/ + usbx_function_dma_interrupt_d1fifo(int_sense); + } + + if (RZA_IO_RegRead_16( + &g_usbx_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) { + /*now, DMA is not supported*/ + usbx_function_read_dma(pipe); + usbx_function_disable_brdy_int(pipe); + } else { + USB20X.D1FIFOCTR = USB_FUNCTION_BITBCLR; + g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + } + break; + + default: + ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT; + ep <<= 1; + if (RZA_IO_RegRead_16( + &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) { + /* read */ + EPx_read_status = DEVDRV_USBF_PIPE_WAIT; + (object->*(epCallback[ep - 2])) (); + EPx_read_status = DEVDRV_USBF_PIPE_DONE; + } else { + /* write */ + EPx_read_status = DEVDRV_USBF_PIPE_WAIT; + (object->*(epCallback[ep - 2 + 1])) (); + EPx_read_status = DEVDRV_USBF_PIPE_DONE; + usbx_function_write_buffer(pipe); + } + } + } + } + /* Three dummy reads for clearing interrupt requests */ + dumy_sts = USB20X.BRDYSTS; + } +} + + +/****************************************************************************** + * Function Name: usbx_function_NRDYInterruptPIPE0 + * Description : Executes NRDY interrupt for pipe0. + * Arguments : uint16_t status ; NRDYSTS Register Value + * : uint16_t intenb ; NRDYENB Register Value + * Return Value : none + *****************************************************************************/ +extern "C" { + void usbx_function_NRDYInterruptPIPE0( + uint16_t status, + uint16_t intenb, + USBHAL *object, + void (USBHAL::*EP0func)(void) + ) + { + volatile uint16_t dumy_sts; + + USB20X.NRDYSTS = + (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0]; + + /* Three dummy reads for clearing interrupt requests */ + dumy_sts = USB20X.NRDYSTS; + } +} + + +/****************************************************************************** + * Function Name: usbx_function_NRDYInterrupt + * Description : Executes NRDY interrupt exclude pipe0. + * Arguments : uint16_t status ; NRDYSTS Register Value + * : uint16_t intenb ; NRDYENB Register Value + * Return Value : none + *****************************************************************************/ +extern "C" { + void usbx_function_NRDYInterrupt( + uint16_t status, + uint16_t intenb, + USBHAL *object, + bool (USBHAL::*epCallback[])(void) + ) + { + volatile uint16_t dumy_sts; + + /************************************************************** + * Function Name: usbx_function_nrdy_int + * Description : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9). + * : Checks NRDY interrupt cause by PID. When the cause if STALL, + * : regards the pipe state as STALL and ends the processing. + * : Then the cause is not STALL, increments the error count to + * : communicate again. When the error count is 3, determines + * : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing. + * : This function is executed in the NRDY interrupt handler. + * : This function clears NRDY interrupt status. + * Arguments : uint16_t status ; NRDYSTS Register Value + * : uint16_t int_enb ; NRDYENB Register Value + * Return Value : none + *************************************************************/ + /* copied from usbx_function_intrn.c */ +#if 0 + uint16_t usefifo; +#endif + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; +#if 0 + uint16_t mbw; + uint32_t size; +#endif + uint16_t ep; + + bitcheck = (uint16_t)(status & intenb); + + USB20X.NRDYSTS = (uint16_t)~status; + + + if (RZA_IO_RegRead_16(&USB20X.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1) { + /* USB HOST */ + /* not support */ + + } else { + /* USB Function */ + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) { + if ((bitcheck&g_usbx_function_bit_set[pipe]) != g_usbx_function_bit_set[pipe]) { + continue; + } + + if (g_usbx_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_WAIT) { + continue; + } + +#if 0 + usbx_function_set_pid_nak(pipe); + + size = (uint32_t)g_usbx_function_data_count[pipe]; + mbw = usbx_function_get_mbw( + size, (uint32_t)g_usbx_function_data_pointer[pipe]); + + usefifo = (uint16_t)(g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE); + switch (usefifo) { + + case USB_FUNCTION_D0FIFO_USE: + usbx_function_set_curpipe( + pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw); + USB20X.D0FIFOCTR = USB_FUNCTION_BITBCLR; + break; + + case USB_FUNCTION_D1FIFO_USE: + usbx_function_set_curpipe( + pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw); + USB20X.D1FIFOCTR = USB_FUNCTION_BITBCLR; + break; + + default: + usbx_function_set_curpipe( + pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw); + USB20X.CFIFOCTR = USB_FUNCTION_BITBCLR; + break; + } + + usbx_function_aclrm(pipe); + + usbx_function_enable_nrdy_int(pipe); + usbx_function_enable_brdy_int(pipe); + + usbx_function_set_pid_buf(pipe); +#endif + + pid = usbx_function_get_pid(pipe); + if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) { + g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + } else { + usbx_function_set_pid_buf(pipe); + } + + ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT; + ep <<= 1; + if (RZA_IO_RegRead_16( + &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) { + /* read */ + __NOP(); + } else { + /* write */ + __NOP(); + } + } + } + + /* Three dummy reads for clearing interrupt requests */ + dumy_sts = USB20X.NRDYSTS; + } +} + +/****************************************************************************** + * Function Name: usbx_function_BEMPInterruptPIPE0 + * Description : Executes BEMP interrupt for pipe0. + * Arguments : uint16_t status ; BEMPSTS Register Value + * : uint16_t intenb ; BEMPENB Register Value + * Return Value : none + *****************************************************************************/ +extern "C" { + void usbx_function_BEMPInterruptPIPE0( + uint16_t status, + uint16_t intenb, + USBHAL *object, + void (USBHAL::*EP0func)(void) + ) + { + volatile uint16_t dumy_sts; + + USB20X.BEMPSTS = + (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0]; + RZA_IO_RegWrite_16( + &USB20X.CFIFOSEL, USB_FUNCTION_PIPE0, + USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE); + + /*usbx_function_write_buffer_c(USB_FUNCTION_PIPE0);*/ + (object->*EP0func)(); + + /* Three dummy reads for clearing interrupt requests */ + dumy_sts = USB20X.BEMPSTS; + } +} + + +/****************************************************************************** + * Function Name: usbx_function_BEMPInterrupt + * Description : Executes BEMP interrupt exclude pipe0. + * Arguments : uint16_t status ; BEMPSTS Register Value + * : uint16_t intenb ; BEMPENB Register Value + * Return Value : none + *****************************************************************************/ +extern "C" { + void usbx_function_BEMPInterrupt( + uint16_t status, + uint16_t intenb, + USBHAL *object, + bool (USBHAL::*epCallback[])(void) + ) + { + volatile uint16_t dumy_sts; + + /************************************************************** + * Function Name: usbx_function_bemp_int + * Description : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9). + * Arguments : uint16_t status ; BEMPSTS Register Value + * : uint16_t intenb ; BEMPENB Register Value + * Return Value : none + *************************************************************/ + /* copied from usbx_function_intrn.c */ + uint16_t pid; + uint16_t pipe; + uint16_t bitcheck; + uint16_t inbuf; + uint16_t ep; + + bitcheck = (uint16_t)(status & intenb); + + USB20X.BEMPSTS = (uint16_t)~status; + + for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) { + if ((bitcheck&g_usbx_function_bit_set[pipe]) != g_usbx_function_bit_set[pipe]) { + continue; + } + + pid = usbx_function_get_pid(pipe); + + if ((pid == DEVDRV_USBF_PID_STALL) || + (pid == DEVDRV_USBF_PID_STALL2)) { + g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL; + + } else { + inbuf = usbx_function_get_inbuf(pipe); + + if (inbuf == 0) { + usbx_function_disable_bemp_int(pipe); + usbx_function_set_pid_nak(pipe); + g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE; + + switch (g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) { + case USB_FUNCTION_D0FIFO_DMA: + /*now, DMA is not supported*/ + break; + + case USB_FUNCTION_D1FIFO_DMA: + /*now, DMA is not supported*/ + break; + + default: + ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT; + ep <<= 1; + if (RZA_IO_RegRead_16( + &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) { + /* read */ + __NOP(); + } else { + /* write */ + EPx_read_status = DEVDRV_USBF_PIPE_WAIT; + (object->*(epCallback[ep - 2 + 1])) (); + EPx_read_status = DEVDRV_USBF_PIPE_DONE; + } + } + } + } + } + + /* Three dummy reads for clearing interrupt requests */ + dumy_sts = USB20X.BEMPSTS; + } +} + +/****************************************************************************** + * Function Name: EP2PIPE + * Description : Converts from endpoint to pipe + * Arguments : number of endpoint + * Return Value : number of pipe + *****************************************************************************/ +/*EP2PIPE converter is for pipe1, pipe3 and pipe6 only.*/ +#define EP2PIPE(endpoint) ((uint32_t)usbx_function_EpToPipe(endpoint)) + + +/****************************************************************************** + * Function Name: usbx_function_save_request + * Description : Retains the USB request information in variables. + * Arguments : none + * Return Value : none + *****************************************************************************/ +#define usbx_function_save_request() \ + { \ + uint16_t *bufO = &setup_buffer[0]; \ + \ + USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVALID; \ + /*data[0] <= bmRequest, data[1] <= bmRequestType */ \ + *bufO++ = USB20X.USBREQ; \ + /*data[2] data[3] <= wValue*/ \ + *bufO++ = USB20X.USBVAL; \ + /*data[4] data[5] <= wIndex*/ \ + *bufO++ = USB20X.USBINDX; \ + /*data[6] data[6] <= wIndex*/ \ + *bufO++ = USB20X.USBLENG; \ + } + + +/*************************************************************************/ +/*************************************************************************/ +/*************************************************************************/ + +/*************************************************************************/ +/* constructor */ +USBHAL::USBHAL(void) +{ + /* ---- P4_1 : P4_1 (USB0_EN for GR-PEACH) ---- */ + //usbx_en = new DigitalOut(P4_1, 1); + + /* some constants */ + int_id = USBIX_IRQn; + int_level = ( 2 << 3 ); + clock_mode = USBFCLOCK_X1_48MHZ; +#if (USB_FUNCTION_HISPEED == 0) + mode = USB_FUNCTION_FULL_SPEED; +#else + mode = USB_FUNCTION_HIGH_SPEED; +#endif + EP0_read_status = DEVDRV_USBF_WRITEEND; + EPx_read_status = DEVDRV_USBF_PIPE_DONE; + + /* Disables interrupt for usb */ + GIC_DisableIRQ(int_id); + + /* Setup the end point */ + epCallback[ 0] = &USBHAL::EP1_OUT_callback; + epCallback[ 1] = &USBHAL::EP1_IN_callback; + epCallback[ 2] = &USBHAL::EP2_OUT_callback; + epCallback[ 3] = &USBHAL::EP2_IN_callback; + epCallback[ 4] = &USBHAL::EP3_OUT_callback; + epCallback[ 5] = &USBHAL::EP3_IN_callback; + epCallback[ 6] = &USBHAL::EP4_OUT_callback; + epCallback[ 7] = &USBHAL::EP4_IN_callback; + epCallback[ 8] = &USBHAL::EP5_OUT_callback; + epCallback[ 9] = &USBHAL::EP5_IN_callback; + epCallback[10] = &USBHAL::EP6_OUT_callback; + epCallback[11] = &USBHAL::EP6_IN_callback; + epCallback[12] = &USBHAL::EP7_OUT_callback; + epCallback[13] = &USBHAL::EP7_IN_callback; + epCallback[14] = &USBHAL::EP8_OUT_callback; + epCallback[15] = &USBHAL::EP8_IN_callback; + epCallback[16] = &USBHAL::EP9_OUT_callback; + epCallback[17] = &USBHAL::EP9_IN_callback; + epCallback[18] = &USBHAL::EP10_OUT_callback; + epCallback[19] = &USBHAL::EP10_IN_callback; + epCallback[20] = &USBHAL::EP11_OUT_callback; + epCallback[21] = &USBHAL::EP11_IN_callback; + epCallback[22] = &USBHAL::EP12_OUT_callback; + epCallback[23] = &USBHAL::EP12_IN_callback; + epCallback[24] = &USBHAL::EP13_OUT_callback; + epCallback[25] = &USBHAL::EP13_IN_callback; + epCallback[26] = &USBHAL::EP14_OUT_callback; + epCallback[27] = &USBHAL::EP14_IN_callback; + epCallback[28] = &USBHAL::EP15_OUT_callback; + epCallback[29] = &USBHAL::EP15_IN_callback; + + /* registers me */ + instance = this; + + /* Clear pipe table */ + usbx_function_clear_pipe_tbl(); + +/****************************************************************************** + * Function Name: usbx_api_function_init + * Description : Initializes the USB module in the USB function mode. + *****************************************************************************/ + /* The clock of USB0 modules is permitted */ +#if (USB_FUNCTION_CH == 0) + CPG.STBCR7 &= ~(CPG_STBCR7_MSTP71); +#else + CPG.STBCR7 &= ~(CPG_STBCR7_MSTP71 | CPG_STBCR7_MSTP70); +#endif + volatile uint8_t dummy8; + dummy8 = CPG.STBCR7; + + { +/****************************************************************************** + * Function Name: usbx_function_setting_interrupt + * Description : Sets the USB module interrupt level. + *****************************************************************************/ +#if 0 /*DMA is not supported*/ + IRQn_Type d0fifo_dmaintid; + IRQn_Type d1fifo_dmaintid; +#endif + + InterruptHandlerRegister(int_id, &_usbisr); + GIC_SetPriority(int_id, int_level); + GIC_EnableIRQ(int_id); + +#if 0 /*DMA is not supported*/ + d0fifo_dmaintid = Userdef_USB_usbx_function_d0fifo_dmaintid(); + if (d0fifo_dmaintid != 0xFFFF) { + InterruptHandlerRegister(d0fifo_dmaintid, usbx_function_dma_interrupt_d0fifo); + GIC_SetPriority(d0fifo_dmaintid, int_level); + GIC_EnableIRQ(d0fifo_dmaintid); + } +#endif + +#if 0 /*DMA is not supported*/ + d1fifo_dmaintid = Userdef_USB_usbx_function_d1fifo_dmaintid(); + if (d1fifo_dmaintid != 0xFFFF) { + InterruptHandlerRegister(d1fifo_dmaintid, usbx_function_dma_interrupt_d1fifo); + GIC_SetPriority(d1fifo_dmaintid, int_level); + GIC_EnableIRQ(d1fifo_dmaintid); + } +#endif +/*****************************************************************************/ + } + + /* reset USB module with setting tranciever and HSE=1 */ + usbx_function_reset_module(clock_mode); + + /* clear variables */ + usbx_function_init_status(); + + /* select USB Function and Interrupt Enable */ + /* Detect USB Device to attach or detach */ + usbx_function_InitModule(mode); + + { + uint16_t buf; + buf = USB20X.INTENB0; + buf |= USB_INTENB0_SOFE; + USB20X.INTENB0 = buf; + } +} + +/*************************************************************************/ +USBHAL::~USBHAL(void) +{ + /* Disables interrupt for usb */ + GIC_DisableIRQ( int_id ); + /* Unregisters interrupt function and priority */ + InterruptHandlerRegister( int_id, (uint32_t)NULL ); + + //usbx_en = NULL; + instance = NULL; +} + +/*************************************************************************/ +void USBHAL::connect(void) +{ + /* Activates USB0_EN */ + //(*usbx_en) = 0; +} + + +/*************************************************************************/ +void USBHAL::disconnect(void) +{ + /* Deactivates USB0_EN */ + //(*usbx_en) = 1; +} + + +/*************************************************************************/ +void USBHAL::configureDevice(void) +{ + /*The pipes set up in USBHAL::realiseEndpoint*/ + /*usbx_function_clear_alt();*/ /* Alternate setting clear */ + /*usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);*/ +} + + +/*************************************************************************/ +void USBHAL::unconfigureDevice(void) +{ + /* The Interface would be managed by USBDevice */ + /*usbx_function_clear_alt();*/ /* Alternate setting clear */ + /*usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);*/ +} + + +/*************************************************************************/ +void USBHAL::setAddress(uint8_t address) +{ + if (address <= 127) { + usbx_function_set_pid_buf(USB_FUNCTION_PIPE0); /* OK */ + } else { + usbx_function_set_pid_stall(USB_FUNCTION_PIPE0); /* Not Spec */ + } +} + + +/*************************************************************************/ +bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) +{ + const struct PIPECFGREC *cfg; + uint16_t pipe; + uint16_t buf; + + if ( (EP0OUT == endpoint) || (EP0IN == endpoint) ) { + return true; + } + + for (cfg = &def_pipecfg[0]; cfg->pipesel != 0; cfg++) { + if (cfg->endpoint == endpoint) { + break; + } + } + if (cfg->pipesel == 0) { + return false; + } + + pipe = ((cfg->pipesel & USB_PIPESEL_PIPESEL) >> USB_PIPESEL_PIPESEL_SHIFT); + + g_usbx_function_PipeTbl[ pipe ] = (uint16_t)(endpoint | ((cfg->pipesel & USB_FUNCTION_FIFO_USE) << 0)); + + /* There are maintenance routine of SHTNAK and BFRE bits + * in original sample program. This sample is not + * programmed. Do maintenance the "def_pipecfg" array if + * you want it. */ + + /* Interrupt Disable */ + buf = USB20X.BRDYENB; + buf &= (uint16_t)~g_usbx_function_bit_set[pipe]; + USB20X.BRDYENB = buf; + buf = USB20X.NRDYENB; + buf &= (uint16_t)~g_usbx_function_bit_set[pipe]; + USB20X.NRDYENB = buf; + buf = USB20X.BEMPENB; + buf &= (uint16_t)~g_usbx_function_bit_set[pipe]; + USB20X.BEMPENB = buf; + + usbx_function_set_pid_nak(pipe); + + /* CurrentPIPE Clear */ + if (RZA_IO_RegRead_16(&USB20X.CFIFOSEL, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE) == pipe) { + RZA_IO_RegWrite_16(&USB20X.CFIFOSEL, 0, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB20X.D0FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) { + RZA_IO_RegWrite_16(&USB20X.D0FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE); + } + + if (RZA_IO_RegRead_16(&USB20X.D1FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) { + RZA_IO_RegWrite_16(&USB20X.D1FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE); + } + + /* PIPE Configuration */ + USB20X.PIPESEL = pipe; + USB20X.PIPECFG = cfg->pipecfg; + USB20X.PIPEBUF = cfg->pipebuf; + USB20X.PIPEMAXP = cfg->pipemaxp; + USB20X.PIPEPERI = cfg->pipeperi; + + g_usbx_function_pipecfg[pipe] = cfg->pipecfg; + g_usbx_function_pipebuf[pipe] = cfg->pipebuf; + g_usbx_function_pipemaxp[pipe] = cfg->pipemaxp; + g_usbx_function_pipeperi[pipe] = cfg->pipeperi; + + /* Buffer Clear */ + usbx_function_set_sqclr(pipe); + usbx_function_aclrm(pipe); + + /* init Global */ + g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE; + g_usbx_function_PipeDataSize[pipe] = 0; + + return true; +} + + +/*************************************************************************/ +// read setup packet +void USBHAL::EP0setup(uint8_t *buffer) +{ + memcpy(buffer, setup_buffer, MAX_PACKET_SIZE_EP0); +} + + +/*************************************************************************/ +void USBHAL::EP0readStage(void) +{ + // No implements +} + + +/*************************************************************************/ +void USBHAL::EP0read(void) +{ + uint8_t *buffer; + uint32_t size; + + /* remain of last writing */ + while (EP0_read_status != DEVDRV_USBF_WRITEEND) { + static uint8_t bbb[2] = { 255, 255 }; + EP0write(&bbb[0], 0); + } + + buffer = (uint8_t*)(&setup_buffer[4]); + size = (MAX_PACKET_SIZE_EP0 / 2) - 8; + usbx_api_function_CtrlWriteStart(size, buffer); +} + + +/*************************************************************************/ +uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) +{ + memcpy(buffer, (uint8_t*)(&setup_buffer[4]), g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0]); + + return g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0]; +} + + +/*************************************************************************/ +void USBHAL::EP0write(uint8_t *buffer, uint32_t size) +{ + /* zero byte writing */ + if ( (size == 0) && (EP0_read_status == DEVDRV_USBF_WRITEEND) ) { + return; + } + + if (EP0_read_status == DEVDRV_USBF_WRITEEND) { + /*1st block*/ + EP0_read_status = usbx_api_function_CtrlReadStart(size, buffer); + } else { + /* waits the last transmission */ + /*other blocks*/ + g_usbx_function_data_count[ USB_FUNCTION_PIPE0 ] = size; + g_usbx_function_data_pointer [ USB_FUNCTION_PIPE0 ] = buffer; + EP0_read_status = usbx_function_write_buffer_c(USB_FUNCTION_PIPE0); + } + /*max size may be deblocking outside*/ + if (size == MAX_PACKET_SIZE_EP0) { + EP0_read_status = DEVDRV_USBF_WRITING; + } +} + + +/*************************************************************************/ +#if 0 // No implements +void USBHAL::EP0getWriteResult(void) +{ +} +#endif + +/*************************************************************************/ +void USBHAL::EP0stall(void) +{ + stallEndpoint( 0 ); +} + + +/*************************************************************************/ +EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t max_size) +{ + uint32_t pipe = EP2PIPE(endpoint); + uint32_t pipe_size; + uint16_t pipe_status; + EP_STATUS status = EP_COMPLETED; + + pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size); + + switch (pipe_status) { + case DEVDRV_USBF_PIPE_IDLE: + case DEVDRV_USBF_PIPE_WAIT: + usbx_api_function_set_pid_nak(pipe); + usbx_api_function_clear_pipe_status(pipe); + + usbx_api_function_start_receive_transfer(pipe, max_size, recv_buffer); + break; + + default: + status = EP_PENDING; + break; + } + + return status; +} + + +/*************************************************************************/ +EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *buffer, uint32_t *bytes_read ) +{ + uint32_t pipe = EP2PIPE(endpoint); + uint16_t pipe_status; + uint16_t err; + EP_STATUS status = EP_PENDING; + + + if (EPx_read_status != DEVDRV_USBF_PIPE_WAIT) { + return status; + } + + pipe_status = usbx_api_function_check_pipe_status(pipe, bytes_read); + switch (pipe_status) { + case DEVDRV_USBF_PIPE_IDLE: + return EP_COMPLETED; + + case DEVDRV_USBF_PIPE_DONE: + return EP_COMPLETED; + + case DEVDRV_USBF_PIPE_WAIT: + break; + + default: + return status; + } + + /* sets the output buffer and size */ + g_usbx_function_data_pointer[pipe] = buffer; + + /* receives data from pipe */ + err = usbx_function_read_buffer(pipe); + recv_error = err; + switch (err) { + case USB_FUNCTION_READEND: + case USB_FUNCTION_READSHRT: + case USB_FUNCTION_READOVER: + *bytes_read = g_usbx_function_PipeDataSize[pipe]; + break; + + case USB_FUNCTION_READING: + case DEVDRV_USBF_FIFOERROR: + break; + } + + pipe_status = usbx_api_function_check_pipe_status(pipe, bytes_read); + switch (pipe_status) { + case DEVDRV_USBF_PIPE_DONE: + status = EP_COMPLETED; + break; + + case DEVDRV_USBF_PIPE_IDLE: + case DEVDRV_USBF_PIPE_NORES: + case DEVDRV_USBF_PIPE_STALL: + case DEVDRV_USBF_FIFOERROR: + default: + break; + } + + return status; +} + + +/*************************************************************************/ +EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) +{ + uint32_t pipe = EP2PIPE(endpoint); + uint32_t pipe_size; + uint16_t pipe_status; + uint16_t err; + uint16_t count; + EP_STATUS status = EP_PENDING; + + pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size); + + /* waits the last transmission */ + count = 30000; + while ((pipe_status == DEVDRV_USBF_PIPE_WAIT) || (pipe_status == DEVDRV_USBF_PIPE_DONE)) { + pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size); + if( --count == 0 ) { + pipe_status = DEVDRV_USBF_PIPE_STALL; + break; + } + } + + switch (pipe_status) { + case DEVDRV_USBF_PIPE_IDLE: + err = usbx_api_function_start_send_transfer(pipe, size, data); + + switch (err) { + /* finish to write */ + case DEVDRV_USBF_WRITEEND: + /* finish to write, but data is short */ + case DEVDRV_USBF_WRITESHRT: + /* continue to write */ + case DEVDRV_USBF_WRITING: + /* use DMA */ + case DEVDRV_USBF_WRITEDMA: + /* error */ + case DEVDRV_USBF_FIFOERROR: + status = EP_PENDING; + break; + } + break; + + case DEVDRV_USBF_PIPE_WAIT: + case DEVDRV_USBF_PIPE_DONE: + status = EP_PENDING; + break; + + case DEVDRV_USBF_PIPE_NORES: + case DEVDRV_USBF_PIPE_STALL: + default: + status = EP_STALLED; + break; + } + + return status; +} + + +/*************************************************************************/ +EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) +{ + uint32_t pipe = EP2PIPE(endpoint); + uint32_t pipe_size; + uint16_t pipe_status; + EP_STATUS status = EP_PENDING; + + pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size); + + switch (pipe_status) { + case DEVDRV_USBF_PIPE_IDLE: + status = EP_COMPLETED; + break; + + case DEVDRV_USBF_PIPE_WAIT: + status = EP_PENDING; + break; + + case DEVDRV_USBF_PIPE_DONE: + usbx_function_stop_transfer(pipe); + status = EP_COMPLETED; + break; + + case DEVDRV_USBF_PIPE_NORES: + status = EP_STALLED; + break; + + case DEVDRV_USBF_PIPE_STALL: + status = EP_STALLED; + break; + + default: + status = EP_PENDING; + } + + return status; +} + + +/*************************************************************************/ +void USBHAL::stallEndpoint(uint8_t endpoint) +{ + uint32_t pipe = EP2PIPE(endpoint); + + usbx_function_clear_pid_stall(pipe); +} + + +/*************************************************************************/ +void USBHAL::unstallEndpoint(uint8_t endpoint) +{ + uint32_t pipe = EP2PIPE(endpoint); + + usbx_function_set_pid_stall( pipe ); +} + + +/*************************************************************************/ +bool USBHAL::getEndpointStallState(uint8_t endpoint) +{ + // No implemens + return false; +} + + +/*************************************************************************/ +#if 0 // No implements +void USBHAL::remoteWakeup(void) +{ +} +#endif + +/*************************************************************************/ +void USBHAL::_usbisr(void) +{ + instance->usbisr(); +} + + +/*************************************************************************/ +void USBHAL::usbisr(void) +{ + uint16_t int_sts0; + uint16_t int_sts1; + uint16_t int_sts2; + uint16_t int_sts3; + uint16_t int_enb0; + uint16_t int_enb2; + uint16_t int_enb3; + uint16_t int_enb4; + volatile uint16_t dumy_sts; + + + int_sts0 = USB20X.INTSTS0; + + if (!(int_sts0 & ( + USB_FUNCTION_BITVBINT | + USB_FUNCTION_BITRESM | + USB_FUNCTION_BITSOFR | + USB_FUNCTION_BITDVST | + USB_FUNCTION_BITCTRT | + USB_FUNCTION_BITBEMP | + USB_FUNCTION_BITNRDY | + USB_FUNCTION_BITBRDY ))) { + return; + } + + int_sts1 = USB20X.BRDYSTS; + int_sts2 = USB20X.NRDYSTS; + int_sts3 = USB20X.BEMPSTS; + int_enb0 = USB20X.INTENB0; + int_enb2 = USB20X.BRDYENB; + int_enb3 = USB20X.NRDYENB; + int_enb4 = USB20X.BEMPENB; + + if ((int_sts0 & USB_FUNCTION_BITRESM) && + (int_enb0 & USB_FUNCTION_BITRSME)) { + USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITRESM; + RZA_IO_RegWrite_16(&USB20X.INTENB0, 0, USB_INTENB0_RSME_SHIFT, USB_INTENB0_RSME); + /*usbx_function_USB_FUNCTION_Resume();*/ + suspendStateChanged(1); + } else if ( + (int_sts0 & USB_FUNCTION_BITVBINT) && + (int_enb0 & USB_FUNCTION_BITVBSE)) { + USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVBINT; + + if (usbx_function_CheckVBUStaus() == DEVDRV_USBF_ON) { + usbx_function_USB_FUNCTION_Attach(); + } else { + usbx_function_USB_FUNCTION_Detach(); + } + } else if ( + (int_sts0 & USB_FUNCTION_BITSOFR) && + (int_enb0 & USB_FUNCTION_BITSOFE)) { + USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITSOFR; + SOF((USB20X.FRMNUM & USB_FRMNUM_FRNM) >> USB_FRMNUM_FRNM_SHIFT); + } else if ( + (int_sts0 & USB_FUNCTION_BITDVST) && + (int_enb0 & USB_FUNCTION_BITDVSE)) { + USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITDVST; + switch (int_sts0 & USB_FUNCTION_BITDVSQ) { + case USB_FUNCTION_DS_POWR: + break; + + case USB_FUNCTION_DS_DFLT: + /***************************************************************************** + * Function Name: usbx_function_USB_FUNCTION_BusReset + * Description : This function is executed when the USB device is transitioned + * : to POWERD_STATE. Sets the device descriptor according to the + * : connection speed determined by the USB reset hand shake. + * Arguments : none + * Return Value : none + *****************************************************************************/ + usbx_function_init_status(); /* memory clear */ + +#if 0 + /* You would program those steps in USBCallback_busReset + * if the system need the comment out steps. + */ + + if (usbx_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) { + /* Device Descriptor reset */ + usbx_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED); + } else { + /* Device Descriptor reset */ + usbx_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED); + } +#endif + /* Default Control PIPE reset */ + /***************************************************************************** + * Function Name: usbx_function_ResetDCP + * Description : Initializes the default control pipe(DCP). + * Outline : Reset default control pipe + * Arguments : none + * Return Value : none + *****************************************************************************/ + USB20X.DCPCFG = 0; + USB20X.DCPMAXP = 64; /*TODO: This value is copied from sample*/ + + USB20X.CFIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB20X.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + USB20X.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE); + + busReset(); + break; + + case USB_FUNCTION_DS_ADDS: + break; + + case USB_FUNCTION_DS_CNFG: + break; + + case USB_FUNCTION_DS_SPD_POWR: + case USB_FUNCTION_DS_SPD_DFLT: + case USB_FUNCTION_DS_SPD_ADDR: + case USB_FUNCTION_DS_SPD_CNFG: + suspendStateChanged(0); + /*usbx_function_USB_FUNCTION_Suspend();*/ + break; + + default: + break; + } + } else if ( + (int_sts0 & USB_FUNCTION_BITBEMP) && + (int_enb0 & USB_FUNCTION_BITBEMP) && + ((int_sts3 & int_enb4) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) { + /* ==== BEMP PIPE0 ==== */ + usbx_function_BEMPInterruptPIPE0(int_sts3, int_enb4, this, &USBHAL::EP0in); + } else if ( + (int_sts0 & USB_FUNCTION_BITBRDY) && + (int_enb0 & USB_FUNCTION_BITBRDY) && + ((int_sts1 & int_enb2) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) { + /* ==== BRDY PIPE0 ==== */ + usbx_function_BRDYInterruptPIPE0(int_sts1, int_enb2, this, &USBHAL::EP0out); + } else if ( + (int_sts0 & USB_FUNCTION_BITNRDY) && + (int_enb0 & USB_FUNCTION_BITNRDY) && + ((int_sts2 & int_enb3) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) { + /* ==== NRDY PIPE0 ==== */ + usbx_function_NRDYInterruptPIPE0(int_sts2, int_enb3, this, NULL); + } else if ( + (int_sts0 & USB_FUNCTION_BITCTRT) && (int_enb0 & USB_FUNCTION_BITCTRE)) { + int_sts0 = USB20X.INTSTS0; + USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITCTRT; + + if (((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) || + ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) || + ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND)) { + + /* remake EP0 into buffer */ + usbx_function_save_request(); + if ((USB20X.INTSTS0 & USB_FUNCTION_BITVALID) && ( + ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) || + ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) || + ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND))) { + /* New SETUP token received */ + /* Three dummy reads for cleearing interrupt requests */ + dumy_sts = USB20X.INTSTS0; + dumy_sts = USB20X.INTSTS0; + dumy_sts = USB20X.INTSTS0; + return; + } + } + + switch (int_sts0 & USB_FUNCTION_BITCTSQ) { + case USB_FUNCTION_CS_IDST: + if (g_usbx_function_TestModeFlag == DEVDRV_USBF_YES) { + /* ==== Test Mode ==== */ + usbx_function_USB_FUNCTION_TestMode(); + } + /* Needs not procedure in this state */ + break; + + case USB_FUNCTION_CS_RDDS: + /* Reads a setup packet */ + EP0setupCallback(); + break; + + case USB_FUNCTION_CS_WRDS: + /* Original code was the SetDescriptor was called */ + EP0setupCallback(); + break; + + case USB_FUNCTION_CS_WRND: + EP0setupCallback(); + + /*The EP0setupCallback should finish in successful */ + usbx_function_set_pid_buf(USB_FUNCTION_PIPE0); + + RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL); + break; + + case USB_FUNCTION_CS_RDSS: + RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL); + break; + + case USB_FUNCTION_CS_WRSS: + RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL); + break; + + case USB_FUNCTION_CS_SQER: + usbx_function_set_pid_stall(USB_FUNCTION_PIPE0); + break; + + default: + usbx_function_set_pid_stall(USB_FUNCTION_PIPE0); + break; + } + } else if ( + (int_sts0 & USB_FUNCTION_BITBEMP) && + (int_enb0 & USB_FUNCTION_BITBEMP) && + (int_sts3 & int_enb4) ) { + /* ==== BEMP PIPEx ==== */ + usbx_function_BEMPInterrupt(int_sts3, int_enb4, this, epCallback); + } else if ( + (int_sts0 & USB_FUNCTION_BITBRDY) && + (int_enb0 & USB_FUNCTION_BITBRDY) && + (int_sts1 & int_enb2) ) { + /* ==== BRDY PIPEx ==== */ + usbx_function_BRDYInterrupt(int_sts1, int_enb2, this, epCallback); + } else if ( + (int_sts0 & USB_FUNCTION_BITNRDY) && + (int_enb0 & USB_FUNCTION_BITNRDY) && + (int_sts2 & int_enb3)) { + /* ==== NRDY PIPEx ==== */ + usbx_function_NRDYInterrupt(int_sts2, int_enb3, this, epCallback); + } else { + /* Do Nothing */ + } + + /* Three dummy reads for cleearing interrupt requests */ + dumy_sts = USB20X.INTSTS0; + dumy_sts = USB20X.INTSTS1; +} + +/*************************************************************************/ +#endif +/*************************************************************************/ +/*EOF*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/USBHAL_STM32F103RB.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F2/TARGET_NUCLEO_F207ZG/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F2/TARGET_NUCLEO_F207ZG/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/TARGET_NUCLEO_F303ZE/USBHAL_STM32F303ZE.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/TARGET_NUCLEO_F303ZE/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TARGET_NUCLEO_F401RE/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,20 @@ +/* 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. +*/ +#define USBHALHOST_64pins +#include "USBHALHost_STM_144_64pins.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TARGET_NUCLEO_F401RE/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F407xG/TARGET_DISCO_F407VG/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_NUCLEO_F411RE/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,39 @@ +/* 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. +*/ + +/* 144 pins boards */ +#if defined(TARGET_NUCLEO_F429ZI) || defined(TARGET_NUCLEO_F446ZE) || defined(TARGET_NUCLEO_F207ZG) \ +|| defined(TARGET_NUCLEO_F767ZI) || defined(TARGET_NUCLEO_F746ZG) || defined(TARGET_NUCLEO_F412ZG) +#include "USBHALHost_STM_144_64pins.h" +#endif + +/* 64 pins boards */ +#if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_L476RG) || defined(TARGET_NUCLEO_F411RE) +#define USBHALHOST_64pins +#include "USBHALHost_STM_144_64pins.h" +#endif + +/* DISCO board */ + +#ifdef TARGET_DISCO_F429ZI +#include "USBHALHost_DISCOF429ZI.h" +#endif + +#ifdef TARGET_DISCO_L476VG +#include "USBHALHost_DISCOL476VG.h" +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_NUCLEO_F411RE/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/TARGET_NUCLEO_F412ZG/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/TARGET_NUCLEO_F412ZG/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_DISCO_F429ZI/USBHALHost_DISCOF429ZI.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,112 @@ +/* mbed USBHost Library + * Copyright (c) 2006-2013 ARM Limited + * + * 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 USBHALHOST_DISCOF429ZI +#define USBHALHOST_DISCOF429ZI + +#define USBHAL_IRQn OTG_HS_IRQn + +#define HCCA_SIZE sizeof(HCD_HandleTypeDef) +#define ED_SIZE sizeof(HCED) +#define TD_SIZE sizeof(HCTD) + +#define TOTAL_SIZE (HCCA_SIZE + (MAX_ENDPOINT*ED_SIZE) + (MAX_TD*TD_SIZE)) +/* STM device FS have 11 channels (definition is for 60 channels) */ +static volatile uint8_t usb_buf[TOTAL_SIZE]; +typedef struct +{ + /* store the request ongoing on each endpoit */ + /* 1st field of structure avoid giving knowledge of all structure to + * endpoint */ + volatile uint32_t addr[MAX_ENDPOINT]; + USBHALHost *inst; + void (USBHALHost::*deviceConnected)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent); + void (USBHALHost::*deviceDisconnected)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); + void (USBHALHost::*transferCompleted)(volatile uint32_t addr); +}USBHALHost_Private_t; +/* CONFIGURATION for USB_VBUS + * on 64 bits board PC_0 is used (0 VBUS on, 1 VBUS off) + * on 144 pins board PG_6 is used ( 1 VBUS on, 0 VBUS on) + */ +static gpio_t gpio_vbus; + +#define VBUS_OFF 1 +#define VBUS_ON 0 +#define USB_VBUS_CONFIG \ + do {__HAL_RCC_GPIOC_CLK_ENABLE();\ + gpio_init_out_ex(&gpio_vbus, PC_4, VBUS_OFF);\ + }while(0); + + +void usb_vbus( uint8_t state) +{ + if(state == 0) + { + gpio_write(&gpio_vbus, VBUS_OFF); + } + else + { + gpio_write(&gpio_vbus, VBUS_ON); + } + wait(0.2); +} + + +USBHALHost::USBHALHost() { + gpio_t pin_vbus; + instHost = this; + HCD_HandleTypeDef *hhcd; + USBHALHost_Private_t *HALPriv = new(USBHALHost_Private_t); + memset(HALPriv, 0, sizeof(USBHALHost_Private_t)); + memInit(); + memset((void*)usb_hcca, 0, HCCA_SIZE); + hhcd = (HCD_HandleTypeDef *)usb_hcca; + hhcd->Instance = USB_OTG_HS; + hhcd->pData = (void*)HALPriv; + hhcd->Init.Host_channels = 11; + /* for now failed with dma */ + hhcd->Init.dma_enable = 0; + hhcd->Init.speed = HCD_SPEED_HIGH; + hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; + hhcd->Init.use_external_vbus = 1; + HALPriv->inst = this; + HALPriv->deviceConnected = &USBHALHost::deviceConnected; + HALPriv->deviceDisconnected = &USBHALHost::deviceDisconnected; + HALPriv->transferCompleted = &USBHALHost::transferCompleted; + for (int i = 0; i < MAX_ENDPOINT; i++) { + edBufAlloc[i] = false; + HALPriv->addr[i]=(uint32_t)-1; + } + for (int i = 0; i < MAX_TD; i++) { + tdBufAlloc[i] = false; + } + /* Configure USB HS GPIOs */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*USB DM and DP */ + pin_function(PB_14, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_OTG_HS_FS)); + pin_function(PB_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_OTG_HS_FS)); + /* Configure VBUS Pin */ + gpio_init_in(&pin_vbus, PB_13); + /* Configure POWER_SWITCH IO pin */ + USB_VBUS_CONFIG; + /* Enable USB HS Clocks */ + __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); + + /* Set USBFS Interrupt priority */ + HAL_NVIC_SetPriority(USBHAL_IRQn, 5, 0); + NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr); +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_DISCO_F429ZI/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_DISCOF429ZI.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_NUCLEO_F429ZI/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/TARGET_NUCLEO_F429ZI/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_NUCLEO_F439ZI/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_NUCLEO_F439ZI/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446RE/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446RE/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446ZE/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/TARGET_NUCLEO_F446ZE/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/TARGET_NUCLEO_F746ZG/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/TARGET_NUCLEO_F746ZG/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F756xG/TARGET_NUCLEO_F756ZG/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F756xG/TARGET_NUCLEO_F756ZG/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F767xI/TARGET_NUCLEO_F767ZI/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_STM_144_64pins.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F767xI/TARGET_NUCLEO_F767ZI/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/TARGET_DISCO_F769NI/USBHAL_STM32F769NI.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/TARGET_DISCO_F769NI/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/USBHAL_STM32L053C8.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHALHost_DISCOL476VG.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,118 @@ +/* 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 USBHALHOST_DISCOL476VG +#define USBHALHOST_DISCOL476VG + +#define USBHAL_IRQn OTG_FS_IRQn + +#define HCCA_SIZE sizeof(HCD_HandleTypeDef) +#define ED_SIZE sizeof(HCED) +#define TD_SIZE sizeof(HCTD) + +#define TOTAL_SIZE (HCCA_SIZE + (MAX_ENDPOINT*ED_SIZE) + (MAX_TD*TD_SIZE)) +/* STM device FS have 11 channels (definition is for 60 channels) */ +static volatile uint8_t usb_buf[TOTAL_SIZE]; +typedef struct +{ + /* store the request ongoing on each endpoit */ + /* 1st field of structure avoid giving knowledge of all structure to + * endpoint */ + volatile uint32_t addr[MAX_ENDPOINT]; + USBHALHost *inst; + void (USBHALHost::*deviceConnected)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent); + void (USBHALHost::*deviceDisconnected)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); + void (USBHALHost::*transferCompleted)(volatile uint32_t addr); +}USBHALHost_Private_t; + +static gpio_t gpio_vbus; + +#define VBUS_OFF 1 +#define VBUS_ON 0 +#define USB_VBUS_CONFIG \ + do {\ + gpio_init_out_ex(&gpio_vbus, PC_9, VBUS_OFF);\ + }while(0); + + +void usb_vbus( uint8_t state) +{ + if(state == 0) + { + gpio_write(&gpio_vbus, VBUS_OFF); + } + else + { + gpio_write(&gpio_vbus, VBUS_ON); + } + wait(0.2); +} + + +USBHALHost::USBHALHost() { + instHost = this; + HCD_HandleTypeDef *hhcd; + USBHALHost_Private_t *HALPriv = new(USBHALHost_Private_t); + memset(HALPriv, 0, sizeof(USBHALHost_Private_t)); + memInit(); + memset((void*)usb_hcca, 0, HCCA_SIZE); + hhcd = (HCD_HandleTypeDef *)usb_hcca; + hhcd->Instance = USB_OTG_FS; + hhcd->pData = (void*)HALPriv; + hhcd->Init.Host_channels = 11; + /* for now failed with dma */ + hhcd->Init.dma_enable = 0; + hhcd->Init.speed = HCD_SPEED_FULL; + hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; + hhcd->Init.use_external_vbus = 1; + HALPriv->inst = this; + HALPriv->deviceConnected = &USBHALHost::deviceConnected; + HALPriv->deviceDisconnected = &USBHALHost::deviceDisconnected; + HALPriv->transferCompleted = &USBHALHost::transferCompleted; + for (int i = 0; i < MAX_ENDPOINT; i++) { + edBufAlloc[i] = false; + HALPriv->addr[i]=(uint32_t)-1; + } + for (int i = 0; i < MAX_TD; i++) { + tdBufAlloc[i] = false; + } + __HAL_RCC_PWR_CLK_ENABLE(); +#ifdef TARGET_STM32L4 + HAL_PWREx_EnableVddUSB(); +#endif + + /* Configure USB HS GPIOs */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*USB DM and DP */ + 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 */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + pin_function(PC_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); + /* Configure POWER_SWITCH IO pin */ + USB_VBUS_CONFIG; + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* Enable USB FS Clocks */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + /* Set USBFS Interrupt priority */ + HAL_NVIC_SetPriority(USBHAL_IRQn, 5, 0); + NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr); +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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 "USBHALHost_DISCOL476VG.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHAL_STM32L476VG.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_DISCO_L476VG/USBHAL_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_NUCLEO_L476RG/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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. +*/ +#define USBHALHOST_64pins +#include "USBHALHost_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L486xG/TARGET_NUCLEO_L486RG/USBHALHost_STM_TARGET.h Fri Apr 28 17:01:10 2017 +0000 @@ -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. +*/ +#define USBHALHOST_64pins +#include "USBHALHost_STM_144_64pins.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/USBEndpoints_STM32.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,67 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#define NUMBER_OF_LOGICAL_ENDPOINTS (4) +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) + +/* Define physical endpoint numbers */ + +/* Endpoint No. Type(s) MaxPacket DoubleBuffer */ +/* ---------------- ------------ ---------- --- */ +#define EP0OUT (0) /* Control 64 No */ +#define EP0IN (1) /* Control 64 No */ +#define EP1OUT (2) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP1IN (3) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP2OUT (4) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP2IN (5) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP3OUT (6) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP3IN (7) /* Int/Bulk/Iso 64/64/1023 Yes */ + +/* Maximum Packet sizes */ +#define MAX_PACKET_SIZE_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/USBDevice/targets/TARGET_STM/USBEndpoints_STM32F4.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,67 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#define NUMBER_OF_LOGICAL_ENDPOINTS (4) +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) + +/* Define physical endpoint numbers */ + +/* Endpoint No. Type(s) MaxPacket DoubleBuffer */ +/* ---------------- ------------ ---------- --- */ +#define EP0OUT (0) /* Control 64 No */ +#define EP0IN (1) /* Control 64 No */ +#define EP1OUT (2) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP1IN (3) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP2OUT (4) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP2IN (5) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP3OUT (6) /* Int/Bulk/Iso 64/64/1023 Yes */ +#define EP3IN (7) /* Int/Bulk/Iso 64/64/1023 Yes */ + +/* Maximum Packet sizes */ + +#define MAX_PACKET_SIZE_EP0 (64) +#define MAX_PACKET_SIZE_EP1 (64) /* Int/Bulk */ +#define MAX_PACKET_SIZE_EP2 (64) /* Int/Bulk */ +#define MAX_PACKET_SIZE_EP3 (64) /* Int/Bulk */ + +#define MAX_PACKET_SIZE_EP1_ISO (1023) /* Isochronous */ +#define MAX_PACKET_SIZE_EP2_ISO (1023) /* Isochronous */ +#define MAX_PACKET_SIZE_EP3_ISO (1023) /* Isochronous */ + +/* Generic endpoints - intended to be portable accross devices */ +/* and be suitable for simple USB devices. */ + +/* Bulk endpoint */ +#define EPBULK_OUT (EP2OUT) +#define EPBULK_IN (EP2IN) +#define EPBULK_OUT_callback EP2_OUT_callback +#define EPBULK_IN_callback EP2_IN_callback +/* Interrupt endpoint */ +#define EPINT_OUT (EP1OUT) +#define EPINT_IN (EP1IN) +#define EPINT_OUT_callback EP1_OUT_callback +#define EPINT_IN_callback EP1_IN_callback +/* Isochronous endpoint */ +#define EPISO_OUT (EP3OUT) +#define EPISO_IN (EP3IN) +#define EPISO_OUT_callback EP3_OUT_callback +#define EPISO_IN_callback EP3_IN_callback + +#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) +#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) +#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3_ISO)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/USBHALHost_STM_144_64pins.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,121 @@ +/* mbed USBHost Library + * Copyright (c) 2006-2013 ARM Limited + * + * 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 USBHALHOST_STM32_144_64 +#define USBHALHOST_STM32_144_64 + +#define USBHAL_IRQn OTG_FS_IRQn + +#define HCCA_SIZE sizeof(HCD_HandleTypeDef) +#define ED_SIZE sizeof(HCED) +#define TD_SIZE sizeof(HCTD) + +#define TOTAL_SIZE (HCCA_SIZE + (MAX_ENDPOINT*ED_SIZE) + (MAX_TD*TD_SIZE)) +/* STM device FS have 11 channels (definition is for 60 channels) */ +static volatile uint8_t usb_buf[TOTAL_SIZE]; +typedef struct +{ + /* store the request ongoing on each endpoit */ + /* 1st field of structure avoid giving knowledge of all structure to + * endpoint */ + volatile uint32_t addr[MAX_ENDPOINT]; + USBHALHost *inst; + void (USBHALHost::*deviceConnected)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent); + void (USBHALHost::*deviceDisconnected)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); + void (USBHALHost::*transferCompleted)(volatile uint32_t addr); +}USBHALHost_Private_t; + +/* CONFIGURATION for USB_VBUS + * on 64 bits board PC_0 is used (0 VBUS on, 1 VBUS off) + * on 144 pins board PG_6 is used ( 1 VBUS on, 0 VBUS on) + */ +static gpio_t gpio_vbus; + +#if defined(USBHALHOST_64pins) +#define VBUS_OFF 1 +#define VBUS_ON 0 +#define USB_VBUS_CONFIG \ + do {__HAL_RCC_GPIOC_CLK_ENABLE();\ + gpio_init_out_ex(&gpio_vbus, PC_0, VBUS_OFF);\ + }while(0); +#else +#define VBUS_OFF 0 +#define VBUS_ON 1 +#define USB_VBUS_CONFIG \ + do {__HAL_RCC_GPIOG_CLK_ENABLE();\ + gpio_init_out_ex(&gpio_vbus, PG_6, VBUS_OFF);\ + }while(0); +#endif + +void usb_vbus( uint8_t state) +{ + if(state == 0) + { + gpio_write(&gpio_vbus, VBUS_OFF); + } + else + { + gpio_write(&gpio_vbus, VBUS_ON); + } + wait(0.2); +} + +USBHALHost::USBHALHost() { + instHost = this; + HCD_HandleTypeDef *hhcd; + USBHALHost_Private_t *HALPriv = new(USBHALHost_Private_t); + memset(HALPriv, 0, sizeof(USBHALHost_Private_t)); + memInit(); + memset((void*)usb_hcca, 0, HCCA_SIZE); + hhcd = (HCD_HandleTypeDef *)usb_hcca; + hhcd->Instance = USB_OTG_FS; + hhcd->pData = (void*)HALPriv; + hhcd->Init.Host_channels = 11; + hhcd->Init.speed = HCD_SPEED_FULL; + hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; + HALPriv->inst = this; + HALPriv->deviceConnected = &USBHALHost::deviceConnected; + HALPriv->deviceDisconnected = &USBHALHost::deviceDisconnected; + HALPriv->transferCompleted = &USBHALHost::transferCompleted; + for (int i = 0; i < MAX_ENDPOINT; i++) { + edBufAlloc[i] = false; + HALPriv->addr[i]=(uint32_t)-1; + } + for (int i = 0; i < MAX_TD; i++) { + tdBufAlloc[i] = false; + } + __HAL_RCC_PWR_CLK_ENABLE(); +#ifdef TARGET_STM32L4 + HAL_PWREx_EnableVddUSB(); +#endif + /* Configure USB FS GPIOs */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*USB DM and DP */ + 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)); + /*USB ID */ + pin_function(PA_10, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)); + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + /* Configure POWER_SWITCH IO pin */ + USB_VBUS_CONFIG; + /* Enable USB FS Clocks */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + + /* Set USBFS Interrupt priority */ + HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0); +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/USBHAL_STM32.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_STM/USBHAL_STM32F4.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,416 @@ +/* Copyright (c) 2010-2011 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#if defined(TARGET_STM32F4) && !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/USBDevice/targets/TARGET_STM/USBHAL_STM_144_64pins.h Fri Apr 28 17:01:10 2017 +0000 @@ -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)); + 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 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_STM/USBRegs_STM32.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,149 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief hardware registers + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> + * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +#ifndef __USB_OTG_REGS_H__ +#define __USB_OTG_REGS_H__ + +typedef struct //000h +{ + __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/ + __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ + __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ + __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ + __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ + __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ + __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/ + __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ + uint32_t Reserved30[2]; /* Reserved 030h*/ + __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ + __IO uint32_t CID; /* User ID Register 03Ch*/ + uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ + __IO uint32_t DIEPTXF[3];/* dev Periodic Transmit FIFO */ +} +USB_OTG_GREGS; + +typedef struct // 800h +{ + __IO uint32_t DCFG; /* dev Configuration Register 800h*/ + __IO uint32_t DCTL; /* dev Control Register 804h*/ + __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ + uint32_t Reserved0C; /* Reserved 80Ch*/ + __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ + __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ + __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ + __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ + uint32_t Reserved20; /* Reserved 820h*/ + uint32_t Reserved9; /* Reserved 824h*/ + __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ + __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ + __IO uint32_t DTHRCTL; /* dev thr 830h*/ + __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ +} +USB_OTG_DREGS; + +typedef struct +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ + uint32_t Reserved14; + __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ + uint32_t Reserved1C; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ +} +USB_OTG_INEPREGS; + +typedef struct +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + uint32_t Reserved14[3]; +} +USB_OTG_OUTEPREGS; + +typedef struct +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HREGS; + +typedef struct +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + uint32_t Reserved[3]; +} +USB_OTG_HC_REGS; + +typedef struct +{ + USB_OTG_GREGS GREGS; + uint32_t RESERVED0[188]; + USB_OTG_HREGS HREGS; + uint32_t RESERVED1[9]; + __IO uint32_t HPRT; + uint32_t RESERVED2[47]; + USB_OTG_HC_REGS HC_REGS[8]; + uint32_t RESERVED3[128]; + USB_OTG_DREGS DREGS; + uint32_t RESERVED4[50]; + USB_OTG_INEPREGS INEP_REGS[4]; + uint32_t RESERVED5[96]; + USB_OTG_OUTEPREGS OUTEP_REGS[4]; + uint32_t RESERVED6[160]; + __IO uint32_t PCGCCTL; + uint32_t RESERVED7[127]; + __IO uint32_t FIFO[4][1024]; +} +USB_OTG_CORE_REGS; + + +#define OTG_FS_BASE (AHB2PERIPH_BASE + 0x0000) +#define OTG_FS ((USB_OTG_CORE_REGS *) OTG_FS_BASE) + +#endif //__USB_OTG_REGS_H__ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/USBEndpoints_EFM32.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,65 @@ + +#ifndef TARGET_EFM32HG_STK3400 +# define NUMBER_OF_LOGICAL_ENDPOINTS (6) +#else +# define NUMBER_OF_LOGICAL_ENDPOINTS (3) +#endif + +#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) +#define NUMBER_OF_ENDPOINTS (NUMBER_OF_PHYSICAL_ENDPOINTS + 2) /* Includes EP0 */ + +#define EP0OUT (0) +#define EP0IN (1) +#define EP1OUT (2) +#define EP1IN (3) +#define EP2OUT (4) +#define EP2IN (5) +#define EP3OUT (6) +#define EP3IN (7) +#ifndef TARGET_EFM32HG_STK3400 +# define EP4OUT (8) +# define EP4IN (9) +# define EP5OUT (10) +# define EP5IN (11) +# define EP6OUT (12) +# define EP6IN (13) +#endif + +#define USB_EP_TO_INDEX(ep) (ep) +#define USB_EP_TO_ADDR(ep) (((ep)>>1) | (((ep) & 1 ) ? 0x80 : 0x00)) +#define USB_ADDR_TO_EP(ep) (((ep)<<1) | (((ep) & 0x80) ? 0x01 : 0x00)) + +/* Maximum Packet sizes */ + +#define MAX_PACKET_SIZE_EP0 64 +#define MAX_PACKET_SIZE_EP1 64 +#define MAX_PACKET_SIZE_EP2 64 +#define MAX_PACKET_SIZE_EP3 64 +#ifndef TARGET_EFM32HG_STK3400 +# define MAX_PACKET_SIZE_EP4 64 +# define MAX_PACKET_SIZE_EP5 64 +# define MAX_PACKET_SIZE_EP6 64 +#endif + +/* Generic endpoints - intended to be portable accross devices */ +/* and be suitable for simple USB devices. */ + +/* Bulk endpoints */ +#define EPBULK_OUT EP2OUT +#define EPBULK_IN EP2IN +#define EPBULK_OUT_callback EP2_OUT_callback +#define EPBULK_IN_callback EP2_IN_callback +/* Interrupt endpoints */ +#define EPINT_OUT EP1OUT +#define EPINT_IN EP1IN +#define EPINT_OUT_callback EP1_OUT_callback +#define EPINT_IN_callback EP1_IN_callback +/* Isochronous endpoints */ +#define EPISO_OUT EP3OUT +#define EPISO_IN EP3IN +#define EPISO_OUT_callback EP3_OUT_callback +#define EPISO_IN_callback EP3_IN_callback + +#define MAX_PACKET_SIZE_EPBULK 64 +#define MAX_PACKET_SIZE_EPINT 64 +#define MAX_PACKET_SIZE_EPISO 1023
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/USBHAL_EFM32.cpp Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,775 @@ +/* Copyright 2015 Silicon Labs, http://www.silabs.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined TARGET_EFM32GG_STK3700 || \ + defined TARGET_EFM32LG_STK3600 || \ + defined TARGET_EFM32WG_STK3800 || \ + defined TARGET_EFM32HG_STK3400 + +#include "USBHAL.h" +#include "em_usb.h" +#include "em_usbtypes.h" +#include "em_usbhal.h" +#include "em_usbd.h" + +#include "sleepmodes.h" + +enum USBISRCommand { + CMD_HANDLED = 0, + CMD_EP0SETUP, + CMD_EP0IN, + CMD_EP0OUT, + CMD_EP_XFER_COMPLETED, + CMD_SOF, + CMD_BUSRESET, + CMD_SUSPEND_STATE_CHANGED, + CMD_ENUM_END_MARKER +}; + +enum IEPStatus { + NOT_CONFIGURED = 0, + IDLE = 1, + READ_PENDING = 2, + WRITE_PENDING = 3, + READ_COMPLETE = 4, + WRITE_COMPLETE = 5, + FAILED_INVALID = 6, + FAILED_STALLED = 7 +}; + +typedef struct { + IEPStatus status; + uint32_t byte_count; + uint32_t max_packet; + USB_XferCompleteCb_TypeDef intern_cb; + uint8_t *data_buf; +} ep_state_t; + +USBHAL * USBHAL::instance; +static uint8_t ep0setupdata[8]; +static ep_state_t ep_state[NUMBER_OF_ENDPOINTS]; +#ifdef USB_USE_DYNAMIC_MEMORY +static uint8_t ep0in_data_buf[MAX_PACKET_SIZE_EP0] __attribute__ ((aligned (4))); +static uint8_t ep0out_data_buf[MAX_PACKET_SIZE_EP0]; // FIXME: does this need to be this big? +#else +static uint8_t ep_data_buf[NUMBER_OF_ENDPOINTS][64] __attribute__ ((aligned (4))); +#endif + +static void run_cmd(USBISRCommand cmd, uint32_t param); +static void (*isrptr)() = NULL; +static USBISRCommand usb_isrcmd = CMD_HANDLED; +static uint32_t usb_isrcmd_param = 0; + +extern "C" void usbhal_allow_em2(bool allow_em2); + +#ifdef DEBUG_USB_API +#define TRACE(fmt,...) printf("USB: %s: " fmt "\n", __func__, __VA_ARGS__); +#define TRACE_FUNC_IN printf("USB: > %s\n",__func__); +#define TRACE_FUNC_IN_P(fmt, ...) printf("USB: > %s: " fmt "\n", __func__, __VA_ARGS__); +#else +#define TRACE(fmt,...) +#define TRACE_FUNC_IN +#define TRACE_FUNC_IN_P(fmt, ...) +#endif + +static EP_STATUS internEndpointRead(uint8_t ep, uint32_t maxSize); + +static int usbhal_xfer_complete_cb(uint8_t epaddr, USB_Status_TypeDef status, + uint32_t xferred, uint32_t remaining); +static void usbhal_free_buffers(void); + +/* Internal EP transfer complete callbacks */ +#define EPCB(n) static int usbhal_xfer_complete_cb_##n(USB_Status_TypeDef status, \ + uint32_t xferred, uint32_t remaining) { \ + return usbhal_xfer_complete_cb(n, status, xferred, remaining); \ +} +/* ------^ */ +EPCB(EP0OUT) +EPCB(EP0IN) +EPCB(EP1OUT) +EPCB(EP1IN) +EPCB(EP2OUT) +EPCB(EP2IN) +EPCB(EP3OUT) +EPCB(EP3IN) +#ifndef TARGET_EFM32HG_STK3400 +EPCB(EP4OUT) +EPCB(EP4IN) +EPCB(EP5OUT) +EPCB(EP5IN) +EPCB(EP6OUT) +EPCB(EP6IN) +#endif + +static inline bool is_aligned(const void *pointer, size_t byte_count) +{ + return ((uintptr_t)pointer % byte_count == 0); +} + +USBHAL::USBHAL(void) +{ + TRACE_FUNC_IN; + + isrptr = &USBHAL::_usbisr; + + if (instance) { + TRACE("Assert self failed! instance=%p", instance); + abort(); + } + instance = this; + + // When USB is active, we can't go below EM1. This block may + // be dynamically removed/reinstated to allow deeper sleep. + usbhal_allow_em2(false); + + // When in suspend / Vbus off we can go to EM2, but never below + // that as long as USB is being used. Despite the name the call here + // blocks entering modes _below_ EM2, but allows EM2. + blockSleepMode(EM2); + + epCallback[EP0OUT] = NULL; + epCallback[EP0IN ] = NULL; + epCallback[EP1OUT] = &USBHAL::EP1_OUT_callback; + epCallback[EP1IN ] = &USBHAL::EP1_IN_callback; + epCallback[EP2OUT] = &USBHAL::EP2_OUT_callback; + epCallback[EP2IN ] = &USBHAL::EP2_IN_callback; + epCallback[EP3OUT] = &USBHAL::EP3_OUT_callback; + epCallback[EP3IN ] = &USBHAL::EP3_IN_callback; +#ifndef TARGET_EFM32HG_STK3400 + epCallback[EP4OUT] = &USBHAL::EP4_OUT_callback; + epCallback[EP4IN ] = &USBHAL::EP4_IN_callback; + epCallback[EP5OUT] = &USBHAL::EP5_OUT_callback; + epCallback[EP5IN ] = &USBHAL::EP5_IN_callback; + epCallback[EP6OUT] = &USBHAL::EP6_OUT_callback; + epCallback[EP6IN ] = &USBHAL::EP6_IN_callback; +#endif + + memset(ep_state, 0, sizeof(ep_state)); + + ep_state[EP0OUT].intern_cb = usbhal_xfer_complete_cb_EP0OUT; + ep_state[EP0IN ].intern_cb = usbhal_xfer_complete_cb_EP0IN; + ep_state[EP1OUT].intern_cb = usbhal_xfer_complete_cb_EP1OUT; + ep_state[EP1IN ].intern_cb = usbhal_xfer_complete_cb_EP1IN; + ep_state[EP2OUT].intern_cb = usbhal_xfer_complete_cb_EP2OUT; + ep_state[EP2IN ].intern_cb = usbhal_xfer_complete_cb_EP2IN; + ep_state[EP3OUT].intern_cb = usbhal_xfer_complete_cb_EP3OUT; + ep_state[EP3IN ].intern_cb = usbhal_xfer_complete_cb_EP3IN; +#ifndef TARGET_EFM32HG_STK3400 + ep_state[EP4OUT].intern_cb = usbhal_xfer_complete_cb_EP4OUT; + ep_state[EP4IN ].intern_cb = usbhal_xfer_complete_cb_EP4IN; + ep_state[EP5OUT].intern_cb = usbhal_xfer_complete_cb_EP5OUT; + ep_state[EP5IN ].intern_cb = usbhal_xfer_complete_cb_EP5IN; + ep_state[EP6OUT].intern_cb = usbhal_xfer_complete_cb_EP6OUT; + ep_state[EP6IN ].intern_cb = usbhal_xfer_complete_cb_EP6IN; +#endif + +#ifdef USB_USE_DYNAMIC_MEMORY + ep_state[EP0OUT].data_buf = ep0out_data_buf; + ep_state[EP0IN].data_buf = ep0in_data_buf; +#else + for (int i=0 ; i<NUMBER_OF_ENDPOINTS ; i++) { + ep_state[i].data_buf = ep_data_buf[i]; + } +#endif +} + +USBHAL::~USBHAL(void) +{ + TRACE_FUNC_IN; + USBD_AbortAllTransfers(); + USBD_Disconnect(); + usbhal_free_buffers(); + + usbhal_allow_em2(true); + unblockSleepMode(EM2); +} + +extern "C" void usbhal_allow_em2(bool allow_em2) +{ + if (allow_em2) { + // unblockSleepMode is safe to call even if we would unblock + // an already unblocked mode, so no checks here. + unblockSleepMode(EM1); + } else { + blockSleepMode(EM1); + } +} + +static void usbhal_reset_cb(void) +{ + TRACE_FUNC_IN; + run_cmd(CMD_BUSRESET, 0); +} + +#ifdef DEBUG_USB_API +static const char *usbstate[] = { "NONE", "ATTACHED", "POWERED", "DEFAULT", + "ADDRESSED", "CONFIGURED", "SUSPENDED", "???" }; +#endif + +static void usbhal_state_change_cb(USBD_State_TypeDef oldState, + USBD_State_TypeDef newState) +{ + TRACE("state changed %s -> %s", usbstate[oldState], usbstate[newState]); + + if (oldState == USBD_STATE_SUSPENDED) { + run_cmd(CMD_SUSPEND_STATE_CHANGED, 0); + } + + if (newState == USBD_STATE_SUSPENDED) { + run_cmd(CMD_SUSPEND_STATE_CHANGED, 1); + } + + // Should call connectStateChanged from here as well but there is + // no documentation on when to actually do so. (And the implementation + // in USBDevice.cpp is a stub) + + // HACK! Since connectStateChanged is not used, indicate the loss + // off connection by reporting a bus reset. This causes USBDevice + // to realise that at least it's not in CONFIGURED anymore, and + // stop trying to read/write in a busyloop. + if (newState == USBD_STATE_NONE) { + run_cmd(CMD_BUSRESET, 0); + } +} + +static int usbhal_setupcmd_cb(const USB_Setup_TypeDef *setup) +{ + TRACE_FUNC_IN; + if (!setup) { + EFM_ASSERT(false); + return USB_STATUS_REQ_ERR; + } + + memcpy(ep0setupdata, setup, 8); + run_cmd(CMD_EP0SETUP, 0); + + return USB_STATUS_OK; +} + +static void usbhal_sof_cb(uint16_t frameNum) +{ + run_cmd(CMD_SOF, frameNum); +} + +static void usbhal_free_buffers(void) +{ +#ifdef USB_USE_DYNAMIC_MEMORY + TRACE_FUNC_IN; + + for (int i=EP1OUT ; i<NUMBER_OF_ENDPOINTS ; i++ ) { + if (ep_state[i].data_buf) { + free(ep_state[i].data_buf); + ep_state[i].data_buf = NULL; + } + } +#endif +} + +void USBHAL::connect(void) +{ + TRACE_FUNC_IN; + + // Init datastructures must be static - driver will use these even after the init function exits! + + static const uint8_t buffer_multiplier[] = { 1 }; // Mult 1 for control EP + static const USBD_Callbacks_TypeDef usbd_callbacks = { + .usbReset = usbhal_reset_cb, + .usbStateChange = usbhal_state_change_cb, + .setupCmd = usbhal_setupcmd_cb, + .isSelfPowered = NULL, + .sofInt = usbhal_sof_cb + }; + + USBD_Init_TypeDef initdata = { + .deviceDescriptor = NULL, + .configDescriptor = NULL, + .stringDescriptors = NULL, + .numberOfStrings = 0, + .bufferingMultiplier = buffer_multiplier, + .callbacks = &usbd_callbacks, + .reserved = 0 + }; + + int ret = USBD_Init(&initdata); + + TRACE("init = %d, devicedesc = %lx, configdesc = %lx", ret, + (uint32_t) initdata.deviceDescriptor, + (uint32_t) initdata.configDescriptor); + + EFM_ASSERT(ret == USB_STATUS_OK); +} + +void USBHAL::disconnect(void) +{ + TRACE_FUNC_IN; + USBD_Disconnect(); +} + +void USBHAL::configureDevice(void) +{ + TRACE_FUNC_IN; + USBD_SetUsbState(USBD_STATE_CONFIGURED); +} + +void USBHAL::unconfigureDevice(void) +{ + TRACE_FUNC_IN; + USBD_SetUsbState(USBD_STATE_DEFAULT); + usbhal_free_buffers(); +} + +void USBHAL::setAddress(uint8_t address) +{ + TRACE_FUNC_IN_P("addr 0x%x", (unsigned)address); + USBD_SetAddress(address); +} + +void USBHAL::remoteWakeup(void) +{ + TRACE_FUNC_IN; + USBD_RemoteWakeup(); +} + +void USBHAL::EP0setup(uint8_t *buffer) +{ + TRACE_FUNC_IN; + EFM_ASSERT(buffer); + if (buffer) { + memcpy(buffer, ep0setupdata, 8); + } +} + +void USBHAL::EP0read(void) +{ + TRACE_FUNC_IN; + (void)internEndpointRead(0, MAX_PACKET_SIZE_EP0); +} + +void USBHAL::EP0readStage(void) +{ + TRACE_FUNC_IN; + // Not needed +} + +uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) +{ + TRACE_FUNC_IN; + EFM_ASSERT(buffer); + + uint32_t read = 0; + endpointReadResult(0, buffer, &read); + return read; +} + +static int usbhal_xfer_complete_cb(uint8_t ep, USB_Status_TypeDef status, + uint32_t xferred, uint32_t remaining) +{ + TRACE_FUNC_IN_P("ep 0x%x, status %u, xferred %lu, rem %lu", + ep, status, xferred, remaining); + + if (ep >= NUMBER_OF_ENDPOINTS) { + EFM_ASSERT(false); + return USB_STATUS_REQ_ERR; + } + + switch (ep) { + case EP0OUT: + if (ep_state[EP0OUT].status == READ_PENDING) { + ep_state[EP0OUT].status = READ_COMPLETE; + ep_state[EP0OUT].byte_count = xferred; + // drop zlp + if (xferred == 0) { + break; + } + } + run_cmd(CMD_EP0OUT, 0); + break; + + case EP0IN: + run_cmd(CMD_EP0IN, 0); + break; + + default: + bool write = ep & 1; + + if (status == USB_STATUS_OK) { + if (!write && ep_state[ep].status == READ_PENDING) { + ep_state[ep].status = READ_COMPLETE; + ep_state[ep].byte_count = xferred; + } else if (write && ep_state[ep].status == WRITE_PENDING) { + ep_state[ep].status = WRITE_COMPLETE; + } else { + ep_state[ep].status = FAILED_INVALID; + } + } else { + ep_state[ep].status = FAILED_INVALID; + } + + if (ep_state[ep].status != FAILED_INVALID) { + run_cmd(CMD_EP_XFER_COMPLETED, ep); + } + break; + } + + return USB_STATUS_OK; +} + +void USBHAL::EP0write(uint8_t *buffer, uint32_t size) +{ + //TRACE_FUNC_IN_P("buffer %lx, size %lu", (uint32_t) buffer, size); + + int ret; + USB_XferCompleteCb_TypeDef cb = ep_state[EP0IN].intern_cb; + + EFM_ASSERT((buffer != NULL) || (size == 0)); + EFM_ASSERT(size <= MAX_PACKET_SIZE_EP0); + + if (!buffer || size == 0) { + // No callback after writing EP0 ZLP + cb = NULL; + } + + if (buffer && !is_aligned(buffer,4)) { + // Copy unaligned data to write-buffer before USBD_Write + memcpy(ep_state[EP0IN].data_buf, buffer, size); + ret = USBD_Write(0, ep_state[EP0IN].data_buf, size, cb); + } else { + ret = USBD_Write(0, buffer, size, cb); + } + + if (ret != USB_STATUS_OK) { + TRACE("FAILED - ret %d", ret); + } +} + +void USBHAL::EP0stall(void) +{ + TRACE_FUNC_IN; + USBD_StallEp0(); +} + +static EP_STATUS internEndpointRead(uint8_t ep, uint32_t maxSize) +{ + //TRACE_FUNC_IN_P("endpoint 0x%x, size %ld, cb %d", (unsigned)ep, maxSize, useCallback); + + if (ep >= NUMBER_OF_ENDPOINTS) { + EFM_ASSERT(false); + return EP_INVALID; + } + + ep_state[ep].status = READ_PENDING; + + int ret = USBD_Read(USB_EP_TO_ADDR(ep), ep_state[ep].data_buf, maxSize, + ep_state[ep].intern_cb); + + if (ret == USB_STATUS_OK) { + return EP_PENDING; + } else { + TRACE("FAILED - ret %d", ret); + + if (ret == USB_STATUS_EP_STALLED) { + return EP_STALLED; + } else { + return EP_INVALID; + } + } +} + +EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) +{ + return internEndpointRead(endpoint, maximumSize); +} + +EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead) +{ + TRACE_FUNC_IN; + + if (endpoint >= NUMBER_OF_ENDPOINTS) { + EFM_ASSERT(false); + return EP_INVALID; + } + + EFM_ASSERT(data); + EFM_ASSERT(bytesRead); + if (!data || !bytesRead) { + return EP_INVALID; + } + + switch (ep_state[endpoint].status) { + case READ_PENDING: + return EP_PENDING; + + case READ_COMPLETE: + memcpy(data, ep_state[endpoint].data_buf, ep_state[endpoint].byte_count); + *bytesRead = ep_state[endpoint].byte_count; + ep_state[endpoint].status = IDLE; + return EP_COMPLETED; + + case FAILED_STALLED: + ep_state[endpoint].status = IDLE; + return EP_STALLED; + + default: + ep_state[endpoint].status = IDLE; + return EP_INVALID; + } +} + +EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) +{ + TRACE_FUNC_IN_P("endpoint 0x%x, data 0x%lx, size %lu", (unsigned )endpoint, (uint32_t)data, size); + + EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS); + EFM_ASSERT(endpoint > EP0IN); + EFM_ASSERT(size <= ep_state[endpoint].max_packet); + EFM_ASSERT(data); + + uint8_t ep = USB_EP_TO_INDEX(endpoint); + + if (endpoint >= NUMBER_OF_ENDPOINTS || endpoint <= EP0IN) { + return EP_INVALID; + } + + if (size > ep_state[endpoint].max_packet) { + return EP_INVALID; + } + + if (!data) { + return EP_INVALID; + } + + memcpy(ep_state[ep].data_buf, data, size); + + ep_state[ep].status = WRITE_PENDING; + int ret = USBD_Write(USB_EP_TO_ADDR(endpoint), ep_state[ep].data_buf, size, ep_state[ep].intern_cb); + + if (ret == USB_STATUS_EP_STALLED) { + ep_state[ep].status = IDLE; + return EP_STALLED; + } else if (ret != USB_STATUS_OK) { + ep_state[ep].status = IDLE; + return EP_INVALID; + } + + return EP_PENDING; +} + +EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) +{ + if (endpoint >= NUMBER_OF_ENDPOINTS) { + EFM_ASSERT(false); + return EP_INVALID; + } + + switch (ep_state[endpoint].status) { + case WRITE_PENDING: + return EP_PENDING; + + case WRITE_COMPLETE: + ep_state[endpoint].status = IDLE; + return EP_COMPLETED; + + case FAILED_STALLED: + ep_state[endpoint].status = IDLE; + return EP_STALLED; + + default: + ep_state[endpoint].status = IDLE; + return EP_INVALID; + } +} + +void USBHAL::stallEndpoint(uint8_t endpoint) +{ + TRACE_FUNC_IN; + + EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS); + EFM_ASSERT((endpoint != EP0OUT) && (endpoint != EP0IN)); + + USBD_StallEp(USB_EP_TO_ADDR(endpoint)); +} + +void USBHAL::unstallEndpoint(uint8_t endpoint) +{ + TRACE_FUNC_IN; + + EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS); + EFM_ASSERT((endpoint != EP0OUT) && (endpoint != EP0IN)); + + USBD_UnStallEp(USB_EP_TO_ADDR(endpoint)); +} + +bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options) +{ + TRACE_FUNC_IN_P("endpoint %d, packetsize %ld, options 0x%lx", endpoint, + maxPacket, options); + + int mult = 1; // RX/TX buffer size multiplier + int type = USB_EPTYPE_INTR; + + if (endpoint >= NUMBER_OF_ENDPOINTS) { + EFM_ASSERT(false); + return false; + } + + if (endpoint == EP0IN || endpoint == EP0OUT) { + EFM_ASSERT(false); + return false; + } + + ep_state[endpoint].max_packet = 0; + + if (endpoint == EPISO_OUT || endpoint == EPISO_IN) { + if (maxPacket > MAX_PACKET_SIZE_EPISO) { + EFM_ASSERT(false); + return false; + } + } else if ((maxPacket > MAX_PACKET_SIZE_EPBULK) || (maxPacket > MAX_PACKET_SIZE_EPINT)) { + EFM_ASSERT(false); + return false; + } + + // USBDevice performs a read right after creating the endpoints, + // before calling configureDevice. The read will fail since + // at that point the device state is still ADDRESSED. Workaround + // is to force configured state here. + // + // This relies on USBDevice to not call realiseEndpoint unless + // it is transitioning to the CONFIGURED state. + USBD_SetUsbState(USBD_STATE_CONFIGURED); + + // Why doesn't this function have a type param? This is silly... + switch (endpoint) { + case EPBULK_OUT: + case EPBULK_IN: + type = USB_EPTYPE_BULK; + mult = 2; + break; + case EPINT_OUT: + case EPINT_IN: + type = USB_EPTYPE_INTR; + mult = 1; + break; + case EPISO_OUT: + case EPISO_IN: + type = USB_EPTYPE_ISOC; + mult = 2; // ? + break; + } + + // Some options force the endpoint to a specific type + if( options & ISOCHRONOUS ) { + type = USB_EPTYPE_ISOC; + mult = 2; // ? + } else if ( options & RATE_FEEDBACK_MODE ) { + // No support for whatever rate feedback is, but for interrupt only + type = USB_EPTYPE_INTR; + mult = 1; + } + +#ifdef USB_USE_DYNAMIC_MEMORY + if (ep_state[endpoint].data_buf) { + free(ep_state[endpoint].data_buf); + } + + ep_state[endpoint].data_buf = (uint8_t *)malloc(maxPacket); + + if (!ep_state[endpoint].data_buf) { + EFM_ASSERT(false); + return false; + } +#endif + + int ret = USBD_AddEndpoint(USB_EP_TO_ADDR(endpoint), type, maxPacket, mult); + + if (ret == USB_STATUS_OK) { + ep_state[endpoint].status = IDLE; + ep_state[endpoint].max_packet = maxPacket; + return true; + } else { + return false; + } +} + +bool USBHAL::getEndpointStallState(unsigned char endpoint) +{ + TRACE_FUNC_IN; + if (endpoint >= NUMBER_OF_ENDPOINTS) { + EFM_ASSERT(false); + return false; + } + return USBD_EpIsStalled(USB_EP_TO_ADDR(endpoint)); +} + +static void run_cmd(USBISRCommand cmd, uint32_t param) +{ + if (usb_isrcmd != CMD_HANDLED || cmd >= CMD_ENUM_END_MARKER) { + EFM_ASSERT(false); + abort(); + } + + usb_isrcmd = cmd; + usb_isrcmd_param = param; + isrptr(); +} + +void USBHAL::_usbisr(void) +{ + EFM_ASSERT(instance); + instance->usbisr(); +} + +void USBHAL::usbisr(void) +{ + //TRACE_FUNC_IN; + + // This "ISR" is used just to route callbacks from SiL USB driver + // callback context (which can not call protected/private USBHAL + // methods), to the actual USBHAL. + + EFM_ASSERT(usb_isrcmd != CMD_HANDLED); + switch (usb_isrcmd) { + case CMD_EP0SETUP: + this->EP0setupCallback(); + break; + case CMD_EP0IN: + this->EP0in(); + break; + case CMD_EP0OUT: + this->EP0out(); + break; + case CMD_BUSRESET: + this->busReset(); + break; + case CMD_EP_XFER_COMPLETED: + if (epCallback[usb_isrcmd_param] && instance) { + (instance->*(epCallback[usb_isrcmd_param]))(); + } + break; + case CMD_SOF: + this->SOF(usb_isrcmd_param); + break; + case CMD_SUSPEND_STATE_CHANGED: + this->suspendStateChanged(usb_isrcmd_param); + break; + default: + EFM_ASSERT(false); + break; + } + usb_isrcmd = CMD_HANDLED; +} +#endif + +// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/inc/em_usb.h Fri Apr 28 17:01:10 2017 +0000 @@ -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/USBDevice/targets/TARGET_Silicon_Labs/inc/em_usbd.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,206 @@ +/***************************************************************************//** + * @file em_usbd.h + * @brief USB protocol stack library API for EFM32. + * @version 3.20.14 + ******************************************************************************* + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#ifndef __EM_USBD_H +#define __EM_USBD_H + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +#if defined( DEBUG_USB_API ) +#define DEBUG_TRACE_ABORT( x ) \ +{ \ + if ( x == USB_STATUS_EP_STALLED ) \ + { DEBUG_USB_API_PUTS( "\nEP cb(), EP stalled" ); } \ + else if ( x == USB_STATUS_EP_ABORTED ) \ + { DEBUG_USB_API_PUTS( "\nEP cb(), EP aborted" ); } \ + else if ( x == USB_STATUS_DEVICE_UNCONFIGURED ) \ + { DEBUG_USB_API_PUTS( "\nEP cb(), device unconfigured" ); } \ + else if ( x == USB_STATUS_DEVICE_SUSPENDED ) \ + { DEBUG_USB_API_PUTS( "\nEP cb(), device suspended" ); } \ + else /* ( x == USB_STATUS_DEVICE_RESET ) */ \ + { DEBUG_USB_API_PUTS( "\nEP cb(), device reset" ); } \ +} +#else +#define DEBUG_TRACE_ABORT( x ) +#endif + +extern USBD_Device_TypeDef *dev; +extern volatile bool USBD_poweredDown; + +__STATIC_INLINE void USBD_ArmEp0( USBD_Ep_TypeDef *ep ); +__STATIC_INLINE void USBD_ArmEpN( USBD_Ep_TypeDef *ep ); +__STATIC_INLINE void USBD_AbortEp( USBD_Ep_TypeDef *ep ); + +void USBD_SetUsbState( USBD_State_TypeDef newState ); + +int USBDCH9_SetupCmd( USBD_Device_TypeDef *device ); + +void USBDEP_Ep0Handler( USBD_Device_TypeDef *device ); +void USBDEP_EpHandler( uint8_t epAddr ); + +__STATIC_INLINE void USBD_ActivateAllEps( bool forceIdle ) +{ + int i; + + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + USBDHAL_ActivateEp( &dev->ep[ i ], forceIdle ); + } +} + +__STATIC_INLINE void USBD_ArmEp( USBD_Ep_TypeDef *ep ) +{ + if ( ep->num == 0 ) + { + USBD_ArmEp0( ep ); + } + else + { + USBD_ArmEpN( ep ); + } +} + +__STATIC_INLINE void USBD_ArmEp0( USBD_Ep_TypeDef *ep ) +{ + if ( ep->in ) + { + if ( ep->remaining == 0 ) /* Zero Length Packet? */ + { + ep->zlp = 1; + } + + USBDHAL_SetEp0InDmaPtr( ep->buf ); + USBDHAL_StartEp0In( EFM32_MIN( ep->remaining, ep->packetSize ), + dev->ep0MpsCode ); + } + else + { + USBDHAL_SetEp0OutDmaPtr( ep->buf ); + USBDHAL_StartEp0Out( ep->packetSize, dev->ep0MpsCode ); + } +} + +__STATIC_INLINE void USBD_ArmEpN( USBD_Ep_TypeDef *ep ) +{ + if ( ep->in ) + { + USBDHAL_StartEpIn( ep ); + } + else + { + USBDHAL_StartEpOut( ep ); + } +} + +__STATIC_INLINE void USBD_DeactivateAllEps( USB_Status_TypeDef reason ) +{ + int i; + USBD_Ep_TypeDef *ep; + + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + ep = &dev->ep[ i ]; + + if ( ep->state == D_EP_IDLE ) + { + USBDHAL_DeactivateEp( ep ); + } + } + + USBDHAL_AbortAllTransfers( reason ); +} + +__STATIC_INLINE USBD_Ep_TypeDef *USBD_GetEpFromAddr( uint8_t epAddr ) +{ + int epIndex; + USBD_Ep_TypeDef *ep = NULL; + + if ( epAddr & USB_SETUP_DIR_MASK ) + { + epIndex = dev->inEpAddr2EpIndex[ epAddr & USB_EPNUM_MASK ]; + } + else + { + epIndex = dev->outEpAddr2EpIndex[ epAddr & USB_EPNUM_MASK ]; + } + + if ( epIndex ) + { + ep = &dev->ep[ epIndex ]; + } + else if ( ( epAddr & USB_EPNUM_MASK ) == 0 ) + { + ep = &dev->ep[ 0 ]; + } + + return ep; +} + +__STATIC_INLINE void USBD_ReArmEp0( USBD_Ep_TypeDef *ep ) +{ + if ( ep->in ) + { + USBDHAL_StartEp0In( EFM32_MIN( ep->remaining, ep->packetSize ), + dev->ep0MpsCode ); + } + else + { + USBDHAL_StartEp0Out( ep->packetSize, dev->ep0MpsCode ); + } +} + +__STATIC_INLINE void USBD_AbortEp( USBD_Ep_TypeDef *ep ) +{ + if ( ep->state == D_EP_IDLE ) + { + return; + } + + if ( ep->in ) + { + USBDHAL_AbortEpIn( ep ); + } + else + { + USBDHAL_AbortEpOut( ep ); + } +} + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* defined( USB_DEVICE ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */ +#endif /* __EM_USBD_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/inc/em_usbh.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,75 @@ +/***************************************************************************//** + * @file em_usbh.h + * @brief USB protocol stack library API for EFM32. + * @version 3.20.14 + ******************************************************************************* + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#ifndef __EM_USBH_H +#define __EM_USBH_H + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_HOST ) + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +extern USBH_Hc_TypeDef hcs[]; +extern int USBH_attachRetryCount; +extern const USBH_AttachTiming_TypeDef USBH_attachTiming[]; +extern USBH_Init_TypeDef USBH_initData; +extern volatile USBH_PortState_TypeDef USBH_portStatus; + +USB_Status_TypeDef USBH_CtlSendSetup( USBH_Ep_TypeDef *ep ); +USB_Status_TypeDef USBH_CtlSendData( USBH_Ep_TypeDef *ep, uint16_t length ); +USB_Status_TypeDef USBH_CtlReceiveData( USBH_Ep_TypeDef *ep, uint16_t length ); + +#if defined( USB_RAW_API ) +int USBH_CtlRxRaw( uint8_t pid, USBH_Ep_TypeDef *ep, void *data, int byteCount ); +int USBH_CtlTxRaw( uint8_t pid, USBH_Ep_TypeDef *ep, void *data, int byteCount ); +#endif + +void USBHEP_EpHandler( USBH_Ep_TypeDef *ep, USB_Status_TypeDef result ); +void USBHEP_CtrlEpHandler( USBH_Ep_TypeDef *ep, USB_Status_TypeDef result ); +void USBHEP_TransferDone( USBH_Ep_TypeDef *ep, USB_Status_TypeDef result ); + +__STATIC_INLINE uint16_t USBH_GetFrameNum( void ) +{ + return USBHHAL_GetFrameNum(); +} + +__STATIC_INLINE bool USBH_FrameNumIsEven( void ) +{ + return ( USBHHAL_GetFrameNum() & 1 ) == 0; +} + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* defined( USB_HOST ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */ +#endif /* __EM_USBH_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/inc/em_usbhal.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,757 @@ +/***************************************************************************//** + * @file em_usbhal.h + * @brief USB protocol stack library, low level USB peripheral access. + * @version 3.20.14 + ******************************************************************************* + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#ifndef __EM_USBHAL_H +#define __EM_USBHAL_H + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) || defined( USB_HOST ) + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +#define USB_PID_DATA0 0 +#define USB_PID_DATA2 1 +#define USB_PID_DATA1 2 +#define USB_PID_SETUP 3 + +#define HPRT_F_SPEED ( 1 << _USB_HPRT_PRTSPD_SHIFT ) +#define HPRT_L_SPEED ( 2 << _USB_HPRT_PRTSPD_SHIFT ) +#define HCFG_PHYCLK_48MHZ 1 +#define HCFG_PHYCLK_6MHZ 2 + +#define DOEP0_XFERSIZE_PKTCNT_MASK ( _USB_DOEP0TSIZ_XFERSIZE_MASK | \ + _USB_DOEP0TSIZ_PKTCNT_MASK ) +#define DOEP_XFERSIZE_PKTCNT_MASK ( _USB_DOEP_TSIZ_XFERSIZE_MASK | \ + _USB_DOEP_TSIZ_PKTCNT_MASK ) + +#define DIEP0_XFERSIZE_PKTCNT_MASK ( _USB_DIEP0TSIZ_XFERSIZE_MASK | \ + _USB_DIEP0TSIZ_PKTCNT_MASK ) +#define DIEP_XFERSIZE_PKTCNT_MASK ( _USB_DIEP_TSIZ_XFERSIZE_MASK | \ + _USB_DIEP_TSIZ_PKTCNT_MASK | \ + _USB_DIEP_TSIZ_MC_MASK ) + +#define DIEPCTL_EPTYPE_CONTROL (0 << _USB_DIEP_CTL_EPTYPE_SHIFT ) +#define DIEPCTL_EPTYPE_ISOC (1 << _USB_DIEP_CTL_EPTYPE_SHIFT ) +#define DIEPCTL_EPTYPE_BULK (2 << _USB_DIEP_CTL_EPTYPE_SHIFT ) +#define DIEPCTL_EPTYPE_INTR (3 << _USB_DIEP_CTL_EPTYPE_SHIFT ) + +#define DOEPCTL_EPTYPE_CONTROL (0 << _USB_DOEP_CTL_EPTYPE_SHIFT ) +#define DOEPCTL_EPTYPE_ISOC (1 << _USB_DOEP_CTL_EPTYPE_SHIFT ) +#define DOEPCTL_EPTYPE_BULK (2 << _USB_DOEP_CTL_EPTYPE_SHIFT ) +#define DOEPCTL_EPTYPE_INTR (3 << _USB_DOEP_CTL_EPTYPE_SHIFT ) + +#define HCCHAR_EPTYPE_CTRL (0 << _USB_HC_CHAR_EPTYPE_SHIFT ) +#define HCCHAR_EPTYPE_ISOC (1 << _USB_HC_CHAR_EPTYPE_SHIFT ) +#define HCCHAR_EPTYPE_BULK (2 << _USB_HC_CHAR_EPTYPE_SHIFT ) +#define HCCHAR_EPTYPE_INTR (3 << _USB_HC_CHAR_EPTYPE_SHIFT ) + +#define GRXSTSP_PKTSTS_DEVICE_GOTNAK ( 1 << _USB_GRXSTSP_PKTSTS_SHIFT ) +#define GRXSTSP_PKTSTS_DEVICE_DATAOUTRECEIVED ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT ) +#define GRXSTSP_PKTSTS_DEVICE_DATAOUTCOMPLETE ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT ) +#define GRXSTSP_PKTSTS_DEVICE_SETUPCOMPLETE ( 4 << _USB_GRXSTSP_PKTSTS_SHIFT ) +#define GRXSTSP_PKTSTS_DEVICE_SETUPRECEIVED ( 6 << _USB_GRXSTSP_PKTSTS_SHIFT ) + +#define GRXSTSP_PKTSTS_HOST_DATAINRECEIVED ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT ) +#define GRXSTSP_PKTSTS_HOST_DATAINCOMPLETE ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT ) +#define GRXSTSP_PKTSTS_HOST_DATATOGGLEERROR ( 5 << _USB_GRXSTSP_PKTSTS_SHIFT ) +#define GRXSTSP_PKTSTS_HOST_CHANNELHALTED ( 7 << _USB_GRXSTSP_PKTSTS_SHIFT ) + +#define DCTL_WO_BITMASK \ + ( _USB_DCTL_CGOUTNAK_MASK | _USB_DCTL_SGOUTNAK_MASK | \ + _USB_DCTL_CGNPINNAK_MASK | _USB_DCTL_SGNPINNAK_MASK ) +#define GUSBCFG_WO_BITMASK ( USB_GUSBCFG_CORRUPTTXPKT ) +#define DEPCTL_WO_BITMASK \ + ( USB_DIEP_CTL_CNAK | USB_DIEP_CTL_SNAK | \ + USB_DIEP_CTL_SETD0PIDEF | USB_DIEP_CTL_SETD1PIDOF ) + +#define HPRT_WC_MASK ( USB_HPRT_PRTCONNDET | USB_HPRT_PRTENA | \ + USB_HPRT_PRTENCHNG | USB_HPRT_PRTOVRCURRCHNG ) + +typedef __IO uint32_t USB_FIFO_TypeDef[ 0x1000 / sizeof( uint32_t ) ]; +typedef __IO uint32_t USB_DIEPTXF_TypeDef; + +#define USB_DINEPS ((USB_DIEP_TypeDef *) &USB->DIEP0CTL ) +#define USB_DOUTEPS ((USB_DOEP_TypeDef *) &USB->DOEP0CTL ) +#define USB_FIFOS ((USB_FIFO_TypeDef *) &USB->FIFO0D ) +#define USB_DIEPTXFS ((USB_DIEPTXF_TypeDef *) &USB->DIEPTXF1 ) + +void USBHAL_CoreReset( void ); + +#if defined( USB_DEVICE ) +void USBDHAL_AbortAllTransfers( USB_Status_TypeDef reason ); +USB_Status_TypeDef USBDHAL_CoreInit( const uint32_t totalRxFifoSize, + const uint32_t totalTxFifoSize ); +void USBDHAL_Connect( void ); +void USBDHAL_Disconnect( void ); +void USBDHAL_AbortAllEps( void ); +void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep ); +void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep ); + +__STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp( + USBD_Ep_TypeDef *ep, uint16_t *halt ); +__STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep ); +__STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep ); +__STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep ); +#endif /* defined( USB_DEVICE ) */ + +#if defined( USB_HOST ) +USB_Status_TypeDef USBHHAL_CoreInit( const uint32_t rxFifoSize, + const uint32_t nptxFifoSize, + const uint32_t ptxFifoSize ); +void USBHHAL_HCHalt( int hcnum, uint32_t hcchar ); +void USBHHAL_HCInit( int hcnum ); +void USBHHAL_HCStart( int hcnum ); +#endif /* defined( USB_HOST ) */ + +__STATIC_INLINE void USBHAL_DisableGlobalInt( void ) +{ + USB->GAHBCFG &= ~USB_GAHBCFG_GLBLINTRMSK; +} + +__STATIC_INLINE void USBHAL_DisablePhyPins( void ) +{ + USB->ROUTE = _USB_ROUTE_RESETVALUE; +} + +__STATIC_INLINE void USBHAL_DisableUsbInt( void ) +{ + USB->IEN = _USB_IEN_RESETVALUE; +} + +__STATIC_INLINE void USBHAL_EnableGlobalInt( void ) +{ + USB->GAHBCFG |= USB_GAHBCFG_GLBLINTRMSK; +} + +__STATIC_INLINE void USBHAL_FlushRxFifo( void ) +{ + USB->GRSTCTL = USB_GRSTCTL_RXFFLSH; + while ( USB->GRSTCTL & USB_GRSTCTL_RXFFLSH ) {} +} + +__STATIC_INLINE void USBHAL_FlushTxFifo( uint8_t fifoNum ) +{ + USB->GRSTCTL = USB_GRSTCTL_TXFFLSH | ( fifoNum << _USB_GRSTCTL_TXFNUM_SHIFT ); + while ( USB->GRSTCTL & USB_GRSTCTL_TXFFLSH ) {} +} + +__STATIC_INLINE uint32_t USBHAL_GetCoreInts( void ) +{ + uint32_t retVal; + + retVal = USB->GINTSTS; + retVal &= USB->GINTMSK; + + return retVal; +} + +__STATIC_INLINE bool USBHAL_VbusIsOn( void ) +{ + return ( USB->STATUS & USB_STATUS_VREGOS ) != 0; +} + +#if defined( USB_DEVICE ) +__STATIC_INLINE void USBDHAL_ActivateEp( USBD_Ep_TypeDef *ep, bool forceIdle ) +{ +#define DIEP_MPS_EPTYPE_TXFNUM_MASK ( _USB_DIEP_CTL_MPS_MASK | \ + _USB_DIEP_CTL_EPTYPE_MASK | \ + _USB_DIEP_CTL_TXFNUM_MASK ) +#define DOEP_MPS_EPTYPE_MASK ( _USB_DOEP_CTL_MPS_MASK | \ + _USB_DOEP_CTL_EPTYPE_MASK ) + uint32_t daintmask, depctl; + + if ( forceIdle ) + ep->state = D_EP_IDLE; + + if ( ep->in ) + { + daintmask = ep->mask; + depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK; + + if ( !( depctl & USB_DIEP_CTL_USBACTEP ) ) + { + depctl = ( depctl & + ~( DIEP_MPS_EPTYPE_TXFNUM_MASK | + USB_DIEP_CTL_STALL ) ) | + ( ep->packetSize << _USB_DIEP_CTL_MPS_SHIFT ) | + ( ep->type << _USB_DIEP_CTL_EPTYPE_SHIFT ) | + ( ep->txFifoNum << _USB_DIEP_CTL_TXFNUM_SHIFT ) | + USB_DIEP_CTL_SETD0PIDEF | + USB_DIEP_CTL_USBACTEP | + USB_DIEP_CTL_SNAK; + } + else + { + depctl |= USB_DIEP_CTL_SETD0PIDEF; + } + USB_DINEPS[ ep->num ].CTL = depctl; + } + else + { + daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT; + depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK; + + if ( !( depctl & USB_DOEP_CTL_USBACTEP ) ) + { + depctl = ( depctl & + ~( DOEP_MPS_EPTYPE_MASK | + USB_DOEP_CTL_STALL ) ) | + ( ep->packetSize << _USB_DOEP_CTL_MPS_SHIFT ) | + ( ep->type << _USB_DOEP_CTL_EPTYPE_SHIFT ) | + USB_DOEP_CTL_SETD0PIDEF | + USB_DOEP_CTL_USBACTEP | + USB_DOEP_CTL_SNAK; + } + else + { + depctl |= USB_DOEP_CTL_SETD0PIDEF; + } + USB_DOUTEPS[ ep->num ].CTL = depctl; + } + + /* Enable interrupt for this EP */ + USB->DAINTMSK |= daintmask; + +#undef DIEP_MPS_EPTYPE_TXFNUM_MASK +#undef DOEP_MPS_EPTYPE_MASK +} + +__STATIC_INLINE void USBDHAL_ClearRemoteWakeup( void ) +{ + USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_RMTWKUPSIG ); +} + +__STATIC_INLINE void USBDHAL_DeactivateEp( USBD_Ep_TypeDef *ep ) +{ + uint32_t daintmask; + + if ( ep->in ) + { + USB_DINEPS[ ep->num ].CTL = 0; + daintmask = ep->mask; + } + else + { + USB_DOUTEPS[ ep->num ].CTL = 0; + daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT; + } + + /* Disable interrupt for this EP */ + USB->DAINTMSK &= ~daintmask; +} + +__STATIC_INLINE void USBDHAL_EnableInts( USBD_Device_TypeDef *dev ) +{ + uint32_t mask; + + /* Disable all interrupts. */ + USB->GINTMSK = 0; + + /* Clear pending interrupts */ + USB->GINTSTS = 0xFFFFFFFF; + + mask = USB_GINTMSK_USBSUSPMSK | + USB_GINTMSK_USBRSTMSK | + USB_GINTMSK_ENUMDONEMSK | + USB_GINTMSK_IEPINTMSK | + USB_GINTMSK_OEPINTMSK | + USB_GINTMSK_WKUPINTMSK; + + if ( dev->callbacks->sofInt ) + { + mask |= USB_GINTMSK_SOFMSK; + } + + USB->GINTMSK = mask; +} + +__STATIC_INLINE void USBDHAL_EnableUsbResetAndSuspendInt( void ) +{ + /* Disable all interrupts. */ + USB->GINTMSK = 0; + + USB->GINTMSK = USB_GINTMSK_USBRSTMSK | USB_GINTMSK_USBSUSPMSK; +} + +__STATIC_INLINE void USBDHAL_Ep0Activate( uint32_t ep0mps ) +{ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGNPINNAK; + + USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK ) + | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA + | ep0mps; +} + +__STATIC_INLINE bool USBDHAL_EpIsStalled( USBD_Ep_TypeDef *ep ) +{ + bool retVal = false; + uint16_t stallStatus; + + if ( USBDHAL_GetStallStatusEp( ep, &stallStatus ) == USB_STATUS_OK ) + { + retVal = stallStatus & 1 ? true : false; + } + return retVal; +} + +__STATIC_INLINE uint32_t USBDHAL_GetAllInEpInts( void ) +{ + uint32_t retVal; + + retVal = USB->DAINT; + retVal &= USB->DAINTMSK; + return retVal & 0xFFFF; +} + +__STATIC_INLINE uint32_t USBDHAL_GetAllOutEpInts( void ) +{ + uint32_t retVal; + + retVal = USB->DAINT; + retVal &= USB->DAINTMSK; + return retVal >> 16; +} + +__STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep ) +{ + uint32_t retVal, msk; + + msk = USB->DIEPMSK; + retVal = USB_DINEPS[ ep->num ].INT; + + return retVal & msk; +} + +__STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep ) +{ + uint32_t retVal; + + retVal = USB_DOUTEPS[ ep->num ].INT; +#if defined( USB_DOEP0INT_STUPPKTRCVD ) + retVal &= USB->DOEPMSK | USB_DOEP0INT_STUPPKTRCVD; +#else + retVal &= USB->DOEPMSK; +#endif + + return retVal; +} + +__STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp( + USBD_Ep_TypeDef *ep, uint16_t *halt ) +{ + uint32_t depctl, eptype; + USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR; + + if ( ep->in == true ) + { + depctl = USB_DINEPS[ ep->num ].CTL; + eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK; + + if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK )) + { + *halt = depctl & USB_DIEP_CTL_STALL ? 1 : 0; + retVal = USB_STATUS_OK; + } + } + else + { + depctl = USB_DOUTEPS[ ep->num ].CTL; + eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK; + + if (( eptype == DOEPCTL_EPTYPE_INTR ) || ( eptype == DOEPCTL_EPTYPE_BULK )) + { + *halt = depctl & USB_DOEP_CTL_STALL ? 1 : 0; + retVal = USB_STATUS_OK; + } + } + + return retVal; +} + +__STATIC_INLINE void USBDHAL_ReenableEp0Setup( USBD_Device_TypeDef *dev ) + +{ + USB->DOEP0DMAADDR = (uint32_t)dev->setupPkt; + USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK ) + | USB_DOEP0CTL_EPENA + | dev->ep0MpsCode; +} + +__STATIC_INLINE void USBDHAL_SetAddr( uint8_t addr ) +{ + USB->DCFG = ( USB->DCFG & + ~_USB_DCFG_DEVADDR_MASK ) | + (addr << _USB_DCFG_DEVADDR_SHIFT ); +} + +__STATIC_INLINE void USBDHAL_SetEp0InDmaPtr( uint8_t* addr ) +{ + USB->DIEP0DMAADDR = (uint32_t)addr; +} + +__STATIC_INLINE void USBDHAL_SetEp0OutDmaPtr( uint8_t* addr ) +{ + USB->DOEP0DMAADDR = (uint32_t)addr; +} + +__STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep ) +{ + if ( ep->in ) + { + USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL & + ~DEPCTL_WO_BITMASK ) | + USB_DIEP_CTL_SNAK | + USB_DIEP_CTL_EPDIS; + } + else + { + USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL & + ~DEPCTL_WO_BITMASK ) | + USB_DOEP_CTL_EPENA; + + USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL & + ~DEPCTL_WO_BITMASK ) | + USB_DOEP_CTL_SNAK | + USB_DOEP_CTL_EPDIS; + } +} + +__STATIC_INLINE void USBDHAL_SetRemoteWakeup( void ) +{ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_RMTWKUPSIG; +} + +__STATIC_INLINE USB_Status_TypeDef USBDHAL_StallEp( USBD_Ep_TypeDef *ep ) +{ + uint32_t depctl, eptype; + USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR; + + if ( ep->in == true ) + { + depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK; + eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK; + + if ( eptype != DIEPCTL_EPTYPE_ISOC ) + { + if ( depctl & USB_DIEP_CTL_EPENA ) + { + depctl |= USB_DIEP_CTL_EPDIS; + } + USB_DINEPS[ ep->num ].CTL = depctl | USB_DIEP_CTL_STALL; + retVal = USB_STATUS_OK; + } + } + else + { + depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK; + eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK; + + if ( eptype != DIEPCTL_EPTYPE_ISOC ) + { + USB_DOUTEPS[ ep->num ].CTL = depctl | USB_DOEP_CTL_STALL; + retVal = USB_STATUS_OK; + } + } + + return retVal; +} + +__STATIC_INLINE void USBDHAL_StartEp0In( uint32_t len, uint32_t ep0mps ) +{ + USB->DIEP0TSIZ = ( len << _USB_DIEP0TSIZ_XFERSIZE_SHIFT ) | + ( 1 << _USB_DIEP0TSIZ_PKTCNT_SHIFT ); + + USB->DIEP0CTL = ( USB->DIEP0CTL & ~DEPCTL_WO_BITMASK ) + | USB_DIEP0CTL_CNAK | USB_DIEP0CTL_EPENA + | ep0mps; +} + +__STATIC_INLINE void USBDHAL_StartEp0Out( uint32_t len, uint32_t ep0mps ) +{ + USB->DOEP0TSIZ = ( len << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) | + ( 1 << _USB_DOEP0TSIZ_PKTCNT_SHIFT ); + + USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK ) + | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA + | ep0mps; +} + +__STATIC_INLINE void USBDHAL_StartEp0Setup( USBD_Device_TypeDef *dev ) +{ + dev->ep[ 0 ].in = false; + +#if defined( USB_DOEP0INT_STUPPKTRCVD ) + USB->DOEP0TSIZ = ( 8*3 << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) | + ( 1 << _USB_DOEP0TSIZ_PKTCNT_SHIFT ) | + ( 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT ); +#else + USB->DOEP0TSIZ = 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT; +#endif + + dev->setup = dev->setupPkt; + USB->DOEP0DMAADDR = (uint32_t)dev->setup; + +#if defined( USB_DOEP0INT_STUPPKTRCVD ) + USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK ) + | USB_DOEP0CTL_EPENA + | dev->ep0MpsCode; +#else + USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK ) + | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA + | dev->ep0MpsCode; +#endif +} + +__STATIC_INLINE void USBDHAL_StartEpIn( USBD_Ep_TypeDef *ep ) +{ + uint32_t pktcnt, xfersize; + + if ( ep->remaining == 0 ) /* ZLP ? */ + { + pktcnt = 1; + xfersize = 0; + } + else + { + pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize; + xfersize = ep->remaining; + } + + USB_DINEPS[ ep->num ].TSIZ = + ( USB_DINEPS[ ep->num ].TSIZ & + ~DIEP_XFERSIZE_PKTCNT_MASK ) | + ( xfersize << _USB_DIEP_TSIZ_XFERSIZE_SHIFT ) | + ( pktcnt << _USB_DIEP_TSIZ_PKTCNT_SHIFT ); + + USB_DINEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf; + USB_DINEPS[ ep->num ].CTL = + ( USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK ) | + USB_DIEP_CTL_CNAK | + USB_DIEP_CTL_EPENA; +} + +__STATIC_INLINE void USBDHAL_StartEpOut( USBD_Ep_TypeDef *ep ) +{ + uint32_t pktcnt, xfersize; + + if ( ep->remaining == 0 ) /* ZLP ? */ + { + pktcnt = 1; + xfersize = ep->packetSize; + } + else + { + pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize; + xfersize = pktcnt * ep->packetSize; + } + + USB_DOUTEPS[ ep->num ].TSIZ = + ( USB_DOUTEPS[ ep->num ].TSIZ & + ~DOEP_XFERSIZE_PKTCNT_MASK ) | + ( xfersize << _USB_DOEP_TSIZ_XFERSIZE_SHIFT ) | + ( pktcnt << _USB_DOEP_TSIZ_PKTCNT_SHIFT ); + + ep->hwXferSize = xfersize; + USB_DOUTEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf; + USB_DOUTEPS[ ep->num ].CTL = + ( USB_DOUTEPS[ ep->num ].CTL & + ~DEPCTL_WO_BITMASK ) | + USB_DOEP_CTL_CNAK | + USB_DOEP_CTL_EPENA; +} + +__STATIC_INLINE USB_Status_TypeDef USBDHAL_UnStallEp( USBD_Ep_TypeDef *ep ) +{ + uint32_t depctl, eptype; + USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR; + + if ( ep->in == true ) + { + depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK; + eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK; + + if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK )) + { + depctl |= USB_DIEP_CTL_SETD0PIDEF; + depctl &= ~USB_DIEP_CTL_STALL; + USB_DINEPS[ ep->num ].CTL = depctl; + retVal = USB_STATUS_OK; + } + } + else + { + depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK; + eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK; + + if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK )) + { + depctl |= USB_DOEP_CTL_SETD0PIDEF; + depctl &= ~USB_DOEP_CTL_STALL; + USB_DOUTEPS[ ep->num ].CTL = depctl; + retVal = USB_STATUS_OK; + } + } + + return retVal; +} +#endif /* defined( USB_DEVICE ) */ + +#if defined( USB_HOST ) +__STATIC_INLINE void USBHHAL_HCActivate( int hcnum, uint32_t hcchar, bool intep ) +{ + uint32_t oddframe; + + if ( intep ) + { + oddframe = USB->HFNUM & 1; + + USB->HC[ hcnum ].CHAR = + ( hcchar & + ~( USB_HC_CHAR_CHDIS | _USB_HC_CHAR_ODDFRM_MASK ) ) | + + /* Schedule INT transfers to start in next frame. */ + ( oddframe & 1 ? 0 : USB_HC_CHAR_ODDFRM ) | + + USB_HC_CHAR_CHENA; + } + else + { + USB->HC[ hcnum ].CHAR = ( hcchar & ~USB_HC_CHAR_CHDIS ) | + USB_HC_CHAR_CHENA; + } +} + +__STATIC_INLINE bool USBHHAL_InitializedAndPowered( void ) +{ + if ( ( USB->ROUTE & USB_ROUTE_PHYPEN ) && + ( USB->HPRT & USB_HPRT_PRTPWR ) ) + return true; + return false; +} + +__STATIC_INLINE void USBHHAL_EnableInts( void ) +{ + /* Disable all interrupts. */ + USB->GINTMSK = 0; + + /* Clear pending OTG interrupts */ + USB->GOTGINT = 0xFFFFFFFF; + + /* Clear pending interrupts */ + USB->GINTSTS = 0xFFFFFFFF; + + USB->GINTMSK = USB_GINTMSK_PRTINTMSK | + USB_GINTMSK_HCHINTMSK | + USB_GINTMSK_DISCONNINTMSK; +} + +__STATIC_INLINE uint16_t USBHHAL_GetFrameNum( void ) +{ + return USB->HFNUM; +} + +__STATIC_INLINE uint32_t USBHHAL_GetHcChar( uint8_t hcnum ) +{ + return USB->HC[ hcnum ].CHAR; +} + +__STATIC_INLINE uint32_t USBHHAL_GetHcInts( uint8_t hcnum ) +{ + uint32_t retVal; + + retVal = USB->HC[ hcnum ].INT; + return retVal; +} + +__STATIC_INLINE uint32_t USBHHAL_GetHostChannelInts( void ) +{ + return USB->HAINT; +} + +__STATIC_INLINE uint8_t USBHHAL_GetPortSpeed( void ) +{ + return ( USB->HPRT & _USB_HPRT_PRTSPD_MASK ) >> _USB_HPRT_PRTSPD_SHIFT; +} + +__STATIC_INLINE void USBHHAL_PortReset( bool on ) +{ + if ( on ) + { + DEBUG_USB_INT_LO_PUTCHAR( '+' ); + USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTRST; + } + else + { + DEBUG_USB_INT_LO_PUTCHAR( '-' ); + USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTRST ); + } +} + +__STATIC_INLINE void USBHHAL_PortResume( bool on ) +{ + if ( on ) + { + USB->HPRT = ( USB->HPRT & ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP ) ) | + USB_HPRT_PRTRES; + } + else + { + USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP | USB_HPRT_PRTRES ); + } +} + +__STATIC_INLINE void USBHHAL_PortSuspend( void ) +{ + USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTSUSP; +} + +__STATIC_INLINE void USBHHAL_VbusOn( bool on ) +{ + if ( on ) + { + USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTPWR; + DEBUG_USB_INT_LO_PUTCHAR( '/' ); + } + else + { + USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTPWR ); + DEBUG_USB_INT_LO_PUTCHAR( '\\' ); + } +} +#endif /* defined( USB_HOST ) */ + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */ +#endif /* __EM_USBHAL_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/inc/em_usbtypes.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,230 @@ +/***************************************************************************//** + * @file em_usbtypes.h + * @brief USB protocol stack library, internal type definitions. + * @version 3.20.14 + ******************************************************************************* + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#ifndef __EM_USBTYPES_H +#define __EM_USBTYPES_H + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) || defined( USB_HOST ) + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +/* Limits imposed by the USB peripheral */ +#define NP_RX_QUE_DEPTH 8 +#define HP_RX_QUE_DEPTH 8 +#define MAX_XFER_LEN 524287L /* 2^19 - 1 bytes */ +#define MAX_PACKETS_PR_XFER 1023 /* 2^10 - 1 packets */ +#if defined( _USB_DIEPTXF6_MASK ) + #define MAX_NUM_TX_FIFOS 6 /* In addition to EP0 Tx FIFO */ + #define MAX_NUM_IN_EPS 6 /* In addition to EP0 */ + #define MAX_NUM_OUT_EPS 6 /* In addition to EP0 */ + #define MAX_DEVICE_FIFO_SIZE_INWORDS 512U +#else + #define MAX_NUM_TX_FIFOS 3 /* In addition to EP0 Tx FIFO */ + #define MAX_NUM_IN_EPS 3 /* In addition to EP0 */ + #define MAX_NUM_OUT_EPS 3 /* In addition to EP0 */ + #define MAX_DEVICE_FIFO_SIZE_INWORDS 384U +#endif +#define MIN_EP_FIFO_SIZE_INWORDS 16U /* Unit is words (32bit) */ +#define MIN_EP_FIFO_SIZE_INBYTES 64U /* Unit is bytes (8bit) */ + +/* For MCU's without USB host capability. */ +#if !defined( USB_ROUTE_VBUSENPEN ) +#define USB_VBUS_SWITCH_NOT_PRESENT +#endif + +/* Limit imposed by the USB standard */ +#define MAX_USB_EP_NUM 15 + +#if defined( USB_DEVICE ) + /* Check power saving modes. */ + #ifndef USB_PWRSAVE_MODE + /* Default powersave-mode is OFF. */ + #define USB_PWRSAVE_MODE USB_PWRSAVE_MODE_OFF + #else + #if ( USB_PWRSAVE_MODE & \ + ~( USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ONVBUSOFF | \ + USB_PWRSAVE_MODE_ENTEREM2 ) ) + #error "Illegal USB powersave mode." + #endif + #endif /* ifndef USB_PWRSAVE_MODE */ + + /* Check power saving low frequency clock selection. */ + #ifndef USB_USBC_32kHz_CLK + /* Default clock source is LFXO. */ + #define USB_USBC_32kHz_CLK USB_USBC_32kHz_CLK_LFXO + #else + #if ( ( USB_USBC_32kHz_CLK != USB_USBC_32kHz_CLK_LFXO ) && \ + ( USB_USBC_32kHz_CLK != USB_USBC_32kHz_CLK_LFRCO ) ) + #error "Illegal USB 32kHz powersave clock selection." + #endif + #endif /* ifndef USB_USBC_32kHz_CLK */ +#endif /* defined( USB_DEVICE ) */ + +#if defined( USB_HOST ) + /* Check VBUS overcurrent definitions. */ + #ifndef USB_VBUSOVRCUR_PORT + #define USB_VBUSOVRCUR_PORT gpioPortE + #define USB_VBUSOVRCUR_PIN 2 + #define USB_VBUSOVRCUR_POLARITY USB_VBUSOVRCUR_POLARITY_LOW + #endif +#endif + +/* Developer mode debugging macro's */ +#if defined( DEBUG_USB_INT_LO ) + #define DEBUG_USB_INT_LO_PUTS( s ) USB_PUTS( s ) + #define DEBUG_USB_INT_LO_PUTCHAR( c ) USB_PUTCHAR( c ) +#else + #define DEBUG_USB_INT_LO_PUTS( s ) + #define DEBUG_USB_INT_LO_PUTCHAR( c ) +#endif /* defined( DEBUG_USB_INT_LO ) */ + +#if defined( DEBUG_USB_INT_HI ) + #define DEBUG_USB_INT_HI_PUTS( s ) USB_PUTS( s ) + #define DEBUG_USB_INT_HI_PUTCHAR( c ) USB_PUTCHAR( c ) +#else + #define DEBUG_USB_INT_HI_PUTS( s ) + #define DEBUG_USB_INT_HI_PUTCHAR( c ) +#endif /* defined( DEBUG_USB_INT_HI ) */ + +#if defined( USB_HOST ) + #if defined( NUM_APP_TIMERS ) + #define HOSTPORT_TIMER_INDEX (NUM_APP_TIMERS) + #else + #define HOSTPORT_TIMER_INDEX (0) + #endif + #define HOSTCH_TIMER_INDEX (HOSTPORT_TIMER_INDEX + 1 ) +#endif + +/* Macros for selecting a hardware timer. */ +#define USB_TIMER0 0 +#define USB_TIMER1 1 +#define USB_TIMER2 2 +#define USB_TIMER3 3 + +#if defined( USB_HOST ) +#define HCS_NAK 0x01 +#define HCS_STALL 0x02 +#define HCS_XACT 0x04 +#define HCS_TGLERR 0x08 +#define HCS_BABBLE 0x10 +#define HCS_TIMEOUT 0x20 +#define HCS_COMPLETED 0x40 +#define HCS_RETRY 0x80 +#endif + +#if defined( USB_DEVICE ) +typedef enum +{ + D_EP_IDLE = 0, + D_EP_TRANSMITTING = 1, + D_EP_RECEIVING = 2, + D_EP0_IN_STATUS = 3, + D_EP0_OUT_STATUS = 4 +} USBD_EpState_TypeDef; + +typedef struct +{ + bool in; + uint8_t zlp; + uint8_t num; + uint8_t addr; + uint8_t type; + uint8_t txFifoNum; + uint8_t *buf; + uint16_t packetSize; + uint16_t mask; + uint32_t remaining; + uint32_t xferred; + uint32_t hwXferSize; + uint32_t fifoSize; + USBD_EpState_TypeDef state; + USB_XferCompleteCb_TypeDef xferCompleteCb; +} USBD_Ep_TypeDef; + +typedef struct +{ + USB_Setup_TypeDef *setup; + USB_Setup_TypeDef setupPkt[3]; + uint8_t configurationValue; /* Must be DWORD aligned */ + bool remoteWakeupEnabled; + uint8_t numberOfStrings; + uint8_t numberOfInterfaces; + USBD_State_TypeDef state; + USBD_State_TypeDef savedState; + USBD_State_TypeDef lastState; + const USB_DeviceDescriptor_TypeDef *deviceDescriptor; + const USB_ConfigurationDescriptor_TypeDef *configDescriptor; + const void * const *stringDescriptors; + const USBD_Callbacks_TypeDef *callbacks; + USBD_Ep_TypeDef ep[ NUM_EP_USED + 1 ]; + uint8_t inEpAddr2EpIndex[ MAX_USB_EP_NUM + 1 ]; + uint8_t outEpAddr2EpIndex[ MAX_USB_EP_NUM + 1 ]; + uint32_t ep0MpsCode; +} USBD_Device_TypeDef; +#endif /* defined( USB_DEVICE ) */ + +#if defined( USB_HOST ) +typedef enum +{ + H_PORT_DISCONNECTED = 0, + H_PORT_CONNECTED_DEBOUNCING = 1, + H_PORT_CONNECTED_RESETTING = 2, + H_PORT_CONNECTED = 3, + H_PORT_OVERCURRENT = 4 +} USBH_PortState_TypeDef; + +typedef struct +{ + int debounceTime; + int resetTime; +} USBH_AttachTiming_TypeDef; + +typedef struct +{ + uint8_t *buf; + int errorCnt; + uint32_t remaining; + uint32_t xferred; + uint32_t hwXferSize; + uint8_t status; + bool idle; + USBH_Ep_TypeDef *ep; +} USBH_Hc_TypeDef; +#endif /* defined( USB_HOST ) */ + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */ +#endif /* __EM_USBTYPES_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/inc/usbconfig.h Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,88 @@ +/***************************************************************************//** + * @file usbconfig.h + * @brief USB protocol stack library, application supplied configuration options. + * @version 3.20.12 + ******************************************************************************* + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#ifndef __USBCONFIG_H +#define __USBCONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Compile stack for device mode. */ +#define USB_DEVICE + +/* Maximum number of endpoint used, EP0 excluded. If you change this, you must + also change USBEndpoints_EFM32.h to match. */ +#define NUM_EP_USED 6 + +/* Power management modes. The following can be or'd toghether. See comments in + em_usbd.c under "Energy-saving modes" for more details. + + USB_PWRSAVE_MODE_ONSUSPEND Set USB peripheral in low power mode on suspend + + USB_PWRSAVE_MODE_ONVBUSOFF Set USB peripheral in low power mode when not + attached to a host. While this mode assumes that the internal voltage regulator + is used and that the VREGI pin of the chip is connected to VBUS it should + be safe to use given that VREGOSEN is always enabled. If you disable VREGOSEN + you must turn this off. + + USB_PWRSAVE_MODE_ENTEREM2 Enter EM2 when USB peripheral is in low power mode. + On Mbed this allows the sleep() and deepsleep() calls to enter EM2, but + does not automatically enter any sleep states. Entering EM1 is always allowed. + + Note for Happy Gecko, errata USB_E111: Entering EM2 when both the system clock + (HFCLK) and the USB core clock (USBCCLK) is running on USHFRCO will result in + a lock-up. +*/ +#define USB_PWRSAVE_MODE (USB_PWRSAVE_MODE_ONSUSPEND|USB_PWRSAVE_MODE_ONVBUSOFF|USB_PWRSAVE_MODE_ENTEREM2) + +/* Use dynamic memory to allocate rx/tx buffers in the HAL. Saves memory + as buffers are only allocated for used endpoints. The system malloc + must return memory that is aligned by 4. + + Note: if you disable this, using isochronous endpoints with packet + sizes that are larger than the maximum for other EP types (64) will + not work. */ +#define USB_USE_DYNAMIC_MEMORY + +/* When the USB peripheral is set in low power mode, it must be clocked by a 32kHz + clock. Both LFXO and LFRCO can be used, but only LFXO guarantee USB specification + compliance. */ +#define USB_USBC_32kHz_CLK USB_USBC_32kHz_CLK_LFXO + +/* Uncomment to get some debugging information. Default value for USER_PUTCHAR + should work for SiLabs Gecko boards. Printf requires a working retarget + implementation for write(). */ +//#define DEBUG_USB_API +//#define USB_USE_PRINTF +//#define USER_PUTCHAR ITM_SendChar +//#define DEBUG_USB_INT_HI +//#define DEBUG_USB_INT_LO + + + +#ifdef __cplusplus +} +#endif + +#endif /* __USBCONFIG_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/src/em_usbd.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,1438 @@ +/**************************************************************************//** + * @file em_usbd.c + * @brief USB protocol stack library, device API. + * @version 3.20.14 + ****************************************************************************** + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) + +#include "em_cmu.h" +#include "em_usbtypes.h" +#include "em_usbhal.h" +#include "em_usbd.h" + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +static USBD_Device_TypeDef device; +USBD_Device_TypeDef *dev = &device; + +static uint32_t totalRxFifoSize = 0, totalTxFifoSize = 0; +static int numEps = 0; +static int txFifoNum = 1; + +static void USBD_ResetEndpoints(void); +extern USB_Status_TypeDef USBDHAL_ReconfigureFifos( uint32_t totalRxFifoSize, + uint32_t totalTxFifoSize ); +#ifndef __MBED__ +static const char *stateNames[] = +{ + [ USBD_STATE_NONE ] = "NONE ", + [ USBD_STATE_ATTACHED ] = "ATTACHED ", + [ USBD_STATE_POWERED ] = "POWERED ", + [ USBD_STATE_DEFAULT ] = "DEFAULT ", + [ USBD_STATE_ADDRESSED ] = "ADDRESSED ", + [ USBD_STATE_CONFIGURED ] = "CONFIGURED", + [ USBD_STATE_SUSPENDED ] = "SUSPENDED ", + [ USBD_STATE_LASTMARKER ] = "UNDEFINED " +}; +#endif + +/** @endcond */ + +/***************************************************************************//** + * @brief + * Abort all pending transfers. + * + * @details + * Aborts transfers for all endpoints currently in use. Pending + * transfers on the default endpoint (EP0) are not aborted. + ******************************************************************************/ +void USBD_AbortAllTransfers( void ) +{ + INT_Disable(); + USBDHAL_AbortAllTransfers( USB_STATUS_EP_ABORTED ); + INT_Enable(); +} + +/***************************************************************************//** + * @brief + * Abort a pending transfer on a specific endpoint. + * + * @param[in] epAddr + * The address of the endpoint to abort. + ******************************************************************************/ +int USBD_AbortTransfer( int epAddr ) +{ + USB_XferCompleteCb_TypeDef callback; + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + if ( ep == NULL ) + { + DEBUG_USB_API_PUTS( "\nUSBD_AbortTransfer(), Illegal endpoint" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( ep->num == 0 ) + { + DEBUG_USB_API_PUTS( "\nUSBD_AbortTransfer(), Illegal endpoint" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + INT_Disable(); + if ( ep->state == D_EP_IDLE ) + { + INT_Enable(); + return USB_STATUS_OK; + } + + USBD_AbortEp( ep ); + + ep->state = D_EP_IDLE; + if ( ep->xferCompleteCb ) + { + callback = ep->xferCompleteCb; + ep->xferCompleteCb = NULL; + + if ( ( dev->lastState == USBD_STATE_CONFIGURED ) && + ( dev->state == USBD_STATE_ADDRESSED ) ) + { + USBDHAL_DeactivateEp( ep ); + } + + DEBUG_TRACE_ABORT( USB_STATUS_EP_ABORTED ); + callback( USB_STATUS_EP_ABORTED, ep->xferred, ep->remaining ); + } + + INT_Enable(); + return USB_STATUS_OK; +} + +/***************************************************************************//** + * @brief + * Start USB device operation. + * + * @details + * Device operation is started by connecting a pullup resistor on the + * appropriate USB data line. + ******************************************************************************/ +void USBD_Connect( void ) +{ + INT_Disable(); + USBDHAL_Connect(); + INT_Enable(); +} + +/***************************************************************************//** + * @brief + * Stop USB device operation. + * + * @details + * Device operation is stopped by disconnecting the pullup resistor from the + * appropriate USB data line. Often referred to as a "soft" disconnect. + ******************************************************************************/ +void USBD_Disconnect( void ) +{ + INT_Disable(); + USBDHAL_Disconnect(); + INT_Enable(); +} + +/***************************************************************************//** + * @brief + * Check if an endpoint is busy doing a transfer. + * + * @param[in] epAddr + * The address of the endpoint to check. + * + * @return + * True if endpoint is busy, false otherwise. + ******************************************************************************/ +bool USBD_EpIsBusy( int epAddr ) +{ + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + if ( ep == NULL ) + { + DEBUG_USB_API_PUTS( "\nUSBD_EpIsBusy(), Illegal endpoint" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( ep->state == D_EP_IDLE ) + return false; + + return true; +} + +/***************************************************************************//** + * @brief + * Get current USB device state. + * + * @return + * Device USB state. See @ref USBD_State_TypeDef. + ******************************************************************************/ +USBD_State_TypeDef USBD_GetUsbState( void ) +{ + return dev->state; +} + +/***************************************************************************//** + * @brief + * Get a string naming a device USB state. + * + * @param[in] state + * Device USB state. See @ref USBD_State_TypeDef. + * + * @return + * State name string pointer. + ******************************************************************************/ +const char *USBD_GetUsbStateName( USBD_State_TypeDef state ) +{ + if ( state > USBD_STATE_LASTMARKER ) + state = USBD_STATE_LASTMARKER; + +#ifndef __MBED__ + return stateNames[ state ]; +#else + return NULL; +#endif +} + +/***************************************************************************//** + * @brief + * Initializes USB device hardware and internal protocol stack data structures, + * then connects the data-line (D+ or D-) pullup resistor to signal host that + * enumeration can begin. + * + * @note + * You may later use @ref USBD_Disconnect() and @ref USBD_Connect() to force + * reenumeration. + * + * @param[in] p + * Pointer to device initialization struct. See @ref USBD_Init_TypeDef. + * + * @return + * @ref USB_STATUS_OK on success, else an appropriate error code. + ******************************************************************************/ +int USBD_Init( const USBD_Init_TypeDef *p ) +{ + USBD_Ep_TypeDef *ep; + +#if !defined( USB_CORECLK_HFRCO ) || !defined( CMU_OSCENCMD_USHFRCOEN ) + /* Devices supporting crystal-less USB can use HFRCO or HFXO as core clock. */ + /* All other devices must use HFXO as core clock. */ + if ( CMU_ClockSelectGet( cmuClock_HF ) != cmuSelect_HFXO ) + { + CMU_ClockSelectSet( cmuClock_HF, cmuSelect_HFXO ); + } +#endif + +#if !defined( CMU_OSCENCMD_USHFRCOEN ) +#if ( USB_USBC_32kHz_CLK == USB_USBC_32kHz_CLK_LFXO ) + CMU_OscillatorEnable(cmuOsc_LFXO, true, false); +#else + CMU_OscillatorEnable(cmuOsc_LFRCO, true, false); +#endif + +#else + CMU_ClockEnable(cmuClock_CORELE, true); + /* LFC clock is needed to detect USB suspend when LEMIDLE is activated. */ +#if ( USB_USBC_32kHz_CLK == USB_USBC_32kHz_CLK_LFXO ) + CMU_ClockSelectSet(cmuClock_LFC, cmuSelect_LFXO); +#else + CMU_ClockSelectSet(cmuClock_LFC, cmuSelect_LFRCO); +#endif + CMU_ClockEnable(cmuClock_USBLE, true); +#endif + + USBTIMER_Init(); + + memset( dev, 0, sizeof( USBD_Device_TypeDef ) ); + + dev->setup = dev->setupPkt; + dev->state = USBD_STATE_LASTMARKER; + dev->savedState = USBD_STATE_NONE; + dev->lastState = USBD_STATE_NONE; + dev->callbacks = p->callbacks; + dev->remoteWakeupEnabled = false; + + /* Initialize EP0 */ + + ep = &dev->ep[ 0 ]; + ep->in = false; + ep->buf = NULL; + ep->num = 0; + ep->mask = 1; + ep->addr = 0; + ep->type = USB_EPTYPE_CTRL; + ep->txFifoNum = 0; + + /* FIXME! */ + ep->packetSize = 64; + dev->ep0MpsCode = _USB_DOEP0CTL_MPS_64B; + + ep->remaining = 0; + ep->xferred = 0; + ep->state = D_EP_IDLE; + ep->xferCompleteCb = NULL; + ep->fifoSize = ep->packetSize / 4; + + totalTxFifoSize = ep->fifoSize * p->bufferingMultiplier[ 0 ]; + totalRxFifoSize = (ep->fifoSize + 1) * p->bufferingMultiplier[ 0 ]; + + /* Rx-FIFO size: SETUP packets : 4*n + 6 n=#CTRL EP's + * GOTNAK : 1 + * Status info : 2*n n=#OUT EP's (EP0 included) in HW + */ + totalRxFifoSize += 10 + 1 + ( 2 * (MAX_NUM_OUT_EPS + 1) ); + + INT_Disable(); + + /* Enable USB clock */ + CMU->HFCORECLKEN0 |= CMU_HFCORECLKEN0_USB | CMU_HFCORECLKEN0_USBC; + +#if defined( CMU_OSCENCMD_USHFRCOEN ) + CMU->USHFRCOCONF = CMU_USHFRCOCONF_BAND_48MHZ; + CMU_ClockSelectSet( cmuClock_USBC, cmuSelect_USHFRCO ); + + /* Enable USHFRCO Clock Recovery mode. */ + CMU->USBCRCTRL |= CMU_USBCRCTRL_EN; + + /* Turn on Low Energy Mode (LEM) features. */ + USB->CTRL = USB_CTRL_LEMOSCCTRL_GATE + | USB_CTRL_LEMIDLEEN + | USB_CTRL_LEMPHYCTRL; +#else + CMU_ClockSelectSet( cmuClock_USBC, cmuSelect_HFCLK ); +#endif + + USBHAL_DisableGlobalInt(); + + if ( USBDHAL_CoreInit( totalRxFifoSize, totalTxFifoSize ) == USB_STATUS_OK ) + { + USBDHAL_EnableUsbResetAndSuspendInt(); + USBHAL_EnableGlobalInt(); + NVIC_ClearPendingIRQ( USB_IRQn ); + NVIC_EnableIRQ( USB_IRQn ); + } + else + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Init(), FIFO setup error" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + +#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF ) + if ( USBHAL_VbusIsOn() ) + { + USBD_SetUsbState( USBD_STATE_POWERED ); + } + else +#endif + { + USBD_SetUsbState( USBD_STATE_NONE ); + } + + INT_Enable(); + return USB_STATUS_OK; +} + +/***************************************************************************//** + * @brief + * Start a read (OUT) transfer on an endpoint. + * + * @note + * The transfer buffer length must be a multiple of 4 bytes in length and + * WORD (4 byte) aligned. When allocating the buffer, round buffer length up. + * If it is possible that the host will send more data than your device + * expects, round buffer size up to the next multiple of maxpacket size. + * + * @param[in] epAddr + * Endpoint address. + * + * @param[in] data + * Pointer to transfer data buffer. + * + * @param[in] byteCount + * Transfer length. + * + * @param[in] callback + * Function to be called on transfer completion. Supply NULL if no callback + * is needed. See @ref USB_XferCompleteCb_TypeDef. + * + * @return + * @ref USB_STATUS_OK on success, else an appropriate error code. + ******************************************************************************/ +int USBD_Read( int epAddr, void *data, int byteCount, + USB_XferCompleteCb_TypeDef callback ) +{ + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + USB_PRINTF("USBD: Read addr %x, data %p, size %d, cb 0x%lx\n", + epAddr, data, byteCount, (uint32_t)callback); + + if ( ep == NULL ) + { + DEBUG_USB_API_PUTS( "\nUSBD_Read(), Illegal endpoint" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( ( byteCount > MAX_XFER_LEN ) || + ( ( byteCount / ep->packetSize ) > MAX_PACKETS_PR_XFER ) ) + { + DEBUG_USB_API_PUTS( "\nUSBD_Read(), Illegal transfer size" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( (uint32_t)data & 3 ) + { + DEBUG_USB_API_PUTS( "\nUSBD_Read(), Misaligned data buffer" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + INT_Disable(); + if ( USBDHAL_EpIsStalled( ep ) ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Read(), Endpoint is halted" ); + return USB_STATUS_EP_STALLED; + } + + if ( ep->state != D_EP_IDLE ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Read(), Endpoint is busy" ); + return USB_STATUS_EP_BUSY; + } + + if ( ( ep->num > 0 ) && ( USBD_GetUsbState() != USBD_STATE_CONFIGURED ) ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Read(), Device not configured" ); + return USB_STATUS_DEVICE_UNCONFIGURED; + } + + ep->buf = (uint8_t*)data; + ep->remaining = byteCount; + ep->xferred = 0; + + if ( ep->num == 0 ) + { + ep->in = false; + } + else if ( ep->in != false ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Read(), Illegal EP direction" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + ep->state = D_EP_RECEIVING; + ep->xferCompleteCb = callback; + + USBD_ArmEp( ep ); + INT_Enable(); + return USB_STATUS_OK; +} + +/***************************************************************************//** + * @brief + * Perform a remote wakeup signalling sequence. + * + * @note + * It is the responsibility of the application to ensure that remote wakeup + * is not attempted before the device has been suspended for at least 5 + * miliseconds. This function should not be called from within an interrupt + * handler. + * + * @return + * @ref USB_STATUS_OK on success, else an appropriate error code. + ******************************************************************************/ +int USBD_RemoteWakeup( void ) +{ + INT_Disable(); + + if ( ( dev->state != USBD_STATE_SUSPENDED ) || + ( dev->remoteWakeupEnabled == false ) ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_RemoteWakeup(), Illegal remote wakeup" ); + return USB_STATUS_ILLEGAL; + } + + USBDHAL_SetRemoteWakeup(); + INT_Enable(); + USBTIMER_DelayMs( 10 ); + INT_Disable(); + USBDHAL_ClearRemoteWakeup(); + INT_Enable(); + return USB_STATUS_OK; +} + +/***************************************************************************//** + * @brief + * Check if it is ok to enter energy mode EM2. + * + * @note + * Before entering EM2 both the USB hardware and the USB stack must be in a + * certain state, this function checks if all conditions for entering EM2 + * is met. + * Refer to the @ref usb_device_powersave section for more information. + * + * @return + * True if ok to enter EM2, false otherwise. + ******************************************************************************/ +bool USBD_SafeToEnterEM2( void ) +{ +#if ( USB_PWRSAVE_MODE ) + return USBD_poweredDown ? true : false; +#else + return false; +#endif +} + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +void USBD_SetUsbState( USBD_State_TypeDef newState ) +{ + USBD_State_TypeDef currentState; + + currentState = dev->state; + if ( newState == USBD_STATE_SUSPENDED ) + { + dev->savedState = currentState; + } + + dev->lastState = dev->state; + dev->state = newState; + + if ( ( dev->callbacks->usbStateChange ) && + ( currentState != newState ) ) + { + /* When we transition to a state "lower" than CONFIGURED + * we must reset the endpoint data + */ + if ( (dev->lastState == USBD_STATE_CONFIGURED || + dev->lastState == USBD_STATE_SUSPENDED ) && + dev->state < USBD_STATE_CONFIGURED ) + { + USBD_ResetEndpoints(); + } + + dev->callbacks->usbStateChange( currentState, newState ); + } +} + +/** @endcond */ + +/***************************************************************************//** + * @brief + * Set an endpoint in the stalled (halted) state. + * + * @param[in] epAddr + * The address of the endpoint to stall. + * + * @return + * @ref USB_STATUS_OK on success, else an appropriate error code. + ******************************************************************************/ +int USBD_StallEp( int epAddr ) +{ + USB_Status_TypeDef retVal; + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + if ( ep == NULL ) + { + DEBUG_USB_API_PUTS( "\nUSBD_StallEp(), Illegal request" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( ep->num == 0 ) + { + DEBUG_USB_API_PUTS( "\nUSBD_StallEp(), Illegal endpoint" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + INT_Disable(); + retVal = USBDHAL_StallEp( ep ); + INT_Enable(); + + if ( retVal != USB_STATUS_OK ) + { + retVal = USB_STATUS_ILLEGAL; + } + + return retVal; +} + +/***************************************************************************//** + * @brief + * Stop USB device stack operation. + * + * @details + * The data-line pullup resistor is turned off, USB interrupts are disabled, + * and finally the USB pins are disabled. + ******************************************************************************/ +void USBD_Stop( void ) +{ + USBD_Disconnect(); + NVIC_DisableIRQ( USB_IRQn ); + USBHAL_DisableGlobalInt(); + USBHAL_DisableUsbInt(); + USBHAL_DisablePhyPins(); + USBD_SetUsbState( USBD_STATE_NONE ); + /* Turn off USB clocks. */ + CMU->HFCORECLKEN0 &= ~(CMU_HFCORECLKEN0_USB | CMU_HFCORECLKEN0_USBC); +} + +/***************************************************************************//** + * @brief + * Reset stall state on a stalled (halted) endpoint. + * + * @param[in] epAddr + * The address of the endpoint to un-stall. + * + * @return + * @ref USB_STATUS_OK on success, else an appropriate error code. + ******************************************************************************/ +int USBD_UnStallEp( int epAddr ) +{ + USB_Status_TypeDef retVal; + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + if ( ep == NULL ) + { + DEBUG_USB_API_PUTS( "\nUSBD_UnStallEp(), Illegal request" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( ep->num == 0 ) + { + DEBUG_USB_API_PUTS( "\nUSBD_UnStallEp(), Illegal endpoint" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + INT_Disable(); + retVal = USBDHAL_UnStallEp( ep ); + INT_Enable(); + + if ( retVal != USB_STATUS_OK ) + { + retVal = USB_STATUS_ILLEGAL; + } + + return retVal; +} + +/***************************************************************************//** + * @brief + * Start a write (IN) transfer on an endpoint. + * + * @param[in] epAddr + * Endpoint address. + * + * @param[in] data + * Pointer to transfer data buffer. This buffer must be WORD (4 byte) aligned. + * + * @param[in] byteCount + * Transfer length. + * + * @param[in] callback + * Function to be called on transfer completion. Supply NULL if no callback + * is needed. See @ref USB_XferCompleteCb_TypeDef. + * + * @return + * @ref USB_STATUS_OK on success, else an appropriate error code. + ******************************************************************************/ +int USBD_Write( int epAddr, void *data, int byteCount, + USB_XferCompleteCb_TypeDef callback ) +{ + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + USB_PRINTF("USBD: Write addr %x, data %p, size %d, cb 0x%lx\n", + epAddr, data, byteCount, (uint32_t)callback); + + if ( ep == NULL ) + { + DEBUG_USB_API_PUTS( "\nUSBD_Write(), Illegal endpoint" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( ( byteCount > MAX_XFER_LEN ) || + ( ( byteCount / ep->packetSize ) > MAX_PACKETS_PR_XFER ) ) + { + DEBUG_USB_API_PUTS( "\nUSBD_Write(), Illegal transfer size" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + if ( (uint32_t)data & 3 ) + { + DEBUG_USB_API_PUTS( "\nUSBD_Write(), Misaligned data buffer" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + INT_Disable(); + if ( USBDHAL_EpIsStalled( ep ) ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Write(), Endpoint is halted" ); + return USB_STATUS_EP_STALLED; + } + + if ( ep->state != D_EP_IDLE ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Write(), Endpoint is busy" ); + return USB_STATUS_EP_BUSY; + } + + if ( ( ep->num > 0 ) && ( USBD_GetUsbState() != USBD_STATE_CONFIGURED ) ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Write(), Device not configured" ); + return USB_STATUS_DEVICE_UNCONFIGURED; + } + + ep->buf = (uint8_t*)data; + ep->remaining = byteCount; + ep->xferred = 0; + + if ( ep->num == 0 ) + { + ep->in = true; + } + else if ( ep->in != true ) + { + INT_Enable(); + DEBUG_USB_API_PUTS( "\nUSBD_Write(), Illegal EP direction" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + + ep->state = D_EP_TRANSMITTING; + ep->xferCompleteCb = callback; + + USBD_ArmEp( ep ); + INT_Enable(); + return USB_STATUS_OK; +} + +int USBD_SetAddress(uint8_t addr) +{ + int retVal = USB_STATUS_REQ_ERR; + + if ( dev->state == USBD_STATE_DEFAULT ) + { + if ( addr != 0 ) + { + USBD_SetUsbState( USBD_STATE_ADDRESSED ); + } + USBDHAL_SetAddr( addr ); + retVal = USB_STATUS_OK; + } + else if ( dev->state == USBD_STATE_ADDRESSED ) + { + if ( addr == 0 ) + { + USBD_SetUsbState( USBD_STATE_DEFAULT ); + } + USBDHAL_SetAddr( addr ); + retVal = USB_STATUS_OK; + } + + return retVal; +} + +/***************************************************************************//** + * @brief + * Query the stall state of an endpoint + * + * @param[in] epAddr + * The address of the endpoint to query. + * + * @return + * True if endpoint is stalled, false otherwise + ******************************************************************************/ +int USBD_EpIsStalled(int epAddr) +{ + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + if( !ep ) + { + return false; + } + + return USBDHAL_EpIsStalled(ep); +} + +/***************************************************************************//** + * @brief + * Reset (remove) all client endpoints + * + * @details + * Removes client endpoints, and resets the RX/TX fifos. No endpoints + * other than EP0 can be used until added with @ref USBD_AddEndpoint. + ******************************************************************************/ +static void USBD_ResetEndpoints(void) +{ + USBD_Ep_TypeDef *ep = &dev->ep[0]; + + numEps = 0; + txFifoNum = 1; + + totalTxFifoSize = ep->fifoSize * 1; + totalRxFifoSize = (ep->fifoSize + 1) * 1; + totalRxFifoSize += 10 + 1 + ( 2 * (MAX_NUM_OUT_EPS + 1) ); +} + +/***************************************************************************//** + * @brief + * Add a new endpoint + * + * @param[in] epAddr + * Endpoint address + * + * @param[in] transferType + * Endpoint type, one of @ref USB_EPTYPE_BULK, @ref USB_EPTYPE_INTR or + * @ref USB_EPTYPE_ISOC. + * + * @param[in] maxPacketSize + * Maximum packet size of the new endpoint, in bytes + * + * @param[in] bufferMult + * FIFO buffer size multiplier + * + * @return + * @ref USB_STATUS_OK on success, else an appropriate error code. + ******************************************************************************/ +int USBD_AddEndpoint(int epAddr, int transferType, + int maxPacketSize, int bufferMult) +{ + USBD_Ep_TypeDef *ep; + + numEps++; + + ep = &dev->ep[ numEps ]; + ep->in = ( epAddr & USB_SETUP_DIR_MASK ) != 0; + ep->buf = NULL; + ep->addr = epAddr; + ep->num = ep->addr & USB_EPNUM_MASK; + ep->mask = 1 << ep->num; + ep->type = transferType; + ep->packetSize = maxPacketSize; + ep->remaining = 0; + ep->xferred = 0; + ep->state = D_EP_IDLE; + ep->xferCompleteCb = NULL; + + if ( ep->in ) + { + ep->txFifoNum = txFifoNum++; + ep->fifoSize = ( ( ep->packetSize + 3 ) / 4 ) * bufferMult; + dev->inEpAddr2EpIndex[ ep->num ] = numEps; + totalTxFifoSize += ep->fifoSize; + + if ( ep->num > MAX_NUM_IN_EPS ) + { + DEBUG_USB_API_PUTS( "\nUSBD_AddEndpoint(), Illegal IN EP address" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + } + else + { + ep->fifoSize = ( ( ( ep->packetSize + 3 ) / 4 ) + 1 ) * bufferMult; + dev->outEpAddr2EpIndex[ ep->num ] = numEps; + totalRxFifoSize += ep->fifoSize; + + if ( ep->num > MAX_NUM_OUT_EPS ) + { + DEBUG_USB_API_PUTS( "\nUSBD_AddEndpoint(), Illegal OUT EP address" ); + EFM_ASSERT( false ); + return USB_STATUS_ILLEGAL; + } + } + + USB_PRINTF("USBD: Added endpoint %d to slot %d, in %d, addr 0x%x, type %d, ps %d, fifo %ld (total tx %ld, rx %ld)\n", + ep->num, numEps, ep->in, ep->addr, ep->type, ep->packetSize, ep->fifoSize, + totalTxFifoSize, totalRxFifoSize); + + INT_Disable(); +#if defined( CMU_OSCENCMD_USHFRCOEN ) + /* Happy Gecko workaround: disable LEM GATE mode if using ISOC endpoints. */ + if ( transferType == USB_EPTYPE_ISOC ) + { + USB->CTRL = (USB->CTRL & ~_USB_CTRL_LEMOSCCTRL_MASK) | USB_CTRL_LEMOSCCTRL_NONE; + } +#endif + + int ret = USBDHAL_ReconfigureFifos(totalRxFifoSize, totalTxFifoSize); + INT_Enable(); + + if( ret != USB_STATUS_OK ) { + return ret; + } + + USBDHAL_ActivateEp(ep, false); + + return USB_STATUS_OK; +} + + +/***************************************************************************//** + * @brief + * Set an endpoint0 in the stalled (halted) state. + * + * @details + * Temporarily stalls endpoint 0. Used to signal a failure to respond to + * the host's setup packet. + ******************************************************************************/ +void USBD_StallEp0() +{ + int const epAddr = 0; + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + ep->in = true; + USBDHAL_StallEp( ep ); /* Stall Ep0 IN */ + ep->in = false; /* OUT for next SETUP */ + USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */ +#if !defined( USB_DOEP0INT_STUPPKTRCVD ) + USBDHAL_ReenableEp0Setup( dev ); /* Prepare for next SETUP pkt. */ +#else + USBDHAL_StartEp0Setup( dev ); +#endif + ep->state = D_EP_IDLE; +} + +/******** THE REST OF THE FILE IS DOCUMENTATION ONLY !**********************//** + * @{ + +@page usb_device USB device stack library + + The source files for the USB device stack resides in the usb directory + and follows the naming convention: em_usbd<em>nnn</em>.c/h. + + @li @ref usb_device_intro + @li @ref usb_device_api + @li @ref usb_device_conf + @li @ref usb_device_powersave + @li @ref usb_device_example1 + + +@n @section usb_device_intro Introduction + + The USB device protocol stack provides an API which makes it possible to + create USB devices with a minimum of effort. The device stack supports control, + bulk and interrupt transfers. + + The stack is highly configurable to suit various needs, it does also contain + useful debugging features together with several demonstration projects to + get you started fast. + + We recommend that you read through this documentation, then proceed to build + and test a few example projects before you start designing your own device. + +@n @section usb_device_api The device stack API + + This section contains brief descriptions of the functions in the API. You will + find detailed information on input and output parameters and return values by + clicking on the hyperlinked function names. It is also a good idea to study + the code in the USB demonstration projects. + + Your application code must include one header file: @em em_usb.h. + + All functions defined in the API can be called from within interrupt handlers. + + The USB stack use a hardware timer to keep track of time. TIMER0 is the + default choice, refer to @ref usb_device_conf for other possibilities. + Your application must not use the selected timer. + + <b>Pitfalls:</b>@n + The USB peripheral will fill your receive buffers in quantities of WORD's + (4 bytes). Transmit and receive buffers must be WORD aligned, in + addition when allocating storage for receive buffers, round size up to + next WORD boundary. If it is possible that the host will send more data + than your device expects, round buffer size up to the next multiple of + maxpacket size for the relevant endpoint to avoid data corruption. + + Transmit buffers passed to @htmlonly USBD_Write() @endhtmlonly must be + statically allocated because @htmlonly USBD_Write() @endhtmlonly only + initiates the transfer. When the host decide to actually perform the + transfer, your data must be available. + + @n @ref USBD_Init() @n + This function is called to register your device and all its properties with + the device stack. The application must fill in a @ref USBD_Init_TypeDef + structure prior to calling. Refer to @ref DeviceInitCallbacks for the + optional callback functions defined within this structure. When this + function has been called your device is ready to be enumerated by the USB + host. + + @ref USBD_Read(), @ref USBD_Write() @n + These functions initiate data transfers. + @n @htmlonly USBD_Read() @endhtmlonly initiate a transfer of data @em + from host @em to device (an @em OUT transfer in USB terminology). + @n @htmlonly USBD_Write() @endhtmlonly initiate a transfer of data @em from + device @em to host (an @em IN transfer). + + When the USB host actually performs the transfer, your application will be + notified by means of a callback function which you provide (optionally). + Refer to @ref TransferCallback for details of the callback functionality. + + @ref USBD_AbortTransfer(), @ref USBD_AbortAllTransfers() @n + These functions terminate transfers that are initiated, but has not yet + taken place. If a transfer is initiated with @htmlonly USBD_Read() + or USBD_Write(), @endhtmlonly but the USB host never actually peform + the transfers, these functions will deactivate the transfer setup to make + the USB device endpoint hardware ready for new (and potentially) different + transfers. + + @ref USBD_Connect(), @ref USBD_Disconnect() @n + These functions turns the data-line (D+ or D-) pullup on or off. They can be + used to force reenumeration. It's good practice to delay at least one second + between @htmlonly USBD_Disconnect() and USBD_Connect() @endhtmlonly + to allow the USB host to unload the currently active device driver. + + @ref USBD_EpIsBusy() @n + Check if an endpoint is busy. + + @ref USBD_StallEp(), @ref USBD_UnStallEp() @n + These functions stalls or un-stalls an endpoint. This functionality may not + be needed by your application, but the USB device stack use them in response + to standard setup commands SET_FEATURE and CLEAR_FEATURE. They may be useful + when implementing some USB classes, e.g. a mass storage device use them + extensively. + + @ref USBD_RemoteWakeup() @n + Used in SUSPENDED state (see @ref USB_Status_TypeDef) to signal resume to + host. It's the applications responsibility to adhere to the USB standard + which states that a device can not signal resume before it has been + SUSPENDED for at least 5 ms. The function will also check the configuration + descriptor defined by the application to see if it is legal for the device + to signal resume. + + @ref USBD_GetUsbState() @n + Returns the device USB state (see @ref USBD_State_TypeDef). Refer to + Figure 9-1. "Device State Diagram" in the USB revision 2.0 specification. + + @ref USBD_GetUsbStateName() @n + Returns a text string naming a given USB device state. + + @ref USBD_SafeToEnterEM2() @n + Check if it is ok to enter energy mode EM2. Refer to the + @ref usb_device_powersave section for more information. + + @n @anchor TransferCallback <b>The transfer complete callback function:</b> @n + @n USB_XferCompleteCb_TypeDef() is called when a transfer completes. It is + called with three parameters, the status of the transfer, the number of + bytes transferred and the number of bytes remaining. It may not always be + needed to have a callback on transfer completion, but you should keep in + mind that a transfer may be aborted when you least expect it. A transfer + will be aborted if host stalls the endpoint, if host resets your device, if + host unconfigures your device or if you unplug your device cable and the + device is selfpowered. + @htmlonly USB_XferCompleteCb_TypeDef() @endhtmlonly is also called if your + application use @htmlonly USBD_AbortTransfer() or USBD_AbortAllTransfers() + @endhtmlonly calls. + @note This callback is called from within an interrupt handler with + interrupts disabled. + + @n @anchor DeviceInitCallbacks <b>Optional callbacks passed to the stack via + the @ref USBD_Init() function:</b> @n + @n These callbacks are all optional, and it is up to the application + programmer to decide if the application needs the functionality they + provide. + @note These callbacks are all called from within an interrupt handler + with interrupts disabled. + + USBD_UsbResetCb_TypeDef() is called each time reset signalling is sensed on + the USB wire. + + @n USBD_SofIntCb_TypeDef() is called with framenumber as a parameter on + each SOF interrupt. + + @n USBD_DeviceStateChangeCb_TypeDef() is called whenever the device state + change. Useful for detecting e.g. SUSPENDED state change in order to reduce + current consumption of buspowered devices. The USB HID keyboard example + project has a good example on how to use this callback. + + @n USBD_IsSelfPoweredCb_TypeDef() is called by the device stack when host + queries the device with a standard setup GET_STATUS command to check if the + device is currently selfpowered or buspowered. This feature is only + applicable on selfpowered devices which also works when only buspower is + available. + + @n USBD_SetupCmdCb_TypeDef() is called each time a setup command is + received from host. Use this callback to override or extend the default + handling of standard setup commands, and to implement class or vendor + specific setup commands. The USB HID keyboard example project has a good + example on how to use this callback. + + @n <b>Utility functions:</b> @n + @n USB_PUTCHAR() Transmit a single char on the debug serial port. + @n @n USB_PUTS() Transmit a zero terminated string on the debug serial port. + @n @n USB_PRINTF() Transmit "printf" formated data on the debug serial port. + @n @n USB_GetErrorMsgString() Return an error message string for a given + error code. + @n @n USB_PrintErrorMsgString() Format and print a text string given an + error code, prepends an optional user supplied leader string. + @n @n USBTIMER_DelayMs() Active wait millisecond delay function. Can also be + used inside interrupt handlers. + @n @n USBTIMER_DelayUs() Active wait microsecond delay function. Can also be + used inside interrupt handlers. + @n @n USBTIMER_Init() Initialize the timer system. Called by @htmlonly + USBD_Init(), @endhtmlonly but your application must call it again to + reinitialize whenever you change the HFPERCLK frequency. + @n @n USBTIMER_Start() Start a timer. You can configure the USB device stack + to provide any number of timers. The timers have 1 ms resolution, your + application is notified of timeout by means of a callback. + @n @n USBTIMER_Stop() Stop a timer. + +@n @section usb_device_conf Configuring the device stack + + Your application must provide a header file named @em usbconfig.h. This file + must contain the following \#define's:@n @n + @verbatim +#define USB_DEVICE // Compile the stack for device mode. +#define NUM_EP_USED n // Your application use 'n' endpoints in + // addition to endpoint 0. @endverbatim + + @n @em usbconfig.h may define the following items: @n @n + @verbatim +#define NUM_APP_TIMERS n // Your application needs 'n' timers + +#define DEBUG_USB_API // Turn on API debug diagnostics. + +// Some utility functions in the API needs printf. These +// functions have "print" in their name. This macro enables +// these functions. +#define USB_USE_PRINTF // Enable utility print functions. + +// Define a function for transmitting a single char on the serial port. +extern int RETARGET_WriteChar(char c); +#define USER_PUTCHAR RETARGET_WriteChar + +#define USB_TIMER USB_TIMERn // Select which hardware timer the USB stack + // is allowed to use. Valid values are n=0,1,2... + // corresponding to TIMER0, TIMER1, ... + // If not specified, TIMER0 is used + +#define USB_VBUS_SWITCH_NOT_PRESENT // Hardware does not have a VBUS switch + +#define USB_CORECLK_HFRCO // Devices supporting crystal-less USB can use + // HFRCO as core clock, default is HFXO +@endverbatim + + @n You are strongly encouraged to start application development with DEBUG_USB_API + turned on. When DEBUG_USB_API is turned on and USER_PUTCHAR is defined, useful + debugging information will be output on the development kit serial port. + Compiling with the DEBUG_EFM_USER flag will also enable all asserts + in both @em emlib and in the USB stack. If asserts are enabled and + USER_PUTCHAR defined, assert texts will be output on the serial port. + + You application must include @em retargetserial.c if DEBUG_USB_API is defined + and @em retargetio.c if USB_USE_PRINTF is defined. + These files reside in the @em drivers + directory in the software package for your development board. Refer to + @ref usb_device_powersave for energy-saving mode configurations. + +@n @section usb_device_powersave Energy-saving modes + + The device stack provides two energy saving levels. The first level is to + set the USB peripheral in energy saving mode, the next level is to enter + Energy Mode 2 (EM2). These energy saving modes can be applied when the device + is suspended by the USB host, or when when the device is not connected to a + USB host. + In addition to this an application can use energy modes EM1 and EM2. There + are no restrictions on when EM1 can be entered, EM2 can only be entered + when the USB device is suspended or detached from host. + + Energy-saving modes are selected with a \#define in @em usbconfig.h, default + selection is to not use any energy saving modes.@n @n + @verbatim +#define USB_PWRSAVE_MODE (USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ENTEREM2)@endverbatim + + There are three flags available, the flags can be or'ed together as shown above. + + <b>\#define USB_PWRSAVE_MODE_ONSUSPEND</b>@n Set USB peripheral in low power + mode on suspend. + + <b>\#define USB_PWRSAVE_MODE_ONVBUSOFF</b>@n Set USB peripheral in low power + mode when not attached to a host. This mode assumes that the internal voltage + regulator is used and that the VREGI pin of the chip is connected to VBUS. + This option can not be used with bus-powered devices. + + <b>\#define USB_PWRSAVE_MODE_ENTEREM2</b>@n Enter EM2 when USB peripheral is + in low power mode. + + When the USB peripheral is set in low power mode, it must be clocked by a 32kHz + clock. Both LFXO and LFRCO can be used, but only LFXO guarantee USB specification + compliance. Selection is done with a \#define in @em usbconfig.h.@n @n + @verbatim +#define USB_USBC_32kHz_CLK USB_USBC_32kHz_CLK_LFXO @endverbatim + Two flags are available, <b>USB_USBC_32kHz_CLK_LFXO</b> and + <b>USB_USBC_32kHz_CLK_LFRCO</b>. <b>USB_USBC_32kHz_CLK_LFXO</b> is selected + by default. + + The USB HID keyboard and Mass Storage device example projects demonstrate + different energy-saving modes. + + <b>Example 1:</b> + Leave all energy saving to the stack, the device enters EM2 on suspend and + when detached from host. @n + @verbatim +In usbconfig.h: + +#define USB_PWRSAVE_MODE (USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ONVBUSOFF | USB_PWRSAVE_MODE_ENTEREM2) + @endverbatim + + @n <b>Example 2:</b> + Let the stack control energy saving in the USB periheral but let your + application control energy modes EM1 and EM2. @n + @verbatim +In usbconfig.h: + +#define USB_PWRSAVE_MODE (USB_PWRSAVE_MODE_ONSUSPEND | USB_PWRSAVE_MODE_ONVBUSOFF) + +In application code: + +if ( USBD_SafeToEnterEM2() ) + EMU_EnterEM2(true); +else + EMU_EnterEM1(); @endverbatim + +@n @section usb_device_example1 Vendor unique device example application + + This example represents the most simple USB device imaginable. It's purpose + is to turn user LED's on or off under control of vendor unique setup commands. + The device will rely on @em libusb device driver on the host, a host + application @em EFM32-LedApp.exe is bundled with the example. + + The main() is really simple ! @n @n + @verbatim +#include "em_usb.h" + +#include "descriptors.h" + +int main( void ) +{ + BSP_Init(BSP_INIT_DEFAULT); // Initialize DK board register access + CMU_ClockSelectSet( cmuClock_HF, cmuSelect_HFXO ); + BSP_LedsSet(0); // Turn off all LED's + + ConsoleDebugInit(); // Initialize UART for debug diagnostics + + USB_PUTS( "\nEFM32 USB LED Vendor Unique Device example\n" ); + + USBD_Init( &initstruct ); // GO ! + + //When using a debugger it is pratical to uncomment the following three + //lines to force host to re-enumerate the device. + + //USBD_Disconnect(); + //USBTIMER_DelayMs( 1000 ); + //USBD_Connect(); + + for (;;) {} +} @endverbatim + + @n Configure the device stack in <em>usbconfig.h</em>: @n @n + @verbatim +#define USB_DEVICE // Compile stack for device mode. + +// ************************************************************************** +** ** +** Specify number of endpoints used (in addition to EP0). ** +** ** +***************************************************************************** +#define NUM_EP_USED 0 // EP0 is the only endpoint used. + +// ************************************************************************** +** ** +** Configure serial port debug output. ** +** ** +***************************************************************************** +// Prototype a function for transmitting a single char on the serial port. +extern int RETARGET_WriteChar(char c); +#define USER_PUTCHAR RETARGET_WriteChar + +// Enable debug diagnostics from API functions (illegal input params etc.) +#define DEBUG_USB_API @endverbatim + + @n Define device properties and fill in USB initstruct in + <em>descriptors.h</em>: @n @n + @verbatim +EFM32_ALIGN(4) +static const USB_DeviceDescriptor_TypeDef deviceDesc __attribute__ ((aligned(4))) = +{ + .bLength = USB_DEVICE_DESCSIZE, + .bDescriptorType = USB_DEVICE_DESCRIPTOR, + .bcdUSB = 0x0200, + .bDeviceClass = 0xFF, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_FS_CTRL_EP_MAXSIZE, + .idVendor = 0x10C4, + .idProduct = 0x0001, + .bcdDevice = 0x0000, + .iManufacturer = 1, + .iProduct = 2, + .iSerialNumber = 3, + .bNumConfigurations = 1 +}; + +EFM32_ALIGN(4) +static const uint8_t configDesc[] __attribute__ ((aligned(4)))= +{ + // *** Configuration descriptor *** + USB_CONFIG_DESCSIZE, // bLength + USB_CONFIG_DESCRIPTOR, // bDescriptorType + USB_CONFIG_DESCSIZE + // wTotalLength (LSB) + USB_INTERFACE_DESCSIZE, + (USB_CONFIG_DESCSIZE + // wTotalLength (MSB) + USB_INTERFACE_DESCSIZE)>>8, + 1, // bNumInterfaces + 1, // bConfigurationValue + 0, // iConfiguration + CONFIG_DESC_BM_RESERVED_D7 | // bmAttrib: Self powered + CONFIG_DESC_BM_SELFPOWERED, + CONFIG_DESC_MAXPOWER_mA( 100 ), // bMaxPower: 100 mA + + // *** Interface descriptor *** + USB_INTERFACE_DESCSIZE, // bLength + USB_INTERFACE_DESCRIPTOR, // bDescriptorType + 0, // bInterfaceNumber + 0, // bAlternateSetting + NUM_EP_USED, // bNumEndpoints + 0xFF, // bInterfaceClass + 0, // bInterfaceSubClass + 0, // bInterfaceProtocol + 0, // iInterface +}; + +STATIC_CONST_STRING_DESC_LANGID( langID, 0x04, 0x09 ); +STATIC_CONST_STRING_DESC( iManufacturer, 'E','n','e','r','g','y',' ', \ + 'M','i','c','r','o',' ','A','S' ); +STATIC_CONST_STRING_DESC( iProduct , 'V','e','n','d','o','r',' ', \ + 'U','n','i','q','u','e',' ', \ + 'L','E','D',' ', \ + 'D','e','v','i','c','e' ); +STATIC_CONST_STRING_DESC( iSerialNumber, '0','0','0','0','0','0', \ + '0','0','1','2','3','4' ); + +static const void * const strings[] = +{ + &langID, + &iManufacturer, + &iProduct, + &iSerialNumber +}; + +// Endpoint buffer sizes +// 1 = single buffer, 2 = double buffering, 3 = tripple buffering ... +static const uint8_t bufferingMultiplier[ NUM_EP_USED + 1 ] = { 1 }; + +static const USBD_Callbacks_TypeDef callbacks = +{ + .usbReset = NULL, + .usbStateChange = NULL, + .setupCmd = SetupCmd, + .isSelfPowered = NULL, + .sofInt = NULL +}; + +static const USBD_Init_TypeDef initstruct = +{ + .deviceDescriptor = &deviceDesc, + .configDescriptor = configDesc, + .stringDescriptors = strings, + .numberOfStrings = sizeof(strings)/sizeof(void*), + .callbacks = &callbacks, + .bufferingMultiplier = bufferingMultiplier +}; @endverbatim + + @n Now we have to implement vendor unique USB setup commands to control the + LED's (see callbacks variable above). Notice that the buffer variable below is + statically allocated because @htmlonly USBD_Write() @endhtmlonly only + initiates the transfer. When the host actually performs the transfer, the + SetupCmd() function will have returned ! @n @n + + @verbatim +#define VND_GET_LEDS 0x10 +#define VND_SET_LED 0x11 + +static int SetupCmd( const USB_Setup_TypeDef *setup ) +{ + int retVal; + uint16_t leds; + static uint32_t buffer; + uint8_t *pBuffer = (uint8_t*)&buffer; + + retVal = USB_STATUS_REQ_UNHANDLED; + + if ( setup->Type == USB_SETUP_TYPE_VENDOR ) + { + switch ( setup->bRequest ) + { + case VND_GET_LEDS: + // ******************** + *pBuffer = BSP_LedsGet() & 0x1F; + retVal = USBD_Write( 0, pBuffer, setup->wLength, NULL ); + break; + + case VND_SET_LED: + // ******************** + leds = DVK_getLEDs() & 0x1F; + if ( setup->wValue ) + { + leds |= LED0 << setup->wIndex; + } + else + { + leds &= ~( LED0 << setup->wIndex ); + } + BSP_LedsSet( leds ); + retVal = USB_STATUS_OK; + break; + } + } + + return retVal; +}@endverbatim + + * @}**************************************************************************/ + +#endif /* defined( USB_DEVICE ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/src/em_usbdep.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,446 @@ +/**************************************************************************//** + * @file em_usbdep.c + * @brief USB protocol stack library, USB device endpoint handlers. + * @version 3.20.14 + ****************************************************************************** + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) + +#include "em_usbtypes.h" +#include "em_usbhal.h" +#include "em_usbd.h" + +#ifdef USB_USE_PRINTF +static const char *epStatusStr[] = { + "IDLE","TRANS","RECV","IN_S","OUT_S" +}; +#endif + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +/* + * USBDEP_Ep0Handler() is called each time a packet has been transmitted + * or recieved on the default endpoint. + * A state machine navigate us through the phases of a control transfer + * according to "chapter 9" in the USB spec. + */ +#if !defined( USB_DOEP0INT_STUPPKTRCVD ) +void USBDEP_Ep0Handler( USBD_Device_TypeDef *device ) +{ + int status; + USBD_Ep_TypeDef *ep; + static bool statusIn; + static uint32_t xferred; + static USB_XferCompleteCb_TypeDef callback; + + ep = &device->ep[ 0 ]; + +#ifdef __MBED__ + + (void)xferred; + (void)statusIn; + (void)status; + + USB_PRINTF("USBDEP: ep0 %s, rem %ld, z %d\n", epStatusStr[ep->state], ep->remaining, ep->zlp); + + if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) ) + { + ep->state = D_EP_IDLE; + + if ( ep->xferCompleteCb ) + { + callback = ep->xferCompleteCb; + ep->xferCompleteCb = NULL; + callback( USB_STATUS_OK, ep->xferred, ep->remaining ); + } + + USBDHAL_ReenableEp0Setup(device); + } + else + { + device->callbacks->setupCmd(device->setup); + } + +#else /* not __MBED__ */ + + switch ( ep->state ) + { + case D_EP_IDLE: + ep->remaining = 0; + ep->zlp = 0; + callback = NULL; + statusIn = false; + + status = USBDCH9_SetupCmd( device ); + + if ( status == USB_STATUS_REQ_ERR ) + { + ep->in = true; + USBDHAL_StallEp( ep ); /* Stall Ep0 IN */ + ep->in = false; /* OUT for next SETUP */ + USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */ + USBDHAL_ReenableEp0Setup( device ); /* Prepare for next SETUP packet*/ + } + else /* ( Status == USB_STATUS_OK ) */ + { + if ( (ep->state == D_EP_RECEIVING) || (ep->state == D_EP_TRANSMITTING) ) + { + callback = ep->xferCompleteCb; + } + + if ( ep->state != D_EP_RECEIVING ) + { + if ( ep->remaining ) + { + /* Data will be sent to host, check if a ZLP must be appended */ + if ( ( ep->remaining < device->setup->wLength ) && + ( ep->remaining % ep->packetSize == 0 ) ) + { + ep->zlp = 1; + } + } + else + { + /* Prepare for next SETUP packet*/ + USBDHAL_ReenableEp0Setup( device ); + + /* No data stage, a ZLP may have been sent. If not, send one */ + + xferred = 0; + if ( ep->zlp == 0 ) + { + USBD_Write( 0, NULL, 0, NULL ); /* ACK to host */ + ep->state = D_EP0_IN_STATUS; + } + else + { + ep->state = D_EP_IDLE; + ep->in = false; /* OUT for next SETUP */ + } + } + } + } + break; + + case D_EP_RECEIVING: + if ( ep->remaining ) + { + /* There is more data to receive */ + USBD_ReArmEp0( ep ); + } + else + { + status = USB_STATUS_OK; + if ( callback != NULL ) + { + status = callback( USB_STATUS_OK, ep->xferred, 0 ); + callback = NULL; + } + + if ( status != USB_STATUS_OK ) + { + ep->in = true; + USBDHAL_StallEp( ep ); /* Stall Ep0 IN */ + ep->in = false; /* OUT for next SETUP */ + USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */ + USBDHAL_ReenableEp0Setup( device ); /* Prepare for next SETUP pkt. */ + ep->state = D_EP_IDLE; + } + else /* Everything OK, send a ZLP (ACK) to host */ + { + USBDHAL_ReenableEp0Setup( device );/* Prepare for next SETUP packet*/ + + ep->state = D_EP_IDLE; /* USBD_Write() sets state back*/ + /* to EP_TRANSMITTING */ + USBD_Write( 0, NULL, 0, NULL ); + ep->state = D_EP0_IN_STATUS; + } + } + break; + + case D_EP_TRANSMITTING: + if ( ep->remaining ) + { + /* There is more data to transmit */ + USBD_ReArmEp0( ep ); + } + else + { + /* All data transferred, is a ZLP packet needed ? */ + if ( ep->zlp == 1 ) + { + xferred = ep->xferred; + ep->state = D_EP_IDLE; /* USBD_Write() sets state back */ + /* to EP_TRANSMITTING */ + USBD_Write( 0, NULL, 0, NULL ); /* Send ZLP */ + ep->zlp = 2; + } + else + { + if ( ep->zlp == 0 ) + { + xferred = ep->xferred; + } + + ep->state = D_EP_IDLE; + USBD_Read( 0, NULL, 0, NULL ); /* Get ZLP packet (ACK) from host */ + statusIn = true; + ep->state = D_EP0_OUT_STATUS; + } + } + break; + + case D_EP0_IN_STATUS: + case D_EP0_OUT_STATUS: + if ( statusIn ) + { + USBDHAL_ReenableEp0Setup( device ); + } + + if ( callback != NULL ) + { + callback( USB_STATUS_OK, xferred, 0 ); + } + + ep->state = D_EP_IDLE; + ep->in = false; /* OUT for next SETUP */ + break; + + default: + EFM_ASSERT( false ); + break; + } +#endif /* __MBED__ */ +} +#endif + +#if defined( USB_DOEP0INT_STUPPKTRCVD ) +void USBDEP_Ep0Handler( USBD_Device_TypeDef *device ) +{ + int status; + USBD_Ep_TypeDef *ep; + static uint32_t xferred; + static USB_XferCompleteCb_TypeDef callback; + +#ifdef __MBED__ + + (void)xferred; + (void)status; + + ep = &device->ep[ 0 ]; + + if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) ) + { + ep->state = D_EP_IDLE; + + if ( ep->xferCompleteCb ) + { + callback = ep->xferCompleteCb; + ep->xferCompleteCb = NULL; + callback( USB_STATUS_OK, ep->xferred, ep->remaining ); + } + + USBDHAL_StartEp0Setup( dev ); + } + else + { + device->callbacks->setupCmd(device->setup); + } + +#else + + ep = &device->ep[ 0 ]; + + switch ( ep->state ) + { + case D_EP_IDLE: + ep->zlp = 0; + ep->remaining = 0; + callback = NULL; + + status = USBDCH9_SetupCmd( device ); + + if ( status == USB_STATUS_REQ_ERR ) + { + ep->in = true; + USBDHAL_StallEp( ep ); /* Stall Ep0 IN */ + ep->in = false; /* OUT for next SETUP */ + USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */ + USBDHAL_StartEp0Setup( dev ); /* Prepare for next SETUP packet*/ + } + else /* ( Status == USB_STATUS_OK ) */ + { + if ( (ep->state == D_EP_RECEIVING) || (ep->state == D_EP_TRANSMITTING) ) + { + callback = ep->xferCompleteCb; + } + + if ( ep->state != D_EP_RECEIVING ) + { + if ( ep->remaining ) + { + /* Data will be sent to host, check if a ZLP must be appended */ + if ( ( ep->remaining < device->setup->wLength ) && + ( ep->remaining % ep->packetSize == 0 ) ) + { + ep->zlp = 1; + } + } + else + { + /* No data stage, a ZLP may have been sent. If not, send one */ + xferred = 0; + if ( ep->zlp == 0 ) + { + ep->state = D_EP_IDLE; + USBD_Write( 0, NULL, 0, NULL ); /* ACK to host */ + ep->state = D_EP0_IN_STATUS; + } + } + } + } + break; + + case D_EP_RECEIVING: + if ( ep->remaining ) + { + ep->in = false; + USBD_ReArmEp0( ep ); + } + else + { + status = USB_STATUS_OK; + if ( callback != NULL ) + { + status = callback( USB_STATUS_OK, ep->xferred, 0 ); + callback = NULL; + } + + if ( status != USB_STATUS_OK ) + { + ep->in = true; + USBDHAL_StallEp( ep ); /* Stall Ep0 IN */ + ep->in = false; /* OUT for next SETUP */ + USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */ + USBDHAL_StartEp0Setup( dev ); /* Prepare for next SETUP pkt. */ + ep->state = D_EP_IDLE; + } + else + { + + USBDHAL_StartEp0Setup( dev ); /* Prepare for next SETUP packet*/ + ep->state = D_EP_IDLE; /* USBD_Write() sets state back */ + /* to EP_TRANSMITTING */ + USBD_Write( 0, NULL, 0, NULL ); + ep->state = D_EP0_IN_STATUS; + } + } + break; + + case D_EP_TRANSMITTING: + if ( ep->remaining ) + { + ep->in = true; + USBD_ReArmEp0( ep ); + } + else + { + if ( ep->zlp == 1 ) + { + xferred = ep->xferred; + ep->state = D_EP_IDLE; /* USBD_Write() sets state back */ + /* to EP_TRANSMITTING */ + USBD_Write( 0, NULL, 0, NULL ); /* Send ZLP */ + ep->zlp = 2; + } + else + { + if ( ep->zlp == 0 ) + { + xferred = ep->xferred; + } + + ep->state = D_EP_IDLE; + USBD_Read( 0, NULL, 0, NULL ); /* Get ZLP packet (ACK) from host */ + ep->state = D_EP0_OUT_STATUS; + } + } + break; + + case D_EP0_IN_STATUS: + if ( ( USB->DOEP0CTL & USB_DOEP0CTL_EPENA ) == 0 ) + { + /* Prepare for more SETUP Packets */ + USBDHAL_StartEp0Setup( dev ); + } + if ( callback != NULL ) + { + callback( USB_STATUS_OK, xferred, 0 ); + } + ep->state = D_EP_IDLE; + ep->in = false; /* OUT for next SETUP */ + break; + + case D_EP0_OUT_STATUS: + USBDHAL_StartEp0Setup( dev ); /* Prepare for more SETUP Packets */ + if ( callback != NULL ) + { + callback( USB_STATUS_OK, xferred, 0 ); + } + ep->state = D_EP_IDLE; + ep->in = false; /* OUT for next SETUP */ + break; + } +#endif /* __MBED__ */ +} +#endif + +/* + * USBDEP_EpHandler() is called each time a packet has been transmitted + * or recieved on an endpoint other than the default endpoint. + */ +void USBDEP_EpHandler( uint8_t epAddr ) +{ + USB_XferCompleteCb_TypeDef callback; + USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr ); + + if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) ) + { + ep->state = D_EP_IDLE; + if ( ep->xferCompleteCb ) + { + callback = ep->xferCompleteCb; + ep->xferCompleteCb = NULL; + callback( USB_STATUS_OK, ep->xferred, ep->remaining ); + } + } + else + { + EFM_ASSERT( false ); + } +} + +/** @endcond */ + +#endif /* defined( USB_DEVICE ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/src/em_usbdint.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,946 @@ +/**************************************************************************//** + * @file em_usbdint.c + * @brief USB protocol stack library, USB device peripheral interrupt handlers. + * @version 3.20.14 + ****************************************************************************** + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) + +#include "em_cmu.h" +#include "em_usbtypes.h" +#include "em_usbhal.h" +#include "em_usbd.h" + +#ifdef __MBED__ +extern void usbhal_allow_em2(bool em2_allow); +#endif + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +#define HANDLE_INT( x ) if ( status & x ) { Handle_##x(); status &= ~x; } + +static void Handle_USB_GINTSTS_ENUMDONE ( void ); +static void Handle_USB_GINTSTS_IEPINT ( void ); +static void Handle_USB_GINTSTS_OEPINT ( void ); +static void Handle_USB_GINTSTS_RESETDET ( void ); +static void Handle_USB_GINTSTS_SOF ( void ); +static void Handle_USB_GINTSTS_USBRST ( void ); +static void Handle_USB_GINTSTS_USBSUSP ( void ); +static void Handle_USB_GINTSTS_WKUPINT ( void ); +#if defined( USB_DOEP0INT_STUPPKTRCVD ) +static void HandleOutEpIntr( uint32_t status, USBD_Ep_TypeDef *ep ); +#else +static void ProcessSetup ( void ); +static void ProcessOepData ( USBD_Ep_TypeDef *ep ); +#endif + +#if ( USB_PWRSAVE_MODE ) +/* Variables and prototypes for USB powerdown (suspend) functionality. */ +static bool UsbPowerDown( void ); +static bool UsbPowerUp( void ); + +volatile bool USBD_poweredDown = false; + +/* Storage for backing up USB core registers. */ +static uint32_t x_USB_GINTMSK; +#if defined(_USB_GOTGCTL_MASK) +static uint32_t x_USB_GOTGCTL; +#endif +static uint32_t x_USB_GAHBCFG; +static uint32_t x_USB_GUSBCFG; +static uint32_t x_USB_GRXFSIZ; +static uint32_t x_USB_GNPTXFSIZ; +static uint32_t x_USB_DCFG; +static uint32_t x_USB_DCTL; +static uint32_t x_USB_DAINTMSK; +static uint32_t x_USB_DIEPMSK; +static uint32_t x_USB_DOEPMSK; +static uint32_t x_USB_PCGCCTL; + +#if ( NUM_EP_USED > 0 ) +static uint32_t x_USB_EP_CTL[ NUM_EP_USED ]; +static uint32_t x_USB_EP_TSIZ[ NUM_EP_USED ]; +static uint32_t x_USB_EP_DMAADDR[ NUM_EP_USED ]; +#endif + +#if ( NUM_EP_USED > MAX_NUM_TX_FIFOS ) +#define FIFO_CNT MAX_NUM_TX_FIFOS +#else +#define FIFO_CNT NUM_EP_USED +#endif + +#if ( FIFO_CNT > 0 ) +static uint32_t x_USB_DIEPTXFS[ FIFO_CNT ]; +#endif + +#if ( USB_PWRSAVE_MODE ) +static uint32_t cmuStatus = 0; +#endif + +#endif /* if ( USB_PWRSAVE_MODE ) */ + +/* + * USB_IRQHandler() is the first level handler for the USB peripheral interrupt. + */ +void USB_IRQHandler( void ) +{ + uint32_t status; + bool servedVbusInterrupt = false; + + INT_Disable(); + +#if ( USB_PWRSAVE_MODE ) + if ( USBD_poweredDown ) + { + /* Switch USBC clock from 32kHz to a 48MHz clock to be able to */ + /* read USB peripheral registers. */ + /* If we woke up from EM2, HFCLK is now HFRCO. */ + + /* Restore clock oscillators.*/ +#if defined( CMU_OSCENCMD_USHFRCOEN ) + if ( ( CMU->STATUS & CMU_STATUS_USHFRCOENS ) == 0 )/*Wakeup from EM2 ?*/ + { + CMU->OSCENCMD = ( cmuStatus + & ( CMU_STATUS_AUXHFRCOENS | CMU_STATUS_HFXOENS ) ) + | CMU_OSCENCMD_USHFRCOEN; + } +#else + if ( ( CMU->STATUS & CMU_STATUS_HFXOENS ) == 0 ) /* Wakeup from EM2 ? */ + { + CMU->OSCENCMD = cmuStatus + & ( CMU_STATUS_AUXHFRCOENS | CMU_STATUS_HFXOENS ); + } +#endif + + /* Select correct USBC clock.*/ +#if defined( CMU_OSCENCMD_USHFRCOEN ) + CMU->CMD = CMU_CMD_USBCCLKSEL_USHFRCO; + while ( ( CMU->STATUS & CMU_STATUS_USBCUSHFRCOSEL ) == 0 ){} +#else + CMU->CMD = CMU_CMD_USBCCLKSEL_HFCLKNODIV; + while ( ( CMU->STATUS & CMU_STATUS_USBCHFCLKSEL ) == 0 ){} +#endif + } +#endif /* if ( USB_PWRSAVE_MODE ) */ + + if ( USB->IF && ( USB->CTRL & USB_CTRL_VREGOSEN ) ) + { + if ( USB->IF & USB_IF_VREGOSH ) + { + USB->IFC = USB_IFC_VREGOSH; + + if ( USB->STATUS & USB_STATUS_VREGOS ) + { + servedVbusInterrupt = true; + DEBUG_USB_INT_LO_PUTS( "\nVboN" ); + +#if ( USB_PWRSAVE_MODE ) + if ( UsbPowerUp() ) + { + USBDHAL_EnableUsbResetAndSuspendInt(); + } + USBD_SetUsbState( USBD_STATE_POWERED ); +#endif + } + } + + if ( USB->IF & USB_IF_VREGOSL ) + { + USB->IFC = USB_IFC_VREGOSL; + + if ( ( USB->STATUS & USB_STATUS_VREGOS ) == 0 ) + { + servedVbusInterrupt = true; + DEBUG_USB_INT_LO_PUTS( "\nVboF" ); + +#if ( USB_PWRSAVE_MODE ) +#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF ) + if ( !USBD_poweredDown ) + { + USB->GINTMSK = 0; + USB->GINTSTS = 0xFFFFFFFF; + } + + UsbPowerDown(); +#endif + USBD_SetUsbState( USBD_STATE_NONE ); +#endif + } + } + } + + status = USBHAL_GetCoreInts(); + if ( status == 0 ) + { + INT_Enable(); + if ( !servedVbusInterrupt ) + { + DEBUG_USB_INT_LO_PUTS( "\nSinT" ); + } + return; + } + + HANDLE_INT( USB_GINTSTS_RESETDET ) + HANDLE_INT( USB_GINTSTS_WKUPINT ) + HANDLE_INT( USB_GINTSTS_USBSUSP ) + HANDLE_INT( USB_GINTSTS_SOF ) + HANDLE_INT( USB_GINTSTS_ENUMDONE ) + HANDLE_INT( USB_GINTSTS_USBRST ) + HANDLE_INT( USB_GINTSTS_IEPINT ) + HANDLE_INT( USB_GINTSTS_OEPINT ) + + INT_Enable(); + + if ( status != 0 ) + { + DEBUG_USB_INT_LO_PUTS( "\nUinT" ); + } +} + +/* + * Handle port enumeration interrupt. This has nothing to do with normal + * device enumeration. + */ +static void Handle_USB_GINTSTS_ENUMDONE( void ) +{ +#if ( USB_PWRSAVE_MODE ) + UsbPowerUp(); +#endif + + USBDHAL_Ep0Activate( dev->ep0MpsCode ); + dev->ep[ 0 ].state = D_EP_IDLE; + USBDHAL_EnableInts( dev ); + DEBUG_USB_INT_LO_PUTS( "EnumD" ); +} + +/* + * Handle IN endpoint transfer interrupt. + */ +static void Handle_USB_GINTSTS_IEPINT( void ) +{ + int epnum; + uint16_t epint; + uint16_t epmask; + uint32_t status; + USBD_Ep_TypeDef *ep; + + DEBUG_USB_INT_HI_PUTCHAR( 'i' ); + + epint = USBDHAL_GetAllInEpInts(); + for ( epnum = 0, epmask = 1; + epnum <= MAX_NUM_IN_EPS; + epnum++, epmask <<= 1 ) + { + if ( epint & epmask ) + { + ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | epnum ); + status = USBDHAL_GetInEpInts( ep ); + + if ( status & USB_DIEP_INT_XFERCOMPL ) + { + USB_DINEPS[ epnum ].INT = USB_DIEP_INT_XFERCOMPL; + + DEBUG_USB_INT_HI_PUTCHAR( 'c' ); + + if ( epnum == 0 ) + { + if ( ep->remaining > ep->packetSize ) + { + ep->remaining -= ep->packetSize; + ep->xferred += ep->packetSize; + } + else + { + ep->xferred += ep->remaining; + ep->remaining = 0; + } + USBDEP_Ep0Handler( dev ); + } + else + { + ep->xferred = ep->remaining - + ( ( USB_DINEPS[ epnum ].TSIZ & + _USB_DIEP_TSIZ_XFERSIZE_MASK ) >> + _USB_DIEP_TSIZ_XFERSIZE_SHIFT ); + ep->remaining -= ep->xferred; + + USBDEP_EpHandler( ep->addr ); +#if defined( USB_DOEP0INT_STUPPKTRCVD ) + if ( USB_DINEPS[ ep->num ].INT & USB_DIEP_INT_NAKINTRPT ) + { + USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_NAKINTRPT; + } +#endif + } + } + } + } +} + +/* + * Handle OUT endpoint transfer interrupt. + */ +static void Handle_USB_GINTSTS_OEPINT( void ) +{ + int epnum; + uint16_t epint; + uint16_t epmask; + uint32_t status; + USBD_Ep_TypeDef *ep; + + DEBUG_USB_INT_HI_PUTCHAR( 'o' ); + + epint = USBDHAL_GetAllOutEpInts(); + for ( epnum = 0, epmask = 1; + epnum <= MAX_NUM_OUT_EPS; + epnum++, epmask <<= 1 ) + { + if ( epint & epmask ) + { + ep = USBD_GetEpFromAddr( epnum ); + status = USBDHAL_GetOutEpInts( ep ); + +#if defined( USB_DOEP0INT_STUPPKTRCVD ) + HandleOutEpIntr( status, ep ); +#else + if ( status & USB_DOEP_INT_XFERCOMPL ) + { + USB_DOUTEPS[ epnum ].INT = USB_DOEP_INT_XFERCOMPL; + DEBUG_USB_INT_HI_PUTCHAR( 'c' ); + ProcessOepData( ep ); + } + + /* Setup Phase Done */ + if ( status & USB_DOEP0INT_SETUP ) + { + ProcessSetup(); + } +#endif + } + } +} + +#if !defined( USB_DOEP0INT_STUPPKTRCVD ) +static void ProcessOepData( USBD_Ep_TypeDef *ep ) +{ + if ( ep->num == 0 ) + { + +#ifdef __MBED__ + int xfer_size = ep->packetSize - (( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_XFERSIZE_MASK ) + >> _USB_DOEP0TSIZ_XFERSIZE_SHIFT); + int setup_pkt_received = USBDHAL_GetOutEpInts( ep ) & USB_DOEP0INT_SETUP; + + if ( (!setup_pkt_received && xfer_size == 0) || + (setup_pkt_received && xfer_size == 8) ) + { + /* Higher levels need to see the correct transfer amount for ZLPs */ + ep->remaining = 0; + ep->xferred = 0; + } + else + { + /* FIXME - does not work if actual read size > 56 */ + if ( setup_pkt_received ) xfer_size -= 8; + + ep->xferred = xfer_size; + ep->remaining -= xfer_size; + } +#else + if ( ep->remaining > ep->packetSize ) + { + ep->remaining -= ep->packetSize; + ep->xferred += ep->packetSize; + } + else + { + ep->xferred += ep->remaining; + ep->remaining = 0; + } +#endif + + USBDEP_Ep0Handler( dev ); + } + else + { + ep->xferred = ep->hwXferSize - + ( ( USB_DOUTEPS[ ep->num ].TSIZ & _USB_DOEP_TSIZ_XFERSIZE_MASK )>> + _USB_DOEP_TSIZ_XFERSIZE_SHIFT ); + ep->remaining -= ep->xferred; + USBDEP_EpHandler( ep->addr ); + } +} +#endif + +#if !defined( USB_DOEP0INT_STUPPKTRCVD ) +static void ProcessSetup( void ) +{ + DEBUG_USB_INT_LO_PUTS( "\nS" ); + + if ( USB->DOEP0INT & USB_DOEP0INT_BACK2BACKSETUP ) + { /* Back to back setup packets received */ + USB->DOEP0INT = USB_DOEP0INT_BACK2BACKSETUP; + DEBUG_USB_INT_LO_PUTS( "B2B" ); + + dev->setup = (USB_Setup_TypeDef*)( USB->DOEP0DMAADDR - USB_SETUP_PKT_SIZE ); + } + else + { + /* Read SETUP packet counter from hw. */ + int supCnt = ( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_SUPCNT_MASK ) + >> _USB_DOEP0TSIZ_SUPCNT_SHIFT; + + if ( supCnt == 3 ) + supCnt = 2; + + dev->setup = &dev->setupPkt[ 2 - supCnt ]; + } + USB->DOEP0TSIZ |= 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT; + USB->DOEP0DMAADDR = (uint32_t)dev->setupPkt; + USB->DOEP0INT = USB_DOEP0INT_SETUP; + + USBDEP_Ep0Handler( dev ); /* Call the SETUP handler for EP0 */ +} +#endif + +/* + * Handle USB reset detected interrupt in suspend mode. + */ +static void Handle_USB_GINTSTS_RESETDET ( void ) +{ +#if ( USB_PWRSAVE_MODE ) + if ( ! USBD_poweredDown ) + { + USB->GINTSTS = USB_GINTSTS_RESETDET; + } + + if ( UsbPowerUp() ) + { + USB->GINTSTS = USB_GINTSTS_RESETDET; + } + +#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF ) + /* Power down immediately if VBUS is off. */ + if ( ! ( USB->STATUS & USB_STATUS_VREGOS ) ) + { + UsbPowerDown(); + } +#endif + +#else + USB->GINTSTS = USB_GINTSTS_RESETDET; +#endif /* if ( USB_PWRSAVE_MODE ) */ + + if ( USB->STATUS & USB_STATUS_VREGOS ) + { + USBD_SetUsbState( USBD_STATE_DEFAULT ); + } + else + { + USBD_SetUsbState( USBD_STATE_NONE ); + } + DEBUG_USB_INT_LO_PUTS( "RsuP\n" ); +} + +/* + * Handle Start Of Frame (SOF) interrupt. + */ +static void Handle_USB_GINTSTS_SOF( void ) +{ + USB->GINTSTS = USB_GINTSTS_SOF; + + if ( dev->callbacks->sofInt ) + { + dev->callbacks->sofInt( + ( USB->DSTS & _USB_DSTS_SOFFN_MASK ) >> _USB_DSTS_SOFFN_SHIFT ); + } +} + +/* + * Handle USB port reset interrupt. + */ +static void Handle_USB_GINTSTS_USBRST( void ) +{ + int i; + + DEBUG_USB_INT_LO_PUTS( "ReseT" ); + + /* Clear Remote Wakeup Signalling */ + USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_RMTWKUPSIG ); + USBHAL_FlushTxFifo( 0 ); + + /* Clear pending interrupts */ + for ( i = 0; i <= MAX_NUM_IN_EPS; i++ ) + { + USB_DINEPS[ i ].INT = 0xFFFFFFFF; + } + + for ( i = 0; i <= MAX_NUM_OUT_EPS; i++ ) + { + USB_DOUTEPS[ i ].INT = 0xFFFFFFFF; + } + + USB->DAINTMSK = USB_DAINTMSK_INEPMSK0 | USB_DAINTMSK_OUTEPMSK0; +#if defined( USB_DOEPMSK_STSPHSERCVDMSK ) + USB->DOEPMSK = USB_DOEPMSK_SETUPMSK | USB_DOEPMSK_XFERCOMPLMSK + | USB_DOEPMSK_STSPHSERCVDMSK; +#else + USB->DOEPMSK = USB_DOEPMSK_SETUPMSK | USB_DOEPMSK_XFERCOMPLMSK; +#endif + USB->DIEPMSK = USB_DIEPMSK_XFERCOMPLMSK; + + /* Reset Device Address */ + USB->DCFG &= ~_USB_DCFG_DEVADDR_MASK; + + /* Setup EP0 to receive SETUP packets */ + USBDHAL_StartEp0Setup( dev ); + USBDHAL_EnableInts( dev ); + + if ( dev->callbacks->usbReset ) + { + dev->callbacks->usbReset(); + } + + USBD_SetUsbState( USBD_STATE_DEFAULT ); + USBDHAL_AbortAllTransfers( USB_STATUS_DEVICE_RESET ); +} + +/* + * Handle USB port suspend interrupt. + */ +static void Handle_USB_GINTSTS_USBSUSP( void ) +{ + USBD_State_TypeDef state; + + USB->GINTSTS = USB_GINTSTS_USBSUSP; + USBDHAL_AbortAllTransfers( USB_STATUS_DEVICE_SUSPENDED ); + DEBUG_USB_INT_LO_PUTS( "\nSusP" ); + + if ( USBD_GetUsbState() == USBD_STATE_NONE ) + { + USBD_SetUsbState( USBD_STATE_POWERED ); + } + + state = USBD_GetUsbState(); + if ( ( state == USBD_STATE_POWERED ) || + ( state == USBD_STATE_DEFAULT ) || + ( state == USBD_STATE_ADDRESSED ) || + ( state == USBD_STATE_CONFIGURED ) ) + { +#if ( USB_PWRSAVE_MODE ) + UsbPowerDown(); +#endif + USBD_SetUsbState( USBD_STATE_SUSPENDED ); + } +} + +/* + * Handle USB port wakeup interrupt. + */ +static void Handle_USB_GINTSTS_WKUPINT( void ) +{ +#if ( USB_PWRSAVE_MODE ) + if ( ! USBD_poweredDown ) + { + USB->GINTSTS = USB_GINTSTS_WKUPINT; + } + + if ( UsbPowerUp() ) + { + USB->GINTSTS = USB_GINTSTS_WKUPINT; + USBDHAL_StartEp0Setup( dev ); + USBDHAL_Ep0Activate( dev->ep0MpsCode ); + } +#else + USB->GINTSTS = USB_GINTSTS_WKUPINT; +#endif + + USBD_SetUsbState( dev->savedState ); + DEBUG_USB_INT_LO_PUTS( "WkuP\n" ); +} + +#if ( USB_PWRSAVE_MODE ) +/* + * Backup essential USB core registers, and set the core in partial powerdown + * mode. Optionally prepare entry into EM2. + */ +static bool UsbPowerDown( void ) +{ +#if ( NUM_EP_USED > 0 ) || ( FIFO_CNT > 0 ) + int i; +#endif +#if ( NUM_EP_USED > 0 ) + int epNum; + USBD_Ep_TypeDef *ep; +#endif + + if ( !USBD_poweredDown ) + { + USBD_poweredDown = true; + DEBUG_USB_INT_LO_PUTCHAR( '\\' ); + + /* Backup USB core registers. */ + x_USB_GINTMSK = USB->GINTMSK; +#if defined(_USB_GOTGCTL_MASK) + x_USB_GOTGCTL = USB->GOTGCTL; +#endif + x_USB_GAHBCFG = USB->GAHBCFG; + x_USB_GUSBCFG = USB->GUSBCFG; + x_USB_GRXFSIZ = USB->GRXFSIZ; + x_USB_GNPTXFSIZ = USB->GNPTXFSIZ; + x_USB_DCFG = USB->DCFG; + x_USB_DCTL = USB->DCTL; + x_USB_DAINTMSK = USB->DAINTMSK; + x_USB_DIEPMSK = USB->DIEPMSK; + x_USB_DOEPMSK = USB->DOEPMSK; + x_USB_PCGCCTL = USB->PCGCCTL; + +#if ( NUM_EP_USED > 0 ) + for ( i = 0; i < NUM_EP_USED; i++ ) + { + ep = &dev->ep[ i+1 ]; + epNum = ep->num; + if ( ep->in ) + { + x_USB_EP_CTL[ i ] = USB_DINEPS[ epNum ].CTL; + x_USB_EP_TSIZ[ i ] = USB_DINEPS[ epNum ].TSIZ; + x_USB_EP_DMAADDR[ i ] = USB_DINEPS[ epNum ].DMAADDR; + } + else + { + x_USB_EP_CTL[ i ] = USB_DOUTEPS[ epNum ].CTL; + x_USB_EP_TSIZ[ i ] = USB_DOUTEPS[ epNum ].TSIZ; + x_USB_EP_DMAADDR[ i ] = USB_DOUTEPS[ epNum ].DMAADDR; + } + } +#endif + +#if ( FIFO_CNT > 0 ) + for ( i = 0; i < FIFO_CNT; i++ ) + { + x_USB_DIEPTXFS[ i ] = USB_DIEPTXFS[ i ]; + } +#endif + + /* Prepare for wakeup on resume and reset. */ + USB->DCFG = (USB->DCFG & ~_USB_DCFG_RESVALID_MASK) | + (4 << _USB_DCFG_RESVALID_SHIFT); + USB->DCFG |= USB_DCFG_ENA32KHZSUSP; + USB->GINTMSK = USB_GINTMSK_RESETDETMSK | USB_GINTMSK_WKUPINTMSK; + + /* Enter partial powerdown mode. */ + USB->PCGCCTL |= USB_PCGCCTL_PWRCLMP; + USB->PCGCCTL |= USB_PCGCCTL_RSTPDWNMODULE; + USB->PCGCCTL |= USB_PCGCCTL_STOPPCLK; + + /* Record current clock settings. */ + cmuStatus = CMU->STATUS; + +#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ENTEREM2 ) +#ifndef __MBED__ + /* Enter EM2 on interrupt exit. */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk; +#else + usbhal_allow_em2(true); +#endif +#endif + + /* Switch USBC clock to 32 kHz. */ +#if ( USB_USBC_32kHz_CLK == USB_USBC_32kHz_CLK_LFXO ) + CMU->CMD = CMU_CMD_USBCCLKSEL_LFXO; + while ( ( CMU->STATUS & CMU_STATUS_USBCLFXOSEL ) == 0 ){} +#else + CMU->CMD = CMU_CMD_USBCCLKSEL_LFRCO; + while ( ( CMU->STATUS & CMU_STATUS_USBCLFRCOSEL ) == 0 ){} +#endif + + return true; + } + return false; +} +#endif /* if ( USB_PWRSAVE_MODE ) */ + +#if ( USB_PWRSAVE_MODE ) +/* + * Exit USB core partial powerdown mode, restore essential USB core registers. + * Will prevent re-entry back to EM2. + * Returns true if a powerup sequence was performed. + */ +static bool UsbPowerUp( void ) +{ +#if ( NUM_EP_USED > 0 ) || ( FIFO_CNT > 0 ) + int i; +#endif +#if ( NUM_EP_USED > 0 ) + int epNum; + uint32_t tmp; + USBD_Ep_TypeDef *ep; +#endif + + if ( USBD_poweredDown ) + { + USBD_poweredDown = false; + DEBUG_USB_INT_LO_PUTCHAR( '/' ); + +#if !defined( USB_CORECLK_HFRCO ) || !defined( CMU_OSCENCMD_USHFRCOEN ) + /* Switch HFCLK from HFRCO to HFXO. */ + CMU_ClockSelectSet( cmuClock_HF, cmuSelect_HFXO ); +#endif + + /* Turn off HFRCO when not needed. */ + if ( ( cmuStatus & CMU_STATUS_HFRCOENS ) == 0 ) + { + CMU->OSCENCMD = CMU_OSCENCMD_HFRCODIS; + } + + /* Exit partial powerdown mode. */ + USB->PCGCCTL &= ~USB_PCGCCTL_STOPPCLK; + USB->PCGCCTL &= ~(USB_PCGCCTL_PWRCLMP | USB_PCGCCTL_RSTPDWNMODULE); + + if (( USB->GINTSTS & ( USB_GINTSTS_WKUPINT | USB_GINTSTS_RESETDET ) ) == 0) + { + USB->DCTL = x_USB_DCTL | USB_DCTL_RMTWKUPSIG; + USB->DCTL = x_USB_DCTL; + } + + /* Restore USB core registers. */ + USB->GUSBCFG = x_USB_GUSBCFG; + USB->DCFG = x_USB_DCFG; + +#if ( FIFO_CNT > 0 ) + for ( i = 0; i < FIFO_CNT; i++ ) + { + USB_DIEPTXFS[ i ] = x_USB_DIEPTXFS[ i ]; + } +#endif + +#if ( NUM_EP_USED > 0 ) + for ( i = 0; i < NUM_EP_USED; i++ ) + { + ep = &dev->ep[ i+1 ]; + epNum = ep->num; + + tmp = x_USB_EP_CTL[ i ] & + ~( USB_DIEP_CTL_CNAK | USB_DIEP_CTL_SNAK | + USB_DIEP_CTL_SETD0PIDEF | USB_DIEP_CTL_SETD1PIDOF ); + + if ( x_USB_EP_CTL[ i ] & USB_DIEP_CTL_DPIDEOF ) + tmp |= USB_DIEP_CTL_SETD1PIDOF; + else + tmp |= USB_DIEP_CTL_SETD0PIDEF; + + if ( x_USB_EP_CTL[ i ] & USB_DIEP_CTL_NAKSTS ) + tmp |= USB_DIEP_CTL_SNAK; + else + tmp |= USB_DIEP_CTL_CNAK; + + if ( ep->in ) + { + USB_DINEPS[ epNum ].CTL = tmp; + USB_DINEPS[ epNum ].TSIZ = x_USB_EP_TSIZ[ i ]; + USB_DINEPS[ epNum ].DMAADDR = x_USB_EP_DMAADDR[ i ]; + } + else + { + USB_DOUTEPS[ epNum ].CTL = tmp; + USB_DOUTEPS[ epNum ].TSIZ = x_USB_EP_TSIZ[ i ]; + USB_DOUTEPS[ epNum ].DMAADDR = x_USB_EP_DMAADDR[ i ]; + } + } +#endif + + USB->PCGCCTL = x_USB_PCGCCTL; + USB->DOEPMSK = x_USB_DOEPMSK; + USB->DIEPMSK = x_USB_DIEPMSK; + USB->DAINTMSK = x_USB_DAINTMSK; + USB->DCTL = x_USB_DCTL; + USB->GNPTXFSIZ = x_USB_GNPTXFSIZ; + USB->GRXFSIZ = x_USB_GRXFSIZ; + USB->GAHBCFG = x_USB_GAHBCFG; +#if defined(_USB_GOTGCTL_MASK) + USB->GOTGCTL = x_USB_GOTGCTL; +#endif + USB->GINTMSK = x_USB_GINTMSK; + + USB->DCTL |= USB_DCTL_PWRONPRGDONE; + +#if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ENTEREM2 ) +#ifndef __MBED__ + /* Do not reenter EM2 on interrupt exit. */ + SCB->SCR &= ~(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk); +#else + usbhal_allow_em2(false); +#endif +#endif + + return true; + } + return false; +} +#endif /* if ( USB_PWRSAVE_MODE ) */ + +#if defined( USB_DOEP0INT_STUPPKTRCVD ) +static void HandleOutEpIntr( uint32_t status, USBD_Ep_TypeDef *ep ) +{ + uint32_t doeptsiz; + + if ( ep->num == 0 ) + { + if ( status & USB_DOEP0INT_XFERCOMPL ) + { + USB->DOEP0INT = USB_DOEP0INT_XFERCOMPL; + doeptsiz = USB->DOEP0TSIZ; + + if ( ep->state == D_EP_IDLE ) + { + if ( status & USB_DOEP0INT_STUPPKTRCVD ) + { + USB->DOEP0INT = USB_DOEP0INT_STUPPKTRCVD; + } + status = USBDHAL_GetOutEpInts( ep ); + doeptsiz = USB->DOEP0TSIZ; + + if ( status & USB_DOEP0INT_SETUP ) + { +retry: + /* Already started data stage, clear setup */ + USB->DOEP0INT = USB_DOEP0INT_SETUP; + status &= ~USB_DOEP0INT_SETUP; + { + int supCnt = ( doeptsiz & _USB_DOEP0TSIZ_SUPCNT_MASK ) + >> _USB_DOEP0TSIZ_SUPCNT_SHIFT; + + if ( supCnt == 3 ) + supCnt = 2; + + dev->setup = &dev->setupPkt[ 2 - supCnt ]; + } + DEBUG_USB_INT_LO_PUTS( "\nS" ); + USBDEP_Ep0Handler( dev ); + + /* Prepare for more setup packets */ + if ( ep->state == D_EP0_IN_STATUS || ep->state == D_EP_TRANSMITTING ) + { + USBDHAL_StartEp0Setup( dev ); + } + } + else /* xfercompl && idle && !setup */ + { + status = USBDHAL_GetOutEpInts( ep ); + if ( status & USB_DOEP0INT_SETUP ) + goto retry; + USBDHAL_StartEp0Setup( dev ); + } + } + else /* ep0state != EP0_IDLE */ + { +#ifdef __MBED__ + if ( ep->state == D_EP_RECEIVING ) + { + int xfer_size = ep->packetSize - (( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_XFERSIZE_MASK ) + >> _USB_DOEP0TSIZ_XFERSIZE_SHIFT); + int setup_pkt_received = status & USB_DOEP0INT_SETUP; + + if ( (!setup_pkt_received && xfer_size == 0) || + (setup_pkt_received && xfer_size == 8) ) + { + /* Higher levels need to see the correct transfer amount for ZLPs */ + ep->remaining = 0; + ep->xferred = 0; + } + else + { + /* FIXME - does not work if actual read size > 56 */ + if ( setup_pkt_received ) xfer_size -= 8; + + ep->xferred = xfer_size; + ep->remaining -= xfer_size; + } + + USBDEP_Ep0Handler( dev ); + } +#else + if ( ep->state == D_EP_RECEIVING ) + { + if ( ep->remaining > ep->packetSize ) + { + ep->remaining -= ep->packetSize; + ep->xferred += ep->packetSize; + } + else + { + ep->xferred += ep->remaining; + ep->remaining = 0; + } + USBDEP_Ep0Handler( dev ); + } + else if ( ep->state == D_EP0_OUT_STATUS ) + { + USBDEP_Ep0Handler( dev ); + } +#endif + } + } /* if ( status & USB_DOEP0INT_XFERCOMPL ) */ + + if ( status & USB_DOEP0INT_STSPHSERCVD ) + { + USB->DOEP0INT = USB_DOEP0INT_STSPHSERCVD; + } + + if ( status & USB_DOEP0INT_SETUP ) + { + USB->DOEP0INT = USB_DOEP0INT_SETUP; + { + int supCnt = ( USB->DOEP0TSIZ & _USB_DOEP0TSIZ_SUPCNT_MASK ) + >> _USB_DOEP0TSIZ_SUPCNT_SHIFT; + + if ( supCnt == 3 ) + supCnt = 2; + + dev->setup = &dev->setupPkt[ 2 - supCnt ]; + } + DEBUG_USB_INT_LO_PUTS( "\nS" ); + USBDEP_Ep0Handler( dev ); + } + } + else /* epnum != 0 */ + { + if ( status & USB_DOEP_INT_XFERCOMPL ) + { + USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_XFERCOMPL; + + ep->xferred = ep->hwXferSize - + ( ( USB_DOUTEPS[ ep->num ].TSIZ & _USB_DOEP_TSIZ_XFERSIZE_MASK )>> + _USB_DOEP_TSIZ_XFERSIZE_SHIFT ); + ep->remaining -= ep->xferred; + + USBDEP_EpHandler( ep->addr ); + } + } +} +#endif + +/** @endcond */ + +#endif /* defined( USB_DEVICE ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/src/em_usbhal.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,799 @@ +/**************************************************************************//** + * @file em_usbhal.c + * @brief USB protocol stack library, low level USB peripheral access. + * @version 3.20.14 + ****************************************************************************** + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) || defined( USB_HOST ) + +#include "em_usbtypes.h" +#include "em_usbhal.h" +#if defined( USB_DEVICE ) +#include "em_usbd.h" +#endif +#if defined( USB_HOST ) +#include "em_usbh.h" +#endif +#include "em_cmu.h" +#include "em_gpio.h" + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +#define EPABORT_BREAK_LOOP_COUNT 15000 /* Approx. 100 ms */ + +/* NOTE: The sequence of error message strings must agree with the */ +/* definition of USB_Status_TypeDef enum. */ +static const char * const errMsg[] = +{ + [ USB_STATUS_OK ] = "No errors", + [ -USB_STATUS_REQ_ERR ] = "Setup request error", + [ -USB_STATUS_EP_BUSY ] = "Endpoint is busy", + [ -USB_STATUS_REQ_UNHANDLED ] = "Setup request not handled", + [ -USB_STATUS_ILLEGAL ] = "Illegal operation attempted", + [ -USB_STATUS_EP_STALLED ] = "Endpoint is stalled", + [ -USB_STATUS_EP_ABORTED ] = "Transfer aborted", + [ -USB_STATUS_EP_ERROR ] = "Transfer error", + [ -USB_STATUS_EP_NAK ] = "Endpoint NAK", + [ -USB_STATUS_DEVICE_UNCONFIGURED ] = "Device is not configured", + [ -USB_STATUS_DEVICE_SUSPENDED ] = "Device is suspended", + [ -USB_STATUS_DEVICE_RESET ] = "Device has been reset", + [ -USB_STATUS_TIMEOUT ] = "Transfer timeout", + [ -USB_STATUS_DEVICE_REMOVED ] = "Device removed", + [ -USB_STATUS_HC_BUSY ] = "Host channel is busy", + [ -USB_STATUS_DEVICE_MALFUNCTION ] = "Device malfunction", + [ -USB_STATUS_PORT_OVERCURRENT ] = "VBUS overcurrent", +}; +/** @endcond */ + + +/***************************************************************************//** + * @brief + * Return an error message string for a given error code. + * + * @param[in] error + * Error code, see \ref USB_Status_TypeDef. + * + * @return + * Error message string pointer. + ******************************************************************************/ +char *USB_GetErrorMsgString( int error ) +{ + if ( error >= 0 ) + return (char*)errMsg[ 0 ]; + + return (char*)errMsg[ -error ]; +} + + +#if defined( USB_USE_PRINTF ) +/***************************************************************************//** + * @brief + * Format and print a text string given an error code, prepends an optional user + * supplied leader string. + * + * @param[in] pre + * Optional leader string to prepend to error message string. + * + * @param[in] error + * Error code, see \ref USB_Status_TypeDef. + ******************************************************************************/ +void USB_PrintErrorMsgString( char *pre, int error ) +{ + if ( pre ) + { + USB_PRINTF( "%s", pre ); + } + + if ( error > USB_STATUS_OK ) + { + USB_PRINTF( "%d", error ); + } + else + { + USB_PRINTF( "%s", USB_GetErrorMsgString( error ) ); + } +} +#endif /* defined( USB_USE_PRINTF ) */ + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +#if defined( DEBUG_EFM_USER ) +static void PrintI( int i ) +{ +#if !defined ( USER_PUTCHAR ) + (void)i; +#else + if ( i >= 10 ) + { + PrintI( i / 10 ); + } + + DEBUG_USB_API_PUTCHAR( ( i % 10 ) + '0' ); +#endif +} + +void assertEFM( const char *file, int line ) +{ +#if !defined ( USER_PUTCHAR ) + (void)file; +#endif + + DEBUG_USB_API_PUTS( "\nASSERT " ); + DEBUG_USB_API_PUTS( file ); + DEBUG_USB_API_PUTCHAR( ' ' ); + PrintI( line ); + for(;;){} +} +#endif /* defined( DEBUG_EFM_USER ) */ + +#if defined ( USER_PUTCHAR ) +void USB_Puts( const char *p ) +{ + while( *p ) + USB_PUTCHAR( *p++ ); +} +#endif /* defined ( USER_PUTCHAR ) */ + +void USBHAL_CoreReset( void ) +{ + USB->PCGCCTL &= ~USB_PCGCCTL_STOPPCLK; + USB->PCGCCTL &= ~(USB_PCGCCTL_PWRCLMP | USB_PCGCCTL_RSTPDWNMODULE); + + /* Core Soft Reset */ + USB->GRSTCTL |= USB_GRSTCTL_CSFTRST; + while ( USB->GRSTCTL & USB_GRSTCTL_CSFTRST ) {} + + USBTIMER_DelayUs( 1 ); + + /* Wait for AHB master IDLE state. */ + while ( !( USB->GRSTCTL & USB_GRSTCTL_AHBIDLE ) ) {} +} + +#ifdef USB_DEVICE +void USBDHAL_Connect( void ) +{ + USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_SFTDISCON ); +} + +USB_Status_TypeDef USBDHAL_CoreInit( uint32_t totalRxFifoSize, + uint32_t totalTxFifoSize ) +{ + uint8_t i, j; + uint16_t start, depth; + USBD_Ep_TypeDef *ep; + +#if !defined( USB_VBUS_SWITCH_NOT_PRESENT ) + CMU_ClockEnable( cmuClock_GPIO, true ); + GPIO_PinModeSet( gpioPortF, 5, gpioModePushPull, 0 ); /* Enable VBUSEN pin */ + USB->ROUTE = USB_ROUTE_PHYPEN | USB_ROUTE_VBUSENPEN; /* Enable PHY pins. */ +#else + USB->ROUTE = USB_ROUTE_PHYPEN; /* Enable PHY pins. */ +#endif + + USBHAL_CoreReset(); /* Reset USB core */ + +#if defined( USB_GUSBCFG_FORCEHSTMODE ) + /* Force Device Mode */ + USB->GUSBCFG = ( USB->GUSBCFG & + ~(GUSBCFG_WO_BITMASK | USB_GUSBCFG_FORCEHSTMODE ) ) | + USB_GUSBCFG_FORCEDEVMODE; +#endif + + INT_Enable(); + USBTIMER_DelayMs( 50 ); + INT_Disable(); + + /* Set device speed */ + USB->DCFG = ( USB->DCFG & ~_USB_DCFG_DEVSPD_MASK ) | 3; /* Full speed PHY */ + + /* Stall on non-zero len status OUT packets (ctrl transfers). */ + USB->DCFG |= USB_DCFG_NZSTSOUTHSHK; + + /* Set periodic frame interval to 80% */ + USB->DCFG &= ~_USB_DCFG_PERFRINT_MASK; + + USB->GAHBCFG = ( USB->GAHBCFG & ~_USB_GAHBCFG_HBSTLEN_MASK ) | + USB_GAHBCFG_DMAEN | USB_GAHBCFG_HBSTLEN_INCR; + + /* Ignore frame numbers on ISO transfers. */ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_IGNRFRMNUM; + + /* Set Rx FIFO size */ + start = EFM32_MAX( totalRxFifoSize, MIN_EP_FIFO_SIZE_INWORDS ); + USB->GRXFSIZ = ( start << _USB_GRXFSIZ_RXFDEP_SHIFT ) & + _USB_GRXFSIZ_RXFDEP_MASK; + + /* Set Tx EP0 FIFO size */ + depth = EFM32_MAX( dev->ep[ 0 ].fifoSize, MIN_EP_FIFO_SIZE_INWORDS ); + USB->GNPTXFSIZ = ( ( depth << _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) & + _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK ) | + ( ( start << _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) & + _USB_GNPTXFSIZ_NPTXFSTADDR_MASK ); + + + /* Set Tx EP FIFO sizes for all IN ep's */ + for ( j = 1; j <= MAX_NUM_TX_FIFOS; j++ ) + { + for ( i = 1; i <= MAX_NUM_IN_EPS; i++ ) + { + ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | i ); + if ( ep ) /* Is EP in use ? */ + { + if ( ep->txFifoNum == j ) /* Is it correct FIFO number ? */ + { + start += depth; + depth = EFM32_MAX( ep->fifoSize, MIN_EP_FIFO_SIZE_INWORDS ); + USB_DIEPTXFS[ ep->txFifoNum - 1 ] = + ( depth << _USB_DIEPTXF1_INEPNTXFDEP_SHIFT ) | + ( start & _USB_DIEPTXF1_INEPNTXFSTADDR_MASK ); + } + } + } + } + + if ( totalRxFifoSize + totalTxFifoSize > MAX_DEVICE_FIFO_SIZE_INWORDS ) + return USB_STATUS_ILLEGAL; + + if ( start > MAX_DEVICE_FIFO_SIZE_INWORDS ) + return USB_STATUS_ILLEGAL; + + /* Flush the FIFO's */ + USBHAL_FlushTxFifo( 0x10 ); /* All Tx FIFO's */ + USBHAL_FlushRxFifo(); /* The Rx FIFO */ + + /* Disable all device interrupts */ + USB->DIEPMSK = 0; + USB->DOEPMSK = 0; + USB->DAINTMSK = 0; + USB->DIEPEMPMSK = 0; + + /* Disable all EP's, clear all EP ints. */ + for ( i = 0; i <= MAX_NUM_IN_EPS; i++ ) + { + USB_DINEPS[ i ].CTL = 0; + USB_DINEPS[ i ].TSIZ = 0; + USB_DINEPS[ i ].INT = 0xFFFFFFFF; + } + + for ( i = 0; i <= MAX_NUM_OUT_EPS; i++ ) + { + USB_DOUTEPS[ i ].CTL = 0; + USB_DOUTEPS[ i ].TSIZ = 0; + USB_DOUTEPS[ i ].INT = 0xFFFFFFFF; + } + +#if ( USB_DCTL_SFTDISCON_DEFAULT != 0 ) + USBD_Connect(); +#endif + + /* Enable VREGO sense. */ + USB->CTRL |= USB_CTRL_VREGOSEN; + USB->IFC = USB_IFC_VREGOSH | USB_IFC_VREGOSL; + USB->IEN = USB_IFC_VREGOSH | USB_IFC_VREGOSL; + /* Force a VREGO interrupt. */ + if ( USB->STATUS & USB_STATUS_VREGOS) + USB->IFS = USB_IFS_VREGOSH; + else + USB->IFS = USB_IFS_VREGOSL; + + return USB_STATUS_OK; +} + +USB_Status_TypeDef USBDHAL_ReconfigureFifos( uint32_t totalRxFifoSize, + uint32_t totalTxFifoSize ) +{ + uint8_t i, j; + uint16_t start, depth; + USBD_Ep_TypeDef *ep; + + /* Set Rx FIFO size */ + start = EFM32_MAX( totalRxFifoSize, MIN_EP_FIFO_SIZE_INWORDS ); + USB->GRXFSIZ = ( start << _USB_GRXFSIZ_RXFDEP_SHIFT ) & + _USB_GRXFSIZ_RXFDEP_MASK; + + /* Set Tx EP0 FIFO size */ + depth = EFM32_MAX( dev->ep[ 0 ].fifoSize, MIN_EP_FIFO_SIZE_INWORDS ); + USB->GNPTXFSIZ = ( ( depth << _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) & + _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK ) | + ( ( start << _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) & + _USB_GNPTXFSIZ_NPTXFSTADDR_MASK ); + + + /* Set Tx EP FIFO sizes for all IN ep's */ + for ( j = 1; j <= MAX_NUM_TX_FIFOS; j++ ) + { + for ( i = 1; i <= MAX_NUM_IN_EPS; i++ ) + { + ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | i ); + if ( ep ) /* Is EP in use ? */ + { + if ( ep->txFifoNum == j ) /* Is it correct FIFO number ? */ + { + start += depth; + depth = EFM32_MAX( ep->fifoSize, MIN_EP_FIFO_SIZE_INWORDS ); + USB_DIEPTXFS[ ep->txFifoNum - 1 ] = + ( depth << _USB_DIEPTXF1_INEPNTXFDEP_SHIFT ) | + ( start & _USB_DIEPTXF1_INEPNTXFSTADDR_MASK ); + } + } + } + } + + if ( totalRxFifoSize + totalTxFifoSize > MAX_DEVICE_FIFO_SIZE_INWORDS ) + return USB_STATUS_ILLEGAL; + + if ( start > MAX_DEVICE_FIFO_SIZE_INWORDS ) + return USB_STATUS_ILLEGAL; + + /* Flush the FIFO's */ + USBHAL_FlushTxFifo( 0x10 ); /* All Tx FIFO's */ + USBHAL_FlushRxFifo(); /* The Rx FIFO */ + + return USB_STATUS_OK; +} + +void USBDHAL_Disconnect( void ) +{ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SFTDISCON; +} + +void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep ) +{ + /* Clear epdis & inepnakeff INT's */ + USB_DINEPS[ ep->num ].INT |= USB_DIEP_INT_EPDISBLD | + USB_DIEP_INT_INEPNAKEFF; + + /* Enable epdis & inepnakeff INT's */ + USB->DIEPMSK |= USB_DIEPMSK_EPDISBLDMSK | USB_DIEPMSK_INEPNAKEFFMSK; + USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL & + ~DEPCTL_WO_BITMASK ) | + USB_DIEP_CTL_SNAK; + + /* Wait for inepnakeff INT */ + while ( !( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_INEPNAKEFF ) ) {} + USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_INEPNAKEFF; + USB->DIEPMSK &= ~USB_DIEPMSK_INEPNAKEFFMSK; + + DEBUG_USB_INT_LO_PUTCHAR( '.' ); + + USBDHAL_SetEPDISNAK( ep ); + /* Wait for epdis INT */ + while ( !( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_EPDISBLD ) ) {} + USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_EPDISBLD; + USB->DIEPMSK &= ~USB_DIEPMSK_EPDISBLDMSK; + USBHAL_FlushTxFifo( ep->txFifoNum ); + + /* Clear any interrupts generated by the abort sequence. */ + NVIC_ClearPendingIRQ( USB_IRQn ); + + DEBUG_USB_INT_LO_PUTCHAR( '.' ); +} + +void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep ) +{ + int cnt; + + /* Clear epdis INT's */ + USB_DOUTEPS[ ep->num ].INT |= USB_DOEP_INT_EPDISBLD; + + /* Clear Global OUT NAK if already set */ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK; + USB->GINTMSK |= USB_GINTMSK_GOUTNAKEFFMSK; /* Enable GOUTNAKEFF int */ + + /* Set Global OUT NAK */ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SGOUTNAK; + + /* Wait for goutnakeff */ + cnt = EPABORT_BREAK_LOOP_COUNT; + while ( !( USB->GINTSTS & USB_GINTSTS_GOUTNAKEFF ) && cnt ) + { + cnt--; + } + + USB->GINTMSK &= ~USB_GINTMSK_GOUTNAKEFFMSK; /* Disable GOUTNAKEFF int */ + USB->DOEPMSK |= USB_DOEPMSK_EPDISBLDMSK; /* Enable EPDIS interrupt */ + + DEBUG_USB_INT_LO_PUTCHAR( ',' ); + + USBDHAL_SetEPDISNAK( ep ); /* Disable ep */ + + /* Wait for epdis INT */ + cnt = EPABORT_BREAK_LOOP_COUNT; + while ( !( USBDHAL_GetOutEpInts( ep ) & USB_DOEP_INT_EPDISBLD ) && cnt ) + { + cnt--; + } + + USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_EPDISBLD; + USB->DOEPMSK &= ~USB_DOEPMSK_EPDISBLDMSK; /* Disable EPDIS interrupt */ + + /* Clear Global OUT NAK */ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK; + + /* Clear any interrupts generated by the abort sequence. */ + NVIC_ClearPendingIRQ( USB_IRQn ); + + DEBUG_USB_INT_LO_PUTCHAR( ',' ); +} + +void USBDHAL_AbortAllEps( void ) +{ + int i, cnt; + USBD_Ep_TypeDef *ep; + uint16_t im, om, inmask=0, outmask=0; + + /* Clear epdis & inepnakeff INT's */ + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + ep = &dev->ep[i]; + if ( ep->state != D_EP_IDLE ) + { + if ( ep->in ) + { + inmask |= ep->mask; + USB_DINEPS[ ep->num ].INT |= USB_DIEP_INT_EPDISBLD | + USB_DIEP_INT_INEPNAKEFF; + } + else + { + outmask |= ep->mask; + USB_DOUTEPS[ ep->num ].INT |= USB_DOEP_INT_EPDISBLD; + } + } + } + + if ( inmask ) + { + /* Enable epdis & inepnakeff INT's */ + USB->DIEPMSK |= USB_DIEPMSK_EPDISBLDMSK | USB_DIEPMSK_INEPNAKEFFMSK; + + /* Set NAK on all IN ep's */ + im = inmask; + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + ep = &dev->ep[i]; + if ( im & ep->mask ) + { + USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL & + ~DEPCTL_WO_BITMASK ) | + USB_DIEP_CTL_SNAK; + } + } + } + + if ( outmask ) + { + /* Clear Global OUT NAK if already set */ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK; + + USB->GINTMSK |= USB_GINTMSK_GOUTNAKEFFMSK; /* Enable GOUTNAKEFF int */ + + /* Set Global OUT NAK */ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SGOUTNAK; + + /* Wait for goutnakeff */ + cnt = EPABORT_BREAK_LOOP_COUNT; + while ( !( USB->GINTSTS & USB_GINTSTS_GOUTNAKEFF ) && cnt ) + { + cnt--; + } + USB->GINTMSK &= ~USB_GINTMSK_GOUTNAKEFFMSK; /* Disable GOUTNAKEFF int */ + USB->DOEPMSK |= USB_DOEPMSK_EPDISBLDMSK; /* Enable EPDIS interrupt */ + } + + if ( inmask ) + { + /* Wait for inepnakeff INT on all IN ep's */ + im = inmask; + cnt = EPABORT_BREAK_LOOP_COUNT; + do + { + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + ep = &dev->ep[i]; + if ( im & ep->mask ) + { + if ( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_INEPNAKEFF ) + { + USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_INEPNAKEFF; + im &= ~ep->mask; + } + } + } + cnt--; + } while ( im && cnt ); + USB->DIEPMSK &= ~USB_DIEPMSK_INEPNAKEFFMSK; + } + + DEBUG_USB_INT_LO_PUTCHAR( '\'' ); + + /* Disable ep's */ + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + ep = &dev->ep[i]; + if ( ep->state != D_EP_IDLE ) + { + USBDHAL_SetEPDISNAK( ep ); + } + } + + /* Wait for epdis INT */ + im = inmask; + om = outmask; + cnt = EPABORT_BREAK_LOOP_COUNT; + do + { + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + ep = &dev->ep[i]; + if ( ep->in && ( im & ep->mask ) ) + { + if ( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_EPDISBLD ) + { + USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_EPDISBLD; + im &= ~ep->mask; + } + } + + if ( !ep->in && ( om & ep->mask ) ) + { + if ( USBDHAL_GetOutEpInts( ep ) & USB_DOEP_INT_EPDISBLD ) + { + USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_EPDISBLD; + om &= ~ep->mask; + } + } + } + cnt--; + } while ( ( im || om ) && cnt ); + + if ( inmask ) + { + USB->DIEPMSK &= ~USB_DIEPMSK_EPDISBLDMSK; /* Disable EPDIS interrupt */ + USBHAL_FlushTxFifo( 0x10 ); /* Flush all Tx FIFO's */ + } + + if ( outmask ) + { + USB->DOEPMSK &= ~USB_DOEPMSK_EPDISBLDMSK; /* Disable EPDIS interrupt */ + /* Clear Global OUT NAK */ + USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK; + } + + DEBUG_USB_INT_LO_PUTCHAR( '\'' ); +} + +void USBDHAL_AbortAllTransfers( USB_Status_TypeDef reason ) +{ + int i; + USBD_Ep_TypeDef *ep; + USB_XferCompleteCb_TypeDef callback; + + if ( reason != USB_STATUS_DEVICE_RESET ) + { + USBDHAL_AbortAllEps(); + } + + for ( i = 1; i <= NUM_EP_USED; i++ ) + { + ep = &(dev->ep[i]); + if ( ep->state != D_EP_IDLE ) + { + ep->state = D_EP_IDLE; + if ( ep->xferCompleteCb ) + { + callback = ep->xferCompleteCb; + ep->xferCompleteCb = NULL; + + if ( ( dev->lastState == USBD_STATE_CONFIGURED ) && + ( dev->state == USBD_STATE_ADDRESSED ) ) + { + USBDHAL_DeactivateEp( ep ); + } + + DEBUG_TRACE_ABORT( reason ); + callback( reason, ep->xferred, ep->remaining ); + } + } + } + + /* Clear any interrupts generated by the abort sequence. */ + NVIC_ClearPendingIRQ( USB_IRQn ); +} +#endif /* defined( USB_DEVICE ) */ + +#if defined( USB_HOST ) +USB_Status_TypeDef USBHHAL_CoreInit( uint32_t rxFifoSize, + uint32_t nptxFifoSize, + uint32_t ptxFifoSize ) +{ + uint8_t i; + + rxFifoSize /= 4; /* Convert from byte count to word count. */ + nptxFifoSize /= 4; + ptxFifoSize /= 4; + + CMU_ClockEnable( cmuClock_GPIO, true ); + GPIO_PinModeSet( gpioPortF, 5, gpioModePushPull, 0 ); /* Enable VBUSEN pin */ + +#if ( USB_VBUSOVRCUR_PORT != USB_VBUSOVRCUR_PORT_NONE ) + /* Enable VBUS overcurrent flag pin. */ + GPIO_PinModeSet( USB_VBUSOVRCUR_PORT, USB_VBUSOVRCUR_PIN, gpioModeInput, 0 ); +#endif + + USB->ROUTE = USB_ROUTE_PHYPEN | USB_ROUTE_VBUSENPEN; /* Enable PHY pins. */ + USBHAL_CoreReset(); /* Reset USB core */ + + /* Force Host Mode */ + USB->GUSBCFG = ( USB->GUSBCFG & + ~(GUSBCFG_WO_BITMASK | USB_GUSBCFG_FORCEDEVMODE ) ) | + USB_GUSBCFG_FORCEHSTMODE; + + INT_Enable(); + USBTIMER_DelayMs( 100 ); + INT_Disable(); + + /* Set 48 MHz PHY clock, FS/LS mode */ + USB->HCFG = ( USB->HCFG & ~_USB_HCFG_FSLSPCLKSEL_MASK ) | + ( 1 << _USB_HCFG_FSLSPCLKSEL_SHIFT ) | + ( USB_HCFG_FSLSSUPP ); + + USB->GAHBCFG = ( USB->GAHBCFG & ~_USB_GAHBCFG_HBSTLEN_MASK ) | + USB_GAHBCFG_DMAEN | USB_GAHBCFG_HBSTLEN_INCR; + + /* Set Rx FIFO size */ + USB->GRXFSIZ = ( rxFifoSize << _USB_GRXFSIZ_RXFDEP_SHIFT ) & + _USB_GRXFSIZ_RXFDEP_MASK; + + /* Set Tx FIFO sizes */ + USB->GNPTXFSIZ = ( ( nptxFifoSize << + _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) & + _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK ) | + ( ( rxFifoSize << + _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) & + _USB_GNPTXFSIZ_NPTXFSTADDR_MASK ); + + USB->HPTXFSIZ = ( ( ptxFifoSize << _USB_HPTXFSIZ_PTXFSIZE_SHIFT ) & + _USB_HPTXFSIZ_PTXFSIZE_MASK ) | + ( ( ( rxFifoSize + nptxFifoSize ) + << _USB_HPTXFSIZ_PTXFSTADDR_SHIFT ) & + _USB_HPTXFSIZ_PTXFSTADDR_MASK ); + + /* Flush Tx and Rx FIFO's */ + USBHAL_FlushTxFifo( 0x10 ); + USBHAL_FlushRxFifo(); + + for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ ) + { + USB->HC[ i ].CHAR = USB_HC_CHAR_CHDIS; /* Disable channel */ + USB->HC[ i ].INT = 0xFFFFFFFF; /* Clear pending interrupts */ + } + + /* Enable and halt all channels */ + for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ ) + { + USB->HC[ i ].CHAR |= USB_HC_CHAR_CHDIS | USB_HC_CHAR_CHENA; + do + { + __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); + } + while ( USB->HC[ i ].CHAR & USB_HC_CHAR_CHENA ); + } + + /* Disable all interrupts */ + for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ ) + { + USB->HC[ i ].INTMSK = 0; + } + + USB->HAINTMSK = 0; + + return USB_STATUS_OK; +} + +void USBHHAL_HCHalt( int hcnum, uint32_t hcchar ) +{ + hcchar |= USB_HC_CHAR_CHENA | USB_HC_CHAR_CHDIS; + USB->HC[ hcnum ].CHAR = hcchar; +} + +void USBHHAL_HCInit( int hcnum ) +{ + USBH_Ep_TypeDef *ep; + + ep = hcs[ hcnum ].ep; + USB->HC[ hcnum ].INT = 0xFFFFFFFF; /* Clear all interrupt flags */ + + switch ( ep->type ) /* Enable host channel int. types */ + { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + case USB_EPTYPE_INTR: + USB->HC[ hcnum ].INTMSK = USB_HC_INT_CHHLTD; + break; + } + + hcs[ hcnum ].errorCnt = 0; + + USB->HAINTMSK |= 1 << hcnum; /* Enable host channel interrupt */ + + USB->HC[ hcnum ].CHAR = /* Program HCCHAR register */ + ( ep->parentDevice->addr << _USB_HC_CHAR_DEVADDR_SHIFT ) | + ( ( ep->addr & USB_EPNUM_MASK ) << _USB_HC_CHAR_EPNUM_SHIFT ) | + ( ep->type << _USB_HC_CHAR_EPTYPE_SHIFT ) | + ( ep->packetSize << _USB_HC_CHAR_MPS_SHIFT ) | + ( ep->in ? USB_HC_CHAR_EPDIR : 0 ) | + ( ep->parentDevice->speed == + HPRT_L_SPEED >> _USB_HPRT_PRTSPD_SHIFT + ? USB_HC_CHAR_LSPDDEV : 0 ); +} + +void USBHHAL_HCStart( int hcnum ) +{ + USBH_Hc_TypeDef *hc; + uint16_t packets, len; + + hc = &hcs[ hcnum ]; + hc->status = 0; + hc->idle = false; + + if ( hc->remaining > 0 ) + { + packets = ( hc->remaining + hc->ep->packetSize - 1 ) / hc->ep->packetSize; + } + else + { + packets = 1; + } + + if ( hc->ep->in ) + { + len = packets * hc->ep->packetSize; + } + else + { + len = hc->remaining; + } + + /* Initialize the HCTSIZn register */ + hc->hwXferSize = len; + USB->HC[ hcnum ].TSIZ = + ( ( len << _USB_HC_TSIZ_XFERSIZE_SHIFT ) & + _USB_HC_TSIZ_XFERSIZE_MASK ) | + ( ( packets << _USB_HC_TSIZ_PKTCNT_SHIFT ) & + _USB_HC_TSIZ_PKTCNT_MASK ) | + ( ( hc->ep->toggle << _USB_HC_TSIZ_PID_SHIFT ) & + _USB_HC_TSIZ_PID_MASK ); + + USB->HC[ hcnum ].DMAADDR = (uint32_t)hc->buf; + + USBHHAL_HCActivate( hcnum, + USB->HC[ hcnum ].CHAR, + hc->ep->type == USB_EPTYPE_INTR ); +} +#endif /* defined( USB_HOST ) */ + +/** @endcond */ + +#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice/targets/TARGET_Silicon_Labs/src/em_usbtimer.c Fri Apr 28 17:01:10 2017 +0000 @@ -0,0 +1,381 @@ +/***************************************************************************//** + * @file em_usbtimer.c + * @brief USB protocol stack library, timer API. + * @version 3.20.14 + ******************************************************************************* + * @section License + * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + ******************************************************************************* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#include "em_device.h" +#if defined( USB_PRESENT ) && ( USB_COUNT == 1 ) +#include "em_usb.h" +#if defined( USB_DEVICE ) || defined( USB_HOST ) +#include "em_cmu.h" +#include "em_timer.h" +#include "em_usbtypes.h" +#include "em_usbhal.h" + +#include "device_peripherals.h" + +/* + * Use one HW timer to serve n software milisecond timers. + * A timer is, when running, in a linked list of timers. + * A given timers timeout period is the acculmulated timeout + * of all timers preceeding it in the queue. + * This makes timer start (linked list insertion) computing intensive, + * but the checking of the queue at each tick very effective. + * ______ ______ ______ + * | | --->| | --->| | + * head --> | | | | | | | | + * |______|--- |______|--- |______|---/ NULL + */ + +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +#ifndef USB_TIMER +#error HW platform must define the timer to use for USB +#endif + +#if ( USB_TIMER == USB_TIMER0 ) && ( TIMER_COUNT >= 1 ) + #define TIMER TIMER0 + #define TIMER_CLK cmuClock_TIMER0 + #define TIMER_IRQ TIMER0_IRQn + #define TIMER_IRQHandler TIMER0_IRQHandler + +#elif ( USB_TIMER == USB_TIMER1 ) && ( TIMER_COUNT >= 2 ) + #define TIMER TIMER1 + #define TIMER_CLK cmuClock_TIMER1 + #define TIMER_IRQ TIMER1_IRQn + #define TIMER_IRQHandler TIMER1_IRQHandler + +#elif ( USB_TIMER == USB_TIMER2 ) && ( TIMER_COUNT >= 3 ) + #define TIMER TIMER2 + #define TIMER_CLK cmuClock_TIMER2 + #define TIMER_IRQ TIMER2_IRQn + #define TIMER_IRQHandler TIMER2_IRQHandler + +#elif ( USB_TIMER == USB_TIMER3 ) && ( TIMER_COUNT == 4 ) + #define TIMER TIMER3 + #define TIMER_CLK cmuClock_TIMER3 + #define TIMER_IRQ TIMER3_IRQn + #define TIMER_IRQHandler TIMER3_IRQHandler + +#else +#error "Illegal USB TIMER definition" +#endif + +typedef struct _timer +{ + uint32_t timeout; /* Delta value relative to prev. timer */ + struct _timer *next; + USBTIMER_Callback_TypeDef callback; + bool running; +} USBTIMER_Timer_TypeDef; + +#if ( NUM_QTIMERS > 0 ) +static USBTIMER_Timer_TypeDef timers[ NUM_QTIMERS ]; +static USBTIMER_Timer_TypeDef *head = NULL; +#endif + +static uint32_t ticksPrMs, ticksPr1us, ticksPr10us, ticksPr100us; + +#if ( NUM_QTIMERS > 0 ) + +static void TimerTick( void ); + +void TIMER_IRQHandler( void ) +{ + uint32_t flags; + + flags = TIMER_IntGet( TIMER ); + + if ( flags & TIMER_IF_CC0 ) + { + TIMER_IntClear( TIMER, TIMER_IFC_CC0 ); + TIMER_CompareSet( TIMER, 0, TIMER_CaptureGet( TIMER, 0 ) + ticksPrMs ); + TimerTick(); + } +} +#endif /* ( NUM_QTIMERS > 0 ) */ + +static void DelayTicks( uint16_t ticks ) +{ + uint16_t startTime; + volatile uint16_t now; + + if ( ticks ) + { + startTime = TIMER_CounterGet( TIMER ); + do + { + now = TIMER_CounterGet(TIMER); + } while ( (uint16_t)( now - startTime ) < ticks ); + } +} + +/** @endcond */ + +/** @addtogroup USB_COMMON + * @{*/ + +/***************************************************************************//** + * @brief + * Active wait millisecond delay function. Can also be used inside + * interrupt handlers. + * + * @param[in] msec + * Number of milliseconds to wait. + ******************************************************************************/ +void USBTIMER_DelayMs( uint32_t msec ) +{ + uint64_t totalTicks; + + totalTicks = (uint64_t)ticksPrMs * msec; + while ( totalTicks > 20000 ) + { + DelayTicks( 20000 ); + totalTicks -= 20000; + } + DelayTicks( (uint16_t)totalTicks ); +} + +/***************************************************************************//** + * @brief + * Active wait microsecond delay function. Can also be used inside + * interrupt handlers. + * + * @param[in] usec + * Number of microseconds to wait. + ******************************************************************************/ +void USBTIMER_DelayUs( uint32_t usec ) +{ + uint64_t totalTicks; + + totalTicks = (uint64_t)ticksPr1us * usec; + if ( totalTicks == 0 ) + { + usec /= 10; + totalTicks = (uint64_t)ticksPr10us * usec; + + if ( totalTicks == 0 ) + { + usec /= 10; + totalTicks = (uint64_t)ticksPr100us * usec; + } + } + + while ( totalTicks > 60000 ) + { + DelayTicks( 60000 ); + totalTicks -= 60000; + } + DelayTicks( (uint16_t)totalTicks ); +} + +/***************************************************************************//** + * @brief + * Activate the hardware timer used to pace the 1 millisecond timer system. + * + * @details + * Call this function whenever the HFPERCLK frequency is changed. + * This function is initially called by HOST and DEVICE stack xxxx_Init() + * functions. + ******************************************************************************/ +void USBTIMER_Init( void ) +{ + uint32_t freq; + TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT; + TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT; + + freq = CMU_ClockFreqGet( cmuClock_HFPER ); + ticksPrMs = ( freq + 500 ) / 1000; + ticksPr1us = ( freq + 500000 ) / 1000000; + ticksPr10us = ( freq + 50000 ) / 100000; + ticksPr100us = ( freq + 5000 ) / 10000; + + timerCCInit.mode = timerCCModeCompare; + CMU_ClockEnable( TIMER_CLK, true ); + TIMER_TopSet( TIMER, 0xFFFF ); + TIMER_InitCC( TIMER, 0, &timerCCInit ); + TIMER_Init( TIMER, &timerInit ); + +#if ( NUM_QTIMERS > 0 ) + TIMER_IntClear( TIMER, 0xFFFFFFFF ); + TIMER_IntEnable( TIMER, TIMER_IEN_CC0 ); + TIMER_CompareSet( TIMER, 0, TIMER_CounterGet( TIMER ) + ticksPrMs ); + NVIC_ClearPendingIRQ( TIMER_IRQ ); + NVIC_EnableIRQ( TIMER_IRQ ); +#endif /* ( NUM_QTIMERS > 0 ) */ +} + +#if ( NUM_QTIMERS > 0 ) || defined( DOXY_DOC_ONLY ) +/***************************************************************************//** + * @brief + * Start a timer. + * + * @details + * If the timer is already running, it will be restarted with new timeout. + * + * @param[in] id + * Timer id (0..). + * + * @param[in] timeout + * Number of milliseconds before timer will elapse. + * + * @param[in] callback + * Function to be called on timer elapse, ref. @ref USBTIMER_Callback_TypeDef. + ******************************************************************************/ +void USBTIMER_Start( uint32_t id, uint32_t timeout, + USBTIMER_Callback_TypeDef callback ) +{ + uint32_t accumulated; + USBTIMER_Timer_TypeDef *this, **last; + + INT_Disable(); + + if ( timers[ id ].running ) + { + USBTIMER_Stop( id ); + } + + if ( timeout == 0 ) + { + callback(); + INT_Enable(); + return; + } + + timers[ id ].running = true; + timers[ id ].callback = callback; + timers[ id ].next = NULL; + + if ( !head ) /* Queue empty ? */ + { + timers[ id ].timeout = timeout; + head = &timers[ id ]; + } + else + { + this = head; + last = &head; + accumulated = 0; + + /* Do a sorted insert */ + while ( this ) + { + if ( timeout < accumulated + this->timeout ) /* Insert before "this" ? */ + { + timers[ id ].timeout = timeout - accumulated; + timers[ id ].next = this; + *last = &timers[ id ]; + this->timeout -= timers[ id ].timeout; /* Adjust timeout */ + break; + } + else if ( this->next == NULL ) /* At end of queue ? */ + { + timers[ id ].timeout = timeout - accumulated - this->timeout; + this->next = &timers[ id ]; + break; + } + accumulated += this->timeout; + last = &this->next; + this = this->next; + } + } + + INT_Enable(); +} + +/***************************************************************************//** + * @brief + * Stop a timer. + * + * @param[in] id + * Timer id (0..). + ******************************************************************************/ +void USBTIMER_Stop( uint32_t id ) +{ + USBTIMER_Timer_TypeDef *this, **last; + + INT_Disable(); + + if ( head ) /* Queue empty ? */ + { + this = head; + last = &head; + timers[ id ].running = false; + + while ( this ) + { + if ( this == &timers[ id ] ) /* Correct timer ? */ + { + if ( this->next ) + { + this->next->timeout += timers[ id ].timeout; /* Adjust timeout */ + } + *last = this->next; + break; + } + last = &this->next; + this = this->next; + } + } + + INT_Enable(); +} +#endif /* ( NUM_QTIMERS > 0 ) */ + +/** @} (end addtogroup USB_COMMON) */ + +#if ( NUM_QTIMERS > 0 ) +/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ + +static void TimerTick( void ) +{ + USBTIMER_Callback_TypeDef cb; + + INT_Disable(); + + if ( head ) + { + head->timeout--; + + while ( head ) + { + if ( head->timeout == 0 ) + { + cb = head->callback; + head->running = false; + head = head->next; + /* The callback may place new items in the queue !!! */ + if ( cb ) + { + (cb)(); + } + continue; /* There might be more than one timeout pr. tick */ + } + break; + } + } + + INT_Enable(); +} +/** @endcond */ +#endif /* ( NUM_QTIMERS > 0 ) */ + +#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */ +#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */