一、设备驱动篇
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”节点一般有两个必选的属性:寄存器地址和寄存器宽度。
参考链接