romInit.s
上传用户:ske666
上传日期:2022-03-30
资源大小:371k
文件大小:9k
源码类别:

VxWorks

开发平台:

Objective-C

  1. /* romInit.s - HITSAT ROM initialization module */
  2. /*
  3. DESCRIPTION
  4. The entry code for VxWorks images that start running from ROM
  5. Such as 'bootrom' and 'vxWorks_rom'.
  6. The entry point romInit() is the first code executed on power-up.
  7. romInit() performs the minimal setup needed to
  8.  call the generic C routine romStart() with parameter BOOT_COLD.
  9. romInit() 
  10. masks interrupts:
  11. processor
  12. interrupt controller
  13. sets the initial stack pointer:
  14. to STACK_ADRS which is defined in configAll.h .
  15. Other hardware and device initialisation is performed later in the sysHwInit routine in sysLib.c.
  16. sysToMonitor()
  17. jumps to a location after the beginning of romInit,
  18.  (defined by ROM_WARM_ADRS) to perform a "warm boot".
  19.  This entry point allows a parameter to be passed to romStart().
  20. The routines in this module don't use the "C" frame pointer %r11@ ! or
  21. establish a stack frame.
  22. */
  23. /*
  24.  * Behaviours:
  25.  * Save boot type;
  26.  * Turn off the watchdog;
  27.  * Take a delay for cold boot;
  28.  * Set MMU Control Register;
  29.  * Disable interrupts;
  30.  * Set system clock;
  31.  * Initialize memory;
  32.  * r1 now contains memory size: store this in Memory_Size variable;
  33.  * Initialize stack pointer;
  34.  * jump to C entry point in ROM;
  35.  */
  36. #define _ASMLANGUAGE
  37. #include "vxWorks.h"
  38. #include "sysLib.h"
  39. #include "asm.h"
  40. #include "regs.h"
  41. #include "config.h"
  42. #include "arch/arm/mmuArmLib.h"
  43.         .data
  44.         .globl   VAR(copyright_wind_river)
  45.         .long    VAR(copyright_wind_river)
  46. /* internals */
  47. .globl FUNC(romInit) /* start of system code */
  48. .globl VAR(sdata) /* start of data */
  49.         .globl  _sdata
  50. .globl VAR(s3c2410xMemSize) /* actual memory size */
  51. /* externals */
  52. .extern FUNC(romStart) /* system initialization routine */
  53. _sdata:
  54. VAR_LABEL(sdata)
  55. .asciz "start of data"
  56. .balign 4
  57. /* variables */
  58. .data
  59. VAR_LABEL(s3c2410xMemSize)
  60. .long 0
  61. .text
  62. .balign 4
  63. /*******************************************************************************
  64. *
  65. * romInit - entry point for VxWorks in ROM
  66. *
  67. * romInit
  68. *     (
  69. *     int startType /@ only used by 2nd entry point @/
  70. *     )
  71. * INTERNAL
  72. * sysToMonitor examines the ROM for the first instruction and the string
  73. * "Copy" in the third word so if this changes, sysToMonitor must be updated.
  74. */
  75. _ARM_FUNCTION(romInit)
  76. _romInit:
  77. cold:
  78. mov r0, #BOOT_COLD /* fall through to warm boot entry */
  79. warm:
  80. b start
  81. /* copyright notice appears at beginning of ROM (in TEXT segment) */
  82. .ascii   "Copyright 2004 Samsung"
  83. .ascii   "nCopyright 2004 HITSAT, Inc."
  84. .balign 4
  85. start:
  86. /* Turn off the watchdog. */
  87. ldr r1, =rWTCON_ADR /* r0->WTCON */
  88. ldr r2, =rWTCON_INIT_VALUE /* r1 = WTCON's initValue */
  89. str r2, [r1] /* Turn off the watch-dog */
  90. /* Take a delay for cold boot. */
  91. teqs r0, #BOOT_COLD
  92. moveq r1, #____BOOT_DELAY_VALUE
  93. movne r1, #1
  94. delay_loop:
  95. subs r1, r1, #1
  96. bne delay_loop
  97. /*
  98.  * Set processor and MMU to known state as follows (we may have not
  99.  * been entered from a reset). We must do this before setting the CPU
  100.  * mode as we must set PROG32/DATA32.
  101.  *
  102.  * MMU Control Register layout.
  103.  *
  104.  * bit
  105.  *  0 M 0 MMU disabled
  106.  *  1 A 0 Address alignment fault disabled, initially
  107.  *  2 C 0 Data cache disabled
  108.  *  3 W 0 Write Buffer disabled
  109.  *  4 P 1 PROG32
  110.  *  5 D 1 DATA32
  111.  *  6 L 1 Should Be One (Late abort on earlier CPUs)
  112.  *  7 B ? Endianness (1 => big)
  113.  *  8 S 0 System bit to zero } Modifies MMU protections, not really
  114.  *  9 R 1 ROM bit to one     } relevant until MMU switched on later.
  115.  * 10 F 0 Should Be Zero
  116.  * 11 Z 0 Should Be Zero (Branch prediction control on 810)
  117.  * 12 I 0 Instruction cache control
  118.  */
  119. /* Setup MMU Control Register */
  120. mov r1, #MMU_INIT_VALUE /* Defined in mmuArmLib.h */
  121. #if defined(INTEGRATOR_EARLY_I_CACHE_ENABLE)
  122. orr r1, r1, #MMUCR_I_ENABLE /* conditionally enable Icache*/
  123. #endif
  124. mcr p15, 0, r1, c1, c0, 0 /* Write to MMU CR */
  125. /*
  126.  * If MMU was on before this, then we'd better hope it was set
  127.  * up for flat translation or there will be problems. The next
  128.  * 2/3 instructions will be fetched "translated" (number depends
  129.  * on CPU).
  130.  *
  131.  * We would like to discard the contents of the Write-Buffer
  132.  * altogether, but there is no facility to do this. Failing that,
  133.  * we do not want any pending writes to happen at a later stage,
  134.  * so drain the Write-Buffer, i.e. force any pending writes to
  135.  * happen now.
  136.  */
  137. /* drain write-buffer */
  138. mov r1, #0 /* data SBZ */
  139. mcr p15, 0, r1, c7, c10, 4
  140. /* Flush (invalidate) both I and D caches */
  141. mcr p15, 0, r1, c7, c7, 0 /* R1 = 0 from above, data SBZ*/
  142.         /*
  143.  * Set Process ID Register to zero, this effectively disables
  144.  * the process ID remapping feature.
  145.  */
  146. mov r1, #0
  147. mcr p15, 0, r1, c13, c0, 0
  148. /* Disable CPU interrupts and individual interrupts in the interrupt controller. */
  149. mrs r1, cpsr
  150. bic r1, r1, #MASK_MODE
  151. orr r1, r1, #(MODE_SVC32 | IRQ_ENABLE_Bit | FIQ_ENABLE_Bit)
  152. msr cpsr, r1
  153. ldr r1, =0xffffffff
  154. ldr r2, =rINTMSK_ADR /* R2->interrupt mask registor of controller */
  155. str r1, [r2] /* disable all sources */
  156. ldr r2, =rINTSUBMSK_ADR /* R2->sub-interrupt mask registor of controller */
  157. str r1, [r2] /* disable all sub-sources */
  158. /*
  159.  * Jump to the normal (higher) ROM Position. After a reset, the
  160.  * ROM is mapped into memory from* location zero upwards as well
  161.  * as in its normal position at This code could be executing in
  162.  * the lower position. We wish to be executing the code, still
  163.  * in ROM, but in its normal (higher) position before we remap
  164.  * the machine so that the ROM is no longer dual-mapped from zero
  165.  * upwards, but so that RAM appears from 0 upwards.
  166.  */
  167. ldr pc, L$_HiPosn
  168. HiPosn:
  169. /*
  170.  * We are now executing in the normal (higher, still in ROM)
  171.  * position in the memory map.  Remap memory to post-reset state,
  172.  * so that the ROM is not now dual-mapped to zero upwards, but
  173.  * RAM is mapped from zero, instead.
  174.  */
  175. /* phoenix_remap */
  176. /*
  177. MOV r1, #INTEGRATOR_HDR_REMAP
  178. MOV r2, #INTEGRATOR_HDR_BASE
  179. STR r1, [r2, #INTEGRATOR_HDR_CTRL_OFFSET]
  180. */
  181. /* Set system clock.*/
  182. /* set the MMU control register asynchronous mode. */
  183. mrc p15, 0, r2, c1, c0, 0
  184. orr r2, r2, #MMUCR_ASYNC
  185. mcr p15, 0, r2, c1, c0, 0
  186. /* Set PLL lock time. */
  187. ldr r2, =rLOCKTIME_ADR
  188. ldr r1, =rLOCKTIME_INIT_VALUE
  189. str r1, [r2]
  190. /* Set FCLK:HCLK:PCLK = 1:2:4 */
  191. ldr r2, =rCLKDIVN_ADR
  192. ldr r1, =rCLKDIVN_INIT_VALUE
  193. str r1, [r2]
  194. /* Set FCLK = 200MHz by Fosc = 12MHz */
  195. ldr r2, =rMPLLCON_ADR
  196. ldr r1, =rMPLLCON_INIT_VALUE
  197. /*  ldr r1, =0x5c040 */
  198. str r1, [r2]
  199. /* Set clock control register */
  200. ldr r2, =rCLKCON_ADR
  201. ldr r1, =rCLKCON_INIT_VALUE
  202. str r1, [r2]
  203. /* Set clock slow register */
  204. ldr r2, =rCLKSLOW_ADR
  205. ldr r1, =rCLKSLOW_INIT_VALUE
  206. str r1, [r2]
  207. /* Initialize memory . */
  208. /* Set bus width for each bank, 0x22111112 */
  209. ldr r2, =rBWSCON_ADR
  210. ldr r1, =rBWSCON_INIT_VALUE
  211. str r1, [r2]
  212. /* Set bank0 and bank5 for flash and cs8900, 0x00000700 */
  213. ldr r2, =rBANKCON0_ADR
  214. ldr r1, =rBANKCON0_INIT_VALUE
  215. str r1, [r2]
  216. ldr r2, =rBANKCON5_ADR
  217. ldr r1, =rBANKCON5_INIT_VALUE
  218. str r1, [r2]
  219. /* Set bank6 for SDRAM, 0x00018000 */
  220. ldr r2, =rBANKCON6_ADR
  221. ldr r1, =rBANKCON6_INIT_VALUE
  222. str r1, [r2]
  223. /* Set refresh for SDRAM, 0x00860459 */
  224. ldr r2, =rREFRESH_ADR
  225. ldr r1, =rREFRESH_INIT_VALUE
  226. str r1, [r2]
  227. /* Set bank size for SDRAM, 0x000000b7 */
  228. ldr r2, =rBANKSIZE_ADR
  229. ldr r1, =rBANKSIZE_INIT_VALUE
  230. str r1, [r2]
  231. /* Set bank mode, 0x00000030 */
  232. ldr r2, =rMRSRB6_ADR
  233. ldr r1, =rMRSRB6_INIT_VALUE
  234. str r1, [r2]
  235. /* r1 now contains memory size: store this in Memory_Size variable */
  236. ldr r1, =SZ_16M
  237. ldr r3, L$_memSize
  238. str r1, [r3]
  239. mov r3, r1 /* Need to return size in both these registers*/
  240. /* Initialize the stack pointer to just before where the uncompress code, 
  241.  * copied from ROM to RAM, will run. */
  242. ldr sp, L$_STACK_ADDR
  243. mov fp, #0 /* zero frame pointer */
  244. /* jump to C entry point in ROM: routine - entry point + ROM base */
  245. #if (ARM_THUMB)
  246. ldr r12, L$_rStrtInRom
  247. orr r12, r12, #1 /* force Thumb state */
  248. bx r12
  249. #else
  250. ldr pc, L$_rStrtInRom
  251. #endif /* (ARM_THUMB) */
  252. /******************************************************************************/
  253. /*
  254.  * PC-relative-addressable pointers - LDR Rn,=sym is broken
  255.  * note "_" after "$" to stop preprocessor performing substitution
  256.  */
  257. .balign 4
  258. L$_HiPosn:
  259. .long ROM_TEXT_ADRS + HiPosn - FUNC(romInit)
  260. L$_rStrtInRom:
  261. .long ROM_TEXT_ADRS + FUNC(romStart) - FUNC(romInit)
  262. L$_STACK_ADDR:
  263. .long STACK_ADRS
  264. L$_memSize:
  265. .long VAR(s3c2410xMemSize)
  266. /*________RESET_ADR: b cold  reset................0x00000000 */
  267. /*________UND_ADR: nop  unknown ins..........0x00000004 */
  268. /*________SWI_ADR: nop  software.............0x00000008 */
  269. /*________IABT_ADR: nop  instruction abort....0x0000000c */
  270. /*________DABT_ADR: nop  data abort...........0x00000010 */
  271. /* nop  reserved.............0x00000014 */
  272. /*________IRQ_ADR: nop  IRQ..................0x00000018 */
  273. /*________FIQ_ADR: nop  FIQ..................0x0000001c */