2009年6月3日 星期三

vivi原始碼分析 stage1

1.vivi原始碼分析
vivi的原始碼包括arch,init,lib,drivers和include等幾個目錄,共200多個文件。

Vivi主要包括下面幾個目錄:

arch:此目錄包括了所有vivi支持的目標板的子目錄,例如s3c2410目錄。

drivers:其中包括了引導內核需要的設備的驅動程序(MTD和串口)。 MTD目錄下分map、nand和nor三個目錄。

init:這個目錄只有main.c和version.c兩個文件。和普通的C程序一樣,vivi將從main函數開始執行。

lib:一些平台公共的接口代碼,比如time.c裡的udelay()和mdelay()。

include:頭文件的公共目錄,其中的s3c2410.h定義了這塊處理器的一些寄存器。 Platform/smdk2410.h定義了與開發板相關的資源配置參數,我們往往只需要修改這個文件就可以配置目標板的參數,如波特率、引導參數、物理內存映射等。
1.2 vivi的運行
vivi的運行也可以分為兩個階段:
1.2.1 vivi的第一階段
完成含依賴於CPU的體系結構硬件初始化的代碼,包括禁止中斷、初始化串口、複製自身到RAM等。相關代碼集中在head.S(viviarchs3c2410目錄下):Head.S:
#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
@ 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
@
@ VIVI magics
@
@ 0x20: magic number so we can verify that we only put
.long 0
@ 0x24:
.long 0
@ 0x28: where this vivi was linked, so we can put it in memory in the right place
.long _start
@ 0x2C: this contains the platform, cpu and machine id
.long ARCHITECTURE_MAGIC
@ 0x30: vivi capabilities
.long 0
#ifdef CONFIG_PM ;vivi考慮不需要使用電源管理
@ 0x34:
b SleepRamProc
#endif
#ifdef CONFIG_TEST
@ 0x38:
b hmi
#endif @
@ Start VIVI head
@
Reset:
@ disable watch dog timer;禁止看門狗計時器
mov r1, #0x53000000 ;WTCON寄存器地址是
0x53000000,清0
mov r2, #0x0
str r2, [r1]
#ifdef CONFIG_S3C2410_MPORT3 ;不符合條件,跳到下面的關中斷
/****在/vivi/include/autoconf.h中#undef CONFIG_S3C2410_MPORT3******/
mov r1, #0x56000000 ;GPACON寄存器地址是
0x56000000
mov r2, #0x00000005
str r2, [r1, #0x70] ;配置GPHCON寄存器
mov r2, #0x00000001
str r2, [r1, #0x78] ;配置GPHUP寄存器
mov r2, #0x00000001
str r2, [r1, #0x74] ;配置GPHDAT寄存器
#endif
@ disable all interrupts ;禁止全部中斷
    mov r1, #INT_CTL_BASE
    mov r2, #0xffffffff
    str r2, [r1, #oINTMSK] ;關閉所有中斷
    ldr r2, =0x7ff
    str r2, [r1, #oINTSUBMSK]
    @ initialise system clocks ;初始化系統時鐘
mov r1, #CLK_CTL_BASE
    mvn r2, #0xff000000
str r2, [r1, #oLOCKTIME]

@ldr r2, mpll_50mhz
@str r2, [r1, #oMPLLCON]
#ifndef CONFIG_S3C2410_MPORT1 ;滿足條件,向下執行
/****在/vivi/include/autoconf.h中#undef CONFIG_S3C2410_MPORT1******/
@ 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 ;CPU的頻率是200MHz
mov r1, #CLK_CTL_BASE
ldr r2, mpll_200mhz
str r2, [r1, #oMPLLCON]
#else
@ 1:2:2
mov r1, #CLK_CTL_BASE
ldr r2, clock_clkdivn
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 100 Mhz ;CPU的頻率是100MHz
mov r1, #CLK_CTL_BASE
ldr r2, mpll_100mhz
str r2, [r1, #oMPLLCON]
#endif
bl memsetup ;跳轉到memsetup函數
/*****************************
Memsetup函數的實現:
ENTRY(memsetup)
@ initialise the static memory
@ set memory control registers ;設置內存控制寄存器的初值
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val
/*******************
@
@ Data Area
@
@ Memory configuration values
.align 4
mem_cfg_val: ;定義好的13*4=52個字節初值
.long vBWSCON ;在/vivi/include/platform/smdk2410.h
/****** SDRAM從32位變成16位,需要修改vBWSCON的值******/
.long vBANKCON0
.long vBANKCON1
.long vBANKCON2
.long vBANKCON3
/**********網卡控制器vBANKCON3的值可能需要修改**************/
.long vBANKCON4
.long vBANKCON5
.long vBANKCON6
/****** SDRAM從32位變成16位,可能需要修改vBANKCON6的值******/
.long vBANKCON7
.long vREFRESH
.long vBANKSIZE
/****** SDRAM從64MB變成32MB,需要修改vBANKSIZE的值******/
.long vMRSRB6
.long vMRSRB7
********************/
add r3, r1, #52
1: ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne 1b ;循環操作,直到13個寄存器寫入完成
mov pc, lr
/*******************************/
#ifdef CONFIG_PM ;vivi考慮不需要使用電源管理
@ Check if this is a wake-up from sleep
ldr r1, PMST_ADDR
ldr r0, [r1]
tst r0, #(PMST_SMR)
bne WakeupStart ;查看狀態,判斷是否需要跳轉到WakeupStart
#endif
#ifdef CONFIG_S3C2410_SMDK ;SMDK開發板使用
@ All LED on ;點亮開發板上的LED
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_F ;LED使用GPIOF組的管腳
ldr r2,=0x55aa ;使能EINT0,EINT1,EINT2,EINT3,
;另四個管腳配置成輸出,屏蔽EINT4,5,6,7
str r2, [r1, #oGPIO_CON]
mov r2, #0xff
str r2, [r1, #oGPIO_UP] ;disable the pull-up function
mov r2, #0x00
str r2, [r1, #oGPIO_DAT]
#endif
#if 0
@ SVC
mrs r0, cpsr
bic r0, r0, #0xdf
orr r1, r0, #0xd3
msr cpsr_all, r1
#endif
@ set GPIO for UART ;設置串口
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_H ;設置GPIO_H組管腳為串口
ldr r2, gpio_con_uart
str r2, [r1, #oGPIO_CON]
ldr r2, gpio_up_uart
str r2, [r1, #oGPIO_UP]
/*************************

沒有留言:

張貼留言