![Jetson TX2 设备树、i2c 节点和相机驱动程序加载](https://linux22.com/image/158109/Jetson%20TX2%20%E8%AE%BE%E5%A4%87%E6%A0%91%E3%80%81i2c%20%E8%8A%82%E7%82%B9%E5%92%8C%E7%9B%B8%E6%9C%BA%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%8A%A0%E8%BD%BD.png)
在加载相机驱动程序时,我对 Jetson TX2 的行为有点困惑。
以下是设备树中 IMX274 的定义:
i2c@3180000 {
reg = <0x0 0x3180000 0x0 0x100>;
dmas = <0x19 0x17 0x19 0x17>;
interrupts = <0x0 0x1b 0x4>;
compatible = "nvidia,tegra186-i2c";
clock-names = "div-clk", "parent", "slow-clk";
reset-names = "i2c";
clock-frequency = <0x61a80>;
scl-gpio = <0x12 0x72 0x0>;
sda-gpio = <0x12 0x73 0x0>;
clocks = <0xd 0x4b 0xd 0x10d 0xd 0x5c>;
resets = <0xd 0x15>;
status = "okay";
#address-cells = <0x1>;
phandle = <0x7c>;
#stream-id-cells = <0x1>;
#size-cells = <0x0>;
dma-names = "rx", "tx";
linux,phandle = <0x7c>;
imx274_a@1a {
reg = <0x1a>;
mclk = "extperiph1";
devnode = "video0";
avdd-reg = "vana";
compatible = "nvidia,imx274";
clock-names = "extperiph1", "pllp_grtba";
reset-gpios = <0x12 0x8d 0x0>;
physical_h = "2.738";
physical_w = "3.674";
clocks = <0xd 0x59 0xd 0x10d>;
vana-supply = <0x1a>;
sensor_model = "imx274";
iovdd-reg = "vif";
delayed_gain = "true";
vif-supply = <0x1a>;
dvdd-reg = "vdig";
vdig-supply = <0x1a>;
mode0 {
...
}
ports {
#address-cells = <0x1>;
#size-cells = <0x0>;
port@0 {
reg = <0x0>;
endpoint {
bus-width = <0x4>;
remote-endpoint = <0x1d>;
phandle = <0x94>;
csi-port = <0x0>;
linux,phandle = <0x94>;
};
};
};
};
i2c2 是 i2c@3180000 的别名,因此我希望在总线 2 上看到该设备。当然我可以在地址为 的总线上看到它0x57
。
nvidia@tegra-ubuntu:~/kernel/kernel$ sudo i2cdetect -r -y 2
[sudo] password for nvidia:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
20: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
第一个问题来了。内核如何识别总线上 i2c 设备的类型?我认为该字段reg
已被使用,但设备树中的 0x1a 与总线上的 0x57 明显不同。
其次,正如我所看到的,模块与以下驱动程序兼容:compatible = "nvidia,imx274";
但是设备驱动程序不同:
nvidia@tegra-ubuntu:~/kernel/kernel$ sudo v4l2-ctl -D -d /dev/video0
Driver Info (not using libv4l2):
Driver name : tegra-video
Card type : vi-output, imx274 2-001a
Bus info : platform:15700000.vi:0
Driver version: 4.4.38
Capabilities : 0x84200001
Video Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
因此,在我看来,由于某些原因加载了错误的驱动程序,这是真的还是我只是错过了一些东西?然而,仍然可以使用 argus 捕获图像。
答案1
一些随机答案:
dts文件中的reg = �是i2c总线上外设的地址,而不是类型。因为该地址是由驱动程序注册的,所以它不会被 i2c-detect 探测到,因此 i2c-detect 的输出中地址 1a 处会出现“UU”。输出中的“57”是另一个外围设备。
在 nvidia TX2 v4l2 世界中,/dev/video0 指的是连接到传感器所连接的 CSI 的 VI 驱动程序。 “v4l2-ctl -D”输出中的“imx274 2-001a”告诉您该VI连接到位于第二(任意linux内核排序)i2c总线上的imx274,地址为0x1a。