SDHI_driver patch (mbedOS 5.11.5)

Committer:
tvendov
Date:
Wed Mar 20 17:51:14 2019 +0000
Revision:
1:6f9a14a6bcac
Parent:
0:e1f465d87307
Fix: No more SYNC_FAIL. SD Tests are running smoothly!

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 1:6f9a14a6bcac 258 osDelay(100); /* wait 100ms */
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 1:6f9a14a6bcac 302 #ifdef __CC_ARM
tvendov 1:6f9a14a6bcac 303 #pragma push
tvendov 1:6f9a14a6bcac 304 #pragma Ospace
tvendov 1:6f9a14a6bcac 305 #elif defined(__ICCARM__)
tvendov 1:6f9a14a6bcac 306 #pragma optimize=size
tvendov 1:6f9a14a6bcac 307 #elif (defined( __GNUC__ ) && !defined( __CC_ARM ))
tvendov 1:6f9a14a6bcac 308 #pragma GCC push_options
tvendov 1:6f9a14a6bcac 309 #pragma GCC optimize ("Os")
tvendov 1:6f9a14a6bcac 310 #endif
tvendov 0:e1f465d87307 311 int sddev_read_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num)
tvendov 0:e1f465d87307 312 {
tvendov 0:e1f465d87307 313 long i;
tvendov 0:e1f465d87307 314 long cnt;
tvendov 0:e1f465d87307 315 unsigned long *reg;
tvendov 0:e1f465d87307 316 unsigned long *ptr_l;
tvendov 0:e1f465d87307 317 unsigned char *ptr_c;
tvendov 0:e1f465d87307 318 unsigned long tmp;
tvendov 0:e1f465d87307 319
tvendov 0:e1f465d87307 320 reg = (unsigned long *)(reg_addr);
tvendov 0:e1f465d87307 321
tvendov 0:e1f465d87307 322 cnt = (num / 4);
tvendov 0:e1f465d87307 323 if(((unsigned long)buff & 0x3) != 0)
tvendov 0:e1f465d87307 324 {
tvendov 0:e1f465d87307 325 ptr_c = (unsigned char *)buff;
tvendov 0:e1f465d87307 326 for(i = cnt; i > 0 ; i--)
tvendov 0:e1f465d87307 327 {
tvendov 0:e1f465d87307 328 tmp = *reg;
tvendov 0:e1f465d87307 329 *ptr_c++ = (unsigned char)(tmp);
tvendov 0:e1f465d87307 330 *ptr_c++ = (unsigned char)(tmp >> 8);
tvendov 0:e1f465d87307 331 *ptr_c++ = (unsigned char)(tmp >> 16);
tvendov 0:e1f465d87307 332 *ptr_c++ = (unsigned char)(tmp >> 24);
tvendov 0:e1f465d87307 333 }
tvendov 0:e1f465d87307 334
tvendov 0:e1f465d87307 335 cnt = (num % 4);
tvendov 0:e1f465d87307 336 if( cnt != 0 )
tvendov 0:e1f465d87307 337 {
tvendov 0:e1f465d87307 338 tmp = *reg;
tvendov 0:e1f465d87307 339 for(i = cnt; i > 0 ; i--)
tvendov 0:e1f465d87307 340 {
tvendov 0:e1f465d87307 341 *ptr_c++ = (unsigned char)(tmp);
tvendov 0:e1f465d87307 342 tmp >>= 8;
tvendov 0:e1f465d87307 343 }
tvendov 0:e1f465d87307 344 }
tvendov 0:e1f465d87307 345 }
tvendov 0:e1f465d87307 346 else
tvendov 0:e1f465d87307 347 {
tvendov 0:e1f465d87307 348 ptr_l = (unsigned long *)buff;
tvendov 0:e1f465d87307 349 for(i = cnt; i > 0 ; i--)
tvendov 0:e1f465d87307 350 {
tvendov 0:e1f465d87307 351 *ptr_l++ = *reg;
tvendov 0:e1f465d87307 352 }
tvendov 0:e1f465d87307 353
tvendov 0:e1f465d87307 354 cnt = (num % 4);
tvendov 0:e1f465d87307 355 if( cnt != 0 )
tvendov 0:e1f465d87307 356 {
tvendov 0:e1f465d87307 357 ptr_c = (unsigned char *)ptr_l;
tvendov 0:e1f465d87307 358 tmp = *reg;
tvendov 0:e1f465d87307 359 for(i = cnt; i > 0 ; i--)
tvendov 0:e1f465d87307 360 {
tvendov 0:e1f465d87307 361 *ptr_c++ = (unsigned char)(tmp);
tvendov 0:e1f465d87307 362 tmp >>= 8;
tvendov 0:e1f465d87307 363 }
tvendov 0:e1f465d87307 364 }
tvendov 0:e1f465d87307 365 }
tvendov 0:e1f465d87307 366
tvendov 0:e1f465d87307 367 return SD_OK;
tvendov 0:e1f465d87307 368 }
tvendov 1:6f9a14a6bcac 369 #ifdef __CC_ARM
tvendov 1:6f9a14a6bcac 370 #pragma pop
tvendov 1:6f9a14a6bcac 371 #elif (defined( __GNUC__ ) && !defined( __CC_ARM ))
tvendov 1:6f9a14a6bcac 372 #pragma GCC pop_options
tvendov 1:6f9a14a6bcac 373 #endif
tvendov 0:e1f465d87307 374
tvendov 0:e1f465d87307 375 /******************************************************************************
tvendov 0:e1f465d87307 376 * Function Name: int sddev_write_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num);
tvendov 0:e1f465d87307 377 * Description : write to SDHI buffer FIFO
tvendov 0:e1f465d87307 378 * Arguments : unsigned char *buff : buffer addrees to store writting datas
tvendov 0:e1f465d87307 379 * : unsigned long reg_addr : SDIP FIFO address
tvendov 0:e1f465d87307 380 * : long num : counts to write(unit:byte)
tvendov 0:e1f465d87307 381 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 382 * : fail : SD_ERR
tvendov 0:e1f465d87307 383 ******************************************************************************/
tvendov 0:e1f465d87307 384 int sddev_write_data(int sd_port, unsigned char *buff,unsigned long reg_addr,long num)
tvendov 0:e1f465d87307 385 {
tvendov 0:e1f465d87307 386 long i;
tvendov 0:e1f465d87307 387 unsigned long *reg = (unsigned long *)(reg_addr);
tvendov 0:e1f465d87307 388 unsigned long *ptr = (unsigned long *)buff;
tvendov 0:e1f465d87307 389 unsigned long tmp;
tvendov 0:e1f465d87307 390
tvendov 0:e1f465d87307 391 /* dont care non 4byte allignment data */
tvendov 0:e1f465d87307 392 num += 3;
tvendov 0:e1f465d87307 393 num /= 4;
tvendov 0:e1f465d87307 394 if(((unsigned long)buff & 0x3) != 0)
tvendov 0:e1f465d87307 395 {
tvendov 0:e1f465d87307 396 for(i = num; i > 0 ; i--)
tvendov 0:e1f465d87307 397 {
tvendov 0:e1f465d87307 398 tmp = *buff++ ;
tvendov 0:e1f465d87307 399 tmp |= *buff++ << 8;
tvendov 0:e1f465d87307 400 tmp |= *buff++ << 16;
tvendov 0:e1f465d87307 401 tmp |= *buff++ << 24;
tvendov 0:e1f465d87307 402 *reg = tmp;
tvendov 0:e1f465d87307 403 }
tvendov 0:e1f465d87307 404 }
tvendov 0:e1f465d87307 405 else
tvendov 0:e1f465d87307 406 {
tvendov 0:e1f465d87307 407 for(i = num; i > 0 ; i--)
tvendov 0:e1f465d87307 408 {
tvendov 0:e1f465d87307 409 *reg = *ptr++;
tvendov 0:e1f465d87307 410 }
tvendov 0:e1f465d87307 411 }
tvendov 0:e1f465d87307 412
tvendov 0:e1f465d87307 413 return SD_OK;
tvendov 0:e1f465d87307 414 }
tvendov 0:e1f465d87307 415
tvendov 0:e1f465d87307 416 /******************************************************************************
tvendov 0:e1f465d87307 417 * Function Name: unsigned int sddev_get_clockdiv(int sd_port, int clock);
tvendov 0:e1f465d87307 418 * Description : write to SDHI buffer FIFO
tvendov 0:e1f465d87307 419 * Arguments : int clock : request clock frequency
tvendov 0:e1f465d87307 420 * : SD_CLK_50MHz
tvendov 0:e1f465d87307 421 * : SD_CLK_25MHz
tvendov 0:e1f465d87307 422 * : SD_CLK_20MHz
tvendov 0:e1f465d87307 423 * : SD_CLK_10MHz
tvendov 0:e1f465d87307 424 * : SD_CLK_5MHz
tvendov 0:e1f465d87307 425 * : SD_CLK_1MHz
tvendov 0:e1f465d87307 426 * : SD_CLK_400kHz
tvendov 0:e1f465d87307 427 * Return Value : clock div value
tvendov 0:e1f465d87307 428 * : SD_DIV_2 : 1/2 clock
tvendov 0:e1f465d87307 429 * : SD_DIV_2 : 1/4 clock
tvendov 0:e1f465d87307 430 * : SD_DIV_2 : 1/8 clock
tvendov 0:e1f465d87307 431 * : SD_DIV_2 : 1/16 clock
tvendov 0:e1f465d87307 432 * : SD_DIV_2 : 1/128 clock
tvendov 0:e1f465d87307 433 * : SD_DIV_2 : 1/256 clock
tvendov 0:e1f465d87307 434 ******************************************************************************/
tvendov 0:e1f465d87307 435 unsigned int sddev_get_clockdiv(int sd_port, int clock)
tvendov 0:e1f465d87307 436 {
tvendov 0:e1f465d87307 437 unsigned int div;
tvendov 0:e1f465d87307 438
tvendov 0:e1f465d87307 439 switch(clock)
tvendov 0:e1f465d87307 440 {
tvendov 0:e1f465d87307 441 case SD_CLK_50MHz:
tvendov 0:e1f465d87307 442 div = SD_DIV_2; /* 64MHz/2 = 32MHz */
tvendov 0:e1f465d87307 443 break;
tvendov 0:e1f465d87307 444 case SD_CLK_25MHz:
tvendov 0:e1f465d87307 445 div = SD_DIV_4; /* 64MHz/4 = 16MHz */
tvendov 0:e1f465d87307 446 break;
tvendov 0:e1f465d87307 447 case SD_CLK_20MHz:
tvendov 0:e1f465d87307 448 div = SD_DIV_4; /* 64MHz/4 = 16MHz */
tvendov 0:e1f465d87307 449 break;
tvendov 0:e1f465d87307 450 case SD_CLK_10MHz:
tvendov 0:e1f465d87307 451 div = SD_DIV_8; /* 64MHz/8 = 8MHz */
tvendov 0:e1f465d87307 452 break;
tvendov 0:e1f465d87307 453 case SD_CLK_5MHz:
tvendov 0:e1f465d87307 454 div = SD_DIV_16; /* 64MHz/16 = 4MHz */
tvendov 0:e1f465d87307 455 break;
tvendov 0:e1f465d87307 456 case SD_CLK_1MHz:
tvendov 0:e1f465d87307 457 div = SD_DIV_128; /* 64MHz/128 = 512kHz */
tvendov 0:e1f465d87307 458 break;
tvendov 0:e1f465d87307 459 case SD_CLK_400kHz:
tvendov 0:e1f465d87307 460 div = SD_DIV_256; /* 64MHz/256 = 256kHz */
tvendov 0:e1f465d87307 461 break;
tvendov 0:e1f465d87307 462 default:
tvendov 0:e1f465d87307 463 div = SD_DIV_256;
tvendov 0:e1f465d87307 464 break;
tvendov 0:e1f465d87307 465 }
tvendov 0:e1f465d87307 466
tvendov 0:e1f465d87307 467 return div;
tvendov 0:e1f465d87307 468 }
tvendov 0:e1f465d87307 469
tvendov 0:e1f465d87307 470 /******************************************************************************
tvendov 0:e1f465d87307 471 * Function Name: int sddev_set_port(int sd_port, int mode);
tvendov 0:e1f465d87307 472 * Description : setting ports to use MMCHI
tvendov 0:e1f465d87307 473 * Arguments : int mode : SD_PORT_PARALLEL : 4bit mode
tvendov 0:e1f465d87307 474 * : SD_PORT_SERIAL : 1bit mode
tvendov 0:e1f465d87307 475 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 476 * : fail : SD_ERR
tvendov 0:e1f465d87307 477 ******************************************************************************/
tvendov 0:e1f465d87307 478 int sddev_set_port(int sd_port, int mode)
tvendov 0:e1f465d87307 479 {
tvendov 0:e1f465d87307 480 if ( sd_port >= SDHI_COUNT)
tvendov 0:e1f465d87307 481 return SD_ERR;
tvendov 0:e1f465d87307 482
tvendov 0:e1f465d87307 483 if(mode == SD_PORT_SERIAL)
tvendov 0:e1f465d87307 484 {
tvendov 0:e1f465d87307 485 for( uint32_t no=0; no < SDHI_PINS_SERIAL; no++ )
tvendov 0:e1f465d87307 486 {
tvendov 0:e1f465d87307 487 if ( pinmap_peripheral(SDHIpin_serial[sd_port][no], PinMap_SDHI_PIN ) != sd_port)
tvendov 0:e1f465d87307 488 {
tvendov 0:e1f465d87307 489 return SD_ERR;
tvendov 0:e1f465d87307 490 }
tvendov 0:e1f465d87307 491 pinmap_pinout(SDHIpin_serial[sd_port][no], PinMap_SDHI_PIN);
tvendov 0:e1f465d87307 492 }
tvendov 0:e1f465d87307 493 }
tvendov 0:e1f465d87307 494 else if( mode == SD_PORT_PARALLEL )
tvendov 0:e1f465d87307 495 {
tvendov 0:e1f465d87307 496 for( uint32_t no=0; no < SDHI_PINS_PARALLEL; no++ )
tvendov 0:e1f465d87307 497 {
tvendov 0:e1f465d87307 498 if ( pinmap_peripheral(SDHIpin_parallel[sd_port][no], PinMap_SDHI_PIN ) != sd_port)
tvendov 0:e1f465d87307 499 {
tvendov 0:e1f465d87307 500 return SD_ERR;
tvendov 0:e1f465d87307 501 }
tvendov 0:e1f465d87307 502 pinmap_pinout(SDHIpin_parallel[sd_port][no], PinMap_SDHI_PIN);
tvendov 0:e1f465d87307 503 }
tvendov 0:e1f465d87307 504 }
tvendov 0:e1f465d87307 505 else
tvendov 0:e1f465d87307 506 {
tvendov 0:e1f465d87307 507 return SD_ERR;
tvendov 0:e1f465d87307 508 }
tvendov 0:e1f465d87307 509
tvendov 0:e1f465d87307 510 return SD_OK;
tvendov 0:e1f465d87307 511 }
tvendov 0:e1f465d87307 512
tvendov 0:e1f465d87307 513
tvendov 0:e1f465d87307 514 /******************************************************************************
tvendov 0:e1f465d87307 515 * Function Name: int sddev_int_wait(int sd_port, int time);
tvendov 0:e1f465d87307 516 * Description : Waitting for SDHI Interrupt
tvendov 0:e1f465d87307 517 * Arguments : int time : time out value to wait interrupt
tvendov 0:e1f465d87307 518 * Return Value : get interrupt : SD_OK
tvendov 0:e1f465d87307 519 * : time out : SD_ERR
tvendov 0:e1f465d87307 520 ******************************************************************************/
tvendov 0:e1f465d87307 521 int sddev_int_wait(int sd_port, int time)
tvendov 0:e1f465d87307 522 {
tvendov 0:e1f465d87307 523 sddev_start_timer(time);
tvendov 0:e1f465d87307 524 while( sddev_check_timer() == SD_OK )
tvendov 0:e1f465d87307 525 {
tvendov 0:e1f465d87307 526 /* interrupt generated? */
tvendov 0:e1f465d87307 527 if(sd_check_int(sd_port) == SD_OK)
tvendov 0:e1f465d87307 528 {
tvendov 0:e1f465d87307 529 sddev_end_timer();
tvendov 0:e1f465d87307 530 return SD_OK;
tvendov 0:e1f465d87307 531 }
tvendov 0:e1f465d87307 532 }
tvendov 0:e1f465d87307 533
tvendov 0:e1f465d87307 534 sddev_end_timer();
tvendov 0:e1f465d87307 535
tvendov 0:e1f465d87307 536 return SD_ERR;
tvendov 0:e1f465d87307 537 }
tvendov 0:e1f465d87307 538
tvendov 0:e1f465d87307 539 /******************************************************************************
tvendov 0:e1f465d87307 540 * Function Name: int sddev_init_dma(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 0:e1f465d87307 541 * Description : Initialize DMAC to transfer data from SDHI FIFO
tvendov 0:e1f465d87307 542 * Arguments : unsigned long buff : buffer addrees to transfer datas
tvendov 0:e1f465d87307 543 * : unsigned long reg : SDIP FIFO address
tvendov 0:e1f465d87307 544 * : long cnt : counts to transfer(unit:byte)
tvendov 0:e1f465d87307 545 * : int dir : direction to transfer
tvendov 0:e1f465d87307 546 * : : 0 : FIFO -> buffer
tvendov 0:e1f465d87307 547 * : : 1 : buffer -> FIFO
tvendov 0:e1f465d87307 548 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 549 * : fail : SD_ERR
tvendov 0:e1f465d87307 550 ******************************************************************************/
tvendov 0:e1f465d87307 551 int sddev_init_dma(int sd_port, unsigned long buff,unsigned long reg,long cnt,int dir)
tvendov 0:e1f465d87307 552 {
tvendov 0:e1f465d87307 553 int ret;
tvendov 0:e1f465d87307 554
tvendov 0:e1f465d87307 555 if( sd_port == 0 )
tvendov 0:e1f465d87307 556 {
tvendov 0:e1f465d87307 557 ret = sddev_init_dma_0(buff, reg, cnt, dir);
tvendov 0:e1f465d87307 558 }
tvendov 0:e1f465d87307 559 else if( sd_port == 1 )
tvendov 0:e1f465d87307 560 {
tvendov 0:e1f465d87307 561 ret = sddev_init_dma_1(buff, reg, cnt, dir);
tvendov 0:e1f465d87307 562 }
tvendov 0:e1f465d87307 563
tvendov 0:e1f465d87307 564 return ret;
tvendov 0:e1f465d87307 565 }
tvendov 0:e1f465d87307 566
tvendov 0:e1f465d87307 567 /******************************************************************************
tvendov 0:e1f465d87307 568 * Function Name: static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 0:e1f465d87307 569 * Description : Initialize DMAC to transfer data from SDHI FIFO
tvendov 0:e1f465d87307 570 * Arguments : unsigned long buff : buffer addrees to transfer datas
tvendov 0:e1f465d87307 571 * : unsigned long reg : SDIP FIFO address
tvendov 0:e1f465d87307 572 * : long cnt : counts to transfer(unit:byte)
tvendov 0:e1f465d87307 573 * : int dir : direction to transfer
tvendov 0:e1f465d87307 574 * : : 0 : FIFO -> buffer
tvendov 0:e1f465d87307 575 * : : 1 : buffer -> FIFO
tvendov 0:e1f465d87307 576 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 577 * : fail : SD_ERR
tvendov 0:e1f465d87307 578 ******************************************************************************/
tvendov 0:e1f465d87307 579 static int sddev_init_dma_0(unsigned long buff,unsigned long reg,long cnt,int dir)
tvendov 0:e1f465d87307 580 {
tvendov 0:e1f465d87307 581 #ifdef SDCFG_TRNS_DMA
tvendov 0:e1f465d87307 582 dmac_transinfo_t trans_info;
tvendov 0:e1f465d87307 583 uint32_t request_factor;
tvendov 0:e1f465d87307 584 int32_t ret;
tvendov 0:e1f465d87307 585
tvendov 0:e1f465d87307 586 trans_info.count = (uint32_t)cnt;
tvendov 0:e1f465d87307 587 #ifdef SDCFG_TRANS_DMA_64
tvendov 0:e1f465d87307 588 if( (cnt % 64) != 0 )
tvendov 0:e1f465d87307 589 {
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 if( reg & 0x0000003f )
tvendov 0:e1f465d87307 593 {
tvendov 0:e1f465d87307 594 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 595 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 596 }
tvendov 0:e1f465d87307 597 }
tvendov 0:e1f465d87307 598 else
tvendov 0:e1f465d87307 599 {
tvendov 0:e1f465d87307 600 trans_info.src_size = DMAC_TRANS_SIZE_512;
tvendov 0:e1f465d87307 601 trans_info.dst_size = DMAC_TRANS_SIZE_512;
tvendov 0:e1f465d87307 602 }
tvendov 0:e1f465d87307 603 #else
tvendov 0:e1f465d87307 604 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 605 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 606 #endif
tvendov 0:e1f465d87307 607
tvendov 0:e1f465d87307 608 if( dir == 0 )
tvendov 0:e1f465d87307 609 {
tvendov 0:e1f465d87307 610 request_factor = DMAC_REQ_SDHI_0_RX;
tvendov 0:e1f465d87307 611 trans_info.src_addr = (uint32_t)reg;
tvendov 0:e1f465d87307 612 trans_info.dst_addr = (uint32_t)buff;
tvendov 0:e1f465d87307 613 trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 0:e1f465d87307 614 trans_info.daddr_dir = DMAC_TRANS_ADR_INC;
tvendov 0:e1f465d87307 615 }
tvendov 0:e1f465d87307 616 else if( dir == 1 )
tvendov 0:e1f465d87307 617 {
tvendov 0:e1f465d87307 618 request_factor = DMAC_REQ_SDHI_0_TX;
tvendov 0:e1f465d87307 619 trans_info.src_addr = (uint32_t)buff;
tvendov 0:e1f465d87307 620 trans_info.dst_addr = (uint32_t)reg;
tvendov 0:e1f465d87307 621 trans_info.saddr_dir = DMAC_TRANS_ADR_INC;
tvendov 0:e1f465d87307 622 trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 0:e1f465d87307 623 }
tvendov 0:e1f465d87307 624
tvendov 0:e1f465d87307 625 sd_DMAC1_PeriReqInit( (const dmac_transinfo_t *)&trans_info,
tvendov 0:e1f465d87307 626 DMAC_MODE_REGISTER,
tvendov 0:e1f465d87307 627 DMAC_SAMPLE_SINGLE,
tvendov 0:e1f465d87307 628 request_factor,
tvendov 0:e1f465d87307 629 0 ); /* Dont care DMAC_REQ_REQD is setting in usb0_host_DMAC1_PeriReqInit() */
tvendov 0:e1f465d87307 630
tvendov 0:e1f465d87307 631 ret = sd_DMAC1_Open(DMAC_REQ_MODE_PERI);
tvendov 0:e1f465d87307 632 if( ret != 0 )
tvendov 0:e1f465d87307 633 {
tvendov 0:e1f465d87307 634 printf("DMAC1 Open error!!\n");
tvendov 0:e1f465d87307 635 return SD_ERR;
tvendov 0:e1f465d87307 636 }
tvendov 0:e1f465d87307 637 #endif
tvendov 0:e1f465d87307 638
tvendov 0:e1f465d87307 639 return SD_OK;
tvendov 0:e1f465d87307 640 }
tvendov 0:e1f465d87307 641
tvendov 0:e1f465d87307 642 /******************************************************************************
tvendov 0:e1f465d87307 643 * Function Name: static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir);
tvendov 0:e1f465d87307 644 * Description : Initialize DMAC to transfer data from SDHI FIFO
tvendov 0:e1f465d87307 645 * Arguments : unsigned long buff : buffer address to transfer datas
tvendov 0:e1f465d87307 646 * : unsigned long reg : SDIP FIFO address
tvendov 0:e1f465d87307 647 * : long cnt : counts to transfer(unit:byte)
tvendov 0:e1f465d87307 648 * : int dir : direction to transfer
tvendov 0:e1f465d87307 649 * : : 0 : FIFO -> buffer
tvendov 0:e1f465d87307 650 * : : 1 : buffer -> FIFO
tvendov 0:e1f465d87307 651 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 652 * : fail : SD_ERR
tvendov 0:e1f465d87307 653 ******************************************************************************/
tvendov 0:e1f465d87307 654 static int sddev_init_dma_1(unsigned long buff,unsigned long reg,long cnt,int dir)
tvendov 0:e1f465d87307 655 {
tvendov 0:e1f465d87307 656 #ifdef SDCFG_TRNS_DMA
tvendov 0:e1f465d87307 657 dmac_transinfo_t trans_info;
tvendov 0:e1f465d87307 658 uint32_t request_factor;
tvendov 0:e1f465d87307 659 int32_t ret;
tvendov 0:e1f465d87307 660
tvendov 0:e1f465d87307 661 trans_info.count = (uint32_t)cnt;
tvendov 0:e1f465d87307 662 #ifdef SDCFG_TRANS_DMA_64
tvendov 0:e1f465d87307 663 if( (cnt % 64) != 0 )
tvendov 0:e1f465d87307 664 {
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 if( reg & 0x0000003f )
tvendov 0:e1f465d87307 668 {
tvendov 0:e1f465d87307 669 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 670 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 671 }
tvendov 0:e1f465d87307 672 }
tvendov 0:e1f465d87307 673 else
tvendov 0:e1f465d87307 674 {
tvendov 0:e1f465d87307 675 trans_info.src_size = DMAC_TRANS_SIZE_512;
tvendov 0:e1f465d87307 676 trans_info.dst_size = DMAC_TRANS_SIZE_512;
tvendov 0:e1f465d87307 677 }
tvendov 0:e1f465d87307 678 #else
tvendov 0:e1f465d87307 679 trans_info.src_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 680 trans_info.dst_size = DMAC_TRANS_SIZE_32;
tvendov 0:e1f465d87307 681 #endif
tvendov 0:e1f465d87307 682
tvendov 0:e1f465d87307 683 if( dir == 0 )
tvendov 0:e1f465d87307 684 {
tvendov 0:e1f465d87307 685 request_factor = DMAC_REQ_SDHI_1_RX;
tvendov 0:e1f465d87307 686 trans_info.src_addr = (uint32_t)reg;
tvendov 0:e1f465d87307 687 trans_info.dst_addr = (uint32_t)buff;
tvendov 0:e1f465d87307 688 trans_info.saddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 0:e1f465d87307 689 trans_info.daddr_dir = DMAC_TRANS_ADR_INC;
tvendov 0:e1f465d87307 690 }
tvendov 0:e1f465d87307 691 else if( dir == 1 )
tvendov 0:e1f465d87307 692 {
tvendov 0:e1f465d87307 693 request_factor = DMAC_REQ_SDHI_1_TX;
tvendov 0:e1f465d87307 694 trans_info.src_addr = (uint32_t)buff;
tvendov 0:e1f465d87307 695 trans_info.dst_addr = (uint32_t)reg;
tvendov 0:e1f465d87307 696 trans_info.saddr_dir = DMAC_TRANS_ADR_INC;
tvendov 0:e1f465d87307 697 trans_info.daddr_dir = DMAC_TRANS_ADR_NO_INC;
tvendov 0:e1f465d87307 698 }
tvendov 0:e1f465d87307 699
tvendov 0:e1f465d87307 700 sd_DMAC2_PeriReqInit( (const dmac_transinfo_t *)&trans_info,
tvendov 0:e1f465d87307 701 DMAC_MODE_REGISTER,
tvendov 0:e1f465d87307 702 DMAC_SAMPLE_SINGLE,
tvendov 0:e1f465d87307 703 request_factor,
tvendov 0:e1f465d87307 704 0 ); /* Dont care DMAC_REQ_REQD is setting in usb0_host_DMAC1_PeriReqInit() */
tvendov 0:e1f465d87307 705
tvendov 0:e1f465d87307 706 ret = sd_DMAC2_Open(DMAC_REQ_MODE_PERI);
tvendov 0:e1f465d87307 707 if( ret != 0 )
tvendov 0:e1f465d87307 708 {
tvendov 0:e1f465d87307 709 printf("DMAC1 Open error!!\n");
tvendov 0:e1f465d87307 710 return SD_ERR;
tvendov 0:e1f465d87307 711 }
tvendov 0:e1f465d87307 712 #endif
tvendov 0:e1f465d87307 713
tvendov 0:e1f465d87307 714 return SD_OK;
tvendov 0:e1f465d87307 715 }
tvendov 0:e1f465d87307 716
tvendov 0:e1f465d87307 717 /******************************************************************************
tvendov 0:e1f465d87307 718 * Function Name: int sddev_wait_dma_end(int sd_port, long cnt);
tvendov 0:e1f465d87307 719 * Description : Wait to complete DMAC transfer
tvendov 0:e1f465d87307 720 * Arguments : long cnt : counts to transfer(unit:byte)
tvendov 0:e1f465d87307 721 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 722 * : fail : SD_ERR
tvendov 0:e1f465d87307 723 ******************************************************************************/
tvendov 0:e1f465d87307 724 int sddev_wait_dma_end(int sd_port, long cnt)
tvendov 0:e1f465d87307 725 {
tvendov 0:e1f465d87307 726 int ret;
tvendov 0:e1f465d87307 727
tvendov 0:e1f465d87307 728 if( sd_port == 0 )
tvendov 0:e1f465d87307 729 {
tvendov 0:e1f465d87307 730 ret = sddev_wait_dma_end_0(cnt);
tvendov 0:e1f465d87307 731 }
tvendov 0:e1f465d87307 732 else if( sd_port == 1 )
tvendov 0:e1f465d87307 733 {
tvendov 0:e1f465d87307 734 ret = sddev_wait_dma_end_1(cnt);
tvendov 0:e1f465d87307 735 }
tvendov 0:e1f465d87307 736
tvendov 0:e1f465d87307 737 return ret;
tvendov 0:e1f465d87307 738 }
tvendov 0:e1f465d87307 739
tvendov 0:e1f465d87307 740 /******************************************************************************
tvendov 0:e1f465d87307 741 * Function Name: static int sddev_wait_dma_end_0(long cnt);
tvendov 0:e1f465d87307 742 * Description : Wait to complete DMAC transfer
tvendov 0:e1f465d87307 743 * Arguments : long cnt : counts to transfer(unit:byte)
tvendov 0:e1f465d87307 744 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 745 * : fail : SD_ERR
tvendov 0:e1f465d87307 746 ******************************************************************************/
tvendov 0:e1f465d87307 747 static int sddev_wait_dma_end_0(long cnt)
tvendov 0:e1f465d87307 748 {
tvendov 0:e1f465d87307 749 #ifdef SDCFG_TRNS_DMA
tvendov 0:e1f465d87307 750 int loop;
tvendov 0:e1f465d87307 751 int time;
tvendov 0:e1f465d87307 752
tvendov 0:e1f465d87307 753 time = (cnt / 512);
tvendov 0:e1f465d87307 754 time = ((time * 1000) / 1024);
tvendov 0:e1f465d87307 755 if(time < 1000)
tvendov 0:e1f465d87307 756 {
tvendov 0:e1f465d87307 757 time = 1000;
tvendov 0:e1f465d87307 758 }
tvendov 0:e1f465d87307 759
tvendov 0:e1f465d87307 760 if(time > (0x0000ffff / MTU_TIMER_CNT))
tvendov 0:e1f465d87307 761 {
tvendov 0:e1f465d87307 762 /* @1000ms */
tvendov 0:e1f465d87307 763 loop = (time / 1000);
tvendov 0:e1f465d87307 764 if( (time % 1000) != 0 )
tvendov 0:e1f465d87307 765 {
tvendov 0:e1f465d87307 766 loop++;
tvendov 0:e1f465d87307 767 }
tvendov 0:e1f465d87307 768 time = 1000;
tvendov 0:e1f465d87307 769 }
tvendov 0:e1f465d87307 770 else
tvendov 0:e1f465d87307 771 {
tvendov 0:e1f465d87307 772 loop = 1;
tvendov 0:e1f465d87307 773 }
tvendov 0:e1f465d87307 774
tvendov 0:e1f465d87307 775 do{
tvendov 0:e1f465d87307 776 sddev_start_timer(time);
tvendov 0:e1f465d87307 777
tvendov 0:e1f465d87307 778 while(1)
tvendov 0:e1f465d87307 779 {
tvendov 0:e1f465d87307 780 /* get end flag? */
tvendov 0:e1f465d87307 781 if( sd_DMAC1_Get_Endflag() == 1 )
tvendov 0:e1f465d87307 782 {
tvendov 0:e1f465d87307 783 sddev_end_timer();
tvendov 0:e1f465d87307 784 return SD_OK;
tvendov 0:e1f465d87307 785 }
tvendov 0:e1f465d87307 786 /* detect timeout? */
tvendov 0:e1f465d87307 787 if(sddev_check_timer() == SD_ERR)
tvendov 0:e1f465d87307 788 {
tvendov 0:e1f465d87307 789 break;
tvendov 0:e1f465d87307 790 }
tvendov 0:e1f465d87307 791 }
tvendov 0:e1f465d87307 792
tvendov 0:e1f465d87307 793 loop--;
tvendov 0:e1f465d87307 794 if( loop <= 0 )
tvendov 0:e1f465d87307 795 {
tvendov 0:e1f465d87307 796 break;
tvendov 0:e1f465d87307 797 }
tvendov 0:e1f465d87307 798
tvendov 0:e1f465d87307 799 } while(1);
tvendov 0:e1f465d87307 800
tvendov 0:e1f465d87307 801 sddev_end_timer();
tvendov 0:e1f465d87307 802
tvendov 0:e1f465d87307 803 return SD_ERR;
tvendov 0:e1f465d87307 804 #else
tvendov 0:e1f465d87307 805 return SD_OK;
tvendov 0:e1f465d87307 806
tvendov 0:e1f465d87307 807 #endif
tvendov 0:e1f465d87307 808 }
tvendov 0:e1f465d87307 809
tvendov 0:e1f465d87307 810 /******************************************************************************
tvendov 0:e1f465d87307 811 * Function Name: static int sddev_wait_dma_end_1(long cnt);
tvendov 0:e1f465d87307 812 * Description : Wait to complete DMAC transfer
tvendov 0:e1f465d87307 813 * Arguments : long cnt : counts to transfer(unit:byte)
tvendov 0:e1f465d87307 814 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 815 * : fail : SD_ERR
tvendov 0:e1f465d87307 816 ******************************************************************************/
tvendov 0:e1f465d87307 817 static int sddev_wait_dma_end_1(long cnt)
tvendov 0:e1f465d87307 818 {
tvendov 0:e1f465d87307 819 #ifdef SDCFG_TRNS_DMA
tvendov 0:e1f465d87307 820 int loop;
tvendov 0:e1f465d87307 821 int time;
tvendov 0:e1f465d87307 822
tvendov 0:e1f465d87307 823 time = (cnt / 512);
tvendov 0:e1f465d87307 824 time = ((time * 1000) / 1024);
tvendov 0:e1f465d87307 825 if(time < 1000)
tvendov 0:e1f465d87307 826 {
tvendov 0:e1f465d87307 827 time = 1000;
tvendov 0:e1f465d87307 828 }
tvendov 0:e1f465d87307 829
tvendov 0:e1f465d87307 830 if(time > (0x0000ffff / MTU_TIMER_CNT))
tvendov 0:e1f465d87307 831 {
tvendov 0:e1f465d87307 832 /* @1000ms */
tvendov 0:e1f465d87307 833 loop = (time / 1000);
tvendov 0:e1f465d87307 834 if( (time % 1000) != 0 )
tvendov 0:e1f465d87307 835 {
tvendov 0:e1f465d87307 836 loop++;
tvendov 0:e1f465d87307 837 }
tvendov 0:e1f465d87307 838 time = 1000;
tvendov 0:e1f465d87307 839 }
tvendov 0:e1f465d87307 840 else
tvendov 0:e1f465d87307 841 {
tvendov 0:e1f465d87307 842 loop = 1;
tvendov 0:e1f465d87307 843 }
tvendov 0:e1f465d87307 844
tvendov 0:e1f465d87307 845 do{
tvendov 0:e1f465d87307 846 sddev_start_timer(time);
tvendov 0:e1f465d87307 847
tvendov 0:e1f465d87307 848 while(1)
tvendov 0:e1f465d87307 849 {
tvendov 0:e1f465d87307 850 /* get end flag? */
tvendov 0:e1f465d87307 851 if( sd_DMAC2_Get_Endflag() == 1 )
tvendov 0:e1f465d87307 852 {
tvendov 0:e1f465d87307 853 sddev_end_timer();
tvendov 0:e1f465d87307 854 return SD_OK;
tvendov 0:e1f465d87307 855 }
tvendov 0:e1f465d87307 856 /* detect timeout? */
tvendov 0:e1f465d87307 857 if(sddev_check_timer() == SD_ERR)
tvendov 0:e1f465d87307 858 {
tvendov 0:e1f465d87307 859 break;
tvendov 0:e1f465d87307 860 }
tvendov 0:e1f465d87307 861 }
tvendov 0:e1f465d87307 862
tvendov 0:e1f465d87307 863 loop--;
tvendov 0:e1f465d87307 864 if( loop <= 0 )
tvendov 0:e1f465d87307 865 {
tvendov 0:e1f465d87307 866 break;
tvendov 0:e1f465d87307 867 }
tvendov 0:e1f465d87307 868
tvendov 0:e1f465d87307 869 } while(1);
tvendov 0:e1f465d87307 870
tvendov 0:e1f465d87307 871 sddev_end_timer();
tvendov 0:e1f465d87307 872
tvendov 0:e1f465d87307 873 return SD_ERR;
tvendov 0:e1f465d87307 874 #else
tvendov 0:e1f465d87307 875 return SD_OK;
tvendov 0:e1f465d87307 876
tvendov 0:e1f465d87307 877 #endif
tvendov 0:e1f465d87307 878 }
tvendov 0:e1f465d87307 879
tvendov 0:e1f465d87307 880 /******************************************************************************
tvendov 0:e1f465d87307 881 * Function Name: int sddev_disable_dma(int sd_port);
tvendov 0:e1f465d87307 882 * Description : Disable DMAC transfer
tvendov 0:e1f465d87307 883 * Arguments : none
tvendov 0:e1f465d87307 884 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 885 * : fail : SD_ERR
tvendov 0:e1f465d87307 886 ******************************************************************************/
tvendov 0:e1f465d87307 887 int sddev_disable_dma(int sd_port)
tvendov 0:e1f465d87307 888 {
tvendov 0:e1f465d87307 889 int ret;
tvendov 0:e1f465d87307 890
tvendov 0:e1f465d87307 891 if( sd_port == 0 )
tvendov 0:e1f465d87307 892 {
tvendov 0:e1f465d87307 893 ret = sddev_disable_dma_0();
tvendov 0:e1f465d87307 894 }
tvendov 0:e1f465d87307 895 else
tvendov 0:e1f465d87307 896 {
tvendov 0:e1f465d87307 897 ret = sddev_disable_dma_1();
tvendov 0:e1f465d87307 898 }
tvendov 0:e1f465d87307 899 return ret;
tvendov 0:e1f465d87307 900 }
tvendov 0:e1f465d87307 901
tvendov 0:e1f465d87307 902 /******************************************************************************
tvendov 0:e1f465d87307 903 * Function Name: static int sddev_disable_dma_0(void);
tvendov 0:e1f465d87307 904 * Description : Disable DMAC transfer
tvendov 0:e1f465d87307 905 * Arguments : none
tvendov 0:e1f465d87307 906 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 907 * : fail : SD_ERR
tvendov 0:e1f465d87307 908 ******************************************************************************/
tvendov 0:e1f465d87307 909 static int sddev_disable_dma_0(void)
tvendov 0:e1f465d87307 910 {
tvendov 0:e1f465d87307 911 #ifdef SDCFG_TRNS_DMA
tvendov 0:e1f465d87307 912 uint32_t remain;
tvendov 0:e1f465d87307 913
tvendov 0:e1f465d87307 914 sd_DMAC1_Close(&remain);
tvendov 0:e1f465d87307 915 #endif
tvendov 0:e1f465d87307 916 return SD_OK;
tvendov 0:e1f465d87307 917 }
tvendov 0:e1f465d87307 918
tvendov 0:e1f465d87307 919 /******************************************************************************
tvendov 0:e1f465d87307 920 * Function Name: staticint sddev_disable_dma_1(void);
tvendov 0:e1f465d87307 921 * Description : Disable DMAC transfer
tvendov 0:e1f465d87307 922 * Arguments : none
tvendov 0:e1f465d87307 923 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 924 * : fail : SD_ERR
tvendov 0:e1f465d87307 925 ******************************************************************************/
tvendov 0:e1f465d87307 926 static int sddev_disable_dma_1(void)
tvendov 0:e1f465d87307 927 {
tvendov 0:e1f465d87307 928 #ifdef SDCFG_TRNS_DMA
tvendov 0:e1f465d87307 929 uint32_t remain;
tvendov 0:e1f465d87307 930
tvendov 0:e1f465d87307 931 sd_DMAC2_Close(&remain);
tvendov 0:e1f465d87307 932 #endif
tvendov 0:e1f465d87307 933 return SD_OK;
tvendov 0:e1f465d87307 934 }
tvendov 0:e1f465d87307 935
tvendov 0:e1f465d87307 936 /******************************************************************************
tvendov 0:e1f465d87307 937 * Function Name: int sddev_loc_cpu(int sd_port);
tvendov 0:e1f465d87307 938 * Description : lock cpu to disable interrupt
tvendov 0:e1f465d87307 939 * Arguments : none
tvendov 0:e1f465d87307 940 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 941 * : fail : SD_ERR
tvendov 0:e1f465d87307 942 ******************************************************************************/
tvendov 0:e1f465d87307 943 int sddev_loc_cpu(int sd_port)
tvendov 0:e1f465d87307 944 {
tvendov 0:e1f465d87307 945 #if 0
tvendov 0:e1f465d87307 946 R_INTC_GetMaskLevel(&g_sdhi_priority_backup);
tvendov 0:e1f465d87307 947 R_INTC_SetMaskLevel(0);
tvendov 0:e1f465d87307 948 core_util_critical_section_enter();
tvendov 0:e1f465d87307 949 #endif
tvendov 0:e1f465d87307 950
tvendov 0:e1f465d87307 951 return SD_OK;
tvendov 0:e1f465d87307 952 }
tvendov 0:e1f465d87307 953
tvendov 0:e1f465d87307 954 /******************************************************************************
tvendov 0:e1f465d87307 955 * Function Name: int sddev_unl_cpu(int sd_port);
tvendov 0:e1f465d87307 956 * Description : unlock cpu to enable interrupt
tvendov 0:e1f465d87307 957 * Arguments : none
tvendov 0:e1f465d87307 958 * Return Value : success : SD_OK
tvendov 0:e1f465d87307 959 * : fail : SD_ERR
tvendov 0:e1f465d87307 960 ******************************************************************************/
tvendov 0:e1f465d87307 961 int sddev_unl_cpu(int sd_port)
tvendov 0:e1f465d87307 962 {
tvendov 0:e1f465d87307 963 #if 0
tvendov 0:e1f465d87307 964 R_INTC_SetMaskLevel(g_sdhi_priority_backup);
tvendov 0:e1f465d87307 965 core_util_critical_section_exit();
tvendov 0:e1f465d87307 966 #endif
tvendov 0:e1f465d87307 967 return SD_OK;
tvendov 0:e1f465d87307 968 }
tvendov 0:e1f465d87307 969
tvendov 0:e1f465d87307 970 /******************************************************************************
tvendov 0:e1f465d87307 971 * Function Name: int sddev_finalize(int sd_port);
tvendov 0:e1f465d87307 972 * Description : finalize SDHI
tvendov 0:e1f465d87307 973 * Arguments : none
tvendov 0:e1f465d87307 974 * Return Value : none
tvendov 0:e1f465d87307 975 ******************************************************************************/
tvendov 0:e1f465d87307 976 int sddev_finalize(int sd_port)
tvendov 0:e1f465d87307 977 {
tvendov 0:e1f465d87307 978 return SD_OK;
tvendov 0:e1f465d87307 979 }
tvendov 0:e1f465d87307 980
tvendov 0:e1f465d87307 981 /******************************************************************************
tvendov 0:e1f465d87307 982 * Function Name: static void sddev_sd_int_handler_0(uint32_t int_sense);
tvendov 0:e1f465d87307 983 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_0,INTC_ID_SDHI0_3)
tvendov 0:e1f465d87307 984 * Arguments : Interrupt mode
tvendov 0:e1f465d87307 985 * Return Value : none
tvendov 0:e1f465d87307 986 ******************************************************************************/
tvendov 0:e1f465d87307 987 static void sddev_sd_int_handler_0(uint32_t int_sense)
tvendov 0:e1f465d87307 988 {
tvendov 0:e1f465d87307 989 sd_int_handler(0);
tvendov 0:e1f465d87307 990 }
tvendov 0:e1f465d87307 991
tvendov 0:e1f465d87307 992 /******************************************************************************
tvendov 0:e1f465d87307 993 * Function Name: static void sddev_sd_int_handler_1(uint32_t int_sense);
tvendov 0:e1f465d87307 994 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_0,INTC_ID_SDHI0_3)
tvendov 0:e1f465d87307 995 * Arguments : Interrupt mode
tvendov 0:e1f465d87307 996 * Return Value : none
tvendov 0:e1f465d87307 997 ******************************************************************************/
tvendov 0:e1f465d87307 998 static void sddev_sd_int_handler_1(uint32_t int_sense)
tvendov 0:e1f465d87307 999 {
tvendov 0:e1f465d87307 1000 sd_int_handler(1);
tvendov 0:e1f465d87307 1001 }
tvendov 0:e1f465d87307 1002
tvendov 0:e1f465d87307 1003 /******************************************************************************
tvendov 0:e1f465d87307 1004 * Function Name: static void sddev_sdio_int_handler_0(uint32_t int_sense);
tvendov 0:e1f465d87307 1005 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI0_1)
tvendov 0:e1f465d87307 1006 * Arguments : Interrupt mode
tvendov 0:e1f465d87307 1007 * Return Value : none
tvendov 0:e1f465d87307 1008 ******************************************************************************/
tvendov 0:e1f465d87307 1009 static void sddev_sdio_int_handler_0(uint32_t int_sense)
tvendov 0:e1f465d87307 1010 {
tvendov 0:e1f465d87307 1011 sdio_int_handler(0);
tvendov 0:e1f465d87307 1012 }
tvendov 0:e1f465d87307 1013
tvendov 0:e1f465d87307 1014 /******************************************************************************
tvendov 0:e1f465d87307 1015 * Function Name: static void sddev_sdio_int_handler_1(uint32_t int_sense);
tvendov 0:e1f465d87307 1016 * Description : Setting Interrupt function for SDHI(INTC_ID_SDHI1_1)
tvendov 0:e1f465d87307 1017 * Arguments : Interrupt mode
tvendov 0:e1f465d87307 1018 * Return Value : none
tvendov 0:e1f465d87307 1019 ******************************************************************************/
tvendov 0:e1f465d87307 1020 static void sddev_sdio_int_handler_1(uint32_t int_sense)
tvendov 0:e1f465d87307 1021 {
tvendov 0:e1f465d87307 1022 sdio_int_handler(1);
tvendov 0:e1f465d87307 1023 }
tvendov 0:e1f465d87307 1024
tvendov 0:e1f465d87307 1025 /******************************************************************************
tvendov 0:e1f465d87307 1026 * Function Name: static void sddev_start_timer(int msec);
tvendov 0:e1f465d87307 1027 * Description : start timer
tvendov 0:e1f465d87307 1028 * Arguments :
tvendov 0:e1f465d87307 1029 * Return Value : none
tvendov 0:e1f465d87307 1030 ******************************************************************************/
tvendov 0:e1f465d87307 1031 static void sddev_start_timer(int msec)
tvendov 0:e1f465d87307 1032 {
tvendov 0:e1f465d87307 1033 _ticker = get_us_ticker_data();
tvendov 0:e1f465d87307 1034 _ulStart = ticker_read(_ticker);
tvendov 0:e1f465d87307 1035 _ulDelta = msec*1000ul;
tvendov 0:e1f465d87307 1036 }
tvendov 0:e1f465d87307 1037
tvendov 0:e1f465d87307 1038 /******************************************************************************
tvendov 0:e1f465d87307 1039 * Function Name: static void sddev_end_timer(void);
tvendov 0:e1f465d87307 1040 * Description : end timer
tvendov 0:e1f465d87307 1041 * Arguments :
tvendov 0:e1f465d87307 1042 * Return Value : none
tvendov 0:e1f465d87307 1043 ******************************************************************************/
tvendov 0:e1f465d87307 1044 static void sddev_end_timer(void)
tvendov 0:e1f465d87307 1045 {
tvendov 0:e1f465d87307 1046 _ulStart = 0ul;
tvendov 0:e1f465d87307 1047 _ulDelta = 0ul;
tvendov 0:e1f465d87307 1048 }
tvendov 0:e1f465d87307 1049
tvendov 0:e1f465d87307 1050 /******************************************************************************
tvendov 0:e1f465d87307 1051 * Function Name: static int sddev_check_timer(void);
tvendov 0:e1f465d87307 1052 * Description : check
tvendov 0:e1f465d87307 1053 * Arguments :
tvendov 0:e1f465d87307 1054 * Return Value : t
tvendov 0:e1f465d87307 1055 ******************************************************************************/
tvendov 0:e1f465d87307 1056 static int sddev_check_timer(void)
tvendov 0:e1f465d87307 1057 {
tvendov 0:e1f465d87307 1058 if ( _ulStart && _ulDelta )
tvendov 0:e1f465d87307 1059 {
tvendov 0:e1f465d87307 1060 return ((ticker_read(_ticker)-_ulStart) < _ulDelta) ? SD_OK : SD_ERR;
tvendov 0:e1f465d87307 1061 }
tvendov 0:e1f465d87307 1062 else
tvendov 0:e1f465d87307 1063 {
tvendov 0:e1f465d87307 1064 return SD_ERR;
tvendov 0:e1f465d87307 1065 }
tvendov 0:e1f465d87307 1066 }
tvendov 0:e1f465d87307 1067
tvendov 0:e1f465d87307 1068 /* End of File */
tvendov 0:e1f465d87307 1069
tvendov 1:6f9a14a6bcac 1070