123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- /*
- * Copyright (c) 2012, Freescale Semiconductor, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * o Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * o Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or
- * other materials provided with the distribution.
- *
- * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include "sdk.h"
- #include "registers/regsccm.h"
- #include "registers/regsccmanalog.h"
- #include "registers/regsiomuxc.h"
- ////////////////////////////////////////////////////////////////////////////////
- // Code
- ////////////////////////////////////////////////////////////////////////////////
- /*!
- * Provide the mipi camera power and reset
- */
- void mipi_cam_power_on(void)
- {
- #if defined(BOARD_EVB)
- board_ioexpander_iomux_config();
- /*reset of camera sensor, pin 27 */
- max7310_set_gpio_output(0, 2, GPIO_LOW_LEVEL);
- hal_delay_us(1000);
- max7310_set_gpio_output(0, 2, GPIO_HIGH_LEVEL);
- /*power supply through pin25 of connector, for cam_pdown, power down and then up */
- max7310_set_gpio_output(0, 0, GPIO_LOW_LEVEL);
- hal_delay_us(1000);
- max7310_set_gpio_output(0, 0, GPIO_HIGH_LEVEL);
- // max7310_set_gpio_output(1, 1, GPIO_HIGH_LEVEL);
- #endif
- #if defined(BOARD_SABRE_AI)
- board_ioexpander_iomux_config();
- /*power supply through pin25 of connector, direct connected to P3V3_DELAY,
- controlled by CPU_PER_RST_B */
- /*reset of camera sensor, together with the reset button */
- max7310_set_gpio_output(0, 2, GPIO_LOW_LEVEL);
- hal_delay_us(1000);
- max7310_set_gpio_output(0, 2, GPIO_HIGH_LEVEL);
- max7310_set_gpio_output(0, 0, GPIO_HIGH_LEVEL);
- #endif
- #if defined(BOARD_SMART_DEVICE)
- /*power supply through pin25 of connector, for cam_pdown */
- gpio_set_gpio(GPIO_PORT6, 9);
- HW_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_WR(
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_HYS_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_PUS_V(100K_OHM_PU) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_PUE_V(PULL) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_PKE_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_ODE_V(DISABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_SPEED_V(100MHZ) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_DSE_V(40_OHM) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_WP_B_SRE_V(SLOW));
- gpio_set_direction(GPIO_PORT6, 9, GPIO_GDIR_OUTPUT);
- gpio_set_level(GPIO_PORT6, 9, GPIO_HIGH_LEVEL);
- /*reset of camera sensor, pin 27 */
- gpio_set_gpio(GPIO_PORT6, 10);
- HW_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_WR(
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_HYS_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_PUS_V(100K_OHM_PU) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_PUE_V(PULL) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_PKE_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_ODE_V(DISABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_SPEED_V(100MHZ) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_DSE_V(40_OHM) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_READY_SRE_V(SLOW));
- gpio_set_direction(GPIO_PORT6, 10, GPIO_GDIR_OUTPUT);
- gpio_set_level(GPIO_PORT6, 10, GPIO_LOW_LEVEL);
- hal_delay_us(1000);
- gpio_set_level(GPIO_PORT6, 10, GPIO_HIGH_LEVEL);
- #endif
- }
- /*!
- * enable mipi backlight
- */
- void mipi_backlight_en(void)
- {
- //configure pin19 of the mipi dsi/csi connector
- #ifdef BOARD_EVB
- //set GPIO1_9 to 0 so clear vbus on board
- gpio_set_direction(GPIO_PORT1, 9, GPIO_GDIR_OUTPUT);
- gpio_set_level(GPIO_PORT1, 9, GPIO_HIGH_LEVEL);
- #endif
- #ifdef BOARD_SABRE_AI
- //default be populated by P3V3_DELAYED
- #endif
- #ifdef BOARD_SMART_DEVICE
- gpio_set_gpio(GPIO_PORT2, 0);
- HW_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_WR(
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_HYS_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_PUS_V(100K_OHM_PU) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_PUE_V(PULL) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_PKE_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_ODE_V(DISABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_SPEED_V(100MHZ) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_DSE_V(40_OHM) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_DATA00_SRE_V(SLOW));
- gpio_set_direction(GPIO_PORT2, 0, GPIO_GDIR_OUTPUT);
- gpio_set_level(GPIO_PORT2, 0, GPIO_HIGH_LEVEL);
- #endif
- }
- /*!
- * reset MIPI display
- */
- void mipi_display_reset(void)
- {
- #ifdef BOARD_EVB
- /*pin29 of mipi connector for the LCD reset*/
- gpio_set_gpio(GPIO_PORT5, 0);
- HW_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_WR(
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_HYS_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_PUS_V(100K_OHM_PU) |
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_PUE_V(PULL) |
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_PKE_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_ODE_V(DISABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_SPEED_V(100MHZ) |
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_DSE_V(40_OHM) |
- BF_IOMUXC_SW_PAD_CTL_PAD_EIM_WAIT_SRE_V(SLOW));
- gpio_set_direction(GPIO_PORT5, 0, GPIO_GDIR_OUTPUT);
- gpio_set_level(GPIO_PORT5, 0, GPIO_LOW_LEVEL);
- hal_delay_us(1000);
- gpio_set_level(GPIO_PORT5, 0, GPIO_HIGH_LEVEL);
- hal_delay_us(1000);
- #endif
- #ifdef BOARD_SABRE_AI
- /*binded with the board reset button*/
- #endif
- #ifdef BOARD_SMART_DEVICE
- /*pin29 of mipi connector for the LCD reset*/
- gpio_set_gpio(GPIO_PORT6, 11);
- HW_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_WR(
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_HYS_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_PUS_V(100K_OHM_PU) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_PUE_V(PULL) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_PKE_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_ODE_V(DISABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_SPEED_V(100MHZ) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_DSE_V(40_OHM) |
- BF_IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B_SRE_V(SLOW));
- gpio_set_direction(GPIO_PORT6, 11, GPIO_GDIR_OUTPUT);
- gpio_set_level(GPIO_PORT6, 11, GPIO_LOW_LEVEL);
- hal_delay_us(1000);
- gpio_set_level(GPIO_PORT6, 11, GPIO_HIGH_LEVEL);
- hal_delay_us(1000);
- #endif
- }
- void mipi_clock_set(void)
- {
- BW_CCM_ANALOG_PFD_480_PFD1_FRAC(0x10);
- }
- void mipi_csi2_clock_set(void)
- {
- //set VIDPLL(PLL5) to 596MHz
- HW_CCM_ANALOG_PLL_VIDEO_WR(BF_CCM_ANALOG_PLL_VIDEO_DIV_SELECT(0) |
- BF_CCM_ANALOG_PLL_VIDEO_ENABLE(1));
- HW_CCM_ANALOG_PLL_VIDEO_NUM_WR(0x00000000);
- HW_CCM_ANALOG_PLL_VIDEO_DENOM_WR(0x00000001);
- while (!HW_CCM_ANALOG_PLL_VIDEO.B.LOCK) ; //waiting for PLL lock
- BF_CLR(CCM_ANALOG_PLL_VIDEO, BYPASS);
- //select CSI0_HSYNC osc_clk 24MHz, CKO1 output drives cko2 clock
- HW_IOMUXC_SW_MUX_CTL_PAD_CSI0_HSYNC_WR(
- BF_IOMUXC_SW_MUX_CTL_PAD_CSI0_HSYNC_SION_V(DISABLED) |
- BF_IOMUXC_SW_MUX_CTL_PAD_CSI0_HSYNC_MUX_MODE_V(ALT3));
- HW_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_WR(
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_HYS_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_PUS_V(100K_OHM_PU) |
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_PUE_V(PULL) |
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_PKE_V(ENABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_ODE_V(DISABLED) |
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_SPEED_V(100MHZ) |
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_DSE_V(40_OHM) |
- BF_IOMUXC_SW_PAD_CTL_PAD_CSI0_HSYNC_SRE_V(SLOW));
- HW_CCM_CCOSR_WR(
- BF_CCM_CCOSR_CLKO1_SEL(0) |
- BF_CCM_CCOSR_CLKO1_DIV(0) |
- BF_CCM_CCOSR_CLKO1_EN(1) |
- BF_CCM_CCOSR_CLKO_SEL(1) | // select cko2 for cko1 output
- BF_CCM_CCOSR_CLKO2_SEL(0xe) | // osc_clk
- BF_CCM_CCOSR_CLKO2_DIV(0) | // div 1
- BF_CCM_CCOSR_CLKO2_EN(1));
- }
- ////////////////////////////////////////////////////////////////////////////////
- // EOF
- ////////////////////////////////////////////////////////////////////////////////
|