




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
U-Boot 闭看门狗,关闭中断,关MMU,cache,关闭RAM时钟,内存,加载U-Boot第二阶段代码到RAM空间//norflashnand设置好 //清空bss将内核从Flash到RAMU-Boot2.1U-Boot{.=;.=.text{cpu/arm920t/start.o(.text)board/samsung/mini2440/lowlevel_init.o(.text)board/samsung/mini2440/nand_read.o}…}}第一个的是cpu/arm920t/start.o,因此u-boot.bin的代码在cpu/arm920t/start.ocpu/arm920t/start.Scpu/arm920t/start.S .globl.globl_start: /*复位ldrpc, /*ldrpc, ldrpc,/*ldrpc, ldrpc,/*未使 ldrpc,/*irqldrpc,/*fiq/*中断向量 地址_undefined_instruction:.word_software_interrupt:.word_prefetch_abort:.word.word.word.word.word.balignl2.1ARM CPSRI0IRQ 其中复位异常向量的指令“bstart_code”决定了U-BootCPUSVC*setthecputoSVC32mrsr0,bicr0,r0,/*orrorrr0,r0, 位置1msrcpsr,以上代码将CPU的工作模式位设置为管理模式,并将中断位和快中断位置一,从而了IRQ和FIQ中断。#if#if#definepWTCON0x#defineINTMSK#define /*s3c2410s3c24404#definepWTCON/*WATCHDOG控制寄存器地 #defineINTMSK/*INTMSK#defineINTSUBMSK /*INTSUBMSK#define /*CLKDIVN#s3c2440WATCHDOG,INTMSK,INTSUBMSK,CLKDIVN器的地址的设置。各个寄存器地址参见参考文献[4]。ldrldrr0,=pWTCONmovr1,#0x0strr1,[r0]/*00,关闭看门狗。否则在U-Boot,CPU*maskallIRQsbysettingallbitsintheINTMR-movr1,#0xffffffff/*1ldrr0,strstrr1,SRCPN(##ifdefined(CONFIG_S3C2440)ldrr1,=0x7fffldrr0,strr1,[r0]#endifCPU4,INTSUBMSK3215写入0x7fff就是将INTSUBMSK寄存器全部有效位(低15位)置一,从而对应的中断。MPLLCON,UPLLCON,##ifdefined(CONFIG_S3C2440)#defineMPLLCON0x4C000004#defineUPLLCONldrr0,movr1,#5strr1,[r0]ldrr0,ldrr1,=0x7F021strr1,[r0]ldrr0,ldrr1,=0x38022strr1,[r0]#/*/*FCLK:HCLK:PCLK=1:2:4/*defaultFCLKis120MHz!*/ldrr0,=CLKDIVNmovr1,#3strr1,[r0]FinCLDIVNMPLCON,UPLLCON32.2S3C2440CLKDIVN位00:HCLK=01:HCLK=HCLKFCLK/4(CAMDIVN[9]0时HCLK=FCLK/8(CAMDIVN[9]1HCLKFCLK/3(CAMDIVN[8]0时HCLKFCLK/6(CAMDIVN[8]10:PCLK= 1:PCLK=0CLKDIVN5HDIVN10CAMDIVN[9]没有被改变过,取默=1:4:8MPLLCONFCLKFinMPLLCON[19:12]MDIV,位[9:4]称PDIV,位[1:0]SDIV。MPLL(FCLK)MPLL(FCLK)= 其中:MPLLCONUPLLCON4“PLLVALUESELECTIONTABLE表2.3PLL48.0022405.0021MPLLCON=(0x7f<<12)|(0x02<<4)|(0x01)=MPLLCON=(0x7f<<12)|(0x02<<4)|(0x01)=UPLLCON=(0x38<<12)|(0x02<<4)|(0x02)=关闭#ifndef#ifndefblcpu_init_critcpu_init_critU-BootU-BootRAM#ifndef#ifndef*cachecachemovr0,mcrp15,0,r0,c7,c7,/*c70ICacheDCachemcrp15,0,r0,c8,c7,/*c80TLB*disableMMUstuffandr0,r0,@setbit12(I)I-p15,0,c0,/*保存r0*beforerelocating,wehavetosetupRAM*becausememorytimingisboard-dependend,you*findalowlevel_init.Sinyourboardmovip,lr blmovlr,movpc,#endif/*CONFIG_SKIP_LOWLEVEL_INITmrcp15,0,r0,c1,c0,/*r0mrcp15,0,r0,c1,c0,/*r0bicr0,r0,@clearbits13,9:8(--Vbicr0,r0,@clearbits7,2:0 orrr0,r0,@setbit2(A)332~337MMUCP15c1CP152.3CP15c1(部分..VI..RSBCAMVV表示异常向量表所在的位置,0;1:I0ICaches;1:开启R、S:用来与页表中的描述符一起确定内存 权B:0:CPU;1CPUC:0DCaches;1A:0:数 M:0MMU;1:332~337c1MMMURAM45#define /*13 控制器的开始地址…129 .globl/*memorycontrolconfiguration45#define /*13 控制器的开始地址…129 .globl/*memorycontrolconfiguration/*maker0relativethecurrentlocationsothatit/*readsSMRDATAoutofFLASHratherthanmemory!r0,ldrr1,subr0,r0,/*SMRDATA_TEXT_BASE13ldrr1,=BWSCON/*BusWidthStatusControllerr2,r0,142 r3,r0],#4/*13r3,[r1],r2,/*everythingisfinenowmovpc,152/*theliteralpoolsorigin154/*13.word….word……U-BootNANDFlashNORFlash.text.text{cpu/arm920t/start.o(.text)board/samsung/mini2440/lowlevel_init.o(.text)board/samsung/mini2440/nand_read.o…}board/samsung/mini2440/lowlevel_init.oU-Boot4KB对于U-BootNORFlashU-BootU-Boot的地址,而此时U-Boot还在NORFlash中,因此还需要在NORFlash中数据到RAM中。FlashSMRDATA-TEXT_BASE综上所述,lowlevel_init的作用就是将SMRDATA开始的13个值给开始地址[BWSCON]的13个寄存器,从而完成了控制器的设置。(9)U-Boot第二阶段代码到cpu/arm920t/start.SNORFlashU-BootNORFlashNANDFlashblblbBootFrmNORFlash/*判断U-BootNANDFlashNORFlashcmpr0,/*r0bBootFrmNORFlash0NAND启动,否则表示在NORFlashbeq/*跳转到NANDFlash/*NORFlash /*NANDFlash/*NANDFlash/*int{volatileunsignedint*pdw=(volatileunsignedint*)0;unsignedintdwVal;bBootFrmNORFlashU-BootNANDFlashNORFlashNORFlash10ATPCSr0int{volatileunsignedint*pdw=(volatileunsignedint*)0;unsignedintdwVal;dwValdwVal=/**pdw=;if(*pdw!=)/*写入失败,说明是在NORFlash启 {return}{*pdw=/*return}}NORFlashNANDFlash0U-Boot对于从NANDFlash启动的情况,其开始4KB的代码会被自动到CPU内部4K内存中,Flash对于从NORFlash启动的情况,NORFlash的开始地址即为0,必须通过一定令序列才Flash下面来分析NORFlashadrr0,/*r0<-currentpositionof ldrr1,/*testifwerunfromflashorRAM/*判断U-Boot是否 到RAM中运行,若是,则不用 调试U-Bootcmpr0,r1/*_start等于_TEXT_BASE说明 到RAM中运行beq212/*以下直到nand_bootNORFlashldrr2,r3,/*r2<-sizeofr0,/*r2<-sourceend/*搬运U-BootRAM r0!,{r3-/*[r0NORFlash8 r1!,{r3-/*将r3至r10寄存器的数据给地址为[r1]的内untilsourceendaddreeebNANDFlashNANDFlashmovr1,ldrr2,=((7<<12)|(7<<8)|(7<<4)|(0<<0)strr2,r1, /*NFCONF/*设置NFCONT,初始化ECC编 NANDFlashldrr2,=((1<<4)|(0<<1)|(1<<0)strr2,[r1,ldrr2,/*NFSTATstrr2,[r1,/*NANDFlashmovr2,strbr2,[r1,#oNFCMD]movr3,#0ldrsp,DW_STACK_STARTmovfp,#0ldrr0, movr1,movr2,bltstr0,/*beqloop2:b //infinite.alignDW_STACK_START:.wordSTACK_BASE+STACK_SIZE-#define#defineNAND_CTL_BASE0x4E000000NANDFlash#defineSTACK_BASE//baseaddressof#defineSTACK_SIZE//sizeof#defineoNFCONF/*NFCONFNAND_CTL_BASE#defineoNFCONT/*NFCONTNAND_CTL_BASE#defineoNFADDR/*NFADDRNAND_CTL_BASE#defineoNFDATA/*NFDATANAND_CTL_BASE#define /*NFCMDNAND_CTL_BASE#defineoNFSTAT/*NFSTATNAND_CTL_BASE#define /*NFECCNAND_CTL_BASE代码中nand_read_ll函数的作用是在NANDFlash中搬运U-Boot到RAM,该函数在board/samsung/mini2440/nand_read.cNANDFlash根据page大小可分为2种:512B/page2048B/page的。这两种NANDFlash的读操作是不同的。因此就需要U-Boot识别到NANDFlash的类型,然后采用相应的读操作,也nand_read_llNANDFlash。参考S3C2440的可以知道:根据NFCONF寄存器的Bit3(AdvFlash(Readonly))Bit2(PageSize(Readonly))NANDFlashBit2、Bit3NANDFlashblock2.4NFCONFBit3、Bit2NANDFlashB010256512110242048NANDFlashintnand_read_ll(unsignedchar*buf,intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,int{NFCONFBit32NANDif(NFCONF&0x8/*Bit1,2KB/pageNANDFlash{2KblockNAND}{512BblockNAND}return}/*/*设置堆栈ldrr0,/*upper128KiB:relocated subr0,r0, /*mallocsubr0,r0,#CONFIG_SYS_GBL_DATA_SIZE/*跳过全局数据区#ifdefsubr0,r0,subsp,r0,/*leave3wordsforabort- 2.2U-BootBSSldrr0,/*BSSu-boot.ldsldrr1,/*BSSu-boot.ldsmovr2,clbss_l:strr2,/*bssaddr0,r0,cmpr0,r1bleldrldrpc,_start_armboot:.word start_armboot函数在lib_arm/board.c中定义,是U-Boot第二阶段代码的。U-Boot2.3U-Bootgd_ttypedeftypedefstructglobal_dataunsigned unsigned unsignedlong /*serial_init()wascalled*/unsignedlong /*AddressofEnvironmentstruct*/unsignedlong /*ChecksumofEnvironmentvalid?*/unsignedlong fb_base;/*baseaddressofframebuffer*//*jumptable}#define#define registervolatilegd_t*gdasmDECLARE_GLOBAL_DATA_PTRgd_t存器r8中。这个也避免编译器把r8分配给其它的变量。任何想要全局数据区的代码,只要代码开头加入“DECLARE_GLOBAL_DATA_PTR”一行代码然后就可以使用gd指针来全局根据U-Bootgdgdgd=TEXT_BASE-CONFIG_SYS_MALLOC_LEN-bd_ttypedeftypedefstructbd_info/*unsigned /*IPstruct/*bi_arch_number;/*bi_boot_params;/*/*RAM{ulongulongstart;ulongsize;}init_sequencetypedefint(init_fnc_t)init_fnc_t*init_sequence[]=/*typedefint(init_fnc_t)init_fnc_t*init_sequence[]=/*cpu/arm920t/s3c24x0/timer.cmon/env_flash.c或 /*lib_arm/board.c/*drivers/serial/serial_s3c24x0.cconsole_init_f,/*1common/console.cdisplay_banner,/*U-Bootgeditlib_arm/board.c/*RAMboard/samsung/mini2440/mini2440.c/*RAMlib_arm/board.c/*/*MINI2440gd->bd->bi_arch_number=/*gd->bd->bi_boot_paramsgd->bd->bi_boot_params= dram_initboard/samsung/mini2440/mini2440.cintintdram_init{/*由于mini2440gd->bd->bi_dram[0].start=gd->bd->bi_dram[0].size=return}mini2440使用2片32MB的SDRAM组成了64MB的内存,接在控制器的BANK6,地址空间是0x 在include/configs/mini2440.h中PHYS_SDRAM_1和PHYS_SDRAM_1_SIZE 和 voidvoidstart_armboot{init_fnc_t**init_fnc_ptr;char*s;…/*gdgd=(gd_t*)(_armboot_start-CONFIG_SYS_MALLOC_LEN-…memset((void*)gd,0,sizeofgd->bd=(bd_t*)((char*)gd-sizeof(bd_t));memset(gd->bd,0,sizeof(bd_t));gd->flags|= monitor_flash_len=_bss_start-/*init_sequencefor(init_fnc_ptr=init_sequence;*init_fnc_ptr;++init_fnc_ptr)if((*init_fnc_ptr)()!=0)hang}}/*armboot_start在cpu/arm920t/start.S中被初始化为u-boot.lds连 mem_malloc_init(_armboot_start-/*NORFlash#ifndef/*configureavailableFLASHbanksdisplay_flash_config(flash_init#endif/*CONFIG_SYS_NO_FLASH…/*NANDFlash#ifputs("NAND: /*goinittheNAND…/*env_relocate…/*IPgd->bd->bi_ip_addr=getenv_IPaddrstdio_init /*getthedeviceslistgoing.jumptable_init…console_init_r /*fullyinitconsoleasadevice…/*enableexceptionsenable_interrupts#ifdef/*Initializefromenvironmentif((s=getenv("loadaddr"))!=NULL)load_addr=simple_strtoul(s,NULL,}#ifif((s=getenv("bootfile"))!=NULL)copy_filename(BootFile,s,sizeof}…/*#if#ifputs ……/*main_loop()canreturntoretryautoboot,ifsojustrunitagain.*/for(;;){main_loop}/*NOTREACHED-nowayoutofcommandloopexceptbooting}structtag_headeru32 /*taguu32/*structtagstructtag_headerhdr;union{structstructtag_headeru32 /*taguu32/*structtagstructtag_headerhdr;union{struct structtag_mem32structstruct structtag_initrd structtag_serialnrserialnr;structtag_revisionstructstructstruct Acornstructtag_acornDC21285struct }intdo_bootm_linux(intflag,intargc,char*argv[],bootm_headers_t{intdo_bootm_linux(intflag,intargc,char*argv[],bootm_headers_t{bd_t*bd=gd-charintmachid=bd-void(*theKernel)(intzero,intarch,uint #ifdefchar*commandlinegetenv("bootargs");/*U-Bootbootargs …theKernel=(void(*)(int,int,uint))images->ep;/*获取内 地址… #ifdefined(CONFIG_SETUP_MEMORY_TAGS)||defined(CONFIG_CMDLINE_TAG)||defined(CONFIG_INITRD_TAG)||defined(CONFIG_SERIAL_TAG)||defined(CONFIG_REVISION_TAG)||defined(CONFIG_LCD)||definedsetup_start_tag…100#ifdefsetup_memory_tags/*#ifdefmandline_tag(bd,commandline);/*105…setup_end_tag/*weassumethatkernelisinplace printf("\nStartingkernel… cleanup_before_linux /*CPUtheKernel(0,machid,bd-/*/*doesnotreturnreturn}staticstaticvoidsetup_start_tag(bd_t{params(structtag*)bd->bi_boot_params;/*params->hdr.tag=params->hdr.size=tag_sizeparams->u.core.flags=params->u.core.pagesize=params->u.core.rootdev=params=tag_next}ATAG_COREstaticstaticvoidsetup_memory_tags(bd_t{int/*for(i=0;i<CONFIG_NR_DRAM_BANKS;i++)params->hdr.tag=params->hdr.size=tag_sizeparams->u.mem.start=bd->bi_dram[i].start;params->u.mem.size=bd->bi_dram[i].size;paramsparams=tag_next}}setup_memory_tagsATAG_MEMstaticstaticvoidsetup_end_tag(bd_t{params->hdr.tag=ATAG_NONE;params->hdr.size=0;}CPUr1=r2=内核参数标记列表在RAMCPUIRQ与FIQ中CPU为SVC使数据Cache与指令Cacheintcleanup_before_linux{thisfunctioniscalledjustbeforeintcleanup_before_linux{thisfunctioniscalledjustbeforewecallitpreparestheprocessorfor***weturnoffcachesetcdisable_interrupts/*turnoffI/D-cache/*flushI/D-cache/*Cachereturn}由于U-BootSVCCPUvoid(*theKernel)(intzero,intarch,uint… theKernel=(void(*)(int,int,uint))images-…theKernel(0,machid,bd-4r0~r341280r0machidr1bd->bi_boot_paramsr2,从而完U-Boot添加命令的方法及U-Boot下面以添加命令(启动菜单)为例讲解U-Boot添加命令的方法建立 定义“”命 3,0, "-display ,toselecttheitemstodo"-display,toselecttheitemstodo在内存中保存命令的help字段会占用一定的配置U-Boot可以选择是否保存help字段。若在include/configs/mini2440.h中定义了CONFIG_SYS_LONGHELP宏,则在U-Boot中使用help命令查看某个命令的帮助信息时将显示usagehelp字段的内容,否则就只显示usage #define#defineU_BOOT_CMD(na
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多源遥感数据的气象灾害预警融合应用研究-洞察及研究
- 三年级信息技术上册 第一课《信息与我们的计算机朋友》说课稿 川教版
- 3口字旁与日字旁教学设计-2025-2026学年小学书法苏少版四年级上册-苏少版
- Unit 8 What Can We Do to Protect Our Environment教学设计-2025-2026学年高中英语冀教版选修十-冀教版2004
- 2024-2025学年高中历史 专题三 第二次世界大战 一 第二次世界大战前夜(2)教学说课稿 人民版选修3
- 2025年呼吸内科哮喘患者的治疗方案考核试卷答案及解析
- 网格员食品安全培训课件
- 2025年肿瘤科治疗方案综合评估模拟测试卷答案及解析
- 其他系统疾病患儿的护理说课稿-2025-2026学年中职专业课-儿科护理-医学类-医药卫生大类
- 地标性建筑-自制方案设计(3篇)
- 考研保录取合同
- CJ∕T 453-2014 地铁隧道防淹门
- 2019译林版高中英语全七册单词总表
- 《湖北省安全生产条例》考试复习题库80题(含答案)
- 《义务教育语文课程标准》(2022年版)原文
- 《建筑防排烟工程》 课件 1火灾烟气的产生及危害
- 墙体 砌块墙的构造(建筑构造)
- 离网光伏发电系统方案
- 研学旅行教师指导手册
- 锂资源行业的合规管理与风险控制
- 电商运营专员劳动合同
评论
0/150
提交评论