Edit online

初始化流程

28 Nov 2024
Read time: 1 minute(s)

Probe 和 Bind 过程

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


driver_bind

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 方式来实现多个模块间的互相调用。


callbacks1

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


fb_bind