欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    S3C2410 bootloader VIVI阅读笔记文档格式.docx

    • 资源ID:433315       资源大小:24.97KB        全文页数:19页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    S3C2410 bootloader VIVI阅读笔记文档格式.docx

    1、vivi中不会用到中断,中断是系统的事,bootloader可不能去干这事的(不过这段代码实在多余,上电后中断默认是关闭的)3、初始化系统时钟(initialise system clocks)启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。4、初始化内存控制寄存器(memsetup)S3c2410共有15个寄存器,在此开始初始化13个寄存器。5、检查是否从掉电模式唤醒(Check if this is a wake-up from sleep)若是,则调用WakeupStart

    2、函数进行处理。6、点亮所有LED (All LED on)点一下灯,通知外面的同志,告诉他们有情况发生。7、初始化UART0 (set GPIO for UART & InitUART)a设置GPIO,选择UART0使用的引脚b初始化UART0,设置工作方式(使用FIFO)、波特率115200 8N1、无流控等。这可是使用串口和s3c2410通信的条件啊,在终端也要如此设置。8、跳到内存测试函数(simple memory test to find some DRAM flaults)当然要定义了CONFIG_BOOTUP_MEMTEST这个参数才会跳到内存测试。9、如果定义了以Nandfla

    3、sh方式启动(#ifdefCONFIG_S3C2410_NAND_BOOT),则此时要将vivi所有代码(包括阶段1和阶段2)从Nand flash复制到SDRAM中(因为在Nand flash中是不能执行程式的,他只能做为程式和数据的存储器,而Nor flash可就不同了,Norflash能执行程式,但贵是他发展得瓶颈):a设置nand flash控制寄存器b设置堆栈指针c设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=复制的长度(以字节为单位)d调用nand_read_ll进行复制10、跳到bootlo

    4、ader的阶段2运行,亦即调用init/main.c中的main函数(get read to call C functions)a重新设置堆栈b设置main函数的参数c调用main函数head.S有900多行,都是些arm汇编,看的云山雾罩,汇编看来是忘的差不多了,所以这部分代码也看的相当糙,只知道大概在干什么,至于个中缘由就不是非常了解。先学学arm汇编再回来看。2阶段2从init/main.c中的main函数开始,终于步入C语言的世界了。 Main函数总共有8步(8 steps),先看看原始码:int main(int argc, char *argv)int ret;/*Step 1:

    5、*/putstr(rn);putstr(vivi_banner);/vivi_banner是vivi执行开始的显示信息,vivi_banner在文件version.c中定义reset_handler();/* Step 2:ret = board_init();if (ret) Failed a board_init() procedurernerror();/*Step 3:mem_map_init();mmu_init();Succeed memory mapping.rn/* Now, viviis running on the ram. MMU is enabled. * Step 4

    6、: /* initialize the heap area*/ ret = heap_init(); if (ret) Failed initailizing heap regionrn /* Step 5:MTD */ ret = mtd_dev_init(); /* Step 6: init_priv_data(); /* Step 7:*/ misc(); init_builtin_cmds(); /* Step 8: boot_or_vivi(); return 0;下面按照上面的步骤逐步来分析一下。1、Step1:reset_handler()reset_handler用于将内存清零

    7、,代码在lib/reset_handle.c中。1void2reset_handler(void)34int pressed;5pressed = is_pressed_pw_btn();/*判断是硬件复位还是软件复位*/6if (pressed = PWBT_PRESS_LEVEL) 7 DPRINTK(HARDRESETrn8 hard_reset_handle();/*调用clear_mem对SDRAM清0*/9 else 10DPRINTK(SOFT11soft_reset_handle();/*此函数为空*/1213在上电后,reset_handler调用第8行的hard_reset

    8、_handle(),此函数在lib/reset_handle.c中:main(int argc, char *argv) -reset_handler() - hard_reset_handle()static voidhard_reset_handle(void)#if 0clear_mem(unsignedlong)(DRAM_BASE + VIVI_RAM_ABS_POS), (unsigned long)(DRAM_SIZE -VIVI_RAM_ABS_POS);#endif/*lib/memory.c,将起始地址为USER_RAM_BASE,长度为USER_RAM_SIZE的内存清0

    9、*/clear_mem(unsigned long)USER_RAM_BASE, (unsigned long) USER_RAM_SIZE);2、Step2:board_init()board_init调用2个函数用于初始化定时器和设置各GPIO引脚功能,代码在arch/s3c2410/smdk.c中:main(int argc, char *argv) board_init()int board_init(void)init_time();/*arch/s3c2410/proc.c*/set_gpios();/*arch/s3c2410/smdk.creturn 0;init_time()

    10、 这个函数对寄存器进行了简单的操作:void init_time(void) TCFG0 = (TCFG0_DZONE(0) | TCFG0_PRE1(15) | TCFG0_PRE0(0); /*s3c2410 data sheet P298*/ /*TCFG0 = 0 | 0xf00 | 0 */寄存器TCFG0由三部分组成,prescaler0, prescaler1, deadzone和reserve四部分,前三部分分别对应 TCFG0_PRE0、TCFG0_PRE1、TCFG0_DZONE,TCFG0_PRE0(0)实际值为0x00,TCFG0_PRE1(15)实际值为0x0f00,

    11、而TCFG0_DZONE(0)实际值为 0x000000。实际中,vivi并未使用定时器,这个函数就能忽略。set_gpios()用于选择GPA至GPH端口各引脚的功能及是否使用各引脚的内部上拉电阻,并设置外部中断源寄存器EXTINT0-2(vivi中未使用外部中断)。void set_gpios(void)GPACON= vGPACON;GPBCON= vGPBCON;GPBUP= vGPBUP;GPCCON= vGPCCON;GPCUP= vGPCUP;GPDCON= vGPDCON;GPDUP= vGPDUP;GPECON= vGPECON;GPEUP= vGPEUP;GPFCON= v

    12、GPFCON;GPFUP= vGPFUP;14GPGCON= vGPGCON;15GPGUP= vGPGUP;16GPHCON= vGPHCON;17GPHUP= vGPHUP;18EXTINT0 = vEXTINT0;19EXTINT1 = vEXTINT1;20EXTINT2 = vEXTINT2;21以第三行为例,vGPACON的值为0x007fffff,查找s3c2410用户手册可知,该参数将GPACON的23位全部置1。各位功能需察看s3c2410用户手册。3、Step3:建立页表和启动MMUmem_map_init函数用于建立页表,vivi使用段式页表,只需要一级页表。他调用3个函

    13、数,代码在arch/s3c2410/mmu.c中:mem_map_init(void)void mem_map_init(void)#ifdef CONFIG_S3C2410_NAND_BOOT/*CONFIG_S3C2410_NAND_BOOT= y ,在文件include/autoconf.h中定义*/mem_map_nand_boot();/* 最终调用mem_mepping_linear, 建立页表 */#elsemem_map_nor();cache_clean_invalidate();/* 清空cache,使无效cache */tlb_invalidate();/* 使无效快表T

    14、LB */第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)?这样,对寄存器的操作

    15、跟未启动MMU时是相同的;再将SDRAM对应的64M空间的页表项修改为使用cache。mem_mapping_linear函数的代码在arch/s3c2410/mmu.c中:mem_map_init(void) mem_map_nand_boot( ) mem_mapping_linear(void)static inline void mem_mapping_linear(void)unsigned long pageoffset, sectionNumber;putstr_hex(MMU table base address = 0x, (unsigned long)mmu_tlb_bas

    16、e); /* 4G 虚拟地址映射到相同的物理地址. not cacacheable, not bufferable */ /* mmu_tlb_base = 0x33dfc000*/ for (sectionNumber = 0; sectionNumber 20) = pageoffset |MMU_SECDESC;/* make dram cacheable */* SDRAM物理地址0x3000000-0x33ffffff,DRAM_BASE=0x30000000,DRAM_SIZE=64Mfor (pageoffset = DRAM_BASE; pageoffset 1M) /DPRI

    17、NTK(3,Make DRAM section cacheable:0x%08lxn,pageoffset); *(mmu_tlb_base +(pageoffset 20) = pageoffset | MMU_SECDESC | MMU_CACHEABLE;20 mmu_init()函数用于启动MMU,他直接调用arm920_setup()函数。arm920_setup()的代码在arch/s3c2410/mmu.c中:mmu_init( ) arm920_setup( )static inline void arm920_setup(void)unsigned long ttb = MM

    18、U_TABLE_BASE;/* MMU_TABLE_BASE = 0x33dfc000 */_asm_( /* Invalidate caches */ mov r0,#0nmcr p15, 0, r0,c7, c7, 0n /* invalidate I,D caches on v4 */c7, c10, 4n/* drain write buffer on v4 */c8, c7, 0n /* invalidate I,D TLBs on v4 */* Load page table pointer */ r4, %0n p15, 0, r4, c2,c0, 0n /* load page

    19、 table pointer */* Write domain id (cp15_r3) */mvn /* Domains 0b01 = client, 0b11=Manager*/ p15, 0, r0, c3,/* load domain access register,write domain 15:0, 用户手册P548(access permissions)*/* Set control register v4 */mrc p15, 0, r0, c1, /* get control register v4 */*数据手册P545:read control register */* Clear out unwanted bits (then put themin if we need them) */* .VI .RS B. .CAM */*这些位的含义在数据手册P546*/bic r0, r0, #0x3000n.11 . . . */*I(bit12)=0 = Instruction cache disabled*/*Vbit13(Base location of exceptionregisters)=0 = Low addresses = 0x0000 0000*/22bic r0, r0,#0x0300n/* . .11 . . */


    注意事项

    本文(S3C2410 bootloader VIVI阅读笔记文档格式.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开