USB device stack

Dependents:   USBMSD_step1 USBMSD_step1_5 picossd_step1_2cs

Committer:
muraguchi
Date:
Tue Feb 09 12:00:34 2021 +0000
Revision:
72:c80da04112fd
Parent:
71:53949e6131f6
Initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 71:53949e6131f6 1 /*******************************************************************************
Kojto 71:53949e6131f6 2 * DISCLAIMER
Kojto 71:53949e6131f6 3 * This software is supplied by Renesas Electronics Corporation and is only
Kojto 71:53949e6131f6 4 * intended for use with Renesas products. No other uses are authorized. This
Kojto 71:53949e6131f6 5 * software is owned by Renesas Electronics Corporation and is protected under
Kojto 71:53949e6131f6 6 * all applicable laws, including copyright laws.
Kojto 71:53949e6131f6 7 * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
Kojto 71:53949e6131f6 8 * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
Kojto 71:53949e6131f6 9 * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
Kojto 71:53949e6131f6 10 * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
Kojto 71:53949e6131f6 11 * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
Kojto 71:53949e6131f6 12 * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
Kojto 71:53949e6131f6 13 * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
Kojto 71:53949e6131f6 14 * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
Kojto 71:53949e6131f6 15 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Kojto 71:53949e6131f6 16 * Renesas reserves the right, without notice, to make changes to this software
Kojto 71:53949e6131f6 17 * and to discontinue the availability of this software. By using this software,
Kojto 71:53949e6131f6 18 * you agree to the additional terms and conditions found by accessing the
Kojto 71:53949e6131f6 19 * following link:
Kojto 71:53949e6131f6 20 * http://www.renesas.com/disclaimer
Kojto 71:53949e6131f6 21 * Copyright (C) 2012 - 2014 Renesas Electronics Corporation. All rights reserved.
Kojto 71:53949e6131f6 22 *******************************************************************************/
Kojto 71:53949e6131f6 23 /*******************************************************************************
Kojto 71:53949e6131f6 24 * File Name : usb0_function_dataio.c
Kojto 71:53949e6131f6 25 * $Rev: 1116 $
Kojto 71:53949e6131f6 26 * $Date:: 2014-07-09 16:29:19 +0900#$
Kojto 71:53949e6131f6 27 * Device(s) : RZ/A1H
Kojto 71:53949e6131f6 28 * Tool-Chain :
Kojto 71:53949e6131f6 29 * OS : None
Kojto 71:53949e6131f6 30 * H/W Platform :
Kojto 71:53949e6131f6 31 * Description : RZ/A1H R7S72100 USB Sample Program
Kojto 71:53949e6131f6 32 * Operation :
Kojto 71:53949e6131f6 33 * Limitations :
Kojto 71:53949e6131f6 34 *******************************************************************************/
Kojto 71:53949e6131f6 35
Kojto 71:53949e6131f6 36
Kojto 71:53949e6131f6 37 /*******************************************************************************
Kojto 71:53949e6131f6 38 Includes <System Includes> , "Project Includes"
Kojto 71:53949e6131f6 39 *******************************************************************************/
Kojto 71:53949e6131f6 40 #include "usb0_function.h"
Kojto 71:53949e6131f6 41
Kojto 71:53949e6131f6 42
Kojto 71:53949e6131f6 43 /*******************************************************************************
Kojto 71:53949e6131f6 44 Typedef definitions
Kojto 71:53949e6131f6 45 *******************************************************************************/
Kojto 71:53949e6131f6 46
Kojto 71:53949e6131f6 47
Kojto 71:53949e6131f6 48 /*******************************************************************************
Kojto 71:53949e6131f6 49 Macro definitions
Kojto 71:53949e6131f6 50 *******************************************************************************/
Kojto 71:53949e6131f6 51
Kojto 71:53949e6131f6 52
Kojto 71:53949e6131f6 53 /*******************************************************************************
Kojto 71:53949e6131f6 54 Imported global variables and functions (from other files)
Kojto 71:53949e6131f6 55 *******************************************************************************/
Kojto 71:53949e6131f6 56
Kojto 71:53949e6131f6 57
Kojto 71:53949e6131f6 58 /*******************************************************************************
Kojto 71:53949e6131f6 59 Exported global variables and functions (to be accessed by other files)
Kojto 71:53949e6131f6 60 *******************************************************************************/
Kojto 71:53949e6131f6 61
Kojto 71:53949e6131f6 62
Kojto 71:53949e6131f6 63 /*******************************************************************************
Kojto 71:53949e6131f6 64 Private global variables and functions
Kojto 71:53949e6131f6 65 *******************************************************************************/
Kojto 71:53949e6131f6 66 static uint16_t g_usb0_function_mbw[(USB_FUNCTION_MAX_PIPE_NO + 1)];
Kojto 71:53949e6131f6 67
Kojto 71:53949e6131f6 68 static void usb0_function_start_receive_trns_c(uint16_t pipe, uint32_t size, uint8_t *data);
Kojto 71:53949e6131f6 69 static void usb0_function_start_receive_trns_d0(uint16_t pipe, uint32_t size, uint8_t *data);
Kojto 71:53949e6131f6 70 static void usb0_function_start_receive_trns_d1(uint16_t pipe, uint32_t size, uint8_t *data);
Kojto 71:53949e6131f6 71 static void usb0_function_start_receive_dma_d0(uint16_t pipe, uint32_t size, uint8_t *data);
Kojto 71:53949e6131f6 72 static void usb0_function_start_receive_dma_d1(uint16_t pipe, uint32_t size, uint8_t *data);
Kojto 71:53949e6131f6 73 static uint16_t usb0_function_read_dma_d0(uint16_t pipe);
Kojto 71:53949e6131f6 74 static uint16_t usb0_function_read_dma_d1(uint16_t pipe);
Kojto 71:53949e6131f6 75 static uint16_t usb0_function_write_dma_d0(uint16_t pipe);
Kojto 71:53949e6131f6 76 static uint16_t usb0_function_write_dma_d1(uint16_t pipe);
Kojto 71:53949e6131f6 77
Kojto 71:53949e6131f6 78 static void usb0_function_read_c_fifo(uint16_t pipe, uint16_t count);
Kojto 71:53949e6131f6 79 static void usb0_function_write_c_fifo(uint16_t Pipe, uint16_t count);
Kojto 71:53949e6131f6 80 static void usb0_function_read_d0_fifo(uint16_t pipe, uint16_t count);
Kojto 71:53949e6131f6 81 static void usb0_function_write_d0_fifo(uint16_t pipe, uint16_t count);
Kojto 71:53949e6131f6 82 static void usb0_function_read_d1_fifo(uint16_t pipe, uint16_t count);
Kojto 71:53949e6131f6 83 static void usb0_function_write_d1_fifo(uint16_t pipe, uint16_t count);
Kojto 71:53949e6131f6 84
Kojto 71:53949e6131f6 85 static void usb0_function_clear_transaction_counter(uint16_t pipe);
Kojto 71:53949e6131f6 86 static void usb0_function_set_transaction_counter(uint16_t pipe, uint32_t count);
Kojto 71:53949e6131f6 87
Kojto 71:53949e6131f6 88 static uint32_t usb0_function_com_get_dmasize(uint32_t trncount, uint32_t dtptr);
Kojto 71:53949e6131f6 89
Kojto 71:53949e6131f6 90 static uint16_t usb0_function_set_dfacc_d0(uint16_t mbw, uint32_t count);
Kojto 71:53949e6131f6 91 static uint16_t usb0_function_set_dfacc_d1(uint16_t mbw, uint32_t count);
Kojto 71:53949e6131f6 92
Kojto 71:53949e6131f6 93
Kojto 71:53949e6131f6 94 /*******************************************************************************
Kojto 71:53949e6131f6 95 * Function Name: usb0_function_start_send_transfer
Kojto 71:53949e6131f6 96 * Description : Starts the USB data communication using pipe specified by the argument.
Kojto 71:53949e6131f6 97 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 98 * : uint32_t size ; Data Size
Kojto 71:53949e6131f6 99 * : uint8_t *data ; Data Address
Kojto 71:53949e6131f6 100 * Return Value : DEVDRV_USBF_WRITEEND ; Write end
Kojto 71:53949e6131f6 101 * : DEVDRV_USBF_WRITESHRT ; short data
Kojto 71:53949e6131f6 102 * : DEVDRV_USBF_WRITING ; Continue of data write
Kojto 71:53949e6131f6 103 * : DEVDRV_USBF_WRITEDMA ; Write DMA
Kojto 71:53949e6131f6 104 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 105 *******************************************************************************/
Kojto 71:53949e6131f6 106 uint16_t usb0_function_start_send_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
Kojto 71:53949e6131f6 107 {
Kojto 71:53949e6131f6 108 uint16_t status;
Kojto 71:53949e6131f6 109 uint16_t usefifo;
Kojto 71:53949e6131f6 110 uint16_t mbw;
Kojto 71:53949e6131f6 111
Kojto 71:53949e6131f6 112 g_usb0_function_data_count[pipe] = size;
Kojto 71:53949e6131f6 113 g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
Kojto 71:53949e6131f6 114 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT;
Kojto 71:53949e6131f6 115
Kojto 71:53949e6131f6 116 usb0_function_clear_bemp_sts(pipe);
Kojto 71:53949e6131f6 117 usb0_function_clear_brdy_sts(pipe);
Kojto 71:53949e6131f6 118 usb0_function_clear_nrdy_sts(pipe);
Kojto 71:53949e6131f6 119
Kojto 71:53949e6131f6 120 mbw = usb0_function_get_mbw(size, (uint32_t)data);
Kojto 71:53949e6131f6 121
Kojto 71:53949e6131f6 122 usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
Kojto 71:53949e6131f6 123
Kojto 71:53949e6131f6 124 switch (usefifo)
Kojto 71:53949e6131f6 125 {
Kojto 71:53949e6131f6 126 case USB_FUNCTION_D0FIFO_USE:
Kojto 71:53949e6131f6 127 case USB_FUNCTION_D0FIFO_DMA:
Kojto 71:53949e6131f6 128 usefifo = USB_FUNCTION_D0USE;
Kojto 71:53949e6131f6 129 break;
Kojto 71:53949e6131f6 130
Kojto 71:53949e6131f6 131 case USB_FUNCTION_D1FIFO_USE:
Kojto 71:53949e6131f6 132 case USB_FUNCTION_D1FIFO_DMA:
Kojto 71:53949e6131f6 133 usefifo = USB_FUNCTION_D1USE;
Kojto 71:53949e6131f6 134 break;
Kojto 71:53949e6131f6 135
Kojto 71:53949e6131f6 136 default:
Kojto 71:53949e6131f6 137 usefifo = USB_FUNCTION_CUSE;
Kojto 71:53949e6131f6 138 break;
Kojto 71:53949e6131f6 139 };
Kojto 71:53949e6131f6 140
Kojto 71:53949e6131f6 141 usb0_function_set_curpipe(USB_FUNCTION_PIPE0, usefifo, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 142
Kojto 71:53949e6131f6 143 usb0_function_clear_transaction_counter(pipe);
Kojto 71:53949e6131f6 144
Kojto 71:53949e6131f6 145 usb0_function_aclrm(pipe);
Kojto 71:53949e6131f6 146
Kojto 71:53949e6131f6 147 status = usb0_function_write_buffer(pipe);
Kojto 71:53949e6131f6 148
Kojto 71:53949e6131f6 149 if (status != DEVDRV_USBF_FIFOERROR)
Kojto 71:53949e6131f6 150 {
Kojto 71:53949e6131f6 151 usb0_function_set_pid_buf(pipe);
Kojto 71:53949e6131f6 152 }
Kojto 71:53949e6131f6 153
Kojto 71:53949e6131f6 154 return status;
Kojto 71:53949e6131f6 155 }
Kojto 71:53949e6131f6 156
Kojto 71:53949e6131f6 157 /*******************************************************************************
Kojto 71:53949e6131f6 158 * Function Name: usb0_function_write_buffer
Kojto 71:53949e6131f6 159 * Description : Writes data in the buffer allocated in the pipe specified by
Kojto 71:53949e6131f6 160 * : the argument. The FIFO for using is set in the pipe definition table.
Kojto 71:53949e6131f6 161 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 162 * Return Value : DEVDRV_USBF_WRITEEND ; Write end
Kojto 71:53949e6131f6 163 * : DEVDRV_USBF_WRITESHRT ; short data
Kojto 71:53949e6131f6 164 * : DEVDRV_USBF_WRITING ; Continue of data write
Kojto 71:53949e6131f6 165 * : DEVDRV_USBF_WRITEDMA ; Write DMA
Kojto 71:53949e6131f6 166 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 167 *******************************************************************************/
Kojto 71:53949e6131f6 168 uint16_t usb0_function_write_buffer (uint16_t pipe)
Kojto 71:53949e6131f6 169 {
Kojto 71:53949e6131f6 170 uint16_t status;
Kojto 71:53949e6131f6 171 uint16_t usefifo;
Kojto 71:53949e6131f6 172
Kojto 71:53949e6131f6 173 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 174 usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
Kojto 71:53949e6131f6 175
Kojto 71:53949e6131f6 176 switch (usefifo)
Kojto 71:53949e6131f6 177 {
Kojto 71:53949e6131f6 178 case USB_FUNCTION_D0FIFO_USE:
Kojto 71:53949e6131f6 179 status = usb0_function_write_buffer_d0(pipe);
Kojto 71:53949e6131f6 180 break;
Kojto 71:53949e6131f6 181
Kojto 71:53949e6131f6 182 case USB_FUNCTION_D1FIFO_USE:
Kojto 71:53949e6131f6 183 status = usb0_function_write_buffer_d1(pipe);
Kojto 71:53949e6131f6 184 break;
Kojto 71:53949e6131f6 185
Kojto 71:53949e6131f6 186 case USB_FUNCTION_D0FIFO_DMA:
Kojto 71:53949e6131f6 187 status = usb0_function_write_dma_d0(pipe);
Kojto 71:53949e6131f6 188 break;
Kojto 71:53949e6131f6 189
Kojto 71:53949e6131f6 190 case USB_FUNCTION_D1FIFO_DMA:
Kojto 71:53949e6131f6 191 status = usb0_function_write_dma_d1(pipe);
Kojto 71:53949e6131f6 192 break;
Kojto 71:53949e6131f6 193
Kojto 71:53949e6131f6 194 default:
Kojto 71:53949e6131f6 195 status = usb0_function_write_buffer_c(pipe);
Kojto 71:53949e6131f6 196 break;
Kojto 71:53949e6131f6 197 };
Kojto 71:53949e6131f6 198
Kojto 71:53949e6131f6 199 switch (status)
Kojto 71:53949e6131f6 200 {
Kojto 71:53949e6131f6 201 case DEVDRV_USBF_WRITING: /* Continue of data write */
Kojto 71:53949e6131f6 202 usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */
Kojto 71:53949e6131f6 203 usb0_function_enable_brdy_int(pipe); /* Enable Ready Interrupt */
Kojto 71:53949e6131f6 204 break;
Kojto 71:53949e6131f6 205
Kojto 71:53949e6131f6 206 case DEVDRV_USBF_WRITEEND: /* End of data write */
Kojto 71:53949e6131f6 207 case DEVDRV_USBF_WRITESHRT: /* End of data write */
Kojto 71:53949e6131f6 208 usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */
Kojto 71:53949e6131f6 209 usb0_function_clear_nrdy_sts(pipe);
Kojto 71:53949e6131f6 210 usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */
Kojto 71:53949e6131f6 211 /* for last transfer */
Kojto 71:53949e6131f6 212 usb0_function_enable_bemp_int(pipe); /* Enable Empty Interrupt */
Kojto 71:53949e6131f6 213 break;
Kojto 71:53949e6131f6 214
Kojto 71:53949e6131f6 215 case DEVDRV_USBF_WRITEDMA: /* DMA write */
Kojto 71:53949e6131f6 216 usb0_function_clear_nrdy_sts(pipe);
Kojto 71:53949e6131f6 217 usb0_function_enable_nrdy_int(pipe); /* Error (NORES or STALL) */
Kojto 71:53949e6131f6 218 break;
Kojto 71:53949e6131f6 219
Kojto 71:53949e6131f6 220 case DEVDRV_USBF_FIFOERROR: /* FIFO access status */
Kojto 71:53949e6131f6 221 default:
Kojto 71:53949e6131f6 222 usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */
Kojto 71:53949e6131f6 223 usb0_function_disable_bemp_int(pipe); /* Disable Empty Interrupt */
Kojto 71:53949e6131f6 224 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 225 break;
Kojto 71:53949e6131f6 226 }
Kojto 71:53949e6131f6 227
Kojto 71:53949e6131f6 228 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 229 }
Kojto 71:53949e6131f6 230
Kojto 71:53949e6131f6 231 /*******************************************************************************
Kojto 71:53949e6131f6 232 * Function Name: usb0_function_write_buffer_c
Kojto 71:53949e6131f6 233 * Description : Writes data in the buffer allocated in the pipe specified in
Kojto 71:53949e6131f6 234 * : the argument. Writes data by CPU transfer using CFIFO.
Kojto 71:53949e6131f6 235 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 236 * Return Value : DEVDRV_USBF_WRITEEND ; Write end
Kojto 71:53949e6131f6 237 * : DEVDRV_USBF_WRITESHRT ; short data
Kojto 71:53949e6131f6 238 * : DEVDRV_USBF_WRITING ; Continue of data write
Kojto 71:53949e6131f6 239 * : DEVDRV_USBF_WRITEDMA ; Write DMA
Kojto 71:53949e6131f6 240 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 241 *******************************************************************************/
Kojto 71:53949e6131f6 242 uint16_t usb0_function_write_buffer_c (uint16_t pipe)
Kojto 71:53949e6131f6 243 {
Kojto 71:53949e6131f6 244 uint32_t count;
Kojto 71:53949e6131f6 245 uint16_t size;
Kojto 71:53949e6131f6 246 uint16_t buffer;
Kojto 71:53949e6131f6 247 uint16_t mxps;
Kojto 71:53949e6131f6 248 uint16_t status;
Kojto 71:53949e6131f6 249 uint16_t mbw;
Kojto 71:53949e6131f6 250
Kojto 71:53949e6131f6 251 if (g_usb0_function_CtrZeroLengthFlag == 1)
Kojto 71:53949e6131f6 252 {
Kojto 71:53949e6131f6 253 g_usb0_function_CtrZeroLengthFlag = 0; /* Zero Length Packet Flag CLR */
Kojto 71:53949e6131f6 254 return DEVDRV_USBF_WRITEEND;
Kojto 71:53949e6131f6 255 }
Kojto 71:53949e6131f6 256
Kojto 71:53949e6131f6 257 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 258 if (pipe == USB_FUNCTION_PIPE0)
Kojto 71:53949e6131f6 259 {
Kojto 71:53949e6131f6 260 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_WRITE, mbw);
Kojto 71:53949e6131f6 261 }
Kojto 71:53949e6131f6 262 else
Kojto 71:53949e6131f6 263 {
Kojto 71:53949e6131f6 264 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 265 }
Kojto 71:53949e6131f6 266
Kojto 71:53949e6131f6 267 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 268 {
Kojto 71:53949e6131f6 269 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 270 }
Kojto 71:53949e6131f6 271
Kojto 71:53949e6131f6 272 size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 273 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 274
Kojto 71:53949e6131f6 275 if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
Kojto 71:53949e6131f6 276 {
Kojto 71:53949e6131f6 277 status = DEVDRV_USBF_WRITEEND; /* write continues */
Kojto 71:53949e6131f6 278 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 279
Kojto 71:53949e6131f6 280 if (count == 0)
Kojto 71:53949e6131f6 281 {
Kojto 71:53949e6131f6 282 status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */
Kojto 71:53949e6131f6 283 }
Kojto 71:53949e6131f6 284
Kojto 71:53949e6131f6 285 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 286 {
Kojto 71:53949e6131f6 287 status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */
Kojto 71:53949e6131f6 288 }
Kojto 71:53949e6131f6 289 }
Kojto 71:53949e6131f6 290 else
Kojto 71:53949e6131f6 291 {
Kojto 71:53949e6131f6 292 status = DEVDRV_USBF_WRITING; /* write continues */
Kojto 71:53949e6131f6 293 count = (uint32_t)size;
Kojto 71:53949e6131f6 294 }
Kojto 71:53949e6131f6 295
Kojto 71:53949e6131f6 296 usb0_function_write_c_fifo(pipe, (uint16_t)count);
Kojto 71:53949e6131f6 297
Kojto 71:53949e6131f6 298 if (g_usb0_function_data_count[pipe] < (uint32_t)size)
Kojto 71:53949e6131f6 299 {
Kojto 71:53949e6131f6 300 g_usb0_function_data_count[pipe] = 0;
Kojto 71:53949e6131f6 301
Kojto 71:53949e6131f6 302 if (RZA_IO_RegRead_16(&USB200.CFIFOCTR, USB_CFIFOCTR_BVAL_SHIFT, USB_CFIFOCTR_BVAL) == 0)
Kojto 71:53949e6131f6 303 {
Kojto 71:53949e6131f6 304 USB200.CFIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */
Kojto 71:53949e6131f6 305 g_usb0_function_CtrZeroLengthFlag = 1; /* Zero Length Packet Flag */
Kojto 71:53949e6131f6 306 }
Kojto 71:53949e6131f6 307 }
Kojto 71:53949e6131f6 308 else
Kojto 71:53949e6131f6 309 {
Kojto 71:53949e6131f6 310 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 311 }
Kojto 71:53949e6131f6 312
Kojto 71:53949e6131f6 313 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 314 }
Kojto 71:53949e6131f6 315
Kojto 71:53949e6131f6 316 /*******************************************************************************
Kojto 71:53949e6131f6 317 * Function Name: usb0_function_write_buffer_d0
Kojto 71:53949e6131f6 318 * Description : Writes data in the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 319 * : Writes data by CPU transfer using D0FIFO.
Kojto 71:53949e6131f6 320 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 321 * Return Value : DEVDRV_USBF_WRITEEND ; Write end
Kojto 71:53949e6131f6 322 * : DEVDRV_USBF_WRITESHRT ; short data
Kojto 71:53949e6131f6 323 * : DEVDRV_USBF_WRITING ; Continue of data write
Kojto 71:53949e6131f6 324 * : DEVDRV_USBF_WRITEDMA ; Write DMA
Kojto 71:53949e6131f6 325 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 326 *******************************************************************************/
Kojto 71:53949e6131f6 327 uint16_t usb0_function_write_buffer_d0 (uint16_t pipe)
Kojto 71:53949e6131f6 328 {
Kojto 71:53949e6131f6 329 uint32_t count;
Kojto 71:53949e6131f6 330 uint16_t size;
Kojto 71:53949e6131f6 331 uint16_t buffer;
Kojto 71:53949e6131f6 332 uint16_t mxps;
Kojto 71:53949e6131f6 333 uint16_t status;
Kojto 71:53949e6131f6 334 uint16_t mbw;
Kojto 71:53949e6131f6 335
Kojto 71:53949e6131f6 336 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 337 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 338 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 339 {
Kojto 71:53949e6131f6 340 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 341 }
Kojto 71:53949e6131f6 342
Kojto 71:53949e6131f6 343 size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 344 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 345
Kojto 71:53949e6131f6 346 if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
Kojto 71:53949e6131f6 347 {
Kojto 71:53949e6131f6 348 status = DEVDRV_USBF_WRITEEND; /* write continues */
Kojto 71:53949e6131f6 349 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 350
Kojto 71:53949e6131f6 351 if (count == 0)
Kojto 71:53949e6131f6 352 {
Kojto 71:53949e6131f6 353 status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */
Kojto 71:53949e6131f6 354 }
Kojto 71:53949e6131f6 355
Kojto 71:53949e6131f6 356 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 357 {
Kojto 71:53949e6131f6 358 status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */
Kojto 71:53949e6131f6 359 }
Kojto 71:53949e6131f6 360 }
Kojto 71:53949e6131f6 361 else
Kojto 71:53949e6131f6 362 {
Kojto 71:53949e6131f6 363 status = DEVDRV_USBF_WRITING; /* write continues */
Kojto 71:53949e6131f6 364 count = (uint32_t)size;
Kojto 71:53949e6131f6 365 }
Kojto 71:53949e6131f6 366
Kojto 71:53949e6131f6 367 usb0_function_write_d0_fifo(pipe, (uint16_t)count);
Kojto 71:53949e6131f6 368
Kojto 71:53949e6131f6 369 if (g_usb0_function_data_count[pipe] < (uint32_t)size)
Kojto 71:53949e6131f6 370 {
Kojto 71:53949e6131f6 371 g_usb0_function_data_count[pipe] = 0;
Kojto 71:53949e6131f6 372 if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
Kojto 71:53949e6131f6 373 {
Kojto 71:53949e6131f6 374 USB200.D0FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */
Kojto 71:53949e6131f6 375 }
Kojto 71:53949e6131f6 376 }
Kojto 71:53949e6131f6 377 else
Kojto 71:53949e6131f6 378 {
Kojto 71:53949e6131f6 379 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 380 }
Kojto 71:53949e6131f6 381
Kojto 71:53949e6131f6 382 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 383 }
Kojto 71:53949e6131f6 384
Kojto 71:53949e6131f6 385 /*******************************************************************************
Kojto 71:53949e6131f6 386 * Function Name: usb0_function_write_buffer_d1
Kojto 71:53949e6131f6 387 * Description : Writes data in the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 388 * : Writes data by CPU transfer using D1FIFO.
Kojto 71:53949e6131f6 389 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 390 * Return Value : DEVDRV_USBF_WRITEEND ; Write end
Kojto 71:53949e6131f6 391 * : DEVDRV_USBF_WRITESHRT ; short data
Kojto 71:53949e6131f6 392 * : DEVDRV_USBF_WRITING ; Continue of data write
Kojto 71:53949e6131f6 393 * : DEVDRV_USBF_WRITEDMA ; Write DMA
Kojto 71:53949e6131f6 394 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 395 *******************************************************************************/
Kojto 71:53949e6131f6 396 uint16_t usb0_function_write_buffer_d1 (uint16_t pipe)
Kojto 71:53949e6131f6 397 {
Kojto 71:53949e6131f6 398 uint32_t count;
Kojto 71:53949e6131f6 399 uint16_t size;
Kojto 71:53949e6131f6 400 uint16_t buffer;
Kojto 71:53949e6131f6 401 uint16_t mxps;
Kojto 71:53949e6131f6 402 uint16_t status;
Kojto 71:53949e6131f6 403 uint16_t mbw;
Kojto 71:53949e6131f6 404
Kojto 71:53949e6131f6 405 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 406 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 407
Kojto 71:53949e6131f6 408 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 409 {
Kojto 71:53949e6131f6 410 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 411 }
Kojto 71:53949e6131f6 412
Kojto 71:53949e6131f6 413 size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 414 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 415
Kojto 71:53949e6131f6 416 if (g_usb0_function_data_count[pipe] <= (uint32_t)size)
Kojto 71:53949e6131f6 417 {
Kojto 71:53949e6131f6 418 status = DEVDRV_USBF_WRITEEND; /* write continues */
Kojto 71:53949e6131f6 419 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 420
Kojto 71:53949e6131f6 421 if (count == 0)
Kojto 71:53949e6131f6 422 {
Kojto 71:53949e6131f6 423 status = DEVDRV_USBF_WRITESHRT; /* Null Packet is end of write */
Kojto 71:53949e6131f6 424 }
Kojto 71:53949e6131f6 425
Kojto 71:53949e6131f6 426 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 427 {
Kojto 71:53949e6131f6 428 status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */
Kojto 71:53949e6131f6 429 }
Kojto 71:53949e6131f6 430 }
Kojto 71:53949e6131f6 431 else
Kojto 71:53949e6131f6 432 {
Kojto 71:53949e6131f6 433 status = DEVDRV_USBF_WRITING; /* write continues */
Kojto 71:53949e6131f6 434 count = (uint32_t)size;
Kojto 71:53949e6131f6 435 }
Kojto 71:53949e6131f6 436
Kojto 71:53949e6131f6 437 usb0_function_write_d1_fifo(pipe, (uint16_t)count);
Kojto 71:53949e6131f6 438
Kojto 71:53949e6131f6 439 if (g_usb0_function_data_count[pipe] < (uint32_t)size)
Kojto 71:53949e6131f6 440 {
Kojto 71:53949e6131f6 441 g_usb0_function_data_count[pipe] = 0;
Kojto 71:53949e6131f6 442
Kojto 71:53949e6131f6 443 if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
Kojto 71:53949e6131f6 444 {
Kojto 71:53949e6131f6 445 USB200.D1FIFOCTR = USB_FUNCTION_BITBVAL; /* Short Packet */
Kojto 71:53949e6131f6 446 }
Kojto 71:53949e6131f6 447 }
Kojto 71:53949e6131f6 448 else
Kojto 71:53949e6131f6 449 {
Kojto 71:53949e6131f6 450 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 451 }
Kojto 71:53949e6131f6 452
Kojto 71:53949e6131f6 453 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 454 }
Kojto 71:53949e6131f6 455
Kojto 71:53949e6131f6 456 /*******************************************************************************
Kojto 71:53949e6131f6 457 * Function Name: usb0_function_write_dma_d0
Kojto 71:53949e6131f6 458 * Description : Writes data in the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 459 * : Writes data by DMA transfer using D0FIFO.
Kojto 71:53949e6131f6 460 * : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma().
Kojto 71:53949e6131f6 461 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 462 * Return Value : DEVDRV_USBF_WRITEEND : Write end
Kojto 71:53949e6131f6 463 * : DEVDRV_USBF_WRITESHRT : short data
Kojto 71:53949e6131f6 464 * : DEVDRV_USBF_WRITING : Continue of data write
Kojto 71:53949e6131f6 465 * : DEVDRV_USBF_WRITEDMA : Write DMA
Kojto 71:53949e6131f6 466 * : DEVDRV_USBF_FIFOERROR : FIFO status
Kojto 71:53949e6131f6 467 *******************************************************************************/
Kojto 71:53949e6131f6 468 static uint16_t usb0_function_write_dma_d0 (uint16_t pipe)
Kojto 71:53949e6131f6 469 {
Kojto 71:53949e6131f6 470 uint32_t count;
Kojto 71:53949e6131f6 471 uint16_t size;
Kojto 71:53949e6131f6 472 uint16_t buffer;
Kojto 71:53949e6131f6 473 uint16_t status;
Kojto 71:53949e6131f6 474 uint16_t mbw;
Kojto 71:53949e6131f6 475 uint16_t dfacc = 0;
Kojto 71:53949e6131f6 476
Kojto 71:53949e6131f6 477 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 478 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 479
Kojto 71:53949e6131f6 480 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 481 {
Kojto 71:53949e6131f6 482 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 483 }
Kojto 71:53949e6131f6 484
Kojto 71:53949e6131f6 485 size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 486 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 487
Kojto 71:53949e6131f6 488 if (count != 0)
Kojto 71:53949e6131f6 489 {
Kojto 71:53949e6131f6 490 g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe;
Kojto 71:53949e6131f6 491
Kojto 71:53949e6131f6 492 if ((count % size) != 0)
Kojto 71:53949e6131f6 493 {
Kojto 71:53949e6131f6 494 g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 1;
Kojto 71:53949e6131f6 495 }
Kojto 71:53949e6131f6 496 else
Kojto 71:53949e6131f6 497 {
Kojto 71:53949e6131f6 498 g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0;
Kojto 71:53949e6131f6 499 }
Kojto 71:53949e6131f6 500
Kojto 71:53949e6131f6 501 dfacc = usb0_function_set_dfacc_d0(mbw, count);
Kojto 71:53949e6131f6 502
Kojto 71:53949e6131f6 503 if (mbw == USB_FUNCTION_BITMBW_32)
Kojto 71:53949e6131f6 504 {
Kojto 71:53949e6131f6 505 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */
Kojto 71:53949e6131f6 506 }
Kojto 71:53949e6131f6 507 else if (mbw == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 508 {
Kojto 71:53949e6131f6 509 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */
Kojto 71:53949e6131f6 510 }
Kojto 71:53949e6131f6 511 else
Kojto 71:53949e6131f6 512 {
Kojto 71:53949e6131f6 513 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */
Kojto 71:53949e6131f6 514 }
Kojto 71:53949e6131f6 515
Kojto 71:53949e6131f6 516 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA;
Kojto 71:53949e6131f6 517 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_BUF2FIFO;
Kojto 71:53949e6131f6 518 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
Kojto 71:53949e6131f6 519 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count;
Kojto 71:53949e6131f6 520
Kojto 71:53949e6131f6 521 Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
Kojto 71:53949e6131f6 522
Kojto 71:53949e6131f6 523 usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
Kojto 71:53949e6131f6 524
Kojto 71:53949e6131f6 525 RZA_IO_RegWrite_16(&USB200.D0FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
Kojto 71:53949e6131f6 526
Kojto 71:53949e6131f6 527 g_usb0_function_data_count[pipe] = 0;
Kojto 71:53949e6131f6 528 g_usb0_function_data_pointer[pipe] += count;
Kojto 71:53949e6131f6 529 status = DEVDRV_USBF_WRITEDMA; /* DMA write */
Kojto 71:53949e6131f6 530 }
Kojto 71:53949e6131f6 531 else
Kojto 71:53949e6131f6 532 {
Kojto 71:53949e6131f6 533 if (RZA_IO_RegRead_16(&USB200.D0FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
Kojto 71:53949e6131f6 534 {
Kojto 71:53949e6131f6 535 RZA_IO_RegWrite_16(&USB200.D0FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
Kojto 71:53949e6131f6 536 }
Kojto 71:53949e6131f6 537 status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */
Kojto 71:53949e6131f6 538 }
Kojto 71:53949e6131f6 539
Kojto 71:53949e6131f6 540 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 541 }
Kojto 71:53949e6131f6 542
Kojto 71:53949e6131f6 543 /*******************************************************************************
Kojto 71:53949e6131f6 544 * Function Name: usb0_function_write_dma_d1
Kojto 71:53949e6131f6 545 * Description : Writes data in the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 546 * : Writes data by DMA transfer using D1FIFO.
Kojto 71:53949e6131f6 547 * : The DMA-ch for using is specified by Userdef_USB_usb0_function_start_dma().
Kojto 71:53949e6131f6 548 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 549 * Return Value : DEVDRV_USBF_WRITEEND : Write end
Kojto 71:53949e6131f6 550 * : DEVDRV_USBF_WRITESHRT : short data
Kojto 71:53949e6131f6 551 * : DEVDRV_USBF_WRITING : Continue of data write
Kojto 71:53949e6131f6 552 * : DEVDRV_USBF_WRITEDMA : Write DMA
Kojto 71:53949e6131f6 553 * : DEVDRV_USBF_FIFOERROR : FIFO status
Kojto 71:53949e6131f6 554 *******************************************************************************/
Kojto 71:53949e6131f6 555 static uint16_t usb0_function_write_dma_d1 (uint16_t pipe)
Kojto 71:53949e6131f6 556 {
Kojto 71:53949e6131f6 557 uint32_t count;
Kojto 71:53949e6131f6 558 uint16_t size;
Kojto 71:53949e6131f6 559 uint16_t buffer;
Kojto 71:53949e6131f6 560 uint16_t status;
Kojto 71:53949e6131f6 561 uint16_t mbw;
Kojto 71:53949e6131f6 562 uint16_t dfacc=0;
Kojto 71:53949e6131f6 563
Kojto 71:53949e6131f6 564 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 565 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 566
Kojto 71:53949e6131f6 567 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 568 {
Kojto 71:53949e6131f6 569 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 570 }
Kojto 71:53949e6131f6 571
Kojto 71:53949e6131f6 572 size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 573 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 574
Kojto 71:53949e6131f6 575 if (count != 0)
Kojto 71:53949e6131f6 576 {
Kojto 71:53949e6131f6 577 g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe;
Kojto 71:53949e6131f6 578 if ((count % size) != 0)
Kojto 71:53949e6131f6 579 {
Kojto 71:53949e6131f6 580 g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 1;
Kojto 71:53949e6131f6 581 }
Kojto 71:53949e6131f6 582 else
Kojto 71:53949e6131f6 583 {
Kojto 71:53949e6131f6 584 g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0;
Kojto 71:53949e6131f6 585 }
Kojto 71:53949e6131f6 586
Kojto 71:53949e6131f6 587 dfacc = usb0_function_set_dfacc_d1(mbw, count);
Kojto 71:53949e6131f6 588
Kojto 71:53949e6131f6 589 if (mbw == USB_FUNCTION_BITMBW_32)
Kojto 71:53949e6131f6 590 {
Kojto 71:53949e6131f6 591 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */
Kojto 71:53949e6131f6 592 }
Kojto 71:53949e6131f6 593 else if (mbw == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 594 {
Kojto 71:53949e6131f6 595 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */
Kojto 71:53949e6131f6 596 }
Kojto 71:53949e6131f6 597 else
Kojto 71:53949e6131f6 598 {
Kojto 71:53949e6131f6 599 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */
Kojto 71:53949e6131f6 600 }
Kojto 71:53949e6131f6 601
Kojto 71:53949e6131f6 602 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA;
Kojto 71:53949e6131f6 603 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_BUF2FIFO;
Kojto 71:53949e6131f6 604 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
Kojto 71:53949e6131f6 605 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count;
Kojto 71:53949e6131f6 606
Kojto 71:53949e6131f6 607 Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
Kojto 71:53949e6131f6 608
Kojto 71:53949e6131f6 609 usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
Kojto 71:53949e6131f6 610
Kojto 71:53949e6131f6 611 RZA_IO_RegWrite_16(&USB200.D1FIFOSEL, 1, USB_DnFIFOSEL_DREQE_SHIFT, USB_DnFIFOSEL_DREQE);
Kojto 71:53949e6131f6 612
Kojto 71:53949e6131f6 613 g_usb0_function_data_count[pipe] = 0;
Kojto 71:53949e6131f6 614 g_usb0_function_data_pointer[pipe] += count;
Kojto 71:53949e6131f6 615
Kojto 71:53949e6131f6 616 status = DEVDRV_USBF_WRITEDMA; /* DMA write */
Kojto 71:53949e6131f6 617 }
Kojto 71:53949e6131f6 618 else
Kojto 71:53949e6131f6 619 {
Kojto 71:53949e6131f6 620 if (RZA_IO_RegRead_16(&USB200.D1FIFOCTR, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL) == 0)
Kojto 71:53949e6131f6 621 {
Kojto 71:53949e6131f6 622 RZA_IO_RegWrite_16(&USB200.D1FIFOCTR, 1, USB_DnFIFOCTR_BVAL_SHIFT, USB_DnFIFOCTR_BVAL); /* Short Packet */
Kojto 71:53949e6131f6 623 }
Kojto 71:53949e6131f6 624 status = DEVDRV_USBF_WRITESHRT; /* Short Packet is end of write */
Kojto 71:53949e6131f6 625 }
Kojto 71:53949e6131f6 626
Kojto 71:53949e6131f6 627 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 628 }
Kojto 71:53949e6131f6 629
Kojto 71:53949e6131f6 630 /*******************************************************************************
Kojto 71:53949e6131f6 631 * Function Name: usb0_function_start_receive_transfer
Kojto 71:53949e6131f6 632 * Description : Starts USB data reception using the pipe specified in the argument.
Kojto 71:53949e6131f6 633 * : The FIFO for using is set in the pipe definition table.
Kojto 71:53949e6131f6 634 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 635 * : uint32_t size ; Data Size
Kojto 71:53949e6131f6 636 * : uint8_t *data ; Data Address
Kojto 71:53949e6131f6 637 * Return Value : none
Kojto 71:53949e6131f6 638 *******************************************************************************/
Kojto 71:53949e6131f6 639 void usb0_function_start_receive_transfer (uint16_t pipe, uint32_t size, uint8_t * data)
Kojto 71:53949e6131f6 640 {
Kojto 71:53949e6131f6 641 uint16_t usefifo;
Kojto 71:53949e6131f6 642
Kojto 71:53949e6131f6 643 usb0_function_clear_bemp_sts(pipe);
Kojto 71:53949e6131f6 644 usb0_function_clear_brdy_sts(pipe);
Kojto 71:53949e6131f6 645 usb0_function_clear_nrdy_sts(pipe);
Kojto 71:53949e6131f6 646
Kojto 71:53949e6131f6 647 usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
Kojto 71:53949e6131f6 648
Kojto 71:53949e6131f6 649 switch (usefifo)
Kojto 71:53949e6131f6 650 {
Kojto 71:53949e6131f6 651 case USB_FUNCTION_D0FIFO_USE:
Kojto 71:53949e6131f6 652 usb0_function_start_receive_trns_d0(pipe, size, data);
Kojto 71:53949e6131f6 653 break;
Kojto 71:53949e6131f6 654
Kojto 71:53949e6131f6 655 case USB_FUNCTION_D1FIFO_USE:
Kojto 71:53949e6131f6 656 usb0_function_start_receive_trns_d1(pipe, size, data);
Kojto 71:53949e6131f6 657 break;
Kojto 71:53949e6131f6 658
Kojto 71:53949e6131f6 659 case USB_FUNCTION_D0FIFO_DMA:
Kojto 71:53949e6131f6 660 usb0_function_start_receive_dma_d0(pipe, size, data);
Kojto 71:53949e6131f6 661 break;
Kojto 71:53949e6131f6 662
Kojto 71:53949e6131f6 663 case USB_FUNCTION_D1FIFO_DMA:
Kojto 71:53949e6131f6 664 usb0_function_start_receive_dma_d1(pipe, size, data);
Kojto 71:53949e6131f6 665 break;
Kojto 71:53949e6131f6 666
Kojto 71:53949e6131f6 667 default:
Kojto 71:53949e6131f6 668 usb0_function_start_receive_trns_c(pipe, size, data);
Kojto 71:53949e6131f6 669 break;
Kojto 71:53949e6131f6 670 }
Kojto 71:53949e6131f6 671 }
Kojto 71:53949e6131f6 672
Kojto 71:53949e6131f6 673 /*******************************************************************************
Kojto 71:53949e6131f6 674 * Function Name: usb0_function_start_receive_trns_c
Kojto 71:53949e6131f6 675 * Description : Reads data from the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 676 * : Reads data by CPU transfer using CFIFO.
Kojto 71:53949e6131f6 677 * : When storing data in the buffer allocated in the pipe specified in the
Kojto 71:53949e6131f6 678 * : argument, BRDY interrupt is generated to read data
Kojto 71:53949e6131f6 679 * : in the interrupt.
Kojto 71:53949e6131f6 680 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 681 * : uint32_t size ; Data Size
Kojto 71:53949e6131f6 682 * : uint8_t *data ; Data Address
Kojto 71:53949e6131f6 683 * Return Value : none
Kojto 71:53949e6131f6 684 *******************************************************************************/
Kojto 71:53949e6131f6 685 static void usb0_function_start_receive_trns_c (uint16_t pipe, uint32_t size, uint8_t * data)
Kojto 71:53949e6131f6 686 {
Kojto 71:53949e6131f6 687 uint16_t mbw;
Kojto 71:53949e6131f6 688
Kojto 71:53949e6131f6 689 usb0_function_set_pid_nak(pipe);
Kojto 71:53949e6131f6 690 g_usb0_function_data_count[pipe] = size;
Kojto 71:53949e6131f6 691 g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
Kojto 71:53949e6131f6 692 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 693
Kojto 71:53949e6131f6 694 g_usb0_function_PipeDataSize[pipe] = size;
Kojto 71:53949e6131f6 695 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT;
Kojto 71:53949e6131f6 696
Kojto 71:53949e6131f6 697 mbw = usb0_function_get_mbw(size, (uint32_t)data);
Kojto 71:53949e6131f6 698 usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
Kojto 71:53949e6131f6 699 USB200.CFIFOCTR = USB_FUNCTION_BITBCLR;
Kojto 71:53949e6131f6 700
Kojto 71:53949e6131f6 701 usb0_function_set_transaction_counter(pipe, size);
Kojto 71:53949e6131f6 702
Kojto 71:53949e6131f6 703 usb0_function_aclrm(pipe);
Kojto 71:53949e6131f6 704
Kojto 71:53949e6131f6 705 usb0_function_enable_nrdy_int(pipe);
Kojto 71:53949e6131f6 706 usb0_function_enable_brdy_int(pipe);
Kojto 71:53949e6131f6 707
Kojto 71:53949e6131f6 708 usb0_function_set_pid_buf(pipe);
Kojto 71:53949e6131f6 709 }
Kojto 71:53949e6131f6 710
Kojto 71:53949e6131f6 711 /*******************************************************************************
Kojto 71:53949e6131f6 712 * Function Name: usb0_function_start_receive_trns_d0
Kojto 71:53949e6131f6 713 * Description : Reads data from the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 714 * : Reads data by CPU transfer using D0FIFO.
Kojto 71:53949e6131f6 715 * : This function does not read data from the buffer.
Kojto 71:53949e6131f6 716 * : When storing data in the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 717 * : in the argument, BRDY interrupt is generated to read data in the
Kojto 71:53949e6131f6 718 * : interrupt.
Kojto 71:53949e6131f6 719 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 720 * : uint32_t size ; Data Size
Kojto 71:53949e6131f6 721 * : uint8_t *data ; Data Address
Kojto 71:53949e6131f6 722 * Return Value : none
Kojto 71:53949e6131f6 723 *******************************************************************************/
Kojto 71:53949e6131f6 724 static void usb0_function_start_receive_trns_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
Kojto 71:53949e6131f6 725 {
Kojto 71:53949e6131f6 726 uint16_t mbw;
Kojto 71:53949e6131f6 727
Kojto 71:53949e6131f6 728 usb0_function_set_pid_nak(pipe);
Kojto 71:53949e6131f6 729 g_usb0_function_data_count[pipe] = size;
Kojto 71:53949e6131f6 730 g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
Kojto 71:53949e6131f6 731 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 732
Kojto 71:53949e6131f6 733 g_usb0_function_PipeDataSize[pipe] = size;
Kojto 71:53949e6131f6 734 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT;
Kojto 71:53949e6131f6 735
Kojto 71:53949e6131f6 736 mbw = usb0_function_get_mbw(size, (uint32_t)data);
Kojto 71:53949e6131f6 737 usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 738
Kojto 71:53949e6131f6 739 usb0_function_set_transaction_counter(pipe, size);
Kojto 71:53949e6131f6 740
Kojto 71:53949e6131f6 741 usb0_function_aclrm(pipe);
Kojto 71:53949e6131f6 742
Kojto 71:53949e6131f6 743 usb0_function_enable_nrdy_int(pipe);
Kojto 71:53949e6131f6 744 usb0_function_enable_brdy_int(pipe);
Kojto 71:53949e6131f6 745
Kojto 71:53949e6131f6 746 usb0_function_set_pid_buf(pipe);
Kojto 71:53949e6131f6 747 }
Kojto 71:53949e6131f6 748
Kojto 71:53949e6131f6 749 /*******************************************************************************
Kojto 71:53949e6131f6 750 * Function Name: usb0_function_start_receive_trns_d1
Kojto 71:53949e6131f6 751 * Description : Reads data from the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 752 * : Reads data by CPU transfer using D1FIFO.
Kojto 71:53949e6131f6 753 * : This function does not read data from the buffer.
Kojto 71:53949e6131f6 754 * : When storing data in the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 755 * : in the argument, BRDY interrupt is generated to read data.
Kojto 71:53949e6131f6 756 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 757 * : uint32_t size ; Data Size
Kojto 71:53949e6131f6 758 * : uint8_t *data ; Data Address
Kojto 71:53949e6131f6 759 * Return Value : none
Kojto 71:53949e6131f6 760 *******************************************************************************/
Kojto 71:53949e6131f6 761 static void usb0_function_start_receive_trns_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
Kojto 71:53949e6131f6 762 {
Kojto 71:53949e6131f6 763 uint16_t mbw;
Kojto 71:53949e6131f6 764
Kojto 71:53949e6131f6 765 usb0_function_set_pid_nak(pipe);
Kojto 71:53949e6131f6 766 g_usb0_function_data_count[pipe] = size;
Kojto 71:53949e6131f6 767 g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
Kojto 71:53949e6131f6 768 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 769
Kojto 71:53949e6131f6 770 g_usb0_function_PipeDataSize[pipe] = size;
Kojto 71:53949e6131f6 771 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT;
Kojto 71:53949e6131f6 772
Kojto 71:53949e6131f6 773 mbw = usb0_function_get_mbw(size, (uint32_t)data);
Kojto 71:53949e6131f6 774 usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 775
Kojto 71:53949e6131f6 776 usb0_function_set_transaction_counter(pipe, size);
Kojto 71:53949e6131f6 777
Kojto 71:53949e6131f6 778 usb0_function_aclrm(pipe);
Kojto 71:53949e6131f6 779
Kojto 71:53949e6131f6 780 usb0_function_enable_nrdy_int(pipe);
Kojto 71:53949e6131f6 781 usb0_function_enable_brdy_int(pipe);
Kojto 71:53949e6131f6 782
Kojto 71:53949e6131f6 783 usb0_function_set_pid_buf(pipe);
Kojto 71:53949e6131f6 784 }
Kojto 71:53949e6131f6 785
Kojto 71:53949e6131f6 786 /*******************************************************************************
Kojto 71:53949e6131f6 787 * Function Name: usb0_function_start_receive_dma_d0
Kojto 71:53949e6131f6 788 * Description : Reads data from the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 789 * : Reads data by DMA transfer using D0FIFO.
Kojto 71:53949e6131f6 790 * : This function does not read data from the buffer.
Kojto 71:53949e6131f6 791 * : When storing data in the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 792 * : in the argument, delivered read request to DMAC to read data from
Kojto 71:53949e6131f6 793 * : the buffer by DMAC.
Kojto 71:53949e6131f6 794 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 795 * : uint32_t size ; Data Size
Kojto 71:53949e6131f6 796 * : uint8_t *data ; Data Address
Kojto 71:53949e6131f6 797 * Return Value : none
Kojto 71:53949e6131f6 798 *******************************************************************************/
Kojto 71:53949e6131f6 799 static void usb0_function_start_receive_dma_d0 (uint16_t pipe, uint32_t size, uint8_t * data)
Kojto 71:53949e6131f6 800 {
Kojto 71:53949e6131f6 801 uint16_t mbw;
Kojto 71:53949e6131f6 802
Kojto 71:53949e6131f6 803 usb0_function_set_pid_nak(pipe);
Kojto 71:53949e6131f6 804 g_usb0_function_data_count[pipe] = size;
Kojto 71:53949e6131f6 805 g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
Kojto 71:53949e6131f6 806 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 807
Kojto 71:53949e6131f6 808 g_usb0_function_PipeDataSize[pipe] = 0;
Kojto 71:53949e6131f6 809 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT;
Kojto 71:53949e6131f6 810
Kojto 71:53949e6131f6 811 mbw = usb0_function_get_mbw(size, (uint32_t)data);
Kojto 71:53949e6131f6 812 usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 813
Kojto 71:53949e6131f6 814 usb0_function_set_transaction_counter(pipe, size);
Kojto 71:53949e6131f6 815
Kojto 71:53949e6131f6 816 usb0_function_aclrm(pipe);
Kojto 71:53949e6131f6 817
Kojto 71:53949e6131f6 818 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
Kojto 71:53949e6131f6 819 {
Kojto 71:53949e6131f6 820 usb0_function_read_dma(pipe);
Kojto 71:53949e6131f6 821
Kojto 71:53949e6131f6 822 usb0_function_enable_nrdy_int(pipe);
Kojto 71:53949e6131f6 823 usb0_function_enable_brdy_int(pipe);
Kojto 71:53949e6131f6 824 }
Kojto 71:53949e6131f6 825 else
Kojto 71:53949e6131f6 826 {
Kojto 71:53949e6131f6 827 usb0_function_enable_nrdy_int(pipe);
Kojto 71:53949e6131f6 828 usb0_function_enable_brdy_int(pipe);
Kojto 71:53949e6131f6 829 }
Kojto 71:53949e6131f6 830
Kojto 71:53949e6131f6 831 usb0_function_set_pid_buf(pipe);
Kojto 71:53949e6131f6 832 }
Kojto 71:53949e6131f6 833
Kojto 71:53949e6131f6 834 /*******************************************************************************
Kojto 71:53949e6131f6 835 * Function Name: usb0_function_start_receive_dma_d1
Kojto 71:53949e6131f6 836 * Description : Read data from the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 837 * : Reads data by DMA transfer using D0FIFO.
Kojto 71:53949e6131f6 838 * : This function does not read data from the buffer.
Kojto 71:53949e6131f6 839 * : When storing data in the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 840 * : in the argument, delivered read request to DMAC to read data from
Kojto 71:53949e6131f6 841 * : the buffer by DMAC.
Kojto 71:53949e6131f6 842 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 843 * : uint32_t size ; Data Size
Kojto 71:53949e6131f6 844 * : uint8_t *data ; Data Address
Kojto 71:53949e6131f6 845 * Return Value : none
Kojto 71:53949e6131f6 846 *******************************************************************************/
Kojto 71:53949e6131f6 847 static void usb0_function_start_receive_dma_d1 (uint16_t pipe, uint32_t size, uint8_t * data)
Kojto 71:53949e6131f6 848 {
Kojto 71:53949e6131f6 849 uint16_t mbw;
Kojto 71:53949e6131f6 850
Kojto 71:53949e6131f6 851 usb0_function_set_pid_nak(pipe);
Kojto 71:53949e6131f6 852 g_usb0_function_data_count[pipe] = size;
Kojto 71:53949e6131f6 853 g_usb0_function_data_pointer[pipe] = (uint8_t *)data;
Kojto 71:53949e6131f6 854 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 855
Kojto 71:53949e6131f6 856 g_usb0_function_PipeDataSize[pipe] = 0;
Kojto 71:53949e6131f6 857 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_WAIT;
Kojto 71:53949e6131f6 858
Kojto 71:53949e6131f6 859 mbw = usb0_function_get_mbw(size, (uint32_t)data);
Kojto 71:53949e6131f6 860 usb0_function_set_curpipe(USB_FUNCTION_PIPE0, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 861
Kojto 71:53949e6131f6 862 usb0_function_set_transaction_counter(pipe, size);
Kojto 71:53949e6131f6 863
Kojto 71:53949e6131f6 864 usb0_function_aclrm(pipe);
Kojto 71:53949e6131f6 865
Kojto 71:53949e6131f6 866 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
Kojto 71:53949e6131f6 867 {
Kojto 71:53949e6131f6 868 usb0_function_read_dma(pipe);
Kojto 71:53949e6131f6 869
Kojto 71:53949e6131f6 870 usb0_function_enable_nrdy_int(pipe);
Kojto 71:53949e6131f6 871 usb0_function_enable_brdy_int(pipe);
Kojto 71:53949e6131f6 872 }
Kojto 71:53949e6131f6 873 else
Kojto 71:53949e6131f6 874 {
Kojto 71:53949e6131f6 875 usb0_function_enable_nrdy_int(pipe);
Kojto 71:53949e6131f6 876 usb0_function_enable_brdy_int(pipe);
Kojto 71:53949e6131f6 877 }
Kojto 71:53949e6131f6 878
Kojto 71:53949e6131f6 879 usb0_function_set_pid_buf(pipe);
Kojto 71:53949e6131f6 880 }
Kojto 71:53949e6131f6 881
Kojto 71:53949e6131f6 882 /*******************************************************************************
Kojto 71:53949e6131f6 883 * Function Name: usb0_function_read_buffer
Kojto 71:53949e6131f6 884 * Description : Reads data from the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 885 * : in the argument.
Kojto 71:53949e6131f6 886 * : Uses FIF0 set in the pipe definition table.
Kojto 71:53949e6131f6 887 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 888 * Return Value : USB_FUNCTION_READEND ; Read end
Kojto 71:53949e6131f6 889 * : USB_FUNCTION_READSHRT ; short data
Kojto 71:53949e6131f6 890 * : USB_FUNCTION_READING ; Continue of data read
Kojto 71:53949e6131f6 891 * : USB_FUNCTION_READOVER ; buffer over
Kojto 71:53949e6131f6 892 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 893 *******************************************************************************/
Kojto 71:53949e6131f6 894 uint16_t usb0_function_read_buffer (uint16_t pipe)
Kojto 71:53949e6131f6 895 {
Kojto 71:53949e6131f6 896 uint16_t status;
Kojto 71:53949e6131f6 897
Kojto 71:53949e6131f6 898 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 899
Kojto 71:53949e6131f6 900 if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
Kojto 71:53949e6131f6 901 {
Kojto 71:53949e6131f6 902 status = usb0_function_read_buffer_d0(pipe);
Kojto 71:53949e6131f6 903 }
Kojto 71:53949e6131f6 904 else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
Kojto 71:53949e6131f6 905 {
Kojto 71:53949e6131f6 906 status = usb0_function_read_buffer_d1(pipe);
Kojto 71:53949e6131f6 907 }
Kojto 71:53949e6131f6 908 else
Kojto 71:53949e6131f6 909 {
Kojto 71:53949e6131f6 910 status = usb0_function_read_buffer_c(pipe);
Kojto 71:53949e6131f6 911 }
Kojto 71:53949e6131f6 912
Kojto 71:53949e6131f6 913 switch (status)
Kojto 71:53949e6131f6 914 {
Kojto 71:53949e6131f6 915 case USB_FUNCTION_READING: /* Continue of data read */
Kojto 71:53949e6131f6 916 break;
Kojto 71:53949e6131f6 917
Kojto 71:53949e6131f6 918 case USB_FUNCTION_READEND: /* End of data read */
Kojto 71:53949e6131f6 919 case USB_FUNCTION_READSHRT: /* End of data read */
Kojto 71:53949e6131f6 920 usb0_function_disable_brdy_int(pipe);
Kojto 71:53949e6131f6 921 g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 922 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
Kojto 71:53949e6131f6 923 break;
Kojto 71:53949e6131f6 924
Kojto 71:53949e6131f6 925 case USB_FUNCTION_READOVER: /* buffer over */
Kojto 71:53949e6131f6 926 if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_USE)
Kojto 71:53949e6131f6 927 {
Kojto 71:53949e6131f6 928 USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 929 }
Kojto 71:53949e6131f6 930 else if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D1FIFO_USE)
Kojto 71:53949e6131f6 931 {
Kojto 71:53949e6131f6 932 USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 933 }
Kojto 71:53949e6131f6 934 else
Kojto 71:53949e6131f6 935 {
Kojto 71:53949e6131f6 936 USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 937 }
Kojto 71:53949e6131f6 938 usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */
Kojto 71:53949e6131f6 939 g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 940 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 941 break;
Kojto 71:53949e6131f6 942
Kojto 71:53949e6131f6 943 case DEVDRV_USBF_FIFOERROR: /* FIFO access status */
Kojto 71:53949e6131f6 944 default:
Kojto 71:53949e6131f6 945 usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */
Kojto 71:53949e6131f6 946 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 947 break;
Kojto 71:53949e6131f6 948 }
Kojto 71:53949e6131f6 949
Kojto 71:53949e6131f6 950 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 951 }
Kojto 71:53949e6131f6 952
Kojto 71:53949e6131f6 953 /*******************************************************************************
Kojto 71:53949e6131f6 954 * Function Name: usb0_function_read_buffer_c
Kojto 71:53949e6131f6 955 * Description : Reads data from the buffer allocated in the pipe specified in the argument.
Kojto 71:53949e6131f6 956 * : Reads data by CPU transfer using CFIFO.
Kojto 71:53949e6131f6 957 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 958 * Return Value : USB_FUNCTION_READEND ; Read end
Kojto 71:53949e6131f6 959 * : USB_FUNCTION_READSHRT ; short data
Kojto 71:53949e6131f6 960 * : USB_FUNCTION_READING ; Continue of data read
Kojto 71:53949e6131f6 961 * : USB_FUNCTION_READOVER ; buffer over
Kojto 71:53949e6131f6 962 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 963 *******************************************************************************/
Kojto 71:53949e6131f6 964 uint16_t usb0_function_read_buffer_c (uint16_t pipe)
Kojto 71:53949e6131f6 965 {
Kojto 71:53949e6131f6 966 uint32_t count;
Kojto 71:53949e6131f6 967 uint32_t dtln;
Kojto 71:53949e6131f6 968 uint16_t buffer;
Kojto 71:53949e6131f6 969 uint16_t mxps;
Kojto 71:53949e6131f6 970 uint16_t status;
Kojto 71:53949e6131f6 971 uint16_t mbw;
Kojto 71:53949e6131f6 972
Kojto 71:53949e6131f6 973 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 974 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_CUSE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 975
Kojto 71:53949e6131f6 976 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 977 {
Kojto 71:53949e6131f6 978 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 979 }
Kojto 71:53949e6131f6 980
Kojto 71:53949e6131f6 981 dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
Kojto 71:53949e6131f6 982 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 983
Kojto 71:53949e6131f6 984 if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */
Kojto 71:53949e6131f6 985 {
Kojto 71:53949e6131f6 986 status = USB_FUNCTION_READOVER;
Kojto 71:53949e6131f6 987 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 988 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 989 }
Kojto 71:53949e6131f6 990 else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */
Kojto 71:53949e6131f6 991 {
Kojto 71:53949e6131f6 992 status = USB_FUNCTION_READEND;
Kojto 71:53949e6131f6 993 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 994 count = dtln;
Kojto 71:53949e6131f6 995
Kojto 71:53949e6131f6 996 if (count == 0)
Kojto 71:53949e6131f6 997 {
Kojto 71:53949e6131f6 998 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 999 }
Kojto 71:53949e6131f6 1000
Kojto 71:53949e6131f6 1001 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1002 {
Kojto 71:53949e6131f6 1003 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1004 }
Kojto 71:53949e6131f6 1005 }
Kojto 71:53949e6131f6 1006 else /* continue Receive data */
Kojto 71:53949e6131f6 1007 {
Kojto 71:53949e6131f6 1008 status = USB_FUNCTION_READING;
Kojto 71:53949e6131f6 1009 count = dtln;
Kojto 71:53949e6131f6 1010
Kojto 71:53949e6131f6 1011 if (count == 0)
Kojto 71:53949e6131f6 1012 {
Kojto 71:53949e6131f6 1013 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1014 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1015 }
Kojto 71:53949e6131f6 1016
Kojto 71:53949e6131f6 1017 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1018 {
Kojto 71:53949e6131f6 1019 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1020 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1021 }
Kojto 71:53949e6131f6 1022 }
Kojto 71:53949e6131f6 1023
Kojto 71:53949e6131f6 1024 if (count == 0) /* 0 length packet */
Kojto 71:53949e6131f6 1025 {
Kojto 71:53949e6131f6 1026 USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 1027 }
Kojto 71:53949e6131f6 1028 else
Kojto 71:53949e6131f6 1029 {
Kojto 71:53949e6131f6 1030 usb0_function_read_c_fifo(pipe, (uint16_t)count);
Kojto 71:53949e6131f6 1031 }
Kojto 71:53949e6131f6 1032
Kojto 71:53949e6131f6 1033 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 1034
Kojto 71:53949e6131f6 1035 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 1036 }
Kojto 71:53949e6131f6 1037
Kojto 71:53949e6131f6 1038 /*******************************************************************************
Kojto 71:53949e6131f6 1039 * Function Name: usb0_function_read_buffer_d0
Kojto 71:53949e6131f6 1040 * Description : Reads data from the buffer allocated in the pipe specified in
Kojto 71:53949e6131f6 1041 * : the argument.
Kojto 71:53949e6131f6 1042 * : Reads data by CPU transfer using D0FIFO.
Kojto 71:53949e6131f6 1043 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1044 * Return Value : USB_FUNCTION_READEND ; Read end
Kojto 71:53949e6131f6 1045 * : USB_FUNCTION_READSHRT ; short data
Kojto 71:53949e6131f6 1046 * : USB_FUNCTION_READING ; Continue of data read
Kojto 71:53949e6131f6 1047 * : USB_FUNCTION_READOVER ; buffer over
Kojto 71:53949e6131f6 1048 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 1049 *******************************************************************************/
Kojto 71:53949e6131f6 1050 uint16_t usb0_function_read_buffer_d0 (uint16_t pipe)
Kojto 71:53949e6131f6 1051 {
Kojto 71:53949e6131f6 1052 uint32_t count;
Kojto 71:53949e6131f6 1053 uint32_t dtln;
Kojto 71:53949e6131f6 1054 uint16_t buffer;
Kojto 71:53949e6131f6 1055 uint16_t mxps;
Kojto 71:53949e6131f6 1056 uint16_t status;
Kojto 71:53949e6131f6 1057 uint16_t mbw;
Kojto 71:53949e6131f6 1058 uint16_t pipebuf_size;
Kojto 71:53949e6131f6 1059
Kojto 71:53949e6131f6 1060 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 1061 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 1062
Kojto 71:53949e6131f6 1063 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 1064 {
Kojto 71:53949e6131f6 1065 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 1066 }
Kojto 71:53949e6131f6 1067
Kojto 71:53949e6131f6 1068 dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
Kojto 71:53949e6131f6 1069 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 1070
Kojto 71:53949e6131f6 1071 if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */
Kojto 71:53949e6131f6 1072 {
Kojto 71:53949e6131f6 1073 status = USB_FUNCTION_READOVER;
Kojto 71:53949e6131f6 1074 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1075 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1076 }
Kojto 71:53949e6131f6 1077 else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */
Kojto 71:53949e6131f6 1078 {
Kojto 71:53949e6131f6 1079 status = USB_FUNCTION_READEND;
Kojto 71:53949e6131f6 1080 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1081 count = dtln;
Kojto 71:53949e6131f6 1082
Kojto 71:53949e6131f6 1083 if (count == 0)
Kojto 71:53949e6131f6 1084 {
Kojto 71:53949e6131f6 1085 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1086 }
Kojto 71:53949e6131f6 1087
Kojto 71:53949e6131f6 1088 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1089 {
Kojto 71:53949e6131f6 1090 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1091 }
Kojto 71:53949e6131f6 1092 }
Kojto 71:53949e6131f6 1093 else /* continue Receive data */
Kojto 71:53949e6131f6 1094 {
Kojto 71:53949e6131f6 1095 status = USB_FUNCTION_READING;
Kojto 71:53949e6131f6 1096 count = dtln;
Kojto 71:53949e6131f6 1097
Kojto 71:53949e6131f6 1098 if (count == 0)
Kojto 71:53949e6131f6 1099 {
Kojto 71:53949e6131f6 1100 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1101 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1102 }
Kojto 71:53949e6131f6 1103
Kojto 71:53949e6131f6 1104 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1105 {
Kojto 71:53949e6131f6 1106 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1107 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1108 }
Kojto 71:53949e6131f6 1109 else
Kojto 71:53949e6131f6 1110 {
Kojto 71:53949e6131f6 1111 pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 1112
Kojto 71:53949e6131f6 1113 if (count != pipebuf_size)
Kojto 71:53949e6131f6 1114 {
Kojto 71:53949e6131f6 1115 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1116 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1117 }
Kojto 71:53949e6131f6 1118 }
Kojto 71:53949e6131f6 1119 }
Kojto 71:53949e6131f6 1120
Kojto 71:53949e6131f6 1121 if (count == 0) /* 0 length packet */
Kojto 71:53949e6131f6 1122 {
Kojto 71:53949e6131f6 1123 USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 1124 }
Kojto 71:53949e6131f6 1125 else
Kojto 71:53949e6131f6 1126 {
Kojto 71:53949e6131f6 1127 usb0_function_read_d0_fifo(pipe, (uint16_t)count);
Kojto 71:53949e6131f6 1128 }
Kojto 71:53949e6131f6 1129
Kojto 71:53949e6131f6 1130 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 1131
Kojto 71:53949e6131f6 1132 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 1133 }
Kojto 71:53949e6131f6 1134
Kojto 71:53949e6131f6 1135 /*******************************************************************************
Kojto 71:53949e6131f6 1136 * Function Name: usb0_function_read_buffer_d1
Kojto 71:53949e6131f6 1137 * Description : Reads data from the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 1138 * : in the argument.
Kojto 71:53949e6131f6 1139 * : Reads data by CPU transfer using D1FIFO.
Kojto 71:53949e6131f6 1140 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1141 * Return Value : USB_FUNCTION_READEND ; Read end
Kojto 71:53949e6131f6 1142 * : USB_FUNCTION_READSHRT ; short data
Kojto 71:53949e6131f6 1143 * : USB_FUNCTION_READING ; Continue of data read
Kojto 71:53949e6131f6 1144 * : USB_FUNCTION_READOVER ; buffer over
Kojto 71:53949e6131f6 1145 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 1146 *******************************************************************************/
Kojto 71:53949e6131f6 1147 uint16_t usb0_function_read_buffer_d1 (uint16_t pipe)
Kojto 71:53949e6131f6 1148 {
Kojto 71:53949e6131f6 1149 uint32_t count;
Kojto 71:53949e6131f6 1150 uint32_t dtln;
Kojto 71:53949e6131f6 1151 uint16_t buffer;
Kojto 71:53949e6131f6 1152 uint16_t mxps;
Kojto 71:53949e6131f6 1153 uint16_t status;
Kojto 71:53949e6131f6 1154 uint16_t mbw;
Kojto 71:53949e6131f6 1155 uint16_t pipebuf_size;
Kojto 71:53949e6131f6 1156
Kojto 71:53949e6131f6 1157 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 1158 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 1159
Kojto 71:53949e6131f6 1160 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 1161 {
Kojto 71:53949e6131f6 1162 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 1163 }
Kojto 71:53949e6131f6 1164
Kojto 71:53949e6131f6 1165 dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
Kojto 71:53949e6131f6 1166 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 1167
Kojto 71:53949e6131f6 1168 if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */
Kojto 71:53949e6131f6 1169 {
Kojto 71:53949e6131f6 1170 status = USB_FUNCTION_READOVER;
Kojto 71:53949e6131f6 1171 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1172 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1173 }
Kojto 71:53949e6131f6 1174 else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */
Kojto 71:53949e6131f6 1175 {
Kojto 71:53949e6131f6 1176 status = USB_FUNCTION_READEND;
Kojto 71:53949e6131f6 1177 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1178 count = dtln;
Kojto 71:53949e6131f6 1179 if (count == 0)
Kojto 71:53949e6131f6 1180 {
Kojto 71:53949e6131f6 1181 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1182 }
Kojto 71:53949e6131f6 1183
Kojto 71:53949e6131f6 1184 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1185 {
Kojto 71:53949e6131f6 1186 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1187 }
Kojto 71:53949e6131f6 1188 }
Kojto 71:53949e6131f6 1189 else /* continue Receive data */
Kojto 71:53949e6131f6 1190 {
Kojto 71:53949e6131f6 1191 status = USB_FUNCTION_READING;
Kojto 71:53949e6131f6 1192 count = dtln;
Kojto 71:53949e6131f6 1193 if (count == 0)
Kojto 71:53949e6131f6 1194 {
Kojto 71:53949e6131f6 1195 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1196 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1197 }
Kojto 71:53949e6131f6 1198
Kojto 71:53949e6131f6 1199 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1200 {
Kojto 71:53949e6131f6 1201 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1202 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1203 }
Kojto 71:53949e6131f6 1204 else
Kojto 71:53949e6131f6 1205 {
Kojto 71:53949e6131f6 1206 pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 1207
Kojto 71:53949e6131f6 1208 if (count != pipebuf_size)
Kojto 71:53949e6131f6 1209 {
Kojto 71:53949e6131f6 1210 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1211 usb0_function_set_pid_nak(pipe); /* Set NAK */
Kojto 71:53949e6131f6 1212 }
Kojto 71:53949e6131f6 1213 }
Kojto 71:53949e6131f6 1214 }
Kojto 71:53949e6131f6 1215
Kojto 71:53949e6131f6 1216 if (count == 0) /* 0 length packet */
Kojto 71:53949e6131f6 1217 {
Kojto 71:53949e6131f6 1218 USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 1219 }
Kojto 71:53949e6131f6 1220 else
Kojto 71:53949e6131f6 1221 {
Kojto 71:53949e6131f6 1222 usb0_function_read_d1_fifo(pipe, (uint16_t)count);
Kojto 71:53949e6131f6 1223 }
Kojto 71:53949e6131f6 1224
Kojto 71:53949e6131f6 1225 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 1226
Kojto 71:53949e6131f6 1227 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 1228 }
Kojto 71:53949e6131f6 1229
Kojto 71:53949e6131f6 1230 /*******************************************************************************
Kojto 71:53949e6131f6 1231 * Function Name: usb0_function_read_dma
Kojto 71:53949e6131f6 1232 * Description : Reads data from the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 1233 * : in the argument.
Kojto 71:53949e6131f6 1234 * : Reads data by DMA transfer using D0FIFO or D1FIFO.
Kojto 71:53949e6131f6 1235 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1236 * Return Value : USB_FUNCTION_READEND ; Read end
Kojto 71:53949e6131f6 1237 * : USB_FUNCTION_READSHRT ; short data
Kojto 71:53949e6131f6 1238 * : USB_FUNCTION_READING ; Continue of data read
Kojto 71:53949e6131f6 1239 * : USB_FUNCTION_READOVER ; buffer over
Kojto 71:53949e6131f6 1240 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 1241 *******************************************************************************/
Kojto 71:53949e6131f6 1242 uint16_t usb0_function_read_dma (uint16_t pipe)
Kojto 71:53949e6131f6 1243 {
Kojto 71:53949e6131f6 1244 uint16_t status;
Kojto 71:53949e6131f6 1245
Kojto 71:53949e6131f6 1246 g_usb0_function_PipeIgnore[pipe] = 0;
Kojto 71:53949e6131f6 1247 if ((g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) == USB_FUNCTION_D0FIFO_DMA)
Kojto 71:53949e6131f6 1248 {
Kojto 71:53949e6131f6 1249 status = usb0_function_read_dma_d0(pipe);
Kojto 71:53949e6131f6 1250 }
Kojto 71:53949e6131f6 1251 else
Kojto 71:53949e6131f6 1252 {
Kojto 71:53949e6131f6 1253 status = usb0_function_read_dma_d1(pipe);
Kojto 71:53949e6131f6 1254 }
Kojto 71:53949e6131f6 1255
Kojto 71:53949e6131f6 1256 switch (status)
Kojto 71:53949e6131f6 1257 {
Kojto 71:53949e6131f6 1258 case USB_FUNCTION_READING: /* Continue of data read */
Kojto 71:53949e6131f6 1259 break;
Kojto 71:53949e6131f6 1260
Kojto 71:53949e6131f6 1261 case USB_FUNCTION_READZERO: /* End of data read */
Kojto 71:53949e6131f6 1262 usb0_function_disable_brdy_int(pipe);
Kojto 71:53949e6131f6 1263 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
Kojto 71:53949e6131f6 1264 break;
Kojto 71:53949e6131f6 1265
Kojto 71:53949e6131f6 1266 case USB_FUNCTION_READEND: /* End of data read */
Kojto 71:53949e6131f6 1267 case USB_FUNCTION_READSHRT: /* End of data read */
Kojto 71:53949e6131f6 1268 usb0_function_disable_brdy_int(pipe);
Kojto 71:53949e6131f6 1269
Kojto 71:53949e6131f6 1270 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
Kojto 71:53949e6131f6 1271 {
Kojto 71:53949e6131f6 1272 g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1273 }
Kojto 71:53949e6131f6 1274 break;
Kojto 71:53949e6131f6 1275
Kojto 71:53949e6131f6 1276 case USB_FUNCTION_READOVER: /* buffer over */
Kojto 71:53949e6131f6 1277 usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */
Kojto 71:53949e6131f6 1278
Kojto 71:53949e6131f6 1279 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
Kojto 71:53949e6131f6 1280 {
Kojto 71:53949e6131f6 1281 g_usb0_function_PipeDataSize[pipe] -= g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1282 }
Kojto 71:53949e6131f6 1283 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 1284 break;
Kojto 71:53949e6131f6 1285
Kojto 71:53949e6131f6 1286 case DEVDRV_USBF_FIFOERROR: /* FIFO access status */
Kojto 71:53949e6131f6 1287 default:
Kojto 71:53949e6131f6 1288 usb0_function_disable_brdy_int(pipe); /* Disable Ready Interrupt */
Kojto 71:53949e6131f6 1289 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 1290 break;
Kojto 71:53949e6131f6 1291 }
Kojto 71:53949e6131f6 1292
Kojto 71:53949e6131f6 1293 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 1294 }
Kojto 71:53949e6131f6 1295
Kojto 71:53949e6131f6 1296 /*******************************************************************************
Kojto 71:53949e6131f6 1297 * Function Name: usb0_function_read_dma_d0
Kojto 71:53949e6131f6 1298 * Description : Writes data in the buffer allocated in the pipe specified
Kojto 71:53949e6131f6 1299 * : in the argument.
Kojto 71:53949e6131f6 1300 * : Reads data by DMA transfer using D0FIFO.
Kojto 71:53949e6131f6 1301 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1302 * Return Value : USB_FUNCTION_READEND ; Read end
Kojto 71:53949e6131f6 1303 * : USB_FUNCTION_READSHRT ; short data
Kojto 71:53949e6131f6 1304 * : USB_FUNCTION_READZERO ; zero data
Kojto 71:53949e6131f6 1305 * : USB_FUNCTION_READING ; Continue of data read
Kojto 71:53949e6131f6 1306 * : USB_FUNCTION_READOVER ; buffer over
Kojto 71:53949e6131f6 1307 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 1308 *******************************************************************************/
Kojto 71:53949e6131f6 1309 static uint16_t usb0_function_read_dma_d0 (uint16_t pipe)
Kojto 71:53949e6131f6 1310 {
Kojto 71:53949e6131f6 1311 uint32_t count;
Kojto 71:53949e6131f6 1312 uint32_t dtln;
Kojto 71:53949e6131f6 1313 uint16_t buffer;
Kojto 71:53949e6131f6 1314 uint16_t mxps;
Kojto 71:53949e6131f6 1315 uint16_t status;
Kojto 71:53949e6131f6 1316 uint16_t mbw;
Kojto 71:53949e6131f6 1317 uint16_t dfacc = 0;
Kojto 71:53949e6131f6 1318 uint16_t pipebuf_size;
Kojto 71:53949e6131f6 1319
Kojto 71:53949e6131f6 1320 g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_READY;
Kojto 71:53949e6131f6 1321
Kojto 71:53949e6131f6 1322 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 1323
Kojto 71:53949e6131f6 1324 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
Kojto 71:53949e6131f6 1325 {
Kojto 71:53949e6131f6 1326 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1327 status = USB_FUNCTION_READING;
Kojto 71:53949e6131f6 1328 }
Kojto 71:53949e6131f6 1329 else
Kojto 71:53949e6131f6 1330 {
Kojto 71:53949e6131f6 1331 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 1332
Kojto 71:53949e6131f6 1333 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 1334 {
Kojto 71:53949e6131f6 1335 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 1336 }
Kojto 71:53949e6131f6 1337
Kojto 71:53949e6131f6 1338 dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
Kojto 71:53949e6131f6 1339 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 1340
Kojto 71:53949e6131f6 1341 if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */
Kojto 71:53949e6131f6 1342 {
Kojto 71:53949e6131f6 1343 status = USB_FUNCTION_READOVER;
Kojto 71:53949e6131f6 1344 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1345 }
Kojto 71:53949e6131f6 1346 else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */
Kojto 71:53949e6131f6 1347 {
Kojto 71:53949e6131f6 1348 status = USB_FUNCTION_READEND;
Kojto 71:53949e6131f6 1349 count = dtln;
Kojto 71:53949e6131f6 1350 if (count == 0)
Kojto 71:53949e6131f6 1351 {
Kojto 71:53949e6131f6 1352 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1353 }
Kojto 71:53949e6131f6 1354
Kojto 71:53949e6131f6 1355 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1356 {
Kojto 71:53949e6131f6 1357 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1358 }
Kojto 71:53949e6131f6 1359 }
Kojto 71:53949e6131f6 1360 else /* continue Receive data */
Kojto 71:53949e6131f6 1361 {
Kojto 71:53949e6131f6 1362 status = USB_FUNCTION_READING;
Kojto 71:53949e6131f6 1363 count = dtln;
Kojto 71:53949e6131f6 1364
Kojto 71:53949e6131f6 1365 if (count == 0)
Kojto 71:53949e6131f6 1366 {
Kojto 71:53949e6131f6 1367 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1368 }
Kojto 71:53949e6131f6 1369
Kojto 71:53949e6131f6 1370 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1371 {
Kojto 71:53949e6131f6 1372 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1373 }
Kojto 71:53949e6131f6 1374 else
Kojto 71:53949e6131f6 1375 {
Kojto 71:53949e6131f6 1376 pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 1377 if (count != pipebuf_size)
Kojto 71:53949e6131f6 1378 {
Kojto 71:53949e6131f6 1379 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1380 }
Kojto 71:53949e6131f6 1381 }
Kojto 71:53949e6131f6 1382 }
Kojto 71:53949e6131f6 1383 }
Kojto 71:53949e6131f6 1384
Kojto 71:53949e6131f6 1385 if (count == 0) /* 0 length packet */
Kojto 71:53949e6131f6 1386 {
Kojto 71:53949e6131f6 1387 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
Kojto 71:53949e6131f6 1388 {
Kojto 71:53949e6131f6 1389 USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 1390 status = USB_FUNCTION_READZERO; /* Null Packet receive */
Kojto 71:53949e6131f6 1391 }
Kojto 71:53949e6131f6 1392 else
Kojto 71:53949e6131f6 1393 {
Kojto 71:53949e6131f6 1394 usb0_function_set_curpipe(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 1395 /* transaction counter No set */
Kojto 71:53949e6131f6 1396 /* FRDY = 1, DTLN = 0 -> BRDY */
Kojto 71:53949e6131f6 1397 }
Kojto 71:53949e6131f6 1398 }
Kojto 71:53949e6131f6 1399 else
Kojto 71:53949e6131f6 1400 {
Kojto 71:53949e6131f6 1401 dfacc = usb0_function_set_dfacc_d0(mbw, count);
Kojto 71:53949e6131f6 1402
Kojto 71:53949e6131f6 1403 if (mbw == USB_FUNCTION_BITMBW_32)
Kojto 71:53949e6131f6 1404 {
Kojto 71:53949e6131f6 1405 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 2; /* 32bit transfer */
Kojto 71:53949e6131f6 1406 }
Kojto 71:53949e6131f6 1407 else if (mbw == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 1408 {
Kojto 71:53949e6131f6 1409 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 1; /* 16bit transfer */
Kojto 71:53949e6131f6 1410 }
Kojto 71:53949e6131f6 1411 else
Kojto 71:53949e6131f6 1412 {
Kojto 71:53949e6131f6 1413 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].size = 0; /* 8bit transfer */
Kojto 71:53949e6131f6 1414 }
Kojto 71:53949e6131f6 1415
Kojto 71:53949e6131f6 1416 g_usb0_function_DmaPipe[USB_FUNCTION_D0FIFO] = pipe; /* not use in read operation */
Kojto 71:53949e6131f6 1417 g_usb0_function_DmaBval[USB_FUNCTION_D0FIFO] = 0; /* not use in read operation */
Kojto 71:53949e6131f6 1418
Kojto 71:53949e6131f6 1419 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].fifo = USB_FUNCTION_D0FIFO_DMA;
Kojto 71:53949e6131f6 1420 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].dir = USB_FUNCTION_FIFO2BUF;
Kojto 71:53949e6131f6 1421 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
Kojto 71:53949e6131f6 1422 g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO].bytes = count;
Kojto 71:53949e6131f6 1423
Kojto 71:53949e6131f6 1424 if (status == USB_FUNCTION_READING)
Kojto 71:53949e6131f6 1425 {
Kojto 71:53949e6131f6 1426 g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSY;
Kojto 71:53949e6131f6 1427 }
Kojto 71:53949e6131f6 1428 else
Kojto 71:53949e6131f6 1429 {
Kojto 71:53949e6131f6 1430 g_usb0_function_DmaStatus[USB_FUNCTION_D0FIFO] = USB_FUNCTION_DMA_BUSYEND;
Kojto 71:53949e6131f6 1431 }
Kojto 71:53949e6131f6 1432
Kojto 71:53949e6131f6 1433 Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D0FIFO], dfacc);
Kojto 71:53949e6131f6 1434
Kojto 71:53949e6131f6 1435 usb0_function_set_curpipe2(pipe, USB_FUNCTION_D0DMA, DEVDRV_USBF_NO, mbw, dfacc);
Kojto 71:53949e6131f6 1436
Kojto 71:53949e6131f6 1437 RZA_IO_RegWrite_16(&USB200.D0FIFOSEL,
Kojto 71:53949e6131f6 1438 1,
Kojto 71:53949e6131f6 1439 USB_DnFIFOSEL_DREQE_SHIFT,
Kojto 71:53949e6131f6 1440 USB_DnFIFOSEL_DREQE);
Kojto 71:53949e6131f6 1441 }
Kojto 71:53949e6131f6 1442
Kojto 71:53949e6131f6 1443 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
Kojto 71:53949e6131f6 1444 {
Kojto 71:53949e6131f6 1445 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 1446 g_usb0_function_data_pointer[pipe] += count;
Kojto 71:53949e6131f6 1447 g_usb0_function_PipeDataSize[pipe] += count;
Kojto 71:53949e6131f6 1448 }
Kojto 71:53949e6131f6 1449
Kojto 71:53949e6131f6 1450 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 1451 }
Kojto 71:53949e6131f6 1452
Kojto 71:53949e6131f6 1453 /*******************************************************************************
Kojto 71:53949e6131f6 1454 * Function Name: usb0_function_read_dma_d1
Kojto 71:53949e6131f6 1455 * Description : Reads data from the buffer allocated in the pipe specified in
Kojto 71:53949e6131f6 1456 * : the argument.
Kojto 71:53949e6131f6 1457 * : Reads data by DMA transfer using D1FIFO.
Kojto 71:53949e6131f6 1458 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1459 * Return Value : USB_FUNCTION_READEND ; Read end
Kojto 71:53949e6131f6 1460 * : USB_FUNCTION_READSHRT ; short data
Kojto 71:53949e6131f6 1461 * : USB_FUNCTION_READZERO ; zero data
Kojto 71:53949e6131f6 1462 * : USB_FUNCTION_READING ; Continue of data read
Kojto 71:53949e6131f6 1463 * : USB_FUNCTION_READOVER ; buffer over
Kojto 71:53949e6131f6 1464 * : DEVDRV_USBF_FIFOERROR ; FIFO status
Kojto 71:53949e6131f6 1465 *******************************************************************************/
Kojto 71:53949e6131f6 1466 static uint16_t usb0_function_read_dma_d1 (uint16_t pipe)
Kojto 71:53949e6131f6 1467 {
Kojto 71:53949e6131f6 1468 uint32_t count;
Kojto 71:53949e6131f6 1469 uint32_t dtln;
Kojto 71:53949e6131f6 1470 uint16_t buffer;
Kojto 71:53949e6131f6 1471 uint16_t mxps;
Kojto 71:53949e6131f6 1472 uint16_t status;
Kojto 71:53949e6131f6 1473 uint16_t mbw;
Kojto 71:53949e6131f6 1474 uint16_t dfacc=0;
Kojto 71:53949e6131f6 1475 uint16_t pipebuf_size;
Kojto 71:53949e6131f6 1476
Kojto 71:53949e6131f6 1477 g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_READY;
Kojto 71:53949e6131f6 1478
Kojto 71:53949e6131f6 1479 mbw = usb0_function_get_mbw(g_usb0_function_data_count[pipe], (uint32_t)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 1480
Kojto 71:53949e6131f6 1481 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 1)
Kojto 71:53949e6131f6 1482 {
Kojto 71:53949e6131f6 1483 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1484 status = USB_FUNCTION_READING;
Kojto 71:53949e6131f6 1485 }
Kojto 71:53949e6131f6 1486 else
Kojto 71:53949e6131f6 1487 {
Kojto 71:53949e6131f6 1488 buffer = usb0_function_change_fifo_port(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 1489 if (buffer == DEVDRV_USBF_FIFOERROR) /* FIFO access status */
Kojto 71:53949e6131f6 1490 {
Kojto 71:53949e6131f6 1491 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 1492 }
Kojto 71:53949e6131f6 1493
Kojto 71:53949e6131f6 1494 dtln = (uint32_t)(buffer & USB_FUNCTION_BITDTLN);
Kojto 71:53949e6131f6 1495 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 1496
Kojto 71:53949e6131f6 1497 if (g_usb0_function_data_count[pipe] < dtln) /* Buffer Over ? */
Kojto 71:53949e6131f6 1498 {
Kojto 71:53949e6131f6 1499 status = USB_FUNCTION_READOVER;
Kojto 71:53949e6131f6 1500 count = g_usb0_function_data_count[pipe];
Kojto 71:53949e6131f6 1501 }
Kojto 71:53949e6131f6 1502 else if (g_usb0_function_data_count[pipe] == dtln) /* just Receive Size */
Kojto 71:53949e6131f6 1503 {
Kojto 71:53949e6131f6 1504 status = USB_FUNCTION_READEND;
Kojto 71:53949e6131f6 1505 count = dtln;
Kojto 71:53949e6131f6 1506 if (count == 0)
Kojto 71:53949e6131f6 1507 {
Kojto 71:53949e6131f6 1508 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1509 }
Kojto 71:53949e6131f6 1510
Kojto 71:53949e6131f6 1511 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1512 {
Kojto 71:53949e6131f6 1513 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1514 }
Kojto 71:53949e6131f6 1515 }
Kojto 71:53949e6131f6 1516 else /* continue Receive data */
Kojto 71:53949e6131f6 1517 {
Kojto 71:53949e6131f6 1518 status = USB_FUNCTION_READING;
Kojto 71:53949e6131f6 1519 count = dtln;
Kojto 71:53949e6131f6 1520 if (count == 0)
Kojto 71:53949e6131f6 1521 {
Kojto 71:53949e6131f6 1522 status = USB_FUNCTION_READSHRT; /* Null Packet receive */
Kojto 71:53949e6131f6 1523 }
Kojto 71:53949e6131f6 1524
Kojto 71:53949e6131f6 1525 if ((count % mxps) != 0)
Kojto 71:53949e6131f6 1526 {
Kojto 71:53949e6131f6 1527 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1528 }
Kojto 71:53949e6131f6 1529 else
Kojto 71:53949e6131f6 1530 {
Kojto 71:53949e6131f6 1531 pipebuf_size = usb0_function_get_buf_size(pipe); /* Data buffer size */
Kojto 71:53949e6131f6 1532 if (count != pipebuf_size)
Kojto 71:53949e6131f6 1533 {
Kojto 71:53949e6131f6 1534 status = USB_FUNCTION_READSHRT; /* Short Packet receive */
Kojto 71:53949e6131f6 1535 }
Kojto 71:53949e6131f6 1536 }
Kojto 71:53949e6131f6 1537 }
Kojto 71:53949e6131f6 1538 }
Kojto 71:53949e6131f6 1539
Kojto 71:53949e6131f6 1540 if (count == 0) /* 0 length packet */
Kojto 71:53949e6131f6 1541 {
Kojto 71:53949e6131f6 1542 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
Kojto 71:53949e6131f6 1543 {
Kojto 71:53949e6131f6 1544 USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Clear BCLR */
Kojto 71:53949e6131f6 1545 status = USB_FUNCTION_READZERO; /* Null Packet receive */
Kojto 71:53949e6131f6 1546 }
Kojto 71:53949e6131f6 1547 else
Kojto 71:53949e6131f6 1548 {
Kojto 71:53949e6131f6 1549 usb0_function_set_curpipe(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw);
Kojto 71:53949e6131f6 1550 /* transaction counter No set */
Kojto 71:53949e6131f6 1551 /* FRDY = 1, DTLN = 0 -> BRDY */
Kojto 71:53949e6131f6 1552 }
Kojto 71:53949e6131f6 1553 }
Kojto 71:53949e6131f6 1554 else
Kojto 71:53949e6131f6 1555 {
Kojto 71:53949e6131f6 1556 dfacc = usb0_function_set_dfacc_d1(mbw, count);
Kojto 71:53949e6131f6 1557
Kojto 71:53949e6131f6 1558 if (mbw == USB_FUNCTION_BITMBW_32)
Kojto 71:53949e6131f6 1559 {
Kojto 71:53949e6131f6 1560 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 2; /* 32bit transfer */
Kojto 71:53949e6131f6 1561 }
Kojto 71:53949e6131f6 1562 else if (mbw == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 1563 {
Kojto 71:53949e6131f6 1564 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 1; /* 16bit transfer */
Kojto 71:53949e6131f6 1565 }
Kojto 71:53949e6131f6 1566 else
Kojto 71:53949e6131f6 1567 {
Kojto 71:53949e6131f6 1568 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].size = 0; /* 8bit transfer */
Kojto 71:53949e6131f6 1569 }
Kojto 71:53949e6131f6 1570
Kojto 71:53949e6131f6 1571 g_usb0_function_DmaPipe[USB_FUNCTION_D1FIFO] = pipe; /* not use in read operation */
Kojto 71:53949e6131f6 1572 g_usb0_function_DmaBval[USB_FUNCTION_D1FIFO] = 0; /* not use in read operation */
Kojto 71:53949e6131f6 1573
Kojto 71:53949e6131f6 1574 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].fifo = USB_FUNCTION_D1FIFO_DMA;
Kojto 71:53949e6131f6 1575 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].dir = USB_FUNCTION_FIFO2BUF;
Kojto 71:53949e6131f6 1576 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].buffer = (uint32_t)g_usb0_function_data_pointer[pipe];
Kojto 71:53949e6131f6 1577 g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO].bytes = count;
Kojto 71:53949e6131f6 1578
Kojto 71:53949e6131f6 1579 if (status == USB_FUNCTION_READING)
Kojto 71:53949e6131f6 1580 {
Kojto 71:53949e6131f6 1581 g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSY;
Kojto 71:53949e6131f6 1582 }
Kojto 71:53949e6131f6 1583 else
Kojto 71:53949e6131f6 1584 {
Kojto 71:53949e6131f6 1585 g_usb0_function_DmaStatus[USB_FUNCTION_D1FIFO] = USB_FUNCTION_DMA_BUSYEND;
Kojto 71:53949e6131f6 1586 }
Kojto 71:53949e6131f6 1587
Kojto 71:53949e6131f6 1588 Userdef_USB_usb0_function_start_dma(&g_usb0_function_DmaInfo[USB_FUNCTION_D1FIFO], dfacc);
Kojto 71:53949e6131f6 1589
Kojto 71:53949e6131f6 1590 usb0_function_set_curpipe2(pipe, USB_FUNCTION_D1DMA, DEVDRV_USBF_NO, mbw, dfacc);
Kojto 71:53949e6131f6 1591
Kojto 71:53949e6131f6 1592 RZA_IO_RegWrite_16(&USB200.D1FIFOSEL,
Kojto 71:53949e6131f6 1593 1,
Kojto 71:53949e6131f6 1594 USB_DnFIFOSEL_DREQE_SHIFT,
Kojto 71:53949e6131f6 1595 USB_DnFIFOSEL_DREQE);
Kojto 71:53949e6131f6 1596 }
Kojto 71:53949e6131f6 1597
Kojto 71:53949e6131f6 1598 if (RZA_IO_RegRead_16(&g_usb0_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0)
Kojto 71:53949e6131f6 1599 {
Kojto 71:53949e6131f6 1600 g_usb0_function_data_count[pipe] -= count;
Kojto 71:53949e6131f6 1601 g_usb0_function_data_pointer[pipe] += count;
Kojto 71:53949e6131f6 1602 g_usb0_function_PipeDataSize[pipe] += count;
Kojto 71:53949e6131f6 1603 }
Kojto 71:53949e6131f6 1604
Kojto 71:53949e6131f6 1605 return status; /* End or Err or Continue */
Kojto 71:53949e6131f6 1606 }
Kojto 71:53949e6131f6 1607
Kojto 71:53949e6131f6 1608 /*******************************************************************************
Kojto 71:53949e6131f6 1609 * Function Name: usb0_function_change_fifo_port
Kojto 71:53949e6131f6 1610 * Description : Allocates FIF0 specified by the argument in the pipe assigned
Kojto 71:53949e6131f6 1611 * : by the argument. After allocating FIF0, waits in the software
Kojto 71:53949e6131f6 1612 * : till the corresponding pipe becomes ready.
Kojto 71:53949e6131f6 1613 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1614 * : uint16_t fifosel ; Select FIFO
Kojto 71:53949e6131f6 1615 * : uint16_t isel ; FIFO Access Direction
Kojto 71:53949e6131f6 1616 * : uint16_t mbw ; FIFO Port Access Bit Width
Kojto 71:53949e6131f6 1617 * Return Value : DEVDRV_USBF_FIFOERROR ; Error
Kojto 71:53949e6131f6 1618 * : Others ; CFIFOCTR/D0FIFOCTR/D1FIFOCTR Register Value
Kojto 71:53949e6131f6 1619 *******************************************************************************/
Kojto 71:53949e6131f6 1620 uint16_t usb0_function_change_fifo_port (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
Kojto 71:53949e6131f6 1621 {
Kojto 71:53949e6131f6 1622 uint16_t buffer;
Kojto 71:53949e6131f6 1623 uint32_t loop;
Kojto 71:53949e6131f6 1624 volatile uint32_t loop2;
Kojto 71:53949e6131f6 1625
Kojto 71:53949e6131f6 1626 usb0_function_set_curpipe(pipe, fifosel, isel, mbw);
Kojto 71:53949e6131f6 1627
Kojto 71:53949e6131f6 1628 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1629 {
Kojto 71:53949e6131f6 1630 switch (fifosel)
Kojto 71:53949e6131f6 1631 {
Kojto 71:53949e6131f6 1632 case USB_FUNCTION_CUSE:
Kojto 71:53949e6131f6 1633 buffer = USB200.CFIFOCTR;
Kojto 71:53949e6131f6 1634 break;
Kojto 71:53949e6131f6 1635
Kojto 71:53949e6131f6 1636 case USB_FUNCTION_D0USE:
Kojto 71:53949e6131f6 1637 case USB_FUNCTION_D0DMA:
Kojto 71:53949e6131f6 1638 buffer = USB200.D0FIFOCTR;
Kojto 71:53949e6131f6 1639 break;
Kojto 71:53949e6131f6 1640
Kojto 71:53949e6131f6 1641 case USB_FUNCTION_D1USE:
Kojto 71:53949e6131f6 1642 case USB_FUNCTION_D1DMA:
Kojto 71:53949e6131f6 1643 buffer = USB200.D1FIFOCTR;
Kojto 71:53949e6131f6 1644 break;
Kojto 71:53949e6131f6 1645
Kojto 71:53949e6131f6 1646 default:
Kojto 71:53949e6131f6 1647 buffer = 0;
Kojto 71:53949e6131f6 1648 break;
Kojto 71:53949e6131f6 1649 }
Kojto 71:53949e6131f6 1650
Kojto 71:53949e6131f6 1651 if ((buffer & USB_FUNCTION_BITFRDY) == USB_FUNCTION_BITFRDY)
Kojto 71:53949e6131f6 1652 {
Kojto 71:53949e6131f6 1653 return buffer;
Kojto 71:53949e6131f6 1654 }
Kojto 71:53949e6131f6 1655
Kojto 71:53949e6131f6 1656 loop2 = 25;
Kojto 71:53949e6131f6 1657 while (loop2-- > 0)
Kojto 71:53949e6131f6 1658 {
Kojto 71:53949e6131f6 1659 /* wait */
Kojto 71:53949e6131f6 1660 }
Kojto 71:53949e6131f6 1661 }
Kojto 71:53949e6131f6 1662
Kojto 71:53949e6131f6 1663 return DEVDRV_USBF_FIFOERROR;
Kojto 71:53949e6131f6 1664 }
Kojto 71:53949e6131f6 1665
Kojto 71:53949e6131f6 1666 /*******************************************************************************
Kojto 71:53949e6131f6 1667 * Function Name: usb0_function_set_curpipe
Kojto 71:53949e6131f6 1668 * Description : Allocates FIF0 specified by the argument in the pipe assigned
Kojto 71:53949e6131f6 1669 * : by the argument.
Kojto 71:53949e6131f6 1670 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1671 * : uint16_t fifosel ; Select FIFO
Kojto 71:53949e6131f6 1672 * : uint16_t isel ; FIFO Access Direction
Kojto 71:53949e6131f6 1673 * : uint16_t mbw ; FIFO Port Access Bit Width
Kojto 71:53949e6131f6 1674 * Return Value : none
Kojto 71:53949e6131f6 1675 *******************************************************************************/
Kojto 71:53949e6131f6 1676 void usb0_function_set_curpipe (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw)
Kojto 71:53949e6131f6 1677 {
Kojto 71:53949e6131f6 1678 uint16_t buffer;
Kojto 71:53949e6131f6 1679 uint32_t loop;
Kojto 71:53949e6131f6 1680 volatile uint32_t loop2;
Kojto 71:53949e6131f6 1681
Kojto 71:53949e6131f6 1682 g_usb0_function_mbw[pipe] = mbw;
Kojto 71:53949e6131f6 1683
Kojto 71:53949e6131f6 1684 switch (fifosel)
Kojto 71:53949e6131f6 1685 {
Kojto 71:53949e6131f6 1686 case USB_FUNCTION_CUSE:
Kojto 71:53949e6131f6 1687 buffer = USB200.CFIFOSEL;
Kojto 71:53949e6131f6 1688 buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
Kojto 71:53949e6131f6 1689 buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
Kojto 71:53949e6131f6 1690 USB200.CFIFOSEL = buffer;
Kojto 71:53949e6131f6 1691
Kojto 71:53949e6131f6 1692 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1693 {
Kojto 71:53949e6131f6 1694 if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
Kojto 71:53949e6131f6 1695 (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
Kojto 71:53949e6131f6 1696 {
Kojto 71:53949e6131f6 1697 break;
Kojto 71:53949e6131f6 1698 }
Kojto 71:53949e6131f6 1699
Kojto 71:53949e6131f6 1700 loop2 = 100;
Kojto 71:53949e6131f6 1701
Kojto 71:53949e6131f6 1702 while (loop2-- > 0)
Kojto 71:53949e6131f6 1703 {
Kojto 71:53949e6131f6 1704 /* wait */
Kojto 71:53949e6131f6 1705 }
Kojto 71:53949e6131f6 1706 }
Kojto 71:53949e6131f6 1707 buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1708 buffer |= (uint16_t)(isel | pipe | mbw);
Kojto 71:53949e6131f6 1709 USB200.CFIFOSEL = buffer;
Kojto 71:53949e6131f6 1710
Kojto 71:53949e6131f6 1711 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1712 {
Kojto 71:53949e6131f6 1713 if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
Kojto 71:53949e6131f6 1714 (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
Kojto 71:53949e6131f6 1715 {
Kojto 71:53949e6131f6 1716 break;
Kojto 71:53949e6131f6 1717 }
Kojto 71:53949e6131f6 1718
Kojto 71:53949e6131f6 1719 loop2 = 100;
Kojto 71:53949e6131f6 1720
Kojto 71:53949e6131f6 1721 while (loop2-- > 0)
Kojto 71:53949e6131f6 1722 {
Kojto 71:53949e6131f6 1723 /* wait */
Kojto 71:53949e6131f6 1724 }
Kojto 71:53949e6131f6 1725 }
Kojto 71:53949e6131f6 1726 break;
Kojto 71:53949e6131f6 1727
Kojto 71:53949e6131f6 1728 case USB_FUNCTION_D0DMA:
Kojto 71:53949e6131f6 1729 case USB_FUNCTION_D0USE:
Kojto 71:53949e6131f6 1730 buffer = USB200.D0FIFOSEL;
Kojto 71:53949e6131f6 1731 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
Kojto 71:53949e6131f6 1732 USB200.D0FIFOSEL = buffer;
Kojto 71:53949e6131f6 1733
Kojto 71:53949e6131f6 1734 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1735 {
Kojto 71:53949e6131f6 1736 if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
Kojto 71:53949e6131f6 1737 (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1738 {
Kojto 71:53949e6131f6 1739 break;
Kojto 71:53949e6131f6 1740 }
Kojto 71:53949e6131f6 1741
Kojto 71:53949e6131f6 1742 loop2 = 100;
Kojto 71:53949e6131f6 1743
Kojto 71:53949e6131f6 1744 while (loop2-- > 0)
Kojto 71:53949e6131f6 1745 {
Kojto 71:53949e6131f6 1746 /* wait */
Kojto 71:53949e6131f6 1747 }
Kojto 71:53949e6131f6 1748 }
Kojto 71:53949e6131f6 1749 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1750 buffer |= (uint16_t)(pipe | mbw);
Kojto 71:53949e6131f6 1751 USB200.D0FIFOSEL = buffer;
Kojto 71:53949e6131f6 1752
Kojto 71:53949e6131f6 1753 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1754 {
Kojto 71:53949e6131f6 1755 if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
Kojto 71:53949e6131f6 1756 (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1757 {
Kojto 71:53949e6131f6 1758 break;
Kojto 71:53949e6131f6 1759 }
Kojto 71:53949e6131f6 1760
Kojto 71:53949e6131f6 1761 loop2 = 100;
Kojto 71:53949e6131f6 1762 while (loop2-- > 0)
Kojto 71:53949e6131f6 1763 {
Kojto 71:53949e6131f6 1764 /* wait */
Kojto 71:53949e6131f6 1765 }
Kojto 71:53949e6131f6 1766 }
Kojto 71:53949e6131f6 1767 break;
Kojto 71:53949e6131f6 1768
Kojto 71:53949e6131f6 1769 case USB_FUNCTION_D1DMA:
Kojto 71:53949e6131f6 1770 case USB_FUNCTION_D1USE:
Kojto 71:53949e6131f6 1771 buffer = USB200.D1FIFOSEL;
Kojto 71:53949e6131f6 1772 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
Kojto 71:53949e6131f6 1773 USB200.D1FIFOSEL = buffer;
Kojto 71:53949e6131f6 1774
Kojto 71:53949e6131f6 1775 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1776 {
Kojto 71:53949e6131f6 1777 if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
Kojto 71:53949e6131f6 1778 (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1779 {
Kojto 71:53949e6131f6 1780 break;
Kojto 71:53949e6131f6 1781 }
Kojto 71:53949e6131f6 1782
Kojto 71:53949e6131f6 1783 loop2 = 100;
Kojto 71:53949e6131f6 1784
Kojto 71:53949e6131f6 1785 while (loop2-- > 0)
Kojto 71:53949e6131f6 1786 {
Kojto 71:53949e6131f6 1787 /* wait */
Kojto 71:53949e6131f6 1788 }
Kojto 71:53949e6131f6 1789 }
Kojto 71:53949e6131f6 1790 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1791 buffer |= (uint16_t)(pipe | mbw);
Kojto 71:53949e6131f6 1792 USB200.D1FIFOSEL = buffer;
Kojto 71:53949e6131f6 1793
Kojto 71:53949e6131f6 1794 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1795 {
Kojto 71:53949e6131f6 1796 if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) ==
Kojto 71:53949e6131f6 1797 (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1798 {
Kojto 71:53949e6131f6 1799 break;
Kojto 71:53949e6131f6 1800 }
Kojto 71:53949e6131f6 1801
Kojto 71:53949e6131f6 1802 loop2 = 100;
Kojto 71:53949e6131f6 1803
Kojto 71:53949e6131f6 1804 while (loop2-- > 0)
Kojto 71:53949e6131f6 1805 {
Kojto 71:53949e6131f6 1806 /* wait */
Kojto 71:53949e6131f6 1807 }
Kojto 71:53949e6131f6 1808 }
Kojto 71:53949e6131f6 1809 break;
Kojto 71:53949e6131f6 1810
Kojto 71:53949e6131f6 1811 default:
Kojto 71:53949e6131f6 1812 break;
Kojto 71:53949e6131f6 1813 }
Kojto 71:53949e6131f6 1814
Kojto 71:53949e6131f6 1815 /* Cautions !!!
Kojto 71:53949e6131f6 1816 * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
Kojto 71:53949e6131f6 1817 * For details, please look at the data sheet. */
Kojto 71:53949e6131f6 1818 loop2 = 100;
Kojto 71:53949e6131f6 1819
Kojto 71:53949e6131f6 1820 while (loop2-- > 0)
Kojto 71:53949e6131f6 1821 {
Kojto 71:53949e6131f6 1822 /* wait */
Kojto 71:53949e6131f6 1823 }
Kojto 71:53949e6131f6 1824 }
Kojto 71:53949e6131f6 1825
Kojto 71:53949e6131f6 1826 /*******************************************************************************
Kojto 71:53949e6131f6 1827 * Function Name: usb0_function_set_curpipe2
Kojto 71:53949e6131f6 1828 * Description : Allocates FIF0 specified by the argument in the pipe assigned
Kojto 71:53949e6131f6 1829 * : by the argument.
Kojto 71:53949e6131f6 1830 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 1831 * : uint16_t fifosel ; Select FIFO
Kojto 71:53949e6131f6 1832 * : uint16_t isel ; FIFO Access Direction
Kojto 71:53949e6131f6 1833 * : uint16_t mbw ; FIFO Port Access Bit Width
Kojto 71:53949e6131f6 1834 * : uint16_t dfacc ; DFACC Access mode
Kojto 71:53949e6131f6 1835 * Return Value : none
Kojto 71:53949e6131f6 1836 *******************************************************************************/
Kojto 71:53949e6131f6 1837 void usb0_function_set_curpipe2 (uint16_t pipe, uint16_t fifosel, uint16_t isel, uint16_t mbw, uint16_t dfacc)
Kojto 71:53949e6131f6 1838 {
Kojto 71:53949e6131f6 1839 uint16_t buffer;
Kojto 71:53949e6131f6 1840 uint32_t loop;
Kojto 71:53949e6131f6 1841 #ifdef __USB_FUNCTION_DF_ACC_ENABLE__
Kojto 71:53949e6131f6 1842 uint32_t dummy;
Kojto 71:53949e6131f6 1843 #endif
Kojto 71:53949e6131f6 1844 volatile uint32_t loop2;
Kojto 71:53949e6131f6 1845
Kojto 71:53949e6131f6 1846 g_usb0_function_mbw[pipe] = mbw;
Kojto 71:53949e6131f6 1847
Kojto 71:53949e6131f6 1848 switch (fifosel)
Kojto 71:53949e6131f6 1849 {
Kojto 71:53949e6131f6 1850 case USB_FUNCTION_CUSE:
Kojto 71:53949e6131f6 1851 buffer = USB200.CFIFOSEL;
Kojto 71:53949e6131f6 1852 buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE);
Kojto 71:53949e6131f6 1853 buffer |= (uint16_t)(~isel & USB_FUNCTION_BITISEL);
Kojto 71:53949e6131f6 1854 USB200.CFIFOSEL = buffer;
Kojto 71:53949e6131f6 1855
Kojto 71:53949e6131f6 1856 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1857 {
Kojto 71:53949e6131f6 1858 if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
Kojto 71:53949e6131f6 1859 (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
Kojto 71:53949e6131f6 1860 {
Kojto 71:53949e6131f6 1861 break;
Kojto 71:53949e6131f6 1862 }
Kojto 71:53949e6131f6 1863
Kojto 71:53949e6131f6 1864 loop2 = 100;
Kojto 71:53949e6131f6 1865 while (loop2-- > 0)
Kojto 71:53949e6131f6 1866 {
Kojto 71:53949e6131f6 1867 /* wait */
Kojto 71:53949e6131f6 1868 }
Kojto 71:53949e6131f6 1869 }
Kojto 71:53949e6131f6 1870 buffer &= (uint16_t)~(USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1871 buffer |= (uint16_t)(isel | pipe | mbw);
Kojto 71:53949e6131f6 1872 USB200.CFIFOSEL = buffer;
Kojto 71:53949e6131f6 1873
Kojto 71:53949e6131f6 1874 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1875 {
Kojto 71:53949e6131f6 1876 if ((USB200.CFIFOSEL & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)) ==
Kojto 71:53949e6131f6 1877 (buffer & (USB_FUNCTION_BITISEL | USB_FUNCTION_BITCURPIPE)))
Kojto 71:53949e6131f6 1878 {
Kojto 71:53949e6131f6 1879 break;
Kojto 71:53949e6131f6 1880 }
Kojto 71:53949e6131f6 1881
Kojto 71:53949e6131f6 1882 loop2 = 100;
Kojto 71:53949e6131f6 1883
Kojto 71:53949e6131f6 1884 while (loop2-- > 0)
Kojto 71:53949e6131f6 1885 {
Kojto 71:53949e6131f6 1886 /* wait */
Kojto 71:53949e6131f6 1887 }
Kojto 71:53949e6131f6 1888 }
Kojto 71:53949e6131f6 1889 break;
Kojto 71:53949e6131f6 1890
Kojto 71:53949e6131f6 1891 case USB_FUNCTION_D0DMA:
Kojto 71:53949e6131f6 1892 case USB_FUNCTION_D0USE:
Kojto 71:53949e6131f6 1893 buffer = USB200.D0FIFOSEL;
Kojto 71:53949e6131f6 1894 #ifdef __USB_FUNCTION_DF_ACC_ENABLE__
Kojto 71:53949e6131f6 1895 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1896
Kojto 71:53949e6131f6 1897 if (dfacc != 0)
Kojto 71:53949e6131f6 1898 {
Kojto 71:53949e6131f6 1899 buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
Kojto 71:53949e6131f6 1900 }
Kojto 71:53949e6131f6 1901 #else
Kojto 71:53949e6131f6 1902 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
Kojto 71:53949e6131f6 1903 #endif
Kojto 71:53949e6131f6 1904 USB200.D0FIFOSEL = buffer;
Kojto 71:53949e6131f6 1905
Kojto 71:53949e6131f6 1906 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1907 {
Kojto 71:53949e6131f6 1908 if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1909 {
Kojto 71:53949e6131f6 1910 break;
Kojto 71:53949e6131f6 1911 }
Kojto 71:53949e6131f6 1912
Kojto 71:53949e6131f6 1913 loop2 = 100;
Kojto 71:53949e6131f6 1914
Kojto 71:53949e6131f6 1915 while (loop2-- > 0)
Kojto 71:53949e6131f6 1916 {
Kojto 71:53949e6131f6 1917 /* wait */
Kojto 71:53949e6131f6 1918 }
Kojto 71:53949e6131f6 1919 }
Kojto 71:53949e6131f6 1920
Kojto 71:53949e6131f6 1921 #ifdef __USB_FUNCTION_DF_ACC_ENABLE__
Kojto 71:53949e6131f6 1922 if (dfacc != 0)
Kojto 71:53949e6131f6 1923 {
Kojto 71:53949e6131f6 1924 dummy = USB200.D0FIFO.UINT32;
Kojto 71:53949e6131f6 1925 }
Kojto 71:53949e6131f6 1926 #endif
Kojto 71:53949e6131f6 1927 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1928 buffer |= (uint16_t)(pipe | mbw);
Kojto 71:53949e6131f6 1929 USB200.D0FIFOSEL = buffer;
Kojto 71:53949e6131f6 1930
Kojto 71:53949e6131f6 1931 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1932 {
Kojto 71:53949e6131f6 1933 if ((USB200.D0FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1934 {
Kojto 71:53949e6131f6 1935 break;
Kojto 71:53949e6131f6 1936 }
Kojto 71:53949e6131f6 1937
Kojto 71:53949e6131f6 1938 loop2 = 100;
Kojto 71:53949e6131f6 1939
Kojto 71:53949e6131f6 1940 while (loop2-- > 0)
Kojto 71:53949e6131f6 1941 {
Kojto 71:53949e6131f6 1942 /* wait */
Kojto 71:53949e6131f6 1943 }
Kojto 71:53949e6131f6 1944 }
Kojto 71:53949e6131f6 1945 break;
Kojto 71:53949e6131f6 1946
Kojto 71:53949e6131f6 1947 case USB_FUNCTION_D1DMA:
Kojto 71:53949e6131f6 1948 case USB_FUNCTION_D1USE:
Kojto 71:53949e6131f6 1949 buffer = USB200.D1FIFOSEL;
Kojto 71:53949e6131f6 1950 #ifdef __USB_FUNCTION_DF_ACC_ENABLE__
Kojto 71:53949e6131f6 1951 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1952
Kojto 71:53949e6131f6 1953 if (dfacc != 0)
Kojto 71:53949e6131f6 1954 {
Kojto 71:53949e6131f6 1955 buffer |= (uint16_t)(USB_FUNCTION_BITMBW_32);
Kojto 71:53949e6131f6 1956 }
Kojto 71:53949e6131f6 1957 #else
Kojto 71:53949e6131f6 1958 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE);
Kojto 71:53949e6131f6 1959 #endif
Kojto 71:53949e6131f6 1960 USB200.D1FIFOSEL = buffer;
Kojto 71:53949e6131f6 1961
Kojto 71:53949e6131f6 1962 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1963 {
Kojto 71:53949e6131f6 1964 if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1965 {
Kojto 71:53949e6131f6 1966 break;
Kojto 71:53949e6131f6 1967 }
Kojto 71:53949e6131f6 1968
Kojto 71:53949e6131f6 1969 loop2 = 100;
Kojto 71:53949e6131f6 1970
Kojto 71:53949e6131f6 1971 while (loop2-- > 0)
Kojto 71:53949e6131f6 1972 {
Kojto 71:53949e6131f6 1973 /* wait */
Kojto 71:53949e6131f6 1974 }
Kojto 71:53949e6131f6 1975 }
Kojto 71:53949e6131f6 1976 #ifdef __USB_FUNCTION_DF_ACC_ENABLE__
Kojto 71:53949e6131f6 1977 if (dfacc != 0)
Kojto 71:53949e6131f6 1978 {
Kojto 71:53949e6131f6 1979 dummy = USB200.D1FIFO.UINT32;
Kojto 71:53949e6131f6 1980 loop = dummy; // avoid warning.
Kojto 71:53949e6131f6 1981 }
Kojto 71:53949e6131f6 1982 #endif
Kojto 71:53949e6131f6 1983 buffer &= (uint16_t)~(USB_FUNCTION_BITCURPIPE | USB_FUNCTION_BITMBW);
Kojto 71:53949e6131f6 1984 buffer |= (uint16_t)(pipe | mbw);
Kojto 71:53949e6131f6 1985 USB200.D1FIFOSEL = buffer;
Kojto 71:53949e6131f6 1986
Kojto 71:53949e6131f6 1987 for (loop = 0; loop < 4; loop++)
Kojto 71:53949e6131f6 1988 {
Kojto 71:53949e6131f6 1989 if ((USB200.D1FIFOSEL & USB_FUNCTION_BITCURPIPE) == (buffer & USB_FUNCTION_BITCURPIPE))
Kojto 71:53949e6131f6 1990 {
Kojto 71:53949e6131f6 1991 break;
Kojto 71:53949e6131f6 1992 }
Kojto 71:53949e6131f6 1993
Kojto 71:53949e6131f6 1994 loop2 = 100;
Kojto 71:53949e6131f6 1995
Kojto 71:53949e6131f6 1996 while (loop2-- > 0)
Kojto 71:53949e6131f6 1997 {
Kojto 71:53949e6131f6 1998 /* wait */
Kojto 71:53949e6131f6 1999 }
Kojto 71:53949e6131f6 2000 }
Kojto 71:53949e6131f6 2001 break;
Kojto 71:53949e6131f6 2002
Kojto 71:53949e6131f6 2003 default:
Kojto 71:53949e6131f6 2004 break;
Kojto 71:53949e6131f6 2005 }
Kojto 71:53949e6131f6 2006
Kojto 71:53949e6131f6 2007 /* Cautions !!!
Kojto 71:53949e6131f6 2008 * Depending on the external bus speed of CPU, you may need to wait for 450ns here.
Kojto 71:53949e6131f6 2009 * For details, please look at the data sheet. */
Kojto 71:53949e6131f6 2010 loop2 = 100;
Kojto 71:53949e6131f6 2011
Kojto 71:53949e6131f6 2012 while (loop2-- > 0)
Kojto 71:53949e6131f6 2013 {
Kojto 71:53949e6131f6 2014 /* wait */
Kojto 71:53949e6131f6 2015 }
Kojto 71:53949e6131f6 2016 }
Kojto 71:53949e6131f6 2017
Kojto 71:53949e6131f6 2018 /*******************************************************************************
Kojto 71:53949e6131f6 2019 * Function Name: usb0_function_write_c_fifo
Kojto 71:53949e6131f6 2020 * Description : Writes data in CFIFO.
Kojto 71:53949e6131f6 2021 * : Writes data by BYTE/WORD/LONG according to access size
Kojto 71:53949e6131f6 2022 * : to the pipe specified by the arguments.
Kojto 71:53949e6131f6 2023 * : Before executing this function, allocating CFIF0 in the specified pipe
Kojto 71:53949e6131f6 2024 * : should be completed.
Kojto 71:53949e6131f6 2025 * : Before executing this function, access size to the specified pipe
Kojto 71:53949e6131f6 2026 * : should be fixed and set in g_usb0_function_mbw[].
Kojto 71:53949e6131f6 2027 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 2028 * : uint16_t count ; Data Size(Byte)
Kojto 71:53949e6131f6 2029 * Return Value : none
Kojto 71:53949e6131f6 2030 *******************************************************************************/
Kojto 71:53949e6131f6 2031 static void usb0_function_write_c_fifo (uint16_t pipe, uint16_t count)
Kojto 71:53949e6131f6 2032 {
Kojto 71:53949e6131f6 2033 uint16_t even;
Kojto 71:53949e6131f6 2034
Kojto 71:53949e6131f6 2035 if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
Kojto 71:53949e6131f6 2036 {
Kojto 71:53949e6131f6 2037 for (even = count; even; --even)
Kojto 71:53949e6131f6 2038 {
Kojto 71:53949e6131f6 2039 USB200.CFIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
Kojto 71:53949e6131f6 2040 g_usb0_function_data_pointer[pipe] += 1;
Kojto 71:53949e6131f6 2041 }
Kojto 71:53949e6131f6 2042 }
Kojto 71:53949e6131f6 2043 else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2044 {
Kojto 71:53949e6131f6 2045 for (even = (uint16_t)(count / 2); even; --even)
Kojto 71:53949e6131f6 2046 {
Kojto 71:53949e6131f6 2047 USB200.CFIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 2048 g_usb0_function_data_pointer[pipe] += 2;
Kojto 71:53949e6131f6 2049 }
Kojto 71:53949e6131f6 2050 }
Kojto 71:53949e6131f6 2051 else
Kojto 71:53949e6131f6 2052 {
Kojto 71:53949e6131f6 2053 for (even = (uint16_t)(count / 4); even; --even)
Kojto 71:53949e6131f6 2054 {
Kojto 71:53949e6131f6 2055 USB200.CFIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 2056 g_usb0_function_data_pointer[pipe] += 4;
Kojto 71:53949e6131f6 2057 }
Kojto 71:53949e6131f6 2058 }
Kojto 71:53949e6131f6 2059 }
Kojto 71:53949e6131f6 2060
Kojto 71:53949e6131f6 2061 /*******************************************************************************
Kojto 71:53949e6131f6 2062 * Function Name: usb0_function_read_c_fifo
Kojto 71:53949e6131f6 2063 * Description : Reads data from CFIFO.
Kojto 71:53949e6131f6 2064 * : Reads data by BYTE/WORD/LONG according to access size
Kojto 71:53949e6131f6 2065 * : to the pipe specified by the arguments.
Kojto 71:53949e6131f6 2066 * : Before executing this function, allocating CFIF0 in the specified pipe
Kojto 71:53949e6131f6 2067 * : should be completed.
Kojto 71:53949e6131f6 2068 * : Before executing this function, access size to the specified pipe
Kojto 71:53949e6131f6 2069 * : should be fixed and set in g_usb0_function_mbw[].
Kojto 71:53949e6131f6 2070 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 2071 * : uint16_t count ; Data Size(Byte)
Kojto 71:53949e6131f6 2072 * Return Value : none
Kojto 71:53949e6131f6 2073 *******************************************************************************/
Kojto 71:53949e6131f6 2074 static void usb0_function_read_c_fifo (uint16_t pipe, uint16_t count)
Kojto 71:53949e6131f6 2075 {
Kojto 71:53949e6131f6 2076 uint16_t even;
Kojto 71:53949e6131f6 2077
Kojto 71:53949e6131f6 2078 if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
Kojto 71:53949e6131f6 2079 {
Kojto 71:53949e6131f6 2080 for (even = count; even; --even)
Kojto 71:53949e6131f6 2081 {
Kojto 71:53949e6131f6 2082 *g_usb0_function_data_pointer[pipe] = USB200.CFIFO.UINT8[HH];
Kojto 71:53949e6131f6 2083 g_usb0_function_data_pointer[pipe] += 1;
Kojto 71:53949e6131f6 2084 }
Kojto 71:53949e6131f6 2085 }
Kojto 71:53949e6131f6 2086 else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2087 {
Kojto 71:53949e6131f6 2088 for (even = (uint16_t)((count + 1) / 2); even; --even)
Kojto 71:53949e6131f6 2089 {
Kojto 71:53949e6131f6 2090 *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT16[H];
Kojto 71:53949e6131f6 2091 g_usb0_function_data_pointer[pipe] += 2;
Kojto 71:53949e6131f6 2092 }
Kojto 71:53949e6131f6 2093 }
Kojto 71:53949e6131f6 2094 else
Kojto 71:53949e6131f6 2095 {
Kojto 71:53949e6131f6 2096 for (even = (uint16_t)((count + 3) / 4); even; --even)
Kojto 71:53949e6131f6 2097 {
Kojto 71:53949e6131f6 2098 *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.CFIFO.UINT32;
Kojto 71:53949e6131f6 2099 g_usb0_function_data_pointer[pipe] += 4;
Kojto 71:53949e6131f6 2100 }
Kojto 71:53949e6131f6 2101 }
Kojto 71:53949e6131f6 2102 }
Kojto 71:53949e6131f6 2103
Kojto 71:53949e6131f6 2104 /*******************************************************************************
Kojto 71:53949e6131f6 2105 * Function Name: usb0_function_write_d0_fifo
Kojto 71:53949e6131f6 2106 * Description : Writes data in D0FIFO.
Kojto 71:53949e6131f6 2107 * : Writes data by BYTE/WORD/LONG according to access size
Kojto 71:53949e6131f6 2108 * : to the pipe specified by the arguments.
Kojto 71:53949e6131f6 2109 * : Before executing this function, allocating CFIF0 in the specified pipe
Kojto 71:53949e6131f6 2110 * : should be completed.
Kojto 71:53949e6131f6 2111 * : Before executing this function, access size to the specified pipe
Kojto 71:53949e6131f6 2112 * : should be fixed and set in g_usb0_function_mbw[].
Kojto 71:53949e6131f6 2113 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 2114 * : uint16_t count ; Data Size(Byte)
Kojto 71:53949e6131f6 2115 * Return Value : none
Kojto 71:53949e6131f6 2116 *******************************************************************************/
Kojto 71:53949e6131f6 2117 static void usb0_function_write_d0_fifo (uint16_t pipe, uint16_t count)
Kojto 71:53949e6131f6 2118 {
Kojto 71:53949e6131f6 2119 uint16_t even;
Kojto 71:53949e6131f6 2120
Kojto 71:53949e6131f6 2121 if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
Kojto 71:53949e6131f6 2122 {
Kojto 71:53949e6131f6 2123 for (even = count; even; --even)
Kojto 71:53949e6131f6 2124 {
Kojto 71:53949e6131f6 2125 USB200.D0FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
Kojto 71:53949e6131f6 2126 g_usb0_function_data_pointer[pipe] += 1;
Kojto 71:53949e6131f6 2127 }
Kojto 71:53949e6131f6 2128 }
Kojto 71:53949e6131f6 2129 else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2130 {
Kojto 71:53949e6131f6 2131 for (even = (uint16_t)(count / 2); even; --even)
Kojto 71:53949e6131f6 2132 {
Kojto 71:53949e6131f6 2133 USB200.D0FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 2134 g_usb0_function_data_pointer[pipe] += 2;
Kojto 71:53949e6131f6 2135 }
Kojto 71:53949e6131f6 2136 }
Kojto 71:53949e6131f6 2137 else
Kojto 71:53949e6131f6 2138 {
Kojto 71:53949e6131f6 2139 for (even = (uint16_t)(count / 4); even; --even)
Kojto 71:53949e6131f6 2140 {
Kojto 71:53949e6131f6 2141 USB200.D0FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 2142 g_usb0_function_data_pointer[pipe] += 4;
Kojto 71:53949e6131f6 2143 }
Kojto 71:53949e6131f6 2144 }
Kojto 71:53949e6131f6 2145 }
Kojto 71:53949e6131f6 2146
Kojto 71:53949e6131f6 2147 /*******************************************************************************
Kojto 71:53949e6131f6 2148 * Function Name: usb0_function_read_d0_fifo
Kojto 71:53949e6131f6 2149 * Description : Reads data from D0FIFO.
Kojto 71:53949e6131f6 2150 * : Reads data by BYTE/WORD/LONG according to access size
Kojto 71:53949e6131f6 2151 * : to the pipe specified by the arguments.
Kojto 71:53949e6131f6 2152 * : Before executing this function, allocating DOFIF0 in the specified pipe
Kojto 71:53949e6131f6 2153 * : should be completed.
Kojto 71:53949e6131f6 2154 * : Before executing this function, access size to the specified pipe
Kojto 71:53949e6131f6 2155 * : should be fixed and set in g_usb0_function_mbw[].
Kojto 71:53949e6131f6 2156 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 2157 * : uint16_t count ; Data Size(Byte)
Kojto 71:53949e6131f6 2158 * Return Value : none
Kojto 71:53949e6131f6 2159 *******************************************************************************/
Kojto 71:53949e6131f6 2160 static void usb0_function_read_d0_fifo (uint16_t pipe, uint16_t count)
Kojto 71:53949e6131f6 2161 {
Kojto 71:53949e6131f6 2162 uint16_t even;
Kojto 71:53949e6131f6 2163
Kojto 71:53949e6131f6 2164 if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
Kojto 71:53949e6131f6 2165 {
Kojto 71:53949e6131f6 2166 for (even = count; even; --even)
Kojto 71:53949e6131f6 2167 {
Kojto 71:53949e6131f6 2168 *g_usb0_function_data_pointer[pipe] = USB200.D0FIFO.UINT8[HH];
Kojto 71:53949e6131f6 2169 g_usb0_function_data_pointer[pipe] += 1;
Kojto 71:53949e6131f6 2170 }
Kojto 71:53949e6131f6 2171 }
Kojto 71:53949e6131f6 2172 else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2173 {
Kojto 71:53949e6131f6 2174 for (even = (uint16_t)((count + 1) / 2); even; --even)
Kojto 71:53949e6131f6 2175 {
Kojto 71:53949e6131f6 2176 *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT16[H];
Kojto 71:53949e6131f6 2177 g_usb0_function_data_pointer[pipe] += 2;
Kojto 71:53949e6131f6 2178 }
Kojto 71:53949e6131f6 2179 }
Kojto 71:53949e6131f6 2180 else
Kojto 71:53949e6131f6 2181 {
Kojto 71:53949e6131f6 2182 for (even = (uint16_t)((count + 3) / 4); even; --even)
Kojto 71:53949e6131f6 2183 {
Kojto 71:53949e6131f6 2184 *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D0FIFO.UINT32;
Kojto 71:53949e6131f6 2185 g_usb0_function_data_pointer[pipe] += 4;
Kojto 71:53949e6131f6 2186 }
Kojto 71:53949e6131f6 2187 }
Kojto 71:53949e6131f6 2188 }
Kojto 71:53949e6131f6 2189
Kojto 71:53949e6131f6 2190 /*******************************************************************************
Kojto 71:53949e6131f6 2191 * Function Name: usb0_function_write_d1_fifo
Kojto 71:53949e6131f6 2192 * Description : Writes data in D1FIFO.
Kojto 71:53949e6131f6 2193 * : Writes data by BYTE/WORD/LONG according to access size
Kojto 71:53949e6131f6 2194 * : to the pipe specified by the arguments.
Kojto 71:53949e6131f6 2195 * : Before executing this function, allocating D1FIF0 in the specified pipe
Kojto 71:53949e6131f6 2196 * : should be completed.
Kojto 71:53949e6131f6 2197 * : Before executing this function, access size to the specified pipe
Kojto 71:53949e6131f6 2198 * : should be fixed and set in g_usb0_function_mbw[].
Kojto 71:53949e6131f6 2199 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 2200 * : uint16_t count ; Data Size(Byte)
Kojto 71:53949e6131f6 2201 * Return Value : none
Kojto 71:53949e6131f6 2202 *******************************************************************************/
Kojto 71:53949e6131f6 2203 static void usb0_function_write_d1_fifo (uint16_t pipe, uint16_t count)
Kojto 71:53949e6131f6 2204 {
Kojto 71:53949e6131f6 2205 uint16_t even;
Kojto 71:53949e6131f6 2206
Kojto 71:53949e6131f6 2207 if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
Kojto 71:53949e6131f6 2208 {
Kojto 71:53949e6131f6 2209 for (even = count; even; --even)
Kojto 71:53949e6131f6 2210 {
Kojto 71:53949e6131f6 2211 USB200.D1FIFO.UINT8[HH] = *g_usb0_function_data_pointer[pipe];
Kojto 71:53949e6131f6 2212 g_usb0_function_data_pointer[pipe] += 1;
Kojto 71:53949e6131f6 2213 }
Kojto 71:53949e6131f6 2214 }
Kojto 71:53949e6131f6 2215 else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2216 {
Kojto 71:53949e6131f6 2217 for (even = (uint16_t)(count / 2); even; --even)
Kojto 71:53949e6131f6 2218 {
Kojto 71:53949e6131f6 2219 USB200.D1FIFO.UINT16[H] = *((uint16_t *)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 2220 g_usb0_function_data_pointer[pipe] += 2;
Kojto 71:53949e6131f6 2221 }
Kojto 71:53949e6131f6 2222 }
Kojto 71:53949e6131f6 2223 else
Kojto 71:53949e6131f6 2224 {
Kojto 71:53949e6131f6 2225 for (even = (uint16_t)(count / 4); even; --even)
Kojto 71:53949e6131f6 2226 {
Kojto 71:53949e6131f6 2227 USB200.D1FIFO.UINT32 = *((uint32_t *)g_usb0_function_data_pointer[pipe]);
Kojto 71:53949e6131f6 2228 g_usb0_function_data_pointer[pipe] += 4;
Kojto 71:53949e6131f6 2229 }
Kojto 71:53949e6131f6 2230 }
Kojto 71:53949e6131f6 2231 }
Kojto 71:53949e6131f6 2232
Kojto 71:53949e6131f6 2233 /*******************************************************************************
Kojto 71:53949e6131f6 2234 * Function Name: usb0_function_read_d1_fifo
Kojto 71:53949e6131f6 2235 * Description : Reads data from D1FIFO.
Kojto 71:53949e6131f6 2236 * : Reads data by BYTE/WORD/LONG according to access size
Kojto 71:53949e6131f6 2237 * : to the pipe specified by the arguments.
Kojto 71:53949e6131f6 2238 * : Before executing this function, allocating D1FIF0 in the specified pipe
Kojto 71:53949e6131f6 2239 * : should be completed.
Kojto 71:53949e6131f6 2240 * : Before executing this function, access size to the specified pipe
Kojto 71:53949e6131f6 2241 * : should be fixed and set in g_usb0_function_mbw[].
Kojto 71:53949e6131f6 2242 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 2243 * : uint16_t count ; Data Size(Byte)
Kojto 71:53949e6131f6 2244 * Return Value : none
Kojto 71:53949e6131f6 2245 *******************************************************************************/
Kojto 71:53949e6131f6 2246 static void usb0_function_read_d1_fifo (uint16_t pipe, uint16_t count)
Kojto 71:53949e6131f6 2247 {
Kojto 71:53949e6131f6 2248 uint16_t even;
Kojto 71:53949e6131f6 2249
Kojto 71:53949e6131f6 2250 if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_8)
Kojto 71:53949e6131f6 2251 {
Kojto 71:53949e6131f6 2252 for (even = count; even; --even)
Kojto 71:53949e6131f6 2253 {
Kojto 71:53949e6131f6 2254 *g_usb0_function_data_pointer[pipe] = USB200.D1FIFO.UINT8[HH];
Kojto 71:53949e6131f6 2255 g_usb0_function_data_pointer[pipe] += 1;
Kojto 71:53949e6131f6 2256 }
Kojto 71:53949e6131f6 2257 }
Kojto 71:53949e6131f6 2258 else if (g_usb0_function_mbw[pipe] == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2259 {
Kojto 71:53949e6131f6 2260 for (even = (uint16_t)((count + 1) / 2); even; --even)
Kojto 71:53949e6131f6 2261 {
Kojto 71:53949e6131f6 2262 *((uint16_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT16[H];
Kojto 71:53949e6131f6 2263 g_usb0_function_data_pointer[pipe] += 2;
Kojto 71:53949e6131f6 2264 }
Kojto 71:53949e6131f6 2265 }
Kojto 71:53949e6131f6 2266 else
Kojto 71:53949e6131f6 2267 {
Kojto 71:53949e6131f6 2268 for (even = (uint16_t)((count + 3) / 4); even; --even)
Kojto 71:53949e6131f6 2269 {
Kojto 71:53949e6131f6 2270 *((uint32_t *)g_usb0_function_data_pointer[pipe]) = USB200.D1FIFO.UINT32;
Kojto 71:53949e6131f6 2271 g_usb0_function_data_pointer[pipe] += 4;
Kojto 71:53949e6131f6 2272 }
Kojto 71:53949e6131f6 2273 }
Kojto 71:53949e6131f6 2274 }
Kojto 71:53949e6131f6 2275
Kojto 71:53949e6131f6 2276 /*******************************************************************************
Kojto 71:53949e6131f6 2277 * Function Name: usb0_function_com_get_dmasize
Kojto 71:53949e6131f6 2278 * Description : Calculates access width of DMA transfer by the argument to
Kojto 71:53949e6131f6 2279 * : return as the Return Value.
Kojto 71:53949e6131f6 2280 * Arguments : uint32_t trncount : transfer byte
Kojto 71:53949e6131f6 2281 * : uint32_t dtptr : transfer data pointer
Kojto 71:53949e6131f6 2282 * Return Value : DMA transfer size : 0 8bit
Kojto 71:53949e6131f6 2283 * : : 1 16bit
Kojto 71:53949e6131f6 2284 * : : 2 32bit
Kojto 71:53949e6131f6 2285 *******************************************************************************/
Kojto 71:53949e6131f6 2286 static uint32_t usb0_function_com_get_dmasize (uint32_t trncount, uint32_t dtptr)
Kojto 71:53949e6131f6 2287 {
Kojto 71:53949e6131f6 2288 uint32_t size;
Kojto 71:53949e6131f6 2289
Kojto 71:53949e6131f6 2290 if (((trncount & 0x0001) != 0) || ((dtptr & 0x00000001) != 0))
Kojto 71:53949e6131f6 2291 {
Kojto 71:53949e6131f6 2292 /* When transfer byte count is odd */
Kojto 71:53949e6131f6 2293 /* or transfer data area is 8-bit alignment */
Kojto 71:53949e6131f6 2294 size = 0; /* 8bit */
Kojto 71:53949e6131f6 2295 }
Kojto 71:53949e6131f6 2296 else if (((trncount & 0x0003) != 0) || ((dtptr & 0x00000003) != 0))
Kojto 71:53949e6131f6 2297 {
Kojto 71:53949e6131f6 2298 /* When the transfer byte count is multiples of 2 */
Kojto 71:53949e6131f6 2299 /* or the transfer data area is 16-bit alignment */
Kojto 71:53949e6131f6 2300 size = 1; /* 16bit */
Kojto 71:53949e6131f6 2301 }
Kojto 71:53949e6131f6 2302 else
Kojto 71:53949e6131f6 2303 {
Kojto 71:53949e6131f6 2304 /* When the transfer byte count is multiples of 4 */
Kojto 71:53949e6131f6 2305 /* or the transfer data area is 32-bit alignment */
Kojto 71:53949e6131f6 2306 size = 2; /* 32bit */
Kojto 71:53949e6131f6 2307 }
Kojto 71:53949e6131f6 2308
Kojto 71:53949e6131f6 2309 return size;
Kojto 71:53949e6131f6 2310 }
Kojto 71:53949e6131f6 2311
Kojto 71:53949e6131f6 2312 /*******************************************************************************
Kojto 71:53949e6131f6 2313 * Function Name: usb0_function_get_mbw
Kojto 71:53949e6131f6 2314 * Description : Calculates access width of DMA to return the value set in MBW.
Kojto 71:53949e6131f6 2315 * Arguments : uint32_t trncount : transfer byte
Kojto 71:53949e6131f6 2316 * : uint32_t dtptr : transfer data pointer
Kojto 71:53949e6131f6 2317 * Return Value : FIFO transfer size : USB_FUNCTION_BITMBW_8 8bit
Kojto 71:53949e6131f6 2318 * : : USB_FUNCTION_BITMBW_16 16bit
Kojto 71:53949e6131f6 2319 * : : USB_FUNCTION_BITMBW_32 32bit
Kojto 71:53949e6131f6 2320 *******************************************************************************/
Kojto 71:53949e6131f6 2321 uint16_t usb0_function_get_mbw (uint32_t trncount, uint32_t dtptr)
Kojto 71:53949e6131f6 2322 {
Kojto 71:53949e6131f6 2323 uint32_t size;
Kojto 71:53949e6131f6 2324 uint16_t mbw;
Kojto 71:53949e6131f6 2325
Kojto 71:53949e6131f6 2326 size = usb0_function_com_get_dmasize(trncount, dtptr);
Kojto 71:53949e6131f6 2327
Kojto 71:53949e6131f6 2328 if (size == 0)
Kojto 71:53949e6131f6 2329 {
Kojto 71:53949e6131f6 2330 /* 8bit */
Kojto 71:53949e6131f6 2331 mbw = USB_FUNCTION_BITMBW_8;
Kojto 71:53949e6131f6 2332 }
Kojto 71:53949e6131f6 2333 else if (size == 1)
Kojto 71:53949e6131f6 2334 {
Kojto 71:53949e6131f6 2335 /* 16bit */
Kojto 71:53949e6131f6 2336 mbw = USB_FUNCTION_BITMBW_16;
Kojto 71:53949e6131f6 2337 }
Kojto 71:53949e6131f6 2338 else
Kojto 71:53949e6131f6 2339 {
Kojto 71:53949e6131f6 2340 /* 32bit */
Kojto 71:53949e6131f6 2341 mbw = USB_FUNCTION_BITMBW_32;
Kojto 71:53949e6131f6 2342 }
Kojto 71:53949e6131f6 2343
Kojto 71:53949e6131f6 2344 return mbw;
Kojto 71:53949e6131f6 2345 }
Kojto 71:53949e6131f6 2346
Kojto 71:53949e6131f6 2347 /*******************************************************************************
Kojto 71:53949e6131f6 2348 * Function Name: usb0_function_set_transaction_counter
Kojto 71:53949e6131f6 2349 * Description : Sets transaction counter by the argument(PIPEnTRN).
Kojto 71:53949e6131f6 2350 * : Clears transaction before setting to enable transaction counter setting.
Kojto 71:53949e6131f6 2351 * Arguments : uint16_t pipe ; Pipe number
Kojto 71:53949e6131f6 2352 * : uint32_t bsize : Data transfer size
Kojto 71:53949e6131f6 2353 * Return Value : none
Kojto 71:53949e6131f6 2354 *******************************************************************************/
Kojto 71:53949e6131f6 2355 static void usb0_function_set_transaction_counter (uint16_t pipe, uint32_t bsize)
Kojto 71:53949e6131f6 2356 {
Kojto 71:53949e6131f6 2357 uint16_t mxps;
Kojto 71:53949e6131f6 2358 uint16_t cnt;
Kojto 71:53949e6131f6 2359
Kojto 71:53949e6131f6 2360 if (bsize == 0)
Kojto 71:53949e6131f6 2361 {
Kojto 71:53949e6131f6 2362 return;
Kojto 71:53949e6131f6 2363 }
Kojto 71:53949e6131f6 2364
Kojto 71:53949e6131f6 2365 mxps = usb0_function_get_mxps(pipe); /* Max Packet Size */
Kojto 71:53949e6131f6 2366
Kojto 71:53949e6131f6 2367 if ((bsize % mxps) == 0)
Kojto 71:53949e6131f6 2368 {
Kojto 71:53949e6131f6 2369 cnt = (uint16_t)(bsize / mxps);
Kojto 71:53949e6131f6 2370 }
Kojto 71:53949e6131f6 2371 else
Kojto 71:53949e6131f6 2372 {
Kojto 71:53949e6131f6 2373 cnt = (uint16_t)((bsize / mxps) + 1);
Kojto 71:53949e6131f6 2374 }
Kojto 71:53949e6131f6 2375
Kojto 71:53949e6131f6 2376 switch (pipe)
Kojto 71:53949e6131f6 2377 {
Kojto 71:53949e6131f6 2378 case USB_FUNCTION_PIPE1:
Kojto 71:53949e6131f6 2379 RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
Kojto 71:53949e6131f6 2380 1,
Kojto 71:53949e6131f6 2381 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2382 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2383 USB200.PIPE1TRN = cnt;
Kojto 71:53949e6131f6 2384 RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
Kojto 71:53949e6131f6 2385 1,
Kojto 71:53949e6131f6 2386 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2387 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2388 break;
Kojto 71:53949e6131f6 2389
Kojto 71:53949e6131f6 2390 case USB_FUNCTION_PIPE2:
Kojto 71:53949e6131f6 2391 RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
Kojto 71:53949e6131f6 2392 1,
Kojto 71:53949e6131f6 2393 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2394 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2395 USB200.PIPE2TRN = cnt;
Kojto 71:53949e6131f6 2396 RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
Kojto 71:53949e6131f6 2397 1,
Kojto 71:53949e6131f6 2398 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2399 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2400 break;
Kojto 71:53949e6131f6 2401
Kojto 71:53949e6131f6 2402 case USB_FUNCTION_PIPE3:
Kojto 71:53949e6131f6 2403 RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
Kojto 71:53949e6131f6 2404 1,
Kojto 71:53949e6131f6 2405 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2406 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2407 USB200.PIPE3TRN = cnt;
Kojto 71:53949e6131f6 2408 RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
Kojto 71:53949e6131f6 2409 1,
Kojto 71:53949e6131f6 2410 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2411 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2412 break;
Kojto 71:53949e6131f6 2413
Kojto 71:53949e6131f6 2414 case USB_FUNCTION_PIPE4:
Kojto 71:53949e6131f6 2415 RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
Kojto 71:53949e6131f6 2416 1,
Kojto 71:53949e6131f6 2417 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2418 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2419 USB200.PIPE4TRN = cnt;
Kojto 71:53949e6131f6 2420 RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
Kojto 71:53949e6131f6 2421 1,
Kojto 71:53949e6131f6 2422 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2423 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2424 break;
Kojto 71:53949e6131f6 2425
Kojto 71:53949e6131f6 2426 case USB_FUNCTION_PIPE5:
Kojto 71:53949e6131f6 2427 RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
Kojto 71:53949e6131f6 2428 1,
Kojto 71:53949e6131f6 2429 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2430 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2431 USB200.PIPE5TRN = cnt;
Kojto 71:53949e6131f6 2432 RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
Kojto 71:53949e6131f6 2433 1,
Kojto 71:53949e6131f6 2434 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2435 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2436 break;
Kojto 71:53949e6131f6 2437
Kojto 71:53949e6131f6 2438 case USB_FUNCTION_PIPE9:
Kojto 71:53949e6131f6 2439 RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
Kojto 71:53949e6131f6 2440 1,
Kojto 71:53949e6131f6 2441 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2442 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2443 USB200.PIPE9TRN = cnt;
Kojto 71:53949e6131f6 2444 RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
Kojto 71:53949e6131f6 2445 1,
Kojto 71:53949e6131f6 2446 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2447 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2448 break;
Kojto 71:53949e6131f6 2449
Kojto 71:53949e6131f6 2450 case USB_FUNCTION_PIPEA:
Kojto 71:53949e6131f6 2451 RZA_IO_RegWrite_16(&USB200.PIPEATRE,
Kojto 71:53949e6131f6 2452 1,
Kojto 71:53949e6131f6 2453 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2454 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2455 USB200.PIPEATRN = cnt;
Kojto 71:53949e6131f6 2456 RZA_IO_RegWrite_16(&USB200.PIPEATRE,
Kojto 71:53949e6131f6 2457 1,
Kojto 71:53949e6131f6 2458 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2459 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2460 break;
Kojto 71:53949e6131f6 2461
Kojto 71:53949e6131f6 2462 case USB_FUNCTION_PIPEB:
Kojto 71:53949e6131f6 2463 RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
Kojto 71:53949e6131f6 2464 1,
Kojto 71:53949e6131f6 2465 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2466 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2467 USB200.PIPEBTRN = cnt;
Kojto 71:53949e6131f6 2468 RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
Kojto 71:53949e6131f6 2469 1,
Kojto 71:53949e6131f6 2470 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2471 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2472 break;
Kojto 71:53949e6131f6 2473
Kojto 71:53949e6131f6 2474 case USB_FUNCTION_PIPEC:
Kojto 71:53949e6131f6 2475 RZA_IO_RegWrite_16(&USB200.PIPECTRE,
Kojto 71:53949e6131f6 2476 1,
Kojto 71:53949e6131f6 2477 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2478 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2479 USB200.PIPECTRN = cnt;
Kojto 71:53949e6131f6 2480 RZA_IO_RegWrite_16(&USB200.PIPECTRE,
Kojto 71:53949e6131f6 2481 1,
Kojto 71:53949e6131f6 2482 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2483 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2484 break;
Kojto 71:53949e6131f6 2485
Kojto 71:53949e6131f6 2486 case USB_FUNCTION_PIPED:
Kojto 71:53949e6131f6 2487 RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
Kojto 71:53949e6131f6 2488 1,
Kojto 71:53949e6131f6 2489 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2490 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2491 USB200.PIPEDTRN = cnt;
Kojto 71:53949e6131f6 2492 RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
Kojto 71:53949e6131f6 2493 1,
Kojto 71:53949e6131f6 2494 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2495 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2496 break;
Kojto 71:53949e6131f6 2497
Kojto 71:53949e6131f6 2498 case USB_FUNCTION_PIPEE:
Kojto 71:53949e6131f6 2499 RZA_IO_RegWrite_16(&USB200.PIPEETRE,
Kojto 71:53949e6131f6 2500 1,
Kojto 71:53949e6131f6 2501 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2502 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2503 USB200.PIPEETRN = cnt;
Kojto 71:53949e6131f6 2504 RZA_IO_RegWrite_16(&USB200.PIPEETRE,
Kojto 71:53949e6131f6 2505 1,
Kojto 71:53949e6131f6 2506 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2507 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2508 break;
Kojto 71:53949e6131f6 2509
Kojto 71:53949e6131f6 2510 case USB_FUNCTION_PIPEF:
Kojto 71:53949e6131f6 2511 RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
Kojto 71:53949e6131f6 2512 1,
Kojto 71:53949e6131f6 2513 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2514 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2515 USB200.PIPEFTRN = cnt;
Kojto 71:53949e6131f6 2516 RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
Kojto 71:53949e6131f6 2517 1,
Kojto 71:53949e6131f6 2518 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2519 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2520 break;
Kojto 71:53949e6131f6 2521
Kojto 71:53949e6131f6 2522 default:
Kojto 71:53949e6131f6 2523 break;
Kojto 71:53949e6131f6 2524 }
Kojto 71:53949e6131f6 2525 }
Kojto 71:53949e6131f6 2526
Kojto 71:53949e6131f6 2527 /*******************************************************************************
Kojto 71:53949e6131f6 2528 * Function Name: usb0_function_clear_transaction_counter
Kojto 71:53949e6131f6 2529 * Description : Clears the transaction counter by the argument.
Kojto 71:53949e6131f6 2530 * : After executing this function, the transaction counter is invalid.
Kojto 71:53949e6131f6 2531 * Arguments : uint16_t pipe ; Pipe number
Kojto 71:53949e6131f6 2532 * Return Value : none
Kojto 71:53949e6131f6 2533 *******************************************************************************/
Kojto 71:53949e6131f6 2534 void usb0_function_clear_transaction_counter (uint16_t pipe)
Kojto 71:53949e6131f6 2535 {
Kojto 71:53949e6131f6 2536 switch (pipe)
Kojto 71:53949e6131f6 2537 {
Kojto 71:53949e6131f6 2538 case USB_FUNCTION_PIPE1:
Kojto 71:53949e6131f6 2539 RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
Kojto 71:53949e6131f6 2540 0,
Kojto 71:53949e6131f6 2541 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2542 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2543 RZA_IO_RegWrite_16(&USB200.PIPE1TRE,
Kojto 71:53949e6131f6 2544 1,
Kojto 71:53949e6131f6 2545 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2546 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2547 break;
Kojto 71:53949e6131f6 2548
Kojto 71:53949e6131f6 2549 case USB_FUNCTION_PIPE2:
Kojto 71:53949e6131f6 2550 RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
Kojto 71:53949e6131f6 2551 0,
Kojto 71:53949e6131f6 2552 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2553 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2554 RZA_IO_RegWrite_16(&USB200.PIPE2TRE,
Kojto 71:53949e6131f6 2555 1,
Kojto 71:53949e6131f6 2556 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2557 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2558 break;
Kojto 71:53949e6131f6 2559
Kojto 71:53949e6131f6 2560 case USB_FUNCTION_PIPE3:
Kojto 71:53949e6131f6 2561 RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
Kojto 71:53949e6131f6 2562 0,
Kojto 71:53949e6131f6 2563 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2564 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2565 RZA_IO_RegWrite_16(&USB200.PIPE3TRE,
Kojto 71:53949e6131f6 2566 1,
Kojto 71:53949e6131f6 2567 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2568 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2569 break;
Kojto 71:53949e6131f6 2570
Kojto 71:53949e6131f6 2571 case USB_FUNCTION_PIPE4:
Kojto 71:53949e6131f6 2572 RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
Kojto 71:53949e6131f6 2573 0,
Kojto 71:53949e6131f6 2574 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2575 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2576 RZA_IO_RegWrite_16(&USB200.PIPE4TRE,
Kojto 71:53949e6131f6 2577 1,
Kojto 71:53949e6131f6 2578 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2579 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2580 break;
Kojto 71:53949e6131f6 2581
Kojto 71:53949e6131f6 2582 case USB_FUNCTION_PIPE5:
Kojto 71:53949e6131f6 2583 RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
Kojto 71:53949e6131f6 2584 0,
Kojto 71:53949e6131f6 2585 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2586 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2587 RZA_IO_RegWrite_16(&USB200.PIPE5TRE,
Kojto 71:53949e6131f6 2588 1,
Kojto 71:53949e6131f6 2589 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2590 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2591 break;
Kojto 71:53949e6131f6 2592
Kojto 71:53949e6131f6 2593 case USB_FUNCTION_PIPE9:
Kojto 71:53949e6131f6 2594 RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
Kojto 71:53949e6131f6 2595 0,
Kojto 71:53949e6131f6 2596 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2597 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2598 RZA_IO_RegWrite_16(&USB200.PIPE9TRE,
Kojto 71:53949e6131f6 2599 1,
Kojto 71:53949e6131f6 2600 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2601 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2602 break;
Kojto 71:53949e6131f6 2603
Kojto 71:53949e6131f6 2604 case USB_FUNCTION_PIPEA:
Kojto 71:53949e6131f6 2605 RZA_IO_RegWrite_16(&USB200.PIPEATRE,
Kojto 71:53949e6131f6 2606 0,
Kojto 71:53949e6131f6 2607 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2608 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2609 RZA_IO_RegWrite_16(&USB200.PIPEATRE,
Kojto 71:53949e6131f6 2610 1,
Kojto 71:53949e6131f6 2611 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2612 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2613 break;
Kojto 71:53949e6131f6 2614
Kojto 71:53949e6131f6 2615 case USB_FUNCTION_PIPEB:
Kojto 71:53949e6131f6 2616 RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
Kojto 71:53949e6131f6 2617 0,
Kojto 71:53949e6131f6 2618 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2619 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2620 RZA_IO_RegWrite_16(&USB200.PIPEBTRE,
Kojto 71:53949e6131f6 2621 1,
Kojto 71:53949e6131f6 2622 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2623 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2624 break;
Kojto 71:53949e6131f6 2625
Kojto 71:53949e6131f6 2626 case USB_FUNCTION_PIPEC:
Kojto 71:53949e6131f6 2627 RZA_IO_RegWrite_16(&USB200.PIPECTRE,
Kojto 71:53949e6131f6 2628 0,
Kojto 71:53949e6131f6 2629 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2630 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2631 RZA_IO_RegWrite_16(&USB200.PIPECTRE,
Kojto 71:53949e6131f6 2632 1,
Kojto 71:53949e6131f6 2633 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2634 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2635 break;
Kojto 71:53949e6131f6 2636
Kojto 71:53949e6131f6 2637 case USB_FUNCTION_PIPED:
Kojto 71:53949e6131f6 2638 RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
Kojto 71:53949e6131f6 2639 0,
Kojto 71:53949e6131f6 2640 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2641 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2642 RZA_IO_RegWrite_16(&USB200.PIPEDTRE,
Kojto 71:53949e6131f6 2643 1,
Kojto 71:53949e6131f6 2644 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2645 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2646 break;
Kojto 71:53949e6131f6 2647
Kojto 71:53949e6131f6 2648 case USB_FUNCTION_PIPEE:
Kojto 71:53949e6131f6 2649 RZA_IO_RegWrite_16(&USB200.PIPEETRE,
Kojto 71:53949e6131f6 2650 0,
Kojto 71:53949e6131f6 2651 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2652 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2653 RZA_IO_RegWrite_16(&USB200.PIPEETRE,
Kojto 71:53949e6131f6 2654 1,
Kojto 71:53949e6131f6 2655 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2656 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2657 break;
Kojto 71:53949e6131f6 2658
Kojto 71:53949e6131f6 2659 case USB_FUNCTION_PIPEF:
Kojto 71:53949e6131f6 2660 RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
Kojto 71:53949e6131f6 2661 0,
Kojto 71:53949e6131f6 2662 USB_PIPEnTRE_TRENB_SHIFT,
Kojto 71:53949e6131f6 2663 USB_PIPEnTRE_TRENB);
Kojto 71:53949e6131f6 2664 RZA_IO_RegWrite_16(&USB200.PIPEFTRE,
Kojto 71:53949e6131f6 2665 1,
Kojto 71:53949e6131f6 2666 USB_PIPEnTRE_TRCLR_SHIFT,
Kojto 71:53949e6131f6 2667 USB_PIPEnTRE_TRCLR);
Kojto 71:53949e6131f6 2668 break;
Kojto 71:53949e6131f6 2669
Kojto 71:53949e6131f6 2670 default:
Kojto 71:53949e6131f6 2671 break;
Kojto 71:53949e6131f6 2672 }
Kojto 71:53949e6131f6 2673 }
Kojto 71:53949e6131f6 2674
Kojto 71:53949e6131f6 2675 /*******************************************************************************
Kojto 71:53949e6131f6 2676 * Function Name: usb0_function_stop_transfer
Kojto 71:53949e6131f6 2677 * Description : Stops the USB transfer in the pipe specified by the argument.
Kojto 71:53949e6131f6 2678 * : After stopping the USB transfer, clears the buffer allocated in
Kojto 71:53949e6131f6 2679 * : the pipe.
Kojto 71:53949e6131f6 2680 * : After executing this function, allocation in FIF0 becomes USB_FUNCTION_PIPE0;
Kojto 71:53949e6131f6 2681 * : invalid. After executing this function, BRDY/NRDY/BEMP interrupt
Kojto 71:53949e6131f6 2682 * : in the corresponding pipe becomes invalid. Sequence bit is also
Kojto 71:53949e6131f6 2683 * : cleared.
Kojto 71:53949e6131f6 2684 * Arguments : uint16_t pipe ; Pipe Number
Kojto 71:53949e6131f6 2685 * Return Value : none
Kojto 71:53949e6131f6 2686 *******************************************************************************/
Kojto 71:53949e6131f6 2687 void usb0_function_stop_transfer (uint16_t pipe)
Kojto 71:53949e6131f6 2688 {
Kojto 71:53949e6131f6 2689 uint16_t usefifo;
Kojto 71:53949e6131f6 2690 uint32_t remain;
Kojto 71:53949e6131f6 2691 uint16_t fifo;
Kojto 71:53949e6131f6 2692
Kojto 71:53949e6131f6 2693 usb0_function_set_pid_nak(pipe);
Kojto 71:53949e6131f6 2694
Kojto 71:53949e6131f6 2695 usefifo = (uint16_t)(g_usb0_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
Kojto 71:53949e6131f6 2696 switch (usefifo)
Kojto 71:53949e6131f6 2697 {
Kojto 71:53949e6131f6 2698 case USB_FUNCTION_D0FIFO_USE:
Kojto 71:53949e6131f6 2699 usb0_function_clear_transaction_counter(pipe);
Kojto 71:53949e6131f6 2700 USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */
Kojto 71:53949e6131f6 2701 fifo = USB_FUNCTION_D0USE;
Kojto 71:53949e6131f6 2702 break;
Kojto 71:53949e6131f6 2703
Kojto 71:53949e6131f6 2704 case USB_FUNCTION_D1FIFO_USE:
Kojto 71:53949e6131f6 2705 usb0_function_clear_transaction_counter(pipe);
Kojto 71:53949e6131f6 2706 USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */
Kojto 71:53949e6131f6 2707 fifo = USB_FUNCTION_D1USE;
Kojto 71:53949e6131f6 2708 break;
Kojto 71:53949e6131f6 2709
Kojto 71:53949e6131f6 2710 case USB_FUNCTION_D0FIFO_DMA:
Kojto 71:53949e6131f6 2711 remain = Userdef_USB_usb0_function_stop_dma0();
Kojto 71:53949e6131f6 2712 usb0_function_dma_stop_d0(pipe, remain);
Kojto 71:53949e6131f6 2713 usb0_function_clear_transaction_counter(pipe);
Kojto 71:53949e6131f6 2714 USB200.D0FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */
Kojto 71:53949e6131f6 2715 fifo = USB_FUNCTION_D0DMA;
Kojto 71:53949e6131f6 2716 break;
Kojto 71:53949e6131f6 2717
Kojto 71:53949e6131f6 2718 case USB_FUNCTION_D1FIFO_DMA:
Kojto 71:53949e6131f6 2719 remain = Userdef_USB_usb0_function_stop_dma1();
Kojto 71:53949e6131f6 2720 usb0_function_dma_stop_d1(pipe, remain);
Kojto 71:53949e6131f6 2721 usb0_function_clear_transaction_counter(pipe);
Kojto 71:53949e6131f6 2722 USB200.D1FIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */
Kojto 71:53949e6131f6 2723 fifo = USB_FUNCTION_D1DMA;
Kojto 71:53949e6131f6 2724 break;
Kojto 71:53949e6131f6 2725
Kojto 71:53949e6131f6 2726 default:
Kojto 71:53949e6131f6 2727 usb0_function_clear_transaction_counter(pipe);
Kojto 71:53949e6131f6 2728 USB200.CFIFOCTR = USB_FUNCTION_BITBCLR; /* Buffer Clear */
Kojto 71:53949e6131f6 2729 fifo = USB_FUNCTION_CUSE;
Kojto 71:53949e6131f6 2730 break;
Kojto 71:53949e6131f6 2731 }
Kojto 71:53949e6131f6 2732
Kojto 71:53949e6131f6 2733 usb0_function_set_curpipe(USB_FUNCTION_PIPE0, fifo, DEVDRV_USBF_NO, USB_FUNCTION_BITMBW_16);
Kojto 71:53949e6131f6 2734
Kojto 71:53949e6131f6 2735 /* Interrupt of pipe set is disabled */
Kojto 71:53949e6131f6 2736 usb0_function_disable_brdy_int(pipe);
Kojto 71:53949e6131f6 2737 usb0_function_disable_nrdy_int(pipe);
Kojto 71:53949e6131f6 2738 usb0_function_disable_bemp_int(pipe);
Kojto 71:53949e6131f6 2739
Kojto 71:53949e6131f6 2740 usb0_function_aclrm(pipe);
Kojto 71:53949e6131f6 2741 usb0_function_set_csclr(pipe);
Kojto 71:53949e6131f6 2742
Kojto 71:53949e6131f6 2743 if ( g_usb0_function_pipe_status[pipe] == DEVDRV_USBF_PIPE_WAIT )
Kojto 71:53949e6131f6 2744 {
Kojto 71:53949e6131f6 2745 g_usb0_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_NORES;
Kojto 71:53949e6131f6 2746 }
Kojto 71:53949e6131f6 2747
Kojto 71:53949e6131f6 2748 }
Kojto 71:53949e6131f6 2749
Kojto 71:53949e6131f6 2750 /*******************************************************************************
Kojto 71:53949e6131f6 2751 * Function Name: usb0_function_set_dfacc_d0
Kojto 71:53949e6131f6 2752 * Description : Sets the DFACC setting value in D0FIFO using the transfer size.
Kojto 71:53949e6131f6 2753 * Arguments : uint16_t mbw ; MBW
Kojto 71:53949e6131f6 2754 * : uint16_t count ; data count
Kojto 71:53949e6131f6 2755 * Return Value : DFACC Access mode
Kojto 71:53949e6131f6 2756 *******************************************************************************/
Kojto 71:53949e6131f6 2757 static uint16_t usb0_function_set_dfacc_d0 (uint16_t mbw, uint32_t count)
Kojto 71:53949e6131f6 2758 {
Kojto 71:53949e6131f6 2759 uint16_t dfacc = 0;
Kojto 71:53949e6131f6 2760
Kojto 71:53949e6131f6 2761 #ifndef __USB_FUNCTION_DF_ACC_ENABLE__
Kojto 71:53949e6131f6 2762 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2763 0,
Kojto 71:53949e6131f6 2764 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2765 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2766 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2767 0,
Kojto 71:53949e6131f6 2768 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2769 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2770 dfacc = 0;
Kojto 71:53949e6131f6 2771 #else
Kojto 71:53949e6131f6 2772 if (mbw == USB_FUNCTION_BITMBW_32)
Kojto 71:53949e6131f6 2773 {
Kojto 71:53949e6131f6 2774 if ((count % 32) == 0)
Kojto 71:53949e6131f6 2775 {
Kojto 71:53949e6131f6 2776 /* 32byte transfer */
Kojto 71:53949e6131f6 2777 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2778 2,
Kojto 71:53949e6131f6 2779 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2780 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2781 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2782 0,
Kojto 71:53949e6131f6 2783 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2784 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2785 dfacc = 2;
Kojto 71:53949e6131f6 2786 }
Kojto 71:53949e6131f6 2787 else if ((count % 16) == 0)
Kojto 71:53949e6131f6 2788 {
Kojto 71:53949e6131f6 2789 /* 16byte transfer */
Kojto 71:53949e6131f6 2790 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2791 1,
Kojto 71:53949e6131f6 2792 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2793 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2794 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2795 0,
Kojto 71:53949e6131f6 2796 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2797 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2798 dfacc = 1;
Kojto 71:53949e6131f6 2799 }
Kojto 71:53949e6131f6 2800 else
Kojto 71:53949e6131f6 2801 {
Kojto 71:53949e6131f6 2802 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2803 0,
Kojto 71:53949e6131f6 2804 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2805 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2806 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2807 0,
Kojto 71:53949e6131f6 2808 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2809 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2810 dfacc = 0;
Kojto 71:53949e6131f6 2811 }
Kojto 71:53949e6131f6 2812 }
Kojto 71:53949e6131f6 2813 else if (mbw == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2814 {
Kojto 71:53949e6131f6 2815 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2816 0,
Kojto 71:53949e6131f6 2817 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2818 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2819 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2820 0,
Kojto 71:53949e6131f6 2821 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2822 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2823 dfacc = 0;
Kojto 71:53949e6131f6 2824 }
Kojto 71:53949e6131f6 2825 else
Kojto 71:53949e6131f6 2826 {
Kojto 71:53949e6131f6 2827 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2828 0,
Kojto 71:53949e6131f6 2829 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2830 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2831 RZA_IO_RegWrite_16(&USB200.D0FBCFG,
Kojto 71:53949e6131f6 2832 0,
Kojto 71:53949e6131f6 2833 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2834 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2835 dfacc = 0;
Kojto 71:53949e6131f6 2836 }
Kojto 71:53949e6131f6 2837 #endif
Kojto 71:53949e6131f6 2838 return dfacc;
Kojto 71:53949e6131f6 2839 }
Kojto 71:53949e6131f6 2840
Kojto 71:53949e6131f6 2841 /*******************************************************************************
Kojto 71:53949e6131f6 2842 * Function Name: usb0_function_set_dfacc_d1
Kojto 71:53949e6131f6 2843 * Description : Set the DFACC setting value in D1FIFO using the transfer size.
Kojto 71:53949e6131f6 2844 * Arguments : uint16_t mbw ; MBW
Kojto 71:53949e6131f6 2845 * : uint16_t count ; data count
Kojto 71:53949e6131f6 2846 * Return Value : DFACC Access mode
Kojto 71:53949e6131f6 2847 *******************************************************************************/
Kojto 71:53949e6131f6 2848 static uint16_t usb0_function_set_dfacc_d1 (uint16_t mbw, uint32_t count)
Kojto 71:53949e6131f6 2849 {
Kojto 71:53949e6131f6 2850 uint16_t dfacc = 0;
Kojto 71:53949e6131f6 2851
Kojto 71:53949e6131f6 2852 #ifndef __USB_FUNCTION_DF_ACC_ENABLE__
Kojto 71:53949e6131f6 2853 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2854 0,
Kojto 71:53949e6131f6 2855 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2856 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2857 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2858 0,
Kojto 71:53949e6131f6 2859 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2860 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2861 dfacc = 0;
Kojto 71:53949e6131f6 2862 #else
Kojto 71:53949e6131f6 2863 if (mbw == USB_FUNCTION_BITMBW_32)
Kojto 71:53949e6131f6 2864 {
Kojto 71:53949e6131f6 2865 if ((count % 32) == 0)
Kojto 71:53949e6131f6 2866 {
Kojto 71:53949e6131f6 2867 /* 32byte transfer */
Kojto 71:53949e6131f6 2868 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2869 2,
Kojto 71:53949e6131f6 2870 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2871 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2872 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2873 0,
Kojto 71:53949e6131f6 2874 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2875 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2876 dfacc = 2;
Kojto 71:53949e6131f6 2877 }
Kojto 71:53949e6131f6 2878 else if ((count % 16) == 0)
Kojto 71:53949e6131f6 2879 {
Kojto 71:53949e6131f6 2880 /* 16byte transfer */
Kojto 71:53949e6131f6 2881 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2882 1,
Kojto 71:53949e6131f6 2883 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2884 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2885 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2886 0,
Kojto 71:53949e6131f6 2887 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2888 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2889 dfacc = 1;
Kojto 71:53949e6131f6 2890 }
Kojto 71:53949e6131f6 2891 else
Kojto 71:53949e6131f6 2892 {
Kojto 71:53949e6131f6 2893 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2894 0,
Kojto 71:53949e6131f6 2895 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2896 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2897 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2898 0,
Kojto 71:53949e6131f6 2899 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2900 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2901 dfacc = 0;
Kojto 71:53949e6131f6 2902 }
Kojto 71:53949e6131f6 2903 }
Kojto 71:53949e6131f6 2904 else if (mbw == USB_FUNCTION_BITMBW_16)
Kojto 71:53949e6131f6 2905 {
Kojto 71:53949e6131f6 2906 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2907 0,
Kojto 71:53949e6131f6 2908 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2909 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2910 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2911 0,
Kojto 71:53949e6131f6 2912 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2913 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2914 dfacc = 0;
Kojto 71:53949e6131f6 2915 }
Kojto 71:53949e6131f6 2916 else
Kojto 71:53949e6131f6 2917 {
Kojto 71:53949e6131f6 2918 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2919 0,
Kojto 71:53949e6131f6 2920 USB_DnFBCFG_DFACC_SHIFT,
Kojto 71:53949e6131f6 2921 USB_DnFBCFG_DFACC);
Kojto 71:53949e6131f6 2922 RZA_IO_RegWrite_16(&USB200.D1FBCFG,
Kojto 71:53949e6131f6 2923 0,
Kojto 71:53949e6131f6 2924 USB_DnFBCFG_TENDE_SHIFT,
Kojto 71:53949e6131f6 2925 USB_DnFBCFG_TENDE);
Kojto 71:53949e6131f6 2926 dfacc = 0;
Kojto 71:53949e6131f6 2927 }
Kojto 71:53949e6131f6 2928 #endif
Kojto 71:53949e6131f6 2929
Kojto 71:53949e6131f6 2930 return dfacc;
Kojto 71:53949e6131f6 2931 }
Kojto 71:53949e6131f6 2932
Kojto 71:53949e6131f6 2933 /* End of File */