Uboot在S3C2440上的移植詳解(五)
主 機(jī):VMWare--Fedora 9
本文引用地址:http://m.butianyuan.cn/article/201611/318067.htm開發(fā)板:Mini2440--64MB Nand,Kernel:2.6.30.4
編譯器:arm-linux-gcc-4.3.2.tgz
u-boot:u-boot-2009.08.tar.bz2
二、移植步驟
Yaffs頁結(jié)構(gòu)說明 |
好了,在了解Nand Flash組成和Yaffs/yaffs2文件系統(tǒng)結(jié)構(gòu)后,我們再回到u-boot中。目前,在u-boot中已經(jīng)有對Cramfs、Jffs2等文件系統(tǒng)的讀寫支持,但與帶有數(shù)據(jù)校驗等功能的OOB區(qū)的Yaffs/Yaffs2文件系統(tǒng)相比,他們是將所有文件數(shù)據(jù)簡單的以線性表形式組織的。所以,我們只要在此基礎(chǔ)上通過修改u-boot的Nand Flash讀寫命令,增加處理00B區(qū)域數(shù)據(jù)的功能,即可以實現(xiàn)對Yaffs/Yaffs2文件系統(tǒng)的讀寫支持。
#gedit include/configs/my2440.h //添加到文件末尾即可 |
#define CONFIG_MTD_NAND_YAFFS2 1//定義一個管理對Yaffs2支持的宏 //開啟Nand Flash默認(rèn)分區(qū),注意此處的分區(qū)要和你的內(nèi)核中的分區(qū)保持一致 |
②、在原來對Nand操作的命令集列表中添加Yaffs2對Nand的寫命令,如下:
接著,在該文件中對nand操作的do_nand函數(shù)中添加yaffs2對nand的操作,如下:
if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) if (argc < 4) addr = (ulong)simple_strtoul(argv[2], NULL, 16); read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */ s = strchr(cmd, .); //添加yaffs2相關(guān)操作,注意該處又關(guān)聯(lián)到nand_write_skip_bad函數(shù) #if defined(CONFIG_MTD_NAND_YAFFS2) else if (!strcmp(s, ".oob")) if (read) printf(" %zu bytes %s: %sn", size, read ? "read" : "written", ret ? "ERROR" : "OK"); return ret == 0 ? 0 : 1; |
③、在include/linux/mtd/mtd.h頭文件的mtd_info結(jié)構(gòu)體中添加上面用到rw_oob和skipfirstblk數(shù)據(jù)成員,如下:
#gedit include/linux/mtd/mtd.h //在mtd_info結(jié)構(gòu)體中添加 |
#if defined(CONFIG_MTD_NAND_YAFFS2) |
④、在第二步關(guān)聯(lián)的nand_write_skip_bad函數(shù)中添加對Nand OOB的相關(guān)操作,如下:
#gedit drivers/mtd/nand/nand_util.c //在nand_write_skip_bad函數(shù)中添加 |
int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, u_char *buffer) #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if (((*length)%(nand->oobsize+nand->writesize)) != 0) datapages = *length/(datasize+oobsize); /* Reject writes, which are not page aligned */ len_incl_bad = get_len_incl_bad (nand, offset, *length); if ((offset + len_incl_bad) >= nand->size) { #if !defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support return rval; while (left_to_write > 0) { WATCHDOG_RESET (); if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) { #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if (left_to_write < (nand->erasesize - block_offset)) printf("rWriting at 0x%llx -- ",offset);//add yaffs2 file system support rval = nand_write (nand, offset, &write_size, p_buffer); left_to_write -= write_size; #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support } return 0; |
⑤、在第四步nand_write_skip_bad函數(shù)中我們看到又對nand_write函數(shù)進(jìn)行了訪問,所以這一步是到nand_write函數(shù)中添加對yaffs2的支持,如下:
#gedit drivers/mtd/nand/nand_base.c //在nand_write函數(shù)中添加 |
static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf) #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support int oldopsmode = 0; if(mtd->rw_oob==1) size_t oobsize = mtd->oobsize; uint8_t oobtemp[oobsize]; for(i = 0; i < (datapages); i++) /* Do not allow reads past end of device */ nand_get_device(chip, mtd, FL_WRITING); chip->ops.len = len; #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if(mtd->rw_oob!=1) ret = nand_do_write_ops(mtd, to, &chip->ops); *retlen = chip->ops.retlen; nand_release_device(mtd); #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support chip->ops.mode = oldopsmode; return ret; |
OK,對yaffs2支持的代碼已修改完畢,重新編譯u-boot并下載到nand中,啟動開發(fā)板,在u-boot的命令行輸入:nand help查看nand的命令,可以看到多了一個nand write[.yaffs2]的命令,這個就是用來下載yaffs2文件系統(tǒng)到nand中的命令了。
⑥、使用nand write[.yaffs2]命令把事前制作好的yaffs2文件系統(tǒng)下載到Nand Flash中(yaffs2文件系統(tǒng)的制作請參考:Linux-2.6.30.4在2440上的移植之文件系統(tǒng)),下載操作步驟和效果圖如下:
⑦、結(jié)合u-boot和內(nèi)核來測試啟動下載的yaffs2文件系統(tǒng)
設(shè)置u-boot啟動參數(shù)bootargs,注意:這一長串參數(shù)要與內(nèi)核配置里面的Boot options-->Default kernel command string的設(shè)置要一致。特別是mtdblock3要根據(jù)內(nèi)核具體的分區(qū)來設(shè),在上一篇中講到了內(nèi)核中Nand的分區(qū)情況,u-boot屬于mtdblock0,param屬于mtdblock1,kernel屬于mtdblock2,root就屬于mtdblock3,所以這里要設(shè)置成root=/dev/mtdblock3,否則文件系統(tǒng)無法啟動成功,會出現(xiàn)一些什么I/O之類的錯誤
好了,最后重啟開發(fā)板,內(nèi)核引導(dǎo)成功,yaffs2文件系統(tǒng)也掛載成功,效果圖如下:
tftp 0x30000000 root-2.6.30.4.bin //用tftp將yaffs2文件系統(tǒng)下載到內(nèi)存的0x30000000位置 nand erase 0x250000 0x3dac000 //擦除Nand的文件系統(tǒng)分區(qū) nand write.yaffs2 0x30000000 0x250000 0x658170 //將內(nèi)存中的yaffs2文件系統(tǒng)寫入Nand的文件系統(tǒng)分區(qū),注意這里的0x658170是yaffs2文件系統(tǒng)的實際大小(可以在tftp傳送完后可以看到),要寫正確,否則會形成假壞塊 |
#gedit common/cmd_nand.c //在U_BOOT_CMD中添加 |
U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand, //注意:這里只添加了yaffs2的寫命令,因為我們只用u-boot下載(即寫)功能,所以我們沒有添加yaffs2讀的命令 "nand erase [clean] [off size] - erase size bytes fromn" |
評論