接口设计
Driver 层接口设计
-
Baremetal Driver 参考 Driver 层设计,去除了 RT-Thread 所需的结构信息。
-
以下接口皆为 SDIO 设备驱动框架所需要的标准接口,目前 SDMC 驱动仅实现了其中的 request 和 set_iocfg 接口。
struct rt_mmcsd_host_ops { void (*request)(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req); void (*set_iocfg)(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg); rt_int32_t (*get_card_status)(struct rt_mmcsd_host *host); void (*enable_sdio_irq)(struct rt_mmcsd_host *host, rt_int32_t en); };
函数原型 | RT-Thread | Baremetal |
---|---|---|
void aic_sdmc_request(struct rt_mmcsd_host *rthost, struct rt_mmcsd_req *req) | void aic_sdmc_request(struct aic_sdmc *host, struct aic_sdmc_cmd *cmd, struct aic_sdmc_data *data) | |
功能说明 | 请求 SDMC 控制器向 Device 发送一个报文 | |
参数定义 | rthost: 指向 SDIO 层的 mmcsd 控制器 req:请求的参数和资源 |
host: 指向上层调用的 mmcsd 控制器 cmd: 请求发送的命令 data: 请求发送的数据 |
返回值 | 无 | |
注意事项 | 无 |
函数原型 | RT-Thread | Baremetal |
---|---|---|
void aic_sdmc_set_iocfg(struct rt_mmcsd_host *rthost, struct rt_mmcsd_io_cfg *io_cfg) | void aic_sdmc_set_cfg(struct aic_sdmc *host) | |
功能说明 | 配置位宽、DDR 模式、clock、power 模式等信息 | |
参数定义 | rthost: 指向 SDIO 层的 mmcsd 控制器 io_cfg:配置参数 |
host: 指向上层调用的 mmcsd 控制器 |
返回值 | 无 | |
注意事项 |
函数原型 | RT-Thread | Baremetal |
---|---|---|
void aic_sdmc_set_iocfg(struct rt_mmcsd_host *rthost, struct rt_mmcsd_io_cfg *io_cfg) | void aic_sdmc_set_cfg(struct aic_sdmc *host) | |
功能说明 | 配置位宽、DDR 模式、clock、power 模式等信息 | |
参数定义 | rthost: 指向 SDIO 层的 mmcsd 控制器 io_cfg:配置参数 |
host: 指向上层调用的 mmcsd 控制器 |
返回值 | 无 | |
注意事项 |
HAL 层接口设计
HAL 层的函数接口声明存放在 hal_sdmc.h
中,主要接口有:
int hal_sdmc_idma_start(struct aic_sdmc_host *host, u32 size, u32 read, u32 *buf, struct bounce_buffer *bbstate); int hal_sdmc_idma_stop(struct aic_sdmc_host *host, struct bounce_buffer *bbstate, u32 read); void hal_sdmc_idma_prepare(struct aic_sdmc_host *host, u32 blksize, u32 blks, struct aic_sdmc_idma_desc *cur_idma, void *bounce_buffer); int hal_sdmc_data_rx(struct aic_sdmc_host *host, u32 *buf, u32 size); int hal_sdmc_data_tx(struct aic_sdmc_host *host, u32 *buf, u32 size); u32 hal_sdmc_int_stat(struct aic_sdmc_host *host); void hal_sdmc_int_clr(struct aic_sdmc_host *host, u32 mask); int hal_sdmc_is_busy(struct aic_sdmc_host *host); void hal_sdmc_set_blk(struct aic_sdmc_host *host, u32 blksize, u32 blks); void hal_sdmc_set_arg(struct aic_sdmc_host *host, u32 arg); void hal_sdmc_set_cmd(struct aic_sdmc_host *host, u32 cmd); u32 hal_sdmc_wait_cmd_started(struct aic_sdmc_host *host); void hal_sdmc_get_rsp(struct aic_sdmc_host *host, u32 *buf, u32 all); void aic_sdmc_set_ext_clk_mux(struct aic_sdmc_host *host, u32 mux); void hal_sdmc_set_phase(struct aic_sdmc_host *host, u32 drv, u32 smp); void hal_sdmc_set_buswidth(struct aic_sdmc_host *host, u32 buswidth); void hal_sdmc_set_ddrmode(struct aic_sdmc_host *host, u32 ddr); void hal_sdmc_clk_enable(struct aic_sdmc_host *host); void hal_sdmc_set_div(struct aic_sdmc_host *host, u32 div); void hal_sdmc_fifo_init(struct aic_sdmc_host *host, u32 *thd); int hal_sdmc_reset(struct aic_sdmc_host *host, u32 value); void hal_sdmc_init(struct aic_sdmc_host *host);