//########################################################################### // // FILE: F2837xD_Emif.c // // TITLE: F2837xD EMIF Initialization & Support Functions. // //########################################################################### // $TI Release: F2837xD Support Library v3.05.00.00 $ // $Release Date: Tue Jun 26 03:15:23 CDT 2018 $ // $Copyright: // Copyright (C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // 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. // // Neither the name of Texas Instruments Incorporated 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 // OWNER 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. // $ //########################################################################### // // Included Files // #include "F2837xD_device.h" #include "F2837xD_Examples.h" // // Emif1Initialize - This function initializes the EMIF1 to a known state. // void Emif1Initialize(void) { EALLOW; // // Perform a Module soft reset on EMIF // #ifdef CPU1 DevCfgRegs.SOFTPRES1.all = 0x1; __asm (" nop"); DevCfgRegs.SOFTPRES1.all = 0x0; #endif EDIS; } // // Emif2Initialize - This function initializes the EMIF2 to a known state. // void Emif2Initialize(void) { EALLOW; // // Perform a Module soft reset on EMIF // #ifdef CPU1 DevCfgRegs.SOFTPRES1.all = 0x2; __asm (" nop"); DevCfgRegs.SOFTPRES1.all = 0x0; #endif EDIS; } // // ASync_wait_config - Async wait configuration function // void ASync_wait_config(Uint16 inst, Uint16 wait_count, Uint16 wait_polarity) { if (inst == 0) { // // 7:0 Maximum Extended Wait cycles. // Emif1Regs.ASYNC_WCCR.bit.MAX_EXT_WAIT = wait_count; // // 28 Wait Polarity for pad_wait_i[0]. // Emif1Regs.ASYNC_WCCR.bit.WP0 = wait_polarity; } else { // // 7:0 Maximum Extended Wait cycles. // Emif2Regs.ASYNC_WCCR.bit.MAX_EXT_WAIT = wait_count; // // 28 Wait Polarity for pad_wait_i[0]. // Emif2Regs.ASYNC_WCCR.bit.WP0 = wait_polarity; } } // // ASync_cs2_config - Async CS2 Configuration // void ASync_cs2_config(Uint16 inst, Uint16 async_mem_data_width, Uint16 turn_around_time, Uint16 r_hold_time, Uint16 r_strobe_time, Uint16 r_setup, Uint16 w_hold, Uint16 w_strobe, Uint16 w_setup, Uint16 extend_wait, Uint16 strobe_sel) { if (inst == 0) { // // 1:0 Asynchronous Memory Size. // 3:2 Turn Around cycles. // 6:4 Read Strobe Hold cycles. // 12:7 Read Strobe Duration cycles. // 16:13 Read Strobe Setup cycles. // 19:17 Write Strobe Hold cycles. // 25:20 Write Strobe Duration cycles. // 29:26 Write Strobe Setup cycles. // 30 Extend Wait mode. // 31 Select Strobe mode. // Emif1Regs.ASYNC_CS2_CR.bit.ASIZE = async_mem_data_width; Emif1Regs.ASYNC_CS2_CR.bit.TA= turn_around_time; Emif1Regs.ASYNC_CS2_CR.bit.R_HOLD= r_hold_time; Emif1Regs.ASYNC_CS2_CR.bit.R_STROBE = r_strobe_time; Emif1Regs.ASYNC_CS2_CR.bit.R_SETUP = r_setup; Emif1Regs.ASYNC_CS2_CR.bit.W_HOLD = w_hold; Emif1Regs.ASYNC_CS2_CR.bit.W_STROBE = w_strobe; Emif1Regs.ASYNC_CS2_CR.bit.W_SETUP = w_setup; Emif1Regs.ASYNC_CS2_CR.bit.EW = extend_wait; Emif1Regs.ASYNC_CS2_CR.bit.SS = strobe_sel; } else { // // 1:0 Asynchronous Memory Size. // 3:2 Turn Around cycles. // 6:4 Read Strobe Hold cycles. // 12:7 Read Strobe Duration cycles. // 16:13 Read Strobe Setup cycles. // 19:17 Write Strobe Hold cycles. // 25:20 Write Strobe Duration cycles. // 29:26 Write Strobe Setup cycles. // 30 Extend Wait mode. // 31 Select Strobe mode. // Emif2Regs.ASYNC_CS2_CR.bit.ASIZE = async_mem_data_width; Emif2Regs.ASYNC_CS2_CR.bit.TA= turn_around_time; Emif2Regs.ASYNC_CS2_CR.bit.R_HOLD= r_hold_time; Emif2Regs.ASYNC_CS2_CR.bit.R_STROBE = r_strobe_time; Emif2Regs.ASYNC_CS2_CR.bit.R_SETUP = r_setup; Emif2Regs.ASYNC_CS2_CR.bit.W_HOLD = w_hold; Emif2Regs.ASYNC_CS2_CR.bit.W_STROBE = w_strobe; Emif2Regs.ASYNC_CS2_CR.bit.W_SETUP = w_setup; Emif2Regs.ASYNC_CS2_CR.bit.EW = extend_wait; Emif2Regs.ASYNC_CS2_CR.bit.SS = strobe_sel; } } // // ASync_cs3_config - Async CS3 Configuration // void ASync_cs3_config(Uint16 inst, Uint16 async_mem_data_width, Uint16 turn_around_time, Uint16 r_hold_time, Uint16 r_strobe_time, Uint16 r_setup, Uint16 w_hold, Uint16 w_strobe, Uint16 w_setup, Uint16 extend_wait, Uint16 strobe_sel) { // // 1:0 Asynchronous Memory Size. // 3:2 Turn Around cycles. // 6:4 Read Strobe Hold cycles. // 12:7 Read Strobe Duration cycles. // 16:13 Read Strobe Setup cycles. // 19:17 Write Strobe Hold cycles. // 25:20 Write Strobe Duration cycles. // 29:26 Write Strobe Setup cycles. // 30 Extend Wait mode. // 31 Select Strobe mode. // Emif1Regs.ASYNC_CS3_CR.bit.ASIZE = async_mem_data_width; Emif1Regs.ASYNC_CS3_CR.bit.TA= turn_around_time; Emif1Regs.ASYNC_CS3_CR.bit.R_HOLD= r_hold_time; Emif1Regs.ASYNC_CS3_CR.bit.R_STROBE = r_strobe_time; Emif1Regs.ASYNC_CS3_CR.bit.R_SETUP = r_setup; Emif1Regs.ASYNC_CS3_CR.bit.W_HOLD = w_hold; Emif1Regs.ASYNC_CS3_CR.bit.W_STROBE = w_strobe; Emif1Regs.ASYNC_CS3_CR.bit.W_SETUP = w_setup; Emif1Regs.ASYNC_CS3_CR.bit.EW = extend_wait; Emif1Regs.ASYNC_CS3_CR.bit.SS = strobe_sel; } // // ASync_cs4_config - Async CS4 Configuration // void ASync_cs4_config(Uint16 inst, Uint16 async_mem_data_width, Uint16 turn_around_time, Uint16 r_hold_time, Uint16 r_strobe_time, Uint16 r_setup, Uint16 w_hold, Uint16 w_strobe, Uint16 w_setup, Uint16 extend_wait, Uint16 strobe_sel) { // // 1:0 Asynchronous Memory Size. // 3:2 Turn Around cycles. // 6:4 Read Strobe Hold cycles. // 12:7 Read Strobe Duration cycles. // 16:13 Read Strobe Setup cycles. // 19:17 Write Strobe Hold cycles. // 25:20 Write Strobe Duration cycles. // 29:26 Write Strobe Setup cycles. // 30 Extend Wait mode. // 31 Select Strobe mode. // Emif1Regs.ASYNC_CS4_CR.bit.ASIZE = async_mem_data_width; Emif1Regs.ASYNC_CS4_CR.bit.TA= turn_around_time; Emif1Regs.ASYNC_CS4_CR.bit.R_HOLD= r_hold_time; Emif1Regs.ASYNC_CS4_CR.bit.R_STROBE = r_strobe_time; Emif1Regs.ASYNC_CS4_CR.bit.R_SETUP = r_setup; Emif1Regs.ASYNC_CS4_CR.bit.W_HOLD = w_hold; Emif1Regs.ASYNC_CS4_CR.bit.W_STROBE = w_strobe; Emif1Regs.ASYNC_CS4_CR.bit.W_SETUP = w_setup; Emif1Regs.ASYNC_CS4_CR.bit.EW = extend_wait; Emif1Regs.ASYNC_CS4_CR.bit.SS = strobe_sel; } #ifdef CPU1 // // setup_emif1_pinmux_async_16bit - function for EMIF1 GPIO pin setup // void setup_emif1_pinmux_async_16bit(Uint16 cpu_sel) { Uint16 i; for (i=28; i<=52; i++) { if ((i != 42) && (i != 43)) { GPIO_SetupPinMux(i,cpu_sel,2); } } for (i=63; i<=87; i++) { if (i != 84) { GPIO_SetupPinMux(i,cpu_sel,2); } } GPIO_SetupPinMux(88,cpu_sel,3); GPIO_SetupPinMux(89,cpu_sel,3); GPIO_SetupPinMux(90,cpu_sel,3); GPIO_SetupPinMux(91,cpu_sel,3); GPIO_SetupPinMux(92,cpu_sel,3); GPIO_SetupPinMux(93,cpu_sel,3); GPIO_SetupPinMux(94,cpu_sel,2); // //setup async mode and enable pull-ups for Data pins // for (i=69; i<=85; i++) { if (i != 84) { GPIO_SetupPinOptions(i,0,0x31); // GPIO_ASYNC||GPIO_PULLUP } } } // // setup_emif1_pinmux_async_32bit - Setup pinmux for 32bit async // void setup_emif1_pinmux_async_32bit(Uint16 cpu_sel) { Uint16 i; for (i=28; i<=87; i++) { if ((i != 42) && (i != 43) && (i != 84)) { GPIO_SetupPinMux(i,cpu_sel,2); } } GPIO_SetupPinMux(88,cpu_sel,3); GPIO_SetupPinMux(89,cpu_sel,3); GPIO_SetupPinMux(90,cpu_sel,3); GPIO_SetupPinMux(91,cpu_sel,3); GPIO_SetupPinMux(92,cpu_sel,3); GPIO_SetupPinMux(93,cpu_sel,3); GPIO_SetupPinMux(94,cpu_sel,2); // //setup async mode for Data pins // for (i=53; i<=85; i++) { if (i != 84) { GPIO_SetupPinOptions(i,0,0x31); } } } // // setup_emif2_pinmux_async_16bit - function for EMIF1 GPIO pin setup // void setup_emif2_pinmux_async_16bit(Uint16 cpu_sel) { Uint16 i; for (i=96; i<=121; i++) { GPIO_SetupPinMux(i,cpu_sel,3); } for (i=53; i<=68; i++) { GPIO_SetupPinMux(i,cpu_sel,3); } // //setup async mode for Data pins // for (i=53; i<=68; i++) { GPIO_SetupPinOptions(i,0,0x31); } } // // setup_emif1_pinmux_sdram_16bit - Setup pinmux for 16bit SDRAM // void setup_emif1_pinmux_sdram_16bit(Uint16 cpu_sel) { int i; for (i=29; i<=52; i++) { if ((i != 42) && (i != 43)) { GPIO_SetupPinMux(i,cpu_sel,2); } } for (i=69; i<=85; i++) { if (i != 84) { GPIO_SetupPinMux(i,cpu_sel,2); } } for(i=86; i<=93; i++) { GPIO_SetupPinMux(i,cpu_sel,3); } // //configure Data pins for Async mode // for (i = 69; i <= 85; i++) { if (i != 84) { GPIO_SetupPinOptions(i,0,0x31); } } GPIO_SetupPinOptions(88,0,0x31); GPIO_SetupPinOptions(89,0,0x31); GPIO_SetupPinOptions(90,0,0x31); GPIO_SetupPinOptions(91,0,0x31); } // // setup_emif2_pinmux_sdram_16bit - Setup pinmux for 16bit SDRAM // void setup_emif2_pinmux_sdram_16bit(Uint16 cpu_sel) { int i; for (i=53; i<=68; i++) { GPIO_SetupPinMux(i,cpu_sel,3); } for (i=96; i<=121; i++) { GPIO_SetupPinMux(i,cpu_sel,3); } // //configure Data pins for Async mode // for (i = 53; i <= 68; i++) { GPIO_SetupPinOptions(i,0,0x31); } } // // setup_emif1_pinmux_sdram_32bit - Setup pinmux for 32bit SDRAM // void setup_emif1_pinmux_sdram_32bit(Uint16 cpu_sel) { int i; for (i=28; i<=85; i++) { if ((i != 42) && (i != 43) && (i != 84)) { GPIO_SetupPinMux(i,cpu_sel,2); } } for(i=86; i<=93; i++) { GPIO_SetupPinMux(i,cpu_sel,3); } GPIO_SetupPinMux(94,cpu_sel,2); // //configure Data pins for Async mode // for (i = 53; i <= 85; i++) { if (i != 84) { GPIO_SetupPinOptions(i,0,0x31); } } GPIO_SetupPinOptions(88,0,0x31); GPIO_SetupPinOptions(89,0,0x31); GPIO_SetupPinOptions(90,0,0x31); GPIO_SetupPinOptions(91,0,0x31); } #endif // CPU1 // // End of file //