Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers: video: ov7725: add sensor driver for ov7725 #30744

Merged
merged 4 commits into from Jan 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 26 additions & 0 deletions boards/arm/mm_swiftio/mm_swiftio.dts
Expand Up @@ -95,6 +95,21 @@

&lpi2c3 {
status = "okay";

ov7725@21 {
compatible = "ovti,ov7725";
reg = <0x21>;
label = "OV7725";
status = "okay";

reset-gpios = <&gpio2 20 GPIO_ACTIVE_HIGH>;

port {
ov7725_ep_out: endpoint {
remote-endpoint = <&csi_ep_in>;
};
};
};
};

&lpspi3 {
Expand Down Expand Up @@ -155,3 +170,14 @@
status = "okay";
cd-gpios = <&gpio2 28 GPIO_ACTIVE_LOW>;
};

&csi {
status = "okay";
sensor-label = "OV7725";

port {
csi_ep_in: endpoint {
remote-endpoint = <&ov7725_ep_out>;
};
};
};
134 changes: 86 additions & 48 deletions boards/arm/mm_swiftio/pinmux.c
Expand Up @@ -20,30 +20,30 @@ static gpio_pin_config_t enet_gpio_config = {
#if DT_NODE_HAS_STATUS(DT_NODELABEL(usdhc1), okay) && CONFIG_DISK_ACCESS_USDHC1

/*Drive Strength Field: R0(260 Ohm @ 3.3V, 150 Ohm@1.8V, 240 Ohm for DDR)
*Speed Field: medium(100MHz)
*Open Drain Enable Field: Open Drain Disabled
*Pull / Keep Enable Field: Pull/Keeper Enabled
*Pull / Keep Select Field: Pull
*Pull Up / Down Config. Field: 47K Ohm Pull Up
*Hyst. Enable Field: Hysteresis Enabled.
* Speed Field: medium(100MHz)
* Open Drain Enable Field: Open Drain Disabled
* Pull / Keep Enable Field: Pull/Keeper Enabled
* Pull / Keep Select Field: Pull
* Pull Up / Down Config. Field: 47K Ohm Pull Up
* Hyst. Enable Field: Hysteresis Enabled.
*/

static void mm_swiftio_usdhc_pinmux(
uint16_t nusdhc, bool init,
uint32_t speed, uint32_t strength)
{
uint32_t cmd_data = IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) |
IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
lgl88911 marked this conversation as resolved.
Show resolved Hide resolved
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
IOMUXC_SW_PAD_CTL_PAD_HYS_MASK |
IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
IOMUXC_SW_PAD_CTL_PAD_DSE(strength);
IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
IOMUXC_SW_PAD_CTL_PAD_HYS_MASK |
IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
IOMUXC_SW_PAD_CTL_PAD_DSE(strength);
uint32_t clk = IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) |
IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
IOMUXC_SW_PAD_CTL_PAD_HYS_MASK |
IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
IOMUXC_SW_PAD_CTL_PAD_DSE(strength);
IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
IOMUXC_SW_PAD_CTL_PAD_HYS_MASK |
IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
IOMUXC_SW_PAD_CTL_PAD_DSE(strength);

if (nusdhc == 0) {
if (init) {
Expand Down Expand Up @@ -87,17 +87,17 @@ static void mm_swiftio_usdhc_pinmux(
}

IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD,
cmd_data);
cmd_data);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK,
clk);
clk);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0,
cmd_data);
cmd_data);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1,
cmd_data);
cmd_data);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2,
cmd_data);
cmd_data);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3,
cmd_data);
cmd_data);
}
}
#endif
Expand Down Expand Up @@ -150,48 +150,86 @@ static int mm_swiftio_init(const struct device *dev)
#endif

#if DT_NODE_HAS_STATUS(DT_NODELABEL(lpi2c1), okay) && CONFIG_I2C
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 1);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 1);

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL,
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA,
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 1);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 1);

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL,
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA,
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));
#endif

#if DT_NODE_HAS_STATUS(DT_NODELABEL(lpi2c3), okay) && CONFIG_I2C
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL, 1);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA, 1);

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL,
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA,
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));
IOMUXC_SW_PAD_CTL_PAD_PUS(3) |
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));
#endif

#if DT_NODE_HAS_STATUS(DT_NODELABEL(usdhc1), okay) && CONFIG_DISK_ACCESS_USDHC1
mm_swiftio_usdhc_pinmux(0, true, 2, 1);
imxrt_usdhc_pinmux_cb_register(mm_swiftio_usdhc_pinmux);
#endif

#if DT_NODE_HAS_STATUS(DT_NODELABEL(csi), okay) && CONFIG_VIDEO
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_04_CSI_PIXCLK,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_05_CSI_MCLK,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B0_14_CSI_VSYNC,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B0_15_CSI_HSYNC,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_08_CSI_DATA09,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_09_CSI_DATA08,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_10_CSI_DATA07,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_11_CSI_DATA06,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_12_CSI_DATA05,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_13_CSI_DATA04,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_14_CSI_DATA03,
0U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B1_15_CSI_DATA02,
0U);
#endif
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions drivers/video/CMakeLists.txt
Expand Up @@ -7,3 +7,4 @@ zephyr_library_sources(video_common.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_MCUX_CSI video_mcux_csi.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_SW_GENERATOR video_sw_generator.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_MT9M114 mt9m114.c)
zephyr_library_sources_ifdef(CONFIG_VIDEO_OV7725 ov7725.c)
2 changes: 2 additions & 0 deletions drivers/video/Kconfig
Expand Up @@ -37,4 +37,6 @@ source "drivers/video/Kconfig.sw_generator"

source "drivers/video/Kconfig.mt9m114"

source "drivers/video/Kconfig.ov7725"

endif # VIDEO
10 changes: 10 additions & 0 deletions drivers/video/Kconfig.ov7725
@@ -0,0 +1,10 @@
# OV7725

# Copyright (c) 2020 FrankLi Limited
# SPDX-License-Identifier: Apache-2.0

config VIDEO_OV7725
bool "OV7725 CMOS digital image sensor"
depends on I2C
help
Enable driver for OV7725 CMOS digital image sensor device.