SDHI_driver patch (mbedOS 5.11.5)

Committer:
tvendov
Date:
Mon Mar 18 16:54:40 2019 +0000
Revision:
0:e1f465d87307
Child:
1:6f9a14a6bcac
Initial_II

Who changed what in which revision?

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