fsdmmc_hw.h 16.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
/*
 * Copyright : (C) 2022 Phytium Information Technology, Inc.
 * All Rights Reserved.
 *
 * This program is OPEN SOURCE software: you can redistribute it and/or modify it
 * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
 * either version 1.0 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the Phytium Public License for more details.
 *
 *
 * FilePath: fsdmmc_hw.h
 * Date: 2022-02-10 14:53:42
 * LastEditTime: 2022-02-18 08:54:24
 * Description:  This files is for
 *
 * Modify History:
 *  Ver   Who        Date         Changes
 * ----- ------     --------    --------------------------------------
 * 1.0   zhugengyu  2021/12/2    init
 */

#ifndef  DRIVERS_MMC_FSDMMC_HW_H
#define  DRIVERS_MMC_FSDMMC_HW_H

#ifdef __cplusplus
extern "C"
{
#endif
/***************************** Include Files *********************************/

#include "fparameters.h"
#include "fio.h"
#include "fkernel.h"

/************************** Constant Definitions *****************************/

/** @name Register Map
 *
 * Register offsets from the base address of an SD device.
 * @{
 */
#define FSDMMC_CONTROLL_SETTING_REG_OFFSET 0x00  /* Controller configuration register */
#define FSDMMC_ARGUMENT_REG_OFFSET 0x04          /* Parameter register */
#define FSDMMC_CMD_SETTING_REG_OFFSET 0x08       /* Command register */
#define FSDMMC_CLOCK_DIV_REG_OFFSET 0x0C         /* Clock division register */
#define FSDMMC_SOFTWARE_RESET_REG_OFFSET 0x10    /* Reset control register */
#define FSDMMC_POWER_CONTROLL_REG_OFFSET 0x14    /* Power control register */
#define FSDMMC_TIMEOUT_CMD_REG_OFFSET 0x18       /* Cmd Timeout setting register */
#define FSDMMC_TIMEOUT_DATA_REG_OFFSET 0x1C      /* Data timeout setting register */
#define FSDMMC_NORMAL_INT_EN_REG_OFFSET 0x20     /* Interrupt Enable Register */
#define FSDMMC_ERROR_INT_EN_REG_OFFSET 0x24      /* Error Interrupt Enable Register */
#define FSDMMC_BD_ISR_EN_REG_OFFSET 0x28         /* Data Transfer Interrupt Enable Register */
#define FSDMMC_CAPABILIES_REG_OFFSET 0x2c        /* capabilies register */
#define FSDMMC_SD_DRV_REG_OFFSET 0x30            /* SD card driver phase register */
#define FSDMMC_SD_SAMP_REG_OFFSET 0x34           /* SD card sampling phase register */
#define FSDMMC_SD_SEN_REG_OFFSET 0x38            /* Card detection controller */
#define FSDMMC_HDS_AXI_REG_CONF1_REG_OFFSET 0x3c /* AXI boundary configuration register 1 */
#define FSDMMC_DAT_IN_M_RX_BD_REG_OFFSET 0x40    /*  SD BD RX address register */
#define FSDMMC_DAT_IN_M_TX_BD_REG_OFFSET 0x60    /*  SD BD TX address register */
#define FSDMMC_BLK_CNT_REG_OFFSET 0x80           /*  Block reads and writes configuration registers */
#define FSDMMC_HDS_AXI_REG_CONF2_REG_OFFSET 0xa8 /*  AXI boundary configuration register 2 */
#define FSDMMC_NORMAL_INT_STATUS_REG_OFFSET 0xc0 /*  Interrupt status register */
#define FSDMMC_ERROR_INT_STATUS_REG_OFFSET 0xc4  /*  ERROR interrupt register */
#define FSDMMC_BD_ISR_REG_OFFSET  0xc8           /*  Data Transfer Interrupt Status Register */
#define FSDMMC_BD_STATUS_REG_OFFSET 0xcc         /*  BD descriptor register */
#define FSDMMC_STATUS_REG_OFFSET 0xd0            /*  Status register */
#define FSDMMC_BLOCK_REG_OFFSET 0xd4             /*  Block length register */
#define FSDMMC_CMD_RESP_1_REG_OFFSET 0xe0        /*  Command response register 1 */
#define FSDMMC_CMD_RESP_2_REG_OFFSET 0xe4        /*  Command response register 2 */
#define FSDMMC_CMD_RESP_3_REG_OFFSET 0xe8        /*  Command response register 3 */
#define FSDMMC_CMD_RESP_4_REG_OFFSET 0xec        /*  Command response register 4 */

/** @name FSDMMC_CONTROLL_SETTING_REG_OFFSET Register
 */
#define FSDMMC_PERMDW_MASK     GENMASK(11, 10)
#define FSDMMC_PERMDW(x)       (FSDMMC_PERMDW_MASK & ((x) << 10)) /* 写操作对应的大小端选择 */
#define FSDMMC_PERMDW_LIT_END  FSDMMC_PERMDW(0x0)
#define FSDMMC_PERMDW_BIG_END  FSDMMC_PERMDW(0x1)
#define FSDMMC_PERMDW_STD_END  FSDMMC_PERMDW(0x3)

#define FSDMMC_PERMDR_MASK     GENMASK(9, 8)
#define FSDMMC_PERMDR(x)       (FSDMMC_PERMDR_MASK & ((x) << 8)) /* 读操作对应的大小端选择 */
#define FSDMMC_PERMDR_LIT_END  FSDMMC_PERMDR(0x0)
#define FSDMMC_PERMDR_BIG_END  FSDMMC_PERMDR(0x1)
#define FSDMMC_PERMDR_STD_END  FSDMMC_PERMDR(0x3)

/** @name FSDMMC_ARGUMENT_REG_OFFSET Register
 */
#define FSDMMC_ARGUMENT_MASK  GENMASK(31, 0)

/** @name FSDMMC_CMD_SETTING_REG_OFFSET Register
 */
#define FSDMMC_CMD_RESP_MASK              GENMASK(1, 0)
#define FSDMMC_CMD_SETTING_RTS(x)         (FSDMMC_CMD_RESP_MASK & ((x) << 0))     /* 0: No response 01: Response byte length 136 10: Response byte length 48 11: Response byte length 48 */
#define FSDMMC_CMD_NO_RESP                FSDMMC_CMD_SETTING_RTS(0x0)  /* 00:不响应  */
#define FSDMMC_CMD_RESP_136_BIT           FSDMMC_CMD_SETTING_RTS(0x1)  /* 01:响应字节长度 136 */
#define FSDMMC_CMD_RESP_48_BIT            FSDMMC_CMD_SETTING_RTS(0x2)  /* 10: 响应字节长度 48 */
#define FSDMMC_CMD_RESP_48_BIT_BUSY_CHECK FSDMMC_CMD_SETTING_RTS(0x3) /* 11: 响应字节长度 48, check busy after resp */

#define FSDMMC_CMD_SETTING_CRCE BIT(3)                             /* 0: CRC check is not performed on CMD response 1: CRC check is performed on CMD response */
#define FSDMMC_CMD_SETTING_CICE BIT(4)                             /* 0:CMD 响应时,不执行索引检查 1:CMD 响应时,执行索引检查 */
#define FSDMMC_CMD_SETTING_CMDTP(x) (GENMASK(7, 6) & ((x) << 6))   /* 命令类型 */
#define FSDMMC_CMD_SETTING_CMDI(x) (GENMASK(13, 8) & ((x) << 8))   /* 命令索引 */
#define FSDMMC_CMD_SETTING_TRTY(x) (GENMASK(15, 14) & ((x) << 14)) /* 10: adtc 指令 ,其它: 读写操作 */


/** @name FSDMMC_CLOCK_DIV_REG_OFFSET Register
 */
#define FSDMMC_CLK_DIVIDER(clk) (GENMASK(31, 0) & ((FSDMMC_CLK_FREQ_HZ / (2 * (clk))) - 1))

/** @name FSDMMC_SOFTWARE_RESET_REG_OFFSET Register
 */
#define FSDMMC_SOFTWARE_RESET_SRST  BIT(0)  /* 控制器软复位 */
#define FSDMMC_SOFTWARE_RESET_BDRST BIT(2) /* DMA BD 清 0 */
#define FSDMMC_SOFTWARE_RESET_CFCLF BIT(3) /* 卡插入拔出状态触发标志清 0 */

/** @name FSDMMC_TIMEOUT_CMD_REG_OFFSET Register
 */
#define FSDMMC_TIMEOUT_CMD_MASK    GENMASK(31, 0)

/** @name FSDMMC_TIMEOUT_DATA_REG_OFFSET Register
 */
#define FSDMMC_TIMEOUT_DATA_MASK   GENMASK(31, 0)

/** @name FSDMMC_NORMAL_INT_EN_REG_OFFSET Register
 */
#define FSDMMC_NORMAL_INT_EN_ECC    BIT(0)    /* 命令完成中断使能 */
#define FSDMMC_NORMAL_INT_EN_ECCRCE BIT(1)    /* 卡拔出中断使能 */
#define FSDMMC_NORMAL_INT_EN_ECIE   BIT(15)   /* 错误中断使能 */
#define FSDMCC_NORMAL_INT_ALL_BITS  (FSDMMC_NORMAL_INT_EN_ECC | FSDMMC_NORMAL_INT_EN_ECCRCE |\
                                     FSDMMC_NORMAL_INT_EN_ECIE)

