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

s3c6410 uboot代码分析

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

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

功能为确认SLC FLASH或是MLC FLASH,SLC代表single layer cell,MCL为multi-level cell,有关SLC和MLC的区别在容量、可

读写总次数、读写速度上,SLC的读写速度要快于MLC,但MCL的容量要比SLC大很多,因为1cell可以容纳4bits,有兴趣可以查阅

相关手册。此函数还有一个功能为:1.初始化主区ECC解码器/编码器(向0x70200004的[5]位写1)2.开启主区ECC

(向0x70200004的[7]位写0);

842行:nand->ecc.calculate= s3c_nand_calculate_ecc,用于存储产生的校验纠错码;

843行:nand->ecc.correct= s3c_nand_correct_data,用生成的ECC码检测是否有错误,没有则返回,具体内容看函数说明就好;

845~849行:向nand发送4条命令,849行为等待设备准备好;

851~852行:将读取到nand芯片的厂商信息和芯片ID编号;

854~859行:nand_flash_ids结构体保存了很多公司生产的nand芯片信息和编号,for循环将通过ID找到和我们板子匹配的NAND芯片;

再往下虽然代码挺多的,但不用担心,只会执行877行的nand->ecc.layout = &s3c_nand_oob_16,这是在定义oob信息;

以下是nand芯片可以处理的命令以及命令的含义(下面是三星K9F4G08U0A-PCB0芯片的命令集)


分析完board_nand_init函数后,我们继续看nand_init_chip第52行,nand_scan函数:

这个函数的主要功能就是2768行的nand_scan_ident函数,功能是填充mtd结构体,配置对nand的接口。这样下次在访问设备时,可

通过mtd层找到对应的底层设备,我们看下nand_scan_ident函数:


到此,我们不再往下追函数了,

2501行在设置mtd设备层的接口函数,

2504行nand_get_flash_type函数代码比较多,主要的功能还是在获得nand芯片的厂商信息和ID,并判断是否支持,如果支持

为这个nand设备和mtd填充一些功能接口函数,

我们再来看nand_scan_ident函数的后面代码,2512行是for循环,maxchips的值是nand_scan函数传递进来的1,所以我们最后

看到的i值为1,在2526行chip->numchips=1,mtd->size=512(我的nandflash型号是K9F4G08U0A-PCB0,大小512M,

我们在board_nand_init函数中已经在结构体nand_flash_ids中找到我们的nand型号,chipsize的值为512)。

nand初始化分析完毕。。。


4)环境变量初始化

环境变量初始化,即start_armboot函数第379行的env_relocate ()函数,这个函数实现体在env_common.c中,我们看真相:

这个函数的功能其实就是让env_ptr指向存放环境变量的首地址,并且填充env_ptr->data成员变量。

208和212的两个宏我们没有定义,所以直接看223行,223行malloc一个CFG_ENV_SIZE的空间用于存放环境变量

230行是在环境变量被迁移到内存后,我们可以使用内存中的环境变量

由于gd->env_valid我们前面没有赋值,所以232行if会执行,打印236行的内容

240~244行是判断默认的环境变量是否大于我们限定的环境变量大小

247行是把uboot代码中已经存在的default_environment指针所指向的环境变量拷贝到env_ptr->data中

253行是crc32的校验,会对环境变量的内容使用CRC32校验表做每8字节的DO1校验,校验表定义在crc32.c的77行

259行是把内存中可操作的环境变量记录在全局变量


5)网络初始化

网络初始化分为IP地址初始化和MAC地址初始化,看下图:


387行:IP地址初始化,getenv_IPaddr会返回IPaddr_t(unsigned long)类型的IP地址赋值给gd->bd->bi_ip_addr全局变量。

进入getenv_IPaddr函数会执行return (string_to_ip(getenv(var))),我们先看getenv(var):

497行:是给软件狗准备的,我的ZC6410板子上有硬件狗,所以这个WATCHDOG_RESET其实就是一个空的macro。

499~510行:会查找环境变量中的name,name是传递进来的ipaddr,进入查找旅程env_get_char函数,如果我们没有忘记的话

我们在env_relocate ()函数的230行执行过env_get_char = env_get_char_memory,所以会执行env_get_char_memory函数,

这个函数在env_common.c中实现:


186行的值同样在env_relocate正确执行过后,被赋值为1,返回gd->env_addr+index,gd->env_addr指向default_environment

因为default_environment是个指针数组,index代表数组的索引,即环境变量名得索引,看default_environment数组就能够明白

如果你已经自己看过了这两段for循环,你可能知道外层for循环在遍历default_environment数组,内层判断是否超出环境变量的

大校后面外层循环会执行507行的envmatch函数

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

网站地图

Top