Edit online

非命令队列模式

非命令队列模式,即 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

../../images/ge_sw_normal_11.png
1. normal 模式中断流程

等待中断流程:

  • 在调用 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),激活等待事件中睡眠的应用