📄 msdc_def.h
字号:
#define MSDC_CFG_DRQEN ((kal_uint32)0x00020000)
#define MSDC_CFG_PINEN ((kal_uint32)0x00040000)
#define MSDC_CFG_DIRQE ((kal_uint32)0x00080000)
#define MSDC_CFG_RCDEN ((kal_uint32)0x00100000)
#define MSDC_CFG_VDDPD ((kal_uint32)0x00200000)
#define MSDC_CFG_PRCFG0 ((kal_uint32)0x00c00000) // MT6219 INS pin, MT6228, MT6229, MT6227 WP pin control
#define MSDC_CFG_PRCFG1 ((kal_uint32)0x03000000) // CMD/BS pin control
#define MSDC_CFG_PRCFG2 ((kal_uint32)0x0c000000) // DAT pin control
#define MSDC_CFG_FIFOTHD ((kal_uint32)0xf0000000)
#define MSDC_CFG_FIFOTHD_1 ((kal_uint32)0x10000000)
#define MSDC_CFG_FIFOTHD_4 ((kal_uint32)0x40000000)
// masks for MSDC_STA
#define MSDC_STA_BF 0x0001
#define MSDC_STA_BE 0x0002
#define MSDC_STA_DRQ 0x0004
#define MSDC_STA_INT 0x0008
#define MSDC_STA_FIFOCNT 0x00f0
#define MSDC_STA_FIFOCLR 0x4000
#define MSDC_STA_BUSY 0x8000
#define MSDC_INT_DIRQ 0x0001
#define MSDC_INT_PINIRQ 0x0002
#define MSDC_INT_SDCMDIRQ 0x0004
#define MSDC_INT_SDDATIRQ 0x0008
#define MSDC_INT_SDMCIRQ 0x0010
#define MSDC_INT_MSIFIRQ 0x0020
#define MSDC_INT_SDR1BIRQ 0x0040
// SDIO
#define MSDC_INT_SDIOIRQ 0x80
// masks for MSDC_PS
#define MSDC_PS_CDEN 0x0001
#define MSDC_PS_PIEN0 0x0002
#define MSDC_PS_POEN0 0x0004
#define MSDC_PS_PIN0 0x0008
#define MSDC_PS_PINCH 0x0010
//#if defined(MT6228)||defined(MT6229) || defined(MT6227)|| defined(MT6226)|| defined(MT6226M)
#define MSDC_PS_DEBOUNCE 0xf000
#define MSDC_PS_DAT 0xff0000
#define MSDC_PS_CMD 0x1000000
//#endif
#define MSDC_IOCON_ODCCFG0 0x0007 // driving capacity of CMD/BS and SCLK
#define MSDC_IOCON_ODCCFG1 0x0038 // driving capacity of data lines
#define MSDC_IOCON_SCRCFG0 0x0040 // slew rate of the CMD/BS and SCLK
#define MSDC_IOCON_SCRCFG1 0x0080 // slew rate of the data lines
//#if defined(MT6228)||defined(MT6229) || defined(MT6227)|| defined(MT6226)|| defined(MT6226M)
#define MSDC_IOCON_PRCFG3 0x0300 // configure the INS pin status
//#endif
// configure the output driving capacity and slew rate
#define MSDC_ODC_2MA 0x0
#define MSDC_ODC_4MA 0x1
#define MSDC_ODC_6MA 0x2
#define MSDC_ODC_8MA 0x3
// only MT6227, MT6217 and MT6218B can support following driving capacity
//#if defined(MT6228)||defined(MT6229) || defined(MT6227)|| defined(MT6226)|| defined(MT6226M)
#define MSDC_ODC_10MA 0x4
#define MSDC_ODC_12MA 0x5
#define MSDC_ODC_14MA 0x6
#define MSDC_ODC_16MA 0x7
//#endif
#define MSDC_ODC_SLEW_FAST 1
#define MSDC_ODC_SLEW_SLOW 0
//#if defined(MT6228)||defined(MT6229) || defined(MT6227)|| defined(MT6226)|| defined(MT6226M)
#define MSDC_IOCTRL_INS_DISABLE 0
#define MSDC_IOCTRL_INS_PULL_DOWN 1
#define MSDC_IOCTRL_INS_PULL_UP 2
#define MSDC_IOCTRL_INS_KEEPER 3
//#endif
// useful macros
#define MSDC_WriteReg32(adrs,data) *(volatile kal_uint32*)(adrs) = (kal_uint32)(data)
#define MSDC_ReadReg32(adrs,pdata) *(kal_uint32*)(pdata) = *(volatile kal_uint32*)(adrs)
#define MSDC_WriteReg16(adrs,data) *(volatile kal_uint16*)(adrs) = (kal_uint16)(data)
#define MSDC_ReadReg16(adrs,pdata) *(kal_uint16*)(pdata) = *(volatile kal_uint16*)(adrs)
#define MSDC_SET_BIT32(address, mask) *(volatile kal_uint32*)(address) |= (mask)
#define MSDC_CLR_BIT32(address, mask) *(volatile kal_uint32*)(address) &= ~(mask)
#define MSDC_SET_BIT16(address, mask) *(volatile kal_uint16*)(address) |= (mask)
#define MSDC_CLR_BIT16(address, mask) *(volatile kal_uint16*)(address) &= ~(mask)
#define MSDC_CLR_FIFO() MSDC_SET_BIT32(MSDC_STA,MSDC_STA_FIFOCLR)
#define MSDC_IS_FIFO_EMPTY (*(volatile kal_uint16*)MSDC_STA & MSDC_STA_BE)
#define MSDC_IS_FIFO_FULL (*(volatile kal_uint16*)MSDC_STA & MSDC_STA_BF)
#define MSDC_IS_BUSY (*(volatile kal_uint16*)MSDC_STA & MSDC_STA_BUSY)
#define MSDC_SET_FIFO(x) {MSDC_CLR_BIT32(MSDC_CFG,MSDC_CFG_FIFOTHD);\
*(volatile kal_uint32*)MSDC_CFG |= (x << 28);}
#define TurnOnMSDC() (*(volatile kal_uint16*)DRVPDN_CON1_CLR) = 0x200
#define TurnOffMSDC() (*(volatile kal_uint16*)DRVPDN_CON1_SET) = 0x200
#define EnableMSDC_DMA() MSDC_SET_BIT32(MSDC_CFG,MSDC_CFG_DRQEN)
#define DisableMSDC_DMA() MSDC_CLR_BIT32(MSDC_CFG,MSDC_CFG_DRQEN)
#define RESET_MSDC() { \
kal_uint32 i= 20;\
MSDC_SET_BIT32(MSDC_CFG,MSDC_CFG_RST);\
while(i--);\
MSDC_CLR_BIT32(MSDC_CFG,MSDC_CFG_RST);\
}
#define MSDC_CLR_INT() {\
kal_uint32 tmp;\
tmp = *(volatile kal_uint16*)MSDC_INTR;\
}
#define SET_FIFO_THRESHOLD(n) *((volatile kal_uint32*)(MSDC_CFG)) &= ~MSDC_CFG_FIFOTHD; \
*((volatile kal_uint32*)(MSDC_CFG)) |= n << 28;
#define MSDC_ENABLE_INT() MSDC_SET_BIT32(MSDC_CFG,MSDC_CFG_INTEN)
#define MSDC_DISABLE_INT() MSDC_CLR_BIT32(MSDC_CFG,MSDC_CFG_INTEN)
#define MSDC_ENABLE_CARD_DETECTION() MSDC_SET_BIT32(MSDC_PS, MSDC_PS_CDEN)
#define MSDC_DISABLE_CARD_DETECTION() MSDC_CLR_BIT32(MSDC_PS, MSDC_PS_CDEN)
#define MSDC_IS_INT (*(volatile kal_uint16*)MSDC_STA& MSDC_STA_INT)
// define event flags
#define EVENT_SDCMDIRQ ((kal_uint32)0x00000001)
#define EVENT_SDDATIRQ ((kal_uint32)0x00000002)
#define EVENT_SDMCIRQ ((kal_uint32)0x00000004)
#define EVENT_MSIFIRQ ((kal_uint32)0x00000008)
#define EVENT_SDR1BIRQ ((kal_uint32)0x00000010)
#define EVENT_PINIRQ ((kal_uint32)0x00000020)
#define EVENT_MSRDYIRQ ((kal_uint32)0x00000040)
#define EVENT_DMAIRQ ((kal_uint32)0x00000100)
#define EVENT_INVALID_IRQ ((kal_uint32)0x80000000)
#define EVENT_ALLIRQ (EVENT_SDCMDIRQ|EVENT_SDDATIRQ|EVENT_SDMCIRQ|EVENT_MSIFIRQ|EVENT_SDR1BIRQ|EVENT_PINIRQ|EVENT_DMAIRQ)
#define MSDC_NOERROR 0
#define MSDC_ERR_CARD_DETECT 101
#define MSDC_CARD_NOT_PRESENT 102
#define MSDC_DMA_FAIL 104
#define MSDC_GPT_TIMEOUT_ERR 199
#define MSDC_TIMEOUT_PERIOD_INI 1100 // x1ms
#define MSDC_TIMEOUT_PERIOD_DAT 100 // x10ms
#define MSDC_TIMEOUT_PERIOD_CMD 50 // x10ms
#define MSDC_INI_CLOCK 240 // kHz
#define MSDC_WRITE_THD_POLL 2*128 // 1K bytes
#define MSDC_READ_THD_POLL 8*128 // 4k bytes
#define MSDC_GPIO_MCINS 14
#define MSDC_GPIO_WP 15
// enum
typedef enum {
MS_CARD = 0,
SD_CARD = 1,
MMC_CARD = 2,
MSPRO_CARD = 3,
MMC40_CARD = 4,
SD20_LCS_CARD = 5, // SD 2.0 compliant but with byte access mode. (<=2G)
SD20_HCS_CARD = 6, // SD 2.0 compliant but with block access mode. (>2G)
MMC42_CARD = 7, // MMC 4.2 compliant with block access mode
MSDC_CARD_TYPE_MAX,
UNKNOWN_CARD = 0xF3
} T_MSDC_CARD;
typedef enum {
POLLING,
INTERRUPT,
DMA
}T_RESP_TYPE;
typedef enum{
FREQ_1BY2 = 0, // f = 1/2 * 52M
FREQ_1BY4 = 1,
FREQ_1BY8 = 2
}SerClock_enum;
typedef enum{
MSDC_IOCTRL_DISABLE = 0,
MSDC_IOCTRL_PULL_DOWN = 1,
MSDC_IOCTRL_PULL_UP = 2,
MSDC_IOCTRL_KEEPER = 3
}msdc_ioctrl_enum;
typedef struct
{
//LOCAL_PARA_HDR
kal_uint8 media_size;
void *media_array;
}msdc_card_detect_ind_struct;
typedef struct
{
kal_uint32 msdc_clock; // clock rate of MSDC
kal_uint32 op_clock;
kal_uint32 total_count; // separate transfer count larger than 16 bits into various parts.
kal_uint32 timeout_period; // x 10ms
volatile T_MSDC_CARD mMSDC_type; // indicate the type of card(SD, MMC, MS)
volatile kal_bool mIsPresent; // card is present or not
volatile kal_bool mIsInitialized; // card is initialized or not
volatile kal_bool mIsChanged; // card is changed or not
volatile kal_bool is_timeout; // flag to indicate whther the gpt is expired
kal_bool mIsPWDown; // is MSDC is power down
kal_uint8 gpt_handle; // handler of gpt timer
kal_uint8 cmd_sta;
kal_uint8 dat_sta;
msdc_ioctrl_enum ins_level; // indicate the INS pin pull status;
kal_uint8 timeout_count;
kal_bool is_poll;
kal_bool is_aligned;
kal_bool is_init_timeout; // the initialization process larger than 1 sec
#if defined(MSDC_DEBUG_INFO)
kal_char msdc_fname[20];
kal_uint32 msdc_lines;
#endif
}MSDC_HANDLE, *pMSDC_HANDLE;
typedef struct
{
T_MSDC_CARD type; // indicate the type of card(SD, MMC, MS)
kal_bool present; // card is present or not
}msdc_card_ind_strcut;
typedef struct
{
kal_uint8 cmd_clk_odc;
kal_uint8 dat_odc;
kal_uint8 cmd_clk_slew;
kal_uint8 dat_slew;
}msdc_io_ctrl_struct;
extern MSDC_HANDLE gMSDC_Handle;
extern kal_eventgrpid MSDC_Events;
extern kal_uint32 MSDC_Sector[128];
// extern functions
void MSDC_Initialize(void);
kal_bool MSDC_CardDetect(void);
void MSDC_HostSelect(T_MSDC_CARD type);
void BitFieldWrite32(kal_uint32 * dest, kal_uint32 src, kal_uint32 mask);
void BitFieldRead32(kal_uint32 * dest, kal_uint32 src, kal_uint32 mask);
kal_uint32 GetBitFieldN(kal_uint8* dest, kal_uint8* src, kal_uint16 start_bit, kal_uint16 width);
void MSDC_LISR(void);
void MSDC_HISR_Entry(void);
void MSDC_DMA_LISR(void);
void MSDC_DMA_HISR_Entry(void);
extern void MSDC_PDNControl(kal_bool ON);
extern kal_bool MSDC_GetMediaChanged(void);
extern void MSDC_SendCardInd(module_type dest_id);
extern int MSDC_GetCardStatus(void *slot_id, int AckType);
extern void MSDC_InvertN(kal_uint8 *dest, kal_uint8 *src, kal_uint8 len);
extern void MSDC_TimeOutHandler(void *parameter);
extern kal_bool MSDC_Check_Card_Present(void);
extern void MSDC_SetClock(kal_uint32 clock);
extern void MSDC_DMATransferFirst(kal_uint32 adrs,kal_uint32 count, kal_bool isTx);
extern kal_uint32 MSDC_DMATransferFinal(void);
#if defined(MSDC_DEBUG_INFO)
#define MSDC_START_TIMER(x) \
strcpy(gMSDC_Handle.msdc_fname,__FILE__);\
gMSDC_Handle.msdc_lines = __LINE__;\
gMSDC_Handle.is_timeout = KAL_FALSE;\
GPTI_StartItem(gMSDC_Handle.gpt_handle,\
x,\
MSDC_TimeOutHandler,\
NULL)
#else
#define MSDC_START_TIMER(x) \
gMSDC_Handle.is_timeout = KAL_FALSE;\
GPTI_StartItem(gMSDC_Handle.gpt_handle,\
x,\
MSDC_TimeOutHandler,\
NULL)
#endif
#define MSDC_STOP_TIMER() \
if(!gMSDC_Handle.mIsPresent )\
return MSDC_CARD_NOT_PRESENT;\
if(!gMSDC_Handle.is_timeout)\
{\
GPTI_StopItem(gMSDC_Handle.gpt_handle);\
}\
else\
{\
kal_set_eg_events(MSDC_Events, 0, KAL_AND);\
}
#endif // end of MSDC_DEF_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -