4.6.4. 设计说明¶
4.6.4.1. 源码说明¶
源代码位于 bsp/artinchip/:
- bsp/artinchip/drv/mtop/drv_mtop.c,MTOP Driver 层实现 
- bsp/artinchip/include/drv/drv_mtop.h,MTOP Drive层头文件 
- bsp/artinchip/hal/mtop/hal_mtop.c,MTOP HAL 层实现 
- bsp/artinchip/include/hal/hal_mtop.h,MTOP HAL 层接口头文件 
4.6.4.2. 模块架构¶
RTOS 系统中没有对应的设备框架,所以 MTOP 作为一个 Miscellaneous device 注册到RTOS上。如果只是使用HAL层也可以支持 baremetal 方式的应用场景。
4.6.4.3. 关键流程设计¶
4.6.4.3.1. 初始化流程¶
MTOP 驱动的初始化接口通过 INIT_BOARD_EXPORT(drv_mtop_init) 完成注册,其中主要步骤有:
- 初始化模块的clk 
- 注册接收回调函数 
- 注册中断 
4.6.4.4. 数据结构设计¶
4.6.4.4.1. mtop_dev¶
属于 Driver 层数据结构,记录 MTOP 控制器配置信息:
struct mtop_dev {
    struct rt_device dev;
    struct aic_mtop_dev mtop_handle;
    char *name;
};
4.6.4.4.2. aic_mtop_dev¶
属于 HAL 层数据结构,记录 MTOP 的通道分组和端口配置信息:
struct aic_mtop_dev {
    unsigned long reg_base;
    IRQn_Type irq_num;
    uint32_t clk_id;
    uint8_t grp;
    uint8_t prt;
    port_bandwidth port_bw[MTOP_GROUP_MAX * MTOP_PORT_MAX];
    void (*callback)(struct aic_mtop_dev *phandle, void *arg);
    void *arg;
};
typedef struct port_bandwidth_t {
    u32 wcnt;
    u32 rcnt;
}port_bandwidth;
4.6.4.5. 接口设计¶
4.6.4.5.1. mtop_ops_init¶
| 函数原型 | rt_err_t mtop_ops_init(rt_device_t dev) | 
|---|---|
| 功能说明 | MTOP 控制器的初始化 | 
| 参数定义 | dev - 指向MTOP设备 | 
| 返回值 | 0,成功 | 
| 注意事项 | 
4.6.4.5.2. mtop_ops_open¶
| 函数原型 | rt_err_t mtop_ops_open(rt_device_t dev) | 
|---|---|
| 功能说明 | 打开MTOP设备 | 
| 参数定义 | dev - 指向MTOP设备 | 
| 返回值 | 0,成功 | 
| 注意事项 | 
4.6.4.5.3. mtop_ops_close¶
| 函数原型 | rt_err_t mtop_ops_close(rt_device_t dev) | 
|---|---|
| 功能说明 | 关闭MTOP设备 | 
| 参数定义 | dev - 指向MTOP设备 | 
| 返回值 | 0,成功 | 
| 注意事项 | 
4.6.4.5.4. mtop_ops_control¶
| 函数原型 | rt_err_t mtop_ops_control(rt_device_t *dev, int cmd, void *args) | 
|---|---|
| 功能说明 | MTOP驱动的ioctl接口 | 
| 参数定义 | dev - 指向MTOP设备 cmd - ioctl 命令码 args - ioctl 命令相应的参数 | 
| 返回值 | 0,成功;<0,失败 | 
| 注意事项 | 
MTOP的cmd命令码的定义(详见 bsp/arcinchip/include/drv/aic_drv_mtop.h):
enum {
    MTOP_SET_PERIOD_MODE,
    MTOP_ENABLE,
};
4.6.4.6. HAL 层接口设计¶
HAL 层的函数接口声明存放在 aic_hal_mtop.h 中,主要接口有:
int hal_mtop_init(struct aic_mtop_dev *phandle);
int hal_mtop_deinit(struct aic_mtop_dev *phandle);
void hal_mtop_enable(struct aic_mtop_dev *phandle);
void hal_mtop_irq_enable(struct aic_mtop_dev *phandle);
irqreturn_t hal_mtop_irq_handler(int irq_num, void *can_handle);
void hal_mtop_set_period_cnt(struct aic_mtop_dev *phandle, uint32_t period_cnt);
void hal_mtop_attach_callback(struct aic_mtop_dev *phandle, void *callback, void *arg);
void hal_mtop_detach_callback(struct aic_mtop_dev *phandle);