/** @name FSDMMC_ERROR_INT_EN_REG_OFFSET Register
 */
#define FSDMMC_ERROR_INT_EN_CNR BIT(4)   /* 命令响应错误中断 */
#define FSDMMC_ERROR_INT_EN_CIR BIT(3)   /* 命令索引错误中断使能 */
#define FSDMMC_ERROR_INT_EN_CCRCE BIT(1) /* 命令 CRC 错误中断使能 */
#define FSDMMC_ERROR_INT_EN_CTE BIT(0)   /* 命令超时中断使能 */
#define FSDMMC_ERROR_INT_ALL_BITS   (FSDMMC_ERROR_INT_EN_CNR | FSDMMC_ERROR_INT_EN_CIR |\
                                     FSDMMC_ERROR_INT_EN_CCRCE | FSDMMC_ERROR_INT_EN_CTE)

/** @name FSDMMC_BD_ISR_EN_REG_OFFSET Register
 */
#define FSDMMC_BD_ISR_EN_ETRS BIT(0)      /* DMA 传输完成中断使能 */
#define FSDMMC_BD_ISR_EN_EDTE BIT(3)      /* 数据超时中断使能 */
#define FSDMMC_BD_ISR_EN_ECMDE BIT(4)     /* 命令响应错误中断使能 */
#define FSDMMC_BD_ISR_EN_ETRE BIT(5)      /* 传输错误中断使能 */
#define FSDMMC_BD_ISR_EN_ENRCRCE BIT(6)   /* CRC 校验错误中断使能 */
#define FSDMMC_BD_ISR_EN_EDATFRAXE BIT(7) /* AXI 总线错误中断使能 */
#define FSDMMC_BD_ISR_EN_RESPE BIT(8)     /* 读 SD 卡操作,AXI BR 通道完成中断 */
#define FSDMMC_BD_ISR_EN_EDAISE BIT(15)   /* DMA 错误中断使能 */
#define FSDMMC_BD_ISR_ALL_BITS (FSDMMC_BD_ISR_EN_ETRS | FSDMMC_BD_ISR_EN_EDTE |         \
                                FSDMMC_BD_ISR_EN_ECMDE | FSDMMC_BD_ISR_EN_ETRE |        \
                                FSDMMC_BD_ISR_EN_ENRCRCE | FSDMMC_BD_ISR_EN_EDATFRAXE | \
                                FSDMMC_BD_ISR_EN_RESPE | FSDMMC_BD_ISR_EN_EDAISE)


