2 具体实现
在此,采用U-Boot 1.1.6版,NAND FLASH使用三星公司的K9F1208UOM。该NAND FLASH每页为512 B,外加16 B额外空间,整个芯片容量为64 MB。在此之前,已经正确配置了相关的宏定义,并移植了相关NAND FLASH的驱动程序,使U-Boot能够正确操作该芯片。
2.1 为U-Boot添加新的命令
实际上,U-Boot中已经实现了所需的nand命令,只要编写好正确的NAND FLASH驱动程序,并定义相应的宏,就可实现对NAND FLASH的基本读写操作。欲添加对Yaffs镜像的支持,只要实现一个新的参数即可。为了给下述工作一个清晰的步骤,在此先简述如何向U-Boot中添加一个新命令。以下所述的路径均在U-Boot源码目录下。
(1)在include/cmd_confdefs.h文件中定义相应命令的宏,不能与已有的宏值重复。
(2)在common/cmd_name.c中实现命令操作的具体代码,文件名中的name即为相应命令的名称。在这个文件中,首先要编写命令的实现函数;此外还要使用一个U_BOOT_CMD()的宏函数来填写该命令的cmd_tbl_t结构体。该结构体的原型是在include\command.h 中定义的,包含相应命令的名称、参数个数、实现函数、用法说明、帮助等信息。最后还要修改common/Makefile文件,将该文件添加为编译的目标。
(3)在相应的开发板头文件(位于include/con-figs/下)中的CONFIG_COMMANDS宏中添加(1)所定义的宏即可使用该命令。
在实现以上步骤时,参照已有命令的相应代码作适当修改即可。
2.2 为nand命令添加新参数
根据以上分析,下面给nand命令添加write.yaffs参数,从而实现对Yaffs镜像的支持。按照第2.1节中的步骤,由于nand命令已经实现,仅需要修改com-mon/cmd_nand.c文件即可。
(1)在common/cmd_nand.c文件的U_BOOT_CMD()宏函数中仿照其他参数,添加该参数的使用说明
定义读写操作的结构体原型中一部分参数没有使用,这些参数与选择ECC的方式有关,由于Yaffs文件系统已包含了OOB数据,故不使用这些参数。另外, opts.skipfirstblk是向nand_write_options_t结构体中新添加的变量,因此需要修改该结构体。在 include/nand.h中,向struct nand_write_options结构体添加如下变量定义:
int skipfirstblk;
此外,需要再修改nand_write_opts函数,以增加对此变量的支持。
2.3 修改nand_write_opts函数
在drivers/nand/nand_util.c中,根据其代码,在while(blockstart!=(mtdoffset&(~erasesize_blockalign+1)))循环体之后添加如下代码: