SDHI_driver patch (mbedOS 5.11.5)

Committer:
tvendov
Date:
Mon Mar 18 11:46:29 2019 +0000
Revision:
0:e669d762f08a
SDHI driver initial release

Who changed what in which revision?

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