dram_init.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: dram_init.S,v 1.10 2001/10/04 12:00:21 martinnn Exp $
  2.  * 
  3.  * DRAM/SDRAM initialization - alter with care
  4.  * This file is intended to be included from other assembler files
  5.  *
  6.  * Note: This file may not modify r9 because r9 is used to carry
  7.  *       information from the decompresser to the kernel
  8.  *
  9.  * Copyright (C) 2000, 2001 Axis Communications AB
  10.  *
  11.  * Authors:  Mikael Starvik (starvik@axis.com)
  12.  * 
  13.  * $Log: dram_init.S,v $
  14.  * Revision 1.10  2001/10/04 12:00:21  martinnn
  15.  * Added missing underscores.
  16.  *
  17.  * Revision 1.9  2001/10/01 14:47:35  bjornw
  18.  * Added register prefixes and removed underscores
  19.  *
  20.  * Revision 1.8  2001/05/15 07:12:45  hp
  21.  * Copy warning from head.S about r8 and r9
  22.  *
  23.  * Revision 1.7  2001/04/18 12:05:39  bjornw
  24.  * Fixed comments, and explicitely include config.h to be sure its there
  25.  *
  26.  * Revision 1.6  2001/04/10 06:20:16  starvik
  27.  * Delay should be 200us, not 200ns
  28.  *
  29.  * Revision 1.5  2001/04/09 06:01:13  starvik
  30.  * Added support for 100 MHz SDRAMs
  31.  *
  32.  * Revision 1.4  2001/03/26 14:24:01  bjornw
  33.  * Namechange of some config options
  34.  *
  35.  * Revision 1.3  2001/03/23 08:29:41  starvik
  36.  * Corrected calculation of mrs_data
  37.  *
  38.  * Revision 1.2  2001/02/08 15:20:00  starvik
  39.  * Corrected SDRAM initialization
  40.  * Should now be included as inline
  41.  *
  42.  * Revision 1.1  2001/01/29 13:08:02  starvik
  43.  * Initial version
  44.  * This file should be included from all assembler files that needs to
  45.  * initialize DRAM/SDRAM.
  46.  *
  47.  */
  48. /* Just to be certain the config file is included, we include it here
  49.  * explicitely instead of depending on it being included in the file that
  50.  * uses this code.
  51.  */
  52. #include <linux/config.h>
  53. ;; WARNING! The registers r8 and r9 are used as parameters carrying
  54. ;; information from the decompressor (if the kernel was compressed). 
  55. ;; They should not be used in the code below.
  56. #ifndef CONFIG_SVINTO_SIM
  57. move.d   CONFIG_ETRAX_DEF_R_WAITSTATES, $r0
  58. move.d   $r0, [R_WAITSTATES]
  59. move.d   CONFIG_ETRAX_DEF_R_BUS_CONFIG, $r0
  60. move.d   $r0, [R_BUS_CONFIG]
  61. #ifndef CONFIG_ETRAX_SDRAM
  62. move.d   CONFIG_ETRAX_DEF_R_DRAM_CONFIG, $r0
  63. move.d   $r0, [R_DRAM_CONFIG]
  64. move.d   CONFIG_ETRAX_DEF_R_DRAM_TIMING, $r0
  65. move.d   $r0, [R_DRAM_TIMING]
  66. #else
  67. ; Refer to ETRAX 100LX Designers Reference for a description of SDRAM initialization
  68. ; Bank configuration
  69. move.d   CONFIG_ETRAX_DEF_R_SDRAM_CONFIG, $r0
  70. move.d   $r0, [R_SDRAM_CONFIG]
  71. ; Calculate value of mrs_data 
  72. ; CAS latency = 2 && bus_width = 32 => 0x40
  73. ; CAS latency = 3 && bus_width = 32 => 0x60
  74. ; CAS latency = 2 && bus_width = 16 => 0x20
  75. ; CAS latency = 3 && bus_width = 16 => 0x30
  76. move.d   0x40, $r2       ; Assume 32 bits and CAS latency = 2
  77. move.d   CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r1
  78. move.d   $r1, $r3
  79.   and.d    0x03, $r1       ; Get CAS latency
  80. and.d    0x1000, $r3     ; 50 or 100 MHz?
  81. beq      _speed_50
  82. nop
  83. _speed_100:
  84. cmp.d    0x00, $r1 ; CAS latency = 2?
  85. beq      _bw_check
  86. nop
  87. or.d     0x20, $r2 ; CAS latency = 3 
  88. ba       _bw_check
  89. nop
  90. _speed_50:
  91. cmp.d    0x01, $r1 ; CAS latency = 2?
  92. beq      _bw_check
  93. nop
  94. or.d     0x20, $r2       ; CAS latency = 3
  95. _bw_check:
  96. move.d   CONFIG_ETRAX_DEF_R_SDRAM_CONFIG, $r1
  97. and.d    0x800000, $r1 ; DRAM width is bit 23
  98. bne      _set_timing
  99. nop
  100. lsrq     1, $r2 ;  16 bits. Shift down value.
  101. ; Set timing parameters. Starts master clock
  102. _set_timing:
  103. move.d   CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r1
  104. and.d    0x8000f9ff, $r1 ; Make sure mrs data and command is 0 
  105. or.d     0x80000000, $r1 ; Make sure sdram enable bit is set
  106. move.d   $r1, $r5
  107. or.d     0x0000c000, $r1 ; ref = disable
  108. lslq     16, $r2 ; mrs data starts at bit 16
  109. or.d     $r2, $r1 
  110. move.d   $r1, [R_SDRAM_TIMING]
  111. ; Wait 200us
  112. move.d   10000, $r2
  113. 1: bne      1b
  114. subq     1, $r2
  115. ; Issue initialization command sequence
  116. move.d   _sdram_commands_start, $r2
  117. move.d   _sdram_commands_end,  $r3
  118. 1: clear.d  $r4
  119. move.b   [$r2+], $r4
  120. lslq     9, $r4 ; Command starts at bit 9
  121. or.d     $r1, $r4
  122. move.d   $r4, [R_SDRAM_TIMING]
  123. nop ; Wait five nop cycles between each command
  124. nop
  125. nop
  126. nop
  127. nop
  128. cmp.d    $r2, $r3
  129. bne      1b
  130. nop
  131. move.d   $r5, [R_SDRAM_TIMING]
  132. ba       _sdram_commands_end
  133. nop
  134. _sdram_commands_start:
  135. .byte   3 ; Precharge
  136. .byte   0       ; nop
  137. .byte   2 ; refresh
  138. .byte   0 ; nop
  139. .byte   2 ; refresh
  140. .byte   0 ; nop
  141. .byte   2 ; refresh
  142. .byte   0 ; nop
  143. .byte   2 ; refresh
  144. .byte   0 ; nop
  145. .byte   2 ; refresh
  146. .byte   0 ; nop
  147. .byte   2 ; refresh
  148. .byte   0 ; nop
  149. .byte   2 ; refresh
  150. .byte   0 ; nop
  151. .byte   2 ; refresh
  152. .byte   0 ; nop
  153. .byte   1 ; mrs
  154. .byte   0 ; nop 
  155. _sdram_commands_end:
  156. #endif
  157. #endif