This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM1808 DDR2 Size increase

Other Parts Discussed in Thread: AM1808, OMAP-L138

Hi,

 

I am working on AM1808 processor, at present I am running my DDR2 with 64MB, I have another design which I want to increase my DDR to 128MB.

 

What are the changes required to be done at 128MB, Please let us know the steps whether changes at Boot loader or u-boot or in kernel.

 

Thanks

Kumar

  • Francis,

    We strongly recommend that you start a new thread with the issue that you have so that it can be tracked by the engineering teams. I am going to split the thread to start a new thread for you.

    Regards,

    G. Shankari

  • Hi Francis,

    Are you looking for steps to increase RAM size by schematics changes as well? or only firmware?

  • Hi Kumar,

    Thanks for post. Please consider the below points from firmware perspective.

    The changes should be required in all level from Boot loader to kernel.

    When there is a change in DDR2 chip, all the configuration parameters (such as clock timing, control & size ) should be changed in all level of software stack.

    A good way for you to verify your DDR2 timing configurations would be to use the DDR2 timing spreadsheet provided in the wiki link.

    The values generated shall be used to update the User Boot Loader, u-boot and kernel source.

    Please get back to us if you need more information.

  • Hi Rajasekharan,

    Thanks for your response.

    Sorry we are not using DDR2 ours it is mDDR. At present we are running with 64MB mDDR in our design, In that same pitch

    We enhanced our mDDR to 128MB available in the same size and schematics it seems as same. But we have't modified any schematics to 128MB.

    I need your suggestions where I need to change in kernel or before boot loader. Or no changes required in 64MB mDDR and 128MB mDDR case.

    Thanks,

    Francis

  • Hi Rajasekharan,

    I am waiting for your reply.

    Currently we are using in our prototype is mDDR (128 MB) before with 64MB it is working. When I connect JATAG to my AM1808 using CCS

    and run the below RAM test it is failed, please find the below status of my mDDR. 

    ------------------------------------------------------------

                         AM-1808 RAM Test

    Test Description

    ----------------

    this code verifies the mDDR address bus and writes/verifies

    data patterns to the mDDR.

    ------------------------------------------------------------

    Execute Test

    ------------

    --- Test address and data bus ---

    addr/data bus test failed at address: C0000000

    test_data: 00000001

    *test_addr: FFFFFFFE

     

    ********** AM-1808 TEST FAILED **********

    ----------------------------------------------------------------------

    First i am unable to boot my bootstrap & uboot.

    Please give your suggestions, What could be the reason to failed this mDDR.

    Thanks,

    Francis

  • Hi Francis,

    Step 1: 

    From your log I can understand that you are using the BSL package released by the LogicPD to test the RAM. 

    The test_ram.c calls the init functions EVMAM1808_initRAM() & EVMAM1808_init() available in evmam1808.c

    Please verify the initialized values are correct with the selected part example timing etc. Please refer the datasheet of selected 128MB part for correct values.

    Step 2:(ARM UBL or bootstrap)

    If the RAM test are passed then update ARM  UBL source with modified values(as Step 1) and build the binary file.

    Please update the function DEVICE_SDRAMInit() in device.c

    Please update the macro DEVICE_DDR2_RAM_SIZE in device.h

    Step 3: (u-boot & Kernel)

    Likewise you shall update u-boot and kernel init functions as well.

    Note: The names of the files and functions are subject to change from package to package. The main thing is to configure the DDR memory controller registers with correct values. 

    Thanks.

  • Hi Rajasekharan,

    In bootstrap how to modify the values i am not getting the logic. Please find attached file what i am running bootstarp in my existing AM1808.

    Please help me and let us know your suggestions.

    Thanks,

    Francis 

    0336.device.h

    /*
     * TI Booting and Flashing Utilities
     *
     * This file provides low-level init functions for use in the UBL for booting
     * an application.
     *
     * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License as
     * published by the Free Software Foundation version 2.
     *
     * This program is distributed "as is" WITHOUT ANY WARRANTY of any
     * kind, whether express or implied; without even the implied warranty
     * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     */
    
    /* --------------------------------------------------------------------------
      AUTHOR      : Daniel Allred
     --------------------------------------------------------------------------- */
    
    // General type include
    #include "tistdtypes.h"
    
    // This module's header file
    #include "device.h"
    
    // Debug module
    #include "debug.h"
    
    // Utility functions
    #include "util.h"
    
    // TPS65070 functions
    #include "tps65070.h"
    
    #define DEVICE_UART0_FOR_DEBUG
    /************************************************************
    * Explicit External Declarations                            *
    ************************************************************/
    
    
    /************************************************************
    * Local Macro Declarations                                  *
    ************************************************************/
    
    
    /************************************************************
    * Local Typedef Declarations                                *
    ************************************************************/
    
    
    /************************************************************
    * Local Function Declarations                               *
    ************************************************************/
    
    static inline Uint8 LOCAL_getOPP(void);
    
    /************************************************************
    * Local Variable Definitions                                *
    \***********************************************************/
    
    
    /************************************************************
    * Global Variable Definitions                               *
    ************************************************************/
    
    DEVICE_OperatingPoint gDeviceOpPoint;
    
    /************************************************************
    * Global Function Definitions                               *
    ************************************************************/
    Uint32 DEVICE_init(DEVICE_BootMode bootMode)
    {
      Uint32 status = E_PASS;
      Uint8  deviceOPP = 0;
    
      // Unlock kick registers
      SYSTEM->KICKR[0] = 0x83e70b13;  /* Kick0 register + data (unlock) */
      SYSTEM->KICKR[1] = 0x95a4f1e0;  /* Kick1 register + data (unlock) */
    
      SYSTEM->SUSPSRC &= ( (1 << 27) | (1 << 22) | (1 << 20) | (1 << 5) | (1 << 16));
    
    
    #ifndef SKIP_LOW_LEVEL_INIT
      // System PSC Setup
      DEVICE_PSCInit();
    
      deviceOPP = LOCAL_getOPP();
    
      if(DEVICE_OPP_1P3V_456MHZ == deviceOPP) { /* HIGHER OPP */
    
        gDeviceOpPoint.megaHz = 456;
        gDeviceOpPoint.milliVolt = 1300;
        gDeviceOpPoint.opp = deviceOPP;
    
        // Set the higher voltage first OPP(456MHz, 1.31V)
        status  = TPS65070_set_DCDC3_voltage(0, TPS_VDCDC3_MILLIVOLT_1300);
    
        if(status != E_PASS)
        {
          return E_FAIL;
        }
        // System PLL0 Setup
        if (status == E_PASS) status |= DEVICE_PLL0Init(DEVICE_PLL0_MULTIPLIER_456MHz);
    
      }else if(DEVICE_OPP_1P2V_372MHZ == deviceOPP) {
        gDeviceOpPoint.megaHz = 372;
        gDeviceOpPoint.milliVolt = 1200;
        gDeviceOpPoint.opp = deviceOPP;
    
        // Set the higher voltage first OPP(372MHz, 1.2V)
        status  = TPS65070_set_DCDC3_voltage(0, TPS_VDCDC3_MILLIVOLT_1200);
    
        if (status == E_PASS) status |= DEVICE_PLL0Init(DEVICE_PLL0_MULTIPLIER_372MHz);
            
      } else if(DEVICE_OPP_1P3V_408MHZ == deviceOPP) {
    
        gDeviceOpPoint.megaHz = 408;
        gDeviceOpPoint.milliVolt = 1300;
        gDeviceOpPoint.opp = deviceOPP;
    
        // Set the higher voltage first OPP(408MHz, 1.3V)
        status  = TPS65070_set_DCDC3_voltage(0, TPS_VDCDC3_MILLIVOLT_1300);
    
        if(status != E_PASS)
        {
          return E_FAIL;
        }
        // System PLL0 Setup
        if (status == E_PASS) status |= DEVICE_PLL0Init(DEVICE_PLL0_MULTIPLIER_408MHz);
    
      }else if(DEVICE_OPP_1P2V_300MHZ == deviceOPP){
    
        gDeviceOpPoint.megaHz = 300;
        gDeviceOpPoint.milliVolt = 1200;
        gDeviceOpPoint.opp = deviceOPP;
    
        // Set the higher voltage first OPP(300MHz, 1.2V)
        status  = TPS65070_set_DCDC3_voltage(0, TPS_VDCDC3_MILLIVOLT_1200);
    
        if (status == E_PASS) status |= DEVICE_PLL0Init(DEVICE_PLL0_MULTIPLIER);
      }
    
      // System PLL1 Setup
      if (status == E_PASS) status |= DEVICE_PLL1Init(DEVICE_PLL1_MULTIPLIER);
    
      // DDR2 Timing Setup
      if (status == E_PASS) status |= DEVICE_DDRInit();
    
     #if defined(DEVICE_UART0_FOR_DEBUG)
      DEVICE_UARTInit(0);
     #elif defined(DEVICE_UART1_FOR_DEBUG)
      DEVICE_UARTInit(1);
     #elif defined(DEVICE_UART2_FOR_DEBUG)
      DEVICE_UARTInit(2);
     #endif
    #endif
    
    #ifdef UBL_SPI
        if(bootMode == DEVICE_BOOTMODE_SPI0_FLASH) {
            status |= DEVICE_SPI0Init();
        } else if(bootMode == DEVICE_BOOTMODE_SPI1_FLASH) {
            status |= DEVICE_SPI1Init();
        }
    #elif defined(UBL_NAND)
      if (status == E_PASS) status |= DEVICE_NANDInit();
    #elif defined(UBL_NOR)
      if (status == E_PASS) status |= DEVICE_NORInit();
    #endif
    
      return status;
    }
    
    
    void DEVICE_LPSCTransition(Uint8 pscnum, Uint8 module, Uint8 domain, Uint8 state)
    {
      DEVICE_PSCRegs *PSC;
    
      if (pscnum == 0)
        PSC = PSC0;
      else if(pscnum == 1)
        PSC = PSC1;
      else
        return;
    
      // Wait for any outstanding transition to complete
      while ( (PSC->PTSTAT) & (0x00000001 << domain) );
    
      // If we are already in that state, just return
      if (((PSC->MDSTAT[module]) & 0x1F) == state) return;
    
      // Perform transition
      PSC->MDCTL[module] = ((PSC->MDCTL[module]) & (0xFFFFFFE0)) | (state);
      PSC->PTCMD |= (0x00000001 << domain);
    
      // Wait for transition to complete
      while ( (PSC->PTSTAT) & (0x00000001 << domain) );
    
      // Wait and verify the state
      while (((PSC->MDSTAT[module]) & 0x1F) != state);
    }
    
    void DEVICE_PSCInit()
    {
      Uint32 i;
    
      // PSC0, domain 0 init
      while ((PSC0->PTSTAT) & 0x00000001);
    
      for( i = 3 ; i <= 4 ; i++ )
        if((PSC0->MDCTL[i] & 0x1F) != PSC_ENABLE)
          PSC0->MDCTL[i] = (PSC0->MDCTL[i] & 0xFFFFFFE0) | PSC_ENABLE;
    
      if((PSC0->MDCTL[7] & 0x1F) != PSC_ENABLE)
          PSC0->MDCTL[7] = (PSC0->MDCTL[7] & 0xFFFFFFE0) | PSC_ENABLE;
    
      if((PSC0->MDCTL[8] & 0x1F) != PSC_ENABLE)
          PSC0->MDCTL[8] = (PSC0->MDCTL[8] & 0xFFFFFFE0) | PSC_ENABLE;
    
      for( i =  9; i <= 12 ; i++ )
        if((PSC0->MDCTL[i] & 0x1F) != PSC_ENABLE)
          PSC0->MDCTL[i] = (PSC0->MDCTL[i] & 0xFFFFFFE0) | PSC_ENABLE;
    
      // Do Always-On Power Domain Transitions
      PSC0->PTCMD |= 0x00000001;
      while ((PSC0->PTSTAT) & 0x00000001);
    
      // PSC1, domain 1 init
      while ((PSC1->PTSTAT) & 0x00000001);
    
      if((PSC1->MDCTL[3] & 0x1F) != PSC_ENABLE)
          PSC1->MDCTL[3] = (PSC1->MDCTL[3] & 0xFFFFFFE0) | PSC_ENABLE;
    
      if((PSC1->MDCTL[6] & 0x1F) != PSC_ENABLE)
          PSC1->MDCTL[6] = (PSC1->MDCTL[6] & 0xFFFFFFE0) | PSC_ENABLE;
    
      for( i = 12 ; i <= 13 ; i++ )
        if((PSC1->MDCTL[i] & 0x1F) != PSC_ENABLE)
          PSC1->MDCTL[i] = (PSC1->MDCTL[i] & 0xFFFFFFE0) | PSC_ENABLE;
    
      if((PSC1->MDCTL[26] & 0x1F) != PSC_ENABLE)
          PSC1->MDCTL[26] = (PSC1->MDCTL[26] & 0xFFFFFFE0) | PSC_ENABLE;
    
      if((PSC1->MDCTL[31] & 0x1F) != PSC_ENABLE)
          PSC1->MDCTL[31] = (PSC1->MDCTL[31] & 0xFFFFFFE0) | PSC_ENABLE;
    
      // Do Always-On Power Domain Transitions
      PSC1->PTCMD |= 0x00000001;
      while ((PSC1->PTSTAT) & 0x00000001);
    }
    
    void DEVICE_pinmuxControl(Uint32 regOffset, Uint32 mask, Uint32 value)
    {
      SYSTEM->PINMUX[regOffset] &= ~mask;
      SYSTEM->PINMUX[regOffset] |= (mask & value);
    }
    
    static const DEVICE_BootMode bootModes[] = {
        DEVICE_BOOTMODE_I2C0_MASTER,
        DEVICE_BOOTMODE_I2C0_SLAVE,
        DEVICE_BOOTMODE_NOR_EMIFA, DEVICE_BOOTMODE_NOR_EMIFA,
        DEVICE_BOOTMODE_UHPI, DEVICE_BOOTMODE_UHPI,
        DEVICE_BOOTMODE_I2C1_MASTER,
        DEVICE_BOOTMODE_I2C1_SLAVE,
        DEVICE_BOOTMODE_SPI0_EEPROM,
        DEVICE_BOOTMODE_SPI1_EEPROM,
        DEVICE_BOOTMODE_SPI0_FLASH, DEVICE_BOOTMODE_SPI0_FLASH,
        DEVICE_BOOTMODE_SPI1_FLASH, DEVICE_BOOTMODE_SPI1_FLASH,
        DEVICE_BOOTMODE_NAND_EMIFA_8BIT, DEVICE_BOOTMODE_NAND_EMIFA_8BIT,
        DEVICE_BOOTMODE_NAND_EMIFA_16BIT,
        DEVICE_BOOTMODE_NONE,
        DEVICE_BOOTMODE_SPI0_SLAVE,
        DEVICE_BOOTMODE_SPI1_SLAVE,
        DEVICE_BOOTMODE_UART2,
        DEVICE_BOOTMODE_THB,
        DEVICE_BOOTMODE_UART0,
        DEVICE_BOOTMODE_UART1,
        DEVICE_BOOTMODE_ESF, DEVICE_BOOTMODE_ESF,
        DEVICE_BOOTMODE_USB11,
        DEVICE_BOOTMODE_USB20,
        DEVICE_BOOTMODE_MMC,
        DEVICE_BOOTMODE_RMII,
        DEVICE_BOOTMODE_EMU_DEBUG,
        DEVICE_BOOTMODE_NONE,
    };
    
    
    DEVICE_BootMode DEVICE_bootMode( void )
    {
        Uint32 i;
    
        // Read BOOT pins and set bootMode
        // Using a look-up table
        i = SYSTEM->BOOTCFG & 0x1F;
    
        return bootModes[i];
    }
    
    DEVICE_BusWidth DEVICE_emifBusWidth( void )
    {
      if (DEVICE_bootMode() == DEVICE_BOOTMODE_NAND_EMIFA_8BIT)
      {
        return DEVICE_BUSWIDTH_8BIT;
      }
      else if (DEVICE_bootMode() == DEVICE_BOOTMODE_NOR_EMIFA)
      {
        return DEVICE_BUSWIDTH_16BIT;
      }
      else
      {
        return DEVICE_BUSWIDTH_16BIT;
      }
    }
    
    Uint32 DEVICE_NANDInit()
    {
      DEVICE_pinmuxControl(7,0x00FF0FF0,0x00110110);
      DEVICE_pinmuxControl(9,0xFFFFFFFF,0x11111111);
      DEVICE_pinmuxControl(12,0x0FF00000,0x01100000);
    
      return E_PASS;
    
    }
    
    Uint32 DEVICE_NORInit()
    {
      DEVICE_pinmuxControl(5,0xFF000000,0x11000000);
      DEVICE_pinmuxControl(6,0x0F00000F,0x01000001);
      DEVICE_pinmuxControl(7,0x00FF000F,0x00110001);
      DEVICE_pinmuxControl(8,0xFFFFFFFF,0x11111111);
      DEVICE_pinmuxControl(9,0xFFFFFFFF,0x11111111);
      DEVICE_pinmuxControl(10,0xFFFFFFFF,0x11111111);
      DEVICE_pinmuxControl(11,0xFFFFFFFF,0x11111111);
      DEVICE_pinmuxControl(12,0xFFFFFFFF,0x11111111);
    
      return E_PASS;
    }
    
    void DEVICE_disable_DSP(void)
    {
            /* assert DSP local reset */
        PSC0->MDCTL[15] &= ~0x100;
    
        /* Turn off DSP */
        DEVICE_LPSCTransition(0, 15, 1, PSC_SWRSTDISABLE);
    }
    
    
    Uint32 DEVICE_SPI0Init()
    {
    #if defined(DEVICE_UART0_FOR_DEBUG)
      DEVICE_pinmuxControl(3, 0xFF00FFFF, 0x11001111);
      DEVICE_pinmuxControl(4, 0x000000FF, 0x00000011);
    #else
      DEVICE_pinmuxControl(3, 0xFFFFFFFF, 0x11111111);
      DEVICE_pinmuxControl(4, 0x000000FF, 0x00000011);
    #endif
    
      return E_PASS;
    }
    
    Uint32 DEVICE_SPI1Init()
    {
        DEVICE_LPSCTransition(1, 10, 0, PSC_ENABLE);
    #if defined(DEVICE_UART1_FOR_DEBUG)
        DEVICE_pinmuxControl(4, 0x00FFFF00, 0x00111100);
        DEVICE_pinmuxControl(5, 0x00FFFFFF, 0x00111111);
    #elif defined(DEVICE_UART2_FOR_DEBUG)
        DEVICE_pinmuxControl(4, 0xFF00FF00, 0x11001100);
        DEVICE_pinmuxControl(5, 0x00FFFFFF, 0x00111111);
    #else
        DEVICE_pinmuxControl(4, 0xFFFFFF00, 0x11111100);
        DEVICE_pinmuxControl(5, 0x00FFFFFF, 0x00111111);
    #endif
    
        return E_PASS;
    }
    
    Uint32 DEVICE_I2CInit(Uint8 periphNum)
    {
      // Assign the correct register base
      if (periphNum >= I2C_PERIPHERAL_CNT)
      {
        return E_FAIL;
      }
    
      switch (periphNum)
      {
        case 0:
          // No LPSC for I2C0
          DEVICE_pinmuxControl(4,0x0000FF00,0x00002200); // I2C0_SCL, I2C0_SDA
          break;
        case 1:
          DEVICE_LPSCTransition(PSCNUM1, LPSC_I2C1, PD0, PSC_ENABLE);
          DEVICE_pinmuxControl(4,0x00FF0000,0x00440000); // I2C1_SDA, I2C1_SCL
          break;
        default:
          return E_FAIL;
      }
    
      return E_PASS;
    }
    
    
    Uint32 DEVICE_UARTInit(Uint8 periphNum)
    {
      Uint16 divisor = 0 ;
      // Assign the correct register base
      if (periphNum >= UART_PERIPHERAL_CNT)
      {
        return E_FAIL;
      }
    
      divisor = ((gDeviceOpPoint.megaHz * 1000000/2) / (DEVICE_UART0_DESIRED_BAUD*DEVICE_UART0_OVERSAMPLE_CNT));
    
      switch (periphNum)
      {
        case 0:
          DEVICE_LPSCTransition(PSCNUM0, LPSC_UART0, PD0, PSC_ENABLE);
          DEVICE_pinmuxControl(3,0x00FF0000,0x00220000);
          UART0->PWREMU_MGNT |= 0x6000;
          UART0->LCR |= 0x3;
          UART0->DLL = (Uint8) divisor;
          UART0->DLH = (Uint8) (divisor >> 8);
          break;
        case 1:
          DEVICE_LPSCTransition(PSCNUM1, LPSC_UART1, PD0, PSC_ENABLE);
          DEVICE_pinmuxControl(4,0xFF000000,0x22000000);
          UART1->PWREMU_MGNT |= 0x6000;
          UART1->LCR |= 0x3;
          UART1->DLL = (Uint8) divisor;
          UART1->DLH = (Uint8) (divisor >> 8);
          break;
        case 2:
          DEVICE_LPSCTransition(PSCNUM1, LPSC_UART2, PD0, PSC_ENABLE);
          DEVICE_pinmuxControl(4,0x00FF0000,0x00220000);
          UART2->PWREMU_MGNT |= 0x6000;
          UART2->LCR |= 0x3;
          UART2->DLL = (Uint8) divisor;
          UART2->DLH = (Uint8) (divisor >> 8);
          break;
        default:
          return E_FAIL;
      }
    
      return E_PASS;
    }
    
    
    Uint32 DEVICE_getPartNum(void)
    {
            return ((JTAG_ID >> 12) & 0xffff);
    }
    
    Uint16 DEVICE_isDSPBoot(void)
    {
            if ((DEVICE_getPartNum() == DA850_PART_NUM)
                    && (CHIPREV_ID & (1 << 4)))
                return FALSE;
    
            return TRUE;
    }
    
    
    
    Uint32 DEVICE_TIMER0Init()
    {
        return 1;
    }
    
    void DEVICE_TIMER0Start(void)
    {
    }
    
    void DEVICE_TIMER0Stop(void)
    {
    }
    
    Uint32 DEVICE_TIMER0Status(void)
    {
        return 0;
    }
    
    Uint32 DEVICE_PLL0Init(Uint32 PLLMult)
    {
        register unsigned int PLLM, POSTDIV, PLLDIV1, PLLDIV2, PLLDIV3;
        register unsigned int PLLDIV7, CLKMODE, PLL_LOCK_TIME_CNT;
    
        // Parse arguments
        PLLM = PLLMult;
        if (DEVICE_OPP_1P3V_456MHZ == gDeviceOpPoint.opp){
            POSTDIV = 0;
            PLLDIV1 = 0;
            PLLDIV2 = 1;
            PLLDIV3 = 4; // Divide by 5 EMIFA Max is 100MHz
            PLLDIV7 = 5;
        }else if (DEVICE_OPP_1P2V_372MHZ == gDeviceOpPoint.opp) {
            POSTDIV = 1;
            PLLDIV1 = 0;
            PLLDIV2 = 1;
            PLLDIV3 = 3; // Divide by 4 EMIFA Max is 100MHz
            PLLDIV7 = 5;
        }else if (DEVICE_OPP_1P3V_408MHZ == gDeviceOpPoint.opp) {
            POSTDIV = 0;
            PLLDIV1 = 0;
            PLLDIV2 = 1;
            PLLDIV3 = 4; // Divide by 5. EMIFA Max is 100MHz
            PLLDIV7 = 5;
        }else if(DEVICE_OPP_1P2V_300MHZ == gDeviceOpPoint.opp) {
            POSTDIV = 1;
            PLLDIV1 = 0;
            PLLDIV2 = 1;
            PLLDIV3 = 2;
            PLLDIV7 = 5;
        } else {
           /* This should never happen */
           return E_FAIL;
        }
    
        CLKMODE = 0;
        PLL_LOCK_TIME_CNT = 2400;
    
        // Execute
    
        //Unlock PLL registers.
        SYSTEM->CFGCHIP[0] &= ~(0x00000010);
        /* Set PLLENSRC '0',bit 5, PLL Enable(PLLEN) selection is controlled through MMR */
        PLL0->PLLCTL &= ~(0x00000020);
    
        /* PLLCTL.EXTCLKSRC bit 9 should be left at 0 for Freon */
        PLL0->PLLCTL &= ~(0x00000200);
    
        /* Set PLLEN=0 to put in bypass mode*/
        PLL0->PLLCTL &= ~(0x00000001);
    
        // wait for 4 cycles to allow PLLEN mux switches properly to bypass clock
        UTIL_waitLoop (4);
    
        // Select the Clock Mode bit 8 as External Clock or On Chip Oscilator
        PLL0->PLLCTL &= 0xFFFFFEFF;
        PLL0->PLLCTL |= (CLKMODE << 8);
    
        /*Clear PLLRST bit to reset the PLL */
        PLL0->PLLCTL &= ~(0x00000008);
    
        /* Disable the PLL output*/
        PLL0->PLLCTL |= (0x00000010);
    
        /* PLL0 initialization sequence */
    
        /* Power up the PLL- PWRDN bit set to 0 to bring the PLL out of power down bit */
        PLL0->PLLCTL &= ~(0x00000002);
    
        /* Enable the PLL from Disable Mode PLLDIS bit to 0 - This is step is not required for Primus */
        PLL0->PLLCTL &= ~(0x00000010);
    
        /* Program the required multiplier value in PLLM */
        PLL0->PLLM = PLLM;
    
        /* If desired to scale all the SYSCLK frequencies of a given PLLC, program the POSTDIV ratio */
        PLL0->POSTDIV = 0x8000 | POSTDIV;
    
        /* Check for the GOSTAT bit in PLLSTAT to clear to 0 to indicate that no GO operation is currently in progress */
        while (PLL0->PLLSTAT & 0x1 == 1);
    
        /* Program the RATIO field in PLLDIVx with the desired divide factors. In addition, make sure in this step you leave the PLLDIVx.DxEN bits set so clocks are still enabled (default). */
        PLL0->PLLDIV1 = 0x8000 | PLLDIV1;
        PLL0->PLLDIV2 = 0x8000 | PLLDIV2;
        PLL0->PLLDIV4 = 0x8000 | (((PLLDIV1 + 1) * 4) - 1);
        PLL0->PLLDIV6 = 0x8000 | PLLDIV1;
        PLL0->PLLDIV3 = 0x8000 | PLLDIV3;
        PLL0->PLLDIV7 = 0x8000 | PLLDIV7;
    
        /* Set the GOSET bit in PLLCMD to 1 to initiate a new divider transition. */
        PLL0->PLLCMD |= 0x1;
    
        /* Wait for the GOSTAT bit in PLLSTAT to clear to 0 (completion of phase alignment). */
        while (PLL0->PLLSTAT & 0x1 == 1);
    
        /* Set the PLLRST bit in PLLCTL to 1 to bring the PLL out of reset */
        PLL0->PLLCTL |= 0x8;
    
        /* Wait for PLL to lock. See PLL spec for PLL lock time */
        UTIL_waitLoop (PLL_LOCK_TIME_CNT);
    
        /* Set the PLLEN bit in PLLCTL to 1 to remove the PLL from bypass mode */
        PLL0->PLLCTL |= 0x1;
    
        SYSTEM->CFGCHIP[3] &= 0xFFFFFFF8; //clear EMIFA and EMIFB clock source settings, let them run off SYSCLK
    
        return E_PASS;
    }
    
    Uint32 DEVICE_PLL1Init(Uint32 PLLMult)
    {
        register unsigned int PLLM, POSTDIV, PLLDIV1, PLLDIV2, PLLDIV3;
        register unsigned int PLL_LOCK_TIME_CNT, PLL_RESET_TIME_CNT;
    
        // Parse arguments
        PLLM = PLLMult;
        POSTDIV = 1;
        PLLDIV1 = 0;
        PLLDIV2 = 1;
        PLLDIV3 = 2;
    
        PLL_LOCK_TIME_CNT = 2400;
        PLL_RESET_TIME_CNT = 200;
    
        // Execute
    
        /* Set PLLENSRC '0',bit 5, PLL Enable(PLLEN) selection is controlled through MMR */
        PLL1->PLLCTL &= ~(0x00000020);
    
        /* PLLCTL.EXTCLKSRC bit 9 should be left at 0 for Freon */
        PLL1->PLLCTL &= ~(0x00000200);
    
        /* Set PLLEN=0 to put in bypass mode*/
        PLL1->PLLCTL &= ~(0x00000001);
    
        // wait for 4 cycles to allow PLLEN mux switches properly to bypass clock
        UTIL_waitLoop (4);
    
        /*Clear PLLRST bit to reset the PLL */
        PLL1->PLLCTL &= ~(0x00000008);
    
        /* Disable the PLL output*/
        PLL1->PLLCTL |= (0x00000010);
    
        /* PLL1 initialization sequence */
    
        /* Power up the PLL- PWRDN bit set to 0 to bring the PLL out of power down bit */
        PLL1->PLLCTL &= ~(0x00000002);
    
        /* Enable the PLL from Disable Mode PLLDIS bit to 0 - This is step is not required for Primus */
        PLL1->PLLCTL &= ~(0x00000010);
    
        /* Program the required multiplier value in PLLM */
        PLL1->PLLM = PLLM;
    
        /* If desired to scale all the SYSCLK frequencies of a given PLLC, program the POSTDIV ratio */
        PLL1->POSTDIV = 0x8000 | POSTDIV;
    
        /* Check for the GOSTAT bit in PLLSTAT to clear to 0 to indicate that no GO operation is currently in progress */
        while (PLL1->PLLSTAT & 0x1 == 1);
    
        /* Program the RATIO field in PLLDIVx with the desired divide factors. In addition, make sure in this step you leave the PLLDIVx.DxEN bits set so clocks are still enabled (default). */
        PLL1->PLLDIV1 = 0x8000 | PLLDIV1;
        PLL1->PLLDIV2 = 0x8000 | PLLDIV2;
        PLL1->PLLDIV3 = 0x8000 | PLLDIV3;
    
        /* Set the GOSET bit in PLLCMD to 1 to initiate a new divider transition. */
        PLL1->PLLCMD |= 0x1;
    
        /* Wait for the GOSTAT bit in PLLSTAT to clear to 0 (completion of phase alignment). */
        while (PLL1->PLLSTAT & 0x1 == 1);
    
        /*Wait for PLL to reset properly. See PLL spec for PLL reset time - */
        UTIL_waitLoop (PLL_RESET_TIME_CNT);
    
        /* Set the PLLRST bit in PLLCTL to 1 to bring the PLL out of reset */
        PLL1->PLLCTL |= 0x8;
    
        /* Wait for PLL to lock. See PLL spec for PLL lock time */
        UTIL_waitLoop (PLL_LOCK_TIME_CNT);
    
        /* Set the PLLEN bit in PLLCTL to 1 to remove the PLL from bypass mode */
        PLL1->PLLCTL |= 0x1;
    
        return E_PASS;
    }
    
    #define DDR_SLEW        *(volatile unsigned int*) (0x01E2C004)
    #define DDR_SLEW_CMOSEN_BIT 4
    
    /**********************************************************************************
      mDDR Configuration routine:
        1. mDDR Enable
        2. VTP calibration
        3. Configure DDR
        4. Set to self-refresh, enable mclkstop and DDR Sync Reset
        5. Enable DDR and disable self-refresh
    
      int freq is MHz
    
    ***********************************************************************************/
    
    static void DEVICE_mDDRConfig(unsigned int freq)
    {
        DDR_SLEW |= (1 << DDR_SLEW_CMOSEN_BIT);
    
        /*Enable the Clock to EMIF3A SDRAM*/
        DEVICE_LPSCTransition(1, 6, 0, PSC_ENABLE);
    
        /*If VTP claiberation enabled , then skip the VTP calibration*/
        if((*VTPIO_CTL & 0x00000040))
        {
           // Begin VTP Calibration
           *VTPIO_CTL |= (0x00004000);     // Set IOPWRDN bit to enable input buffer powerdown enable mode
           *VTPIO_CTL &= ~(0x00000040);    // Clear POWERDN bit (enable VTP)
    
           // Pulse (low) CLRZ to initiate VTP IO Calibration
           *VTPIO_CTL |= (0x00002000);     // Set CLRZ bit
           *VTPIO_CTL &= ~(0x00002000);    // Clear CLRZ bit (CLRZ should be low for at least 2ns)
           *VTPIO_CTL |= 0x00002000;       // Set CLRZ bit
    
           // Polling READY bit to see when VTP calibration is done
           while(!((*VTPIO_CTL & 0x00008000)>>15)) {}
    
           *VTPIO_CTL |= 0x00000080;       // Set LOCK bit for static mode
           *VTPIO_CTL |= 0x00000100;       // Set PWRSAVE bit to save power
           *VTPIO_CTL |= 0x00000040;       // Set POWERDN bit to power down VTP module
           // End VTP Calibration
        }
    
        DDR->SDCR |= 0x00800000; // Set BOOTUNLOCK
    
        // **********************************************************************************************
        // Setting based on 512Mb mDDR MT46H32M16LFBF-6 on EVM
        // Config DDR timings
        DDR->DDRPHYCR     = (0x0               << 8)   |  // Reserved
                      (0x1               << 7)   |  // EXT_STRBEN
                      (0x1               << 6)   |  // PWRDNEN
                      (0x0               << 3)   |  // Reserved
                      (0x4               << 0);     // RL
    
        DDR->SDCR = (DDR->SDCR & 0xF0000000) |  // Reserved
                      (0x1               << 27)  |  // DDR2TERM1
                      (0x0               << 26)  |  // IBANK_POS
                      (0x1               << 25)  |  // MSDRAMEN
                      (0x0               << 24)  |  // DDRDRIVE1
                      (0x0               << 23)  |  // BOOTUNLOCK
                      (0x0               << 22)  |  // DDR2DDQS
                      (0x0               << 21)  |  // DDR2TERM0
                      (0x0               << 20)  |  // DDR2EN
                      (0x0               << 19)  |  // DDRDLL_DIS
                      (0x0               << 18)  |  // DDRDRIVE0
                      (0x1               << 17)  |  // DDREN
                      (0x1               << 16)  |  // SDRAMEN
                      (0x1               << 15)  |  // TIMUNLOCK
                      (0x1               << 14)  |  // NM
                      (0x0               << 12)  |  // Reserved
                      (0x3               << 9)   |  // CL
                      (0x0               << 7)   |  // Reserved
                      (0x2               << 4)   |  // IBANK
                      (0x0               << 3)   |  // Reserved
                      (0x2               << 0);     // PAGESIZE
    
        // Subtracting 0.5 instead of 1 so that the int is rounded up after truncating a real value
        DDR->SDTIMR = (((unsigned int) ((97.5 * freq / 1000) - 0.5)) << 25) |  // tRFC
                         (((unsigned int) ((18.0 * freq / 1000) - 0.5)) << 22) |  // tRP
                         (((unsigned int) ((18.0 * freq / 1000) - 0.5)) << 19) |  // tRCD
                         (((unsigned int) ((15.0 * freq / 1000) - 0.5)) << 16) |  // tWR
                         (((unsigned int) ((42.0 * freq / 1000) - 0.5)) << 11) |  // tRAS
                         (((unsigned int) ((60.0 * freq / 1000) - 0.5)) << 6)  |  // tRC
                         (((unsigned int) ((12.0 * freq / 1000) - 0.5)) << 3)  |  // tRRD
                         (DDR->SDTIMR & 0x4)                                |  // Reserved
                         (((unsigned int) ((2.0 * freq / 1000) - 0.5))  << 0);    // tWTR
    
        // Subtracting 0.5 instead of 1 so that the int is rounded up after truncating a real value
        // tRASMAX is rounded down so subtracting 1
        // CAS/CL = 3
        DDR->SDTIMR2 = (DDR->SDTIMR2 & 0x80000000)                           |  // Reserved
                         (((unsigned int) ((70000 / 7812.5) - 1))        << 27)  |  // tRASMAX [(70us/7.8125us)-1]
                         (0x0                                            << 25)  |  // tXP
                         (0x0                                            << 23)  |  // tODT (Not supported)
                         (((unsigned int) ((120.0 * freq / 1000) - 0.5)) << 16)  |  // tXSNR
                         ((200 - 1)                                      << 8)   |  // tXSRD (200 Cycles)
                         ((1 - 1)                                        << 5)   |  // tRTP (1 Cycle)
                         (0x0                                            << 0);     // tCKE
    
    
        DDR->SDCR    &= ~0x00008000; // Clear TIMUNLOCK
    
        DDR->SDCR2   = 0x00000000; // IBANK_POS set to 0 so this register does not apply
        DDR->SDRCR   = (0x1                                          << 31)  |  // LPMODEN
                         (0x1                                          << 30)  |  // MCLKSTOPEN
                         (0x0                                          << 24)  |  // Reserved
                         (0x0                                          << 23)  |  // SR_PD
                         (0x0                                          << 16)  |  // Reserved
                         (((unsigned int) ((7.8125 * freq) + 0.5))     << 0);     // RR
    
    
        /*SyncReset the Clock to EMIF3A SDRAM*/
        DEVICE_LPSCTransition(1, 6, 0, PSC_SYNCRESET);
    
        /*Enable the Clock to EMIF3A SDRAM*/
        DEVICE_LPSCTransition(1, 6, 0, PSC_ENABLE);
    
        DDR->SDRCR &= ~0xC0000000;  // disable self-refresh
    }
    
    Uint32 DEVICE_DDRInit()
    {
        DEVICE_mDDRConfig(132);
    
        return E_PASS;
    }
    
    
    /************************************************************
    * Local Function Definitions                                *
    ************************************************************/
    static inline Uint8 LOCAL_getOPP(void)
    {
    #if (DEVICE_CONFIG_OPP == DEVICE_OPP_1P3V_456MHZ)
        /* If this is set then return the OPP define for (456MHz, 1.3V)*/
        return ((Uint8)DEVICE_OPP_1P3V_456MHZ);
    
    #elif (DEVICE_CONFIG_OPP == DEVICE_OPP_1P2V_372MHZ)
        /* If this is set then return the OPP define for (375MHz, 1.2V)*/
        return ((Uint8)DEVICE_OPP_1P2V_372MHZ);
    
    #elif (DEVICE_CONFIG_OPP == DEVICE_OPP_1P2V_300MHZ) 
        /* If this is set then return the OPP define for (300MHz, 1.2V)*/
        return ((Uint8)DEVICE_OPP_1P2V_300MHZ);
    
    #elif (DEVICE_CONFIG_OPP == DEVICE_OPP_1P3V_408MHZ)
        /* If this is set then return the OPP define for (408MHz, 1.3V)*/
        return ((Uint8)DEVICE_OPP_1P3V_408MHZ);
    #else
     #error "Invalid Operating Point defined"
    #endif
    }
    /***********************************************************
    * End file                                                 *
    ***********************************************************/
    
    /* ----- */
    
    

    5554.AM1808.gel

  • Hi Francis,

    Please update the register values in  DEVICE_mDDRConfig() functions device.c or AM1808.gel file.

    A good way for you to verify your DDR2 timing configuration values would be to use the DDR2 timing spreadsheet provided in the wiki link.

    AM1808.gel:

    Update the gel to call the board level init functions in OnTargetConnect( ) function after memory map routines. Please refer the attached gel file for reference.

    6138.OMAPL138_ARM.gel

    Thanks.

  • Dear Rajasekaran ,

     

    We tried with other prototype board, there is a problem in mDDR in the first board. After we tested with other board with JTAG using CCS all the testes are passed.

     

    I am able to load the boot loader (arm-spi-ais.bin & u-boot) using  serial utility. It is successfully erased and flashed with new bootloader.

     

    But when I run my board, It is not showing any booting logs on my tera term console.

     

    Please let us know any suggestions. After I changed registers in device.c, It is not showing any messages on to the console.

     

    Thanks,

    Francis

  •  

    Hi Rajasekharan,

     

    It is problem with my I2C in AM1808. After rectified the I2C, Now I can able to see my booting from bootloader.

     

    Now I struck at the kernel phase. And uImage has booted then struck at the kernel OS.

     

    Please find the log:

    ------------------------------

    Booting with TI UBL

    Device OPP (300MHz, 1.2V)

     

    U-Boot 2012.04.01 (Aug 23 2013 - 05:46:42)

     

    I2C:   ready

    DRAM:  128 MiB

    WARNING: Caches not enabled

    MMC:   davinci: 0

    SF: Detected M25P64 with page size 64 KiB, total 8 MiB

    In:    serial

    Out:   serial

    Err:   serial

    SF: Detected M25P64 with page size 64 KiB, total 8 MiB

    Warning: Invalid MAC address read from SPI flash

    Net:   No ETH PHY detected!!!

    Error: Ethernet init failed!

    Board Net Initialization Failed

    DaVinci-EMAC

    Hit any key to stop autoboot:  0

    reading boot.scr

     

    ** Unable to read "boot.scr" from mmc 0:1 **

    reading uImage

     

    2279944 bytes read

    ## Booting kernel from Legacy Image at c0700000 ...

       Image Name:   Linux-2.6.33-rc4

       Image Type:   ARM Linux Kernel Image (uncompressed)

       Data Size:    2279880 Bytes = 2.2 MiB

       Load Address: c0008000

       Entry Point:  c0008000

       Verifying Checksum ... OK

       Loading Kernel Image ... OK

    OK

     

    Starting kernel ...

     

    Uncompressing Linux... done, booting the kernel.

    ------------------------------

     

    How can I overcome this issue.

     

    Thanks,

    Francis

  • Hi Francis,

    Thanks for the post.

    1. Could you please share the complete boot log & u-boot bootargs? After Uncompressing Linux, there is no message on the above post.

    2. Did you try booting from NFS?

    There are many TI WiKi links available to setup the file system and boot the target using various sources. 

    Please refer Category page OMAPL1 that will have more wiki links on the bottom that may help you solve your issue.

    http://processors.wiki.ti.com/index.php/Category:OMAPL1

    Some of the important links which shall be referred (From main category page) to solve your issue.

    Boot methods and boot arguments:

    http://processors.wiki.ti.com/index.php/Alternate_Boot_Methods_for_OMAP-L137/DA830

    http://processors.wiki.ti.com/index.php/Booting_Linux_kernel_using_U-Boot

  • Hi Rajasekharan,

    Thanks for your reply.

    1). We have previous version board which have 64MB and it is running fine with our SD-Card and u-boot commands.

    2). In this second version board we enhanced the mDDR to 128MB and booting the kernel image & rootfs from SDCARD..

    3). Ubl & u-boot will in to the SPI 8MB flash.

    Changes DONE:

    1). Changed the RAM size from 64MB to 128MB in UBL device.h(#define DEVICE_DDR2_RAM_SIZE (0x04000000u))
    2). Configured RAM size settings 128MB in U-Boot include/config/da850evm.h
    /*
    * Memory Info
    */
    #define CONFIG_SYS_MALLOC_LEN (0x10000 + 1*1024*1024) /* malloc() len */
    #define PHYS_SDRAM_1 DAVINCI_DDR_EMIF_DATA_BASE /* DDR Start */
    //#define PHYS_SDRAM_1_SIZE (64 << 20) /* SDRAM size 64MB */
    #define PHYS_SDRAM_1_SIZE (128 << 20) /* SDRAM size 128MB */
    //#define CONFIG_MAX_RAM_BANK_SIZE (512 << 20) /* max size from SPRS586*/
    #define CONFIG_MAX_RAM_BANK_SIZE (1024 << 20) /* max size from SPRS586*/

    /* memtest start addr */
    #define CONFIG_SYS_MEMTEST_START (PHYS_SDRAM_1 + 0x2000000)

    /* memtest will be run on 16MB */
    //#define CONFIG_SYS_MEMTEST_END (PHYS_SDRAM_1 + 0x2000000 + 16*1024*1024)
    #define CONFIG_SYS_MEMTEST_END (PHYS_SDRAM_1 + 0x4000000 + 16*1024*1024) /* high 64MB test */

    #define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
    #define CONFIG_STACKSIZE (256*1024) /* regular stack */

    3). Changed in Linux kernel : /arm/arc/mach-davinci/include/sram.h

    #define SRAM_VIRT 0xf9000000
    #define SRAM_SIZE 7*1024 + 512
    #define SRAM_GRANULARITY 512

    4). already changed our board version: Linux kernel : /arm/arc/mach-davinci/da850.c

    /* Contents of JTAG ID register used to identify exact cpu type */
    static struct davinci_id da850_ids[] = {
    {
    .variant = 0x0,
    .part_no = 0xb7d1,
    .manufacturer = 0x017, /* 0x02f >> 1 */
    .cpu_id = DAVINCI_CPU_ID_DA850,
    .name = "da850/omap-l138",
    },
    {
    .variant = 0x1,

    .part_no = 0xb7d1,
    .manufacturer = 0x017, /* 0x02f >> 1 */
    .cpu_id = DAVINCI_CPU_ID_DA850,
    .name = "da850/omap-l138/am18xx",
    },
    };

    5). After converted arm-spi-ais.bin & u-boot.bin flashed in to to SPI using spi flash tool.

    6). Changed in Linux kernel : /arm/arc/mach-davinci/include/sram.h

    After booting from my board using sdcard it struck at the below stage:

    ----------------------------------------------------------------------------------------------------

    Booting with TI UBL
    Device OPP (300MHz, 1.2V)

    U-Boot 2012.04.01 (Aug 23 2013 - 05:46:42)

    I2C: ready
    DRAM: 128 MiB
    WARNING: Caches not enabled
    MMC: davinci: 0
    SF: Detected M25P64 with page size 64 KiB, total 8 MiB
    In: serial
    Out: serial
    Err: serial
    SF: Detected M25P64 with page size 64 KiB, total 8 MiB
    Warning: Invalid MAC address read from SPI flash
    Net: No ETH PHY detected!!!
    Error: Ethernet init failed!
    Board Net Initialization Failed
    DaVinci-EMAC
    Hit any key to stop autoboot: 0
    reading boot.scr

    ** Unable to read "boot.scr" from mmc 0:1 **
    reading uImage

    2279944 bytes read
    ## Booting kernel from Legacy Image at c0700000 ...
    Image Name: Linux-2.6.33-rc4
    Image Type: ARM Linux Kernel Image (uncompressed)
    Data Size: 2279880 Bytes = 2.2 MiB
    Load Address: c0008000
    Entry Point: c0008000
    Verifying Checksum ... OK
    Loading Kernel Image ... OK
    OK

    Starting kernel ...

    Uncompressing Linux... done, booting the kernel.
    --------------------------------------------------------------------

    Uboot args defined in u-boot itself: once it boots it directly taking the uImage from 4GB micro-SDCARD 

    -------------------------------------------------

    /*
    * Linux Information
    */
    #define LINUX_BOOT_PARAM_ADDR (PHYS_SDRAM_1 + 0x100)
    #define CONFIG_HWCONFIG /* enable hwconfig */
    #define CONFIG_CMDLINE_TAG
    #define CONFIG_REVISION_TAG
    #define CONFIG_SETUP_MEMORY_TAGS
    #define CONFIG_BOOTARGS "mem=32M console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait ip=off"
    #define CONFIG_BOOTCOMMAND "if mmc rescan 0; then if fatload mmc 0 0xc0600000 boot.scr; then source 0xc0600000; else fatload mmc 0 0xc0700000 uImage; bootm c0700000; fi; else sf probe 0; sf read 0xc0700000 0x80000 0x220000; bootm 0xc0700000; fi"
    #define CONFIG_BOOTDELAY 3
    #define CONFIG_EXTRA_ENV_SETTINGS "hwconfig=dsp:wake=yes"

    -------------------------------------------------

    even i have given these args: 

    # setenv bootargs 'init=/init console=ttyS2,115200n8 noinitrd root=/dev/mmcblk0p2 rw rootwait=3 ip=off rootfstype=ext2, nolock mem=32M'

    # setenv bootcmd 'if mmc rescan 0; then if fatload mmc 0 0xc0600000 boot.scr; then source 0xc0600000; else fatload mmc 0 0xc0700000 uImage; bootm c0700000; fi; else sf probe 0; sf read 0xc0700000 0x80000 0x220000; bootm 0xc0700000; fi'

    Please let us know with your suggestions. 

    Thanks,
    Francis

  • Hi Rajasekharan,

     

    Please find the my bootargs printenv commands. Still I struck at the “Uncompressing Linux... done, booting the kernel.”

     

    -------------------------------------------------------------------------------------------

    Booting with TI UBL

    Device OPP (300MHz, 1.2V)SD/MMC Boot failed.

    U-Boot 2012.04.01 (Jan 22 2013 - 17:38:47)


    I2C:   ready

    DRAM:  128 MiB

    WARNING: Caches not enabled

    MMC:   davinci: 0

    SF: Detected M25P64 with page size 64 KiB, total 8 MiB

    In:    serial

    Out:   serial

    Err:   serial

    SF: Detected M25P64 with page size 64 KiB, total 8 MiB

    Warning: Invalid MAC address read from SPI flash

    Net:   No ETH PHY detected!!!

    Error: Ethernet init failed!

    Board Net Initialization Failed

    DaVinci-EMAC

    Hit any key to stop autoboot:  0

    U-Boot >

    U-Boot >

    U-Boot >

    U-Boot >

    U-Boot > printenv

    baudrate=115200

    bootargs=init=/init console=ttyS2,115200n8 ip=off rw root=/dev/mmcblk0p2 rootwait nolock mem=128M androidboot.console=ttyS2

    bootcmd=if mmc rescan 0; then if fatload mmc 0 0xc0600000 boot.scr; then source 0xc0600000; else fatload mmc 0 0xc0700000 uImage; bootm c0700000; fi; else sf probe 0; sf read 0xc0700000 0x80000 0x220000; bootm 0xc0700000; fi

    bootdelay=3

    bootfile=uImage

    ethact=DaVinci-EMAC

    hwconfig=dsp:wake=yes

    stderr=serial

    stdin=serial

    stdout=serial

    ver=U-Boot 2012.04.01 (Jan 22 2013 - 17:38:47)

    Environment size: 546/65532 bytes

    U-Boot >

    U-Boot >

    U-Boot >

    U-Boot > boot

    reading boot.scr

     

    ** Unable to read "boot.scr" from mmc 0:1 **

    reading uImage

    2279584 bytes read

    ## Booting kernel from Legacy Image at c0700000 ...

       Image Name:   Linux-2.6.33-rc4

       Image Type:   ARM Linux Kernel Image (uncompressed)

       Data Size:    2279520 Bytes = 2.2 MiB

       Load Address: c6008000

       Entry Point:  c6008000

       Verifying Checksum ... OK

       Loading Kernel Image ... OK

    OK

     

    Starting kernel ...

     

    Uncompressing Linux... done, booting the kernel.

    -------------------------------------------------------------------------------------------

    Still any settings required for mDDR 128MB. As I think the Ram is up, that’s why it is booting UBL & U-Boot.

     

    Please give your suggestions.

     

    Thanks,

    Francis

  • Hi Francis,

    I have few suggestions.

    1. Boot Linux using old uImage which is built for 64MB DDR (old board uImage).

    2. Boot using Network File System.

    3. Check whether kernel debug messages are enabled in .config file.

    Please refer wiki link also which may help you.

    http://processors.wiki.ti.com/index.php/GSG:_OMAP-L138_DVEVM_Additional_Procedures

    It is very difficult to suggest/comment without any  kernel messages on the console.

    Thanks.