max4146x_comp

Dependencies:   MAX14690

Committer:
sdivarci
Date:
Sun Oct 25 20:10:02 2020 +0000
Revision:
0:0061165683ee
sdivarci

Who changed what in which revision?

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