USB device stack

Dependents:   mbed-mX-USB-TEST1 USBMSD_SD_HID_HelloWorld HidTest MIDI_usb_bridge ... more

Legacy Warning

This is an mbed 2 library. To learn more about mbed OS 5, visit the docs.

Pull requests against this repository are no longer supported. Please raise against mbed OS 5 as documented above.

Committer:
Kojto
Date:
Thu Jul 27 12:14:04 2017 +0100
Revision:
71:53949e6131f6
Update libraries

Fixes the previous commmit, as some devices were not copied. USBDevice contains
now targets directory with all targets implementations

Who changed what in which revision?

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