iTop4412的uboot第一阶段
解析迅为三星iTOP解析迅为三星iTOP-4412开发板硬件接口功能

解析迅为三星iTOP-4412开发板硬件接口功能本帖最后由xunwei 于2014-1-9 15:18 编辑iTOP-4412开发板底板iTOP-4412开发板提供了丰富的底板外设,标配WIFI和蓝牙模块,连接LCD或HDMI 显示器可实现通过无线wifi进行视频播放:下面对底板功能模块分别进行相关阐述:1、以太网接口通过一条RJ45线,连接这个接口到PC或者路由器,甚至到另外一个开发板,可实现有线以太网络通讯。
连接成功以后,两台机器的IP地址要设置在同一个网段,即同一个子网(例如:192.168.0.x),这样双方就可以通过PING命令来通讯了:ping 192.168.0.88至此,上层应用可以通过socket协议实现端到端的数据通讯,完成各种网络应用。
网络接口芯片采用LAN9215,这颗芯片稳定可靠,适合工业应用,通过16位数据总线以及6位地址总线与处理器交换数据,在通讯速率等方面要优于其他方案。
2、HDMIExynos 4412内置HDMI控制器,不需要外接转换芯片即可输出高性能1080P高清影像:该接口可以与LCD接口同步输出,没有购买LCD的用户可以直接使用HDMI接口连接普通显示器或者电视,显示效果十分理想,软件稍作调整,就是一个高性能的机顶盒了,如下图:3、WIFI与蓝牙WIFI和蓝牙由同一颗芯片来实现,三星自家模组:开发板出厂时会标配这个模组,以方便用户使用。
WIFI和蓝牙共享一颗天线,通过分时切换的方式兼顾两者应用,这样做并不会影响速度,而且成了平板或者手机设计的传统做法。
4、LCD接口如上图所示,左边是TP触摸屏接口,右边是LVDS标准的LCD接口,上面的芯片将RGB信号转换成LVDS;为了兼容RGB接口的屏幕,在开发板的背面引出同规格的兼容RGB标准的液晶接口;配套开发板使用的是款9.7寸LCD屏幕,与IPAD 屏幕大小及规格兼容,TP为十点触控:5、触摸屏TP接口开发板留出了单独的触摸屏TP接口,配套TP支持十点触控操作。
uboot框架熟悉(一)itop4412-uboot2015引导阶段程序在各存储介质的分布

uboot框架熟悉(⼀)itop4412-uboot2015引导阶段程序在各存储介质的分布 本⽂分析itop4412开发板在uboot引导启动阶段,程序在各存储介质的分布情况,为理解uboot代码框架提供基础。
以uboot2015为例,以外部SD/MMC作为启动介质。
⽬录⼀、itop4412-uboot2015镜像⽂件组成⼆、itop4412-uboot启动流程1>> 开机运⾏iROM中的代码2>> BL1阶段3>> BL2(SPL)阶段4>> uboot第⼆阶段代码⼀、itop4412-uboot2015镜像⽂件组成 在ubuntu中将uboot镜像烧写到SD卡的命令如下,功能是将uboot镜像⽂件itop4412-uboot.bin⽂件烧写到SD卡第1个扇区开始的地⽅: dd iflag=dsync oflag=dsync if=itop4412-uboot.bin of=/dev/sdb seek=1 其中itop4412-uboot.bin由如下⽂件制作成: cat E4412_N.bl1.SCP2G.bin bl2.bin env.bin u-boot.bin > itop4412-uboot.bin 其中, E4412_N.bl1.SCP2G.bin :8KB,三星提供的bin⽂件,没有源码,下⽂称为BL1 bl2.bin :16KB,uboot启动第⼀阶段代码,在uboot2015中称为SPL阶段,下⽂称为BL2 env.bin :8KB,内容是全0的bin⽂件,在SD卡中占位8KB⽤于存储uboot的环境变量 u-boot.bin :⼩于512KB,uboot启动第⼆阶段代码 因此,itop4412 uboot2015镜像组成⽂件中,bl2.bin和u-boot.bin是移植uboot2015编译⽣成,其他⼏个是现成的bin⽂件,直接从讯为提供的SDK 中获取。
iTOP-4412以模块的方式编译内核驱动

