RK3588随笔:MIPI协议——D-PHY 物理层的自定义和校验
1.简单了解点概念
MIPI接口:它是一条专门用来高速传输摄像头数据的物理线路。
D-PHY 物理层:它规定了电压应该是多少、信号怎么传输、速度能跑多快。
**linux-orangepi/drivers/phy/phy-core-mipi-dphy.c**代码:定义和检查这个“物理标准”
CSI-2 协议层:它规定了图像数据如何打包、如何加帧头帧尾、如何进行校验,确保收到的数据是完整且干净的
摄像头数据通过 MIPI 这根“水管” 传输。这根水管的物理规格由 D-PHY 定义,水在里面流动的规则由 CSI-2 定义。两者合作,才能把图像数据正确地从摄像头送到RK3588。
2.重头戏:kernel/drivers/phy/phy-core-mipi-dphy.c解析
kernel/drivers/phy/phy-core-mipi-dphy.c 的代码
它只提供最权威、最通用的**计算公式**和**安全标准**
整个代码分为两个函数:
1.phy_mipi_dphy_get_default_config
1)这个函数是一个计算器,它将高层的摄像头参数(像素时钟、数据位宽、通道数)转换成底层的、精确到皮秒的物理层电信号时序参数,为后续的硬件配置提供了一套标准化的数据
2)函数的输入参数(它需要知道什么)
-
unsigned long pixel_clock: 像素时钟频率 (Hz)。
-
来源: 这个值由图像传感器(OV13855)的驱动程序根据当前的工作模式(例如 1920x1080@30fps)来确定和提供。
-
意义: 它代表了传感器每秒输出多少个像素。这是计算总数据量的基础。
-
-
unsigned int bpp: 每像素位数 (Bits Per Pixel)。
-
来源: 同样由传感器驱动提供,取决于图像格式(如 RAW8, RAW10, RAW12)。
-
意义: 它定义了每个像素包含多少位(bit)的数据。
-
-
unsigned int lanes: 数据通道数量。
-
来源: 由硬件连接决定,并在设备树(DTS)中配置。你的OV13855模组可能使用了1、2或4个数据通道。
-
意义: 总数据流将被平均分配到这些并行的通道上传输。
-
3)内部计算过程:略
4) 函数的输出(它最终提供了什么)
-
struct
phy_configure_opts_mipi_dphy
*cfg
: 这是一个指向配置结构体的指针,作为输出参数。 -
意义: 函数执行完毕后,这个 cfg 结构体会被完全填充。它包含了一套完整、有效、符合MIPI官方规范的D-PHY时序参数。
-
这个被填充好的结构体,之后会被特定平台的PHY驱动(例如Rockchip的D-PHY驱动)所使用,最终将这些时间值写入到RK3588芯片的硬件寄存器中,
从而完成对MIPI物理接口的配置
。
2.函数 phy_mipi_dphy_config_validate
1)验证一个给定的 phy_configure_opts_mipi_dphy
结构体中所包含的D-PHY时序参数,是否完全符合 MIPI Alliance 制定的 D-PHY 物理层规范中对各个时序参数的取值范围要求
它的存在是为了确保,无论这些配置参数来源于何处(无论是通过 phy_mipi_dphy_get_default_config
自动生成,还是由开发者在设备树中手动指定),最终要写入硬件寄存器的值都是安全和有效的,不会违反MIPI规范
2)函数的输入参数(它需要知道什么)
struct phy_configure_opts_mipi_dphy *cfg
: 一个指向包含了待验证时序参数的结构体指针。
- 来源: 这个结构体通常已经被填充了时序值。
- 这些值可能来自
phy_mipi_dphy_get_default_config
的计算结果 - 也可能是在此基础上被平台特定代码(Platform-specific driver)或设备树(Device Tree)中的配置所覆盖修改后的结果。
- 这些值可能来自
3)函数的内部执行过程
函数的内部逻辑非常直接,就是一系列基于MIPI D-PHY规范的 if
条件判断语句。
步骤 A: 计算基础时间单位 ui
-
它首先需要计算出
ui
(Unit Interval)-
全称为 Unit Interval(单位间隔) 它的物理意义是:在高速模式(High-Speed, HS)下,传输一位(1 bit)数据所需要的时间。
-
ui = 1 / Data_Rate
-
步骤 B: 逐条验证时序参数
-
接下来,函数对
cfg
结构体中的每一个重要时序成员进行检查,确保其值落在MIPI规范定义的最小/最大值范围内。 -
函数会依次对
clk_settle
,clk_trail
,hs_exit
,hs_trail
,lpx
等所有关键时序参数执行类似的检查
4) 函数的输出(它最终提供了什么)
int
(整型返回值):
0
(零): 如果cfg
结构体中的所有时序参数都通过了检查,均符合MIPI D-PHY规范,函数返回0
,代表验证成功。-EINVAL
(负数错误码): 如果任何一个时序参数未能通过检查,函数会立即停止后续检查并返回-EINVAL
,代表验证失败,配置无效。