设计说明
源码说明
源代码位于 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 层接口头文件
模块架构
RTOS 系统中没有对应的设备框架来支持特定的硬件设备,此时可以将 MTOP 作为一个 Miscellaneous device 注册到 RTOS 上实现对特定硬件的管理。
将 MTOP 作为一种通用设备注册到 RTOS 上可以让开发者在 RTOS 环境下灵活地管理和操作自定义或不常见的硬件设备,也可以在 RTOS 环境中添加新的设备类型,而无需修改底层的 RTOS 代码。
即使没有 RTOS,使用 HAL 层也可以支持 baremetal 方式的应用场景。这种情况下,HAL 层提供了基本的硬件操作接口,使得应用程序可以在没有操作系统的情况下直接控制硬件。
关键流程设计
MTOP 驱动的初始化接口通过 INIT_BOARD_EXPORT(drv_mtop_init) 完成注册,其中主要步骤有:
-
初始化模块的时钟 (clk)。
时钟 (clk) 是硬件模块正常工作的基础,因此首先需要初始化模块的时钟。
-
注册接收回调函数。
为了处理接收到的数据,需要注册一个回调函数。这个回调函数将在数据到达时被调用。
-
注册中断。
中断是硬件与软件通信的重要机制,通过注册中断可以确保在特定事件发生时及时响应。
数据结构设计
struct mtop_dev {
struct rt_device dev;
struct aic_mtop_dev mtop_handle;
char *name;
};
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;
接口设计
函数原型 | rt_err_t mtop_ops_init(rt_device_t dev) |
---|---|
功能说明 | MTOP 控制器的初始化 |
参数定义 | dev - 指向 MTOP 设备 |
返回值 | 0,成功 |
注意事项 | - |
函数原型 | rt_err_t mtop_ops_open(rt_device_t dev) |
---|---|
功能说明 | 打开 MTOP 设备 |
参数定义 | dev - 指向 MTOP 设备 |
返回值 | 0,成功 |
注意事项 | - |
函数原型 | rt_err_t mtop_ops_close(rt_device_t dev) |
---|---|
功能说明 | 关闭 MTOP 设备 |
参数定义 | dev - 指向 MTOP 设备 |
返回值 | 0,成功 |
注意事项 | - |
函数原型 | rt_err_t mtop_ops_control(rt_device_t *dev, int cmd, void *args) |
---|---|
功能说明 | MTOP 驱动的 ioctl 接口 |
参数定义 | |
返回值 | 0,成功;<0,失败 |
注意事项 | - |
enum {
MTOP_SET_PERIOD_MODE, // 设置周期模式
MTOP_ENABLE, // 启用 MTOP
};
HAL 层接口设计
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);