RK3588 OV13855驱动加载全解析,【连载6】数据库未来发展趋势展望,附例子,避坑指南以及面试题。
RK3588 MIPI底层驱动学习OV13855驱动加载流程解析MIPI-CSI2接口初始化RK3588通过MIPI-CSI2接口与OV13855传感器连接。系统启动时内核首先初始化CSI主机控制器配置D-PHY的时钟通道和数据通道。典型时钟配置为891MHz4-lane模式对应寄存器地址0xFD5C8000。D-PHY初始化代码示例static void rk3588_csi2_dphy_init(struct csi2_dphy *dphy) { writel(0x20000200, dphy-regs DPHY_CTRL); writel(0x00000001, dphy-regs DPHY_EN); }I2C从设备探测驱动通过I2C总线通常为I2C1地址0x20访问OV13855寄存器。内核调用i2c_add_driver()注册驱动时会执行以下关键操作发送0x300A寄存器读取芯片ID预期返回值0x13855验证PLL锁相状态寄存器0x302A检查传感器状态寄存器0x302E设备树配置片段i2c1: i2cfe5a0000 { ov13855: camera20 { compatible ovti,ov13855; reg 0x20; clocks cru CLK_CIF_OUT; }; }传感器寄存器配置驱动加载阶段通过I2C配置关键寄存器组模式控制寄存器组0x3100-0x31FF图像格式寄存器0x5000-0x5FFF曝光控制寄存器0x3500-0x35FF典型配置序列static int ov13855_init_regs(struct i2c_client *client) { ov13855_write_reg(client, 0x3100, 0x01); // 启动配置 ov13855_write_reg(client, 0x5000, 0x7F); // RAW10输出格式 }时钟树同步RK3588需要协调以下时钟域传感器主时钟24MHz输入ISP工作时钟通常为500MHzVPU视频处理时钟时钟配置公式 [ f_{pixel} \frac{f_{mclk} \times PLL_mult}{HTS \times VTS} ] 其中HTS0x0C80VTS0x0960为OV13855默认时序参数。中断系统注册驱动注册以下中断处理函数VSYNC中断GPIO3_A5HSYNC中断GPIO3_A6帧结束中断GPIO3_A7中断注册代码devm_request_irq(client-dev, gpio_to_irq(101), ov13855_vsync_handler, IRQF_TRIGGER_RISING, ov13855_vsync, priv);DMA缓冲区管理驱动初始化时建立DMA缓冲区描述符分配4个帧缓冲区通常为4224x3136分辨率配置MMU页表映射设置CSI2接收端DMA地址寄存器内存分配关键参数dma_alloc_coherent(dev, FRAME_SIZE * 4, priv-dma_handle, GFP_KERNEL);调试信息输出驱动加载过程中会输出关键日志[ 5.123456] ov13855 2-0020: Detected OV13855 sensor ID [ 5.123789] ov13855 2-0020: PLL locked at 891MHz [ 5.124123] ov13855 2-0020: Frame format: 4224x313630fps电源管理初始化传感器电源序列控制AVDD2.8V上电延迟10msDVDD1.2V上电延迟5msDOVDD1.8V上电延迟5ms释放复位信号GPIO1_B5电源控制代码片段gpiod_set_value(priv-reset_gpio, 1); usleep_range(10000, 11000);后续处理流程驱动加载完成后内核会将设备加入V4L2子系统设备列表创建/dev/videoX设备节点启动帧率控制线程初始化ISP图像处理管道https://github.com/pjongfreemen/53x_10wr/blob/main/README.mdhttps://raw.githubusercontent.com/pjongfreemen/53x_10wr/main/README.mdhttps://github.com/ry-cp/w3i_u8mxhttps://github.com/ry-cp/w3i_u8mx/blob/main/README.mdhttps://raw.githubusercontent.com/ry-cp/w3i_u8mx/main/README.md