From 57250281004e141dff4662d1abb3f31982ec01ee Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 19 May 2020 13:35:17 +0100 Subject: [PATCH] dtoverlays: Add an overlay for the Sony IMX290 image sensor Adds an overlay to configure the IMX290 image sensor. Signed-off-by: Dave Stevenson --- arch/arm/boot/dts/overlays/Makefile | 1 + arch/arm/boot/dts/overlays/README | 16 ++ arch/arm/boot/dts/overlays/imx290-overlay.dts | 32 ++++ .../boot/dts/overlays/imx290_327-overlay.dtsi | 145 ++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 arch/arm/boot/dts/overlays/imx290-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/imx290_327-overlay.dtsi --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -85,6 +85,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ i2s-gpio28-31.dtbo \ ilitek251x.dtbo \ imx219.dtbo \ + imx290.dtbo \ imx477.dtbo \ iqaudio-codec.dtbo \ iqaudio-dac.dtbo \ --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -1430,6 +1430,22 @@ Load: dtoverlay=imx219 Params: +Name: imx290 +Info: Sony IMX290 camera module. + Uses Unicam 1, which is the standard camera connector on most Pi + variants. NB This currently uses 4 CSI2 data lanes and therefore will + only work on a CM. +Load: dtoverlay=imx290, +Params: 4lane Enable 4 CSI2 lanes. This requires a Compute + Module (1, 3, or 4). + clock-frequency Sets the clock frequency to match that used on + the board. + Modules from Vision Components use 37.125MHz + (the default), whilst those from Innomaker use + 74.25MHz. + mono Denote that the module is a mono sensor. + + Name: imx477 Info: Sony IMX477 camera module. Uses Unicam 1, which is the standard camera connector on most Pi --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx290-overlay.dts @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Definitions for IMX290 camera module on VC I2C bus +/dts-v1/; +/plugin/; + +#include +#include "imx290_327-overlay.dtsi" + +/{ + compatible = "brcm,bcm2835"; + + // Fragment numbers deliberately high to avoid conflicts with the + // included imx290_327 overlay file. + + fragment@101 { + target = <&imx290>; + __overlay__ { + compatible = "sony,imx290"; + }; + }; + + fragment@102 { + target = <&imx290>; + __dormant__ { + compatible = "sony,imx290-mono"; + }; + }; + + __overrides__ { + mono = <0>, "-101+102"; + }; +}; --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx290_327-overlay.dtsi @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Partial definitions for IMX290 or IMX327 camera module on VC I2C bus +// The compatible string should be set in an overlay that then includes this one +/dts-v1/; +/plugin/; + +#include + +/{ + compatible = "brcm,bcm2835"; + + fragment@0 { + target = <&i2c_csi_dsi>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + imx290: imx290@1a { + reg = <0x1a>; + status = "okay"; + + clocks = <&imx290_clk>; + clock-names = "xclk"; + clock-frequency = <37125000>; + + vdda-supply = <&imx290_vdda>; /* 2.8v */ + vdddo-supply = <&imx290_vdddo>; /* 1.8v */ + vddd-supply = <&imx290_vddd>; /* 1.5v */ + + port { + imx290_0: endpoint { + remote-endpoint = <&csi1_ep>; + clock-lanes = <0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <&csi1>; + __overlay__ { + status = "okay"; + + port { + csi1_ep: endpoint { + remote-endpoint = <&imx290_0>; + }; + }; + }; + }; + + fragment@2 { + target = <&i2c0if>; + __overlay__ { + status = "okay"; + }; + }; + + fragment@3 { + target-path="/"; + __overlay__ { + imx290_vdda: fixedregulator@0 { + compatible = "regulator-fixed"; + regulator-name = "imx290_vdda"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + gpio = <&gpio 41 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; + imx290_vdddo: fixedregulator@1 { + compatible = "regulator-fixed"; + regulator-name = "imx290_vdddo"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + imx290_vddd: fixedregulator@2 { + compatible = "regulator-fixed"; + regulator-name = "imx290_vddd"; + regulator-min-microvolt = <1500000>; + regulator-max-microvolt = <1500000>; + }; + + imx290_clk: camera-clk { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <37125000>; + }; + }; + }; + + fragment@4 { + target = <&i2c0mux>; + __overlay__ { + status = "okay"; + }; + }; + + fragment@5 { + target-path="/__overrides__"; + __overlay__ { + cam0-pwdn-ctrl = <&imx290_vdda>,"gpio:0"; + cam0-pwdn = <&imx290_vdda>,"gpio:4"; + }; + }; + + fragment@6 { + target = <&imx290_0>; + __overlay__ { + data-lanes = <1 2>; + link-frequencies = + /bits/ 64 <445500000 297000000>; + }; + }; + + fragment@7 { + target = <&imx290_0>; + __dormant__ { + data-lanes = <1 2 3 4>; + link-frequencies = + /bits/ 64 <222750000 148500000>; + }; + }; + + fragment@8 { + target = <&csi1_ep>; + __overlay__ { + data-lanes = <1 2>; + }; + }; + + fragment@9 { + target = <&csi1_ep>; + __dormant__ { + data-lanes = <1 2 3 4>; + }; + }; + + __overrides__ { + 4lane = <0>, "-6+7-8+9"; + clock-frequency = <&imx290_clk>,"clock-frequency:0", + <&imx290>,"clock-frequency:0"; + }; +};