iTOP-4412以模块的方式编译驱动大家好,本章节我们将向大家讲解如何在linux下实现以模块的方式加载内核驱动。
我们以内核里面蜂鸣器的驱动为例来讲解。
1)首先打开内核的源码,如下图所示:2)使用命令“cd drivers/char/”,进入到蜂鸣器驱动所在的目录,如下图所示:3)然后使用命令“vi Kconfig”打开当前目录下的内核配置文件,如下图所示:4)然后找到“config BUZZER_CTL”所在的位置,如下图所示:5)然后把“bool"Enable BUZZER config"“一行改成”tristate"Enable BUZZER config"“,如下图所示:6)然后保存并退出,如下图所示:7)然后回到内核源码的根目录下,如下图所示:8)然后输入命令”make menuconfig“配置内核,如下图所示:9)选择”Device Drivers“->"Character devices"->"Enable BUZZER config",如下图所示:10)然后把”Enable BUZZER config“左边的”*“改成”M“,如下图所示:11)然后保存并退出配置界面,如下图:12)然后使用命令”vi arch/arm/mach-exynos/mach-itop4412.c“打开mach-itop4412.c,如下图所示:13)然后找到”struct platform_device s3c_device_buzzer_ctl“一行,如下图所示:14)把这一行前面的”#ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL)|| defined(CONFIG_BUZZER_CTL_MODULE)“,如下图所示:15)然后找到”&s3c_device_buzzer_ctl“一行,如下图所示:16)把这一行前面的”#ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL)|| defined(CONFIG_BUZZER_CTL_MODULE)“,如下图所示:17)然后保存并退出,返回到linux内核源码的根目录下,如下图所示:18)然后输入命令”make“,开始编译内核,如下图所示:19)编译完成后会在内核的”arch/arm/boot“目录下生成镜像文件”zImage“,如下图所示:20)在内核的”drivers/char“目录下生成了蜂鸣器的驱动模块”itop4412_buzzer.ko“,如下图所示:21)下一步我们烧写生成的zImage到开发板上,然后开发板启动进入到android系统。
【资源分享】迅为 iTOP-4412开发板平台详解

【资源分享】迅为iTOP-4412开发板平台详解开发板是一个相对复杂的电子系统,请耐心按照本章说明组装,以免造成不必要的损失。
用户最好使用迅为提供的连接线,因为有些部件是专门定制的,可能和市场上购买的其它连接线和部件不匹配,擅自使用市场上购买的接线或者部件可能损伤开发板。
在完全弄清楚开发板接口信号定义之前,如果本文档中没有提到该部件和您在市场上所购买的部件兼容,不要擅自使用自己购买的接线和其它部件,如有疑问请咨询我司技术人员。
开发板的组装控制台(Console)串口使用串口线连接开发板的COM3 到PC 机的串口,如果PC或笔记本没有串口,就需要准备一条USB转串口的设备。
注意:插拔串口,要在断电的情况下进行,以免带电插拔出现器件损坏。
PC 上对串口的操作软件请参考“3.1 超级终端的安装和使用”。
Exynos 4412 共有四个串口,其中CON3 是作为系统的调试串口,如下图所示:屏幕的连接从外观上来看,开发板有2 个HDMI 接口,其实只有一个可以接到HDMI 显示器上。
如下图所示:外形较大的HDMI-A 接口(上图中红色方框内的接口),只能连接迅为提供的7 寸屏幕或者9.7 寸屏幕,里面有5V(或者 3.3V)电源,绝对不能接到HDMI 显示器上。
使用迅为提供的HDMI 线是可以防呆的,不会接错,在用户弄清楚信号之前,不要擅自使用自己购买的HDMI 线!外形较小的HDMI(上图褐色方框内的接口)是标准的HDMI-C 接口(不属于国际标准,但是在很多电器设备中都有使用,属于日本SONY 公司定义的一种HDMI 接口,具体可以百度),建议使用我司的C 口转A 口的HDMI 线连接。
iTOP-4412 精英版除了使用HDMI 线连接屏幕外,也可以通过用户平常使用的软排线的方式来连接,如下图所示:上图中两个红色方框内的LCD 接口信号是自定义的接口,只能连接迅为提供的屏幕,和其它公司的屏幕并不保证完全兼容,这点大家一定要注意!电阻屏的连接(4.3 寸屏幕)iTOP-4412 精英版可支持4.3 寸电阻屏幕,连接方式如下图所示:4.3 寸屏幕的接口是翻盖式的,软排线带有金属触点的一面朝下连接。
iTOP-4412以模块的方式编译内核驱动