/** @name FSDMMC_SD_DRV_REG_OFFSET Register
 */
#define FSDMMC_SD_DRV_MASK    GENMASK(31, 0) /* 卡驱动相位配置参数 */

/** @name FSDMMC_SD_SAMP_REG_OFFSET Register
 */
#define FSDMMC_SD_SAMP_MASK   GENMASK(31, 0) /* 卡采样相位配置参数 */

/** @name FSDMMC_SD_SEN_REG_OFFSET Register
 */
#define FSDMMC_SD_SEN_REG_CREFR BIT(1)                          /* 卡拔出时自动释放 AXI 总线选择 */
#define FSDMMC_SD_SEN_REG_CRES BIT(2)                           /* CARD 在位状态标志选择 0: 卡在位-0,不在位-1 1: 卡在位-1,不在位-0 */
#define FSDMMC_SD_SEN_REG_DEBNCE(x) ((x << 8) & GENMASK(31, 8)) /* 去抖时钟分频参数 */

/** @name FSDMMC_HDS_AXI_REG_CONF1_REG_OFFSET Register
 */
#define FSDMMC_HDS_AXI_CONF1_AWREGION_HDS_M     GENMASK(22, 19)
#define FSDMMC_HDS_AXI_CONF1_AWSNOOP_HDS_M      GENMASK(18, 16)
#define FSDMMC_HDS_AXI_CONF1_ARBAR_HDS_M        GENMASK(15, 14)
#define FSDMMC_HDS_AXI_CONF1_ARDOMAIN_HDS_M     GENMASK(13, 12)
#define FSDMMC_HDS_AXI_CONF1_ARREGION_HDS_M     GENMASK(11, 8)
#define FSDMMC_HDS_AXI_CONF1_ARSNOOP_HDS_M      GENMASK(7, 4)
#define FSDMMC_HDS_AXI_CONF1_AWBAR_HDS_M        GENMASK(3, 2)
#define FSDMMC_HDS_AXI_CONF1_AWDOMAIN_HDS_M     GENMASK(1, 0)

