s3c6410 uboot代码分析
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编码前被调用。这
s3c6410uboot代码分 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)