移植嵌入式Linux到ARM处理器S3C2410:BootLoader
2012-10-04
宋宝华
标签: Linux S3C2410

3.BootLoader第一阶段

3.1硬件设备初始化

基本的硬件初始化工作包括:

  • 屏蔽所有的中断;
  • 设置CPU的速度和时钟频率;
  • RAM初始化;
  • 初始化LED

ARM的中断向量表设置在0地址开始的8个字空间中,如下表:

每当其中的某个异常发生后即将PC值置到相应的中断向量处,每个中断向量处放置一个跳转指令到相应的中断服务程序去进行处理,中断向量表的程序如下:

@ 0x00: Reset

b Reset

@ 0x04: Undefined instruction exception

UndefEntryPoint:

b HandleUndef

@ 0x08: Software interrupt exception

SWIEntryPoint:

b HandleSWI

@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)

PrefetchAbortEnteryPoint:

b HandlePrefetchAbort

@ 0x10: Data Access Memory Abort

DataAbortEntryPoint:

b HandleDataAbort

@ 0x14: Not used

NotUsedEntryPoint:

b HandleNotUsed

@ 0x18: IRQ(Interrupt Request) exception

IRQEntryPoint:

b HandleIRQ

@ 0x1c: FIQ(Fast Interrupt Request) exception

FIQEntryPoint:

b HandleFIQ

复位时关闭看门狗定时器、屏蔽所有中断:

Reset:

@ disable watch dog timer

mov r1, #0x53000000

mov r2, #0x0

str r2, [r1]

@ disable all interrupts

mov r1, #INT_CTL_BASE

mov r2, #0xffffffff

str r2, [r1, #oINTMSK]

ldr r2, =0x7ff

str r2, [r1, #oINTSUBMSK]

设置系统时钟:

@init clk

@ 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]

点亮所有的用户LED:

@ All LED on

mov r1, #GPIO_CTL_BASE

add r1, r1, #oGPIO_F

ldr r2,=0x55aa

str r2, [r1, #oGPIO_CON]

mov r2, #0xff

str r2, [r1, #oGPIO_UP]

mov r2, #0x00

str r2, [r1, #oGPIO_DAT]

设置(初始化)内存映射:

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

设置(初始化)UART:

@ 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

@ Initialize UART

@

@ r0 = number of UART port

InitUART:

ldr r1, SerBase

mov r2, #0x0

str r2, [r1, #oUFCON]

str r2, [r1, #oUMCON]

mov r2, #0x3

str r2, [r1, #oULCON]

ldr r2, =0x245

str r2, [r1, #oUCON]

#define UART_BRD ((50000000 / (UART_BAUD_RATE * 16)) - 1)

mov r2, #UART_BRD

str r2, [r1, #oUBRDIV]

mov r3, #100

mov r2, #0x0

1: sub r3, r3, #0x1

tst r2, r3

bne 1b

#if 0

mov r2, #'U'

str r2, [r1, #oUTXHL]

1: ldr r3, [r1, #oUTRSTAT]

and r3, r3, #UTRSTAT_TX_EMPTY

tst r3, #UTRSTAT_TX_EMPTY

bne 1b

mov r2, #'0'

str r2, [r1, #oUTXHL]

1: ldr r3, [r1, #oUTRSTAT]

and r3, r3, #UTRSTAT_TX_EMPTY

tst r3, #UTRSTAT_TX_EMPTY

bne 1b

#endif

mov pc, lr

此外,vivi还提供了几个汇编情况下通过串口打印字符的函数PrintChar、PrintWord和PrintHexWord:

@ PrintChar : prints the character in R0

@ r0 contains the character

@ r1 contains base of serial port

@ writes ro with XXX, modifies r0,r1,r2

@ TODO : write ro with XXX reg to error handling

PrintChar:

TXBusy:

ldr r2, [r1, #oUTRSTAT]

and r2, r2, #UTRSTAT_TX_EMPTY

tst r2, #UTRSTAT_TX_EMPTY

beq TXBusy

str r0, [r1, #oUTXHL]

mov pc, lr

@ PrintWord : prints the 4 characters in R0

@ r0 contains the binary word

@ r1 contains the base of the serial port

@ writes ro with XXX, modifies r0,r1,r2

@ TODO : write ro with XXX reg to error handling

PrintWord:

mov r3, r0

mov r4, lr

bl PrintChar

mov r0, r3, LSR #8 /* shift word right 8 bits */

bl PrintChar

mov r0, r3, LSR #16 /* shift word right 16 bits */

bl PrintChar

mov r0, r3, LSR #24 /* shift word right 24 bits */

bl PrintChar

mov r0, #'\r'

bl PrintChar

mov r0, #'\n'

bl PrintChar

mov pc, r4

@ PrintHexWord : prints the 4 bytes in R0 as 8 hex ascii characters

@ followed by a newline

@ r0 contains the binary word

@ r1 contains the base of the serial port

@ writes ro with XXX, modifies r0,r1,r2

@ TODO : write ro with XXX reg to error handling

PrintHexWord:

mov r4, lr

mov r3, r0

mov r0, r3, LSR #28

bl PrintHexNibble

mov r0, r3, LSR #24

bl PrintHexNibble

mov r0, r3, LSR #20

bl PrintHexNibble

mov r0, r3, LSR #16

bl PrintHexNibble

mov r0, r3, LSR #12

bl PrintHexNibble

mov r0, r3, LSR #8

bl PrintHexNibble

mov r0, r3, LSR #4

bl PrintHexNibble

mov r0, r3

bl PrintHexNibble

mov r0, #'\r'

bl PrintChar

mov r0, #'\n'

bl PrintChar

mov pc, r4

共 4 页   上一页1234下一页
可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号