/** @name FSDMMC_DAT_IN_M_RX_BD_REG_OFFSET Register
 */
#define FSDMMC_DAT_IN_M_RX_BD_MASK              GENMASK(31, 0)

/** @name FSDMMC_DAT_IN_M_TX_BD_REG_OFFSET Register
 */
#define FSDMMC_DAT_IN_M_TX_BD_MASK              GENMASK(31, 0)

/** @name FSDMMC_BLK_CNT_REG_OFFSET Register
 */
#define FSDMMC_BLK_CNT_MASK                     GENMASK(31, 0)

/** @name FSDMMC_HDS_AXI_REG_CONF2_REG_OFFSET Register
 */
#define FSDMMC_HDS_AXI_CONF2_SD_ARPROT          GENMASK(29, 27)
#define FSDMMC_HDS_AXI_CONF2_SD_AWPROT          GENMASK(26, 24)
#define FSDMMC_HDS_AXI_CONF2_SD_ARCACHE_M       GENMASK(23, 20)
#define FSDMMC_HDS_AXI_CONF2_SD_AWCACHE_M       GENMASK(19, 16)
#define FSDMMC_HDS_AXI_CONF2_HDA_ARPRO          GENMASK(13, 11)
#define FSDMMC_HDS_AXI_CONF2_HDA_AWPROT         GENMASK(10, 8)
#define FSDMMC_HDS_AXI_CONF2_HDA_ARCACHE_M      GENMASK(7, 4)
#define FSDMMC_HDS_AXI_CONF2_HDA_AWCACHE_M      GENMASK(3, 0)

/** @name FSDMMC_NORMAL_INT_STATUS_REG_OFFSET Register
 */
#define FSDMMC_NORMAL_INT_STATUS_EI BIT(15) /* 命令错误中断 */
#define FSDMMC_NORMAL_INT_STATUS_CR BIT(1)  /* 卡移除中断 */
#define FSDMMC_NORMAL_INT_STATUS_CC BIT(0)  /* 命令完成中断 */
#define FSDMMC_NORMAL_INT_STATUS_ALL_MASK (FSDMMC_NORMAL_INT_STATUS_EI | FSDMMC_NORMAL_INT_STATUS_CR | FSDMMC_NORMAL_INT_STATUS_CC)

