SDHI_driver patch (mbedOS 5.11.5)

Committer:
tvendov
Date:
Fri Mar 29 19:47:34 2019 +0200
Revision:
2:7c75ab32d7c9
Fix: Folder structure changed. All SD Auto tests pass with OK!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tvendov 2:7c75ab32d7c9 1 /*******************************************************************************
tvendov 2:7c75ab32d7c9 2 * DISCLAIMER
tvendov 2:7c75ab32d7c9 3 * This software is supplied by Renesas Electronics Corporation and is only
tvendov 2:7c75ab32d7c9 4 * intended for use with Renesas products. No other uses are authorized. This
tvendov 2:7c75ab32d7c9 5 * software is owned by Renesas Electronics Corporation and is protected under
tvendov 2:7c75ab32d7c9 6 * all applicable laws, including copyright laws.
tvendov 2:7c75ab32d7c9 7 * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
tvendov 2:7c75ab32d7c9 8 * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
tvendov 2:7c75ab32d7c9 9 * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
tvendov 2:7c75ab32d7c9 10 * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
tvendov 2:7c75ab32d7c9 11 * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
tvendov 2:7c75ab32d7c9 12 * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
tvendov 2:7c75ab32d7c9 13 * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
tvendov 2:7c75ab32d7c9 14 * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
tvendov 2:7c75ab32d7c9 15 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
tvendov 2:7c75ab32d7c9 16 * Renesas reserves the right, without notice, to make changes to this software
tvendov 2:7c75ab32d7c9 17 * and to discontinue the availability of this software. By using this software,
tvendov 2:7c75ab32d7c9 18 * you agree to the additional terms and conditions found by accessing the
tvendov 2:7c75ab32d7c9 19 * following link:
tvendov 2:7c75ab32d7c9 20 * http://www.renesas.com/disclaimer
tvendov 2:7c75ab32d7c9 21 *
tvendov 2:7c75ab32d7c9 22 * Copyright (C) 2013 Renesas Electronics Corporation. All rights reserved.
tvendov 2:7c75ab32d7c9 23 *******************************************************************************/
tvendov 2:7c75ab32d7c9 24 /*******************************************************************************
tvendov 2:7c75ab32d7c9 25 * File Name : sd_dev_low.c
tvendov 2:7c75ab32d7c9 26 * $Rev: $
tvendov 2:7c75ab32d7c9 27 * $Date:: $
tvendov 2:7c75ab32d7c9 28 * Device(s) : RZ/A1H
tvendov 2:7c75ab32d7c9 29 * Tool-Chain : DS-5 Ver 5.8
tvendov 2:7c75ab32d7c9 30 * : ARM Complier
tvendov 2:7c75ab32d7c9 31 * OS :
tvendov 2:7c75ab32d7c9 32 * H/W Platform : RZ/A1H CPU Board
tvendov 2:7c75ab32d7c9 33 * Description : RZ/A1H SD Driver Sample Program
tvendov 2:7c75ab32d7c9 34 * Operation :
tvendov 2:7c75ab32d7c9 35 * Limitations :
tvendov 2:7c75ab32d7c9 36 *******************************************************************************/
tvendov 2:7c75ab32d7c9 37
tvendov 2:7c75ab32d7c9 38
tvendov 2:7c75ab32d7c9 39 /******************************************************************************
tvendov 2:7c75ab32d7c9 40 Includes <System Includes> , "Project Includes"
tvendov 2:7c75ab32d7c9 41 ******************************************************************************/
tvendov 2:7c75ab32d7c9 42 #include <stdio.h>
tvendov 2:7c75ab32d7c9 43 #include <string.h>
tvendov 2:7c75ab32d7c9 44 #include "r_typedefs.h"
tvendov 2:7c75ab32d7c9 45 #include "iodefine.h"
tvendov 2:7c75ab32d7c9 46 #include "rza_io_regrw.h"
tvendov 2:7c75ab32d7c9 47 /*#include "devdrv_intc.h"*/
tvendov 2:7c75ab32d7c9 48 #include "sdif.h"
tvendov 2:7c75ab32d7c9 49 #include "sd_cfg.h"
tvendov 2:7c75ab32d7c9 50 /*#include "sd_dev_dmacdrv.h"*/
tvendov 2:7c75ab32d7c9 51 #include "us_ticker_api.h"
tvendov 2:7c75ab32d7c9 52 #include "cmsis_os2.h"
tvendov 2:7c75ab32d7c9 53 #include "mbed_assert.h"
tvendov 2:7c75ab32d7c9 54 #include "pinmap.h"
tvendov 2:7c75ab32d7c9 55
tvendov 2:7c75ab32d7c9 56
tvendov 2:7c75ab32d7c9 57 /******************************************************************************
tvendov 2:7c75ab32d7c9 58 Typedef definitions
tvendov 2:7c75ab32d7c9 59 ******************************************************************************/
tvendov 2:7c75ab32d7c9 60
tvendov 2:7c75ab32d7c9 61
tvendov 2:7c75ab32d7c9 62 /******************************************************************************
tvendov 2:7c75ab32d7c9 63 Macro definitions
tvendov 2:7c75ab32d7c9 64 ******************************************************************************/
tvendov 2:7c75ab32d7c9 65 //#define MTU_TIMER_CNT 32 /* P-phy = 32MHz */
tvendov 2:7c75ab32d7c9 66 #define INT_LEVEL_SDHI 10 /* SDHI interrupt level */
tvendov 2:7c75ab32d7c9 67 #define SDHI_PINS_COMMON 2
tvendov 2:7c75ab32d7c9 68 #define SDHI_PINS_SERIAL 3
tvendov 2:7c75ab32d7c9 69 #define SDHI_PINS_PARALLEL 6
tvendov 2:7c75ab32d7c9 70
tvendov 2:7c75ab32d7c9 71 #if defined(SDCFG_SDMODE_1BIT)
tvendov 2:7c75ab32d7c9 72 # define SDHI_PORT_MODE SD_PORT_SERIAL
tvendov 2:7c75ab32d7c9 73 #else
tvendov 2:7c75ab32d7c9 74 # define SDHI_PORT_MODE SD_PORT_PARALLEL
tvendov 2:7c75ab32d7c9 75 #endif
tvendov 2:7c75ab32d7c9 76
tvendov 2:7c75ab32d7c9 77 /******************************************************************************
tvendov 2:7c75ab32d7c9 78 Imported global variables and functions (from other files)
tvendov 2:7c75ab32d7c9 79 ******************************************************************************/
tvendov 2:7c75ab32d7c9 80
tvendov 2:7c75ab32d7c9 81
tvendov 2:7c75ab32d7c9 82 /******************************************************************************
tvendov 2:7c75ab32d7c9 83 Exported global variables and functions (to be accessed by other files)
tvendov 2:7c75ab32d7c9 84 ******************************************************************************/
tvendov 2:7c75ab32d7c9 85
tvendov 2:7c75ab32d7c9 86
tvendov 2:7c75ab32d7c9 87 /******************************************************************************
tvendov 2:7c75ab32d7c9 88 Private global variables and functions
tvendov 2:7c75ab32d7c9 89 ******************************************************************************/
tvendov 2:7c75ab32d7c9 90 #if 0
tvendov 2:7c75ab32d7c9 91 static uint8_t g_sdhi_priority_backup;
tvendov 2:7c75ab32d7c9 92 #endif
tvendov 2:7c75ab32d7c9 93
tvendov 2:7c75ab32d7c9 94
tvendov 2:7c75ab32d7c9 95
tvendov 2:7c75ab32d7c9 96 static const PinName SDHIpin_Common[SDHI_COUNT][SDHI_PINS_COMMON] = { /* WP & CD */
tvendov 2:7c75ab32d7c9 97 #if defined(TARGET_VK_RZ_A1H)
tvendov 2:7c75ab32d7c9 98 {P4_8, P4_9},
tvendov 2:7c75ab32d7c9 99 {P3_8, P3_9}
tvendov 2:7c75ab32d7c9 100 #elif defined(TARGET_VK_RZ_A1LU)
tvendov 2:7c75ab32d7c9 101 {P3_6, P3_7},
tvendov 2:7c75ab32d7c9 102 {P7_1, P7_0}
tvendov 2:7c75ab32d7c9 103 #else
tvendov 2:7c75ab32d7c9 104 #error RZ_SDHI driver does not support this TARGET
tvendov 2:7c75ab32d7c9 105 #endif
tvendov 2:7c75ab32d7c9 106 };
tvendov 2:7c75ab32d7c9 107
tvendov 2:7c75ab32d7c9 108 static const PinName SDHIpin_serial[SDHI_COUNT][SDHI_PINS_SERIAL] = { /* CLK CMD D0 */
tvendov 2:7c75ab32d7c9 109 #if defined(TARGET_VK_RZ_A1H)
tvendov 2:7c75ab32d7c9 110 {P4_11, P4_12, P4_13},
tvendov 2:7c75ab32d7c9 111 {P3_11, P3_12, P3_13}
tvendov 2:7c75ab32d7c9 112 #elif defined(TARGET_VK_RZ_A1LU)
tvendov 2:7c75ab32d7c9 113 {P3_3, P3_2, P3_4},
tvendov 2:7c75ab32d7c9 114 {P7_4, P7_5, P7_3}
tvendov 2:7c75ab32d7c9 115 #else
tvendov 2:7c75ab32d7c9 116 #error RZ_SDHI driver does not support this TARGET
tvendov 2:7c75ab32d7c9 117 #endif
tvendov 2:7c75ab32d7c9 118 };
tvendov 2:7c75ab32d7c9 119
tvendov 2:7c75ab32d7c9 120 static const PinName SDHIpin_parallel[SDHI_COUNT][SDHI_PINS_PARALLEL] = { /* CLK CMD D0-D3 */
tvendov 2:7c75ab32d7c9 121 #if defined(TARGET_VK_RZ_A1H)
tvendov 2:7c75ab32d7c9 122 {P4_10, P4_11, P4_12, P4_13, P4_14, P4_15},
tvendov 2:7c75ab32d7c9 123 {P3_10, P3_11, P3_12, P3_13, P3_14, P3_15}
tvendov 2:7c75ab32d7c9 124 #elif defined(TARGET_VK_RZ_A1LU)
tvendov 2:7c75ab32d7c9 125 {P3_3, P3_2, P3_4, P3_5, P3_0, P3_1},
tvendov 2:7c75ab32d7c9 126 {P7_4, P7_5, P7_3, P7_2, P7_7, P7_6}
tvendov 2:7c75ab32d7c9 127 #else
tvendov 2:7c75ab32d7c9 128 #error RZ_SDHI driver does not support this TARGET
tvendov 2:7c75ab32d7c9 129 #endif
tvendov 2:7c75ab32d7c9 130 };
tvendov 2:7c75ab32d7c9 131
tvendov 2:7c75ab32d7c9 132
tvendov 2:7c75ab32d7c9 133 static const PinMap PinMap_SDHI_PIN[] = {
tvendov 2:7c75ab32d7c9 134 /* pin | periph| func */
tvendov 2:7c75ab32d7c9 135 #if defined(TARGET_VK_RZ_A1H)
tvendov 2:7c75ab32d7c9 136 {P4_8 , SDHI_0, 3}, /* SD_CD_0 */
tvendov 2:7c75ab32d7c9 137 {P4_9 , SDHI_0, 3}, /* SD_WP_0 */
tvendov 2:7c75ab32d7c9 138 {P4_10 , SDHI_0, 3}, /* SD_D1_0 */
tvendov 2:7c75ab32d7c9 139 {P4_11 , SDHI_0, 3}, /* SD_D0_0 */
tvendov 2:7c75ab32d7c9 140 {P4_12 , SDHI_0, 3}, /* SD_CLK_0 */
tvendov 2:7c75ab32d7c9 141 {P4_13 , SDHI_0, 3}, /* SD_CMD_0 */
tvendov 2:7c75ab32d7c9 142 {P4_14 , SDHI_0, 3}, /* SD_D3_0 */
tvendov 2:7c75ab32d7c9 143 {P4_15 , SDHI_0, 3}, /* SD_D2_0 */
tvendov 2:7c75ab32d7c9 144 /*----------------*/
tvendov 2:7c75ab32d7c9 145 {P3_8 , SDHI_1, 7}, /* SD_CD_1 */
tvendov 2:7c75ab32d7c9 146 {P3_9 , SDHI_1, 7}, /* SD_WP_1 */
tvendov 2:7c75ab32d7c9 147 {P3_10 , SDHI_1, 7}, /* SD_D1_1 */
tvendov 2:7c75ab32d7c9 148 {P3_11 , SDHI_1, 7}, /* SD_D0_1 */
tvendov 2:7c75ab32d7c9 149 {P3_12 , SDHI_1, 7}, /* SD_CLK_1 */
tvendov 2:7c75ab32d7c9 150 {P3_13 , SDHI_1, 7}, /* SD_CMD_1 */
tvendov 2:7c75ab32d7c9 151 {P3_14 , SDHI_1, 7}, /* SD_D3_1 */
tvendov 2:7c75ab32d7c9 152 {P3_15 , SDHI_1, 7}, /* SD_D2_1 */
tvendov 2:7c75ab32d7c9 153 {NC , NC , 0}
tvendov 2:7c75ab32d7c9 154 #elif defined(TARGET_VK_RZ_A1LU)
tvendov 2:7c75ab32d7c9 155 //{P3_7 , SDHI_0, 2}, /* SD_CD_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 156 //{P3_6 , SDHI_0, 2}, /* SD_WP_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 157 //{P3_5 , SDHI_0, 2}, /* SD_D1_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 158 //{P3_4 , SDHI_0, 2}, /* SD_D0_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 159 //{P3_3 , SDHI_0, 2}, /* SD_CLK_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 160 //{P3_2 , SDHI_0, 2}, /* SD_CMD_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 161 //{P3_1 , SDHI_0, 2}, /* SD_D3_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 162 //{P3_0 , SDHI_0, 2}, /* SD_D2_0 can be used if SDRAM is not soldered */
tvendov 2:7c75ab32d7c9 163 /*----------------*/
tvendov 2:7c75ab32d7c9 164 {P7_0 , SDHI_1, 3}, /* SD_CD_1 */
tvendov 2:7c75ab32d7c9 165 {P7_1 , SDHI_1, 3}, /* SD_WP_1 */
tvendov 2:7c75ab32d7c9 166 {P7_2 , SDHI_1, 3}, /* SD_D1_1 */
tvendov 2:7c75ab32d7c9 167 {P7_3 , SDHI_1, 3}, /* SD_D0_1 */
tvendov 2:7c75ab32d7c9 168 {P7_4 , SDHI_1, 3}, /* SD_CLK_1 */
tvendov 2:7c75ab32d7c9 169 {P7_5 , SDHI_1, 3}, /* SD_CMD_1 */
tvendov 2:7c75ab32d7c9 170 {P7_6 , SDHI_1, 3}, /* SD_D3_1 */
tvendov 2:7c75ab32d7c9 171 {P7_7 , SDHI_1, 3}, /* SD_D2_1 */
tvendov 2:7c75ab32d7c9 172 {NC , NC , 0}
tvendov 2:7c75ab32d7c9 173 #else
tvendov 2:7c75ab32d7c9 174 #error RZ_SDHI driver does not support this TARGET
tvendov 2:7c75ab32d7c9 175 #endif
tvendov 2:7c75ab32d7c9 176 };
tvendov 2:7c75ab32d7c9 177
tvendov 2:7c75ab32d7c9 178
tvendov 2:7c75ab32d7c9 179
tvendov 2:7c75ab32d7c9 180 static unsigned long _ulStart = 0;
tvendov 2:7c75ab32d7c9 181 static unsigned long _ulDelta = 0;
tvendov 2:7c75ab32d7c9 182 static const ticker_data_t *_ticker;
tvendov 2:7c75ab32d7c9 183
tvendov 2:7c75ab32d7c9 184 //static int sddev_init_0(void);
tvendov 2:7c75ab32d7c9 185 //static int sddev_init_1(void);
tvendov 2:7c75ab32d7c9 186 //static int sddev_set_port_0(int mode);
tvendov 2:7c75ab32d7c9 187 //static int sddev_set_port_1(int mode);
tvendov 2:7c75ab32d7c9 188
tvendov 2:7c75ab32d7c9 189 static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 2:7c75ab32d7c9 190 static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 2:7c75ab32d7c9 191
tvendov 2:7c75ab32d7c9 192 static int sddev_wait_dma_end_0(long cnt);
tvendov 2:7c75ab32d7c9 193 static int sddev_wait_dma_end_1(long cnt);
tvendov 2:7c75ab32d7c9 194
tvendov 2:7c75ab32d7c9 195 static int sddev_disable_dma_0(void);
tvendov 2:7c75ab32d7c9 196 static int sddev_disable_dma_1(void);
tvendov 2:7c75ab32d7c9 197
tvendov 2:7c75ab32d7c9 198 static void sddev_sd_int_handler_0(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 199 static void sddev_sd_int_handler_1(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 200 static void sddev_sdio_int_handler_0(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 201 static void sddev_sdio_int_handler_1(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 202 static void sddev_start_timer(int msec);
tvendov 2:7c75ab32d7c9 203 static void sddev_end_timer(void);
tvendov 2:7c75ab32d7c9 204 static int sddev_check_timer(void);
tvendov 2:7c75ab32d7c9 205
tvendov 2:7c75ab32d7c9 206 /******************************************************************************
tvendov 2:7c75ab32d7c9 207 * Function Name: int sddev_cmd0_sdio_mount(int sd_port);
tvendov 2:7c75ab32d7c9 208 * Description : Select to issue CMD0 before SDIO Mount
tvendov 2:7c75ab32d7c9 209 * Arguments : none
tvendov 2:7c75ab32d7c9 210 * Return Value : SD_OK : issue CMD0
tvendov 2:7c75ab32d7c9 211 * : SD_ERR : not issue CMD0
tvendov 2:7c75ab32d7c9 212 ******************************************************************************/
tvendov 2:7c75ab32d7c9 213 int sddev_cmd0_sdio_mount(int sd_port)
tvendov 2:7c75ab32d7c9 214 {
tvendov 2:7c75ab32d7c9 215 #ifdef SDCFG_IO
tvendov 2:7c75ab32d7c9 216 return SD_ERR;
tvendov 2:7c75ab32d7c9 217 #else
tvendov 2:7c75ab32d7c9 218 return SD_ERR;
tvendov 2:7c75ab32d7c9 219 #endif
tvendov 2:7c75ab32d7c9 220 }
tvendov 2:7c75ab32d7c9 221
tvendov 2:7c75ab32d7c9 222 /******************************************************************************
tvendov 2:7c75ab32d7c9 223 * Function Name: int sddev_cmd8_sdio_mount(int sd_port);
tvendov 2:7c75ab32d7c9 224 * Description : Select to issue CMD8 before SDIO Mount
tvendov 2:7c75ab32d7c9 225 * Arguments : none
tvendov 2:7c75ab32d7c9 226 * Return Value : SD_OK : issue CMD8
tvendov 2:7c75ab32d7c9 227 * : SD_ERR : not issue CMD8
tvendov 2:7c75ab32d7c9 228 ******************************************************************************/
tvendov 2:7c75ab32d7c9 229 int sddev_cmd8_sdio_mount(int sd_port)
tvendov 2:7c75ab32d7c9 230 {
tvendov 2:7c75ab32d7c9 231 #ifdef SDCFG_IO
tvendov 2:7c75ab32d7c9 232 return SD_OK;
tvendov 2:7c75ab32d7c9 233 #else
tvendov 2:7c75ab32d7c9 234 return SD_ERR;
tvendov 2:7c75ab32d7c9 235 #endif
tvendov 2:7c75ab32d7c9 236 }
tvendov 2:7c75ab32d7c9 237
tvendov 2:7c75ab32d7c9 238
tvendov 2:7c75ab32d7c9 239
tvendov 2:7c75ab32d7c9 240 /******************************************************************************
tvendov 2:7c75ab32d7c9 241 * Function Name: int sddev_init(void);
tvendov 2:7c75ab32d7c9 242 * Description : Initialize H/W to use SDHI
tvendov 2:7c75ab32d7c9 243 * Arguments : none
tvendov 2:7c75ab32d7c9 244 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 245 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 246 ******************************************************************************/
tvendov 2:7c75ab32d7c9 247 int sddev_init(int sd_port)
tvendov 2:7c75ab32d7c9 248 {
tvendov 2:7c75ab32d7c9 249 if ( sd_port >= SDHI_COUNT )
tvendov 2:7c75ab32d7c9 250 return SD_ERR;
tvendov 2:7c75ab32d7c9 251
tvendov 2:7c75ab32d7c9 252
tvendov 2:7c75ab32d7c9 253 volatile uint8_t dummy_buf;
tvendov 2:7c75ab32d7c9 254
tvendov 2:7c75ab32d7c9 255 CPG.STBCR12 = 0xF0u; /* [1], [1], [1], [1], SDHI00, SDHI01, SDHI10, SDHI11 */
tvendov 2:7c75ab32d7c9 256 dummy_buf = CPG.STBCR12; /* (Dummy read) */
tvendov 2:7c75ab32d7c9 257
tvendov 2:7c75ab32d7c9 258
tvendov 2:7c75ab32d7c9 259 for( uint32_t no=0; no < SDHI_PINS_COMMON; no++ )
tvendov 2:7c75ab32d7c9 260 {
tvendov 2:7c75ab32d7c9 261 if ( pinmap_peripheral(SDHIpin_Common[sd_port][no], PinMap_SDHI_PIN ) != sd_port)
tvendov 2:7c75ab32d7c9 262 {
tvendov 2:7c75ab32d7c9 263 return SD_ERR;
tvendov 2:7c75ab32d7c9 264 }
tvendov 2:7c75ab32d7c9 265 pinmap_pinout(SDHIpin_Common[sd_port][no], PinMap_SDHI_PIN);
tvendov 2:7c75ab32d7c9 266 }
tvendov 2:7c75ab32d7c9 267
tvendov 2:7c75ab32d7c9 268 sddev_set_port(sd_port, SDHI_PORT_MODE);
tvendov 2:7c75ab32d7c9 269
tvendov 2:7c75ab32d7c9 270 #ifdef SDCFG_HWINT
tvendov 2:7c75ab32d7c9 271 if ( sd_port == (uint32_t)SDHI_0 )
tvendov 2:7c75ab32d7c9 272 {
tvendov 2:7c75ab32d7c9 273 InterruptHandlerRegister(SDHI0_0_IRQn, sddev_sd_int_handler_0);
tvendov 2:7c75ab32d7c9 274 GIC_SetPriority(SDHI0_0_IRQn, INT_LEVEL_SDHI);
tvendov 2:7c75ab32d7c9 275 GIC_EnableIRQ(SDHI0_0_IRQn);
tvendov 2:7c75ab32d7c9 276
tvendov 2:7c75ab32d7c9 277 InterruptHandlerRegister(SDHI0_3_IRQn, sddev_sd_int_handler_0);
tvendov 2:7c75ab32d7c9 278 GIC_SetPriority(SDHI0_3_IRQn, INT_LEVEL_SDHI);
tvendov 2:7c75ab32d7c9 279 GIC_EnableIRQ(SDHI0_3_IRQn);
tvendov 2:7c75ab32d7c9 280
tvendov 2:7c75ab32d7c9 281 InterruptHandlerRegister(SDHI0_1_IRQn, sddev_sdio_int_handler_0);
tvendov 2:7c75ab32d7c9 282 GIC_SetPriority(SDHI0_1_IRQn, INT_LEVEL_SDHI);
tvendov 2:7c75ab32d7c9 283 GIC_EnableIRQ(SDHI0_1_IRQn);
tvendov 2:7c75ab32d7c9 284 }
tvendov 2:7c75ab32d7c9 285 else if ( sd_port == (uint32_t)SDHI_1 )
tvendov 2:7c75ab32d7c9 286 {
tvendov 2:7c75ab32d7c9 287 InterruptHandlerRegister(SDHI1_0_IRQn, sddev_sd_int_handler_1);
tvendov 2:7c75ab32d7c9 288 GIC_SetPriority(SDHI1_0_IRQn, INT_LEVEL_SDHI);
tvendov 2:7c75ab32d7c9 289 GIC_EnableIRQ(SDHI1_0_IRQn);
tvendov 2:7c75ab32d7c9 290
tvendov 2:7c75ab32d7c9 291 InterruptHandlerRegister(SDHI1_3_IRQn, sddev_sd_int_handler_1);
tvendov 2:7c75ab32d7c9 292 GIC_SetPriority(SDHI1_3_IRQn, INT_LEVEL_SDHI);
tvendov 2:7c75ab32d7c9 293 GIC_EnableIRQ(SDHI1_3_IRQn);
tvendov 2:7c75ab32d7c9 294
tvendov 2:7c75ab32d7c9 295 InterruptHandlerRegister(SDHI1_1_IRQn, sddev_sdio_int_handler_1);
tvendov 2:7c75ab32d7c9 296 GIC_SetPriority(SDHI1_1_IRQn, INT_LEVEL_SDHI);
tvendov 2:7c75ab32d7c9 297 GIC_EnableIRQ(SDHI1_1_IRQn);
tvendov 2:7c75ab32d7c9 298 }
tvendov 2:7c75ab32d7c9 299 #endif
tvendov 2:7c75ab32d7c9 300
tvendov 2:7c75ab32d7c9 301 /* ---- wait card detect ---- */
tvendov 2:7c75ab32d7c9 302 osDelay(100); /* wait 100ms */
tvendov 2:7c75ab32d7c9 303
tvendov 2:7c75ab32d7c9 304 return SD_OK;
tvendov 2:7c75ab32d7c9 305 }
tvendov 2:7c75ab32d7c9 306
tvendov 2:7c75ab32d7c9 307
tvendov 2:7c75ab32d7c9 308 /******************************************************************************
tvendov 2:7c75ab32d7c9 309 * Function Name: int sddev_power_on(int sd_port);
tvendov 2:7c75ab32d7c9 310 * Description : Power-on H/W to use SDHI
tvendov 2:7c75ab32d7c9 311 * Arguments : none
tvendov 2:7c75ab32d7c9 312 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 313 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 314 ******************************************************************************/
tvendov 2:7c75ab32d7c9 315 int sddev_power_on(int sd_port)
tvendov 2:7c75ab32d7c9 316 {
tvendov 2:7c75ab32d7c9 317 /* ---Power On SD ---- */
tvendov 2:7c75ab32d7c9 318
tvendov 2:7c75ab32d7c9 319 /* ---- Wait for SD Wake up ---- */
tvendov 2:7c75ab32d7c9 320 osDelay(100); /* wait 100ms */
tvendov 2:7c75ab32d7c9 321
tvendov 2:7c75ab32d7c9 322 return SD_OK;
tvendov 2:7c75ab32d7c9 323 }
tvendov 2:7c75ab32d7c9 324
tvendov 2:7c75ab32d7c9 325 /******************************************************************************
tvendov 2:7c75ab32d7c9 326 * Function Name: int sddev_power_off(int sd_port);
tvendov 2:7c75ab32d7c9 327 * Description : Power-off H/W to use SDHI
tvendov 2:7c75ab32d7c9 328 * Arguments : none
tvendov 2:7c75ab32d7c9 329 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 330 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 331 ******************************************************************************/
tvendov 2:7c75ab32d7c9 332 int sddev_power_off(int sd_port)
tvendov 2:7c75ab32d7c9 333 {
tvendov 2:7c75ab32d7c9 334 return SD_OK;
tvendov 2:7c75ab32d7c9 335 }
tvendov 2:7c75ab32d7c9 336
tvendov 2:7c75ab32d7c9 337 /******************************************************************************
tvendov 2:7c75ab32d7c9 338 * Function Name: int sddev_read_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num);
tvendov 2:7c75ab32d7c9 339 * Description : read from SDHI buffer FIFO
tvendov 2:7c75ab32d7c9 340 * Arguments : unsigned char *buff : buffer addrees to store reading datas
tvendov 2:7c75ab32d7c9 341 * : unsigned long reg_addr : SDIP FIFO address
tvendov 2:7c75ab32d7c9 342 * : long num : counts to read(unit:byte)
tvendov 2:7c75ab32d7c9 343 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 344 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 345 ******************************************************************************/
tvendov 2:7c75ab32d7c9 346 #ifdef __CC_ARM
tvendov 2:7c75ab32d7c9 347 #pragma push
tvendov 2:7c75ab32d7c9 348 #pragma Ospace
tvendov 2:7c75ab32d7c9 349 #elif defined(__ICCARM__)
tvendov 2:7c75ab32d7c9 350 #pragma optimize=size
tvendov 2:7c75ab32d7c9 351 #elif (defined( __GNUC__ ) && !defined( __CC_ARM ))
tvendov 2:7c75ab32d7c9 352 #pragma GCC push_options
tvendov 2:7c75ab32d7c9 353 #pragma GCC optimize ("Os")
tvendov 2:7c75ab32d7c9 354 #endif
tvendov 2:7c75ab32d7c9 355 int sddev_read_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num)
tvendov 2:7c75ab32d7c9 356 {
tvendov 2:7c75ab32d7c9 357 long i;
tvendov 2:7c75ab32d7c9 358 long cnt;
tvendov 2:7c75ab32d7c9 359 unsigned long *reg;
tvendov 2:7c75ab32d7c9 360 unsigned long *ptr_l;
tvendov 2:7c75ab32d7c9 361 unsigned char *ptr_c;
tvendov 2:7c75ab32d7c9 362 unsigned long tmp;
tvendov 2:7c75ab32d7c9 363
tvendov 2:7c75ab32d7c9 364 reg = (unsigned long *)(reg_addr);
tvendov 2:7c75ab32d7c9 365
tvendov 2:7c75ab32d7c9 366 cnt = (num / 4);
tvendov 2:7c75ab32d7c9 367 if(((unsigned long)buff & 0x3) != 0)
tvendov 2:7c75ab32d7c9 368 {
tvendov 2:7c75ab32d7c9 369 ptr_c = (unsigned char *)buff;
tvendov 2:7c75ab32d7c9 370 for(i = cnt; i > 0 ; i--)
tvendov 2:7c75ab32d7c9 371 {
tvendov 2:7c75ab32d7c9 372 tmp = *reg;
tvendov 2:7c75ab32d7c9 373 *ptr_c++ = (unsigned char)(tmp);
tvendov 2:7c75ab32d7c9 374 *ptr_c++ = (unsigned char)(tmp >> 8);
tvendov 2:7c75ab32d7c9 375 *ptr_c++ = (unsigned char)(tmp >> 16);
tvendov 2:7c75ab32d7c9 376 *ptr_c++ = (unsigned char)(tmp >> 24);
tvendov 2:7c75ab32d7c9 377 }
tvendov 2:7c75ab32d7c9 378
tvendov 2:7c75ab32d7c9 379 cnt = (num % 4);
tvendov 2:7c75ab32d7c9 380 if( cnt != 0 )
tvendov 2:7c75ab32d7c9 381 {
tvendov 2:7c75ab32d7c9 382 tmp = *reg;
tvendov 2:7c75ab32d7c9 383 for(i = cnt; i > 0 ; i--)
tvendov 2:7c75ab32d7c9 384 {
tvendov 2:7c75ab32d7c9 385 *ptr_c++ = (unsigned char)(tmp);
tvendov 2:7c75ab32d7c9 386 tmp >>= 8;
tvendov 2:7c75ab32d7c9 387 }
tvendov 2:7c75ab32d7c9 388 }
tvendov 2:7c75ab32d7c9 389 }
tvendov 2:7c75ab32d7c9 390 else
tvendov 2:7c75ab32d7c9 391 {
tvendov 2:7c75ab32d7c9 392 ptr_l = (unsigned long *)buff;
tvendov 2:7c75ab32d7c9 393 for(i = cnt; i > 0 ; i--)
tvendov 2:7c75ab32d7c9 394 {
tvendov 2:7c75ab32d7c9 395 *ptr_l++ = *reg;
tvendov 2:7c75ab32d7c9 396 }
tvendov 2:7c75ab32d7c9 397
tvendov 2:7c75ab32d7c9 398 cnt = (num % 4);
tvendov 2:7c75ab32d7c9 399 if( cnt != 0 )
tvendov 2:7c75ab32d7c9 400 {
tvendov 2:7c75ab32d7c9 401 ptr_c = (unsigned char *)ptr_l;
tvendov 2:7c75ab32d7c9 402 tmp = *reg;
tvendov 2:7c75ab32d7c9 403 for(i = cnt; i > 0 ; i--)
tvendov 2:7c75ab32d7c9 404 {
tvendov 2:7c75ab32d7c9 405 *ptr_c++ = (unsigned char)(tmp);
tvendov 2:7c75ab32d7c9 406 tmp >>= 8;
tvendov 2:7c75ab32d7c9 407 }
tvendov 2:7c75ab32d7c9 408 }
tvendov 2:7c75ab32d7c9 409 }
tvendov 2:7c75ab32d7c9 410
tvendov 2:7c75ab32d7c9 411 return SD_OK;
tvendov 2:7c75ab32d7c9 412 }
tvendov 2:7c75ab32d7c9 413 #ifdef __CC_ARM
tvendov 2:7c75ab32d7c9 414 #pragma pop
tvendov 2:7c75ab32d7c9 415 #elif (defined( __GNUC__ ) && !defined( __CC_ARM ))
tvendov 2:7c75ab32d7c9 416 #pragma GCC pop_options
tvendov 2:7c75ab32d7c9 417 #endif
tvendov 2:7c75ab32d7c9 418
tvendov 2:7c75ab32d7c9 419 /******************************************************************************
tvendov 2:7c75ab32d7c9 420 * Function Name: int sddev_write_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num);
tvendov 2:7c75ab32d7c9 421 * Description : write to SDHI buffer FIFO
tvendov 2:7c75ab32d7c9 422 * Arguments : unsigned char *buff : buffer addrees to store writting datas
tvendov 2:7c75ab32d7c9 423 * : unsigned long reg_addr : SDIP FIFO address
tvendov 2:7c75ab32d7c9 424 * : long num : counts to write(unit:byte)
tvendov 2:7c75ab32d7c9 425 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 426 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 427 ******************************************************************************/
tvendov 2:7c75ab32d7c9 428 int sddev_write_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num)
tvendov 2:7c75ab32d7c9 429 {
tvendov 2:7c75ab32d7c9 430 long i;
tvendov 2:7c75ab32d7c9 431 unsigned long *reg = (unsigned long *)(reg_addr);
tvendov 2:7c75ab32d7c9 432 unsigned long *ptr = (unsigned long *)buff;
tvendov 2:7c75ab32d7c9 433 unsigned long tmp;
tvendov 2:7c75ab32d7c9 434
tvendov 2:7c75ab32d7c9 435 /* dont care non 4byte allignment data */
tvendov 2:7c75ab32d7c9 436 num += 3;
tvendov 2:7c75ab32d7c9 437 num /= 4;
tvendov 2:7c75ab32d7c9 438 if(((unsigned long)buff & 0x3) != 0)
tvendov 2:7c75ab32d7c9 439 {
tvendov 2:7c75ab32d7c9 440 for(i = num; i > 0 ; i--)
tvendov 2:7c75ab32d7c9 441 {
tvendov 2:7c75ab32d7c9 442 tmp = *buff++ ;
tvendov 2:7c75ab32d7c9 443 tmp |= *buff++ << 8;
tvendov 2:7c75ab32d7c9 444 tmp |= *buff++ << 16;
tvendov 2:7c75ab32d7c9 445 tmp |= *buff++ << 24;
tvendov 2:7c75ab32d7c9 446 *reg = tmp;
tvendov 2:7c75ab32d7c9 447 }
tvendov 2:7c75ab32d7c9 448 }
tvendov 2:7c75ab32d7c9 449 else
tvendov 2:7c75ab32d7c9 450 {
tvendov 2:7c75ab32d7c9 451 for(i = num; i > 0 ; i--)
tvendov 2:7c75ab32d7c9 452 {
tvendov 2:7c75ab32d7c9 453 *reg = *ptr++;
tvendov 2:7c75ab32d7c9 454 }
tvendov 2:7c75ab32d7c9 455 }
tvendov 2:7c75ab32d7c9 456
tvendov 2:7c75ab32d7c9 457 return SD_OK;
tvendov 2:7c75ab32d7c9 458 }
tvendov 2:7c75ab32d7c9 459
tvendov 2:7c75ab32d7c9 460 /******************************************************************************
tvendov 2:7c75ab32d7c9 461 * Function Name: unsigned int sddev_get_clockdiv(int sd_port, int clock);
tvendov 2:7c75ab32d7c9 462 * Description : write to SDHI buffer FIFO
tvendov 2:7c75ab32d7c9 463 * Arguments : int clock : request clock frequency
tvendov 2:7c75ab32d7c9 464 * : SD_CLK_50MHz
tvendov 2:7c75ab32d7c9 465 * : SD_CLK_25MHz
tvendov 2:7c75ab32d7c9 466 * : SD_CLK_20MHz
tvendov 2:7c75ab32d7c9 467 * : SD_CLK_10MHz
tvendov 2:7c75ab32d7c9 468 * : SD_CLK_5MHz
tvendov 2:7c75ab32d7c9 469 * : SD_CLK_1MHz
tvendov 2:7c75ab32d7c9 470 * : SD_CLK_400kHz
tvendov 2:7c75ab32d7c9 471 * Return Value : clock div value
tvendov 2:7c75ab32d7c9 472 * : SD_DIV_2 : 1/2 clock
tvendov 2:7c75ab32d7c9 473 * : SD_DIV_2 : 1/4 clock
tvendov 2:7c75ab32d7c9 474 * : SD_DIV_2 : 1/8 clock
tvendov 2:7c75ab32d7c9 475 * : SD_DIV_2 : 1/16 clock
tvendov 2:7c75ab32d7c9 476 * : SD_DIV_2 : 1/128 clock
tvendov 2:7c75ab32d7c9 477 * : SD_DIV_2 : 1/256 clock
tvendov 2:7c75ab32d7c9 478 ******************************************************************************/
tvendov 2:7c75ab32d7c9 479 unsigned int sddev_get_clockdiv(int sd_port, int clock)
tvendov 2:7c75ab32d7c9 480 {
tvendov 2:7c75ab32d7c9 481 unsigned int div;
tvendov 2:7c75ab32d7c9 482
tvendov 2:7c75ab32d7c9 483 switch(clock)
tvendov 2:7c75ab32d7c9 484 {
tvendov 2:7c75ab32d7c9 485 case SD_CLK_50MHz:
tvendov 2:7c75ab32d7c9 486 div = SD_DIV_2; /* 64MHz/2 = 32MHz */
tvendov 2:7c75ab32d7c9 487 break;
tvendov 2:7c75ab32d7c9 488 case SD_CLK_25MHz:
tvendov 2:7c75ab32d7c9 489 div = SD_DIV_4; /* 64MHz/4 = 16MHz */
tvendov 2:7c75ab32d7c9 490 break;
tvendov 2:7c75ab32d7c9 491 case SD_CLK_20MHz:
tvendov 2:7c75ab32d7c9 492 div = SD_DIV_4; /* 64MHz/4 = 16MHz */
tvendov 2:7c75ab32d7c9 493 break;
tvendov 2:7c75ab32d7c9 494 case SD_CLK_10MHz:
tvendov 2:7c75ab32d7c9 495 div = SD_DIV_8; /* 64MHz/8 = 8MHz */
tvendov 2:7c75ab32d7c9 496 break;
tvendov 2:7c75ab32d7c9 497 case SD_CLK_5MHz:
tvendov 2:7c75ab32d7c9 498 div = SD_DIV_16; /* 64MHz/16 = 4MHz */
tvendov 2:7c75ab32d7c9 499 break;
tvendov 2:7c75ab32d7c9 500 case SD_CLK_1MHz:
tvendov 2:7c75ab32d7c9 501 div = SD_DIV_128; /* 64MHz/128 = 512kHz */
tvendov 2:7c75ab32d7c9 502 break;
tvendov 2:7c75ab32d7c9 503 case SD_CLK_400kHz:
tvendov 2:7c75ab32d7c9 504 div = SD_DIV_256; /* 64MHz/256 = 256kHz */
tvendov 2:7c75ab32d7c9 505 break;
tvendov 2:7c75ab32d7c9 506 default:
tvendov 2:7c75ab32d7c9 507 div = SD_DIV_256;
tvendov 2:7c75ab32d7c9 508 break;
tvendov 2:7c75ab32d7c9 509 }
tvendov 2:7c75ab32d7c9 510
tvendov 2:7c75ab32d7c9 511 return div;
tvendov 2:7c75ab32d7c9 512 }
tvendov 2:7c75ab32d7c9 513
tvendov 2:7c75ab32d7c9 514 /******************************************************************************
tvendov 2:7c75ab32d7c9 515 * Function Name: int sddev_set_port(int sd_port, int mode);
tvendov 2:7c75ab32d7c9 516 * Description : setting ports to use MMCHI
tvendov 2:7c75ab32d7c9 517 * Arguments : int mode : SD_PORT_PARALLEL : 4bit mode
tvendov 2:7c75ab32d7c9 518 * : SD_PORT_SERIAL : 1bit mode
tvendov 2:7c75ab32d7c9 519 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 520 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 521 ******************************************************************************/
tvendov 2:7c75ab32d7c9 522 int sddev_set_port(int sd_port, int mode)
tvendov 2:7c75ab32d7c9 523 {
tvendov 2:7c75ab32d7c9 524 if ( sd_port >= SDHI_COUNT)
tvendov 2:7c75ab32d7c9 525 return SD_ERR;
tvendov 2:7c75ab32d7c9 526
tvendov 2:7c75ab32d7c9 527 if(mode == SD_PORT_SERIAL)
tvendov 2:7c75ab32d7c9 528 {
tvendov 2:7c75ab32d7c9 529 for( uint32_t no=0; no < SDHI_PINS_SERIAL; no++ )
tvendov 2:7c75ab32d7c9 530 {
tvendov 2:7c75ab32d7c9 531 if ( pinmap_peripheral(SDHIpin_serial[sd_port][no], PinMap_SDHI_PIN ) != sd_port)
tvendov 2:7c75ab32d7c9 532 {
tvendov 2:7c75ab32d7c9 533 return SD_ERR;
tvendov 2:7c75ab32d7c9 534 }
tvendov 2:7c75ab32d7c9 535 pinmap_pinout(SDHIpin_serial[sd_port][no], PinMap_SDHI_PIN);
tvendov 2:7c75ab32d7c9 536 }
tvendov 2:7c75ab32d7c9 537 }
tvendov 2:7c75ab32d7c9 538 else if( mode == SD_PORT_PARALLEL )
tvendov 2:7c75ab32d7c9 539 {
tvendov 2:7c75ab32d7c9 540 for( uint32_t no=0; no < SDHI_PINS_PARALLEL; no++ )
tvendov 2:7c75ab32d7c9 541 {
tvendov 2:7c75ab32d7c9 542 if ( pinmap_peripheral(SDHIpin_parallel[sd_port][no], PinMap_SDHI_PIN ) != sd_port)
tvendov 2:7c75ab32d7c9 543 {
tvendov 2:7c75ab32d7c9 544 return SD_ERR;
tvendov 2:7c75ab32d7c9 545 }
tvendov 2:7c75ab32d7c9 546 pinmap_pinout(SDHIpin_parallel[sd_port][no], PinMap_SDHI_PIN);
tvendov 2:7c75ab32d7c9 547 }
tvendov 2:7c75ab32d7c9 548 }
tvendov 2:7c75ab32d7c9 549 else
tvendov 2:7c75ab32d7c9 550 {
tvendov 2:7c75ab32d7c9 551 return SD_ERR;
tvendov 2:7c75ab32d7c9 552 }
tvendov 2:7c75ab32d7c9 553
tvendov 2:7c75ab32d7c9 554 return SD_OK;
tvendov 2:7c75ab32d7c9 555 }
tvendov 2:7c75ab32d7c9 556
tvendov 2:7c75ab32d7c9 557
tvendov 2:7c75ab32d7c9 558 /******************************************************************************
tvendov 2:7c75ab32d7c9 559 * Function Name: int sddev_int_wait(int sd_port, int time);
tvendov 2:7c75ab32d7c9 560 * Description : Waitting for SDHI Interrupt
tvendov 2:7c75ab32d7c9 561 * Arguments : int time : time out value to wait interrupt
tvendov 2:7c75ab32d7c9 562 * Return Value : get interrupt : SD_OK
tvendov 2:7c75ab32d7c9 563 * : time out : SD_ERR
tvendov 2:7c75ab32d7c9 564 ******************************************************************************/
tvendov 2:7c75ab32d7c9 565 int sddev_int_wait(int sd_port, int time)
tvendov 2:7c75ab32d7c9 566 {
tvendov 2:7c75ab32d7c9 567 sddev_start_timer(time);
tvendov 2:7c75ab32d7c9 568 while( sddev_check_timer() == SD_OK )
tvendov 2:7c75ab32d7c9 569 {
tvendov 2:7c75ab32d7c9 570 /* interrupt generated? */
tvendov 2:7c75ab32d7c9 571 if(sd_check_int(sd_port) == SD_OK)
tvendov 2:7c75ab32d7c9 572 {
tvendov 2:7c75ab32d7c9 573 sddev_end_timer();
tvendov 2:7c75ab32d7c9 574 return SD_OK;
tvendov 2:7c75ab32d7c9 575 }
tvendov 2:7c75ab32d7c9 576 }
tvendov 2:7c75ab32d7c9 577
tvendov 2:7c75ab32d7c9 578 sddev_end_timer();
tvendov 2:7c75ab32d7c9 579
tvendov 2:7c75ab32d7c9 580 return SD_ERR;
tvendov 2:7c75ab32d7c9 581 }
tvendov 2:7c75ab32d7c9 582
tvendov 2:7c75ab32d7c9 583 /******************************************************************************
tvendov 2:7c75ab32d7c9 584 * Function Name: int sddev_init_dma(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 2:7c75ab32d7c9 585 * Description : Initialize DMAC to transfer data from SDHI FIFO
tvendov 2:7c75ab32d7c9 586 * Arguments : unsigned long buff : buffer addrees to transfer datas
tvendov 2:7c75ab32d7c9 587 * : unsigned long reg : SDIP FIFO address
tvendov 2:7c75ab32d7c9 588 * : long cnt : counts to transfer(unit:byte)
tvendov 2:7c75ab32d7c9 589 * : int dir : direction to transfer
tvendov 2:7c75ab32d7c9 590 * : : 0 : FIFO -> buffer
tvendov 2:7c75ab32d7c9 591 * : : 1 : buffer -> FIFO
tvendov 2:7c75ab32d7c9 592 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 593 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 594 ******************************************************************************/
tvendov 2:7c75ab32d7c9 595 int sddev_init_dma(int sd_port, unsigned long buff,unsigned long reg,long cnt,int dir)
tvendov 2:7c75ab32d7c9 596 {
tvendov 2:7c75ab32d7c9 597 int ret;
tvendov 2:7c75ab32d7c9 598
tvendov 2:7c75ab32d7c9 599 if( sd_port == 0 )
tvendov 2:7c75ab32d7c9 600 {
tvendov 2:7c75ab32d7c9 601 ret = sddev_init_dma_0(buff, reg, cnt, dir);
tvendov 2:7c75ab32d7c9 602 }
tvendov 2:7c75ab32d7c9 603 else if( sd_port == 1 )
tvendov 2:7c75ab32d7c9 604 {
tvendov 2:7c75ab32d7c9 605 ret = sddev_init_dma_1(buff, reg, cnt, dir);
tvendov 2:7c75ab32d7c9 606 }
tvendov 2:7c75ab32d7c9 607
tvendov 2:7c75ab32d7c9 608 return ret;
tvendov 2:7c75ab32d7c9 609 }
tvendov 2:7c75ab32d7c9 610
tvendov 2:7c75ab32d7c9 611 /******************************************************************************
tvendov 2:7c75ab32d7c9 612 * Function Name: static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 2:7c75ab32d7c9 613 * Description : Initialize DMAC to transfer data from SDHI FIFO
tvendov 2:7c75ab32d7c9 614 * Arguments : unsigned long buff : buffer addrees to transfer datas
tvendov 2:7c75ab32d7c9 615 * : unsigned long reg : SDIP FIFO address
tvendov 2:7c75ab32d7c9 616 * : long cnt : counts to transfer(unit:byte)
tvendov 2:7c75ab32d7c9 617 * : int dir : direction to transfer
tvendov 2:7c75ab32d7c9 618 * : : 0 : FIFO -> buffer
tvendov 2:7c75ab32d7c9 619 * : : 1 : buffer -> FIFO
tvendov 2:7c75ab32d7c9 620 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 621 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 622 ******************************************************************************/
tvendov 2:7c75ab32d7c9 623 static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir)
tvendov 2:7c75ab32d7c9 624 {
tvendov 2:7c75ab32d7c9 625 #ifdef SDCFG_TRNS_DMA
tvendov 2:7c75ab32d7c9 626 dmac_transinfo_t trans_info;
tvendov 2:7c75ab32d7c9 627 uint32_t request_factor;
tvendov 2:7c75ab32d7c9 628 int32_t ret;
tvendov 2:7c75ab32d7c9 629
tvendov 2:7c75ab32d7c9 630 trans_info.count = (uint32_t)cnt;
tvendov 2:7c75ab32d7c9 631 #ifdef SDCFG_TRANS_DMA_64
tvendov 2:7c75ab32d7c9 632 if( (cnt % 64) != 0 )
tvendov 2:7c75ab32d7c9 633 {
tvendov 2:7c75ab32d7c9 634 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 635 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 636 if( reg & 0x0000003f )
tvendov 2:7c75ab32d7c9 637 {
tvendov 2:7c75ab32d7c9 638 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 639 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 640 }
tvendov 2:7c75ab32d7c9 641 }
tvendov 2:7c75ab32d7c9 642 else
tvendov 2:7c75ab32d7c9 643 {
tvendov 2:7c75ab32d7c9 644 trans_info.src_size = DMAC_TRANS_SIZE_512;
tvendov 2:7c75ab32d7c9 645 trans_info.dst_size = DMAC_TRANS_SIZE_512;
tvendov 2:7c75ab32d7c9 646 }
tvendov 2:7c75ab32d7c9 647 #else
tvendov 2:7c75ab32d7c9 648 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 649 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 650 #endif
tvendov 2:7c75ab32d7c9 651
tvendov 2:7c75ab32d7c9 652 if( dir == 0 )
tvendov 2:7c75ab32d7c9 653 {
tvendov 2:7c75ab32d7c9 654 request_factor = DMAC_REQ_SDHI_0_RX;
tvendov 2:7c75ab32d7c9 655 trans_info.src_addr = (uint32_t)reg;
tvendov 2:7c75ab32d7c9 656 trans_info.dst_addr = (uint32_t)buff;
tvendov 2:7c75ab32d7c9 657 trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 2:7c75ab32d7c9 658 trans_info.daddr_dir = DMAC_TRANS_ADR_INC;
tvendov 2:7c75ab32d7c9 659 }
tvendov 2:7c75ab32d7c9 660 else if( dir == 1 )
tvendov 2:7c75ab32d7c9 661 {
tvendov 2:7c75ab32d7c9 662 request_factor = DMAC_REQ_SDHI_0_TX;
tvendov 2:7c75ab32d7c9 663 trans_info.src_addr = (uint32_t)buff;
tvendov 2:7c75ab32d7c9 664 trans_info.dst_addr = (uint32_t)reg;
tvendov 2:7c75ab32d7c9 665 trans_info.saddr_dir = DMAC_TRANS_ADR_INC;
tvendov 2:7c75ab32d7c9 666 trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 2:7c75ab32d7c9 667 }
tvendov 2:7c75ab32d7c9 668
tvendov 2:7c75ab32d7c9 669 sd_DMAC1_PeriReqInit( (const dmac_transinfo_t *)&trans_info,
tvendov 2:7c75ab32d7c9 670 DMAC_MODE_REGISTER,
tvendov 2:7c75ab32d7c9 671 DMAC_SAMPLE_SINGLE,
tvendov 2:7c75ab32d7c9 672 request_factor,
tvendov 2:7c75ab32d7c9 673 0 ); /* Dont care DMAC_REQ_REQD is setting in usb0_host_DMAC1_PeriReqInit() */
tvendov 2:7c75ab32d7c9 674
tvendov 2:7c75ab32d7c9 675 ret = sd_DMAC1_Open(DMAC_REQ_MODE_PERI);
tvendov 2:7c75ab32d7c9 676 if( ret != 0 )
tvendov 2:7c75ab32d7c9 677 {
tvendov 2:7c75ab32d7c9 678 printf("DMAC1 Open error!!\n");
tvendov 2:7c75ab32d7c9 679 return SD_ERR;
tvendov 2:7c75ab32d7c9 680 }
tvendov 2:7c75ab32d7c9 681 #endif
tvendov 2:7c75ab32d7c9 682
tvendov 2:7c75ab32d7c9 683 return SD_OK;
tvendov 2:7c75ab32d7c9 684 }
tvendov 2:7c75ab32d7c9 685
tvendov 2:7c75ab32d7c9 686 /******************************************************************************
tvendov 2:7c75ab32d7c9 687 * Function Name: static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 2:7c75ab32d7c9 688 * Description : Initialize DMAC to transfer data from SDHI FIFO
tvendov 2:7c75ab32d7c9 689 * Arguments : unsigned long buff : buffer address to transfer datas
tvendov 2:7c75ab32d7c9 690 * : unsigned long reg : SDIP FIFO address
tvendov 2:7c75ab32d7c9 691 * : long cnt : counts to transfer(unit:byte)
tvendov 2:7c75ab32d7c9 692 * : int dir : direction to transfer
tvendov 2:7c75ab32d7c9 693 * : : 0 : FIFO -> buffer
tvendov 2:7c75ab32d7c9 694 * : : 1 : buffer -> FIFO
tvendov 2:7c75ab32d7c9 695 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 696 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 697 ******************************************************************************/
tvendov 2:7c75ab32d7c9 698 static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir)
tvendov 2:7c75ab32d7c9 699 {
tvendov 2:7c75ab32d7c9 700 #ifdef SDCFG_TRNS_DMA
tvendov 2:7c75ab32d7c9 701 dmac_transinfo_t trans_info;
tvendov 2:7c75ab32d7c9 702 uint32_t request_factor;
tvendov 2:7c75ab32d7c9 703 int32_t ret;
tvendov 2:7c75ab32d7c9 704
tvendov 2:7c75ab32d7c9 705 trans_info.count = (uint32_t)cnt;
tvendov 2:7c75ab32d7c9 706 #ifdef SDCFG_TRANS_DMA_64
tvendov 2:7c75ab32d7c9 707 if( (cnt % 64) != 0 )
tvendov 2:7c75ab32d7c9 708 {
tvendov 2:7c75ab32d7c9 709 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 710 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 711 if( reg & 0x0000003f )
tvendov 2:7c75ab32d7c9 712 {
tvendov 2:7c75ab32d7c9 713 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 714 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 715 }
tvendov 2:7c75ab32d7c9 716 }
tvendov 2:7c75ab32d7c9 717 else
tvendov 2:7c75ab32d7c9 718 {
tvendov 2:7c75ab32d7c9 719 trans_info.src_size = DMAC_TRANS_SIZE_512;
tvendov 2:7c75ab32d7c9 720 trans_info.dst_size = DMAC_TRANS_SIZE_512;
tvendov 2:7c75ab32d7c9 721 }
tvendov 2:7c75ab32d7c9 722 #else
tvendov 2:7c75ab32d7c9 723 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 724 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 2:7c75ab32d7c9 725 #endif
tvendov 2:7c75ab32d7c9 726
tvendov 2:7c75ab32d7c9 727 if( dir == 0 )
tvendov 2:7c75ab32d7c9 728 {
tvendov 2:7c75ab32d7c9 729 request_factor = DMAC_REQ_SDHI_1_RX;
tvendov 2:7c75ab32d7c9 730 trans_info.src_addr = (uint32_t)reg;
tvendov 2:7c75ab32d7c9 731 trans_info.dst_addr = (uint32_t)buff;
tvendov 2:7c75ab32d7c9 732 trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 2:7c75ab32d7c9 733 trans_info.daddr_dir = DMAC_TRANS_ADR_INC;
tvendov 2:7c75ab32d7c9 734 }
tvendov 2:7c75ab32d7c9 735 else if( dir == 1 )
tvendov 2:7c75ab32d7c9 736 {
tvendov 2:7c75ab32d7c9 737 request_factor = DMAC_REQ_SDHI_1_TX;
tvendov 2:7c75ab32d7c9 738 trans_info.src_addr = (uint32_t)buff;
tvendov 2:7c75ab32d7c9 739 trans_info.dst_addr = (uint32_t)reg;
tvendov 2:7c75ab32d7c9 740 trans_info.saddr_dir = DMAC_TRANS_ADR_INC;
tvendov 2:7c75ab32d7c9 741 trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 2:7c75ab32d7c9 742 }
tvendov 2:7c75ab32d7c9 743
tvendov 2:7c75ab32d7c9 744 sd_DMAC2_PeriReqInit( (const dmac_transinfo_t *)&trans_info,
tvendov 2:7c75ab32d7c9 745 DMAC_MODE_REGISTER,
tvendov 2:7c75ab32d7c9 746 DMAC_SAMPLE_SINGLE,
tvendov 2:7c75ab32d7c9 747 request_factor,
tvendov 2:7c75ab32d7c9 748 0 ); /* Dont care DMAC_REQ_REQD is setting in usb0_host_DMAC1_PeriReqInit() */
tvendov 2:7c75ab32d7c9 749
tvendov 2:7c75ab32d7c9 750 ret = sd_DMAC2_Open(DMAC_REQ_MODE_PERI);
tvendov 2:7c75ab32d7c9 751 if( ret != 0 )
tvendov 2:7c75ab32d7c9 752 {
tvendov 2:7c75ab32d7c9 753 printf("DMAC1 Open error!!\n");
tvendov 2:7c75ab32d7c9 754 return SD_ERR;
tvendov 2:7c75ab32d7c9 755 }
tvendov 2:7c75ab32d7c9 756 #endif
tvendov 2:7c75ab32d7c9 757
tvendov 2:7c75ab32d7c9 758 return SD_OK;
tvendov 2:7c75ab32d7c9 759 }
tvendov 2:7c75ab32d7c9 760
tvendov 2:7c75ab32d7c9 761 /******************************************************************************
tvendov 2:7c75ab32d7c9 762 * Function Name: int sddev_wait_dma_end(int sd_port, long cnt);
tvendov 2:7c75ab32d7c9 763 * Description : Wait to complete DMAC transfer
tvendov 2:7c75ab32d7c9 764 * Arguments : long cnt : counts to transfer(unit:byte)
tvendov 2:7c75ab32d7c9 765 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 766 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 767 ******************************************************************************/
tvendov 2:7c75ab32d7c9 768 int sddev_wait_dma_end(int sd_port, long cnt)
tvendov 2:7c75ab32d7c9 769 {
tvendov 2:7c75ab32d7c9 770 int ret;
tvendov 2:7c75ab32d7c9 771
tvendov 2:7c75ab32d7c9 772 if( sd_port == 0 )
tvendov 2:7c75ab32d7c9 773 {
tvendov 2:7c75ab32d7c9 774 ret = sddev_wait_dma_end_0(cnt);
tvendov 2:7c75ab32d7c9 775 }
tvendov 2:7c75ab32d7c9 776 else if( sd_port == 1 )
tvendov 2:7c75ab32d7c9 777 {
tvendov 2:7c75ab32d7c9 778 ret = sddev_wait_dma_end_1(cnt);
tvendov 2:7c75ab32d7c9 779 }
tvendov 2:7c75ab32d7c9 780
tvendov 2:7c75ab32d7c9 781 return ret;
tvendov 2:7c75ab32d7c9 782 }
tvendov 2:7c75ab32d7c9 783
tvendov 2:7c75ab32d7c9 784 /******************************************************************************
tvendov 2:7c75ab32d7c9 785 * Function Name: static int sddev_wait_dma_end_0(long cnt);
tvendov 2:7c75ab32d7c9 786 * Description : Wait to complete DMAC transfer
tvendov 2:7c75ab32d7c9 787 * Arguments : long cnt : counts to transfer(unit:byte)
tvendov 2:7c75ab32d7c9 788 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 789 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 790 ******************************************************************************/
tvendov 2:7c75ab32d7c9 791 static int sddev_wait_dma_end_0(long cnt)
tvendov 2:7c75ab32d7c9 792 {
tvendov 2:7c75ab32d7c9 793 #ifdef SDCFG_TRNS_DMA
tvendov 2:7c75ab32d7c9 794 int loop;
tvendov 2:7c75ab32d7c9 795 int time;
tvendov 2:7c75ab32d7c9 796
tvendov 2:7c75ab32d7c9 797 time = (cnt / 512);
tvendov 2:7c75ab32d7c9 798 time = ((time * 1000) / 1024);
tvendov 2:7c75ab32d7c9 799 if(time < 1000)
tvendov 2:7c75ab32d7c9 800 {
tvendov 2:7c75ab32d7c9 801 time = 1000;
tvendov 2:7c75ab32d7c9 802 }
tvendov 2:7c75ab32d7c9 803
tvendov 2:7c75ab32d7c9 804 if(time > (0x0000ffff / MTU_TIMER_CNT))
tvendov 2:7c75ab32d7c9 805 {
tvendov 2:7c75ab32d7c9 806 /* @1000ms */
tvendov 2:7c75ab32d7c9 807 loop = (time / 1000);
tvendov 2:7c75ab32d7c9 808 if( (time % 1000) != 0 )
tvendov 2:7c75ab32d7c9 809 {
tvendov 2:7c75ab32d7c9 810 loop++;
tvendov 2:7c75ab32d7c9 811 }
tvendov 2:7c75ab32d7c9 812 time = 1000;
tvendov 2:7c75ab32d7c9 813 }
tvendov 2:7c75ab32d7c9 814 else
tvendov 2:7c75ab32d7c9 815 {
tvendov 2:7c75ab32d7c9 816 loop = 1;
tvendov 2:7c75ab32d7c9 817 }
tvendov 2:7c75ab32d7c9 818
tvendov 2:7c75ab32d7c9 819 do{
tvendov 2:7c75ab32d7c9 820 sddev_start_timer(time);
tvendov 2:7c75ab32d7c9 821
tvendov 2:7c75ab32d7c9 822 while(1)
tvendov 2:7c75ab32d7c9 823 {
tvendov 2:7c75ab32d7c9 824 /* get end flag? */
tvendov 2:7c75ab32d7c9 825 if( sd_DMAC1_Get_Endflag() == 1 )
tvendov 2:7c75ab32d7c9 826 {
tvendov 2:7c75ab32d7c9 827 sddev_end_timer();
tvendov 2:7c75ab32d7c9 828 return SD_OK;
tvendov 2:7c75ab32d7c9 829 }
tvendov 2:7c75ab32d7c9 830 /* detect timeout? */
tvendov 2:7c75ab32d7c9 831 if(sddev_check_timer() == SD_ERR)
tvendov 2:7c75ab32d7c9 832 {
tvendov 2:7c75ab32d7c9 833 break;
tvendov 2:7c75ab32d7c9 834 }
tvendov 2:7c75ab32d7c9 835 }
tvendov 2:7c75ab32d7c9 836
tvendov 2:7c75ab32d7c9 837 loop--;
tvendov 2:7c75ab32d7c9 838 if( loop <= 0 )
tvendov 2:7c75ab32d7c9 839 {
tvendov 2:7c75ab32d7c9 840 break;
tvendov 2:7c75ab32d7c9 841 }
tvendov 2:7c75ab32d7c9 842
tvendov 2:7c75ab32d7c9 843 } while(1);
tvendov 2:7c75ab32d7c9 844
tvendov 2:7c75ab32d7c9 845 sddev_end_timer();
tvendov 2:7c75ab32d7c9 846
tvendov 2:7c75ab32d7c9 847 return SD_ERR;
tvendov 2:7c75ab32d7c9 848 #else
tvendov 2:7c75ab32d7c9 849 return SD_OK;
tvendov 2:7c75ab32d7c9 850
tvendov 2:7c75ab32d7c9 851 #endif
tvendov 2:7c75ab32d7c9 852 }
tvendov 2:7c75ab32d7c9 853
tvendov 2:7c75ab32d7c9 854 /******************************************************************************
tvendov 2:7c75ab32d7c9 855 * Function Name: static int sddev_wait_dma_end_1(long cnt);
tvendov 2:7c75ab32d7c9 856 * Description : Wait to complete DMAC transfer
tvendov 2:7c75ab32d7c9 857 * Arguments : long cnt : counts to transfer(unit:byte)
tvendov 2:7c75ab32d7c9 858 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 859 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 860 ******************************************************************************/
tvendov 2:7c75ab32d7c9 861 static int sddev_wait_dma_end_1(long cnt)
tvendov 2:7c75ab32d7c9 862 {
tvendov 2:7c75ab32d7c9 863 #ifdef SDCFG_TRNS_DMA
tvendov 2:7c75ab32d7c9 864 int loop;
tvendov 2:7c75ab32d7c9 865 int time;
tvendov 2:7c75ab32d7c9 866
tvendov 2:7c75ab32d7c9 867 time = (cnt / 512);
tvendov 2:7c75ab32d7c9 868 time = ((time * 1000) / 1024);
tvendov 2:7c75ab32d7c9 869 if(time < 1000)
tvendov 2:7c75ab32d7c9 870 {
tvendov 2:7c75ab32d7c9 871 time = 1000;
tvendov 2:7c75ab32d7c9 872 }
tvendov 2:7c75ab32d7c9 873
tvendov 2:7c75ab32d7c9 874 if(time > (0x0000ffff / MTU_TIMER_CNT))
tvendov 2:7c75ab32d7c9 875 {
tvendov 2:7c75ab32d7c9 876 /* @1000ms */
tvendov 2:7c75ab32d7c9 877 loop = (time / 1000);
tvendov 2:7c75ab32d7c9 878 if( (time % 1000) != 0 )
tvendov 2:7c75ab32d7c9 879 {
tvendov 2:7c75ab32d7c9 880 loop++;
tvendov 2:7c75ab32d7c9 881 }
tvendov 2:7c75ab32d7c9 882 time = 1000;
tvendov 2:7c75ab32d7c9 883 }
tvendov 2:7c75ab32d7c9 884 else
tvendov 2:7c75ab32d7c9 885 {
tvendov 2:7c75ab32d7c9 886 loop = 1;
tvendov 2:7c75ab32d7c9 887 }
tvendov 2:7c75ab32d7c9 888
tvendov 2:7c75ab32d7c9 889 do{
tvendov 2:7c75ab32d7c9 890 sddev_start_timer(time);
tvendov 2:7c75ab32d7c9 891
tvendov 2:7c75ab32d7c9 892 while(1)
tvendov 2:7c75ab32d7c9 893 {
tvendov 2:7c75ab32d7c9 894 /* get end flag? */
tvendov 2:7c75ab32d7c9 895 if( sd_DMAC2_Get_Endflag() == 1 )
tvendov 2:7c75ab32d7c9 896 {
tvendov 2:7c75ab32d7c9 897 sddev_end_timer();
tvendov 2:7c75ab32d7c9 898 return SD_OK;
tvendov 2:7c75ab32d7c9 899 }
tvendov 2:7c75ab32d7c9 900 /* detect timeout? */
tvendov 2:7c75ab32d7c9 901 if(sddev_check_timer() == SD_ERR)
tvendov 2:7c75ab32d7c9 902 {
tvendov 2:7c75ab32d7c9 903 break;
tvendov 2:7c75ab32d7c9 904 }
tvendov 2:7c75ab32d7c9 905 }
tvendov 2:7c75ab32d7c9 906
tvendov 2:7c75ab32d7c9 907 loop--;
tvendov 2:7c75ab32d7c9 908 if( loop <= 0 )
tvendov 2:7c75ab32d7c9 909 {
tvendov 2:7c75ab32d7c9 910 break;
tvendov 2:7c75ab32d7c9 911 }
tvendov 2:7c75ab32d7c9 912
tvendov 2:7c75ab32d7c9 913 } while(1);
tvendov 2:7c75ab32d7c9 914
tvendov 2:7c75ab32d7c9 915 sddev_end_timer();
tvendov 2:7c75ab32d7c9 916
tvendov 2:7c75ab32d7c9 917 return SD_ERR;
tvendov 2:7c75ab32d7c9 918 #else
tvendov 2:7c75ab32d7c9 919 return SD_OK;
tvendov 2:7c75ab32d7c9 920
tvendov 2:7c75ab32d7c9 921 #endif
tvendov 2:7c75ab32d7c9 922 }
tvendov 2:7c75ab32d7c9 923
tvendov 2:7c75ab32d7c9 924 /******************************************************************************
tvendov 2:7c75ab32d7c9 925 * Function Name: int sddev_disable_dma(int sd_port);
tvendov 2:7c75ab32d7c9 926 * Description : Disable DMAC transfer
tvendov 2:7c75ab32d7c9 927 * Arguments : none
tvendov 2:7c75ab32d7c9 928 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 929 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 930 ******************************************************************************/
tvendov 2:7c75ab32d7c9 931 int sddev_disable_dma(int sd_port)
tvendov 2:7c75ab32d7c9 932 {
tvendov 2:7c75ab32d7c9 933 int ret;
tvendov 2:7c75ab32d7c9 934
tvendov 2:7c75ab32d7c9 935 if( sd_port == 0 )
tvendov 2:7c75ab32d7c9 936 {
tvendov 2:7c75ab32d7c9 937 ret = sddev_disable_dma_0();
tvendov 2:7c75ab32d7c9 938 }
tvendov 2:7c75ab32d7c9 939 else
tvendov 2:7c75ab32d7c9 940 {
tvendov 2:7c75ab32d7c9 941 ret = sddev_disable_dma_1();
tvendov 2:7c75ab32d7c9 942 }
tvendov 2:7c75ab32d7c9 943 return ret;
tvendov 2:7c75ab32d7c9 944 }
tvendov 2:7c75ab32d7c9 945
tvendov 2:7c75ab32d7c9 946 /******************************************************************************
tvendov 2:7c75ab32d7c9 947 * Function Name: static int sddev_disable_dma_0(void);
tvendov 2:7c75ab32d7c9 948 * Description : Disable DMAC transfer
tvendov 2:7c75ab32d7c9 949 * Arguments : none
tvendov 2:7c75ab32d7c9 950 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 951 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 952 ******************************************************************************/
tvendov 2:7c75ab32d7c9 953 static int sddev_disable_dma_0(void)
tvendov 2:7c75ab32d7c9 954 {
tvendov 2:7c75ab32d7c9 955 #ifdef SDCFG_TRNS_DMA
tvendov 2:7c75ab32d7c9 956 uint32_t remain;
tvendov 2:7c75ab32d7c9 957
tvendov 2:7c75ab32d7c9 958 sd_DMAC1_Close(&remain);
tvendov 2:7c75ab32d7c9 959 #endif
tvendov 2:7c75ab32d7c9 960 return SD_OK;
tvendov 2:7c75ab32d7c9 961 }
tvendov 2:7c75ab32d7c9 962
tvendov 2:7c75ab32d7c9 963 /******************************************************************************
tvendov 2:7c75ab32d7c9 964 * Function Name: staticint sddev_disable_dma_1(void);
tvendov 2:7c75ab32d7c9 965 * Description : Disable DMAC transfer
tvendov 2:7c75ab32d7c9 966 * Arguments : none
tvendov 2:7c75ab32d7c9 967 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 968 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 969 ******************************************************************************/
tvendov 2:7c75ab32d7c9 970 static int sddev_disable_dma_1(void)
tvendov 2:7c75ab32d7c9 971 {
tvendov 2:7c75ab32d7c9 972 #ifdef SDCFG_TRNS_DMA
tvendov 2:7c75ab32d7c9 973 uint32_t remain;
tvendov 2:7c75ab32d7c9 974
tvendov 2:7c75ab32d7c9 975 sd_DMAC2_Close(&remain);
tvendov 2:7c75ab32d7c9 976 #endif
tvendov 2:7c75ab32d7c9 977 return SD_OK;
tvendov 2:7c75ab32d7c9 978 }
tvendov 2:7c75ab32d7c9 979
tvendov 2:7c75ab32d7c9 980 /******************************************************************************
tvendov 2:7c75ab32d7c9 981 * Function Name: int sddev_loc_cpu(int sd_port);
tvendov 2:7c75ab32d7c9 982 * Description : lock cpu to disable interrupt
tvendov 2:7c75ab32d7c9 983 * Arguments : none
tvendov 2:7c75ab32d7c9 984 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 985 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 986 ******************************************************************************/
tvendov 2:7c75ab32d7c9 987 int sddev_loc_cpu(int sd_port)
tvendov 2:7c75ab32d7c9 988 {
tvendov 2:7c75ab32d7c9 989 #if 0
tvendov 2:7c75ab32d7c9 990 R_INTC_GetMaskLevel(&g_sdhi_priority_backup);
tvendov 2:7c75ab32d7c9 991 R_INTC_SetMaskLevel(0);
tvendov 2:7c75ab32d7c9 992 core_util_critical_section_enter();
tvendov 2:7c75ab32d7c9 993 #endif
tvendov 2:7c75ab32d7c9 994
tvendov 2:7c75ab32d7c9 995 return SD_OK;
tvendov 2:7c75ab32d7c9 996 }
tvendov 2:7c75ab32d7c9 997
tvendov 2:7c75ab32d7c9 998 /******************************************************************************
tvendov 2:7c75ab32d7c9 999 * Function Name: int sddev_unl_cpu(int sd_port);
tvendov 2:7c75ab32d7c9 1000 * Description : unlock cpu to enable interrupt
tvendov 2:7c75ab32d7c9 1001 * Arguments : none
tvendov 2:7c75ab32d7c9 1002 * Return Value : success : SD_OK
tvendov 2:7c75ab32d7c9 1003 * : fail : SD_ERR
tvendov 2:7c75ab32d7c9 1004 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1005 int sddev_unl_cpu(int sd_port)
tvendov 2:7c75ab32d7c9 1006 {
tvendov 2:7c75ab32d7c9 1007 #if 0
tvendov 2:7c75ab32d7c9 1008 R_INTC_SetMaskLevel(g_sdhi_priority_backup);
tvendov 2:7c75ab32d7c9 1009 core_util_critical_section_exit();
tvendov 2:7c75ab32d7c9 1010 #endif
tvendov 2:7c75ab32d7c9 1011 return SD_OK;
tvendov 2:7c75ab32d7c9 1012 }
tvendov 2:7c75ab32d7c9 1013
tvendov 2:7c75ab32d7c9 1014 /******************************************************************************
tvendov 2:7c75ab32d7c9 1015 * Function Name: int sddev_finalize(int sd_port);
tvendov 2:7c75ab32d7c9 1016 * Description : finalize SDHI
tvendov 2:7c75ab32d7c9 1017 * Arguments : none
tvendov 2:7c75ab32d7c9 1018 * Return Value : none
tvendov 2:7c75ab32d7c9 1019 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1020 int sddev_finalize(int sd_port)
tvendov 2:7c75ab32d7c9 1021 {
tvendov 2:7c75ab32d7c9 1022 return SD_OK;
tvendov 2:7c75ab32d7c9 1023 }
tvendov 2:7c75ab32d7c9 1024
tvendov 2:7c75ab32d7c9 1025 /******************************************************************************
tvendov 2:7c75ab32d7c9 1026 * Function Name: static void sddev_sd_int_handler_0(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 1027 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_0,INTC_ID_SDHI0_3)
tvendov 2:7c75ab32d7c9 1028 * Arguments : Interrupt mode
tvendov 2:7c75ab32d7c9 1029 * Return Value : none
tvendov 2:7c75ab32d7c9 1030 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1031 static void sddev_sd_int_handler_0(uint32_t int_sense)
tvendov 2:7c75ab32d7c9 1032 {
tvendov 2:7c75ab32d7c9 1033 sd_int_handler(0);
tvendov 2:7c75ab32d7c9 1034 }
tvendov 2:7c75ab32d7c9 1035
tvendov 2:7c75ab32d7c9 1036 /******************************************************************************
tvendov 2:7c75ab32d7c9 1037 * Function Name: static void sddev_sd_int_handler_1(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 1038 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_0,INTC_ID_SDHI0_3)
tvendov 2:7c75ab32d7c9 1039 * Arguments : Interrupt mode
tvendov 2:7c75ab32d7c9 1040 * Return Value : none
tvendov 2:7c75ab32d7c9 1041 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1042 static void sddev_sd_int_handler_1(uint32_t int_sense)
tvendov 2:7c75ab32d7c9 1043 {
tvendov 2:7c75ab32d7c9 1044 sd_int_handler(1);
tvendov 2:7c75ab32d7c9 1045 }
tvendov 2:7c75ab32d7c9 1046
tvendov 2:7c75ab32d7c9 1047 /******************************************************************************
tvendov 2:7c75ab32d7c9 1048 * Function Name: static void sddev_sdio_int_handler_0(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 1049 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_1)
tvendov 2:7c75ab32d7c9 1050 * Arguments : Interrupt mode
tvendov 2:7c75ab32d7c9 1051 * Return Value : none
tvendov 2:7c75ab32d7c9 1052 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1053 static void sddev_sdio_int_handler_0(uint32_t int_sense)
tvendov 2:7c75ab32d7c9 1054 {
tvendov 2:7c75ab32d7c9 1055 sdio_int_handler(0);
tvendov 2:7c75ab32d7c9 1056 }
tvendov 2:7c75ab32d7c9 1057
tvendov 2:7c75ab32d7c9 1058 /******************************************************************************
tvendov 2:7c75ab32d7c9 1059 * Function Name: static void sddev_sdio_int_handler_1(uint32_t int_sense);
tvendov 2:7c75ab32d7c9 1060 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI1_1)
tvendov 2:7c75ab32d7c9 1061 * Arguments : Interrupt mode
tvendov 2:7c75ab32d7c9 1062 * Return Value : none
tvendov 2:7c75ab32d7c9 1063 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1064 static void sddev_sdio_int_handler_1(uint32_t int_sense)
tvendov 2:7c75ab32d7c9 1065 {
tvendov 2:7c75ab32d7c9 1066 sdio_int_handler(1);
tvendov 2:7c75ab32d7c9 1067 }
tvendov 2:7c75ab32d7c9 1068
tvendov 2:7c75ab32d7c9 1069 /******************************************************************************
tvendov 2:7c75ab32d7c9 1070 * Function Name: static void sddev_start_timer(int msec);
tvendov 2:7c75ab32d7c9 1071 * Description : start timer
tvendov 2:7c75ab32d7c9 1072 * Arguments :
tvendov 2:7c75ab32d7c9 1073 * Return Value : none
tvendov 2:7c75ab32d7c9 1074 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1075 static void sddev_start_timer(int msec)
tvendov 2:7c75ab32d7c9 1076 {
tvendov 2:7c75ab32d7c9 1077 _ticker = get_us_ticker_data();
tvendov 2:7c75ab32d7c9 1078 _ulStart = ticker_read(_ticker);
tvendov 2:7c75ab32d7c9 1079 _ulDelta = msec*1000ul;
tvendov 2:7c75ab32d7c9 1080 }
tvendov 2:7c75ab32d7c9 1081
tvendov 2:7c75ab32d7c9 1082 /******************************************************************************
tvendov 2:7c75ab32d7c9 1083 * Function Name: static void sddev_end_timer(void);
tvendov 2:7c75ab32d7c9 1084 * Description : end timer
tvendov 2:7c75ab32d7c9 1085 * Arguments :
tvendov 2:7c75ab32d7c9 1086 * Return Value : none
tvendov 2:7c75ab32d7c9 1087 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1088 static void sddev_end_timer(void)
tvendov 2:7c75ab32d7c9 1089 {
tvendov 2:7c75ab32d7c9 1090 _ulStart = 0ul;
tvendov 2:7c75ab32d7c9 1091 _ulDelta = 0ul;
tvendov 2:7c75ab32d7c9 1092 }
tvendov 2:7c75ab32d7c9 1093
tvendov 2:7c75ab32d7c9 1094 /******************************************************************************
tvendov 2:7c75ab32d7c9 1095 * Function Name: static int sddev_check_timer(void);
tvendov 2:7c75ab32d7c9 1096 * Description : check
tvendov 2:7c75ab32d7c9 1097 * Arguments :
tvendov 2:7c75ab32d7c9 1098 * Return Value : t
tvendov 2:7c75ab32d7c9 1099 ******************************************************************************/
tvendov 2:7c75ab32d7c9 1100 static int sddev_check_timer(void)
tvendov 2:7c75ab32d7c9 1101 {
tvendov 2:7c75ab32d7c9 1102 if ( _ulStart && _ulDelta )
tvendov 2:7c75ab32d7c9 1103 {
tvendov 2:7c75ab32d7c9 1104 return ((ticker_read(_ticker)-_ulStart) < _ulDelta) ? SD_OK : SD_ERR;
tvendov 2:7c75ab32d7c9 1105 }
tvendov 2:7c75ab32d7c9 1106 else
tvendov 2:7c75ab32d7c9 1107 {
tvendov 2:7c75ab32d7c9 1108 return SD_ERR;
tvendov 2:7c75ab32d7c9 1109 }
tvendov 2:7c75ab32d7c9 1110 }
tvendov 2:7c75ab32d7c9 1111
tvendov 2:7c75ab32d7c9 1112 /* End of File */
tvendov 2:7c75ab32d7c9 1113