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.
Dependents: Peach_AudioChannelDividerAndCompensator
Diff: USBDevice/USBHAL_RZ_A1H.cpp
- Revision:
- 40:3b1c43ac045c
- Parent:
- 36:4d3e7f3d5211
- Child:
- 42:4f589e246b9e
diff -r 1dbc943a21cf -r 3b1c43ac045c USBDevice/USBHAL_RZ_A1H.cpp
--- a/USBDevice/USBHAL_RZ_A1H.cpp Tue Jan 06 16:16:27 2015 +0000
+++ b/USBDevice/USBHAL_RZ_A1H.cpp Mon Jan 19 14:30:30 2015 +0000
@@ -1,19 +1,26 @@
/* 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:
+* 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 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.
+* 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)
@@ -59,8 +66,9 @@
USB_FUNCTION_DIR_P_OUT |
USB_FUNCTION_EP1,
( ( ( 64) / 64 - 1 ) << 10 ) | 0x04u,
- 64,
- DEVDRV_USBF_OFF | 0,
+ MAX_PACKET_SIZE_EP1,
+ DEVDRV_USBF_OFF |
+ ( 3 << USB_PIPEPERI_IITV_SHIFT ),
},
{
EP1IN, /*EP1: Host <- Func, INT*/
@@ -73,8 +81,9 @@
USB_FUNCTION_DIR_P_IN |
USB_FUNCTION_EP1,
( ( ( 64) / 64 - 1 ) << 10 ) | 0x05u,
- 64,
- DEVDRV_USBF_OFF | 0,
+ MAX_PACKET_SIZE_EP1,
+ DEVDRV_USBF_OFF |
+ ( 3 << USB_PIPEPERI_IITV_SHIFT ),
},
{
EP2OUT, /*EP2: Host -> Func, BULK*/
@@ -87,8 +96,9 @@
USB_FUNCTION_DIR_P_OUT |
USB_FUNCTION_EP2,
( ( (2048) / 64 - 1 ) << 10 ) | 0x30u,
- 512,
- DEVDRV_USBF_OFF | 0,
+ MAX_PACKET_SIZE_EP2,
+ DEVDRV_USBF_OFF |
+ ( 0 << USB_PIPEPERI_IITV_SHIFT ),
},
{
EP2IN, /*EP2: Host <- Func, BULK*/
@@ -101,8 +111,9 @@
USB_FUNCTION_DIR_P_IN |
USB_FUNCTION_EP2,
( ( (2048) / 64 - 1 ) << 10 ) | 0x50u,
- 512,
- DEVDRV_USBF_OFF | 0,
+ MAX_PACKET_SIZE_EP2,
+ DEVDRV_USBF_OFF |
+ ( 0 << USB_PIPEPERI_IITV_SHIFT ),
},
{
EP3OUT, /*EP3: Host -> Func, ISO*/
@@ -110,13 +121,14 @@
USB_FUNCTION_ISO |
USB_FUNCTION_BFREOFF |
USB_FUNCTION_DBLBON |
- USB_FUNCTION_CNTMDON |
+ USB_FUNCTION_CNTMDOFF |
USB_FUNCTION_SHTNAKON |
USB_FUNCTION_DIR_P_OUT |
USB_FUNCTION_EP3,
- ( ( (1024) / 64 - 1 ) << 10 ) | 0x10u,
- 192,
- DEVDRV_USBF_OFF | 1,
+ ( ( ( 512) / 64 - 1 ) << 10 ) | 0x10u,
+ MAX_PACKET_SIZE_EP3,
+ DEVDRV_USBF_OFF |
+ ( 0 << USB_PIPEPERI_IITV_SHIFT ),
},
{
EP3IN, /*EP3: Host <- Func, ISO*/
@@ -124,13 +136,14 @@
USB_FUNCTION_ISO |
USB_FUNCTION_BFREOFF |
USB_FUNCTION_DBLBON |
- USB_FUNCTION_CNTMDON |
+ USB_FUNCTION_CNTMDOFF |
USB_FUNCTION_SHTNAKOFF |
USB_FUNCTION_DIR_P_IN |
USB_FUNCTION_EP3,
- ( ( (1024) / 64 - 1 ) << 10 ) | 0x20u,
- 192,
- DEVDRV_USBF_OFF | 1,
+ ( ( ( 512) / 64 - 1 ) << 10 ) | 0x20u,
+ MAX_PACKET_SIZE_EP3,
+ DEVDRV_USBF_OFF |
+ ( 0 << USB_PIPEPERI_IITV_SHIFT ),
},
{ /*terminator*/
0, 0, 0, 0, 0,
@@ -142,13 +155,12 @@
/* 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 *usb0_en;
+//static DigitalOut *usb0_en;
static uint16_t EP0_read_status;
static uint16_t EPx_read_status;
@@ -160,17 +172,28 @@
volatile static uint16_t recv_error;
-
/*************************************************************************/
/* prototypes for C */
+extern "C" {
+ void usb0_function_BRDYInterruptPIPE0 (uint16_t status, uint16_t intenb,
+ USBHAL *object, void (USBHAL::*EP0func)(void));
-/* This C++ functions changed to macro functions.
- static uint32_t EP2PIPE(uint8_t endpoint);
- static void usb0_function_save_request(void);
- void usb0_function_BRDYInterrupt(uint16_t status, uint16_t intenb);
- void usb0_function_NRDYInterrupt (uint16_t status, uint16_t intenb);
- void usb0_function_BEMPInterrupt (uint16_t status, uint16_t intenb);
-*/
+ void usb0_function_BRDYInterrupt (uint16_t status, uint16_t intenb,
+ USBHAL *object, bool (USBHAL::*epCallback[])(void));
+
+ void usb0_function_NRDYInterruptPIPE0(uint16_t status, uint16_t intenb,
+ USBHAL *object, void (USBHAL::*EP0func)(void));
+
+ void usb0_function_NRDYInterrupt (uint16_t status, uint16_t intenb,
+ USBHAL *object, bool (USBHAL::*epCallback[])(void));
+
+ void usb0_function_BEMPInterruptPIPE0(uint16_t status, uint16_t intenb,
+ USBHAL *object, void (USBHAL::*EP0func)(void));
+
+ void usb0_function_BEMPInterrupt (uint16_t status, uint16_t intenb,
+ USBHAL *object, bool (USBHAL::*epCallback[])(void));
+}
+
/*************************************************************************/
/* macros */
@@ -182,66 +205,72 @@
* : uint16_t intenb ; BRDYENB Register Value
* Return Value : none
*****************************************************************************/
-#define usb0_function_BRDYInterruptPIPE0(status, intenb) \
- { \
- volatile uint16_t dumy_sts; \
- uint16_t read_status; \
- \
- USB200.BRDYSTS = \
- (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0]; \
- RZA_IO_RegWrite_16( \
- &USB200.CFIFOSEL, USB_FUNCTION_PIPE0, \
- USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE); \
- \
- g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0] = \
- g_usb0_function_data_count[USB_FUNCTION_PIPE0]; \
- \
- read_status = usb0_function_read_buffer_c(USB_FUNCTION_PIPE0); \
- \
- g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0] -= \
- g_usb0_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 */ \
- usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); \
- \
- /*callback*/ \
- EP0out(); \
- break; \
- \
- case USB_FUNCTION_READSHRT: /* End of data read */ \
- usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0); \
- /* PID = BUF */ \
- usb0_function_set_pid_buf(USB_FUNCTION_PIPE0); \
- \
- /*callback*/ \
- EP0out(); \
- break; \
- \
- case USB_FUNCTION_READOVER: /* FIFO access error */ \
- /* Buffer Clear */ \
- USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; \
- usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0); \
- /* Req Error */ \
- usb0_function_set_pid_stall(USB_FUNCTION_PIPE0); \
- \
- /*callback*/ \
- EP0out(); \
- break; \
- \
- case DEVDRV_USBF_FIFOERROR: /* FIFO access error */ \
- default: \
- usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0); \
- /* Req Error */ \
- usb0_function_set_pid_stall(USB_FUNCTION_PIPE0); \
- break; \
- } \
- /* Three dummy reads for clearing interrupt requests */ \
- dumy_sts = USB200.BRDYSTS; \
+extern "C" {
+ void usb0_function_BRDYInterruptPIPE0 (
+ uint16_t status,
+ uint16_t intenb,
+ USBHAL *object,
+ void (USBHAL::*EP0func)(void)
+ )
+ {
+ volatile uint16_t dumy_sts;
+ uint16_t read_status;
+
+ USB200.BRDYSTS =
+ (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0];
+ RZA_IO_RegWrite_16(
+ &USB200.CFIFOSEL, USB_FUNCTION_PIPE0,
+ USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
+
+ g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0] =
+ g_usb0_function_data_count[USB_FUNCTION_PIPE0];
+
+ read_status = usb0_function_read_buffer_c(USB_FUNCTION_PIPE0);
+
+ g_usb0_function_PipeDataSize[USB_FUNCTION_PIPE0] -=
+ g_usb0_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 */
+ usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);
+
+ /*callback*/
+ (object->*EP0func)();
+ break;
+
+ case USB_FUNCTION_READSHRT: /* End of data read */
+ usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0);
+ /* PID = BUF */
+ usb0_function_set_pid_buf(USB_FUNCTION_PIPE0);
+
+ /*callback*/
+ (object->*EP0func)();
+ break;
+
+ case USB_FUNCTION_READOVER: /* FIFO access error */
+ /* Buffer Clear */
+ USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+ usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0);
+ /* Req Error */
+ usb0_function_set_pid_stall(USB_FUNCTION_PIPE0);
+
+ /*callback*/
+ (object->*EP0func)();
+ break;
+
+ case DEVDRV_USBF_FIFOERROR: /* FIFO access error */
+ default:
+ usb0_function_disable_brdy_int(USB_FUNCTION_PIPE0);
+ /* Req Error */
+ usb0_function_set_pid_stall(USB_FUNCTION_PIPE0);
+ break;
+ }
+ /* Three dummy reads for clearing interrupt requests */
+ dumy_sts = USB200.BRDYSTS;
}
-
+}
/******************************************************************************
@@ -251,85 +280,100 @@
* : uint16_t intenb ; BRDYENB Register Value
* Return Value : none
*****************************************************************************/
-#define usb0_function_BRDYInterrupt(status, intenb) \
- { \
- volatile uint16_t dumy_sts; \
- \
- /************************************************************** \
- * 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 \
- *************************************************************/ \
- /* copied from usb0_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_usb0_function_bit_set[pipe]; \
- \
- if ((status & pipebit) && (intenb & pipebit)) { \
- USB200.BRDYSTS = (uint16_t)~pipebit; \
- USB200.BEMPSTS = (uint16_t)~pipebit; \
- \
- switch (g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) { \
- case USB_FUNCTION_D0FIFO_DMA: \
- if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) { \
- /*now, DMA is not supported*/ \
- 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) { \
- /*now, DMA is not supported*/ \
- 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; \
- } \
- break; \
- \
- case USB_FUNCTION_D1FIFO_DMA: \
- if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) { \
- /*now, DMA is not supported*/ \
- 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) { \
- /*now, DMA is not supported*/ \
- 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; \
- } \
- break; \
- \
- default: \
- ep = (g_usb0_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT; \
- ep <<= 1; \
- ep += (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0)? \
- (0): (1); \
- EPx_read_status = DEVDRV_USBF_PIPE_WAIT; \
- (instance->*(epCallback[ep - 2])) (); \
- EPx_read_status = DEVDRV_USBF_PIPE_DONE; \
- } \
- } \
- } \
- /* Three dummy reads for clearing interrupt requests */ \
- dumy_sts = USB200.BRDYSTS; \
+extern "C" {
+ void usb0_function_BRDYInterrupt(
+ uint16_t status,
+ uint16_t intenb,
+ USBHAL *object,
+ bool (USBHAL::*epCallback[])(void)
+ )
+ {
+ volatile uint16_t dumy_sts;
+
+ /**************************************************************
+ * 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
+ *************************************************************/
+ /* copied from usb0_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_usb0_function_bit_set[pipe];
+
+ if ((status & pipebit) && (intenb & pipebit)) {
+ USB200.BRDYSTS = (uint16_t)~pipebit;
+ USB200.BEMPSTS = (uint16_t)~pipebit;
+
+ switch (g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) {
+ case USB_FUNCTION_D0FIFO_DMA:
+ if (g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) {
+ /*now, DMA is not supported*/
+ 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) {
+ /*now, DMA is not supported*/
+ 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;
+ }
+ break;
+
+ case USB_FUNCTION_D1FIFO_DMA:
+ if (g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) {
+ /*now, DMA is not supported*/
+ 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) {
+ /*now, DMA is not supported*/
+ 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;
+ }
+ break;
+
+ default:
+ ep = (g_usb0_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
+ ep <<= 1;
+ if (RZA_IO_RegRead_16(
+ &g_usb0_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;
+ usb0_function_write_buffer(pipe);
+ }
+ }
+ }
+ }
+ /* Three dummy reads for clearing interrupt requests */
+ dumy_sts = USB200.BRDYSTS;
}
+}
/******************************************************************************
@@ -339,16 +383,24 @@
* : uint16_t intenb ; NRDYENB Register Value
* Return Value : none
*****************************************************************************/
-#define usb0_function_NRDYInterruptPIPE0(status, intenb) \
- { \
- volatile uint16_t dumy_sts; \
- \
- USB200.NRDYSTS = \
- (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0]; \
- \
- /* Three dummy reads for clearing interrupt requests */ \
- dumy_sts = USB200.NRDYSTS; \
+extern "C" {
+ void usb0_function_NRDYInterruptPIPE0(
+ uint16_t status,
+ uint16_t intenb,
+ USBHAL *object,
+ void (USBHAL::*EP0func)(void)
+ )
+ {
+ volatile uint16_t dumy_sts;
+
+ USB200.NRDYSTS =
+ (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0];
+
+ /* Three dummy reads for clearing interrupt requests */
+ dumy_sts = USB200.NRDYSTS;
}
+}
+
/******************************************************************************
* Function Name: usb0_function_NRDYInterrupt
@@ -357,16 +409,124 @@
* : uint16_t intenb ; NRDYENB Register Value
* Return Value : none
*****************************************************************************/
-#define usb0_function_NRDYInterrupt(status, intenb) \
- { \
- volatile uint16_t dumy_sts; \
- \
- usb0_function_nrdy_int(status, intenb); \
- \
- /* Three dummy reads for clearing interrupt requests */ \
- dumy_sts = USB200.NRDYSTS; \
+extern "C" {
+ void usb0_function_NRDYInterrupt(
+ uint16_t status,
+ uint16_t intenb,
+ USBHAL *object,
+ bool (USBHAL::*epCallback[])(void)
+ )
+ {
+ volatile uint16_t dumy_sts;
+
+ /**************************************************************
+ * 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
+ *************************************************************/
+ /* copied from usb0_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);
+
+ USB200.NRDYSTS = (uint16_t)~status;
+
+
+ if (RZA_IO_RegRead_16(&USB200.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_usb0_function_bit_set[pipe]) != g_usb0_function_bit_set[pipe]) {
+ continue;
+ }
+
+ if (g_usb0_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_WAIT) {
+ continue;
+ }
+
+#if 0
+ usb0_function_set_pid_nak(pipe);
+
+ size = (uint32_t)g_usb0_function_data_count[pipe];
+ mbw = usb0_function_get_mbw(
+ size, (uint32_t)g_usb0_function_data_pointer[pipe]);
+
+ usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
+ switch (usefifo) {
+
+ case USB_FUNCTION_D0FIFO_USE:
+ usb0_function_set_curpipe(
+ pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
+ USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR;
+ break;
+
+ case USB_FUNCTION_D1FIFO_USE:
+ usb0_function_set_curpipe(
+ pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
+ USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR;
+ break;
+
+ default:
+ usb0_function_set_curpipe(
+ pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
+ USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
+ break;
+ }
+
+ usb0_function_aclrm(pipe);
+
+ usb0_function_enable_nrdy_int(pipe);
+ usb0_function_enable_brdy_int(pipe);
+
+ usb0_function_set_pid_buf(pipe);
+#endif
+
+ 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 {
+ usb0_function_set_pid_buf(pipe);
+ }
+
+ ep = (g_usb0_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
+ ep <<= 1;
+ if (RZA_IO_RegRead_16(
+ &g_usb0_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 = USB200.NRDYSTS;
}
-
+}
/******************************************************************************
* Function Name: usb0_function_BEMPInterruptPIPE0
@@ -375,22 +535,29 @@
* : uint16_t intenb ; BEMPENB Register Value
* Return Value : none
*****************************************************************************/
-#define usb0_function_BEMPInterruptPIPE0(status, intenb) \
- { \
- volatile uint16_t dumy_sts; \
- \
- USB200.BEMPSTS = \
- (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0]; \
- RZA_IO_RegWrite_16( \
- &USB200.CFIFOSEL, USB_FUNCTION_PIPE0, \
- USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE); \
- \
- /*usb0_function_write_buffer_c(USB_FUNCTION_PIPE0);*/ \
- EP0in(); \
- \
- /* Three dummy reads for clearing interrupt requests */ \
- dumy_sts = USB200.BEMPSTS; \
+extern "C" {
+ void usb0_function_BEMPInterruptPIPE0(
+ uint16_t status,
+ uint16_t intenb,
+ USBHAL *object,
+ void (USBHAL::*EP0func)(void)
+ )
+ {
+ volatile uint16_t dumy_sts;
+
+ USB200.BEMPSTS =
+ (uint16_t)~g_usb0_function_bit_set[USB_FUNCTION_PIPE0];
+ RZA_IO_RegWrite_16(
+ &USB200.CFIFOSEL, USB_FUNCTION_PIPE0,
+ USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
+
+ /*usb0_function_write_buffer_c(USB_FUNCTION_PIPE0);*/
+ (object->*EP0func)();
+
+ /* Three dummy reads for clearing interrupt requests */
+ dumy_sts = USB200.BEMPSTS;
}
+}
/******************************************************************************
@@ -400,17 +567,85 @@
* : uint16_t intenb ; BEMPENB Register Value
* Return Value : none
*****************************************************************************/
-#define usb0_function_BEMPInterrupt(status, intenb) \
- { \
- volatile uint16_t dumy_sts; \
- \
- usb0_function_bemp_int(status, intenb); \
- \
- /* Three dummy reads for clearing interrupt requests */ \
- dumy_sts = USB200.BEMPSTS; \
+extern "C" {
+ void usb0_function_BEMPInterrupt(
+ uint16_t status,
+ uint16_t intenb,
+ USBHAL *object,
+ bool (USBHAL::*epCallback[])(void)
+ )
+ {
+ volatile uint16_t dumy_sts;
+
+ /**************************************************************
+ * Function Name: usb0_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 usb0_function_intrn.c */
+ uint16_t pid;
+ uint16_t pipe;
+ uint16_t bitcheck;
+ uint16_t inbuf;
+ uint16_t ep;
+
+ bitcheck = (uint16_t)(status & intenb);
+
+ 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]) {
+ continue;
+ }
+
+ 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;
+
+ switch (g_usb0_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_usb0_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
+ ep <<= 1;
+ if (RZA_IO_RegRead_16(
+ &g_usb0_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 = USB200.BEMPSTS;
+ }
}
-
/******************************************************************************
* Function Name: EP2PIPE
* Description : Converts from endpoint to pipe
@@ -440,7 +675,7 @@
*bufO++ = USB200.USBINDX; \
/*data[6] data[6] <= wIndex*/ \
*bufO++ = USB200.USBLENG; \
-}
+ }
/*************************************************************************/
@@ -452,13 +687,17 @@
USBHAL::USBHAL(void)
{
/* ---- P4_1 : P4_1 (USB0_EN for GR-PEACH) ---- */
- usb0_en = new DigitalOut(P4_1, 1);
+ //usb0_en = new DigitalOut(P4_1, 1);
/* some constants */
int_id = USBI0_IRQn;
int_level = ( 2 << 3 );
clock_mode = USBFCLOCK_X1_48MHZ;
+#if 1
mode = USB_FUNCTION_HIGH_SPEED;
+#else
+ mode = USB_FUNCTION_FULL_SPEED;
+#endif
EP0_read_status = DEVDRV_USBF_WRITEEND;
EPx_read_status = DEVDRV_USBF_PIPE_DONE;
@@ -572,7 +811,7 @@
/* Unregisters interrupt function and priority */
InterruptHandlerRegister( int_id, (uint32_t)NULL );
- usb0_en = NULL;
+ //usb0_en = NULL;
instance = NULL;
}
@@ -580,7 +819,7 @@
void USBHAL::connect(void)
{
/* Activates USB0_EN */
- (*usb0_en) = 0;
+ //(*usb0_en) = 0;
}
@@ -588,7 +827,7 @@
void USBHAL::disconnect(void)
{
/* Deactivates USB0_EN */
- (*usb0_en) = 1;
+ //(*usb0_en) = 1;
}
@@ -790,15 +1029,19 @@
EP_STATUS status = EP_COMPLETED;
pipe_status = usb0_api_function_check_pipe_status(pipe, &pipe_size);
- pipe_size = (max_size < pipe_size)? (max_size): (pipe_size);
+
+ switch (pipe_status) {
+ case DEVDRV_USBF_PIPE_IDLE:
+ case DEVDRV_USBF_PIPE_WAIT:
+ usb0_api_function_set_pid_nak(pipe);
+ usb0_api_function_clear_pipe_status(pipe);
- if (pipe_status == DEVDRV_USBF_PIPE_IDLE) {
- usb0_api_function_set_pid_nak(pipe);
- usb0_api_function_clear_pipe_status(pipe);
+ usb0_api_function_start_receive_transfer(pipe, max_size, recv_buffer);
+ break;
- usb0_api_function_start_receive_transfer(pipe, pipe_size, recv_buffer);
- } else {
- status = EP_PENDING;
+ default:
+ status = EP_PENDING;
+ break;
}
return status;
@@ -819,14 +1062,18 @@
}
pipe_status = usb0_api_function_check_pipe_status(pipe, bytes_read);
- if (pipe_status == DEVDRV_USBF_PIPE_IDLE) {
- return EP_COMPLETED;
- }
- if (pipe_status == DEVDRV_USBF_PIPE_DONE) {
- return EP_COMPLETED;
- }
- if (pipe_status != DEVDRV_USBF_PIPE_WAIT) {
- return status;
+ 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 */
@@ -835,10 +1082,30 @@
/* receives data from pipe */
err = usb0_function_read_buffer(pipe);
recv_error = err;
+ switch (err) {
+ case USB_FUNCTION_READEND:
+ case USB_FUNCTION_READSHRT:
+ case USB_FUNCTION_READOVER:
+ *bytes_read = g_usb0_function_PipeDataSize[pipe];
+ break;
+
+ case USB_FUNCTION_READING:
+ case DEVDRV_USBF_FIFOERROR:
+ break;
+ }
pipe_status = usb0_api_function_check_pipe_status(pipe, bytes_read);
- if (pipe_status == DEVDRV_USBF_PIPE_DONE) {
- status = EP_COMPLETED;
+ 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;
@@ -1112,19 +1379,19 @@
(int_enb0 & USB_FUNCTION_BITBEMP) &&
((int_sts3 & int_enb4) & g_usb0_function_bit_set[USB_FUNCTION_PIPE0])) {
/* ==== BEMP PIPE0 ==== */
- usb0_function_BEMPInterruptPIPE0(int_sts3, int_enb4);
+ usb0_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_usb0_function_bit_set[USB_FUNCTION_PIPE0])) {
/* ==== BRDY PIPE0 ==== */
- usb0_function_BRDYInterruptPIPE0(int_sts1, int_enb2);
+ usb0_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_usb0_function_bit_set[USB_FUNCTION_PIPE0])) {
/* ==== NRDY PIPE0 ==== */
- usb0_function_NRDYInterruptPIPE0(int_sts2, int_enb3);
+ usb0_function_NRDYInterruptPIPE0(int_sts2, int_enb3, this, NULL);
} else if (
(int_sts0 & USB_FUNCTION_BITCTRT) && (int_enb0 & USB_FUNCTION_BITCTRE)) {
int_sts0 = USB200.INTSTS0;
@@ -1198,19 +1465,19 @@
(int_enb0 & USB_FUNCTION_BITBEMP) &&
(int_sts3 & int_enb4) ) {
/* ==== BEMP PIPEx ==== */
- usb0_function_BEMPInterrupt(int_sts3, int_enb4);
+ usb0_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 ==== */
- usb0_function_BRDYInterrupt(int_sts1, int_enb2);
+ usb0_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 ==== */
- usb0_function_NRDYInterrupt(int_sts2, int_enb3);
+ usb0_function_NRDYInterrupt(int_sts2, int_enb3, this, epCallback);
} else {
/* Do Nothing */
}