/** @name FSDMMC_ERROR_INT_STATUS_REG_OFFSET Register
 */
#define FSDMMC_ERROR_INT_STATUS_CNR BIT(4)   /* 命令响应错误中断 */
#define FSDMMC_ERROR_INT_STATUS_CIR BIT(3)   /* 命令索引错误中断 */
#define FSDMMC_ERROR_INT_STATUS_CCRCE BIT(1) /* 命令 CRC 错误中断 */
#define FSDMMC_ERROR_INT_STATUS_CTE BIT(0)   /* 命令超时错误中断 */
#define FSDMMC_ERROR_INT_STATUS_ALL_MASK (FSDMMC_ERROR_INT_STATUS_CNR | FSDMMC_ERROR_INT_STATUS_CIR | FSDMMC_ERROR_INT_STATUS_CCRCE | FSDMMC_ERROR_INT_STATUS_CTE)

/** @name FSDMMC_BD_ISR_REG_OFFSET Register
 */
#define FSDMMC_BD_ISR_REG_DAIS BIT(15)   /* DMA 错误中断*/
#define FSDMMC_BD_ISR_REG_RESPE BIT(8)   /* 读 SD 卡操作,AXI BR 通道完成中断*/
#define FSDMMC_BD_ISR_REG_DATFRAX BIT(7) /* AXI 总线强制释放中断*/
#define FSDMMC_BD_ISR_REG_NRCRC BIT(6)   /* 无 CRC 响应中断*/
#define FSDMMC_BD_ISR_REG_TRE BIT(5)     /* CRC 响应错误中断*/
#define FSDMMC_BD_ISR_REG_CMDE BIT(4)    /* 命令响应错误中断*/
#define FSDMMC_BD_ISR_REG_DTE BIT(3)     /* 超时中断*/
#define FSDMMC_BD_ISR_REG_TRS BIT(0)     /* DMA 传输完成中断*/

/** @name FSDMMC_BD_STATUS_REG_OFFSET Register
 */
#define FSDMMC_BD_STATUS_MASK       GENMASK(31, 0) /* BD 描述符 */

/** @name FSDMMC_STATUS_REG_OFFSET Register
 */
#define FSDMMC_STATUS_REG_DATMAST(x) (GENMASK(30, 27) & ((x) << 27)) /* data_master 状态机 */
#define FSDMMC_STATUS_REG_CDIF BIT(26)                               /* 卡在位标志 */
#define FSDMMC_STATUS_REG_CDRF BIT(25)                               /* 卡不在位标志 */
#define FSDMMC_STATUS_REG_CLSL BIT(24)                               /* 命令闲信号 */
#define FSDMMC_STATUS_REG_DLSL(x) (GENMASK(23, 20) & ((x) << 20))    /* 线信号 */
#define FSDMMC_STATUS_REG_CDSL BIT(19)                               /* 卡检测管脚信号 */
#define FSDMMC_STATUS_REG_CST(x) (GENMASK(15, 12) & ((x) << 12))     /* cmd_host state 状态机 */
#define FSDMMC_STATUS_IDIE     (0x1 << 12)
#define FSDMMC_STATUS_REG_CSM(x) (GENMASK(11, 7) & ((x) << 7))
#define FSDMMC_STATUS_REG_DAT_AVA BIT(6) /* DAT_AVA 当前命令状态流程运转完  */
#define FSDMMC_STATUS_REG_CRC_VALID BIT(5)
#define FSDMMC_STATUS_REG_CICMD BIT(0) /* RO 0x0 CMD 总线状态 */
#define FSDMMC_STATUS_CMD_BUSY  (0x0 << 0)
#define FSDMMC_STATUS_CMD_READY (0x1 << 0)

/** @name FSDMMC_BLOCK_REG_OFFSET Register
 */
#define FSDMMC_BLOCK_MASK       GENMASK(31, 0)

/** @name FSDMMC_CMD_RESP_1_REG_OFFSET Register
 */
