//////////////////////////////////////////////////////////////////////////////// //! \brief Prepares the power block for the application. //! //! \return SUCCESS(0) Power block ready. //////////////////////////////////////////////////////////////////////////////// //int PowerPrep( void ) int _start( void ) { int iRtn = SUCCESS; #ifndef mx28 HW_DIGCTL_CTRL_SET(BM_DIGCTL_CTRL_USE_SERIAL_JTAG); #else #define SSP0_PIN_DRIVE_12mA 0x2 // For EMI 200MHz,must enable SSP0 pin drive to 12mA,or the SD boot will fail. HW_PINCTRL_DRIVE8_CLR( BM_PINCTRL_DRIVE8_BANK2_PIN07_MA | BM_PINCTRL_DRIVE8_BANK2_PIN06_MA | BM_PINCTRL_DRIVE8_BANK2_PIN05_MA | BM_PINCTRL_DRIVE8_BANK2_PIN04_MA | BM_PINCTRL_DRIVE8_BANK2_PIN03_MA | BM_PINCTRL_DRIVE8_BANK2_PIN02_MA | BM_PINCTRL_DRIVE8_BANK2_PIN01_MA | BM_PINCTRL_DRIVE8_BANK2_PIN00_MA); HW_PINCTRL_DRIVE9_CLR( BM_PINCTRL_DRIVE9_BANK2_PIN10_MA | BM_PINCTRL_DRIVE9_BANK2_PIN09_MA | BM_PINCTRL_DRIVE9_BANK2_PIN08_MA); HW_PINCTRL_DRIVE8_SET( (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN07_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN06_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN05_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN04_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN03_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN02_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN01_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN00_MA)); HW_PINCTRL_DRIVE9_SET( (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE9_BANK2_PIN10_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE9_BANK2_PIN09_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE9_BANK2_PIN08_MA)); #endif PowerPrep_CPUClock2XTAL(); PowerPrep_ClearAutoRestart(); hw_power_SetPowerClkGate( false ); printf("\r\nPowerPrep start initialize power...\r\n"); HW_POWER_VDDDCTRL.B.LINREG_OFFSET = HW_POWER_LINREG_OFFSET_STEP_BELOW; HW_POWER_VDDACTRL.B.LINREG_OFFSET = HW_POWER_LINREG_OFFSET_STEP_BELOW; HW_POWER_VDDIOCTRL.B.LINREG_OFFSET = HW_POWER_LINREG_OFFSET_STEP_BELOW; // Ready the power block for 5V detection. PowerPrep_Setup5vDetect(); PowerPrep_SetupBattDetect(); // Ensure the power source that turned on the device is sufficient to // power the device. PowerPrep_ConfigurePowerSource(); PowerPrep_EnableOutputRailProtection(); /* 3.3V is necessary to achieve best power supply capability * and best EMI I/O performance. */ ddi_power_SetVddio(3300, 3150); HW_POWER_CTRL_CLR(BM_POWER_CTRL_VDDD_BO_IRQ | BM_POWER_CTRL_VDDA_BO_IRQ | BM_POWER_CTRL_VDDIO_BO_IRQ | BM_POWER_CTRL_VDD5V_DROOP_IRQ | BM_POWER_CTRL_VBUSVALID_IRQ | BM_POWER_CTRL_BATT_BO_IRQ | BM_POWER_CTRL_DCDC4P2_BO_IRQ ); /* If Battery not ready,setup the auto power down if we lost 5V.*/ if (!bBatteryReady) { HW_POWER_5VCTRL_SET(BM_POWER_5VCTRL_PWDN_5VBRNOUT); #if defined(NO_DCDC_BATT_SOURCE) && defined(mx28) /* On i.MX28, a new bit has been added to allow automatic hardware * shutdown if VDD4P2 browns out. If we permanently only have a VDD5V * source, we want to enable this bit. For devices with dead batteries, * we could also temporarily set this bit until the kernel battery * charger sufficiently charges the battery but we won't do this for * now as the latest release kernel versions aren't aware of it * and thus don't handle the proper setting/clearing of this bit. */ HW_POWER_REFCTRL_SET(1<<7); #endif } return iRtn; }
//////////////////////////////////////////////////////////////////////////////// //! \brief Prepares the power block for the application. //! //! \return SUCCESS(0) Power block ready. //////////////////////////////////////////////////////////////////////////////// //int PowerPrep( void ) int _start( void ) { int iRtn = SUCCESS; auart_init(); #ifndef mx28 HW_DIGCTL_CTRL_SET(BM_DIGCTL_CTRL_USE_SERIAL_JTAG); #else #define SSP0_PIN_DRIVE_12mA 0x2 // For EMI 200MHz,must enable SSP0 pin drive to 12mA,or the SD boot will fail. HW_PINCTRL_DRIVE8_CLR( BM_PINCTRL_DRIVE8_BANK2_PIN07_MA | BM_PINCTRL_DRIVE8_BANK2_PIN06_MA | BM_PINCTRL_DRIVE8_BANK2_PIN05_MA | BM_PINCTRL_DRIVE8_BANK2_PIN04_MA | BM_PINCTRL_DRIVE8_BANK2_PIN03_MA | BM_PINCTRL_DRIVE8_BANK2_PIN02_MA | BM_PINCTRL_DRIVE8_BANK2_PIN01_MA | BM_PINCTRL_DRIVE8_BANK2_PIN00_MA); HW_PINCTRL_DRIVE9_CLR( BM_PINCTRL_DRIVE9_BANK2_PIN10_MA | BM_PINCTRL_DRIVE9_BANK2_PIN09_MA | BM_PINCTRL_DRIVE9_BANK2_PIN08_MA); HW_PINCTRL_DRIVE8_SET( (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN07_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN06_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN05_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN04_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN03_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN02_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN01_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE8_BANK2_PIN00_MA)); HW_PINCTRL_DRIVE9_SET( (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE9_BANK2_PIN10_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE9_BANK2_PIN09_MA) | (SSP0_PIN_DRIVE_12mA << BP_PINCTRL_DRIVE9_BANK2_PIN08_MA)); #endif PowerPrep_CPUClock2XTAL(); PowerPrep_ClearAutoRestart(); hw_power_SetPowerClkGate( false ); printf("\r\nPowerPrep start initialize power...\r\n"); HW_POWER_VDDDCTRL.B.LINREG_OFFSET = HW_POWER_LINREG_OFFSET_STEP_BELOW; HW_POWER_VDDACTRL.B.LINREG_OFFSET = HW_POWER_LINREG_OFFSET_STEP_BELOW; HW_POWER_VDDIOCTRL.B.LINREG_OFFSET = HW_POWER_LINREG_OFFSET_STEP_BELOW; // Ready the power block for 5V detection. PowerPrep_Setup5vDetect(); PowerPrep_SetupBattDetect(); // Ensure the power source that turned on the device is sufficient to // power the device. PowerPrep_ConfigurePowerSource(); PowerPrep_EnableOutputRailProtection(); /* 3.3V is necessary to achieve best power supply capability * and best EMI I/O performance. */ ddi_power_SetVddio(3300, 3150); #ifdef mx28 ddi_power_SetVddd(1350, 1200); #endif HW_POWER_CTRL_CLR(BM_POWER_CTRL_VDDD_BO_IRQ | BM_POWER_CTRL_VDDA_BO_IRQ | BM_POWER_CTRL_VDDIO_BO_IRQ | BM_POWER_CTRL_VDD5V_DROOP_IRQ | BM_POWER_CTRL_VBUSVALID_IRQ | BM_POWER_CTRL_BATT_BO_IRQ | BM_POWER_CTRL_DCDC4P2_BO_IRQ ); /* If Battery not ready,setup the auto power down if we lost 5V.*/ if (!bBatteryReady) HW_POWER_5VCTRL_SET(BM_POWER_5VCTRL_PWDN_5VBRNOUT); return iRtn; }