iTOP-4412以模块的方式编译驱动大家好,本章节我们将向大家讲解如何在linux下实现以模块的方式加载内核驱动。
我们以内核里面蜂鸣器的驱动为例来讲解。
1)首先打开内核的源码,如下图所示:2)使用命令“cd drivers/char/”,进入到蜂鸣器驱动所在的目录,如下图所示:3)然后使用命令“vi Kconfig”打开当前目录下的内核配置文件,如下图所示:4)然后找到“config BUZZER_CTL”所在的位置,如下图所示:5)然后把“bool "Enable BUZZER config"“一行改成”tristate "Enable BUZZER config"“,如下图所示:6)然后保存并退出,如下图所示:7)然后回到内核源码的根目录下,如下图所示:8)然后输入命令”make menuconfig“配置内核,如下图所示:9)选择” Device Drivers “->"Character devices"->"Enable BUZZER config",如下图所示:10)然后把” Enable BUZZER config “左边的”*“改成”M“,如下图所示:11)然后保存并退出配置界面,如下图:12)然后使用命令” vi arch/arm/mach-exynos/mach-itop4412.c“打开mach-itop4412.c,如下图所示:13)然后找到” struct platform_device s3c_device_buzzer_ctl “一行,如下图所示:14)把这一行前面的” #ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL) || defined(CONFIG_BUZZER_CTL_MODULE) “,如下图所示:15)然后找到” &s3c_device_buzzer_ctl“一行,如下图所示:16)把这一行前面的” #ifdef CONFIG_BUZZER_CTL“改成”#if defined(CONFIG_BUZZER_CTL) || defined(CONFIG_BUZZER_CTL_MODULE) “,如下图所示:17)然后保存并退出,返回到linux内核源码的根目录下,如下图所示:18)然后输入命令”make“,开始编译内核,如下图所示:19)编译完成后会在内核的” arch/arm/boot“目录下生成镜像文件”zImage“,如下图所示:20)在内核的” drivers/char“目录下生成了蜂鸣器的驱动模块” itop4412_buzzer.ko “,如下图所示:21)下一步我们烧写生成的zImage到开发板上,然后开发板启动进入到android系统。
第一章4412裸机相关操作

第⼀章4412裸机相关操作⼀、知识点:1、Cortex-A9开发板平台1.1、了解Cortex-A9核介绍1.2、了解Cortex-A9核⼼,三星公司⽣产的Exynos 44121.3、熟悉tiny4412开发资源:ddr3⼤⼩、emmc⼤⼩、led、key等2、Exynos 4412 GPIO介绍2.1、掌握GPIO编程2.2、点亮⼀个灯(掌握GPIO编程的验证)2.3、掌握开发步骤:编程、编译、烧写程序(重要)(注:需要前期知识:掌握交叉编译各个功能,掌握makefile管理编译程序,了解编译过程与IO操作⽅式)(注:linux操作系统环境:前提搭建好虚拟机)知识点讲解:1、了解Cortex-A9开发平台1.1、Cortex-A9核介绍Cortex-A9 是性能最⾼的ARM处理器,可实现受到⼴泛⽀持的ARMv7 体系结构的丰富功能。
Cortex-A9 处理器的设计旨在打造最先进的、⾼效率的、长度动态可变的、多指令执⾏超标量体系结构,提供采⽤乱序猜测⽅式执⾏的8 阶段管道处理器,凭借范围⼴泛的消费类、⽹络、企业和移动应⽤中的前沿产品所需的功能,它可以提供史⽆前例的⾼性能和⾼能效。
Cortex-A9 微体系结构既可⽤于可伸缩的多核处理器(Cortex-A9 MPCore?多核处理器),也可⽤于更传统的处理器(Cortex-A9 单核处理器)。
可伸缩的多核处理器和单核处理器⽀持16、32 或64KB 4 路关联的L1 ⾼速缓存配置,对于可选的L2 ⾼速缓存控制器,最多⽀持8MB 的L2 ⾼速缓存配置,它们具有极⾼的灵活性,均适⽤于特定应⽤领域和市场。
1.2、基于Cortex-A9核的CPU介绍本课程采⽤三星⾼性能的Exynos 4412四核处理器为CPU。
Exynos 4412内部集成了GPU 为Mali-400 MP的⾼性能图形引擎,⽀持3D图形流畅运⾏,并可播放1080P⼤尺⼨⾼清视频,流畅运⾏Android等⾼级操作系统,⾮常适合开发⾼端物联⽹终端,⼴告多媒体终端,智能家居,⾼端监控系统,游戏机控制板等设备。
三星高端四核Exynos 4412处理器-4412核心板

