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