at91sam9m10-ek-ddram.ini
上传用户:xukun0987
上传日期:2022-07-16
资源大小:216k
文件大小:10k
源码类别:

微处理器开发

开发平台:

C/C++

  1. // ----------------------------------------------------------------------------
  2. //         ATMEL Microcontroller Software Support 
  3. // ----------------------------------------------------------------------------
  4. // Copyright (c) 2008, Atmel Corporation
  5. //
  6. // All rights reserved.
  7. //
  8. // Redistribution and use in source and binary forms, with or without
  9. // modification, are permitted provided that the following conditions are met:
  10. //
  11. // - Redistributions of source code must retain the above copyright notice,
  12. // this list of conditions and the disclaimer below.
  13. //
  14. // Atmel's name may not be used to endorse or promote products derived from
  15. // this software without specific prior written permission.
  16. //
  17. // DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18. // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20. // DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21. // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23. // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24. // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25. // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. // ----------------------------------------------------------------------------
  28. //----------------------------------------------------------------------------
  29. //  File Name           : at91sam9m10-ek-ddram.ini
  30. //  Object              : Generic Macro File for KEIL
  31. //----------------------------------------------------------------------------
  32. //----------------------------------------------------------------------------
  33. // _MapRAMAt0()
  34. // Function description: Maps RAM at 0.
  35. //----------------------------------------------------------------------------
  36. DEFINE LONG  hold;
  37. DEFINE LONG tempVal;
  38. FUNC void _MapRAMAt0(){
  39.     printf ("Changing mapping: RAM mapped to 0n");
  40.     // Test and set Remap
  41.     hold = _RDWORD(0x00000000);
  42.     _WDWORD(0x00000000,0xAAAAAAAA);
  43.     if(_RDWORD(0x00000000) != 0xAAAAAAAA)
  44.     {
  45.         _WDWORD(0xFFFFED00,0x03);    // toggle remap bits
  46.     }
  47.     else
  48.     {
  49.         _WDWORD(0x00000000,hold);
  50.     }
  51. }
  52. //----------------------------------------------------------------------------
  53. // _InitRSTC()
  54. // Function description
  55. //   Initializes the RSTC (Reset controller).
  56. //   This makes sense since the default is to not allow user resets, which makes it impossible to
  57. //   apply a second RESET via J-Link
  58. //----------------------------------------------------------------------------
  59. FUNC void _InitRSTC() {
  60.     _WDWORD(0xFFFFFD08,0xA5000001);    // Allow user reset
  61. }
  62. //----------------------------------------------------------------------------
  63. //
  64. //  _PllSetting()
  65. //  Function description
  66. //  Initializes the PMC.
  67. //  1. Enable the Main Oscillator
  68. //  2. Configure PLL
  69. //  3. Switch Master
  70. //----------------------------------------------------------------------------
  71. FUNC void __PllSetting() 
  72. {
  73. //* pPmc->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN ));
  74.     _WDWORD(0xFFFFFC20,0x00004001);
  75.     _sleep_(100);
  76. //*   AT91C_BASE_CKGR->CKGR_PLLAR = (AT91C_CKGR_SRCA | ((96 << 16) & AT91C_CKGR_MULA) | 
  77. //    (AT91C_CKGR_PLLACOUNT | (AT91C_CKGR_OUTA_0 | (9);
  78.     _WDWORD(0xFFFFFC28,0x2060BF09);
  79.     _sleep_(100);
  80.     // Configure PLLB
  81.     _WDWORD(0xFFFFFC2C,0x207C3F0C);
  82.     _sleep_(100);
  83. //*   AT91C_BASE_PMC->PMC_MCKR =  AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2;;
  84.     _WDWORD(0xFFFFFC30,0x00001300);
  85.      _sleep_(100);
  86. }
  87. //----------------------------------------------------------------------------
  88. //      __initDDRAM()
  89. //  Function description
  90. //  Configuring the MICRON DDRAM controller
  91. //----------------------------------------------------------------------------
  92. FUNC void __initDDRAM()
  93. {
  94.     
  95.     printf( "-------------------------------Configuring the DDRAM controller------------n");
  96.     printf( "-------------------------------MICRON DDRAM configuration------------------n");
  97.     // 0xFFFFE600 DDR2C Base Address
  98.     // Enable DDR2 clock x2 in PMC
  99.     // AT91C_BASE_PMC, PMC_SCER, AT91C_PMC_DDR
  100.     
  101.     _WDWORD(0xFFFFFC00,0x04);    
  102.    
  103.     // Configure the DDR controller
  104.     // HDDRSDRC2_MDR, AT91C_DDRC2_DBW_16_BITS   |     // 16-bit DDR
  105.     // AT91C_DDRC2_MD_DDR2_SDRAM       // DDR2
  106.     
  107.     _WDWORD(0xFFFFE620,0x16);
  108.     // Program the DDR Controller
  109.     // HDDRSDRC2_CR, AT91C_DDRC2_NC_DDR10_SDR9  |     // 10 column bits (1K)
  110.     //          AT91C_DDRC2_NR_14          |     // 14 row bits    (8K)
  111.     //          AT91C_DDRC2_CAS_3          |     // CAS Latency 3
  112.     //          AT91C_DDRC2_DLL_RESET_DISABLED   // DLL not reset
  113.     
  114.     _WDWORD(0xFFFFE608,0x3D);
  115.     
  116.     // assume timings for 7.5ns min clock period
  117.     // HDDRSDRC2_T0PR, AT91C_DDRC2_TRAS_6       |     //  6 * 7.5 = 45   ns
  118.     //            AT91C_DDRC2_TRCD_2       |     //  3 * 7.5 = 22.5 ns
  119.     //            AT91C_DDRC2_TWR_2        |     //  2 * 7.5 = 15   ns
  120.     //            AT91C_DDRC2_TRC_8        |     // 10 * 7.5 = 75   ns
  121.     //            AT91C_DDRC2_TRP_2        |     //  3 * 7.5 = 22.5 ns
  122.     //            AT91C_DDRC2_TRRD_1       |     //  2 * 7.5 = 15   ns
  123.     //            AT91C_DDRC2_TWTR_1       |     //  1 clock cycle
  124.     //            AT91C_DDRC2_TMRD_2             //  2 clock cycles
  125.     
  126.     _WDWORD(0xFFFFE60C,0x21128226);
  127.     // pSDDRC->HDDRSDRC2_T1PR = 0x00000008;
  128.     // HDDRSDRC2_T1PR, AT91C_DDRC2_TXP_2  |           //  2 * 7.5 = 15 ns
  129.     //                 200 << 16          |           // 200 clock cycles, TXSRD: Exit self refresh delay to Read command
  130.     //                 27 << 8            |           // 27 * 7.5 = 202 ns TXSNR: Exit self refresh delay to non read command
  131.     //                 AT91C_DDRC2_TRFC_14 << 0       // 19 * 7.5 = 142 ns (must be 140 ns for 1Gb DDR)
  132.     _WDWORD(0xFFFFE610,0x02C81B0E);
  133.     // HDDRSDRC2_T2PR, AT91C_DDRC2_TRTP_2   |         //  2 * 7.5 = 15 ns
  134.     //                 AT91C_DDRC2_TRPA_2   |         //  2 * 7.5 = 15 ns
  135.     //                 AT91C_DDRC2_TXARDS_7 |         //  7 clock cycles
  136.     //                 AT91C_DDRC2_TXARD_7            //  2 clock cycles
  137.     _WDWORD(0xFFFFE614,0x02020707);
  138.     
  139.     // Initialization Step 1 + 2: NOP command -> allow to enable clk
  140.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_NOP_CMD  
  141.     
  142.     _WDWORD(0xFFFFE600,0x1);
  143.     _WDWORD(0x70000000,0x0);
  144.          
  145.     //  Initialization Step 3 (must wait 200 us) (6 core cycles per iteration, core is at 396MHz: min 13200 loops)
  146.     _sleep_(1);
  147.     // NOP command -> allow to enable cke
  148.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_NOP_CMD  
  149.     _WDWORD(0xFFFFE600,0x1);
  150.     _WDWORD(0x70000000,0x0);
  151.             
  152.     // wait 400 ns min
  153.     _sleep_(1);
  154.     
  155.     // Initialization Step 4: Set All Bank Precharge
  156.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_PRCGALL_CMD  
  157.     _WDWORD(0xFFFFE600,0x2);
  158.     _WDWORD(0x70000000,0x0);
  159.     
  160.     // wait 400 ns min
  161.     _sleep_(1);
  162.     // Initialization Step 5: Set EMR operation (EMRS2)
  163.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD  
  164.     
  165.     _WDWORD(0xFFFFE600,0x5);
  166.     _WDWORD(0x70000000,0x0);
  167.     
  168.     // wait 2 cycles min
  169.     _sleep_(1);
  170.     
  171.     // Initialization Step 6: Set EMR operation (EMRS3)
  172.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD
  173.     
  174.     _WDWORD(0xFFFFE600,0x5);
  175.     _WDWORD(0x76000000,0x0);
  176.     
  177.     // wait 2 cycles min
  178.     _sleep_(1);
  179.     
  180.     // Initialization Step 7: Set EMR operation (EMRS1)
  181.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD  
  182.     _WDWORD(0xFFFFE600,0x5);
  183.     _WDWORD(0x72000000,0x0);
  184.     
  185.     // wait 2 cycles min
  186.     _sleep_(1);
  187.     // Initialization Step 8a: enable DLL reset
  188.     // HDDRSDRC2_CR, cr | AT91C_DDRC2_DLL_RESET_ENABLED
  189.     
  190.     tempVal = _RDWORD(0xFFFFE608); 
  191.     tempVal |= 0xBD;
  192.     _WDWORD(0xFFFFE608,0xBD);
  193.     
  194.     // Initialization Step 8b: reset DLL
  195.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD
  196.     
  197.     _WDWORD(0xFFFFE600,0x5);
  198.     _WDWORD(0x70000000,0x0);
  199.     
  200.     // wait 2 cycles min
  201.     _sleep_(1);
  202.     
  203.     // Initialization Step 9: Set All Bank Precharge
  204.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_PRCGALL_CMD
  205.     
  206.     _WDWORD(0xFFFFE600,0x2);
  207.     _WDWORD(0x70000000,0x0);
  208.     
  209.     // wait 2 cycles min
  210.     _sleep_(1);
  211.     // Initialization Step 11: Set 1st CBR
  212.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_RFSH_CMD
  213.     
  214.     _WDWORD(0xFFFFE600,0x4);
  215.     _WDWORD(0x70000000,0x0);
  216.     
  217.     // wait 2 cycles min
  218.     _sleep_(1);
  219.     
  220.     // Set 2nd CBR
  221.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_RFSH_CMD
  222.     
  223.     _WDWORD(0xFFFFE600,0x4);
  224.     _WDWORD(0x70000000,0x0);
  225.     
  226.     // wait 2 cycles min
  227.     _sleep_(1);
  228.     
  229.     // Initialization Step 12: disable DLL reset
  230.     // HDDRSDRC2_CR, cr & (~AT91C_DDRC2_DLL_RESET_ENABLED)  
  231.     
  232.     _WDWORD(0xFFFFE608,0x3D);
  233.     // wait 2 cycles min
  234.     _sleep_(1);
  235.     
  236.     // Initialization Step 13: Set LMR operation
  237.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_LMR_CMD
  238.     
  239.     _WDWORD(0xFFFFE600,0x3);
  240.     _WDWORD(0x70000000,0x0);
  241.     // wait 2 cycles min
  242.     _sleep_(1);
  243.     
  244.          
  245.     // Skip Initialization Step 14 to 17 (not supported by the DDR2 model)
  246.     // Initialization Step 18: Set Normal mode
  247.     // HDDRSDRC2_MR, AT91C_DDRC2_MODE_NORMAL_CMD
  248.     
  249.     _WDWORD(0xFFFFE600,0x0);
  250.     _WDWORD(0x70000000,0x0);
  251.     // wait 2 cycles min
  252.     _sleep_(1);
  253.     
  254.     
  255.     // Set Refresh timer
  256.     // HDDRSDRC2_RTR, 0x00000520
  257.     _WDWORD(0xFFFFE604,0x00000520);
  258.     
  259.     // OK now we are ready to work on the DDRSDR
  260.     // wait for end of calibration
  261.     _sleep_(1);
  262.     printf( "------------------------------- DDRAM configuration done -------------------------------n");
  263. }
  264. __PllSetting();                   //* Init PLL
  265. __initDDRAM();
  266. _MapRAMAt0();                     //* Set the RAM memory at 0x00300000 & 0x0000 0000
  267. _InitRSTC();   
  268. LOAD at91sam9m10-sdram\at91sam9m10-sdram.axf INCREMENTAL
  269. PC = 0x70000000;
  270. g,main