Camera学习-驱动篇

一、设备驱动篇

1.1 设备树

文件路径:kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588.dtsi

设备树配置:

&i2c1 {
	status = "okay";
	pinctrl-0 = <&i2c1m2_xfer>;//i2c pin
	i2c-scl-rising-time-ns = <600>;
	i2c-scl-falling-time-ns = <20>;

	imx577_dphy: imx577@1a {
		compatible = "sony,imx577";
		reg = <0x1a>;
		clocks = <&cru CLK_MIPI_CAMARAOUT_M4>;
		clock-names = "xvclk";
		pinctrl-names = "default";
		pinctrl-0 = <&mipim0_camera4_clk>;   
        <&mipidphy1_reset>;
		power-domains = <&power RK**_PD_VI>;
		poweren-gpios = <&gpio1 RK**_ACTIVE_HIGH>;
		rockchip,camera-module-index = <1>;
		rockchip,camera-module-facing = "front";
		rockchip,camera-module-name = "***";
		rockchip,camera-module-lens-name = "default";
		port {
			imx577_out1: endpoint {
				remote-endpoint = <&mipi_in_ucamdphy3>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};

1.1.1 标签解读

1、pinctrl-0:

Rockchip pinctrl驱动包括Pinctrl驱动( drivers/pinctrl/pinctrl-rockchip.c ) 和 GPIO驱动( drivers/gpio/gpio-rockchip.c )。Pinctrl驱动是主要驱动,提供IO的方法集,包括PINMUX、PINCONF 和 GPIO。GPIO驱动是完成 gpiochip 的功能,包括 GPIO 和 IRQ,通常在 dts 配置中可以看到某个模块中对 pin 引脚的配置,如下所示

pinctrl-0 = <&i2c1m2_xfer>;//i2c pin

注:通常模块调用pinctrl-names pinctrl-0配置默认的IOMUX或者IOCONFIG,但不是所有的节点都可以加这两个属性,如果模块被driver_probe_device调用,它就可以加这两个属性。调试方法: drivers/base/dd.c 的 pinctrl_bind_pins 函数,在这里加打印看调用关系。模块引用pinctrl是通过 pinctrl-names 和 pinctrl-0 连接模块和pinctrl驱动。uart2m1_xfer 是一个pinctrl group;模块可以同时引用多组group,举例 rk3588 pdm1:

{
	pdm1: pdm@fe4c0000 {
		compatible = "rockchip,rk3588-pdm";
		reg = <0x0 0xfe4c0000 0x0 0x1000>;
		clocks = <&cru MCLK_PDM1>, <&cru HCLK_PDM1>;
		clock-names = "pdm_clk", "pdm_hclk";
		assigned-clocks = <&cru MCLK_PDM1>;
		assigned-clock-parents = <&cru PLL_AUPLL>;
		dmas = <&dmac1 4>;
		dma-names = "rx";
		power-domains = <&power RK3588_PD_AUDIO>;
		pinctrl-names = "default";
		pinctrl-0 = <&pdm1m0_clk
		&pdm1m0_clk1
		&pdm1m0_sdi0
		&pdm1m0_sdi1
		&pdm1m0_sdi2
		&pdm1m0_sdi3>;
		/* 等同于如下写法 */
		/*
		*
		pinctrl-0 = <&pdm1m0_clk>,
		* <&pdm1m0_clk1>,
		* <&pdm1m0_sdi0>,
		* <&pdm1m0_sdi1>,
		* <&pdm1m0_sdi2>,
		* <&pdm1m0_sdi3>;
		*/
		#sound-dai-cells = <0>;
		status = "disabled";
	};
};

pinctrl-names 可以支持多个实例,pinctrl 默认的有4种实例(state)。在Documentation/driver-api/pinctl.rst 文档中有相应的描述:


###include/linux/pinctrl/pinctrl-state.h

#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"

“init” 在driver probe期间生效,probe done之后可能会切换回 “default”(如果probe中切换到其他state,就不会切换回 “init”)。pinctrl-names 是可以自定义的,有driver去匹配解析,如下

{
	pwm4: pwm@febd0000 {
		compatible = "rockchip,rk3588-pwm", "rockchip,rk3328-pwm";
		reg = <0x0 0xfebd0000 0x0 0x10>;
		#pwm-cells = <3>;
		pinctrl-names = "active";
		pinctrl-0 = <&pwm4m0_pins>;
		clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
		clock-names = "pwm", "pclk";
		status = "disabled";
	};
};
2、i2c-scl-rising-time-ns&i2c-scl-falling-time-ns 

i2c-rk3x.c 驱动的配置都在 DTS,参考文件Documentation/devicetree/bindings/i2c/i2c-rk3x.txt。

重点说明其中 配置项,i2c-scl-rising-time-ns,i2c-scl-falling-time-ns:

  • clock-frequency: 默认frequency 为100k 可不配置,其它 I2C 频率需要配置,最大可配置频率由 i2c-scl- rising-time-ns 决定;例如配置400k,clock-frequency=<400000>。
  • i2c-scl-rising-time-ns:SCL 上升沿时间由硬件决定,改变上拉电阻可调节该时间,需通过示波器量测,参考 上图;例如测得 SCL 上升沿 365ns,i2c-scl-rising-time-ns=<365>。(默认可以不配置,但必须保证当前的上 升沿时间不能超过所配置频率下的 I2C 标准所定义的最大上升沿时间)
  • i2c-scl-falling-time-ns: SCL 下降沿时间, 一般不变, 等同于 i2c-sda-falling-time-ns
3、power-domains

power-domains 意思是 pm domain framework的关键字,由framework core 负责解析

4、rockchip,camera-module-index

模组编号,不可重复

5、rockchip,camera-module-facing = "front";

设置模组默认为前置摄像头

6、rockchip,camera-module-name = "**";

模组名称

7、rockchip,camera-module-lens-name = "default";

默认模组lens名称

8、port

“port”节点是通用的设备树节点,在设备树中的应用非常广泛,它通常用于描述一些需要从硬件端口读写数据的设备。 在设备树中,“port”节点一般有两个必选的属性:寄存器地址和寄存器宽度。

参考链接

RK3588-Camera:MIPI-CSI调试之通路解析

camera调试:RK3588如何点亮一个sensor?

一、 手机CAMERA的物理结构: ........................................................................................ - 4 - 二、 CAMERA的成像原理: ................................................................................................. - 4 - 三、 CAMERA常见的数据输出格式:.................................................................................. - 5 - 四、 阅读CAMERA的规格书(以TRULY模组OV5647_RAW为例): ........................... - 6 - 五、 CAMERA的硬件原理图及引脚 ..................................................................................... - 7 - 1、 电源部分:.................................................................................................................... - 7 - 2、 SENSOR INPUT部分: ................................................................................................... - 7 - 3、 SENSOR OUTPUT部分: ............................................................................................... - 7 - 4、 I2C部分:SCL,I2C时钟信号线和SDA,I2C数据信号线。 .................................. - 7 - 六、 MTK平台CAMERA驱动架构: .................................................................................. - 8 - 七、 MTK平台CAMERA相关代码文件(以下代码均为MTK6575平台): .................... - 9 - 1、 CAMERASENSOR驱动相关文件 .................................................................................... - 9 - 2、 SENSOR ID 和一些枚举类型的定义 ............................................................................. - 9 - 3、 SENSOR供电 .................................................................................................................. - 9 - 4、 KERNEL SPACE的SENSORLIST,IMGSENSOR模块注册 ............................................... - 9 - 5、 USER SPACE的SENSORLIST,向用户空间提供支持的SENSORLIST ......................... - 10 - 6、 SENSOR 效果调整的接口 ............................................................................................ - 10 - 八、 CAMERA模块驱动、设备与总线结构: ..................................................................... - 11 - A) 驱动的注册: .................................................................................................................. - 11 - B) 设备的注册: .................................................................................................................. - 11 - C) 总线的匹配: .................................................................................................................. - 12 - 九、 CAMERA驱动工作流程: ............................................................................................- 13 - 十、 CAMERA驱动添加、调试流程:.......
### 关于 Camera 驱动的下载、安装与配置 #### 1. **Camera 驱动的获取** 通常情况下,Camera 驱动由硬件厂商提供,或者可以从开源项目中找到对应的实现。对于 Android 平台上的相机驱动开发,主要依赖 Linux 内核中的 V4L2(Video4Linux2)框架来完成设备注册和控制逻辑[^1]。 - 如果目标平台是高通芯片组,则可以在 Qualcomm 提供的 BSP(Board Support Package)中找到相关驱动源码。例如,在 `vendor/qcom/proprietary/mm-camera` 路径下可能包含了针对特定 SoC 的 Camera 配置文件,如 `msm8953_camera.xml` 中定义了传感器的具体参数设置[^2]。 - 对于其他类型的 SOC 或者自研硬件方案,开发者可以根据需求选择合适的 sensor 模型作为参考对象进行移植工作。比如 OV5648 和 GC2145 就是非常常见的两种 CMOS 图像传感器型号[^4]。 #### 2. **Camera 驱动的编译与部署** 在获得完整的 kernel source tree 后,按照标准流程构建整个 system image 即可自动包含所选 sensors 的支持功能: ```bash # 假设已经设置了正确的环境变量 ANDROID_BUILD_TOP cd $ANDROID_BUILD_TOP source build/envsetup.sh lunch <target_product>-<build_variant> make -j$(nproc) ``` 完成后生成的目标镜像会携带预编译好的 module 文件位于 out/target/product/<device_name>/root/lib/modules/ 下面等待后续加载操作执行。 #### 3. **Camera 驱动的初始化与测试** 当新版本固件刷入到终端之后,可以通过以下方式验证其正常运作状态: - 使用 adb shell 登录至远程主机内部后尝试运行 v4l-utils 工具包里的命令行程序查询当前连接的所有 video capture devices 列表以及它们各自的能力描述信息; ```bash adb shell ls /dev/video* v4l2-ctl --list-devices ``` - 结合 ROS framework 实现更高级别的应用层交互演示效果展示实时画面流传输过程[^5]: ```python roslaunch usb_cam usb_cam-test.launch rosrun image_view image_view image:=/usb_cam/image_raw ``` 以上就是关于如何从零开始搭建一套基于 android 系统之上能够成功启动并正常使用外部接入 type cameras 整体思路概述。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值