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