X-TOUCH to djay bridge

Dependencies:   mbed mbed-rtos FATFileSystem

Committer:
okini3939
Date:
Wed Jun 05 04:54:37 2019 +0000
Revision:
1:0dac72ab5910
sample

Who changed what in which revision?

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