迅为电子iTOP-4412核心板说明
Exynos4412核心板图:
规格参数
堪称行业最小巧耐用的核心板!总体厚度仅2.5毫米!长宽尺寸:5cm*6cm 八层盲埋孔设计,沉金OSP工艺,PCB大厂制作
CPU:三星得意之作Exynos4412,四核Cortex-A9,主频为1.6GHz,被认
为是近几年最有前途的ARM处理器
内存:1G双通道LPDDR2,在超低功耗的前提下具有与DDR3一样的速度存储:8GB(可根据需要配置16GB以及32GB),采用三星EMMC,时钟频率高达52MHZ,满足MMC V4.41协议标准
电源管理:选用三星自家电源管理芯片,高效节能!具有9路DC/DC和28路LDO输出电源.经千百万部手机实践检验,与三星4412处理器匹配最佳!
USB HOST:板载USB3503,引出高性能HSIC,实现两路USB HOST输出连接器:采用进口高质量板对板连接器,引出绝大部分CPU资源,可扩展性高,确保长期运行可靠性
在-20℃至70℃范围的高低温运行测试中运行良好
引出脚达320个,满足用户各类扩展需求
支持MPEG-4/MPEG2、H.264/H263、VC-1、DivX的视频编解码1080p@30fps
支持2D,3D图形加速ARM Mali-400MP Core
支持SD/MMC/SDIO接口存储卡,最高支持32GB
支持JPEG硬件编解码,最大支持8192×8192分辨率
预留电磁屏蔽罩接口以及加固螺孔
支持5V电压供电。
uboot启动流程

