Chinaunix首页 | 论坛 | 博客
  • 博客访问: 365168
  • 博文数量: 36
  • 博客积分: 2071
  • 博客等级: 大尉
  • 技术积分: 797
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 12:08
文章分类
文章存档

2011年(2)

2010年(34)

我的朋友

分类: 嵌入式

2010-12-03 20:20:12

 
#include "config.h"
#include "linkage.h"
#include "machine.h"
@ Start of executable code
ENTRY(_start)
ENTRY(ResetEntryPoint)
@
@ Exception vector table (physical address = 0x00000000)
@
@ 0x00: Reset
 b Reset
@
@ Start VIVI head
@
Reset:
 @ disable watch dog timer
 mov r1, #0x53000000
 mov r2, #0x0
 str r2, [r1]
 @ initialise system clocks
 mov r1, #CLK_CTL_BASE
 mvn r2, #0xff000000
 str r2, [r1, #oLOCKTIME]
 @ldr r2, mpll_50mhz
 @str r2, [r1, #oMPLLCON]
 @ 1:2:4
 mov r1, #CLK_CTL_BASE
 mov r2, #0x3
 str r2, [r1, #oCLKDIVN]
 mrc p15, 0, r1, c1, c0, 0  @ read ctrl register
 orr r1, r1, #0xc0000000      @ Asynchronous 
 mcr p15, 0, r1, c1, c0, 0  @ write ctrl register
 @ now, CPU clock is 200 Mhz
 mov r1, #CLK_CTL_BASE
 ldr r2, mpll_200mhz
 str r2, [r1, #oMPLLCON]

 bl memsetup
 @ set GPIO for UART
 mov r1, #GPIO_CTL_BASE
 add r1, r1, #oGPIO_H
 ldr r2, gpio_con_uart 
 str r2, [r1, #oGPIO_CON]
 ldr r2, gpio_up_uart
 str r2, [r1, #oGPIO_UP] 
@ bl InitUART

#ifdef CONFIG_S3C2410_NAND_BOOT
 bl copy_myself
 @ jump to ram
 ldr r1, =on_the_ram
 add pc, r1, #0
 nop
 nop
1: b 1b  @ infinite loop
on_the_ram:
#endif
 @ get read to call C functions
 ldr sp, DW_STACK_START @ setup stack pointer
 mov fp, #0   @ no previous frame, so fp=0
 mov a2, #0   @ set argv to NULL
 bl main   @ call main
 mov pc, #FLASH_BASE  @ otherwise, reboot
@
@ End VIVI head
@

ENTRY(memsetup)
 @ initialise the static memory
 @ set memory control registers
 mov r1, #MEM_CTL_BASE
 adrl r2, mem_cfg_val
 add r3, r1, #52
1: ldr r4, [r2], #4
 str r4, [r1], #4
 cmp r1, r3
 bne 1b
 mov pc, lr

#ifdef CONFIG_S3C2410_NAND_BOOT
@
@ copy_myself: copy vivi to ram
@
copy_myself:
 mov r10, lr
 @ reset NAND
 mov r1, #NAND_CTL_BASE
 ldr r2, =0xf830  @ initial value
 str r2, [r1, #oNFCONF]
 ldr r2, [r1, #oNFCONF]
 bic r2, r2, #0x800  @ enable chip
 str r2, [r1, #oNFCONF]
 mov r2, #0xff  @ RESET command
 strb r2, [r1, #oNFCMD]
 mov r3, #0   @ wait
1: add r3, r3, #0x1
 cmp r3, #0xa
 blt 1b
2: ldr r2, [r1, #oNFSTAT] @ wait ready
 tst r2, #0x1
 beq 2b
 ldr r2, [r1, #oNFCONF]
 orr r2, r2, #0x800  @ disable chip
 str r2, [r1, #oNFCONF]
 @ get read to call C functions (for nand_read())
 ldr sp, DW_STACK_START @ setup stack pointer
 mov fp, #0   @ no previous frame, so fp=0
 @ copy vivi to RAM
 ldr r0, =VIVI_RAM_BASE
 mov     r1, #0x0
 mov r2, #0x20000
 bl nand_read_ll
 cmp r0, #0x0
 beq ok_nand_read
 
ok_nand_read:
 @ verify
 mov r0, #0
 ldr r1, =0x33f00000
 mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
 ldr r3, [r0], #4
 ldr r4, [r1], #4
 teq r3, r4
 bne notmatch
 subs r2, r2, #4
 beq done_nand_read 
 bne go_next
notmatch:
1: b 1b
done_nand_read:
 mov pc, r10
#endif @ CONFIG_S3C2410_NAND_BOOT
 
@
@ Data Area
@
@ Memory configuration values
.align 4
mem_cfg_val:
 .long vBWSCON
 .long vBANKCON0
 .long vBANKCON1
 .long vBANKCON2
 .long vBANKCON3
 .long vBANKCON4
 .long vBANKCON5
 .long vBANKCON6
 .long vBANKCON7
 .long vREFRESH
 .long vBANKSIZE
 .long vMRSRB6
 .long vMRSRB7
@ Processor clock values
.align 4
clock_locktime:
 .long vLOCKTIME
mpll_50mhz:
 .long vMPLLCON_50
mpll_200mhz:
 .long vMPLLCON_200
clock_clkcon:
 .long vCLKCON
clock_clkdivn:
 .long vCLKDIVN
@ initial values for serial
uart_ulcon:
 .long vULCON
uart_ucon:
 .long vUCON
uart_ufcon:
 .long vUFCON
uart_umcon:
 .long vUMCON
@ inital values for GPIO
gpio_con_uart:
 .long vGPHCON
gpio_up_uart:
 .long vGPHUP
 .align 2
DW_STACK_START:
 .word STACK_BASE+STACK_SIZE-4
.align 4
SerBase:
#if defined(CONFIG_SERIAL_UART0)
 .long UART0_CTL_BASE
#elif defined(CONFIG_SERIAL_UART1)
 .long UART1_CTL_BASE
#elif defined(CONFIG_SERIAL_UART2)
 .long UART2_CTL_BASE
#else
#error not defined base address of serial
#endif

 
阅读(1920) | 评论(0) | 转发(0) |
0

上一篇:vivi 源码结构介绍

下一篇:NANDFlash 控制器

给主人留下些什么吧!~~