三、编写 s3c24x0 的 bootloader——重定位(一)

发布者:BlissfulMoments最新更新时间:2024-08-26 来源: cnblogs关键字:s3c24x0  bootloader  重定位 手机看文章 扫描二维码
随时随地手机看文章

重定位之前,要将 flash 初始化,flash 的初始化分为 norflash 和 nandflash,norflash 不用初始化,所以不用做任何操作


3.1 nandflash 初始化


在 nandflash 初始化之前,需要设置栈:


1     /** 6. 重定位:把 bootloader 本身的代码从flash 复制到它的链接地址中 */

2     /** copy_code_to_sdram 用 C语言写,需要先设置栈 */

3     ldr sp, =0x34000000     /** 栈指向 SDRAM 的顶端 */

进入初始化:


1     bl nand_init

nandflash 初始化需要注意两个内容,一个是 s3c2440 手册的第 6 章 nandflash 控制器,一个是 nandflash 的芯片手册。


3.1.1 寄存器 NFCONF

要注意两个寄存器,是初始化需要操作的:

  

 

 注意图中标记的三个寄存器参数,这三个参数与 nandflash 控制器的时序有关:

发出 CLE/ALE 之后,一个写信号 nWE 需要多久变为低电平,nWE 变为低电平后,CLE/ALE 又需要保存多长时间才能变为低电平。

nWE 中的低电平为 /WE 中的 twp 处位置,为写信号的脉冲宽度,最小为 12 ns,最小值都是通过 nandflash 手册得到的,如下:

  

HCLK * (TWRPH0 + 1)  >= 12ns

自己设置的时钟FCLK(CPU主频是 400MHZ),分频比是 FCLK: HCLK: PCLK = 1:4:8,那么 HCLK 是100MHZ,即为10ns;则 10 * (TWRPH0 + 1) >= 12,TWRPH0 >= 0.2,那么 TWRPH0 可以设置为 1。

发出 CLE 和 ALE 之后,过多少时间才能发出写信号?time = tcls - twp >= 0,这里说明 CLE 信号和 WE 信号可以同时发出,那么可以将 TACLS 时间设置为 0,即发出 CLE 后,立即发出写信号。

TWRPH1 表示写信号变为高电平之后,CLE 和 ALE 还需要维持多长时间,从 nandflash 时序图和手册,可以知道 tclh >= 5ns,则 10 * (TWRPH1 + 1) >= 5,则 TWRPH1 >= 0。

3.1.2 寄存器 NFCONT

  

这个寄存器需要设置 MODE(NAND Flash 控制器运行模式),要使能 nandflash;Reg_nCE(NAND Flash 存储器的 nFCE 信号控制),我们是引导期间,所以要使能片选;InitECC,虽然在引导期间不会使用 ECC,但是也要进行 ECC 初始化。


3.1.3 初始化代码

 1 void nand_init(void)

 2 {

 3 #define TACLS       0

 4 #define TWRPH0      1

 5 #define TWRPH1      0

 6 

 7     /** 设置时序 */

 8     NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4);

 9     /** 使能 NND Flash 控制器, 初始化 ECC, 禁止片选 */

10     NFCONT = (1 << 4) | (1 << 1) | (1 << 0);

11 }


关键字:s3c24x0  bootloader  重定位 引用地址:三、编写 s3c24x0 的 bootloader——重定位(一)

上一篇:GCC编译器原理(一)------交叉编译器制作和GCC组件及命令
下一篇:二、编写 s3c24x0 的 bootloader——SDRAM 设置

推荐阅读最新更新时间:2024-11-08 10:25

