SDHI_driver patch (mbedOS 5.11.5)
mbed-os-program/mbed-os/targets/TARGET_RENESAS/TARGET_RZ_A1XX/TARGET_VK_RZ_A1H/device/SDHI_driver/sdhi_low.c@1:6f9a14a6bcac, 2019-03-20 (annotated)
- 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?
| User | Revision | Line number | New 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 |