dram_init.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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