非命令队列模式
非命令队列模式,即 normal 模式。
-
GE HAL 层已经实现了 GE 的完整功能,可以不依靠 MPP 层和 DRV 层进行运行。
-
在一般情况下,不会直接操作 HAL 层,而是通过 MPP 层间接操作 GE。
在 Normal 模式下,可用 hal_ge_control 控制 GE,包括以下几种操作:
-
IOC_GE_VERSION
-
IOC_GE_MODE
-
IOC_GE_FILLRECT
-
IOC_GE_BITBLT
-
IOC_GE_ROTATE
在 normal 模式下,对 IOC_GE_FILLRECT、IOC_GE_BITBLT、IOC_GE_ROTATE 接口的调用是同步的,即硬件执行任务完成后接口调用才会返回。
关键流程设计
在 normal 模式下,GE 驱动各种功能都是通过 hal_ge_control 调用来实现。
- GE 参数配置。
- GE 模块中断开启。
- GE 硬件启动。
- GE 等待中断,当前线程进入等待状态,直到收到中断通知。
- 硬件完成任务后,关闭中断。
hal_ge_control 通过 mutex 保护,确保多线程环境下的安全性。在 normal 模式下,支持多应用同时打开驱动,并调用 hal_ge_control。
等待中断流程:
-
在调用 hal_ge_init 时创建事件集: data → wait = aicos_event_create()。
在 hal_ge_control 中调用如下函数,使当前应用在等待事件中睡眠:
ret = aicos_event_recv(data->wait, HW_RUNNING_EVENT, &recved, GE_TIMEOUT)。-
在中断服务程序中调用 aicos_event_send(data->wait, HW_RUNNING_EVENT),唤醒等待队列中的睡眠进程。