187 lines
6.1 KiB
C
187 lines
6.1 KiB
C
|
/*
|
||
|
* File : drv_mmc.h
|
||
|
* This file is part of gkipc BSP for RT-Thread distribution.
|
||
|
*
|
||
|
* Copyright (c) 2017 chengdu goke Microelectronics Co., Ltd.
|
||
|
* All rights reserved
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 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
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License along
|
||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||
|
*
|
||
|
* Visit http://www.goke.com to get contact with goke.
|
||
|
*
|
||
|
* Change Logs:
|
||
|
* Date Author Notes
|
||
|
*/
|
||
|
|
||
|
#ifndef MMC_H_
|
||
|
#define MMC_H_
|
||
|
|
||
|
#include "rtdevice.h"
|
||
|
|
||
|
#define MMC_FEQ_MIN 100000
|
||
|
#define MMC_FEQ_MAX 50000000
|
||
|
#define MMC_DMA_DESC_BUFF_SIZE (0x1f00)
|
||
|
#define MMC_HANDLE_COUNT 2
|
||
|
|
||
|
|
||
|
#define CARD_UNPLUGED 1
|
||
|
#define CARD_PLUGED 0
|
||
|
|
||
|
typedef enum {
|
||
|
RT_GAPI_SDIO_VERSION = (rt_int32_t)0x00010000 //!< The current driver version
|
||
|
} RT_SDIO_VersionEnumT;
|
||
|
|
||
|
|
||
|
typedef enum {
|
||
|
RT_GAPI_SDIO_TRANSFER_TYPE_NORMAL = 0, //!< Normal transfer type for SD/SDHC/MMC cards (default)
|
||
|
RT_GAPI_SDIO_TRANSFER_TYPE_DIRECT, //!< Direct transfer mode special for SDIO cards
|
||
|
RT_GAPI_SDIO_TRANSFER_TYPE_SECURE, //!< Spezial secure transfer mode for SD-Cards
|
||
|
RT_GAPI_SDIO_TRANSFER_TYPE_WIFI
|
||
|
} RT_SDIO_TransferTypeEnumT;
|
||
|
|
||
|
typedef enum rt_card_type
|
||
|
{
|
||
|
RT_CARDTYPE_NONE = 0,
|
||
|
RT_CARDTYPE_MMC,
|
||
|
RT_CARDTYPE_SD10,
|
||
|
RT_CARDTYPE_SD20,
|
||
|
RT_CARDTYPE_SDHC
|
||
|
}RT_SDIO_Card_Type;
|
||
|
|
||
|
/*!
|
||
|
****************************************************************************
|
||
|
**
|
||
|
** \brief SDIO callback function signature
|
||
|
**
|
||
|
** This is the callback function signature required by the SDIO driver
|
||
|
** for internally notification functions.
|
||
|
**
|
||
|
** \param comState Comunication status.
|
||
|
** \param optArgPtr Optional arg pointer.
|
||
|
**
|
||
|
****************************************************************************
|
||
|
*/
|
||
|
typedef void (*RT_SDIO_NotifyFuncT)(rt_uint32_t index, rt_uint32_t comState, void* optArgPtr);
|
||
|
|
||
|
typedef void (*RT_SDIO_IRQFuncT)();
|
||
|
typedef void (*RT_SDIO_RESETFuncT)(rt_uint32_t index);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
/*!
|
||
|
The version of the driver.
|
||
|
\ref GAPI_SDIO_VersionEnumT "GAPI_SDIO_VERSION".
|
||
|
*/
|
||
|
RT_SDIO_VersionEnumT version;
|
||
|
RT_SDIO_TransferTypeEnumT type;
|
||
|
/*!
|
||
|
** The handle specific notification function.
|
||
|
*/
|
||
|
RT_SDIO_NotifyFuncT notifyFunc;
|
||
|
|
||
|
RT_SDIO_IRQFuncT irqFunc;
|
||
|
|
||
|
RT_SDIO_RESETFuncT resetFunc;
|
||
|
/*!
|
||
|
** Optional data pointer for the notification function.
|
||
|
*/
|
||
|
void* notifyFuncOptPtr;
|
||
|
/*!
|
||
|
Flag to request DMA for read/write transfer operation.
|
||
|
*/
|
||
|
rt_uint32_t isUseDmaWay;
|
||
|
}RT_SDIO_OpenParamsT;
|
||
|
|
||
|
|
||
|
/*cid info */
|
||
|
typedef struct
|
||
|
{
|
||
|
rt_uint8_t MID; /*Manufacturer ID width:8[127:120]*/
|
||
|
rt_uint16_t OID; /*OEM/Application ID width:16[119:104]*/
|
||
|
rt_uint8_t PNM[5]; /*Product name width:40[103:64]*/
|
||
|
rt_uint8_t PRV; /*Product revision width:8[63:56]*/
|
||
|
rt_uint32_t PSN; /*Product serial number width:32[55:24]*/
|
||
|
rt_uint16_t MDT; /*Manufacturing date width:12[19:8]*/
|
||
|
}rtSdioCidInfo;
|
||
|
|
||
|
/*I just care about usefull info of CSD*/
|
||
|
typedef struct
|
||
|
{
|
||
|
rt_uint8_t csdStructure; /*csd revision*/
|
||
|
rt_uint32_t classes; /*Describes the card command classes CCC*/
|
||
|
rt_uint32_t tranSpeed; /*transfer speed*/
|
||
|
rt_uint8_t eraseBlkEn; /*erase block enable*/
|
||
|
rt_uint8_t permWriteProtect; /*write protect*/
|
||
|
rt_uint8_t tmpWriteProtect; /*write protect*/
|
||
|
}rtSdiocsdInfo;
|
||
|
|
||
|
/*I just case ablot usefull info of SCR*/
|
||
|
typedef struct
|
||
|
{
|
||
|
rt_uint32_t scrStructure; // SCR Register Structure Version
|
||
|
rt_uint32_t sdSpec; // Describes the Physical Layer Specification Version supported by the card.
|
||
|
rt_uint32_t stateaftererase; // Defines the data status after erase, whether it is 0 or 1.
|
||
|
rt_uint32_t sdSecurity; // Describes the Security Specification Version supported by the card.
|
||
|
rt_uint32_t sdBusWith; // Describes all the DAT bus widths that are supported by this card.
|
||
|
}rtSdioScrInfo;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
rt_uint32_t index; /*index of handle array*/
|
||
|
rt_uint32_t ocr; /*card volage info*/
|
||
|
rt_uint32_t csd[4]; /*csd info (invert)*/
|
||
|
rt_uint32_t read_bl_len;
|
||
|
rt_uint32_t write_bl_len;
|
||
|
unsigned long long capacity_user;
|
||
|
rt_uint32_t sectorcount;
|
||
|
rt_uint32_t inhighspeed;
|
||
|
rt_uint32_t maxTransferBlk;
|
||
|
rt_uint32_t eraseGrpSize;
|
||
|
rtSdioScrInfo scr;
|
||
|
rtSdiocsdInfo csdInfo;
|
||
|
rt_uint32_t tran_speed; /*max transfer speed*/
|
||
|
rt_uint32_t rca; /*card address*/
|
||
|
rt_uint32_t cid[4]; /*card cid info*/
|
||
|
enum rt_card_type type; /*card type*/
|
||
|
rt_uint32_t highCapacity; /*is high capacity*/
|
||
|
rtSdioCidInfo cidInfo;
|
||
|
}rtSdioBlockT;
|
||
|
|
||
|
/* SDIO specific handle */
|
||
|
typedef struct
|
||
|
{
|
||
|
rt_uint32_t inUse; /* specifies if handle is in use */
|
||
|
rt_uint32_t index; /*index of handle array*/
|
||
|
RT_SDIO_OpenParamsT openParams; /* open params of the handle */
|
||
|
rtSdioBlockT devicePtr; /* pointer to hardware device */
|
||
|
} rtSdioHandleT;
|
||
|
|
||
|
typedef struct gk_mmc_driver
|
||
|
{
|
||
|
rtSdioHandleT handle;
|
||
|
RT_SDIO_OpenParamsT openParams;
|
||
|
struct rt_device *deviceP[MMC_HANDLE_COUNT];
|
||
|
struct dfs_partition *partP[MMC_HANDLE_COUNT];
|
||
|
}gk_mmc_driver_s;
|
||
|
|
||
|
|
||
|
typedef void (*fs_sdio_notify_func_t)(rt_uint32_t index, rt_uint32_t comState, void* optArgPtr);
|
||
|
|
||
|
int rt_hw_mmc_init(gk_mmc_driver_s *pMmcParams);
|
||
|
|
||
|
#endif /* MMC_H_ */
|