微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c6410 uboot代码分析

s3c6410 uboot代码分析

时间:11-09 来源:互联网 点击:

nner:串口打印uboot信息,就是uboot启动的时候我们看到的信息,这里使用的是printf,但是我们追进去后,关注的函数

应该是serial_putc,它是真实向串口输出一个字符的函数,这个函数会递归调用,应该说自己调用自己,遇到\n结束。

print_cpuinfo:打印CPU信息,CPU型号和速度 CPU:...

checkboard:打印开发板信息 BOARD:...


dram_init:

记录dram的起始地址,0x50000000,size为256M

display_dram_config:因为没有定义DEBUG,所以打印DRAM:256M

2)配置malloc空间

(因为CONFIG_LCD、CONFIG_VFD没有定义,所以跳过这一部分)


我们定义了UPPER_CODE,所以执行第一个mem_malloc_init。这个函数的作用是记录堆栈空间的起始地址、结束地址、当前地址。

3)启动设备初始化(SD、NAND、ONENAND)

系统一开始尝试从SD卡启动,因为本篇介绍的是NANDFLASH启动方式,所以SD卡部分暂不分析,会单独开辟章节介绍s3c6410

的SD卡启动方式(包括windows下SD flasher应用程序的编写、SD卡硬件电路分析、SD寄存器操作和启动流程)。

下面分析nand启动方式,我们在自己的头文件里定义了CONFIG_COMMANDS和CFG_CMD_NAND,所以会执行nand_init函数

分析代码中的368行nand_init函数,我们知道在uboot启动起来之后,会显示NAND: 512M(你nandflash的大小),所以不难想象,

nand_init会向终端打印NAND大小的信息,以下是nand_init的实现:


nand_init函数的实现体在drivers/nand/nand.c中,nand_init函数不仅会打印出nandflash的大小,还会初始化描述nand的结构体

nand_info以及代表“nand”的设备结构体nand_chip,这两个结构体前者是mtd层对设备的抽象和对块设备的接口统一,后者是

设备的实体,所有对设备的读写控制操作都最终通过这个结构体完成,下面我们开始分析nand_init函数:

64~69行:从外表看,最后会执行size += nand_info[i].size,由此最起码可以猜测到这个函数会计算出nand的大小。那么是怎样计算出

来的呢,我们需要看nand_init_chip函数,注意,在进入这个函数之前,先看一下传入的三个参数,前两个参数我们已经介绍过,第三

个参数是nand的数据寄存器,访问地址为0x70200010。nand_init_chip函数会根据我们传入的参数,去查找对应的nand设备,并初

始化一些功能接口为以后对nand操作做准备,下面看图:

47行:mtd->priv实现了mtd中间层对底层nand设备的接口,我们以后在访问nand硬件时,通过mtd的priv成员可以快速找到我们的

nand设备。

49行:nand成员中保存了读写nand数据的数据寄存器基地址,我们通过读写base_addr中的数据,实现对nand中数据的读和写,

后面的__iomem是个宏定义,这样定义的#define __iomem,只定义并没有给值,所以没有任何功能意义,但是对于我们在看代码

的时候,很容易能判断出后面的变量是IO地址空间的寄存器地址。

50行:是对nand设备的初始化操作,我们进入函数体

820~823行:判断是否是从nand_flash启动。看s3c6410寄存器就会明白:

820行:NFCONF定义的宏,其实是取0x70200000地址里面的内容,那么如果我们把OM跳线设置为nand启动,这个[31]

位的值就会为1,这样的话NFCONF & 0x80000000的值就是1了,因而boot_nand的值为1;

825行:清除0x70200004的[16]位,关闭软件锁存,如果此位设置为1,则NFSBLK(0x70200020)到NFEBLK

(0x70200024)-1被开启,除了这部分区域,写或擦除命令是无效的,只有读命令是有效的(NFSBLK和NFEBLK)为可编程

可编程开始和结束块地址寄存器;

826~827行:我们在进入这个函数的时候就做过了;

828行:nand->cmd_ctrl = s3c_nand_hwcontrol,这个函数是用于向nand硬件发送命令的,比如发送00h,代表的是读命令。

829行:nand->dev_ready = s3c_nand_device_ready,是用于判断nand芯片处于忙/可读状态的。s3c_nand_device_ready

用一个循环去判断NFSTAT(0x70000028)的最低位(RnB输入引脚状态),如果是1表示现在nand可读,0代表正在忙不可读

830行:bbt(bad block table)坏块表,因为我们没用到,所以s3c_nand_scan_bbt函数会直接返回;

我们没有定义宏CFG_NAND_FLASH_BBT,所以nand->options|= NAND_SKIP_BBTSCAN,后面宏的含义代表在初始化期间

将跳过坏块扫描;

839行:CFG_NAND_HWECC需要我们自己定义,含义代表使用错误纠错码;

840行:代表使用NAND_FLASH模块内部的ECC模块产生纠错码;

841行:nand-> 841行:nand->ecc.hwctl= s3c_nand_enable_hwecc,设置对ECC的控制,这个函数应该在产生ECC编码前被调用。这

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top