(笔记)AT91SAM9260的启动过程详细解说
Bootstrap的启动过程
一、 说明:
Bootstrap启动代码是官方提供的一级启动代码,包括汇编和C语言两部分组成。对AT91SAM9260来说编译完成后,代码长度必须小于4KB,烧写到dataflash中的0x00000000.
二、系统上电准备Bootstrap启动。
当系统启动选择片内启动(BMS=1)时,程序上电后,启动内部ROM的的固化程序,自动将检测dataflash中前48个字节的数据,如果数据正确,说明是Bootstrap启动代码。这时候系统自动将存在flashdta中的Bootstrap启动代码搬到SRAM0中去,接下来就进行存储器的REMAP,经过remap后,SRAM0从映射前的0x200000地址被映射到了0x000000地址并且程序从此处开始执行。
三、Bootstrap汇编启动过程
1、建立中断向量表。
2、设置堆栈SP的值。
3、主晶振使能为主时钟。
4、数据段的拷贝。
5、对零初始化的数据进行初始化。
6,跳转到C语言main函数。
四、BootstrapC语言初始化过程
1、关闭看门狗。
writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR);
2、配置PLLA时钟
pmc_cfg_plla(PLLA_SETTINGS, PLL_LOCK_TIMEOUT);
3、配置MCK时钟
pmc_cfg_mck(MCKR_SETTINGS, PLL_LOCK_TIMEOUT);
4、配置PLLB时钟
pmc_cfg_pllb(PLLB_SETTINGS, PLL_LOCK_TIMEOUT);
5、配置CP15协处理器
6、配置PIO控制器
pio_setup(hw_pio);
7、配置外部总线接口EBI
writel((readl((AT91C_BASE_MATRIX+MATRIX_SCFG3))&~0xFF)|0x40,(AT91C_BASE_MATRIX+MATRIX_SCFG3));
8、初始化总线矩阵。
writel(readl(AT91C_BASE_CCFG + CCFG_EBICSA) | AT91C_EBI_CS1A_SDRAMC, AT91C_BASE_CCFG + CCFG_EBICSA);
9、配置SDRAM控制器
sdram_init(…….)
10、dataflash的SPI初始化
df_spi_init(pcs, DF_CS_SETTINGS);
11、dataflash的复原初始化
df_recovery(pDf);
12、将dataflash中以0x8400开始的连续0x80000字节的数据搬移到SDRAM中以0x23F00000为起始地址处。
df_download(pDf, img_addr, img_size, img_dest);
13、程序最后跳转到0x23F00000处在sdram中运行K2CMSTART程序代码。
注意:K2CMSTART程序代码是真正的要运行的程序,存在dataflash中以0x8400开始的连续0x80000字节。是我们自己要正真编写的程序。下面提到这程序中的函数变量都是以一个K2CMSTART程序例子来说的。
五、程序应用
该部分BOOT程序为系统的一级启动程序,完成最低层最基本的硬件初始化,为进入到上一级程序进行引导。
AT91sam9260上电后,启动内部ROM的的固化程序,按照dataflash、nandflash的顺序依次来找合法的BOOT程序。所谓合法的指的是在这些存储设备的开始地址处连续的存放的32个字节,也就是8条指令必须是跳转指令或者装载PC的指令,其实这样规定就是把这8条指令当作是异常向量表来处理。必须注意的是第6条指令要包含将要装载的映像的大小。一旦合法的映像找到之后,则固化程序会把找到的映像搬到SRAM中去,所以映像的大小是非常有限的,不能超过4K的大小。当固化程序完成了把合法的映像搬到SRAM的任务以后,接下来就进行存储器的REMAP,经过REMAP之后,SRAM从映设前的0X200000地址处被映设到了0X0地址并且程序从0X0处开始执行。
上电后,我们一般把存储在dataflash中的bootstrap 映像搬移到sram中,bootstrap 完成一些静态初始化工作, 如PMCS,PIOs,再把第二级的K2CMSTART引导程序从dataflash中搬移到sdram中运行。
虽然是BOOT程序,但由于受到内部4KB的SRAM的限制,程序不能实现太多功能,比如进行人机交互操作,查看系统内部某些数据,更新程序软件、更新数据等。当然在保证有足够的SRAM空间的前提下,增加一个串口,进行简单的输入输出信息查看还是可以的,但这也相对没什么意义。但我们如果真要进行复杂的人机交互操作的话,肯定要进入二级引导程序K2CMSTART里进行。
K2CMSTART的启动过程
一、 汇编启动代码
1、 建立中断向量表。
2、 将此中断向量表函数。(根据Scatter里的数据段的定义调用系统函数完成数据段的搬移)
二、C语言函数代码。
3、 1、调用BoardVolMa拷贝到内部SRAM中0X200000起始处。
4、 设置7种异常模式下的堆栈区。
5、 进入低级初始化函数AT91F_LowLevelInit(void)。
程序进入C语言的__mainnageIni()初始化
2、调用ARMTargetInit()初始化硬件
3、调用InitLoadFile()初始化下载文件。
4、循环中调用ReadSmcSoftVolFromScb()函数,超时退出循环
5、主程序主循环中,调用DrvRunLedFlash(100,100,100)函数LED灯闪烁。
6、主程序主循环中,调用MainMenu()函数中的Loadfile()下的net_handle()函数,通过UDP/IP协议传过来的数据进行判别执行相应的操作和更新。
6.1通过arp_rcv_packet()函数对上位机ARP包进行处理;
6.2通过ip_rcv_packet ()函数对上位机IP包进行处理;
6.2.1通过icmp_rcv_packet ()函数对上位机的ICMP网间控制报文协议进行处理;
6.2.2通过udp_rcv_packet ()函数对UDP协议包数据处理;
6.2.2.1用户利用上位机通过TFTP协议可以读取系统的参数信息,也可以更改系统的参数信息。
tftp_rcv_packet()函数实现具体操作,实现对文件的读写操作。tftp_rcv_wrq(struct sk_buff *skb)函数接收三个参数文件到缓冲区;tftp_rcv_rrq(struct sk_buff *skb)函数根据人机交互的命令要求读三个参数文件。
6.2.2.2用户利用上位机通过CCTP协议(端口号=2800)接收命令执行相应的操作。
cctp_rcv_data()函数实现具体操作。
6.2.2.3用户利用上位机通过端口号=2002接收命令执行相应的操作。
AsyCmd_Rcv_Data()函数实现具体操作。
7、主程序主循环中,调用MainMenu()函数中的RcvCctpOptCmdDeal()函数,根据判断结构体变量S_CctpRxBuf来执行操作。
7.1当((S_CctpRxBuf.buf[0]==0x1b)&&(S_CctpRxBuf.buf[2]==0x4d)时,进入JumpToApp_menu()函数时,执行read_dataflash( 0xd0088400,512*1024,0x23e00000 )函数,将dataflash中的应用程序(以0xd0088400为起始地址的512*1024字节)复制到0x23e00000为起始地址SDRAM中,最后程序执行(void (*)(void))0x23e00000 ()跳转到应用程序处运行。
7.2 当(S_CctpRxBuf.buf[0]==0x1b)&&(S_CctpRxBuf.buf[4]==0x3e)时,进入ScbJumpToApp()函数。
三、程序应用。
1、经过一级BOOT程序的引导,我们可以很快进入到二级的引导程序中。在这里我们可以访问系统的全部资源。我们可以更改一级BOOT程序、二级引导程序、包括之后要运行的主应用程序。
2、人机交互最常用的就是异步串口通信,连接简单可靠,不需要专门的上位机软件;缺点是传输距离近,数据传输速度慢,如果要进行大数据量传输肯定太慢。如果我们只简单的传输命令和回传一些简单信息还是一种很好的工具。在系统启动过程中通过串口输出一些系统版本信息,方便我们查看。
3、我们可以利用以太网口进行文件传输、下载。通过INTERNET,我们甚至可以在不同城市间就可以与系统进行交互操作,方便故障诊断维修。
4、利用USB也可以进行数据传输拷贝,但相对来说用的比较少。
5、可以进行这样设置:
5.1、系统开机进入一级BOOT程序后,进入二级程序引导,在进入二级程序引导的时候,正常的话就进入应用程序。如果不能进入应用程序或在引导时按DEL建,利用串口通信,则进入二级引导界面。
5.2、二级引导界面里设置很多选项,如:更新dataflash中一级BOOT程序、更新dataflash中二级引导程序、更新dataflash中应用程序、下载文件到指定地址的dataflash中、下载程序到指定地址的SDRAM中、程序跳到指定的SDRAM中运行、读取指定dataflash中地址的数据、读取指定SDRAM中地址的数据、重新启动、网络设置等
5.3、通过串口选择相应的操作,按提示操作,数据传输的时候可以通过网络传输。网络的参数如IP、网关等也经过串口设置确保可以正常建立网络连接。
(笔记)AT91SAM9260的启动过程详细解说的更多相关文章
- openstack学习笔记一 虚拟机启动过程代码跟踪
openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...
- HBase笔记--安装及启动过程中的问题
1.使用hbase shell的时候运行命令执行失败 例如:在shell下执行 status,失败. 可能的原因:节点之间的时间差距过大 解决方法调整两个节点的时间,使二者一致,这里用了个比较笨的方法 ...
- 笔记:Activity的启动过程
Activity的创建特点 作为四大组件之一的Activity,它不像普通java对像那样,可以new出来,然后去使用.而是调用 startActivity()这样的方式启动.那么Android系统是 ...
- iOS程序启动过程笔记
CHENYILONG Blog 笔记 一.iOS程序的完整启动过程(有storyboard)1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicati ...
- Nginx学习笔记(六) 源码分析&启动过程
Nginx的启动过程 主要介绍Nginx的启动过程,可以在/core/nginx.c中找到Nginx的主函数main(),那么就从这里开始分析Nginx的启动过程. 涉及到的基本函数 源码: /* * ...
- Android(java)学习笔记162:Android启动过程(转载)
转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...
- 笔记:Zygote和SystemServer进程启动过程
简述 Android设备启动过程中,先是Linux内核加载完,接着Android中的第一个进程init启动,它会启动一些需要开机启动的进程. Zygote就是进程init启动起来的.Android中所 ...
- Android(java)学习笔记105:Android启动过程(转载)
转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...
- Linux启动过程笔记
Linux启动过程 1.启动流程(BIOS->MBR:Boot Code->引导GRUB->载入内核->运行init->runlevel) 2./boot/grub/下有 ...
随机推荐
- 【Android】窗口机制分析与UI管理系统
类图关系 在看Android的窗口机制之前,先看看其主要的类图关系以及层级之间的依赖与调用关系 1.window在当前的android系统的中的呈现形式是PhoneWindow (frameworks ...
- 51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)
题目链接 \(Description\) \(n\leq 10^{10}\),求 \[\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\ mod\ (1e9+7)\] \(Soluti ...
- 8.6 正睿暑期集训营 Day3
目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...
- composer命令中 --prefer-dist 和 --prefer-source 的区别
--prefer-dist 会从github上下载.zip压缩包,并缓存到本地.下次再安装就会从本地加载,大大加速安装速度.但她没有保留.git文件夹,没有版本信息.适合基于这个包进行开发. --pr ...
- C#编程(七十九)---------- 反射
反射 在介绍翻着之前,先说两个小案例 B超:什么叫B超呢?就是透过肚皮能看到你内脏的情况,不用打开肚子才能看.这是什么样的一种技术呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声 ...
- 通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句
参考: https://blog.csdn.net/qq465235530/article/details/68064074 https://www.cnblogs.com/zj0208/p/6008 ...
- 〖Java〗Eclispe安装和使用viplugin
习惯了VIM的操作,每次打开Eclipse都习惯性的按下 hjkl: 感觉蛋疼了使用一下VIPlugin,发现给编码速度造成了成吨的伤害- 这个插件对于习惯于使用VIM的程序员来说,简直太有必要了.. ...
- JVM的7种垃圾收集器:主要特点 应用场景 设置参数 基本运行原理
原文地址:https://blog.csdn.net/tjiyu/article/details/53983650 下面先来了解HotSpot虚拟机中的7种垃圾收集器:Serial.ParNew.Pa ...
- Lintcode 730 所有子集的和
已知: 给一整数 n, 我们需要求前n个自然数形成的集合的所有可能子集中所有元素的和. 示例: 给出 n = , 返回 可能的子集为 {{}, {}, {, }}. 子集的元素和为 + + + = 给 ...
- 如何查看memcache的性能
memcache的运行状态可以方便的用 stats 命令显示.首先用telnet 127.0.0.1 11211这样的命令连接上memcache,然后直接输入stats就可以得到当前memcache的 ...