Bootloadervivi源代码分析免费的Word下载.docx
- 文档编号:16421069
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:13
- 大小:23.71KB
Bootloadervivi源代码分析免费的Word下载.docx
《Bootloadervivi源代码分析免费的Word下载.docx》由会员分享,可在线阅读,更多相关《Bootloadervivi源代码分析免费的Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
tarjxvfcross-2.95.3.tar.bz2–C/usr/local/arm
然后修改修改PATH变量:
为了可以方便使用arm-linux-gcc编译器系统,把arm-linux工具链目录加入到环境变量PATH中:
修改/etc/profile文件,添加pathmunge/usr/local/arm/2.95.3/bin即可。
#Pathmanipulation
if[`id-u`=0];
then
pathmunge/sbin
pathmunge/usr/sbin
pathmunge/usr/local/sbin
pathmunge/usr/local/arm/2.95.3/bin
fi
pathmunge/usr/X11R6/binafter
设置环境变量后,最好是重启或注销一下,这样设置的环境变量才能生效。
1.2.2配置和编译vivi
如果vivi的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入flash的vivi二进制映象文件。
由于vivi要用到kernel的一些头文件,所以需要kernel的源代码,所以先要把linux的kernel准备好。
将vivi和kernel都解到相应目录下(例如我将光盘提供的vivi源代码解压到/home/chenjun目录下,光盘提供的Linuxkernel源码kernel-h2410eb.041024.tar.gz也解压到/home/chenjun目录下,解压后的文件名为kerne-h2410eb)。
然后需修改/vivi/Makefile里的一些变量设置:
Ø
LINUX_INCLUDE_DIR=/kernel/include/
(LINUX_INCLUDE_DIR为kernel/include的对应目录,我的是/home/chen/kerne-h2410eb/include/)
因此修改为:
LINUX_INCLUDE_DIR=/home/chenjun/kerne-h2410eb/include/
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
(CROSS_COMPILE为arm-linux安装的相应目录,我的是/usr/local/arm/2.95.3/bin/arm-linux-)
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
(需根据你arm-linux的安装目录修改,我的是/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3)
进入/vivi目录执行makedistclean。
(目的是确保编译的有效性,在编译之前将vivi里所有的“*.o”和“*.o.flag”文件删掉)
进入/vivi目录里,输入“makemenuconfig”,开始选择配置。
可以Load一个写好的配置文件也可以自己修改试试。
注意Exit时一定要选“Yes”保存配置。
再输入“make”正式开始编译,一会儿就完了。
如果不报错,在/vivi里面就有你自己的“vivi”了。
这个就是后面要烧写到flash中的bootloader。
1.3vivi代码分析
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.4vivi的运行
vivi的运行也可以分为两个阶段:
1.4.1vivi的第一阶段
完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。
相关代码集中在head.S(\vivi\arch\s3c2410目录下):
Head.S:
#include"
config.h"
linkage.h"
machine.h"
@Startofexecutablecode
ENTRY(_start)
ENTRY(ResetEntryPoint)
@
@Exceptionvectortable(physicaladdress=0x00000000);
异常向量表物理地址
@0x00:
Reset;
复位
bReset
@0x04:
Undefinedinstructionexception;
未定义的指令异常
UndefEntryPoint:
bHandleUndef
@0x08:
Softwareinterruptexception;
软件中断异常
SWIEntryPoint:
bHandleSWI
@0x0c:
PrefetchAbort(InstructionFetchMemoryAbort);
内存操作异常
PrefetchAbortEnteryPoint:
bHandlePrefetchAbort
@0x10:
DataAccessMemoryAbort;
数据异常
DataAbortEntryPoint:
bHandleDataAbort
@0x14:
Notused;
未使用
NotUsedEntryPoint:
bHandleNotUsed
@0x18:
IRQ(InterruptRequest)exception;
慢速中断处理
IRQEntryPoint:
bHandleIRQ
@0x1c:
FIQ(FastInterruptRequest)exception;
快速中断处理
FIQEntryPoint:
bHandleFIQ
@VIVImagics
@0x20:
magicnumbersowecanverifythatweonlyput
.long0
@0x24:
@0x28:
wherethisviviwaslinked,sowecanputitinmemoryintherightplace
.long_start
@0x2C:
thiscontainstheplatform,cpuandmachineid
.longARCHITECTURE_MAGIC
@0x30:
vivicapabilities
#ifdefCONFIG_PM;
vivi考虑不需要使用电源管理
@0x34:
bSleepRamProc
#endif
#ifdefCONFIG_TEST
@0x38:
bhmi
@StartVIVIhead
Reset:
@disablewatchdogtimer;
禁止看门狗计时器
movr1,#0x53000000;
WTCON寄存器地址是
0x53000000,清0
movr2,#0x0
strr2,[r1]
#ifdefCONFIG_S3C2410_MPORT3;
不符合条件,跳到下面的关中断
/****在/vivi/include/autoconf.h中#undefCONFIG_S3C2410_MPORT3******/
movr1,#0x56000000;
GPACON寄存器地址是
0x56000000
movr2,#0x00000005
strr2,[r1,#0x70];
配置GPHCON寄存器
movr2,#0x00000001
strr2,[r1,#0x78];
配置GPHUP寄存器
strr2,[r1,#0x74];
配置GPHDAT寄存器
@disableallinterrupts;
禁止全部中断
movr1,#INT_CTL_BASE
movr2,#0xffffffff
strr2,[r1,#oINTMSK];
掩码关闭所有中断
ldrr2,=0x7ff
strr2,[r1,#oINTSUBMSK]
@initialisesystemclocks;
初始化系统时钟
movr1,#CLK_CTL_BASE
mvnr2,#0xff000000
strr2,[r1,#oLOCKTIME]
@ldrr2,mpll_50mhz
@strr2,[r1,#oMPLLCON]
#ifndefCONFIG_S3C2410_MPORT1;
满足条件,向下执行
/****在/vivi/include/autoconf.h中#undefCONFIG_S3C2410_MPORT1******/
@1:
2:
4
movr2,#0x3
strr2,[r1,#oCLKDIVN]
mrcp15,0,r1,c1,c0,0@readctrlregister
orrr1,r1,#0xc0000000@Asynchronous
mcrp15,0,r1,c1,c0,0@writectrlregister
@now,CPUclockis200Mhz;
CPU的频率是200MHz
ldrr2,mpll_200mhz
strr2,[r1,#oMPLLCON]
#else
2
ldrr2,clock_clkdivn
@now,CPUclockis100Mhz;
CPU的频率是100MHz
ldrr2,mpll_100mhz
blmemsetup;
跳转到memsetup函数
/*****************************
Memsetup函数的实现:
ENTRY(memsetup)
@initialisethestaticmemory
@setmemorycontrolregisters;
设置内存控制寄存器的初值
movr1,#MEM_CTL_BASE
adrlr2,mem_cfg_val
/*******************
@DataArea
@Memoryconfigurationvalues
.align4
mem_cfg_val:
;
定义好的13*4=52个字节初值
.longvBWSCON;
在/vivi/include/platform/smdk2410.h中赋值
/******SDRAM从32位变成16位,需要修改vBWSCON的值******/
.longvBANKCON0
.longvBANKCON1
.longvBANKCON2
.longvBANKCON3
/**********网卡控制器vBANKCON3的值可能需要修改**************/
.longvBANKCON4
.longvBANKCON5
.longvBANKCON6
/******SDRAM从32位变成16位,可能需要修改vBANKCON6的值******/
.longvBANKCON7
.longvREFRESH
.longvBANKSIZE
/******SDRAM从64MB变成32MB,需要修改vBANKSIZE的值******/
.longvMRSRB6
.longvMRSRB7
********************/
addr3,r1,#52
1:
ldrr4,[r2],#4
strr4,[r1],#4
cmpr1,r3
bne1b;
循环操作,直到13个寄存器赋值完成
movpc,lr
*******************************/
@Checkifthisisawake-upfromsleep
ldrr1,PMST_ADDR
ldrr0,[r1]
tstr0,#(PMST_SMR)
bneWakeupStart;
查看状态,判断是否需要跳转到WakeupStart
#ifdefCONFIG_S3C2410_SMDK;
SMDK开发板使用
@AllLEDon;
点亮开发板上的LED
movr1,#GPIO_CTL_BASE
addr1,r1,#oGPIO_F;
LED使用GPIOF组的管脚
ldrr2,=0x55aa;
使能EINT0,EINT1,EINT2,EINT3,
;
另四个管脚配置成输出,屏蔽EINT4,5,6,7
strr2,[r1,#oGPIO_CON]
movr2,#0xff
strr2,[r1,#oGPIO_UP];
disablethepull-upfunction
movr2,#0x00
strr2,[r1,#oGPIO_DAT]
#if0
@SVC
mrsr0,cpsr
bicr0,r0,#0xdf
orrr1,r0,#0xd3
msrcpsr_all,r1
@setGPIOforUART;
设置串口
addr1,r1,#oGPIO_H;
设置GPIO_H组管脚为串口
ldrr2,gpio_con_uart
ldrr2,gpio_up_uart
strr2,[r1,#oGPIO_UP]
/*************************
@initalvaluesforGPIO
gpio_con_uart:
.longvGPHCON;
vGPHCON在/vivi/include/platform/smdk2410.h中赋值
#definevGPHCON0x0016faaa
GPIO_H配置为nCTS0,nRTS0,RXD0,TXD0,RXD1,
TXD1,nCTS1,nRTS1,
/****三个串口都使能,可能需要修改#definevGPHCON0x0016aaaa****/
gpio_up_uart:
.longVgphup;
同上#definevGPHUP0x000007ff
Thepull-upfunctionisdisabled.
************************/
blInitUART;
跳转到InitUART串口初始化函数
/****************************************************
@InitializeUART
@r0=numberofUARTport
InitUART:
ldrr1,SerBase
.align4;
缺省情况下在vivi中只初始化了UART0
SerBase:
#ifdefined(CONFIG_SERIAL_UART0)
.longUART0_CTL_BASE;
基地址在/vivi/include/s3c2410.h中定义
#elifdefined(CONFIG_SERIAL_UART1)
.longUART1_CTL_BASE
#elifdefined(CONFIG_SERIAL_UART2)
.longUART2_CTL_BASE
#errornotdefinedbaseaddressofserial
strr2,[r1,#oUFCON]
strr2,[r1,#oUMCON]
strr2,[r1,#oULCON]
ldrr2,=0x245
strr2,[r1,#oUCON]
#defineUART_BRD((50000000/(UART_BAUD_RATE*16))-1)
movr2,#UART_BRD
strr2,[r1,#oUBRDIV]
movr3,#100
subr3,r3,#0x1
tstr2,r3
bne1b
movr2,#'
U'
strr2,[r1,#oUTXHL]
ldrr3,[r1,#oUTRSTAT]
andr3,r3,#UTRSTAT_TX_EMPTY
tstr3,#UTRSTAT_TX_EMPTY
0'
****************************************************/
#ifdefCONFIG_DEBUG_LL;
打印调试信息,缺省未定义
@PrintcurrentProgramCounter
movr0,#'
\r'
blPrintChar
\n'
@'
movr0,pc
blPrintHexWord
#ifdefCONFIG_BOOTUP_MEMTEST
@simplememorytesttofindsomeDRAMflaults.
blmemtest
#ifdefCONFIG_S3C2410_NAND_BOOT;
从NANDFlash启动
blcopy_myself;
跳转到copy_myself函数
/**********************************************
@copy_myself:
copyvivitoram
copy_myself:
movr10,lr
@resetNAND
movr1,#NAND_CTL_BASE
ldrr2,=0xf830@initialvalue
strr2,[r1,#oNFCONF]
ldrr2,[r1,#oNFCONF]
bicr2,r2,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Bootloadervivi 源代码 分析 免费