三、编写 s3c24x0bootloader——定位(一)
重定位之前,要将 flash 初始化,flash 的初始化分为 norflash 和 nandflash,norflash 不用初始化,所以不用做任何操作 3.1 nandflash 初始化 在 nandflash 初始化之前,需要设置栈: 1 /** 6. 重定位:把 bootloader 本身的代码从flash 复制到它的链接地址中 */ 2 /** copy_code_to_sdram 用 C语言写,需要先设置栈 */ 3 ldr sp, =0x34000000 /** 栈指向 SDRAM 的顶端 */ 进入初始化: 1 bl nand_init nandflash 初始化需要注意两个内容
[单片机]
三、编写 <font color='red'>s3c24x0</font> 的 <font color='red'>bootloader</font>——<font color='red'>重</font><font color='red'>定位</font>(一)
STM32单片机Bootloader的实现
之前一篇的文章中,主要介绍了STM32的启动流程和内存主要空间的分配,这篇文章将在上一篇文章的基础上,来阐述一下STM32 Bootloader的实现。 STM32的内存划分 前面文章我们说了,STM32上电后会从0x08000000地址处开始运行,因此,如果我们想要使得STM32在上电之处直接进入进Bootloader,那么其内存的起始地址必须要从0x08000000处开始。这一步是由单片机的硬件所决定的,无法通过软件干预。 因此,在我们使用Keil软件设计STM32 Bootloader的时候,一定要在Keil的工程中设置这个地址,当然,如果你不设置也没关系,因为Keil默认就是将单片机的软件编译到此地址的。如图1
[单片机]
STM32单片机<font color='red'>Bootloader</font>的实现
stm32 中bootloader、startup_stm32f10x_md.s的作用
一、启动文件的作用是: 1. 初始化堆栈指针 SP; 2. 初始化程序计数器指针 PC; 3. 设置堆、栈的大小; 4. 设置异常向量表的入口地址; 5. 配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没 有外部 SRAM); 6. 设置 C 库的分支入口__main(最终用来调用 main 函数); 7. 在 3.5 版的启动文件还调用了在 system_stm32f10x.c 文件中的 SystemInit() 函数配置系统时钟,在旧版本的工程中要用户进入 main 函数自己调用 SystemInit() 函数。 二、关于启动文件的介绍,可以参考: 1、http://www.360doc.com/cont
[单片机]
stm32 中<font color='red'>bootloader</font>、startup_stm32f10x_md.s的作用
基于Intel PXA272的Bootloader的设计与实现
1  前言 PC机中的引导程序一般由BIOS和位于MBR的OS  Bootloader(例如LILO或者GRUB)一起组成。然而在嵌入式系统中通常没有像BIOS那样的固件程序(有的嵌入式CPU有),因此整个系统的加载启动任务就完全由Bootloader来完成。但是随着嵌入式系统的发展,Bootloader已经逐渐在基本功能的基础上进行了扩展,Bootloader可以更多地增加对具体系统的板级支持,即增加一些硬件模块功能上的使用支持,以方便开发人员进行开发和调试。编写 BootLoader是开发WinCE系统第一步,也是关键的一步。只有得到一个稳定工作的Loader程序,才能够更进一步开发WinCE的BSP,直至最后整个系统的成功。
[嵌入式]
RT-Thread Bootloader on Tencent EVB MX+
0. 写在前面的话 这篇文章写着玩,主要是图一乐。纪念一下最开始使用RTT到处查找资料的过程。 本文内容比较简单,若是有朋友才开始用RTT,希望会有一些帮助吧。 国产优秀嵌入式操作系统RT-Thread,赞! 本文看着复杂,但是实际操作简单。实验过程约15~30分钟。有几张图死活传不上来,似乎也不支持个人gitee的图床,算了,影响不大。 硬件资源:Tencent EVB MX+ CPU:STM32L431RCT6 将要掌握的内容: RT-Thread在STM32系列的移植 RT-Studio基本操作方法 FAL(Flash Abstract Layer)+W25Q64的QSPI移植 Qboot的移植与基础个性化(最基础的个性
[单片机]
RT-Thread <font color='red'>Bootloader</font> on Tencent EVB MX+
u-boot移植(四)---修改前工作:代码流程分析3---代码定位
一、重定位     1.以前版本的重定位        2.新版本          我们的程序不只涉及一个变量和函数,我们若想访问程序里面的地址,则必须使用SDRAM处的新地址,即我们的程序里面的变量和函数必须修改地址。我们要修改地址,则必须知道程序的地址,就需要在链接的时候加上PIE选项:          加上PIE选项后,链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):          然后我们根据这些地址的信息来修改代码,程序就可以复制到SDRAM的任何地方去。 二、代码流程   start.S中执行到了 bl _main,跳转到_main,_main函数入口在crt0.S (ar
[单片机]
u-boot移植(四)---修改前工作:代码流程分析3---代码<font color='red'>重</font><font color='red'>定位</font>
Motorola微处理器的bootloader分析与应用
摘要:以Motorola 32位处理器ColdFire5307为例,分析、介绍Motorola公司用于嵌入式系统开发的dBUG通用bootloader软件的结构、运行原理及应用。 关键词:嵌入式系统 ColdFire bootloader dBUG 引 言 bootloader是用来完成系统启动和系统软件加载工作的程序。它是底层硬件和上层应用软件之间的一个中间件软件,完成处理器和周边电路正常运行所要的初始化工作;可以屏蔽底层硬件的差异,使上层应用软件的编写和移植更加方便;不仅具有类似PC机上常用的BIOS(Basic Input Output System,基本输入、输出系统监控程序)功能,而且还可具有一定的调试功能。
[嵌入式]
tiny4412裸机程序——代码定位
在前面介绍exynos4412芯片启动过程时,我们知道:一上电,exynos4412首先执行固化在iROM中的代码,iROM首先设置程序运行环境(比如关看门狗、关中断、关MMU、设置栈、设置栈、启动PLL等),然后根据OM引脚确定启动设备(NAND Flash/SD卡/其他),把BL1从里面读出存入iRAM的0x02021400地址处,然后开始启动BL1;BL1从SD卡适当的位置读入14K字节的数据,存在iRAM地址0x02023400处,所以BL2不能大于(14K–4) 字节,这里引出了为什么写这一节的原因:如果我们的程序很大,大于14K怎么办? 运行地址和链接地址: 运行地址是程序当前所处的地址,即程序在运行时,所处的
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved