at91sam9m10-ek-ddram.gdb
上传用户:jnhtjd
上传日期:2022-07-16
资源大小:403k
文件大小:6k
源码类别:

微处理器开发

开发平台:

C/C++

  1. #------------------------------------------------
  2. # DDRAM initialization script for the AT91SAM9M10
  3. #------------------------------------------------
  4. echo Configuring the master clock...n
  5. # Enable main oscillator
  6. # CKGR_MOR
  7. set *0xFFFFFC20 = 0x00004001
  8. # PMC_SR
  9. while ((*0xFFFFFC68 & 0x1) == 0)
  10. end
  11. echo set pllan
  12. # Set PLLA to 800MHz
  13. # CKGR_PLLAR
  14. set *0xFFFFFC28 = 0x20C73F03
  15. # PMC_SR
  16. while ((*0xFFFFFC68 & 0x2) == 0)
  17. end
  18. while ((*0xFFFFFC68 & 0x8) == 0)
  19. end
  20. echo select prescalern
  21. # Select prescaler
  22. # PMC_MCKR
  23. set *0xFFFFFC30 = 0x00001300
  24. # PMC_SR
  25. while ((*0xFFFFFC68 & 0x8) == 0)
  26. end
  27. echo select master clockn
  28. # Select master clock
  29. # PMC_MCKR
  30. set *0xFFFFFC30 = 0x00001302
  31. # PMC_SR
  32. while ((*0xFFFFFC68 & 0x8) == 0)
  33. end
  34. echo Master clock ok.n
  35. echo Configuring the DDRAM controller...n
  36. echo MICRON DDRAM configurationn
  37. # 0xFFFFE600 DDR2C Base Address
  38. # Enable DDR2 clock x2 in PMC
  39. # AT91C_BASE_PMC, PMC_SCER, AT91C_PMC_DDR
  40. set *0xFFFFFC00 = 0x04
  41. # Configure the DDR controller
  42. # HDDRSDRC2_MDR, AT91C_DDRC2_DBW_16_BITS   |     // 16-bit DDR
  43. #                AT91C_DDRC2_MD_DDR2_SDRAM       // DDR2
  44. set *0xFFFFE620 = 0x16
  45. # Program the DDR Controller
  46. # HDDRSDRC2_CR, AT91C_DDRC2_NC_DDR10_SDR9  |     // 10 column bits (1K)
  47. #               AT91C_DDRC2_NR_14          |     // 14 row bits    (8K)
  48. #               AT91C_DDRC2_CAS_3          |     // CAS Latency 3
  49. #               AT91C_DDRC2_DLL_RESET_DISABLED   // DLL not reset
  50. set *0xFFFFE608 = 0x3D
  51. # assume timings for 7.5ns min clock period
  52. # HDDRSDRC2_T0PR, AT91C_DDRC2_TRAS_6       |     //  6 * 7.5 = 45   ns
  53. #                 AT91C_DDRC2_TRCD_2       |     //  3 * 7.5 = 22.5 ns
  54. #                 AT91C_DDRC2_TWR_2        |     //  2 * 7.5 = 15   ns
  55. #                 AT91C_DDRC2_TRC_8        |     // 10 * 7.5 = 75   ns
  56. #                 AT91C_DDRC2_TRP_2        |     //  3 * 7.5 = 22.5 ns
  57. #                 AT91C_DDRC2_TRRD_1       |     //  2 * 7.5 = 15   ns
  58. #                 AT91C_DDRC2_TWTR_1       |     //  1 clock cycle
  59. #                 AT91C_DDRC2_TMRD_2             //  2 clock cycles
  60. set *0xFFFFE60C = 0x21128226
  61. # pSDDRC->HDDRSDRC2_T1PR = 0x00000008;
  62. # HDDRSDRC2_T1PR, AT91C_DDRC2_TXP_2  |           //  2 * 7.5 = 15 ns
  63. #                 200 << 16          |           // 200 clock cycles, TXSRD: Exit self refresh delay to Read command
  64. #                 27 << 8            |           // 27 * 7.5 = 202 ns TXSNR: Exit self refresh delay to non read command
  65. #                 AT91C_DDRC2_TRFC_14 << 0       // 19 * 7.5 = 142 ns (must be 140 ns for 1Gb DDR)
  66. set *0xFFFFE610 = 0x02C81B0E
  67. # HDDRSDRC2_T2PR, AT91C_DDRC2_TRTP_2   |         //  2 * 7.5 = 15 ns
  68. #                 AT91C_DDRC2_TRPA_2   |         //  2 * 7.5 = 15 ns
  69. #                 AT91C_DDRC2_TXARDS_7 |         //  7 clock cycles
  70. #                 AT91C_DDRC2_TXARD_7            //  2 clock cycles
  71. set *0xFFFFE614 = 0x02020707
  72. # Initialization Step 1 + 2: NOP command -> allow to enable clk
  73. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_NOP_CMD  
  74. set *0xFFFFE600 = 0x1
  75. set *0x70000000 = 0
  76.          
  77. # TODO Initialization Step 3 (must wait 200 us) (6 core cycles per iteration, core is at 396MHz: min 13200 loops)
  78. # for (i = 0; i < 13300; i++) {
  79. #    asm("    nop"  
  80. # }
  81. # NOP command -> allow to enable cke
  82. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_NOP_CMD  
  83. set *0xFFFFE600 = 0x1
  84. set *0x70000000 = 0
  85.             
  86. # wait 400 ns min
  87. # for (i = 0; i < 100; i++) {
  88. #     asm("    nop"  
  89. # }
  90. # Initialization Step 4: Set All Bank Precharge
  91. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_PRCGALL_CMD  
  92. set *0xFFFFE600 = 0x2
  93. set *0x70000000 = 0
  94. # wait 400 ns min
  95. # for (i = 0; i < 100; i++) {
  96. #     asm("    nop"  
  97. # }
  98. # Initialization Step 5: Set EMR operation (EMRS2)
  99. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD  
  100. set *0xFFFFE600 = 0x5
  101. set *0x74000000 = 0x0
  102. # wait 2 cycles min
  103. # for (i = 0; i < 100; i++) {
  104. #     asm("    nop"  
  105. # }
  106. # Initialization Step 6: Set EMR operation (EMRS3)
  107. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD
  108. set *0xFFFFE600 = 0x5
  109. set *0x76000000 = 0x0
  110. # wait 2 cycles min
  111. # for (i = 0; i < 100; i++) {
  112. #     asm("    nop"  
  113. # }
  114. # Initialization Step 7: Set EMR operation (EMRS1)
  115. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD  
  116. set *0xFFFFE600 = 0x5
  117. set *0x72000000 = 0x0
  118. # wait 2 cycles min
  119. # for (i = 0; i < 100; i++) {
  120. #     asm("    nop"  
  121. # }
  122. # Initialization Step 8a: enable DLL reset
  123. # HDDRSDRC2_CR, cr | AT91C_DDRC2_DLL_RESET_ENABLED
  124. set *0xFFFFE608 |= 0xBD
  125.             
  126. # Initialization Step 8b: reset DLL
  127. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_EXT_LMR_CMD
  128. set *0xFFFFE600 = 0x5
  129. set *0x70000000 = 0
  130. # wait 2 cycles min
  131. # for (i = 0; i < 100; i++) {
  132. #     asm("    nop"  
  133. # }
  134. # Initialization Step 9: Set All Bank Precharge
  135. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_PRCGALL_CMD
  136. set *0xFFFFE600 = 0x2
  137. set *0x70000000 = 0
  138. # wait 2 cycles min
  139. # for (i = 0; i < 100; i++) {
  140. #     asm("    nop"  
  141. # }
  142. # Initialization Step 11: Set 1st CBR
  143. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_RFSH_CMD
  144. set *0xFFFFE600 = 0x4
  145. set *0x70000000 = 0
  146. # wait 2 cycles min
  147. # for (i = 0; i < 100; i++) {
  148. #     asm("    nop"  
  149. # }
  150. # Set 2nd CBR
  151. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_RFSH_CMD
  152. set *0xFFFFE600 = 0x4
  153. set *0x70000000 = 0
  154. # wait 2 cycles min
  155. # for (i = 0; i < 100; i++) {
  156. #     asm("    nop"  
  157. # }
  158. # Initialization Step 12: disable DLL reset
  159. # HDDRSDRC2_CR, cr & (~AT91C_DDRC2_DLL_RESET_ENABLED)  
  160. set *0xFFFFE608 = 0x3D
  161. # Initialization Step 13: Set LMR operation
  162. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_LMR_CMD
  163. set *0xFFFFE600 = 0x3
  164. set *0x70000000 = 0
  165.          
  166. # Skip Initialization Step 14 to 17 (not supported by the DDR2 model)
  167. # Initialization Step 18: Set Normal mode
  168. # HDDRSDRC2_MR, AT91C_DDRC2_MODE_NORMAL_CMD
  169. set *0xFFFFE600 = 0x0
  170. set *0x70000000 = 0
  171. # Set Refresh timer
  172. # HDDRSDRC2_RTR, 0x00000520
  173. set *0xFFFFE604 = 0x00000520
  174. # OK now we are ready to work on the DDRSDR
  175. # wait for end of calibration
  176. # for (i = 0; i < 500; i++) {
  177. #     asm("    nop"  
  178. # }
  179. echo DDRAM configuration ok.n