非命令队列模式
非命令队列模式,即 normal 模式。
在 normal 模式下,GE HAL 层已经实现了 GE 的完整功能,可以不依靠 MPP 层和 DRV 层进行运行。 但在一般情况我们并不会通过直接操作 HAL 层操作 GE,而是使用 MPP 层间接去操作 GE。
normal 模式可用 control 控制 GE:
-
IOC_GE_VERSION
-
IOC_GE_MODE
-
IOC_GE_FILLRECT
-
IOC_GE_BITBLT
-
IOC_GE_ROTATE
对于接口 FILLRECT、IOC_GE_BITBLT、IOC_GE_ROTATE 在 normal 模式下调用是同步的, 硬件执行任务完成后接口调用才会返回。
关键流程设计
在 normal 模式下,GE 驱动各种功能都是通过hal_ge_control调用来实现,每一次hal_ge_control的调用都包括 GE 参数配置、GE 模块中断开启, GE 启动,GE 等中断(阻塞等待中断服务程序通知中断到来),硬件完成任务后,关闭中断。hal_ge_control通过 mutex 保护, 支持多用户同时打开驱动设备节点,并调用hal_ge_control。

等待中断流程:
-
在调用 init 时候创建事件集: data->wait = aicos_event_create();
在 control 中调用如下函数,使当前应用在等待事件中睡眠:
ret = aicos_event_recv(data->wait, HW_RUNNING_EVENT, &recved, GE_TIMEOUT);-
在中断服务程序中调用 aicos_event_send(data->wait, HW_RUNNING_EVENT),激活等待事件中睡眠的应用