Edit online

接口设计

Read time: 3 minute(s)
Edit online

Driver 层接口设计

Read time: 3 minute(s)
  1. Baremetal Driver 参考 Driver 层设计,去除了 RT-Thread 所需的结构信息。

  2. 以下接口皆为 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);
    };
aic_sdmc_request
1. RT-Thread

函数原型

void aic_sdmc_request(struct rt_mmcsd_host *rthost, struct rt_mmcsd_req *req)

功能说明

请求 SDMC 控制器向 Device 发送一个报文

参数定义

rthost : 指向 SDIO 层的 mmcsd 控制器
req :请求的参数和资源

返回值

注意事项

-

2. Baremetal

函数原型

void aic_sdmc_request(struct aic_sdmc *host, struct aic_sdmc_cmd *cmd, struct aic_sdmc_data *data)

功能说明

请求 SDMC 控制器向 Device 发送一个报文

参数定义

host: 指向上层调用的 mmcsd 控制器
cmd : 请求发送的命令
data : 请求发送的数据

返回值

注意事项

-

aic_sdmc_set_iocfg
3. RT-Thread

函数原型

void aic_sdmc_set_iocfg(struct rt_mmcsd_host *rthost, struct rt_mmcsd_io_cfg *io_cfg)

功能说明

配置位宽、DDR 模式、clock、power 模式等信息

参数定义

rthost : 指向 SDIO 层的 mmcsd 控制器
io_cfg :配置参数

返回值

注意事项

-

4. Baremetal

函数原型

void aic_sdmc_set_cfg(struct aic_sdmc *host)

功能说明

配置位宽、DDR 模式、clock、power 模式等信息

参数定义

host : 指向上层调用的 mmcsd 控制器

返回值

注意事项

-

Edit online

HAL 层接口设计

Read time: 3 minute(s)
HAL 层的函数接口声明存放在 hal_sdmc.h 中,主要接口有:
void hal_sdmc_idma_update_intstat(struct aic_sdmc_host *host);
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_disable(struct aic_sdmc_host *host);
u8 hal_sdmc_get_idma_status(struct aic_sdmc_host *host);
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_disable(struct aic_sdmc_host *host);
void hal_sdmc_clk_enable(struct aic_sdmc_host *host);
void hal_sdmc_sdio_irq_enable(struct aic_sdmc_host *host, u32 en);
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);