2440启动步骤
- 格式:docx
- 大小:10.35 KB
- 文档页数:2
mini2440 root_qtopia 文件系统启动过程分析(转载)对于mini2440最新的root_qtopia文件系统启动过程,我在这里做了一些简单的分析,和大家分享一下经验,不足之处也请大家及时指出。
其实,虽然root_qtopia这个文件系统的GUI是基于Qtopia的,但其初始化启动过程却是由大部分由busybox完成,Qtopia(qpe)只是在启动的最后阶段被开启。
由于默认的内核命令行上有init=/linuxrc, 因此,在文件系统被挂载后,运行的第一个程序是根目录下的linuxrc。
这是一个指向/bin/busybox的链接,也就是说,系统起来后运行的第一个程序也就是busybox 本身。
这种情况下,busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox 源代码init/init.c中的parse_inittab()函数)。
而事实上,root_qtopia中并没有/etc/inittab这个配置文件,根据busybox的逻辑,它将生成默认的配置复制代码1. static void parse_inittab(void)2. {3. #if ENABLE_FEATURE_USE_INITTAB4. char *token[4];5. parser_t *parser = config_open2("/etc/inittab", fopen_for_read);6.7. if (parser == NULL)8. #endif9. {10. /* No inittab file -- set up some default behavior */11. /* Reboot on Ctrl-Alt-Del */12. new_init_action(CTRLALTDEL, "reboot", "");13. /* Umount all filesystems on halt/reboot */14. new_init_action(SHUTDOWN, "umount -a -r", "");15. /* Swapoff on halt/reboot */16. if (ENABLE_SWAPONOFF)17. new_init_action(SHUTDOWN, "swapoff -a", "");18. /* Prepare to restart init when a QUIT is received */19. new_init_action(RESTART, "init", "");20. /* Askfirst shell on tty1-4 */21. new_init_action(ASKFIRST, bb_default_login_shell, "");22. //TODO: VC_1 instead of ""? "" is console -> ctty problems -> angry users23. new_init_action(ASKFIRST, bb_default_login_shell, VC_2);24. new_init_action(ASKFIRST, bb_default_login_shell, VC_3);25. new_init_action(ASKFIRST, bb_default_login_shell, VC_4);26. /* sysinit */27. new_init_action(SYSINIT, INIT_SCRIPT, "");28. return;29. }其中,最重要的一个,就是new_init_action(SYSINIT, INIT_SCRIPT, ""),也就决定了接下去初始化的脚本是INIT_SCRIPT所定义的值。
NandFlash原理与启动详解一、Nandflash内部是怎么工作的:1片Nandflash=1设备;1设备=4096块;1块=32页;1页=528字节=数据大小(512字节)+oob块大小(16字节)(oob用于Nandflash命令执行完成后设置状态)可以通过NAND Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位,通过NAND Flash内置的指针指向各自的首地址。
存储操作特点有:擦除操作的最小单位是块;NAND Flash芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦除(擦除即是将相应块的位全部变为1);OOB部分的第6字节(即517字节)标志是否是坏块,值为FF时不是坏块,否则为坏块。
除OOB第6字节外,通常至少把OOB的前3字节用来存放NAND Flash硬件ECC码。
(ECC:"Error Correcting Code" "错误检查纠正",带有奇偶校验的内存的主要功能。
)1.Nand flash以page为单位进行读写,以block为单位进行擦除,没页分为main区和spare区,main区用于存放正常的数据,spare区用于存放一些附加信息2.S3c2440 支持从Nand 启动是因为内部有一个叫做Steppingstone的SRAM buffer,当启动的时候,nand 的前4k的将会代码将被拷贝到steppingstone中执行,注意前4k代码是不会经过ECC校验的,所以必须确保这些代码的准确3.对nand的操作都是通过使用命令来实现,有的操作只要一个命令就可以完成,而有的需要两个命令才能完成,下面是K9F1G08U0B的命令表:4 Flash烧写程序原理及结构基本原理:将在SDRAM中的一段存储区域中的数据写到NAND Flash存储空间中。
烧写程序在纵向上分三层完成。
mini2440使用uboot(详细)文章出处:/swgshj/archive/2010/04/20/5502121.aspx文章写于2010.4.17,总结了友善之臂的mini2440开发板使用自带uboot的具体方法,希望能对正在使用mini2440开发板,而且又想使用uboot引导系统的朋友们有所帮助。
Google一下会发现网上类似的帖子不少,但是对mini2440开发板是哪一个版本都没有具体的说明,个人感觉mini2440开发板的版本是经常更新的,可能不同的版本的开发板在移植uboot时会稍有不同,因此这里我把自己使用的开发板的详细信息都罗列一下,希望网友少走弯路。
另外,要感谢illidan和Martin两位的文章:/2009/05/mini2440使用u-boot//bbs/viewthread.php?tid=14使用的mini2440开发板的详细信息:kernel:linux-2.6.29-mini2440-20090708.tgzgcc:arm-linux-gcc-4.3.2.tgzuboot:bootloader.tgz(该压缩包内含有u-boot-1.1.6)roots:root_qtopia-64M.img问题源于:(1)使用128M NAND Flash mini2440开发板的用户都知道,此时开发板附带的supervivi-64M和supervivi-128M都不再支持“空格”进入supervivi的menu菜单,而是改成了使用开发板上的k1~k6任何一个按键触发进入menu(而我需要空格键触发menu的方式);(2)开发板附带的supervivi不支持网络下载kernel和root(文件系统)。
具体的修改步骤如下:注1:arm-linux-gcc的安装方法见《mini2440-um-20090817.pdf》第5.3小节。
注2:mini2440开发板附带的uboot源码已经是经过移植的,适用s3c2440处理器,我们只需要修改一些uboot参数即可。
凌FL2440超详细U-BOOT作业(UBoot介绍+H-jtag使用+Uboot使用)Bootloader是高端嵌入式系统开发不可或缺的部分。
它是在操作系统内核启动之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
现在主流的bootloader有U-BOOT、vivi、Eboot等。
本次作业先做Uboot的烧写吧。
希望通过这个帖子,能让更多的初学者朋友了解一些UBoot的知识,也希望高手朋友对我的不足予以斧正。
首先说一下什么是Uboot:U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FAD SROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linu x系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
(流程管理)U启动流程(国嵌视频培训)20XX年XX月峯年的企业咨询咸问经验.经过实战验证可以藩地执行的卓越萱理方案.值得您下载拥有U-Boot 启动过程(国嵌2440 培训)开发板上电后,执行U-Boot 的第壹条指令,然后顺序执行U-Boot 启动函数。
见壹下board/smdk2410/u-boot.lds 这个链接脚本,能够知道目标程序的各部分链接顺序。
第壹个要链接的是cpu/arm920t/start.o ,那么U-Boot 的入口指令壹定位于这个程序中。
下面分俩阶段介绍启动流程:第壹阶段1 .cpu/arm920t/start.S这个汇编程序是U-Boot 的入口程序,开头就是复位向量的代码。
_start:breset// 复位向量ldrpc,_undefined_instructionldrpc,_software_interrupt ldrpc,_prefetch_abortldrpc,_data_abort ldrpc,_not_used ldrpc,_irq// 中断向量ldrpc,_fiq// 中断向量/*theactualresetcode*/reset:// 复位启动子程序/* 设置CPU 为SVC32 模式*/mrsr0,cpsrbicr0,r0,#0x1forrr0,r0,#0xd3msrcpsr,r0/* 关闭见门狗*/relocate:/* 把U-Boot 重新定位到RAM*/ adrr0,_start/*r0 是代码的当前位置*/ ldrr1,_TEXT_BASE/*_TEXT_BASE 是RAM 中的地址*/ cmpr0,r1/* 比较r0 和r1 ,判断当前是从Flash 启动,仍是RAM*/beqstack_setup/* 如果r0 等于r1 ,跳过重定位代码*/ /* 准备重新定位代码*/ldrr2,_armboot_start ldrr3,_bss_start subr2,r3,r2/*r2 得到armboot 的大小*/ addr2,r0,r2/*r2 得到要复制代码的末尾地址*/ copy_loop:/* 重新定位代码*/ldmiar0!,{r3-r10}/* 从源地址[r0] 复制*/ stmiar1!,{r3-r10}/* 复制到目的地址[r1]*/ cmpr0,r2/* 复制数据块直到源数据末尾地址[r2]*/ blecopy_loop/* 初始化堆栈等*/ stack_setup:ldrr0,_TEXT_BASE/* 上面是128KiB 重定位的u-boot*/subr0,r0,#CFG_MALLOC_LEN/* 向下是内存分配空间*/subr0,r0,#CFG_GBL_DATA_SIZE/* 然后是bdinfo 结构体地址空间*/#ifdefCONFIG_USE_IRQsubr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZ E_FIQ) #endif subsp,r0,#12/* 为abort-stack 预留 3 个字*/ clear_bss:ldrr0,_bss_start/* 找到bss 段起始地址*/ ldrr1,_bss_end/*bss 段末尾地址*/ movr2,#0x00000000/* 清零*/clbss_l:strr2,[r0]/*bss 段地址空间清零循环...*/ addr0,r0,#4cmpr0,r1 bneclbss_l/* 跳转到start_armboot 函数入口,_start_armboot 字保存函数入口指针*/ldrpc,_start_armboot_start_armboot:.wordstart_armboot//start_armboot 函数于lib_arm/board.c 中实现第二阶段2 .lib_arm/board.cstart_armboot 是U-Boot 执行的第壹个 C 语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令。
------------------------------------------------------------------------------------------------------s3c2440启动文件详细分析启动文件就是引导ARM启动,并进入我们熟悉的C语言程序。
它主要完成了ARM 最基本的硬件初始化工作。
虽然启动文件的内容大同小异(就是设置系统时钟、内存、中断向量表、栈等内容),而且只要有一个现成的启动文件,即使不用详细了解该文件的内容,直接进入C语言编程工作也可以对ARM进行操作,但我认为熟悉启动文件的内容,还是有必要的,它对我们熟悉ARM的体系结构,编写出更高效的程序是大有益处的。
因此我花了一些时间详细分析了s3c2440启动文件的内容,让它作为我进入ARM领域研究的开端,希望能有一个好的起点,为以后的研究打下基础。
下面就是我对s3c2440启动文件的分析,标注了较详细的注解,不仅有我对启动文件的理解,同时也查阅其他网友的相关文章。
理解不对的地方还望大家指正!; NAME: 2440INIT.S; DESC: C start up codes; Configure memory, ISR ,stacks; Initialize C-variables;=========================================;GET类似于C语言的include,option.inc文件内定义了一些全局变量,memcfg.inc文件内定义了关于内存bank的符号和数字常量,2440addr.inc文件内定义了用于汇编的s3c2440寄存器变量和地址GET option.incGET memcfg.incGET 2440addr.inc;SDRAM自刷新位,把寄存器REFRESH的第22位处置1BIT_SELFREFRESH EQU (1<<22);CPSR中的低5位定义了处理器的七种工作模式,为以后切换模式时使用;Pre-defined constantsUSERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1f;CPSR中的I位和F位置1,表示禁止任何中断NOINT EQU 0xc0;定义了7种处理器模式下的栈的起始地址,其中用户模式和系统模式共有一个栈空间;_STACK_BASEADDRESS在option.inc文件内定义,值为0x33ff8000;The location of stacksUserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~ UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~ AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~;ARM处理器的两种工作状态:16位和32位;编译器有相对应的用16位和32位两种编译方式;这段的目的是统一目前的处理器工作状态和软件编译方式;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.GBLL THUMBCODE ;声明一个全局逻辑变量[ {CONFIG} = 16 ;if CONFIG == 16THUMBCODE SETL {TRUE} ;THUMBCODE = TRUECODE32 ;指示编译器为ARM指令| ;elseTHUMBCODE SETL {FALSE} ;THUMBCODE = FALSE];宏定义,在后面出现MOV_PC_LR时,这个宏会被自动展开;该宏的作用是跳出子程序,返回被调用处MACROMOV_PC_LR[ THUMBCODE ;if THUMBCODE == TRUEbx lr| ;else 即THUMBCODE == FALSEmov pc,lr]MEND;该宏定义的作用是有条件地(当Z=1时)跳出子程序,返回被调用处MACROMOVEQ_PC_LR[ THUMBCODEbxeq lr|moveq pc,lr]MEND;该宏定义是把中断服务程序的首地址装载到pc中;在后面当遇到HandlerXXX HANDLER HandleXXX时,该宏被展开;注意:HANDLER前的符号HandlerXXX比其后的符号HandleXXX多了一个r;HandlerXXX为ARM体系中统一定义的几种异常中断;HandleXXX为每个ARM处理器各自定义的中断,见该文件最后部分的中断向量表MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabelsub sp,sp,#4 ;A TPCS规定数据栈为FD类型;即栈指针指向栈顶元素,数据栈向内存地址减小的方向增长;该语句是使栈地址减小4个字节,以留出空间装载中断服务函数首地址stmfd sp!,{r0} ;由于要利用r0寄存器来传递数据,所以要保存r0数据,使其入栈ldr r0,=$HandleLabel ;把HandleXXX的地址装到r0ldr r0,[r0] ;装载中断服务函数的起始地址str r0,[sp,#4] ;中断函数首地址入栈ldmfd sp!,{r0,pc} ;将事先保存的r0数据和中断函数首地址出栈;并使系统跳转到相应的中断处理函数MEND;导入连接器事先定义好的运行域中三个段变量;ARM的可执行映像文件由RO、RW、ZI三个段组成;RO为代码段,RW为已初始化的全局变量,ZI为未初始化的全局变量IMPORT |Image$$RO$$Base| ;RO段起始地址IMPORT |Image$$RO$$Limit| ;RO段结束地址加1,等于RW段起始地址IMPORT |Image$$RW$$Base| ;RW段起始地址IMPORT |Image$$ZI$$Base| ;ZI段起始地址IMPORT |Image$$ZI$$Limit| ;ZI段结束地址加1;导入两个关于MMU的函数,用于设置时钟模式为异步模式和快速总线模式IMPORT MMU_SetAsyncBusModeIMPORT MMU_SetFastBusMode ;;导入Main,它为C语言程序入口函数IMPORT Main ; The main entry of mon program;导入用于复制从Nand Flash中的映像文件到SDRAM中的函数IMPORT RdNF2SDRAM ; Copy Image from Nand Flash to SDRAM;定义代码段,名为InitAREA Init,CODE,READONLY;在入口处(0x0)开始的8个字单元空间内,存放的是ARM异常中断向量表,每个字单元空间都是一条跳转指令,当异常发生时,ARM会自动跳转到相应的中断向量处,并由该处的跳转指令再跳转到相应的执行函数处ENTRY;程序入口处EXPORT __ENTRY;导出__ENTRY,即导出代码段入口地址__ENTRY;主要用于MMUResetEntry;1)The code, which converts to Big-endian, should be in little endian code.;2)The following little endian code will be compiled in Big-Endian mode.; The code byte order should be changed as the memory bus width.;3)The pseudo instruction,DCD can not be used here because the linker generates error. ;在0x0处的异常中断是复位异常中断,是上电后执行的第一条指令;变量ENDIAN_CHANGE用于标记是否要从小端模式改变为大端模式,因为编译器初始模式是小端模式,如果要用大端模式,就要事先把该变量设置为TRUE,否则为FLASE;变量ENTRY_BUS_WIDTH用于设置总线的宽度,因为用16位和8位宽度来表示32位数据时,在大端模式下,数据的含义是不同的;由于要考虑到大端和小端模式,以及总线的宽度,因此该处看似较复杂,其实只是一条跳转指令:当为大端模式时,跳转到ChangeBigEndian函数处,否则跳转到ResetHandler函数处ASSERT :DEF:ENDIAN_CHANGE ;判断是否定义了ENDIAN_CHANGE;如果没有定义,则报告该处错误信息[ ENDIAN_CHANGE ;if ENDIAN_CHANGE ==TRUEASSERT :DEF:ENTRY_BUS_WIDTH ;判断是否定义了ENTRY_BUS_WIDTH;如果没有定义,则报告该处错误信息[ ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH ==32;跳转到ChangeBigEndian(ChangeBigEndian在0x24),因此该条指令的机器码为0xea000007;所以该语句与在该处(即0x0处)直接放入0xea000007数据(即DCD 0xea000007)作用相同b ChangeBigEndian][ ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH ==16;在小端模式下,用16位或8位数据总线宽度表示32位数据,与用32位总线宽度表示32位数据,格式完全一致。
jz2440开发板玩法话说,开发板的资料⽬录乱得让⼈头⽪发⿇,最后发现 \开发板资料\百问⽹精智JZ2440开发板4.3⼨LCD版使⽤⼿册.pdf 是关键⽹页资料:驱动安装驱动⽂件⽬录路径别太长,否则windows会报错:系统找不到指定的⽂件百问⽹的新版 Jz2440 v3.0,插上电源线Windows:{禁⽤驱动签名} 排线⼝ (被识别成两个USB<=>JTAG&RS232+⼀个USB Serial Port)micro USB Serial 串⼝的 Prolific USB-to-Serial Comm Port 会被系统⾃动更新安装micro USB Devices 设备开机模式下的DNW驱动 SEC S3C2410X Test B/D找了很久,最后发现可以直接⽤开源⼯具全部⼀键安装。
这⾥附上2.5版本附上:驱动安装完成排线是三个 OPENJTAG设备(USB Serial Port + 100ASK JTAG + 100ASK Serial Port )靠近⽹线⼝的是 micro USB Serial 串⼝ Prolific USB-to-Serial Comm Port在usb串⼝旁边的是 Micro USB Devices SEC S3C2410X Test B/D,这个设备偶尔会报错, 且会受VMware的影响,重开开发板/虚拟机就可以了(最好是插线开机后再开虚拟机)可以调整COM端⼝号,双击设备,端⼝设置-⾼级,设置为COM1编译 Bootloader 和操作系统Bootloader选⽤ U-Boot,操作系统选⽤ Linux-arm交叉编译ARM版的U-Boot,及插桩打补丁因为虚拟⽹卡出了问题,⼜刚好有个分区没⽤到,所以直接放uboot等源码⽂件并映射成虚拟磁盘给VMware⽤了。
注意:如果按任意键召唤不了uboot菜单,那么建议断开usb,先插电开机再串⼝调试,按开发板的RESET键重启准备交叉编译环境推荐做完以下步骤后,试试⾃⼰搭建交叉编译环境及其鉴于国内垃圾GFW⽹络,在此提供官⽹下的⽆修改压缩包⽤资料提供的古⽼的ubuntu9.10.......,当然我在评论区放了Ubuntu18.04的使⽤⽅案把这个arm-linux-gcc包解压到根⽬录,然后编辑环境变量sudo tar -xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /optsudo vi /etc/profile在末尾添加如下export PATH=$PATH:/opt/gcc-3.4.5-glibc-2.3.6/bin按ESC,输⼊:wq保存退出刷新环境变量配置source /etc/profile**注: ** 如果之前使⽤了其他版本的gcc,那么应该关闭终端窗⼝后重新打开,并source /etc/profile,否则make⾥的gcc变量依然是之前的版本如果希望⾃定义交叉编译环境,可以⽤export 设置仅在当然终端窗⼝⽣效的临时全局变量,或者在原 make 命令后接上如 CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- ⽤于指定编译器路径及其前缀插桩编译 Uboottar xjf u-boot-1.1.6.tar.bz2cd u-boot-1.1.6/patch -p1 < ../u-boot-1.1.6_jz2440.patch使⽤配置并⼀键编译make 100ask24x0_configmake或者指定交叉编译⼯具链前缀路径变量make ARCH=arm CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- 100ask24x0_configmake CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-插桩编译 Linux2.6tar xjf linux-2.6.22.6.tar.bz2cd linux-2.6.22.6patch -p1 < ../linux-2.6.22.6_jz2440.patchmake s3c2410_defconfig #如果不想⽤现成的config_ok,可以基于uboot提供的2410⾃⼰修改(⽅案1)cp config_ok .config #直接使⽤100ask官⽅做好的配置(⽅案2)make menuconfig #配置菜单(可选)make uImage烧写开发板⽤ oflash 烧写⼯具将U-boot.bin写⼊开发板的 Nor Flash (通过 OpenJTAG 排线接⼝)通过 USB 串⼝⽤终端命令和开发板交互(数字电路原理:信息本质都是通过电信号传输的,所以和⽹络ssh本质上也没有差别,和ssh⼀样操作命令就⾏) 记得设置波特率为115200并关闭流控(Flow Control),然后重开终端窗⼝可以通过串⼝操作Uboot,利⽤Uboot提供的 [k]Download linux kernel uImage来将嵌⼊式操作系统如Linux2.6写⼊开发板接上两根usb,⽤新建串⼝终端,>Transmit选择编译好的uImage烧写即可。
Arm启动流程解析谈到arm 的启动流程不得不说的是bootloader,但是我这篇文章主要来谈谈arm 启动流程的,所以bootloader 只是跟大家简介一下就ok。
这篇文章我会谈到以下内容:1、bootloader 简介以及其作用2、2440、6410、210 当下比较常见的3 款处理器的启动流程进行简单分析,通过这三款处理器的分析希望大家掌握arm 处理器的启动分析。
Ok 我们进入主题lBootloader 简介及其作用在我看来bootloader 的作用是初始化必要的硬件,引导内核启动。
(当然这是主要作用,今天的重点不在bootloader,所以在我后面的博文会继续谈到的)l 启动流程分析在分析启动流程的时候我们将会使用的文档是三星公司提供的芯片手册,通过手册我们搞清楚芯片的启动。
在分析启动流程之前我们首先要清楚不论是arm 的何种处理器,其都是从0x0 0 地址处开始执行程序的。
下面的分析我将会通过三个方面:1、芯片支持的启动方式2、地址布局3、启动流程1.2440a)启动方式由上图可知,S3C2440 支持两种启动模式:NAND 和非NAND(这里是Nor Flash),具体采用的方式取决于OM0、OM1 两个引脚的状态。
b)地址布局我们知道arm 从0 地址出运行代码那么我们的零地址处到底存放的是什么东西呢?我们通过地址布局图来分析从上图我们可以清楚的看到左边的是从Nor Flash 启动的地址布局,右边是从NAND 启动的地址布局,因为Nor Flash 内可以运行程序,所以我们在放bootloader 的时候放在0 地址处即可,所以我们重点分析从NAND 启动。
c)启动流程我们从地址布局图中可以看到,当我们从NAND 启动的时候0 地址处是BootSRAM(又叫做stepping stone 垫脚石),当我们上电时其会做以下事情1.上电后处理器自动将nandflash 前4KB的内容到boot sram 开始执行(由硬件完成)。
2440启动步骤
S3C2440 支持两种启动方式:NAND FLASH 和NOR FLASH。
网上有很多
文章分析TQ2440 的启动文件2440init.s。
介绍的很详细,我这里只是把
S3C2440 上电后的程序流程描述下。
不管在哪种启动方式下,ARM 上电启动
都是从0X00000000 开始运行。
下面是复位程序入口。
AREA
Init,CODE,READONLYENTRYResetEntryb ResetHandlerResetEntry 的值在ARM 上电运行时是0X00000000,在JTAG 仿真时是0X30000000。
这个值很关键,
在拷贝程序时会用到。
从NAND FLASH 启动时,在ARM 上电时,ARM 会自
动把NAND FLASH 前4K 的内容拷贝到S3C2440 内部SRAM 中,同时把SRAM 的地址映射到0X00000000。
ARM 上电后会从SRAM 处开始运行。
从NOR FLASH 启动时,因为NOR FLASH 接在bank0。
地址映射是
0X00000000。
所以ARM 上电后直接运行NOR FLASH 里的程序。
此时
S3C2440 内部SRAM 地址为0X40000000。
在ARM 上电的情况下,流程如下:1、关闭看门狗,关闭所有中断。
2、
设置系统工作频率,FCLK,HCLK,PCLK,UCLK。
3、初始化内存控制寄存器,
初始化参数在段SMRDATA 里定义。
SDRAM 初始化在这里处理。
4、在开发
板上电时,按住接在EINT0 脚上的按键会清零64MSDRAM。
5、初始化堆栈
6、读OM0,OM1 引脚状态,判断是从NAND FLASH 启动还是从NOR FLASH 启动。
如果是从NAND FLASH 启动,把NAND FLASH 的代码拷贝到SDRAM 中,接着程序开始在SDARM 中运行。
然后初始化数据段,最后跳转
到main()函数开始运行。
如果是从NOR FLASH 启动,判断ResetEntry 值和BaseOfROM 值是否相等,BaseOfROM 值是在ADS 里定义的RO BASE,如果定义为0X30000000,因为ARM 上电ResetEntry 值为0,所以接下来程序会把。