判断uboot启动方式:norflash还是nandflash

简介: 判断uboot启动方式:norflash还是nandflash

在XC2440开发板上做uboot从nandflash启动时,需要检测硬件启动方式,启动方式是由硬件OM管脚决定的,软件无法检测硬件电平状态,但可以根据CPU的启动特性来检测。


通过深入研究2440的启动方式,总结了几点:

如果将S3C2440配置成从NANDFLASH启动(将开发板的启动开关拔到nand端,此时OM0管脚拉低)S3C2440的Nand控制器会自动把Nandflash中的前4K代码数据搬到内部SRAM中(地址为0x40000000),同时还把这块SRAM地址映射到了0x00000000地址。 CPU从0x00000000位置开始运行程序。


如果将S3C2440配置成从Norflash启动(将开发的启动开关拔到nor端,此时OM0管脚拉高),0x00000000就是norflash实际的起始地址,norflash中的程序就从这里开始运行,不涉及到数据拷贝和地址映射


看S3C2440的地址映射图:


image.png


根据前面的启动过程分析,nand启动时,地址0x00000000为SRAM映射的地址;nor启动时,地址0x00000000为norflash的实际起始地址。向norflash中写数据需要特定的命令时序,而向内存中写数据可以直接向内存地址赋值。


根据这两个特性,我们可以这样检测,代码如下:

int check_flashboot_mode(void)
{
    volatile unsigned int *pdw = (volatile unsigned int *)0;
    unsigned int dwVal;
    dwVal = *pdw; 
    *pdw = 0x12345678;
    if (*pdw != 0x12345678)
    {
        return 1;
    }
    else
    {
        *pdw = dwVal;
        return 0;
    }
}

用volatile声明一个寄存器变量*pdw指向的是0地址。向0地址处写一串数据,比如0x12345678,*pdw = 0x12345678,接着再从0地址中把数据读回来。

因为nor启动时,0地址是norflash的起始址,而向norflash写数据需要特定的命令时序,所以直接给地址赋值是不起做用的,所以读回来的数据还是norflash中原有的数据,这样通过*pdw != 0x12345678判断,此时为nor启动。


而在nand启动时,0地址是内存的地址映射,可以用直接赋值的方法向内存中写入数据,接着从0地址读回来的数据变为0x12345678,和之前写入的数据相等,此时就为nand启动,在操作完后,要将数据还原 *pdw = dwVal


目录
相关文章
|
7月前
|
安全 Linux Android开发
【ATF】bootloader与安全相关启动分析
【ATF】bootloader与安全相关启动分析
141 0
|
3月前
|
Linux
用QEMU模拟运行uboot从SD卡启动Linux
用QEMU模拟运行uboot从SD卡启动Linux
|
7月前
|
Linux C语言 芯片
【系统启动】uboot启动流程源码分析
【系统启动】uboot启动流程源码分析
166 0
uboot命令添加记录
uboot命令添加记录
135 0
uboot命令添加记录
|
Go C语言
uboot启动后在内存中运行裸机程序hello
如题,实现过程中发现3额问题,先写下来,待解答: <p>1、uboot启动后再dnw上打印许多信息,我想改变其中的打印信息或加上自己的打印信息以证明程序运行到何处。修改完后重新编译uboot.bin。</p> <p>在DNW下执行dnw 50008000 USB下载uboot.bin到内存50008000处, go 50008000,从内存50008000处运行我刚下载的程序,发现我修
2579 0
|
Linux 内存技术
uboot设置bootargs启动根文件系统
uboot设置bootargs启动根文件系统
|
Linux
16.8 Linux启动引导程序加载内核
在刚刚的启动过程中,我们已经知道启动引导程序(Boot Loader,也就是 GRUB)会在启动过程中加载内核,之后内核才能取代 BIOS 接管启动过程。如果没有启动引导程,那么内核是不能被加载的。
261 0
16.8 Linux启动引导程序加载内核