[Camera]RK平台摄像头驱动

这篇博客介绍了RK平台的摄像头驱动,该驱动通过抽象接口简化了camera的移植和调试工作。内容涵盖数据结构、ioctl codes以及rk_camsys、ISP、mipiphy等模块的说明,特别强调了不同接口类型的摄像头如何处理。此外,还提到了camsys_phyinfo_s结构体和flash设备的注册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

platform:rk3399
OS:Android 7.1
Kernel:4.4
参考:
1. KrisFei https://blog.youkuaiyun.com/kris_fei/article/details/79298971

简介

​ RK平台抽象出了一个公共的camera驱动,给应用层提供通用的camera驱动注册和操作接口。这样将camera驱动和配置全部抽离到用户空间,不需要重新编译和调试内核,极大的简化了camera的移植和调试。

​ 除USB摄像头走v4l2之外,其余类型的摄像头均走RK自己定义的一套公共Camera驱动接口。

  • CameraUSBAdapter: USB接口类型的摄像头,走v4l2.
  • CameraIspSOCAdapter:dvp接口,isp控制器接收。
  • CameraIspAdapter:mipi接口,isp控制器接收,不走v4l2.
  • CameraSOCAdapter:dvp接口,VIP控制器接收。

重要数据结构

数据结构

//isp设备描述结构体
typedef struct camsys_dev_s {
	unsigned int          dev_id;
	camsys_irq_t          irq;
	camsys_devmems_t      devmems;
	struct miscdevice     miscdev;
	void                  *clk;
	camsys_phyinfo_t      *mipiphy;
	camsys_phyinfo_t      cifphy;

	camsys_exdevs_t       extdevs;
	struct list_head      list;
	struct platform_device *pdev;

	void                  *soc;

	camsys_meminfo_t     *csiphy_reg;
	camsys_meminfo_t     *dsiphy_reg;
	camsys_meminfo_t     *isp0_reg;

	unsigned long         rk_grf_base;
	unsigned long         rk_cru_base;
	unsigned long         rk_isp_base;
	atomic_t              refcount;
	struct iommu_domain *domain;
	camsys_dma_buf_t dma_buf[CAMSYS_DMA_BUF_MAX_NUM];
	int dma_buf_cnt;

	int (*clkin_cb)(void *ptr, unsigned int on);
	int (*clkout_cb)(void *ptr, unsigned int on, unsigned int clk);
	int (*reset_cb)(void *ptr, unsigned int on);

	int (*phy_cb)
		(camsys_extdev_t *extdev,
		camsys_sysctrl_t *devctl, void *ptr);
	int (*iomux)(camsys_extdev_t *extdev, void *ptr);
	int (*platform_remove)(struct platform_device *pdev);
	int (*flash_trigger_cb)(void *ptr, int mode, unsigned int on);
	int (*iommu_cb)(void *ptr, camsys_sysctrl_t *devctl);
} camsys_dev_t;

//内存信息描述结构体
typedef struct camsys_meminfo_s {
	unsigned char name[32];
	unsigned long phy_base;
	unsigned long vir_base;
	unsigned int size;
	unsigned int vmas;
	struct list_head list;
} camsys_meminfo_t;

//phy信息描述结构体
typedef struct camsys_phyinfo_s {
	unsigned int             phycnt;
	void                     *clk;
	camsys_meminfo_t         *reg;
	int (*clkin_cb)(void *ptr, unsigned int on);
	int (*ops)(void *ptr, camsys_mipiphy_t *phy);
	int (*remove)(struct platform_device *pdev);
} camsys_phyinfo_t;

//中断连接描述结构体
typedef struct camsys_irqcnnt_s {
    int          pid;
    unsigned int timeout;             //us

    unsigned int mis;
	unsigned int icr;
} camsys_irqcnnt_t;

ioctl codes

IOCTL CODES 说明
CAMSYS_VERCHK 检查驱动版本和头文件版本
CAMSYS_I2CRD 读i2c寄存器
CAMSYS_I2CWR 写i2c寄存器
CAMSYS_SYSCTRL sysc
### 关于 RK3588 MIPI 摄像头驱动开发文档 RK3588 是一款高性能处理器,支持多种外设接口,其中包括 MIPI CSI-2 接口用于连接摄像头模块。为了成功开发 MIPI 摄像头驱动程序,开发者需要深入理解 RK3588 的硬件架构以及 Linux 内核中的 V4L2 子设备框架。 #### 硬件架构与接口说明 MIPI CSI-2 是一种高速串行接口协议,广泛应用于移动设备和嵌入式系统的图像传感器数据传输中。RK3588 提供了对 MIPI CSI-2 的原生支持,允许通过该接口接收来自摄像头的数据流并将其传递给 ISP(图像信号处理单元)。在实际开发过程中,需重点研究以下方面[^1]: - **MIPI CSI-2 协议**: 了解其帧结构、通道分配及物理层特性。 - **RK3588 硬件手册**: 获取芯片的具体寄存器定义及其操作方法。 #### 设备树配置 设备树文件(Device Tree Source, DTS)是描述硬件资源的关键部分,在 RK3588 平台上,必须正确设置 MIPI CSI-2 接口的相关参数以匹配所使用的摄像头模块。典型配置可能包括但不限于: ```dts &csi { status = "okay"; rockchip,camera-module-mipi-dphy-index = <0>; }; ``` 上述代码片段展示了如何指定 MIPI D-PHY 的索引号,具体数值取决于目标摄像头的实际连线方式[^3]。 #### 驱动实现要点 V4L2(Video for Linux Two)作为主流的多媒体框架之一,在 Linux 系统下负责管理视频输入/输出功能。针对 MIPI 摄像头的支持通常涉及以下几个层面的工作: - 创建子设备节点以便应用程序访问特定的功能集; - 编写初始化逻辑完成硬件资源配置; - 处理中断事件从而及时响应外部触发条件; - 定义 ioctl 命令扩展标准 API 表面覆盖更多定制需求。 此外,还可以借鉴其他相似平台上的现有解决方案来加速项目进度,比如提到过的 rkisp 组件就提供了良好的示范作用。 #### 调试技巧 在整个开发周期里,持续性的测试必不可少。利用专业的工具链可以帮助定位潜在问题所在位置,并优化整体表现水平。例如借助 iSpy 或者 gstreamer 工具构建简单的预览管道快速验证基本连通性;或者采用专门的日志记录机制捕获异常情况下的内部状态变化轨迹便于后续分析解决。 对于具体的开发文档下载地址,建议直接联系 Rockchip 官方获取最新版本的技术参考资料包,其中包含了详尽的设计指南和技术白皮书等内容[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值