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