#define FSDMMC_CMD_RESP_1_MASK  GENMASK(31, 0)

/** @name FSDMMC_CMD_RESP_2_REG_OFFSET Register
 */
#define FSDMMC_CMD_RESP_2_MASK  GENMASK(31, 0)

/** @name FSDMMC_CMD_RESP_3_REG_OFFSET Register
 */
#define FSDMMC_CMD_RESP_3_MASK  GENMASK(31, 0)

/** @name FSDMMC_CMD_RESP_4_REG_OFFSET Register
 */
#define FSDMMC_CMD_RESP_4_MASK  GENMASK(31, 0)

#define FSDMMC_DEFAULT_DRV            1
#define FSDMMC_DEFAULT_SAMP           5
#define FSDMMC_SEN_CREFR_VAL          (0x1 << 1)
#define FSDMMC_SEN_DEBNCE_VAL         (0xB << 8)
#define FSDMMC_CMD_TIMEOUT            10000000  /* 1s */
#define FSDMMC_DATA_TIMEOUT           40000000 /* 4s */
#define FSDMMC_AXI_CONF1              0x1001
#define FSDMMC_AXI_CONF2              0x12221222
#define FSDMMC_TIMEOUT                5000000  /* timeout for retries */
#define FSDMMC_BLOCK_SIZE             512

#define FSDMMC_DMA_ADDR_ALIGN         32
/**************************** Type Definitions *******************************/

/************************** Variable Definitions *****************************/

/***************** Macros (Inline Functions) Definitions *********************/

#define FSDMMC_READ_REG(addr, reg_offset) FtIn32((addr) + (u32)(reg_offset))
#define FSDMMC_WRITE_REG(addr, reg_offset, reg_value) FtOut32((addr) + (u32)(reg_offset), (u32)(reg_value))
#define FSDMMC_SET_BIT(addr, reg_offset, bit) FtSetBit32((addr) + (u32)(reg_offset), (u32)(bit))
#define FSDMMC_CLR_BIT(addr, reg_offset, bit) FtClearBit32((addr) + (u32)(reg_offset), (u32)(bit))

/* 检查卡检测管脚信号, 低电平表示卡在位 */
static inline boolean FSdmmcCheckIfCardExists(uintptr base_addr)
{
    return (FSDMMC_STATUS_REG_CDSL != (FSDMMC_STATUS_REG_CDSL & FSDMMC_READ_REG(base_addr, FSDMMC_STATUS_REG_OFFSET)));
}

/* 清除命令中断状态位 */
static inline void FSdmmcClearNormalInterruptStatus(uintptr base_addr)
{
    FSDMMC_WRITE_REG(base_addr, FSDMMC_NORMAL_INT_STATUS_REG_OFFSET, (0x1));
}

/* 清除错误中断状态位 */
static inline void FSdmmcClearErrorInterruptStatus(uintptr base_addr)
{
    FSDMMC_WRITE_REG(base_addr, FSDMMC_ERROR_INT_STATUS_REG_OFFSET, (0x1));
}

/* 清除DMA中断状态位 */
static inline void FSdmmcClearBDInterruptStatus(uintptr base_addr)
{
    FSDMMC_WRITE_REG(base_addr, FSDMMC_BD_ISR_REG_OFFSET, (0x1));
}

/************************** Function Prototypes ******************************/
/* 重置FSDMMC控制器 */
FError FSdmmcReset(uintptr base_addr);

/* 完成软复位 */
FError FSdmmcSoftwareReset(uintptr base_addr, int retries);

/* 设置FSDMMC的时钟 */
FError FSdmmcSetCardClk(uintptr base_addr, u32 clk_freq_hz);

/* 发送命令 */
void FSdmmcSendPrivateCmd(uintptr base_addr, u32 cmd, u32 arg);

/* 等待命令完成或者命令错误状态 */
FError FSdmmcWaitStatus(uintptr base_addr, int retries);

/* 等待数据传输完成或者传输错误状态 */
FError FSdmmcWaitDMAStatus(uintptr base_addr, boolean read, int retries);

#ifdef __cplusplus
}
#endif

#endif