U-Boot工作过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口(2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核1.1.1 U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/和board/samsung/mini2440/。
U-Boot启动第一阶段流程如下:图 U-Boot启动第一阶段流程根据cpu/arm920t/中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/ (.text)board/samsung/mini2440/ (.text)board/samsung/mini2440/ (.text)*(.text)}… …}第一个链接的是cpu/arm920t/,因此的入口代码在cpu/arm920t/中,其源代码在cpu/arm920t/中。
下面我们来分析cpu/arm920t/的执行。
1. 硬件设备初始化(1)设置异常向量cpu/arm920t/开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /*未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量 */ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 */ /* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef以上代码设置了ARM异常向量表,各个异常向量介绍如下:表 ARM异常向量表在cpu/arm920t/中还有这些异常对应的异常处理程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2uboot源码分析2.5.1.star t.S2.5.1.star t.S 引入引入2.5.1.1、u-boot.lds中找到start.S入口(1)在C语言中整个项目的入口就是 main函数(这是个.c文件的项目,第一个要分析的文件就是包含了C语言规定的),所以譬如说一个有main函数的那个文件。
10000( 2 方。
ENTRY(_start)因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。
2.5.1.2、SourceInsight中如何找到文件(1)当前状况:我们知道在uboot中的1000多个文件中有一个符号叫_start,但是我们不知道这个符号在哪个文件中。
这种情况下要查找一个符号在所有项目中文件中的引用,要使用SourceInsight的搜索功能。
(2)start.s 在cpu/arm_cortexa9/start.s(3)然后进入start.S文件中,发现个uboot的入口代码,就是第57 57行中就是行。
_start标号的定义处,于是乎我们就找到了整2.5.1.3、SI中找文件技巧(1)以上,找到了start.S文件,下面我们就从start.S文件开始分析uboot第一阶段。
(2)在SI中,如果我们知道我们要找的文件的名字,但是我们又不知道他在哪个目录下,我们要怎样找到并打开这个文件?方法是在 SI中先打开右边的工程项目管理栏目,然后点击最左边那个(这个是以文件为单位来浏览的),然后在上面输入栏中输入要找的文件的名字。
我们在输入的时候,SI在不断帮我们进行匹配,即使你不记得文件的全名只是大概记得名字,也能帮助你找到你要找的文件。
2.5.2.start.S解析12.5.2.1、不简单的头文件包含(1)#include<config.h>。
config.h是在include目录下的,这个文件不是源码中本身存在的文件,而是配置过程中自动生成的文件。
这个文件的内容其实是包含了下面3个头文件(2)经过分析后,这3个头文件,这个文件是整个uboot移植时的配置文件。
这里面是因此这个头文件包含将这三个文件和start.S文件关联了起来。
因此之后在分析时,主要要考虑的就是include/configs/itop_4412_android.h 文件。
好多宏。
start.S文件(3)#include<version.h>。
include/version.h 中包含了include/version_autogenerated.h ,这个头文件就是配置过程中自动生成的。
里面就一行内容:#define U_BOOT_VERSION"U-Boot 2010.03"。
如下图所示。
这里面定义的宏U_BOOT_VERSION的值是一个字符串,字符串中的版本号信息来自于Makefile中的配置值。
这个宏在程序中会被调用,在uboot 启动过程中会串口打印出uboot的版本号,那个版本号信息就是从这来的。
(4)在include/configs/itop_4412_android.h 中定义了CONFIG_ENABLE_MMU#include<asm/proc/domain.h>。
asm目录不是uboot中的原生目录,uboot中本来是没有这个目录的。
asm目录是配置时创建的一个符号链接,实际指向的是就是asm-arm(详解上一章节分析 mkconfig脚本时).(5)经过分析后发现,实际文件是:include/asm-arm/proc-armv/domain.h(6)从这里可以看出之前配置时创建的符号链接的作用,如果没有这些符号链接则编译时根本通不过,因为找不到头文件。
(所以uboot不能在windows的共享文件夹下配置编译,因为windows中没有符号链接)思考:为什么start.S不直接包含asm-arm/proc-armv/domain.h,而要用asm/proc/domain.h。
这样的设计主要是为了可移植性。
因为如果直接包含,则start.S文件和CPU架构(和硬件)有关了,可移植性就差了。
譬如我要把uboot移植到mips架构下,则start.S源代码中所有的头文件包含全部要修改。
我们用了符号链接之后,则start.S中源代码不用改,只需要在具体的硬件移植时配置不同,创建的符号链接指向的不同,则可以具有可移植性。
2.5.3.start.S解析22.5.3.1、启动代码的16字节头部(1)在SD卡启动/Nand启动等整个镜像开头需要16字节的校验头。
(mkv210image.c中就是为了计算这个校验头)。
我们以前做裸机程序时根本没考虑这16字节校验头,因为:1、如果我们是 usb启动直接下载的方式启动的则不需要16字节校验头( iromapplicationnote);2、如果是 SD卡启动mkv210image.c中会给原镜像前加16字节的校验头。
(2)uboot这里start.S中在开头位置放了16字节的填充占位,这个占位的16字节只是保证正式的image的头部确实有16字节,但是这16字节的内容是不对的,还是需要后面去计算校验和然后重新填充的。
2.5.3.2、异常向量表的构建(1)异常向量表是硬件决定的,软件只是参照硬件的设计来实现它。
(2)异常向量表中每种异常都应该被处理,否则真遇到了这种异常就跑飞了。
但是我们在uboot中并未非常细致的处理各种异常。
(3)复位异常处的代码是:breset,因此在CPU复位后真正去执行的有效代码是reset处的代码,因此reset 符号处才是真正的有意义的代码开始的地方。
2.5.3.3、有点意思的deadbeef(1).balignl16,0xdeadbeef.这一句指令是让当前地址对齐排布,向后走地址直到对齐,并且向后走的那些内存要用0xdeadbee f如果当前地址不对齐则自动来填充。
(2)0xdeadbeef 这是一个十六进制的数字,这个数字很有意思,组成这个数字的十六进制数 全是abcdef 之中的字母,而且这8个字母刚好组成了英文的deadbeef 这两个单词,字面意思是坏牛肉。
(3)为什么要对齐访问?有时候是效率的要求,有时候是硬件的特殊要求。
2.5.3.4、TEXT_BASE 等(1)第100行这个 TEXT_BASE 就是上个课程中分析Makefile 时讲到的那个配置阶段的TEXT_BASE ,其实就是我们链接时指定的 uboot 的链接地址。
(值就是 c3e00001) (2)源代码中和配置Makefile 中很多变量是可以互相运送的。
简单来说有些符号的值可以从Makefile 中传递到源代码中。
2.5.4.start.S 解析3(1)CFG_PHY_UBOOT_BASE33e00000 uboot 在DDR 中的物理地址2.5.4.1、设置CPU 为SVC 模式(1)msr cpsr_c,#0xd3将CPU 设置为禁止 FIQIRQ ,ARM 状态,SVC 模式。
(2)其实ARMCPU 在复位时默认就会进入 SVC 模式,但是这里还是使用软件将其置为式。
整个 uboot 工作时CPU 一直处于 SVC 模式。
SVC 模2.5.4.2、设置L2、L1cache 和MMU(1)bldisable_l2cache // 禁止L2cache(2)blset_l2cache_auxctrl_cy cle //l2cache 相关初始化 (3)blenable_l2cache // 使能l2cache (4)刷新L1cache 的icache 和dcache 。
(5)关闭MMU总结:上面这 5步都是和 CPU 的cache 和mmu 有关的,不用去细看,大概知道即可。
2.5.4.3、识别并暂存启动介质选择(1)从哪里启动是由SoC的OM5:OM0这6个引脚的高低电平决定的。
(2)实际上在我们芯片内部有一个寄存器(地址是 0x10020000),这个寄存器中的值是硬件根据OM引脚的设置而自动设置值的。
这个值反映的就是OM引脚的接法(电平高低),也就是真正的启动介质是谁。
(3)我们代码中可以通过读取这个寄存器的值然后判断其值来确定当前选中的启动介质是Nand还是SD还是其他的。
(4)start.S的0行执行完后,在r2寄存器中存储了一个数字,这个数字等于某个特定值时就表示SD启动,等于另一个特定值时表示从Nand启动····(5)260行中给r3中赋值#BOOT_MMCSD(0x03),这个在SD启动时实际会被执行,因此执行完这一段代码后r3中存储了0x03,以后备用。
2.5.4.4、设置栈(SRAM中的栈)并调用lowlevel_init(1)第一次设置栈。
这次设置栈是在SRAM中设置的,因为当前整个代码还在SRAM中运行,此时DDR还未被初始化还不能用。
栈地址_TEXT_PHY_BASE是自己指定的,指定的原则就是这块空间只给栈用,不会被别人占用。
(2)在调用函数前初始化栈,主要原因是在被调用的函数内还有再次调用函数,而返回地址存储到LR中,但是我们只有一个LR,所以在第二层调用函数前要先将否则函数返回时第一层的返回地址就丢了。
????BL只会将LR入栈,我们的uboot中没有两次设置栈2.5.5.start.S解析4(1)使用 SourceInsight的 Reference功能,找到lowlevel_init函数真正的地方,是在uboot/board/samsumg/smdkc210/lowlevel_init_scp.S中。
因为在MKconfig中产生了软链接。
这一点跟视频中有点不一样2.5.5.1、检查复位状态(1)复杂CPU允许多种复位情况。
譬如直接冷上电、热启动、睡眠(低功耗)状态下的唤醒等,这些情况都属于复位。
所以我们在复位代码中要去检测复位状态,来判断到底是哪种情况。
(2)判断哪种复位的意义在于:冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的复位则不需要再次初始化2.5.5.2、IO状态恢复itop4412 DDR。
没有这个代码(1)这个和上一个和主线启动代码都无关,因此不用去管他。
2.5.5.3、关看门狗(1)参考裸机中看门狗章节2.5.5.4、一些SRAMSROM相关GPIO设置(1)与主线启动代码无关,不用管2.5.5.5、供电锁存(1)lowlevel_init.S的第100-104行,开发板供电锁存。
总结:在前100行,lowlevel_init.S中并没有做太多有意义的事情(除了关看门狗、供电锁存外),然后下面从110行才开始进行有意义的操作。