初始化流程
Probe 和 Bind 过程
为了约束初始化顺序,AICFB 为 component 的 master 设备,DE、DI 和 panel 为 slave 设备,component 框架保证 master 的初始化顺序在所有 slave 之后。各模块的初始化顺序如下:
其中:
-
Master 调用 component_match_add() 接口声明一个 match 队列。
-
Master 调用 component_master_add_with_match() 将自己注册进 component 框架。
-
Slave 调用 component_add()完成 slave 注册。
-
各模块的 probe 顺序没有约束,设备的注册和声明在 probe 函数中进行。
-
每个子设备都要实现自己的 bind() 和 unbind() 接口(struct component_ops),当 match 队列中的模块都完成 probe 后,component 框架会调用模块的 bind() 接口。
-
各 slave 按 match 队列顺序执行 bind(),component 框架保证 master 最后执行。
-
aicfb->bind() 主要完成 framebuffer 申请、fb 设备注册、使能 UI 图层、使能 panel 等动作。
硬件时序要求
DE、DI、panel 三个硬件模块在初始化时有一些时序要求,包含先后顺序、延迟大小,主要约束来自于 panel 侧。 为了应对这样的硬件特性,驱动设计中使用 callback 方式来实现多个模块间的互相调用。
在 fb 的 bind()中,会调用这些回调来完成初始化,如下图(其中关系比较绕的是 panel 初始化逻辑):