Edit online

初始化流程

probe 和 bind 过程

为了约束初始化顺序,AICFB 为 component 的 master 设备,DE、DI 和 panel 为 slave 设备,component 框架保证 master 的初始化顺序在所有 slave 之后。各模块的初始化顺序如下:

../images/driver_bind.png
1. 显示模块的初始化顺序

其中:

  1. master 调用 component_match_add() 接口声明一个 match 队列。

  2. master 调用 component_master_add_with_match() 将自己注册进 component 框架。

  3. slave 调用 component_add()完成 slave 注册。

  4. 各模块的 probe 顺序没有约束,设备的注册和声明在 probe 函数中进行。

  5. 每个子设备都要实现自己的 bind() 和 unbind() 接口(struct component_ops),当 match 队列中的模块都完成 probe 后,component 框架会调用模块的 bind() 接口。

  6. 各 slave 按 match 队列顺序执行 bind(),Component 框架保证 master 最后执行。

  7. aicfb->bind() 主要完成 framebuffer 申请、fb 设备注册、使能 UI 图层、使能 panel 等动作。

硬件时序要求

DE、DI、panel 三个硬件模块在初始化时有一些时序要求,包含先后顺序、延迟大小,主要约束来自于 panel 侧。 为了应对这样的硬件特性,驱动设计中使用 callback 方式来实现多个模块间的互相调用。

../images/callbacks1.png

在 fb 的 bind()中,会调用这些回调来完成初始化,如下图(其中关系比较绕的是 panel 初始化逻辑):

../images/fb_bind1.png