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_drv_api.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 #include "dev_drv.h"
okini3939 1:0dac72ab5910 42
okini3939 1:0dac72ab5910 43
okini3939 1:0dac72ab5910 44 /*******************************************************************************
okini3939 1:0dac72ab5910 45 Typedef definitions
okini3939 1:0dac72ab5910 46 *******************************************************************************/
okini3939 1:0dac72ab5910 47
okini3939 1:0dac72ab5910 48
okini3939 1:0dac72ab5910 49 /*******************************************************************************
okini3939 1:0dac72ab5910 50 Macro definitions
okini3939 1:0dac72ab5910 51 *******************************************************************************/
okini3939 1:0dac72ab5910 52
okini3939 1:0dac72ab5910 53
okini3939 1:0dac72ab5910 54 /*******************************************************************************
okini3939 1:0dac72ab5910 55 Imported global variables and functions (from other files)
okini3939 1:0dac72ab5910 56 *******************************************************************************/
okini3939 1:0dac72ab5910 57
okini3939 1:0dac72ab5910 58
okini3939 1:0dac72ab5910 59 /*******************************************************************************
okini3939 1:0dac72ab5910 60 Exported global variables and functions (to be accessed by other files)
okini3939 1:0dac72ab5910 61 *******************************************************************************/
okini3939 1:0dac72ab5910 62 static void usb0_host_resetEP(USB_HOST_CFG_PIPETBL_t *tbl);
okini3939 1:0dac72ab5910 63
okini3939 1:0dac72ab5910 64
okini3939 1:0dac72ab5910 65 /*******************************************************************************
okini3939 1:0dac72ab5910 66 Private global variables and functions
okini3939 1:0dac72ab5910 67 *******************************************************************************/
okini3939 1:0dac72ab5910 68
okini3939 1:0dac72ab5910 69
okini3939 1:0dac72ab5910 70 /*******************************************************************************
okini3939 1:0dac72ab5910 71 * Function Name: usb0_api_host_init
okini3939 1:0dac72ab5910 72 * Description : Initializes USB module in the USB host mode.
okini3939 1:0dac72ab5910 73 * : USB connection is executed when executing this function in
okini3939 1:0dac72ab5910 74 * : the states that USB device isconnected to the USB port.
okini3939 1:0dac72ab5910 75 * Arguments : uint8_t int_level : USB Module interrupt level
okini3939 1:0dac72ab5910 76 * : USBU16 mode : USB_HOST_HIGH_SPEED
okini3939 1:0dac72ab5910 77 * : USB_HOST_FULL_SPEED
okini3939 1:0dac72ab5910 78 * : uint16_t clockmode : USB Clock mode
okini3939 1:0dac72ab5910 79 * Return Value : USB detach or attach
okini3939 1:0dac72ab5910 80 * : USB_HOST_ATTACH
okini3939 1:0dac72ab5910 81 * : USB_HOST_DETACH
okini3939 1:0dac72ab5910 82 *******************************************************************************/
okini3939 1:0dac72ab5910 83 uint16_t usb0_api_host_init (uint8_t int_level, uint16_t mode, uint16_t clockmode)
okini3939 1:0dac72ab5910 84 {
okini3939 1:0dac72ab5910 85 uint16_t connect;
okini3939 1:0dac72ab5910 86 volatile uint8_t dummy_buf;
okini3939 1:0dac72ab5910 87
okini3939 1:0dac72ab5910 88 CPG.STBCR7 &= 0xfd; /*The clock of USB0 modules is permitted */
okini3939 1:0dac72ab5910 89 dummy_buf = CPG.STBCR7; /* (Dummy read) */
okini3939 1:0dac72ab5910 90
okini3939 1:0dac72ab5910 91 g_usb0_host_SupportUsbDeviceSpeed = mode;
okini3939 1:0dac72ab5910 92
okini3939 1:0dac72ab5910 93 usb0_host_setting_interrupt(int_level);
okini3939 1:0dac72ab5910 94 usb0_host_reset_module(clockmode);
okini3939 1:0dac72ab5910 95
okini3939 1:0dac72ab5910 96 g_usb0_host_bchg_flag = USB_HOST_NO;
okini3939 1:0dac72ab5910 97 g_usb0_host_detach_flag = USB_HOST_NO;
okini3939 1:0dac72ab5910 98 g_usb0_host_attach_flag = USB_HOST_NO;
okini3939 1:0dac72ab5910 99
okini3939 1:0dac72ab5910 100 g_usb0_host_driver_state = USB_HOST_DRV_DETACHED;
okini3939 1:0dac72ab5910 101 g_usb0_host_default_max_packet[USB_HOST_DEVICE_0] = 64;
okini3939 1:0dac72ab5910 102
okini3939 1:0dac72ab5910 103 usb0_host_InitModule();
okini3939 1:0dac72ab5910 104
okini3939 1:0dac72ab5910 105 connect = usb0_host_CheckAttach();
okini3939 1:0dac72ab5910 106
okini3939 1:0dac72ab5910 107 if (connect == USB_HOST_ATTACH)
okini3939 1:0dac72ab5910 108 {
okini3939 1:0dac72ab5910 109 g_usb0_host_attach_flag = USB_HOST_YES;
okini3939 1:0dac72ab5910 110 }
okini3939 1:0dac72ab5910 111 else
okini3939 1:0dac72ab5910 112 {
okini3939 1:0dac72ab5910 113 usb0_host_UsbDetach2();
okini3939 1:0dac72ab5910 114 }
okini3939 1:0dac72ab5910 115
okini3939 1:0dac72ab5910 116 return connect;
okini3939 1:0dac72ab5910 117 }
okini3939 1:0dac72ab5910 118
okini3939 1:0dac72ab5910 119 #if(1) /* ohci_wrapp */
okini3939 1:0dac72ab5910 120 #else
okini3939 1:0dac72ab5910 121 /*******************************************************************************
okini3939 1:0dac72ab5910 122 * Function Name: usb0_api_host_enumeration
okini3939 1:0dac72ab5910 123 * Description : Initializes USB module in the USB host mode.
okini3939 1:0dac72ab5910 124 * : USB connection is executed when executing this function in
okini3939 1:0dac72ab5910 125 * : the states that USB device isconnected to the USB port.
okini3939 1:0dac72ab5910 126 * Arguments : uint16_t devadr : device address
okini3939 1:0dac72ab5910 127 * Return Value : DEVDRV_USBH_DETACH_ERR : device detach
okini3939 1:0dac72ab5910 128 * : DEVDRV_SUCCESS : device enumeration success
okini3939 1:0dac72ab5910 129 * : DEVDRV_ERROR : device enumeration error
okini3939 1:0dac72ab5910 130 *******************************************************************************/
okini3939 1:0dac72ab5910 131 int32_t usb0_api_host_enumeration (uint16_t devadr)
okini3939 1:0dac72ab5910 132 {
okini3939 1:0dac72ab5910 133 int32_t ret;
okini3939 1:0dac72ab5910 134 uint16_t driver_sts;
okini3939 1:0dac72ab5910 135
okini3939 1:0dac72ab5910 136 g_usb0_host_setUsbAddress = devadr;
okini3939 1:0dac72ab5910 137
okini3939 1:0dac72ab5910 138 while (1)
okini3939 1:0dac72ab5910 139 {
okini3939 1:0dac72ab5910 140 driver_sts = usb0_api_host_GetUsbDeviceState();
okini3939 1:0dac72ab5910 141
okini3939 1:0dac72ab5910 142 if (driver_sts == USB_HOST_DRV_DETACHED)
okini3939 1:0dac72ab5910 143 {
okini3939 1:0dac72ab5910 144 ret = DEVDRV_USBH_DETACH_ERR;
okini3939 1:0dac72ab5910 145 break;
okini3939 1:0dac72ab5910 146 }
okini3939 1:0dac72ab5910 147 else if (driver_sts == USB_HOST_DRV_CONFIGURED)
okini3939 1:0dac72ab5910 148 {
okini3939 1:0dac72ab5910 149 ret = DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 150 break;
okini3939 1:0dac72ab5910 151 }
okini3939 1:0dac72ab5910 152 else if (driver_sts == USB_HOST_DRV_STALL)
okini3939 1:0dac72ab5910 153 {
okini3939 1:0dac72ab5910 154 ret = DEVDRV_ERROR;
okini3939 1:0dac72ab5910 155 break;
okini3939 1:0dac72ab5910 156 }
okini3939 1:0dac72ab5910 157 else if (driver_sts == USB_HOST_DRV_NORES)
okini3939 1:0dac72ab5910 158 {
okini3939 1:0dac72ab5910 159 ret = DEVDRV_ERROR;
okini3939 1:0dac72ab5910 160 break;
okini3939 1:0dac72ab5910 161 }
okini3939 1:0dac72ab5910 162 else
okini3939 1:0dac72ab5910 163 {
okini3939 1:0dac72ab5910 164 /* Do Nothing */
okini3939 1:0dac72ab5910 165 }
okini3939 1:0dac72ab5910 166 }
okini3939 1:0dac72ab5910 167
okini3939 1:0dac72ab5910 168 if (driver_sts == USB_HOST_DRV_NORES)
okini3939 1:0dac72ab5910 169 {
okini3939 1:0dac72ab5910 170 while (1)
okini3939 1:0dac72ab5910 171 {
okini3939 1:0dac72ab5910 172 driver_sts = usb0_api_host_GetUsbDeviceState();
okini3939 1:0dac72ab5910 173
okini3939 1:0dac72ab5910 174 if (driver_sts == USB_HOST_DRV_DETACHED)
okini3939 1:0dac72ab5910 175 {
okini3939 1:0dac72ab5910 176 break;
okini3939 1:0dac72ab5910 177 }
okini3939 1:0dac72ab5910 178 }
okini3939 1:0dac72ab5910 179 }
okini3939 1:0dac72ab5910 180
okini3939 1:0dac72ab5910 181 return ret;
okini3939 1:0dac72ab5910 182 }
okini3939 1:0dac72ab5910 183
okini3939 1:0dac72ab5910 184 /*******************************************************************************
okini3939 1:0dac72ab5910 185 * Function Name: usb0_api_host_detach
okini3939 1:0dac72ab5910 186 * Description : USB detach routine
okini3939 1:0dac72ab5910 187 * Arguments : none
okini3939 1:0dac72ab5910 188 * Return Value : USB_HOST_DETACH : USB detach
okini3939 1:0dac72ab5910 189 * : USB_HOST_ATTACH : USB attach
okini3939 1:0dac72ab5910 190 * : DEVDRV_ERROR : error
okini3939 1:0dac72ab5910 191 *******************************************************************************/
okini3939 1:0dac72ab5910 192 int32_t usb0_api_host_detach (void)
okini3939 1:0dac72ab5910 193 {
okini3939 1:0dac72ab5910 194 int32_t ret;
okini3939 1:0dac72ab5910 195 uint16_t driver_sts;
okini3939 1:0dac72ab5910 196
okini3939 1:0dac72ab5910 197 while (1)
okini3939 1:0dac72ab5910 198 {
okini3939 1:0dac72ab5910 199 driver_sts = usb0_api_host_GetUsbDeviceState();
okini3939 1:0dac72ab5910 200
okini3939 1:0dac72ab5910 201 if (driver_sts == USB_HOST_DRV_DETACHED)
okini3939 1:0dac72ab5910 202 {
okini3939 1:0dac72ab5910 203 ret = USB_HOST_DETACH;
okini3939 1:0dac72ab5910 204 break;
okini3939 1:0dac72ab5910 205 }
okini3939 1:0dac72ab5910 206 else if (driver_sts == USB_HOST_DRV_CONFIGURED)
okini3939 1:0dac72ab5910 207 {
okini3939 1:0dac72ab5910 208 ret = USB_HOST_ATTACH;
okini3939 1:0dac72ab5910 209 break;
okini3939 1:0dac72ab5910 210 }
okini3939 1:0dac72ab5910 211 else if (driver_sts == USB_HOST_DRV_STALL)
okini3939 1:0dac72ab5910 212 {
okini3939 1:0dac72ab5910 213 ret = DEVDRV_ERROR;
okini3939 1:0dac72ab5910 214 break;
okini3939 1:0dac72ab5910 215 }
okini3939 1:0dac72ab5910 216 else if (driver_sts == USB_HOST_DRV_NORES)
okini3939 1:0dac72ab5910 217 {
okini3939 1:0dac72ab5910 218 ret = DEVDRV_ERROR;
okini3939 1:0dac72ab5910 219 break;
okini3939 1:0dac72ab5910 220 }
okini3939 1:0dac72ab5910 221 else
okini3939 1:0dac72ab5910 222 {
okini3939 1:0dac72ab5910 223 /* Do Nothing */
okini3939 1:0dac72ab5910 224 }
okini3939 1:0dac72ab5910 225 }
okini3939 1:0dac72ab5910 226
okini3939 1:0dac72ab5910 227 if (driver_sts == USB_HOST_DRV_NORES)
okini3939 1:0dac72ab5910 228 {
okini3939 1:0dac72ab5910 229 while (1)
okini3939 1:0dac72ab5910 230 {
okini3939 1:0dac72ab5910 231 driver_sts = usb0_api_host_GetUsbDeviceState();
okini3939 1:0dac72ab5910 232
okini3939 1:0dac72ab5910 233 if (driver_sts == USB_HOST_DRV_DETACHED)
okini3939 1:0dac72ab5910 234 {
okini3939 1:0dac72ab5910 235 break;
okini3939 1:0dac72ab5910 236 }
okini3939 1:0dac72ab5910 237 }
okini3939 1:0dac72ab5910 238 }
okini3939 1:0dac72ab5910 239
okini3939 1:0dac72ab5910 240 return ret;
okini3939 1:0dac72ab5910 241 }
okini3939 1:0dac72ab5910 242
okini3939 1:0dac72ab5910 243 /*******************************************************************************
okini3939 1:0dac72ab5910 244 * Function Name: usb0_api_host_data_in
okini3939 1:0dac72ab5910 245 * Description : Executes USB transfer as data-in in the argument specified pipe.
okini3939 1:0dac72ab5910 246 * Arguments : uint16_t devadr ; device address
okini3939 1:0dac72ab5910 247 * : uint16_t Pipe ; Pipe Number
okini3939 1:0dac72ab5910 248 * : uint32_t Size ; Data Size
okini3939 1:0dac72ab5910 249 * : uint8_t *data_buf ; Data data_buf Address
okini3939 1:0dac72ab5910 250 * Return Value : DEVDRV_SUCCESS ; success
okini3939 1:0dac72ab5910 251 * : DEVDRV_ERROR ; error
okini3939 1:0dac72ab5910 252 *******************************************************************************/
okini3939 1:0dac72ab5910 253 int32_t usb0_api_host_data_in (uint16_t devadr, uint16_t Pipe, uint32_t Size, uint8_t * data_buf)
okini3939 1:0dac72ab5910 254 {
okini3939 1:0dac72ab5910 255 int32_t ret;
okini3939 1:0dac72ab5910 256
okini3939 1:0dac72ab5910 257 if (Pipe == USB_HOST_PIPE0)
okini3939 1:0dac72ab5910 258 {
okini3939 1:0dac72ab5910 259 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 260 }
okini3939 1:0dac72ab5910 261
okini3939 1:0dac72ab5910 262 if (RZA_IO_RegRead_16(&g_usb0_host_pipemaxp[Pipe], USB_PIPEMAXP_DEVSEL_SHIFT, USB_PIPEMAXP_DEVSEL) != devadr)
okini3939 1:0dac72ab5910 263 {
okini3939 1:0dac72ab5910 264 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 265 }
okini3939 1:0dac72ab5910 266
okini3939 1:0dac72ab5910 267 if (RZA_IO_RegRead_16(&g_usb0_host_pipecfg[Pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 1)
okini3939 1:0dac72ab5910 268 {
okini3939 1:0dac72ab5910 269 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 270 }
okini3939 1:0dac72ab5910 271
okini3939 1:0dac72ab5910 272 if (g_usb0_host_pipe_status[Pipe] == USB_HOST_PIPE_IDLE)
okini3939 1:0dac72ab5910 273 {
okini3939 1:0dac72ab5910 274 usb0_host_start_receive_transfer(Pipe, Size, data_buf);
okini3939 1:0dac72ab5910 275 }
okini3939 1:0dac72ab5910 276 else
okini3939 1:0dac72ab5910 277 {
okini3939 1:0dac72ab5910 278 return DEVDRV_ERROR; /* Now pipe is busy */
okini3939 1:0dac72ab5910 279 }
okini3939 1:0dac72ab5910 280
okini3939 1:0dac72ab5910 281 /* waiting for completing routine */
okini3939 1:0dac72ab5910 282 do
okini3939 1:0dac72ab5910 283 {
okini3939 1:0dac72ab5910 284 if (g_usb0_host_detach_flag == USB_HOST_YES)
okini3939 1:0dac72ab5910 285 {
okini3939 1:0dac72ab5910 286 break;
okini3939 1:0dac72ab5910 287 }
okini3939 1:0dac72ab5910 288
okini3939 1:0dac72ab5910 289 if ((g_usb0_host_pipe_status[Pipe] != USB_HOST_PIPE_IDLE) && (g_usb0_host_pipe_status[Pipe] != USB_HOST_PIPE_WAIT))
okini3939 1:0dac72ab5910 290 {
okini3939 1:0dac72ab5910 291 break;
okini3939 1:0dac72ab5910 292 }
okini3939 1:0dac72ab5910 293
okini3939 1:0dac72ab5910 294 } while (1);
okini3939 1:0dac72ab5910 295
okini3939 1:0dac72ab5910 296 if (g_usb0_host_detach_flag == USB_HOST_YES)
okini3939 1:0dac72ab5910 297 {
okini3939 1:0dac72ab5910 298 return DEVDRV_USBH_DETACH_ERR;
okini3939 1:0dac72ab5910 299 }
okini3939 1:0dac72ab5910 300
okini3939 1:0dac72ab5910 301 switch (g_usb0_host_pipe_status[Pipe])
okini3939 1:0dac72ab5910 302 {
okini3939 1:0dac72ab5910 303 case USB_HOST_PIPE_DONE:
okini3939 1:0dac72ab5910 304 ret = DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 305 break;
okini3939 1:0dac72ab5910 306
okini3939 1:0dac72ab5910 307 case USB_HOST_PIPE_STALL:
okini3939 1:0dac72ab5910 308 ret = DEVDRV_USBH_STALL;
okini3939 1:0dac72ab5910 309 break;
okini3939 1:0dac72ab5910 310
okini3939 1:0dac72ab5910 311 case USB_HOST_PIPE_NORES:
okini3939 1:0dac72ab5910 312 ret = DEVDRV_USBH_COM_ERR;
okini3939 1:0dac72ab5910 313 break;
okini3939 1:0dac72ab5910 314
okini3939 1:0dac72ab5910 315 default:
okini3939 1:0dac72ab5910 316 ret = DEVDRV_ERROR;
okini3939 1:0dac72ab5910 317 break;
okini3939 1:0dac72ab5910 318 }
okini3939 1:0dac72ab5910 319
okini3939 1:0dac72ab5910 320 usb0_host_stop_transfer(Pipe);
okini3939 1:0dac72ab5910 321
okini3939 1:0dac72ab5910 322 g_usb0_host_pipe_status[Pipe] = USB_HOST_PIPE_IDLE;
okini3939 1:0dac72ab5910 323
okini3939 1:0dac72ab5910 324 return ret;
okini3939 1:0dac72ab5910 325 }
okini3939 1:0dac72ab5910 326
okini3939 1:0dac72ab5910 327 /*******************************************************************************
okini3939 1:0dac72ab5910 328 * Function Name: usb0_api_host_data_out
okini3939 1:0dac72ab5910 329 * Description : Executes USB transfer as data-out in the argument specified pipe.
okini3939 1:0dac72ab5910 330 * Arguments : uint16_t devadr ; device address
okini3939 1:0dac72ab5910 331 * : uint16_t Pipe ; Pipe Number
okini3939 1:0dac72ab5910 332 * : uint32_t Size ; Data Size
okini3939 1:0dac72ab5910 333 * : uint8_t *data_buf ; Data data_buf Address
okini3939 1:0dac72ab5910 334 * Return Value : DEVDRV_SUCCESS ; success
okini3939 1:0dac72ab5910 335 * : DEVDRV_ERROR ; error
okini3939 1:0dac72ab5910 336 *******************************************************************************/
okini3939 1:0dac72ab5910 337 int32_t usb0_api_host_data_out (uint16_t devadr, uint16_t Pipe, uint32_t Size, uint8_t * data_buf)
okini3939 1:0dac72ab5910 338 {
okini3939 1:0dac72ab5910 339 int32_t ret;
okini3939 1:0dac72ab5910 340
okini3939 1:0dac72ab5910 341 if (Pipe == USB_HOST_PIPE0)
okini3939 1:0dac72ab5910 342 {
okini3939 1:0dac72ab5910 343 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 344 }
okini3939 1:0dac72ab5910 345
okini3939 1:0dac72ab5910 346 if (RZA_IO_RegRead_16(&g_usb0_host_pipemaxp[Pipe], USB_PIPEMAXP_DEVSEL_SHIFT, USB_PIPEMAXP_DEVSEL) != devadr)
okini3939 1:0dac72ab5910 347 {
okini3939 1:0dac72ab5910 348 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 349 }
okini3939 1:0dac72ab5910 350
okini3939 1:0dac72ab5910 351 if (RZA_IO_RegRead_16(&g_usb0_host_pipecfg[Pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0)
okini3939 1:0dac72ab5910 352 {
okini3939 1:0dac72ab5910 353 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 354 }
okini3939 1:0dac72ab5910 355
okini3939 1:0dac72ab5910 356 if (g_usb0_host_pipe_status[Pipe] == USB_HOST_PIPE_IDLE)
okini3939 1:0dac72ab5910 357 {
okini3939 1:0dac72ab5910 358 usb0_host_start_send_transfer(Pipe, Size, data_buf);
okini3939 1:0dac72ab5910 359 }
okini3939 1:0dac72ab5910 360 else
okini3939 1:0dac72ab5910 361 {
okini3939 1:0dac72ab5910 362 return DEVDRV_ERROR; /* Now pipe is busy */
okini3939 1:0dac72ab5910 363 }
okini3939 1:0dac72ab5910 364
okini3939 1:0dac72ab5910 365 /* waiting for completing routine */
okini3939 1:0dac72ab5910 366 do
okini3939 1:0dac72ab5910 367 {
okini3939 1:0dac72ab5910 368 if (g_usb0_host_detach_flag == USB_HOST_YES)
okini3939 1:0dac72ab5910 369 {
okini3939 1:0dac72ab5910 370 break;
okini3939 1:0dac72ab5910 371 }
okini3939 1:0dac72ab5910 372
okini3939 1:0dac72ab5910 373 if ((g_usb0_host_pipe_status[Pipe] != USB_HOST_PIPE_IDLE) && (g_usb0_host_pipe_status[Pipe] != USB_HOST_PIPE_WAIT))
okini3939 1:0dac72ab5910 374 {
okini3939 1:0dac72ab5910 375 break;
okini3939 1:0dac72ab5910 376 }
okini3939 1:0dac72ab5910 377
okini3939 1:0dac72ab5910 378 } while (1);
okini3939 1:0dac72ab5910 379
okini3939 1:0dac72ab5910 380 if (g_usb0_host_detach_flag == USB_HOST_YES)
okini3939 1:0dac72ab5910 381 {
okini3939 1:0dac72ab5910 382 return DEVDRV_USBH_DETACH_ERR;
okini3939 1:0dac72ab5910 383 }
okini3939 1:0dac72ab5910 384
okini3939 1:0dac72ab5910 385 switch (g_usb0_host_pipe_status[Pipe])
okini3939 1:0dac72ab5910 386 {
okini3939 1:0dac72ab5910 387 case USB_HOST_PIPE_DONE:
okini3939 1:0dac72ab5910 388 ret = DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 389 break;
okini3939 1:0dac72ab5910 390
okini3939 1:0dac72ab5910 391 case USB_HOST_PIPE_STALL:
okini3939 1:0dac72ab5910 392 ret = DEVDRV_USBH_STALL;
okini3939 1:0dac72ab5910 393 break;
okini3939 1:0dac72ab5910 394
okini3939 1:0dac72ab5910 395 case USB_HOST_PIPE_NORES:
okini3939 1:0dac72ab5910 396 ret = DEVDRV_USBH_COM_ERR;
okini3939 1:0dac72ab5910 397 break;
okini3939 1:0dac72ab5910 398
okini3939 1:0dac72ab5910 399 default:
okini3939 1:0dac72ab5910 400 ret = DEVDRV_ERROR;
okini3939 1:0dac72ab5910 401 break;
okini3939 1:0dac72ab5910 402 }
okini3939 1:0dac72ab5910 403
okini3939 1:0dac72ab5910 404 usb0_host_stop_transfer(Pipe);
okini3939 1:0dac72ab5910 405
okini3939 1:0dac72ab5910 406 g_usb0_host_pipe_status[Pipe] = USB_HOST_PIPE_IDLE;
okini3939 1:0dac72ab5910 407
okini3939 1:0dac72ab5910 408 return ret;
okini3939 1:0dac72ab5910 409 }
okini3939 1:0dac72ab5910 410
okini3939 1:0dac72ab5910 411 /*******************************************************************************
okini3939 1:0dac72ab5910 412 * Function Name: usb0_api_host_control_transfer
okini3939 1:0dac72ab5910 413 * Description : Executes USB control transfer.
okini3939 1:0dac72ab5910 414 * Arguments : uint16_t devadr ; device address
okini3939 1:0dac72ab5910 415 * : uint16_t Req ; bmRequestType & bRequest
okini3939 1:0dac72ab5910 416 * : uint16_t Val ; wValue
okini3939 1:0dac72ab5910 417 * : uint16_t Indx ; wIndex
okini3939 1:0dac72ab5910 418 * : uint16_t Len ; wLength
okini3939 1:0dac72ab5910 419 * : uint8_t *buf ; Buffer
okini3939 1:0dac72ab5910 420 * Return Value : DEVDRV_SUCCESS ; success
okini3939 1:0dac72ab5910 421 * : DEVDRV_USBH_DETACH_ERR ; device detach
okini3939 1:0dac72ab5910 422 * : DEVDRV_USBH_CTRL_COM_ERR ; device no response
okini3939 1:0dac72ab5910 423 * : DEVDRV_USBH_STALL ; STALL
okini3939 1:0dac72ab5910 424 * : DEVDRV_ERROR ; error
okini3939 1:0dac72ab5910 425 *******************************************************************************/
okini3939 1:0dac72ab5910 426 int32_t usb0_api_host_control_transfer (uint16_t devadr, uint16_t Req, uint16_t Val, uint16_t Indx,
okini3939 1:0dac72ab5910 427 uint16_t Len, uint8_t * Buf)
okini3939 1:0dac72ab5910 428 {
okini3939 1:0dac72ab5910 429 int32_t ret;
okini3939 1:0dac72ab5910 430
okini3939 1:0dac72ab5910 431 do
okini3939 1:0dac72ab5910 432 {
okini3939 1:0dac72ab5910 433 ret = usb0_host_CtrlTransStart(devadr, Req, Val, Indx, Len, Buf);
okini3939 1:0dac72ab5910 434
okini3939 1:0dac72ab5910 435 if (ret == DEVDRV_SUCCESS)
okini3939 1:0dac72ab5910 436 {
okini3939 1:0dac72ab5910 437 if (g_usb0_host_detach_flag == USB_HOST_YES)
okini3939 1:0dac72ab5910 438 {
okini3939 1:0dac72ab5910 439 break;
okini3939 1:0dac72ab5910 440 }
okini3939 1:0dac72ab5910 441
okini3939 1:0dac72ab5910 442 if ((g_usb0_host_pipe_status[USB_HOST_PIPE0] != USB_HOST_PIPE_IDLE)
okini3939 1:0dac72ab5910 443 && (g_usb0_host_pipe_status[USB_HOST_PIPE0] != USB_HOST_PIPE_WAIT))
okini3939 1:0dac72ab5910 444 {
okini3939 1:0dac72ab5910 445 break;
okini3939 1:0dac72ab5910 446 }
okini3939 1:0dac72ab5910 447 }
okini3939 1:0dac72ab5910 448 else
okini3939 1:0dac72ab5910 449 {
okini3939 1:0dac72ab5910 450 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 451 }
okini3939 1:0dac72ab5910 452 } while (1);
okini3939 1:0dac72ab5910 453
okini3939 1:0dac72ab5910 454 if (g_usb0_host_detach_flag == USB_HOST_YES)
okini3939 1:0dac72ab5910 455 {
okini3939 1:0dac72ab5910 456 return DEVDRV_USBH_DETACH_ERR;
okini3939 1:0dac72ab5910 457 }
okini3939 1:0dac72ab5910 458
okini3939 1:0dac72ab5910 459 switch (g_usb0_host_pipe_status[USB_HOST_PIPE0])
okini3939 1:0dac72ab5910 460 {
okini3939 1:0dac72ab5910 461 case USB_HOST_PIPE_DONE:
okini3939 1:0dac72ab5910 462 ret = DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 463 break;
okini3939 1:0dac72ab5910 464
okini3939 1:0dac72ab5910 465 case USB_HOST_PIPE_STALL:
okini3939 1:0dac72ab5910 466 ret = DEVDRV_USBH_STALL;
okini3939 1:0dac72ab5910 467 break;
okini3939 1:0dac72ab5910 468
okini3939 1:0dac72ab5910 469 case USB_HOST_PIPE_NORES:
okini3939 1:0dac72ab5910 470 ret = DEVDRV_USBH_CTRL_COM_ERR;
okini3939 1:0dac72ab5910 471 break;
okini3939 1:0dac72ab5910 472
okini3939 1:0dac72ab5910 473 default:
okini3939 1:0dac72ab5910 474 ret = DEVDRV_ERROR;
okini3939 1:0dac72ab5910 475 break;
okini3939 1:0dac72ab5910 476 }
okini3939 1:0dac72ab5910 477
okini3939 1:0dac72ab5910 478 g_usb0_host_pipe_status[USB_HOST_PIPE0] = USB_HOST_PIPE_IDLE;
okini3939 1:0dac72ab5910 479
okini3939 1:0dac72ab5910 480 return ret;
okini3939 1:0dac72ab5910 481 }
okini3939 1:0dac72ab5910 482
okini3939 1:0dac72ab5910 483 /*******************************************************************************
okini3939 1:0dac72ab5910 484 * Function Name: usb0_api_host_set_endpoint
okini3939 1:0dac72ab5910 485 * Description : Sets end point on the information specified in the argument.
okini3939 1:0dac72ab5910 486 * Arguments : uint16_t devadr ; device address
okini3939 1:0dac72ab5910 487 * : uint8_t *configdescriptor ; device configration descriptor
okini3939 1:0dac72ab5910 488 * : USB_HOST_CFG_PIPETBL_t *user_table ; pipe table
okini3939 1:0dac72ab5910 489 * Return Value : DEVDRV_SUCCESS ; success
okini3939 1:0dac72ab5910 490 * : DEVDRV_ERROR ; error
okini3939 1:0dac72ab5910 491 *******************************************************************************/
okini3939 1:0dac72ab5910 492 int32_t usb0_api_host_set_endpoint (uint16_t devadr, USB_HOST_CFG_PIPETBL_t * user_table, uint8_t * configdescriptor)
okini3939 1:0dac72ab5910 493 {
okini3939 1:0dac72ab5910 494 uint16_t ret;
okini3939 1:0dac72ab5910 495 uint32_t end_point;
okini3939 1:0dac72ab5910 496 uint32_t offset;
okini3939 1:0dac72ab5910 497 uint32_t totalLength;
okini3939 1:0dac72ab5910 498 USB_HOST_CFG_PIPETBL_t * pipe_table;
okini3939 1:0dac72ab5910 499
okini3939 1:0dac72ab5910 500 /* End Point Search */
okini3939 1:0dac72ab5910 501 end_point = 0;
okini3939 1:0dac72ab5910 502 offset = configdescriptor[0];
okini3939 1:0dac72ab5910 503 totalLength = (uint16_t)(configdescriptor[2] + ((uint16_t)configdescriptor[3] << 8));
okini3939 1:0dac72ab5910 504
okini3939 1:0dac72ab5910 505 do
okini3939 1:0dac72ab5910 506 {
okini3939 1:0dac72ab5910 507 if (configdescriptor[offset + 1] == USB_HOST_ENDPOINT_DESC)
okini3939 1:0dac72ab5910 508 {
okini3939 1:0dac72ab5910 509 pipe_table = &user_table[end_point];
okini3939 1:0dac72ab5910 510
okini3939 1:0dac72ab5910 511 if (pipe_table->pipe_number == 0xffff)
okini3939 1:0dac72ab5910 512 {
okini3939 1:0dac72ab5910 513 break;
okini3939 1:0dac72ab5910 514 }
okini3939 1:0dac72ab5910 515
okini3939 1:0dac72ab5910 516 ret = usb0_api_host_SetEndpointTable(devadr, pipe_table, (uint8_t *)&configdescriptor[offset]);
okini3939 1:0dac72ab5910 517
okini3939 1:0dac72ab5910 518 if ((ret != USB_HOST_PIPE_IN) && (ret != USB_HOST_PIPE_OUT))
okini3939 1:0dac72ab5910 519 {
okini3939 1:0dac72ab5910 520 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 521 }
okini3939 1:0dac72ab5910 522
okini3939 1:0dac72ab5910 523 ++end_point;
okini3939 1:0dac72ab5910 524 }
okini3939 1:0dac72ab5910 525
okini3939 1:0dac72ab5910 526 /* Next End Point Search */
okini3939 1:0dac72ab5910 527 offset += configdescriptor[offset];
okini3939 1:0dac72ab5910 528
okini3939 1:0dac72ab5910 529 } while (offset < totalLength);
okini3939 1:0dac72ab5910 530
okini3939 1:0dac72ab5910 531 return DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 532 }
okini3939 1:0dac72ab5910 533
okini3939 1:0dac72ab5910 534 /*******************************************************************************
okini3939 1:0dac72ab5910 535 * Function Name: usb0_api_host_clear_endpoint
okini3939 1:0dac72ab5910 536 * Description : Clears the pipe definition table specified in the argument.
okini3939 1:0dac72ab5910 537 * Arguments : USB_HOST_CFG_PIPETBL_t *user_table : pipe table
okini3939 1:0dac72ab5910 538 * Return Value : DEVDRV_SUCCESS ; success
okini3939 1:0dac72ab5910 539 * : DEVDRV_ERROR ; error
okini3939 1:0dac72ab5910 540 *******************************************************************************/
okini3939 1:0dac72ab5910 541 int32_t usb0_api_host_clear_endpoint (USB_HOST_CFG_PIPETBL_t * user_table)
okini3939 1:0dac72ab5910 542 {
okini3939 1:0dac72ab5910 543 uint16_t pipe;
okini3939 1:0dac72ab5910 544
okini3939 1:0dac72ab5910 545 for (pipe = USB_HOST_PIPE0; pipe <= USB_HOST_MAX_PIPE_NO; ++pipe)
okini3939 1:0dac72ab5910 546 {
okini3939 1:0dac72ab5910 547 if (user_table->pipe_number == 0xffff)
okini3939 1:0dac72ab5910 548 {
okini3939 1:0dac72ab5910 549 break;
okini3939 1:0dac72ab5910 550 }
okini3939 1:0dac72ab5910 551 user_table->pipe_cfg &= (USB_HOST_DBLBFIELD | USB_HOST_CNTMDFIELD);
okini3939 1:0dac72ab5910 552 user_table->pipe_max_pktsize = 0;
okini3939 1:0dac72ab5910 553 user_table->pipe_cycle = 0;
okini3939 1:0dac72ab5910 554
okini3939 1:0dac72ab5910 555 user_table++;
okini3939 1:0dac72ab5910 556 }
okini3939 1:0dac72ab5910 557
okini3939 1:0dac72ab5910 558 return DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 559 }
okini3939 1:0dac72ab5910 560
okini3939 1:0dac72ab5910 561 /*******************************************************************************
okini3939 1:0dac72ab5910 562 * Function Name: usb0_api_host_clear_endpoint_pipe
okini3939 1:0dac72ab5910 563 * Description : Clears the pipe definition table specified in the argument.
okini3939 1:0dac72ab5910 564 * Arguments : uint16_t pipe_sel : Pipe Number
okini3939 1:0dac72ab5910 565 * : USB_HOST_CFG_PIPETBL_t *user_table : pipe table
okini3939 1:0dac72ab5910 566 * Return Value : DEVDRV_SUCCESS ; success
okini3939 1:0dac72ab5910 567 * : DEVDRV_ERROR ; error
okini3939 1:0dac72ab5910 568 *******************************************************************************/
okini3939 1:0dac72ab5910 569 int32_t usb0_api_host_clear_endpoint_pipe (uint16_t pipe_sel, USB_HOST_CFG_PIPETBL_t * user_table)
okini3939 1:0dac72ab5910 570 {
okini3939 1:0dac72ab5910 571 uint16_t pipe;
okini3939 1:0dac72ab5910 572
okini3939 1:0dac72ab5910 573 for (pipe = USB_HOST_PIPE0; pipe <= USB_HOST_MAX_PIPE_NO; ++pipe)
okini3939 1:0dac72ab5910 574 {
okini3939 1:0dac72ab5910 575 if (user_table->pipe_number == 0xffff)
okini3939 1:0dac72ab5910 576 {
okini3939 1:0dac72ab5910 577 break;
okini3939 1:0dac72ab5910 578 }
okini3939 1:0dac72ab5910 579
okini3939 1:0dac72ab5910 580 if (user_table->pipe_number == pipe_sel)
okini3939 1:0dac72ab5910 581 {
okini3939 1:0dac72ab5910 582 user_table->pipe_cfg &= (USB_HOST_DBLBFIELD | USB_HOST_CNTMDFIELD);
okini3939 1:0dac72ab5910 583 user_table->pipe_max_pktsize = 0;
okini3939 1:0dac72ab5910 584 user_table->pipe_cycle = 0;
okini3939 1:0dac72ab5910 585 break;
okini3939 1:0dac72ab5910 586 }
okini3939 1:0dac72ab5910 587
okini3939 1:0dac72ab5910 588 user_table++;
okini3939 1:0dac72ab5910 589 }
okini3939 1:0dac72ab5910 590
okini3939 1:0dac72ab5910 591 return DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 592 }
okini3939 1:0dac72ab5910 593 #endif
okini3939 1:0dac72ab5910 594
okini3939 1:0dac72ab5910 595 /*******************************************************************************
okini3939 1:0dac72ab5910 596 * Function Name: usb0_api_host_SetEndpointTable
okini3939 1:0dac72ab5910 597 * Description : Sets the end point on the information specified by the argument.
okini3939 1:0dac72ab5910 598 * Arguments : uint16_t devadr : device address
okini3939 1:0dac72ab5910 599 * : USB_HOST_CFG_PIPETBL_t *user_table : pipe table
okini3939 1:0dac72ab5910 600 * : uint8_t *Table : Endpoint descriptor
okini3939 1:0dac72ab5910 601 * Return Value : USB_HOST_DIR_H_IN ; IN endpoint
okini3939 1:0dac72ab5910 602 * : USB_HOST_DIR_H_OUT ; OUT endpoint
okini3939 1:0dac72ab5910 603 * : USB_END_POINT_ERROR ; error
okini3939 1:0dac72ab5910 604 *******************************************************************************/
okini3939 1:0dac72ab5910 605 uint16_t usb0_api_host_SetEndpointTable (uint16_t devadr, USB_HOST_CFG_PIPETBL_t * user_table, uint8_t * Table)
okini3939 1:0dac72ab5910 606 {
okini3939 1:0dac72ab5910 607 uint16_t PipeCfg;
okini3939 1:0dac72ab5910 608 uint16_t PipeMaxp;
okini3939 1:0dac72ab5910 609 uint16_t pipe_number;
okini3939 1:0dac72ab5910 610 uint16_t ret;
okini3939 1:0dac72ab5910 611 uint16_t ret_flag = 0; // avoid warning.
okini3939 1:0dac72ab5910 612
okini3939 1:0dac72ab5910 613 pipe_number = user_table->pipe_number;
okini3939 1:0dac72ab5910 614
okini3939 1:0dac72ab5910 615 if (Table[1] != USB_HOST_ENDPOINT_DESC)
okini3939 1:0dac72ab5910 616 {
okini3939 1:0dac72ab5910 617 return USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 618 }
okini3939 1:0dac72ab5910 619
okini3939 1:0dac72ab5910 620 switch (Table[3] & USB_HOST_EP_TYPE)
okini3939 1:0dac72ab5910 621 {
okini3939 1:0dac72ab5910 622 case USB_HOST_EP_CNTRL:
okini3939 1:0dac72ab5910 623 ret_flag = USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 624 break;
okini3939 1:0dac72ab5910 625
okini3939 1:0dac72ab5910 626 case USB_HOST_EP_ISO:
okini3939 1:0dac72ab5910 627 if ((pipe_number != USB_HOST_PIPE1) && (pipe_number != USB_HOST_PIPE2))
okini3939 1:0dac72ab5910 628 {
okini3939 1:0dac72ab5910 629 return USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 630 }
okini3939 1:0dac72ab5910 631
okini3939 1:0dac72ab5910 632 PipeCfg = USB_HOST_ISO;
okini3939 1:0dac72ab5910 633 break;
okini3939 1:0dac72ab5910 634
okini3939 1:0dac72ab5910 635 case USB_HOST_EP_BULK:
okini3939 1:0dac72ab5910 636 if ((pipe_number < USB_HOST_PIPE1) || (pipe_number > USB_HOST_PIPE5))
okini3939 1:0dac72ab5910 637 {
okini3939 1:0dac72ab5910 638 return USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 639 }
okini3939 1:0dac72ab5910 640
okini3939 1:0dac72ab5910 641 PipeCfg = USB_HOST_BULK;
okini3939 1:0dac72ab5910 642 break;
okini3939 1:0dac72ab5910 643
okini3939 1:0dac72ab5910 644 case USB_HOST_EP_INT:
okini3939 1:0dac72ab5910 645 if ((pipe_number < USB_HOST_PIPE6) || (pipe_number > USB_HOST_PIPE9))
okini3939 1:0dac72ab5910 646 {
okini3939 1:0dac72ab5910 647 return USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 648 }
okini3939 1:0dac72ab5910 649
okini3939 1:0dac72ab5910 650 PipeCfg = USB_HOST_INTERRUPT;
okini3939 1:0dac72ab5910 651 break;
okini3939 1:0dac72ab5910 652
okini3939 1:0dac72ab5910 653 default:
okini3939 1:0dac72ab5910 654 ret_flag = USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 655 break;
okini3939 1:0dac72ab5910 656 }
okini3939 1:0dac72ab5910 657
okini3939 1:0dac72ab5910 658 if (ret_flag == USB_END_POINT_ERROR)
okini3939 1:0dac72ab5910 659 {
okini3939 1:0dac72ab5910 660 return ret_flag;
okini3939 1:0dac72ab5910 661 }
okini3939 1:0dac72ab5910 662
okini3939 1:0dac72ab5910 663 /* Set pipe configuration table */
okini3939 1:0dac72ab5910 664 if ((Table[2] & USB_HOST_EP_DIR_MASK) == USB_HOST_EP_IN) /* IN(receive) */
okini3939 1:0dac72ab5910 665 {
okini3939 1:0dac72ab5910 666 if (PipeCfg == USB_HOST_ISO)
okini3939 1:0dac72ab5910 667 {
okini3939 1:0dac72ab5910 668 /* Transfer Type is ISO*/
okini3939 1:0dac72ab5910 669 PipeCfg |= USB_HOST_DIR_H_IN;
okini3939 1:0dac72ab5910 670
okini3939 1:0dac72ab5910 671 switch (user_table->fifo_port)
okini3939 1:0dac72ab5910 672 {
okini3939 1:0dac72ab5910 673 case USB_HOST_CUSE:
okini3939 1:0dac72ab5910 674 case USB_HOST_D0USE:
okini3939 1:0dac72ab5910 675 case USB_HOST_D1USE:
okini3939 1:0dac72ab5910 676 case USB_HOST_D0DMA:
okini3939 1:0dac72ab5910 677 case USB_HOST_D1DMA:
okini3939 1:0dac72ab5910 678 PipeCfg |= (uint16_t)(user_table->pipe_cfg & USB_HOST_DBLBFIELD);
okini3939 1:0dac72ab5910 679 break;
okini3939 1:0dac72ab5910 680
okini3939 1:0dac72ab5910 681 default:
okini3939 1:0dac72ab5910 682 ret_flag = USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 683 break;
okini3939 1:0dac72ab5910 684 }
okini3939 1:0dac72ab5910 685
okini3939 1:0dac72ab5910 686 if (ret_flag == USB_END_POINT_ERROR)
okini3939 1:0dac72ab5910 687 {
okini3939 1:0dac72ab5910 688 return ret_flag;
okini3939 1:0dac72ab5910 689 }
okini3939 1:0dac72ab5910 690 }
okini3939 1:0dac72ab5910 691 else
okini3939 1:0dac72ab5910 692 {
okini3939 1:0dac72ab5910 693 /* Transfer Type is BULK or INT */
okini3939 1:0dac72ab5910 694 PipeCfg |= (USB_HOST_SHTNAKON | USB_HOST_DIR_H_IN); /* Compulsory SHTNAK */
okini3939 1:0dac72ab5910 695
okini3939 1:0dac72ab5910 696 switch (user_table->fifo_port)
okini3939 1:0dac72ab5910 697 {
okini3939 1:0dac72ab5910 698 case USB_HOST_CUSE:
okini3939 1:0dac72ab5910 699 case USB_HOST_D0USE:
okini3939 1:0dac72ab5910 700 case USB_HOST_D1USE:
okini3939 1:0dac72ab5910 701 PipeCfg |= (uint16_t)(user_table->pipe_cfg & (USB_HOST_DBLBFIELD | USB_HOST_CNTMDFIELD));
okini3939 1:0dac72ab5910 702 break;
okini3939 1:0dac72ab5910 703
okini3939 1:0dac72ab5910 704 case USB_HOST_D0DMA:
okini3939 1:0dac72ab5910 705 case USB_HOST_D1DMA:
okini3939 1:0dac72ab5910 706 PipeCfg |= (uint16_t)(user_table->pipe_cfg & (USB_HOST_DBLBFIELD | USB_HOST_CNTMDFIELD));
okini3939 1:0dac72ab5910 707 #ifdef __USB_DMA_BFRE_ENABLE__
okini3939 1:0dac72ab5910 708 /* this routine cannnot be perfomred if read operation is executed in buffer size */
okini3939 1:0dac72ab5910 709 PipeCfg |= USB_HOST_BFREON;
okini3939 1:0dac72ab5910 710 #endif
okini3939 1:0dac72ab5910 711 break;
okini3939 1:0dac72ab5910 712
okini3939 1:0dac72ab5910 713 default:
okini3939 1:0dac72ab5910 714 ret_flag = USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 715 break;
okini3939 1:0dac72ab5910 716 }
okini3939 1:0dac72ab5910 717
okini3939 1:0dac72ab5910 718 if (ret_flag == USB_END_POINT_ERROR)
okini3939 1:0dac72ab5910 719 {
okini3939 1:0dac72ab5910 720 return ret_flag;
okini3939 1:0dac72ab5910 721 }
okini3939 1:0dac72ab5910 722 }
okini3939 1:0dac72ab5910 723 ret = USB_HOST_PIPE_IN;
okini3939 1:0dac72ab5910 724 }
okini3939 1:0dac72ab5910 725 else /* OUT(send) */
okini3939 1:0dac72ab5910 726 {
okini3939 1:0dac72ab5910 727 if (PipeCfg == USB_HOST_ISO)
okini3939 1:0dac72ab5910 728 {
okini3939 1:0dac72ab5910 729 /* Transfer Type is ISO*/
okini3939 1:0dac72ab5910 730 PipeCfg |= (uint16_t)(user_table->pipe_cfg & USB_HOST_DBLBFIELD);
okini3939 1:0dac72ab5910 731 }
okini3939 1:0dac72ab5910 732 else
okini3939 1:0dac72ab5910 733 {
okini3939 1:0dac72ab5910 734 /* Transfer Type is BULK or INT */
okini3939 1:0dac72ab5910 735 PipeCfg |= (uint16_t)(user_table->pipe_cfg & (USB_HOST_DBLBFIELD | USB_HOST_CNTMDFIELD));
okini3939 1:0dac72ab5910 736 }
okini3939 1:0dac72ab5910 737 PipeCfg |= USB_HOST_DIR_H_OUT;
okini3939 1:0dac72ab5910 738 ret = USB_HOST_PIPE_OUT;
okini3939 1:0dac72ab5910 739 }
okini3939 1:0dac72ab5910 740
okini3939 1:0dac72ab5910 741 switch (user_table->fifo_port)
okini3939 1:0dac72ab5910 742 {
okini3939 1:0dac72ab5910 743 case USB_HOST_CUSE:
okini3939 1:0dac72ab5910 744 g_usb0_host_PipeTbl[pipe_number] = (uint16_t)USB_HOST_CFIFO_USE;
okini3939 1:0dac72ab5910 745 break;
okini3939 1:0dac72ab5910 746
okini3939 1:0dac72ab5910 747 case USB_HOST_D0USE:
okini3939 1:0dac72ab5910 748 g_usb0_host_PipeTbl[pipe_number] = (uint16_t)USB_HOST_D0FIFO_USE;
okini3939 1:0dac72ab5910 749 break;
okini3939 1:0dac72ab5910 750
okini3939 1:0dac72ab5910 751 case USB_HOST_D1USE:
okini3939 1:0dac72ab5910 752 g_usb0_host_PipeTbl[pipe_number] = (uint16_t)USB_HOST_D1FIFO_USE;
okini3939 1:0dac72ab5910 753 break;
okini3939 1:0dac72ab5910 754
okini3939 1:0dac72ab5910 755 case USB_HOST_D0DMA:
okini3939 1:0dac72ab5910 756 g_usb0_host_PipeTbl[pipe_number] = (uint16_t)USB_HOST_D0FIFO_DMA;
okini3939 1:0dac72ab5910 757 break;
okini3939 1:0dac72ab5910 758
okini3939 1:0dac72ab5910 759 case USB_HOST_D1DMA:
okini3939 1:0dac72ab5910 760 g_usb0_host_PipeTbl[pipe_number] = (uint16_t)USB_HOST_D1FIFO_DMA;
okini3939 1:0dac72ab5910 761 break;
okini3939 1:0dac72ab5910 762
okini3939 1:0dac72ab5910 763 default:
okini3939 1:0dac72ab5910 764 ret_flag = USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 765 break;
okini3939 1:0dac72ab5910 766 }
okini3939 1:0dac72ab5910 767
okini3939 1:0dac72ab5910 768 if (ret_flag == USB_END_POINT_ERROR)
okini3939 1:0dac72ab5910 769 {
okini3939 1:0dac72ab5910 770 return ret_flag;
okini3939 1:0dac72ab5910 771 }
okini3939 1:0dac72ab5910 772
okini3939 1:0dac72ab5910 773 /* Endpoint number set */
okini3939 1:0dac72ab5910 774 PipeCfg |= (uint16_t)(Table[2] & USB_HOST_EP_NUM_MASK);
okini3939 1:0dac72ab5910 775 g_usb0_host_PipeTbl[pipe_number] |= (uint16_t)(Table[2] & USB_HOST_EP_NUM_MASK);
okini3939 1:0dac72ab5910 776
okini3939 1:0dac72ab5910 777 /* Max packet size set */
okini3939 1:0dac72ab5910 778 PipeMaxp = (uint16_t)((uint16_t)Table[4] | (uint16_t)((uint16_t)Table[5] << 8));
okini3939 1:0dac72ab5910 779
okini3939 1:0dac72ab5910 780 if (PipeMaxp == 0u)
okini3939 1:0dac72ab5910 781 {
okini3939 1:0dac72ab5910 782 return USB_END_POINT_ERROR;
okini3939 1:0dac72ab5910 783 }
okini3939 1:0dac72ab5910 784
okini3939 1:0dac72ab5910 785 /* Set device address */
okini3939 1:0dac72ab5910 786 PipeMaxp |= (uint16_t)(devadr << 12);
okini3939 1:0dac72ab5910 787
okini3939 1:0dac72ab5910 788 user_table->pipe_cfg = PipeCfg;
okini3939 1:0dac72ab5910 789 user_table->pipe_max_pktsize = PipeMaxp;
okini3939 1:0dac72ab5910 790
okini3939 1:0dac72ab5910 791 usb0_host_resetEP(user_table);
okini3939 1:0dac72ab5910 792
okini3939 1:0dac72ab5910 793 return ret;
okini3939 1:0dac72ab5910 794 }
okini3939 1:0dac72ab5910 795
okini3939 1:0dac72ab5910 796 /*******************************************************************************
okini3939 1:0dac72ab5910 797 * Function Name: usb0_host_resetEP
okini3939 1:0dac72ab5910 798 * Description : Sets the end point on the information specified by the argument.
okini3939 1:0dac72ab5910 799 * Arguments : USB_HOST_CFG_PIPETBL_t *tbl : pipe table
okini3939 1:0dac72ab5910 800 * Return Value : none
okini3939 1:0dac72ab5910 801 *******************************************************************************/
okini3939 1:0dac72ab5910 802 static void usb0_host_resetEP (USB_HOST_CFG_PIPETBL_t * tbl)
okini3939 1:0dac72ab5910 803 {
okini3939 1:0dac72ab5910 804
okini3939 1:0dac72ab5910 805 uint16_t pipe;
okini3939 1:0dac72ab5910 806
okini3939 1:0dac72ab5910 807 /* Host pipe */
okini3939 1:0dac72ab5910 808 /* The pipe number of pipe definition table is obtained */
okini3939 1:0dac72ab5910 809 pipe = (uint16_t)(tbl->pipe_number & USB_HOST_BITCURPIPE); /* Pipe Number */
okini3939 1:0dac72ab5910 810
okini3939 1:0dac72ab5910 811 /* FIFO port access pipe is set to initial value */
okini3939 1:0dac72ab5910 812 /* The connection with FIFO should be cut before setting the pipe */
okini3939 1:0dac72ab5910 813 if (RZA_IO_RegRead_16(&USB200.CFIFOSEL,
okini3939 1:0dac72ab5910 814 USB_CFIFOSEL_CURPIPE_SHIFT,
okini3939 1:0dac72ab5910 815 USB_CFIFOSEL_CURPIPE) == pipe)
okini3939 1:0dac72ab5910 816 {
okini3939 1:0dac72ab5910 817 usb0_host_change_fifo_port(USB_HOST_PIPE0, USB_HOST_CUSE, USB_HOST_NO, USB_HOST_BITMBW_16);
okini3939 1:0dac72ab5910 818 }
okini3939 1:0dac72ab5910 819
okini3939 1:0dac72ab5910 820 if (RZA_IO_RegRead_16(&USB200.D0FIFOSEL,
okini3939 1:0dac72ab5910 821 USB_DnFIFOSEL_CURPIPE_SHIFT,
okini3939 1:0dac72ab5910 822 USB_DnFIFOSEL_CURPIPE) == pipe)
okini3939 1:0dac72ab5910 823 {
okini3939 1:0dac72ab5910 824 usb0_host_change_fifo_port(USB_HOST_PIPE0, USB_HOST_D0USE, USB_HOST_NO, USB_HOST_BITMBW_16);
okini3939 1:0dac72ab5910 825 }
okini3939 1:0dac72ab5910 826
okini3939 1:0dac72ab5910 827 if (RZA_IO_RegRead_16(&USB200.D1FIFOSEL,
okini3939 1:0dac72ab5910 828 USB_DnFIFOSEL_CURPIPE_SHIFT,
okini3939 1:0dac72ab5910 829 USB_DnFIFOSEL_CURPIPE) == pipe)
okini3939 1:0dac72ab5910 830 {
okini3939 1:0dac72ab5910 831 usb0_host_change_fifo_port(USB_HOST_PIPE0, USB_HOST_D1USE, USB_HOST_NO, USB_HOST_BITMBW_16);
okini3939 1:0dac72ab5910 832 }
okini3939 1:0dac72ab5910 833
okini3939 1:0dac72ab5910 834 /* Interrupt of pipe set is disabled */
okini3939 1:0dac72ab5910 835 usb0_host_disable_brdy_int(pipe);
okini3939 1:0dac72ab5910 836 usb0_host_disable_nrdy_int(pipe);
okini3939 1:0dac72ab5910 837 usb0_host_disable_bemp_int(pipe);
okini3939 1:0dac72ab5910 838
okini3939 1:0dac72ab5910 839 /* Pipe to set is set to NAK */
okini3939 1:0dac72ab5910 840 usb0_host_set_pid_nak(pipe);
okini3939 1:0dac72ab5910 841
okini3939 1:0dac72ab5910 842 /* Pipe is set */
okini3939 1:0dac72ab5910 843 USB200.PIPESEL = pipe;
okini3939 1:0dac72ab5910 844
okini3939 1:0dac72ab5910 845 USB200.PIPECFG = tbl->pipe_cfg;
okini3939 1:0dac72ab5910 846 USB200.PIPEBUF = tbl->pipe_buf;
okini3939 1:0dac72ab5910 847 USB200.PIPEMAXP = tbl->pipe_max_pktsize;
okini3939 1:0dac72ab5910 848 USB200.PIPEPERI = tbl->pipe_cycle;
okini3939 1:0dac72ab5910 849
okini3939 1:0dac72ab5910 850 g_usb0_host_pipecfg[pipe] = tbl->pipe_cfg;
okini3939 1:0dac72ab5910 851 g_usb0_host_pipebuf[pipe] = tbl->pipe_buf;
okini3939 1:0dac72ab5910 852 g_usb0_host_pipemaxp[pipe] = tbl->pipe_max_pktsize;
okini3939 1:0dac72ab5910 853 g_usb0_host_pipeperi[pipe] = tbl->pipe_cycle;
okini3939 1:0dac72ab5910 854
okini3939 1:0dac72ab5910 855 /* Sequence bit clear */
okini3939 1:0dac72ab5910 856 usb0_host_set_sqclr(pipe);
okini3939 1:0dac72ab5910 857
okini3939 1:0dac72ab5910 858 usb0_host_aclrm(pipe);
okini3939 1:0dac72ab5910 859 usb0_host_set_csclr(pipe);
okini3939 1:0dac72ab5910 860
okini3939 1:0dac72ab5910 861 /* Pipe window selection is set to unused */
okini3939 1:0dac72ab5910 862 USB200.PIPESEL = USB_HOST_PIPE0;
okini3939 1:0dac72ab5910 863
okini3939 1:0dac72ab5910 864 }
okini3939 1:0dac72ab5910 865
okini3939 1:0dac72ab5910 866 #if(1) /* ohci_wrapp */
okini3939 1:0dac72ab5910 867 #else
okini3939 1:0dac72ab5910 868 /*******************************************************************************
okini3939 1:0dac72ab5910 869 * Function Name: usb0_api_host_data_count
okini3939 1:0dac72ab5910 870 * Description : Get g_usb0_host_data_count[pipe]
okini3939 1:0dac72ab5910 871 * Arguments : uint16_t pipe ; Pipe Number
okini3939 1:0dac72ab5910 872 * : uint32_t *data_count ; return g_usb0_data_count[pipe]
okini3939 1:0dac72ab5910 873 * Return Value : DEVDRV_SUCCESS ; success
okini3939 1:0dac72ab5910 874 * : DEVDRV_ERROR ; error
okini3939 1:0dac72ab5910 875 *******************************************************************************/
okini3939 1:0dac72ab5910 876 int32_t usb0_api_host_data_count (uint16_t pipe, uint32_t * data_count)
okini3939 1:0dac72ab5910 877 {
okini3939 1:0dac72ab5910 878 if (pipe > USB_HOST_MAX_PIPE_NO)
okini3939 1:0dac72ab5910 879 {
okini3939 1:0dac72ab5910 880 return DEVDRV_ERROR;
okini3939 1:0dac72ab5910 881 }
okini3939 1:0dac72ab5910 882
okini3939 1:0dac72ab5910 883 *data_count = g_usb0_host_PipeDataSize[pipe];
okini3939 1:0dac72ab5910 884
okini3939 1:0dac72ab5910 885 return DEVDRV_SUCCESS;
okini3939 1:0dac72ab5910 886 }
okini3939 1:0dac72ab5910 887 #endif
okini3939 1:0dac72ab5910 888
okini3939 1:0dac72ab5910 889 /* End of File */