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