代码拉取完成,页面将自动刷新
SD/SDIF/eMMC控制器,主要支持SD卡,eMMC介质的访问能力,同时支持连接SDIO接口设备,目前 FSDIF 驱动已经支持 SD 卡和 eMMC 卡的访问
FSDIF 驱动提供了SD/MMC卡的控制访问方法,
访问 SD/MMC 卡需要兼容一系列协议命令,这一部分驱动不提供,可以通过第三方框架fsl_sdmmc使用
驱动相关的源文件包括,
fsdif
├── fsdif.c
├── fsdif.h
├── fsdif_cmd.c
├── fsdif_dma.c
├── fsdif_g.c
├── fsdif_hw.h
├── fsdif_intr.c
├── fsdif_pio.c
├── fsdif_selftest.c
├── fsdif_sinit.c
以下部分将指导您完成 FSDIF 驱动的软件配置:
typedef struct _FSdif
{
FSdifConfig config; /* Current active configs */
u32 is_ready; /* Device is initialized and ready */
FSdifIDmaDescList desc_list; /* DMA descriptor list, valid in DMA trans mode */
FSdifEvtHandler evt_handlers[FSDIF_NUM_OF_EVT]; /* call-backs for interrupt event */
void *evt_args[FSDIF_NUM_OF_EVT]; /* arguments for event call-backs */
FSdifRelaxHandler relax_handler;
u32 prev_cmd; /* record previous command code */
FSdifCmdData *cur_cmd;
FSdifTiming *curr_timing;
} FSdif; /* SDIF intance */
typedef struct
{
u32 instance_id; /* Device instance id */
uintptr base_addr; /* Device base address */
u32 irq_num; /* Interrupt num */
FSdifTransMode trans_mode; /* Trans mode, PIO/DMA */
boolean non_removable; /* No removeable media, e.g eMMC */
FSdifGetTuning get_tuning; /* Get time-tuning related parameters and method */
} FSdifConfig; /* SDIF intance configuration */
typedef struct
{
u32 cmdidx; /* command index */
#define FSDIF_SWITCH_VOLTAGE 11U
u32 cmdarg; /* command argument */
u32 response[4]; /* command response buffer */
u32 flag; /* command flags */
#define FSDIF_CMD_FLAG_NEED_INIT BIT(1) /* need initialization */
#define FSDIF_CMD_FLAG_EXP_RESP BIT(2) /* need reply */
#define FSDIF_CMD_FLAG_EXP_LONG_RESP BIT(3) /* need 136 bits long reply */
#define FSDIF_CMD_FLAG_NEED_RESP_CRC BIT(4) /* need CRC */
#define FSDIF_CMD_FLAG_EXP_DATA BIT(5) /* need trans data */
#define FSDIF_CMD_FLAG_WRITE_DATA BIT(6) /* need trans data to write card */
#define FSDIF_CMD_FLAG_READ_DATA BIT(7) /* need trans data to read card */
#define FSDIF_CMD_FLAG_NEED_AUTO_STOP BIT(8) /* need auto stop after command */
#define FSDIF_CMD_FLAG_ADTC BIT(9) /* need ADTC */
#define FSDIF_CMD_FLAG_SWITCH_VOLTAGE BIT(10) /* need switch voltage */
#define FSDIF_CMD_FLAG_ABORT BIT(11)
FSdifData *data_p; /* SDIF trans data */
volatile boolean success; /* TRUE: comand and data transfer success */
} FSdifCmdData; /* SDIF trans command and data */
typedef struct
{
u32 attribute; /* ds0 */
#define FSDIF_IDMAC_DES0_DIC BIT(1)/* 内部描述表不触发TI/RI中断 */
#define FSDIF_IDMAC_DES0_LD BIT(2)/* 数据的最后一个描述符 */
#define FSDIF_IDMAC_DES0_FD BIT(3)/* 数据的第一个描述符 */
#define FSDIF_IDMAC_DES0_CH BIT(4)/* 链接下一个描述符地址 */
#define FSDIF_IDMAC_DES0_ER BIT(5)/* 链表已经到达最后一个链表 */
#define FSDIF_IDMAC_DES0_CES BIT(30)/* RINTSTS寄存器错误汇总 */
#define FSDIF_IDMAC_DES0_OWN BIT(31)/* 描述符关联DMA,完成传输后该位置置0 */
u32 non1; /* ds1 --> unused */
u32 len; /* ds2 buffer size*/
u32 non2; /* ds3 --> unused */
u32 addr_lo; /* ds4 Lower 32-bits of Buffer Address Pointer 1 --> buffer 1 */
u32 addr_hi; /* ds5 Upper 32-bits of Buffer Address Pointer 1 */
/* Each descriptor can transfer up to 4KB of data in chained mode */
#define FSDIF_IDMAC_MAX_BUF_SIZE 0x1000U
u32 desc_lo; /* ds6 Lower 32-bits of Next Descriptor Address --> buffer 2 */
u32 desc_hi; /* ds7 Upper 32-bits of Next Descriptor Address */
} __attribute__((packed)) __attribute((aligned(4))) FSdifIDmaDesc; /* SDIF DMA descriptr */
const FSdifConfig *FSdifLookupConfig(u32 instance_id);
Note:
Input:
Return:
FError FSdifCfgInitialize(FSdif *const instance_p, const FSdifConfig *cofig_p);
Note:
Input:
Return:
void FSdifDeInitialize(FSdif *const instance_p);
Note:
Input:
Return:
FError FSdifSetIDMAList(FSdif *const instance_p, volatile FSdifIDmaDesc *desc, uintptr desc_dma, u32 desc_num);
Note:
Input:
Return:
FError FSdifSetClkFreq(FSdif *const instance_p, u32 input_clk_hz);
Note:
Input:
Return:
FError FSdifDMATransfer(FSdif *const instance_p, FSdifCmdData *const cmd_data_p);
Note:
Input:
Return:
FError FSdifPollWaitDMAEnd(FSdif *const instance_p, FSdifCmdData *const cmd_data_p);
Note:
Input:
Return:
u32 FSdifGetInterruptMask(FSdif *const instance_p, FSdifIntrType intr_type);
Note:
Input:
Return:
void FSdifSetInterruptMask(FSdif *const instance_p, FSdifIntrType type, u32 set_mask, boolean enable);
Note:
Input:
Return:
void FSdioInterruptHandler(s32 vector, void *param)
Note:
Input:
Return:
void FSdifRegisterEvtHandler(FSdif *const instance_p, FSdifEvtType evt, FSdifEvtHandler handler, void *handler_arg);
Note:
Input:
Return:
FError FSdifPIOTransfer(FSdif *const instance_p, FSdifCmdData *const cmd_data_p);
Note:
Input:
Return:
FError FSdifPollWaitPIOEnd(FSdif *const instance_p, FSdifCmdData *const cmd_data_p);
Note:
Input:
Return:
FError FSdioGetCmdResponse(FSdif *const instance_p, FSdioCmdData *const cmd_data_p)
Note:
Input:
Return:
FError FSdifRestart(FSdif *const instance_p);
Note:
Input:
Return:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。