VIVI阅读笔记Word下载.docx
- 文档编号:18963438
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:24
- 大小:194.94KB
VIVI阅读笔记Word下载.docx
《VIVI阅读笔记Word下载.docx》由会员分享,可在线阅读,更多相关《VIVI阅读笔记Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
4、初始化内存控制寄存器(memsetup)
S3c2410共有15个寄存器,在此开始初始化13个寄存器。
5、检查是否从掉电模式唤醒(Checkifthisisawake-upfromsleep)
若是,则调用WakeupStart函数进行处理。
6、点亮所有LED(AllLEDon)
点一下灯,通知外面的同志,告诉他们有情况发生。
7、初始化UART0(setGPIOforUART&
InitUART)
a.设置GPIO,选择UART0使用的引脚
b.初始化UART0,设置工作方式(使用FIFO)、波特率1152008N1、无流控等。
这可是使用串口与s3c2410通信的条件啊,在终端也要如此设置。
8、跳到内存测试函数(simplememorytesttofindsomeDRAMflaults)
当然要定义了CONFIG_BOOTUP_MEMTEST这个参数才会跳到内存测试。
9、如果定义了以Nandflash方式启动(#ifdef
CONFIG_S3C2410_NAND_BOOT),则此时要将vivi所有代码(包括阶段1和阶段2)从Nandflash复制到SDRAM中(因为在Nand
flash中是不能执行程序的,它只能做为程序和数据的存储器,而Norflash可就不同了,Norflash可以执行程序,但贵是它发展得瓶颈):
a.设置nandflash控制寄存器
b.设置堆栈指针
c.设置即将调用的函数nand_read_ll的参数:
r0=目的地址(SDRAM的地址),r1=源地址(nand
flash的地址),r2=复制的长度(以字节为单位)
d.调用nand_read_ll进行复制
10、跳到bootloader的阶段2运行,亦即调用init/main.c中的main函数(getreadtocallCfunctions)
a.重新设置堆栈
b.设置main函数的参数
c.调用main函数
head.S有900多行,都是些arm汇编,看的云山雾罩,汇编看来是忘的差不多了,所以这部分代码也看的相当糙,只知道大概在干什么,至于个中缘由就不是很了解。
先学学arm汇编再回来看。
阶段2
从init/main.c中的main函数开始,终于步入C语言的世界了。
Main函数总共有8步(8steps),先看看源代码:
intmain(intargc,char*argv[])
{
intret;
/*
*Step1:
*/
putstr("
\r\n"
);
putstr(vivi_banner);
//vivi_banner是vivi执行开始的显示,vivi_banner在文件version.c中定义
reset_handler();
*Step2:
ret=board_init();
if(ret){
Failedaboard_init()procedure\r\n"
error();
}
*Step3:
*/
mem_map_init();
mmu_init();
Succeedmemorymapping.\r\n"
*Now,viviisrunningontheram.MMUisenabled.
*Step4:
*/
/*initializetheheaparea*/
ret=heap_init();
Failedinitailizingheapregion\r\n"
/*Step5:
*MTD
ret=mtd_dev_init();
/*Step6:
init_priv_data();
/*Step7:
misc();
init_builtin_cmds();
/*Step8:
boot_or_vivi();
return0;
}
下面按照上面的步骤逐步来分析一下。
1、Step1:
reset_handler()
reset_handler用于将内存清零,代码在lib/reset_handle.c中。
1
void
2
reset_handler(void)
3
{
4
intpressed;
5
pressed=is_pressed_pw_btn();
/*判断是硬件复位还是软件复位*/
6
if(pressed==PWBT_PRESS_LEVEL){
7
DPRINTK("
HARDRESET\r\n"
8
hard_reset_handle();
/*调用clear_mem对SDRAM清0*/
9
}else{
10
SOFTRESET\r\n"
11
soft_reset_handle();
/*此函数为空*/
12
13
在上电后,reset_handler调用第8行的hard_reset_handle(),此函数在lib/reset_handle.c中:
[main(intargc,char*argv[])->
reset_handler()->
hard_reset_handle()]
staticvoid
hard_reset_handle(void)
#if0
clear_mem((unsignedlong)(DRAM_BASE+VIVI_RAM_ABS_POS),\
(unsignedlong)(DRAM_SIZE-VIVI_RAM_ABS_POS));
#endif
/*lib/memory.c,将起始地址为USER_RAM_BASE,长度为USER_RAM_SIZE的内存清0*/
clear_mem((unsignedlong)USER_RAM_BASE,(unsignedlong)USER_RAM_SIZE);
先写到这儿吧。
(未完待续)
S3C2410bootloader----VIVI阅读笔记2(续笔记1)
2、Step2:
board_init()
board_init调用2个函数用于初始化定时器和设置各GPIO引脚功能,代码在arch/s3c2410/smdk.c中:
[main(intargc,char*argv[])>
board_init()]
intboard_init(void)
init_time();
/*arch/s3c2410/proc.c*/
set_gpios();
/*arch/s3c2410/smdk.c*/
init_time()这个函数对寄存器进行了简单的操作:
voidinit_time(void)
TCFG0=(TCFG0_DZONE(0)|TCFG0_PRE1(15)|TCFG0_PRE0(0));
/*s3c2410datasheetP298*/
/*TCFG0=0|0xf00|0*/
寄存器TCFG0由三部分组成,prescaler0,prescaler1,deadzone和reserve四部分,前三部分分别对应
TCFG0_PRE0、TCFG0_PRE1、TCFG0_DZONE,TCFG0_PRE0(0)实际值为0x00,TCFG0_PRE1(15)实际值为0x0f00,而TCFG0_DZONE(0)实际值为
0x000000。
实际中,vivi并未使用定时器,这个函数就可以忽略。
set_gpios()用于选择GPA至GPH端口各引脚的功能及是否使用各引脚的内部上拉电阻,并设置外部中断源寄存器EXTINT0-2(vivi中未使用外部中断)。
voidset_gpios(void)
GPACON
=vGPACON;
GPBCON
=vGPBCON;
GPBUP
=vGPBUP;
GPCCON
=vGPCCON;
GPCUP
=vGPCUP;
GPDCON
=vGPDCON;
GPDUP
=vGPDUP;
GPECON
=vGPECON;
GPEUP
=vGPEUP;
GPFCON
=vGPFCON;
GPFUP
=vGPFUP;
14
GPGCON
=vGPGCON;
15
GPGUP
=vGPGUP;
16
GPHCON
=vGPHCON;
17
GPHUP
=vGPHUP;
18
EXTINT0=vEXTINT0;
19
EXTINT1=vEXTINT1;
20
EXTINT2=vEXTINT2;
21
以第三行为例,vGPACON的值为0x007fffff,查找s3c2410用户手册可知,该参数将GPACON的23位全部置1。
各位功能需察看s3c2410用户手册
3、Step3:
建立页表和启动MMU
mem_map_init();
mmu_init();
mem_map_init函数用于建立页表,vivi使用段式页表,只需要一级页表。
它调用3个函数,代码在arch/s3c2410/mmu.c中:
mem_map_init(void)]
voidmem_map_init(void)
#ifdefCONFIG_S3C2410_NAND_BOOT
/*CONFIG_S3C2410_NAND_BOOT=y,在文件include/autoconf.h中定义*/
mem_map_nand_boot();
/*最终调用mem_mepping_linear,建立页表*/
#else
mem_map_nor();
cache_clean_invalidate();
/*清空cache,使无效cache*/
tlb_invalidate();
/*使无效快表TLB*/
第9、10行的两个函数可以不用管它,他们做的事情在下面的mmu_init函数里又重复了一遍。
对于本开发板,在.config中定义了
CONFIG_S3C2410_NAND_BOOT。
mem_map_nand_boot()函数调用mem_mapping_linear()函数来最终完成建立页表的工作。
页表存放在SDRAM物理地址0x33dfc000开始处,共16K:
一个页表项4字节,共有4096个页表项;
每个页表项对应
1M地址空间,共4G。
mem_map_init先将4G虚拟地址映射到相同的物理地址上,NCNB(不使用cache,不使用write
buffer)——这样,对寄存器的操作跟未启动MMU时是一样的;
再将SDRAM对应的64M空间的页表项修改为使用cache。
mem_mapping_linear函数的代码在arch/s3c2410/mmu.c中:
mem_map_init(void)>
mem_map_nand_boot()>
mem_mapping_linear(void)]
staticinlinevoidmem_mapping_linear(void)
{
unsignedlongpageoffset,sectionNumber;
putstr_hex("
MMUtablebaseaddress=0x"
(unsignedlong)
mmu_tlb_base);
/*4G虚拟地址映射到相同的物理地址.notcacacheable,notbufferable*/
/*mmu_tlb_base=0x33dfc000*/
for(sectionNumber=0;
sectionNumber<
4096;
sectionNumber++){
pageoffset=(sectionNumber<
<
20);
*(mmu_tlb_base+(pageoffset>
>
20))=pageoffset|
MMU_SECDESC;
/*makedramcacheable*/
/*SDRAM物理地址0x3000000-0x33ffffff,
DRAM_BASE=0x30000000,DRAM_SIZE=64M
for(pageoffset=DRAM_BASE;
pageoffset<
(DRAM_BASE+DRAM_SIZE);
\
pageoffset+=SZ_1M){
//DPRINTK(3,"
MakeDRAMsectioncacheable:
0x%08lx\n"
pageoffset);
20))=\
pageoffset|MMU_SECDESC|MMU_CACHEABLE;
20}
mmu_init()函数用于启动MMU,它直接调用arm920_setup()函数。
arm920_setup()的代码在arch/s3c2410/mmu.c中:
mmu_init()>
arm920_setup()]
staticinlinevoidarm920_setup(void)
unsignedlongttb=MMU_TABLE_BASE;
/*MMU_TABLE_BASE=0x33dfc000*/
__asm__(
/*Invalidatecaches*/
"
mov
r0,#0\n"
mcr
p15,0,r0,c7,c7,0\n"
/*invalidateI,Dcachesonv4*/
p15,0,r0,c7,c10,4\n"
/*drainwritebufferonv4*/
p15,0,r0,c8,c7,0\n"
/*invalidateI,DTLBsonv4*/
/*Loadpagetablepointer*/
r4,%0\n"
p15,0,r4,c2,c0,0\n"
/*loadpagetablepointer*/
/*Writedomainid(cp15_r3)*/
mvn
/*Domains0b01=client,0b11=Manager*/
p15,0,r0,c3,c0,0\n"
/*loaddomainaccessregister,writedomain15:
0,用户手册P548(accesspermissions)*/
/*Setcontrolregisterv4*/
mrc
p15,0,r0,c1,c0,0\n"
/*getcontrolregisterv4*/
/*数据手册P545:
readcontrolregister*/
/*Clearout'
unwanted'
bits(thenputtheminifweneedthem)*/
/*..VI..RSB....CAM*/
/*这些位的含义在数据手册P546*/
bicr0,r0,#0x3000\n"
/*..11............*/
/*I(bit[12])=0=Instructioncachedisabled*/
/*V[bit[13]](Baselocationofexceptionregisters)=0=Lowaddresses=0x00000000*/
22
bicr0,r0,#0x0300\n"
/*......11........*/
23
/*R(ROMprotectionbit[9])=0*/
/*S(Systemprotectionbit[8])=0*/
/*由于TTB中AP=0b11(line141),所以RS位不使用(P579)*/
24
bicr0,r0,#0x0087\n"
/*0x0000000010000111*/
/*M(bit[0])=0=MMUdisabled*/
/*A(bit[1])=0=Dataaddressalignmentfaultcheckingdisable*/
/*C(bit[2])=0=Datacachedisabled*/
/*B(bit[7])=0=Little-endianoperation*/
25
/*Turnonwhatwewant*/
26
/*Faultcheckingenabled*/
27
orrr0,r0,#0x0002\n"
/*..............10*/
/*A(bit[1])=1=Dataaddressalignmentfaultch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VIVI 阅读 笔记