| Samsung S5P/EXYNOS SoC Camera Subsystem (FIMC) |
| ---------------------------------------------- |
| |
| The S5P/Exynos SoC Camera subsystem comprises of multiple sub-devices |
| represented by separate device tree nodes. Currently this includes: FIMC (in |
| the S5P SoCs series known as CAMIF), MIPI CSIS, FIMC-LITE and FIMC-IS (ISP). |
| |
| The sub-subdevices are defined as child nodes of the common 'camera' node which |
| also includes common properties of the whole subsystem not really specific to |
| any single sub-device, like common camera port pins or the CAMCLK clock outputs |
| for external image sensors attached to an SoC. |
| |
| Common 'camera' node |
| -------------------- |
| |
| Required properties: |
| |
| - compatible: must be "samsung,fimc", "simple-bus" |
| - clocks: list of clock specifiers, corresponding to entries in |
| the clock-names property; |
| - clock-names : must contain "sclk_cam0", "sclk_cam1", "pxl_async0", |
| "pxl_async1" entries, matching entries in the clocks property. |
| |
| - #clock-cells: from the common clock bindings (../clock/clock-bindings.txt), |
| must be 1. A clock provider is associated with the 'camera' node and it should |
| be referenced by external sensors that use clocks provided by the SoC on |
| CAM_*_CLKOUT pins. The clock specifier cell stores an index of a clock. |
| The indices are 0, 1 for CAM_A_CLKOUT, CAM_B_CLKOUT clocks respectively. |
| |
| - clock-output-names: from the common clock bindings, should contain names of |
| clocks registered by the camera subsystem corresponding to CAM_A_CLKOUT, |
| CAM_B_CLKOUT output clocks respectively. |
| |
| The pinctrl bindings defined in ../pinctrl/pinctrl-bindings.txt must be used |
| to define a required pinctrl state named "default" and optional pinctrl states: |
| "idle", "active-a", active-b". These optional states can be used to switch the |
| camera port pinmux at runtime. The "idle" state should configure both the camera |
| ports A and B into high impedance state, especially the CAMCLK clock output |
| should be inactive. For the "active-a" state the camera port A must be activated |
| and the port B deactivated and for the state "active-b" it should be the other |
| way around. |
| |
| The 'camera' node must include at least one 'fimc' child node. |
| |
| |
| 'fimc' device nodes |
| ------------------- |
| |
| Required properties: |
| |
| - compatible: "samsung,s5pv210-fimc" for S5PV210, "samsung,exynos4210-fimc" |
| for Exynos4210 and "samsung,exynos4212-fimc" for Exynos4x12 SoCs; |
| - reg: physical base address and length of the registers set for the device; |
| - interrupts: should contain FIMC interrupt; |
| - clocks: list of clock specifiers, must contain an entry for each required |
| entry in clock-names; |
| - clock-names: must contain "fimc", "sclk_fimc" entries. |
| - samsung,pix-limits: an array of maximum supported image sizes in pixels, for |
| details refer to Table 2-1 in the S5PV210 SoC User Manual; The meaning of |
| each cell is as follows: |
| 0 - scaler input horizontal size, |
| 1 - input horizontal size for the scaler bypassed, |
| 2 - REAL_WIDTH without input rotation, |
| 3 - REAL_HEIGHT with input rotation, |
| - samsung,sysreg: a phandle to the SYSREG node. |
| |
| Each FIMC device should have an alias in the aliases node, in the form of |
| fimc<n>, where <n> is an integer specifying the IP block instance. |
| |
| Optional properties: |
| |
| - clock-frequency: maximum FIMC local clock (LCLK) frequency; |
| - samsung,min-pix-sizes: an array specyfing minimum image size in pixels at |
| the FIMC input and output DMA, in the first and second cell respectively. |
| Default value when this property is not present is <16 16>; |
| - samsung,min-pix-alignment: minimum supported image height alignment (first |
| cell) and the horizontal image offset (second cell). The values are in pixels |
| and default to <2 1> when this property is not present; |
| - samsung,mainscaler-ext: a boolean property indicating whether the FIMC IP |
| supports extended image size and has CIEXTEN register; |
| - samsung,rotators: a bitmask specifying whether this IP has the input and |
| the output rotator. Bits 4 and 0 correspond to input and output rotator |
| respectively. If a rotator is present its corresponding bit should be set. |
| Default value when this property is not specified is 0x11. |
| - samsung,cam-if: a bolean property indicating whether the IP block includes |
| the camera input interface. |
| - samsung,isp-wb: this property must be present if the IP block has the ISP |
| writeback input. |
| - samsung,lcd-wb: this property must be present if the IP block has the LCD |
| writeback input. |
| |
| |
| 'parallel-ports' node |
| --------------------- |
| |
| This node should contain child 'port' nodes specifying active parallel video |
| input ports. It includes camera A and camera B inputs. 'reg' property in the |
| port nodes specifies data input - 0, 1 indicates input A, B respectively. |
| |
| Optional properties |
| |
| - samsung,camclk-out (deprecated) : specifies clock output for remote sensor, |
| 0 - CAM_A_CLKOUT, 1 - CAM_B_CLKOUT; |
| |
| Image sensor nodes |
| ------------------ |
| |
| The sensor device nodes should be added to their control bus controller (e.g. |
| I2C0) nodes and linked to a port node in the csis or the parallel-ports node, |
| using the common video interfaces bindings, defined in video-interfaces.txt. |
| |
| Example: |
| |
| aliases { |
| fimc0 = &fimc_0; |
| }; |
| |
| /* Parallel bus IF sensor */ |
| i2c_0: i2c@13860000 { |
| s5k6aa: sensor@3c { |
| compatible = "samsung,s5k6aafx"; |
| reg = <0x3c>; |
| vddio-supply = <...>; |
| |
| clock-frequency = <24000000>; |
| clocks = <&camera 1>; |
| clock-names = "mclk"; |
| |
| port { |
| s5k6aa_ep: endpoint { |
| remote-endpoint = <&fimc0_ep>; |
| bus-width = <8>; |
| hsync-active = <0>; |
| vsync-active = <1>; |
| pclk-sample = <1>; |
| }; |
| }; |
| }; |
| |
| /* MIPI CSI-2 bus IF sensor */ |
| s5c73m3: sensor@0x1a { |
| compatible = "samsung,s5c73m3"; |
| reg = <0x1a>; |
| vddio-supply = <...>; |
| |
| clock-frequency = <24000000>; |
| clocks = <&camera 0>; |
| clock-names = "mclk"; |
| |
| port { |
| s5c73m3_1: endpoint { |
| data-lanes = <1 2 3 4>; |
| remote-endpoint = <&csis0_ep>; |
| }; |
| }; |
| }; |
| }; |
| |
| camera { |
| compatible = "samsung,fimc", "simple-bus"; |
| clocks = <&clock 132>, <&clock 133>, <&clock 351>, |
| <&clock 352>; |
| clock-names = "sclk_cam0", "sclk_cam1", "pxl_async0", |
| "pxl_async1"; |
| #clock-cells = <1>; |
| clock-output-names = "cam_a_clkout", "cam_b_clkout"; |
| pinctrl-names = "default"; |
| pinctrl-0 = <&cam_port_a_clk_active>; |
| #address-cells = <1>; |
| #size-cells = <1>; |
| |
| /* parallel camera ports */ |
| parallel-ports { |
| /* camera A input */ |
| port@0 { |
| reg = <0>; |
| fimc0_ep: endpoint { |
| remote-endpoint = <&s5k6aa_ep>; |
| bus-width = <8>; |
| hsync-active = <0>; |
| vsync-active = <1>; |
| pclk-sample = <1>; |
| }; |
| }; |
| }; |
| |
| fimc_0: fimc@11800000 { |
| compatible = "samsung,exynos4210-fimc"; |
| reg = <0x11800000 0x1000>; |
| interrupts = <0 85 0>; |
| }; |
| |
| csis_0: csis@11880000 { |
| compatible = "samsung,exynos4210-csis"; |
| reg = <0x11880000 0x1000>; |
| interrupts = <0 78 0>; |
| /* camera C input */ |
| port@3 { |
| reg = <3>; |
| csis0_ep: endpoint { |
| remote-endpoint = <&s5c73m3_ep>; |
| data-lanes = <1 2 3 4>; |
| samsung,csis-hs-settle = <12>; |
| }; |
| }; |
| }; |
| }; |
| |
| The MIPI-CSIS device binding is defined in samsung-mipi-csis.txt. |