哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/02/19/6194646.aspx
这里用到yaffs2主要是它的写功能,所以只添加yaffs2关于写部分的代码,参考了网上别人的代码。
在include/configs/TE2440II.h 中添加
#define CONFIG_MTD_NAND_YAFFS21
//
定义一个管理对Yaffs2支持的宏
//
开启Nand Flash默认分区,注意此处的分区要和你的内核中的分区保持一致
#define MTDIDS_DEFAULT
"nand0=nandflash0"
#define MTDPARTS_DEFAULT
"mtdparts=nandflash0:192k(bootloader),"
/
"64k(params),"
/
"2m(kernel),"
/
"-(root)"
添加命令:
#gedit common/cmd_nand.c//在U_BOOT_CMD中添加
U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand,
"NAND sub-system",
"info - show available NAND devices/n"
"nand device [dev] - show or set current device/n"
"nand read - addr off|partition size/n"
"nand write - addr off|partition size/n"
" read/write 'size' bytes starting at offset 'off'/n"
" to/from memory address 'addr', skipping bad blocks./n"
//注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令
#if defined(CONFIG_MTD_NAND_YAFFS2)
"nand write[.yaffs2] - addr off|partition size - write `size' byte yaffs image/n"
"starting at offset off' from memory address addr' (.yaffs2 for 512+16 NAND)/n"
#endif
"nand erase [clean] [off size] - erase 'size' bytes from/n"
" offset 'off' (entire device if not specified)/n"
"nand bad - show bad blocks/n"
"nand dump[.oob] off - dump page/n"
"nand scrub - really clean NAND erasing bad blocks (UNSAFE)/n"
"nand markbad off [...] - mark bad block(s) at offset (UNSAFE)/n"
"nand biterr off - make a bit error at offset (UNSAFE)"
#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
"/n"
"nand lock [tight] [status]/n"
" bring nand to lock state or display locked pages/n"
"nand unlock [offset] [size] - unlock section"
#endif
);
接着,在该文件中对nand操作的do_nand函数中添加yaffs2对nand的操作,如下:
if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0)
{
int read;
if (argc < 4)
goto usage;
addr = (ulong)simple_strtoul(argv[2], NULL, 16);
read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */
printf("/nNAND %s: ", read ? "read" : "write");
if (arg_off_size(argc - 3, argv + 3, nand, &off, &size) != 0)
return 1;
s = strchr(cmd, '.');
if (!s || !strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i"))
{
if (read)
ret = nand_read_skip_bad(nand, off, &size, (u_char *)addr);
else
ret = nand_write_skip_bad(nand, off, &size, (u_char *)addr);
}
//添加yaffs2相关操作,注意该处又关联到nand_write_skip_bad函数
#if defined(CONFIG_MTD_NAND_YAFFS2)
else if (s != NULL && (!strcmp(s, ".yaffs2")))
{
nand->rw_oob = 1;
nand->skipfirstblk = 1;
ret = nand_write_skip_bad(nand,off,&size,(u_char *)addr);
nand->skipfirstblk = 0;
nand->rw_oob = 0;
}
#endif
else if (!strcmp(s, ".oob"))
{
/* out-of-band data */
mtd_oob_ops_t ops =
{
.oobbuf = (u8 *)addr,
.ooblen = size,
.mode = MTD_OOB_RAW
};
if (read)
ret = nand->read_oob(nand, off, &ops);
else
ret = nand->write_oob(nand, off, &ops);
}
else
{
printf("Unknown nand command suffix '%s'./n", s);
return 1;
}
printf(" %zu bytes %s: %s/n", size, read ? "read" : "written", ret ? "ERROR" : "OK");
return ret == 0 ? 0 : 1;
}
在include/linux/mtd/mtd.h头文件的mtd_info结构体中添加上面用到rw_oob和skipfirstblk数据成员,如下:
#gedit include/linux/mtd/mtd.h//在mtd_info结构体中添加
#if defined(CONFIG_MTD_NAND_YAFFS2)
u_char rw_oob;
u_char skipfirstblk;
#endif
在第二步关联的nand_write_skip_bad函数中添加对Nand OOB的相关操作,如下:
#gedit drivers/mtd/nand/nand_util.c//在nand_write_skip_bad函数中添加
int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, u_char *buffer)
{
int rval;
size_t left_to_write = *length;
size_t len_incl_bad;
u_char *p_buffer = buffer;
#if defined(CONFIG_MTD_NAND_YAFFS2)//add yaffs2 file system support
if(nand->rw_oob==1)
{
size_t oobsize = nand->oobsize;
size_t datasize = nand->writesize;
int datapages = 0;
if (((*length)%(nand->oobsize+nand->writesize)) != 0)
{
printf ("Attempt to write error length data!/n");
return -EINVAL;
}
datapages = *length/(datasize+oobsize);
*length = datapages*datasize;
left_to_write = *length;
}
#endif
/* Reject writes, which are not page aligned */
if ((offset & (nand->writesize - 1)) != 0 ||
(*length & (nand->writesize - 1)) != 0) {
printf ("Attempt to write non page aligned data/n");
return -EINVAL;
}
len_incl_bad = get_len_incl_bad (nand, offset, *length);
if ((offset + len_incl_bad) >= nand->size) {
printf ("Attempt to write outside the flash area/n");
return -EINVAL;
}
#if !defined(CONFIG_MTD_NAND_YAFFS2)//add yaffs2 file system support
if (len_incl_bad == *length) {
rval = nand_write (nand, offset, length, buffer);
if (rval != 0)
printf ("NAND write to offset %llx failed %d/n",
offset, rval);
return rval;
}
#endif
while (left_to_write > 0) {
size_t block_offset = offset & (nand->erasesize - 1);
size_t write_size;
WATCHDOG_RESET ();
if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) {
printf ("Skip bad block 0x%08llx/n",
offset & ~(nand->erasesize - 1));
offset += nand->erasesize - block_offset;
continue;
}
#if defined(CONFIG_MTD_NAND_YAFFS2)//add yaffs2 file system support
if(nand->skipfirstblk==1)
{
nand->skipfirstblk=0;
printf ("Skip the first good block %llx/n", offset & ~(nand->erasesize - 1));
offset += nand->erasesize - block_offset;
continue;
}
#endif
if (left_to_write < (nand->erasesize - block_offset))
write_size = left_to_write;
else
write_size = nand->erasesize - block_offset;
printf("/rWriting at 0x%llx -- ",offset);//add yaffs2 file system support
rval = nand_write (nand, offset, &write_size, p_buffer);
if (rval != 0) {
printf ("NAND write to offset %llx failed %d/n",
offset, rval);
*length -= left_to_write;
return rval;
}
left_to_write -= write_size;
printf("%d%% is complete.",100-(left_to_write/(*length/100)));
offset += write_size;
#if defined(CONFIG_MTD_NAND_YAFFS2)//add yaffs2 file system support
if(nand->rw_oob==1)
{
p_buffer += write_size+(write_size/nand->writesize*nand->oobsize);
}
else
{
p_buffer += write_size;
}
#else
p_buffer += write_size;
#endif
}
return 0;
}
在第四步nand_write_skip_bad函数中我们看到又对nand_write函数进行了访问,所以这一步是到nand_write函数中添加对yaffs2的支持,如下:
#gedit drivers/mtd/nand/nand_base.c//在nand_write函数中添加
static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf)
{
struct nand_chip *chip = mtd->priv;
int ret;
#if defined(CONFIG_MTD_NAND_YAFFS2)
//add yaffs2 file system support
int oldopsmode = 0;
if(mtd->rw_oob==1)
{
int i = 0;
int datapages = 0;
size_t oobsize = mtd->oobsize;
size_t datasize = mtd->writesize;
uint8_t oobtemp[oobsize];
datapages = len / (datasize);
for(i = 0; i < (datapages); i++)
{
memcpy((void *)oobtemp, (void *)(buf + datasize * (i + 1)), oobsize);
memmove((void *)(buf + datasize * (i + 1)), (void *)(buf + datasize * (i + 1) + oobsize), (datapages - (i + 1)) * (datasize) + (datapages - 1) * oobsize);
memcpy((void *)(buf+(datapages) * (datasize + oobsize) - oobsize), (void *)(oobtemp), oobsize);
}
}
#endif
/* Do not allow reads past end of device */
if ((to + len) > mtd->size)
return -EINVAL;
if (!len)
return 0;
nand_get_device(chip, mtd, FL_WRITING);
chip->ops.len = len;
chip->ops.datbuf = (uint8_t *)buf;
#if defined(CONFIG_MTD_NAND_YAFFS2)
//add yaffs2 file system support
if(mtd->rw_oob!=1)
{
chip->ops.oobbuf = NULL;
}
else
{
chip->ops.oobbuf = (uint8_t *)(buf + len);
chip->ops.ooblen = mtd->oobsize;
oldopsmode = chip->ops.mode;
chip->ops.mode = MTD_OOB_RAW;
}
#else
chip->ops.oobbuf = NULL;
#endif
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;
#endif
return ret;
}
OK,对yaffs2支持的代码已修改完毕,重新编译u-boot并下载到nand中,启动开发板,在u-boot的命令行输入:nand help查看nand的命令,可以看到多了一个nand write[.yaffs2]的命令,这个就是用来下载yaffs2文件系统到nand中的命令了。
使用nand write[.yaffs2]命令把事前制作好的yaffs2文件系统下载到Nand Flash中,下载操作步骤和效果图如下:
tftp 0x30000000 root-2.6.30.4.bin//用tftp将yaffs2文件系统下载到内存的0x30000000位置
nand erase 0x800000 0x3c00000//擦除Nand的文件系统分区
nand write.yaffs2 0x30000000 0x800000 0x3c00000//将内存中的yaffs2文件系统写入Nand的文件系统分区,注意这里的0x658170是yaffs2文件系统的实际大小(可以在tftp传送完后可以看到),要写正确,否则会形成假坏块
分享到:
相关推荐
linux系统烧写包括u-boot.bin,zImage,rootfs.yaffs2,cramfs
8、添加支持读取SD卡中的FAT32文件系统,现在U-boot已经支持从U盘或SD卡上启动Linux 内核。 9、添加支持OpenOCD导入内存启动,其实就是在一切flash识别之前,检测自己是否在内存,如果已在内存就跳过自拷贝程序。 10...
本u-boot由本人调通,cpu为s3c2440,开发板pw2440,支持nand启动、读、写,支持yaffs2文件系统下载,支持DM9000A网卡,TFTP下载,引导linux内核,最大特色是支持USB下载内核和文件系统,使你的调试变得快捷方便,复杂...
描述了u-boot2010.06移植到mini2440的详细过程.有对nor flash、nand flash、dm9000、yaffs等的支持。
u-boot-2010.06补丁. 1....支持yaffs和yaffs2文件系统烧写; 4.支持usb文件下载;支持tftp下载;支持xmode协议; 5.支持开机logo,bmp图片显示;支持LCD显示串口信息; 6.支持uImage引导。
linux在TQ2440上移植3--yaffs2+文件系统移植.pdf
移植环境:ubuntu16.04.交叉编译器:4.3.2.参考了韦东山老师的第二期毕业班视频,S3C2440支持了yaffs2文件系统。
海思3556V200等平台的SDK在编译的时候,需要自己下载第三方的库。此库由开源社区下载,网速很慢,特上传供大家使用。
《【原创】u-boot-2011.03在mini2440/micro2440上的移植》一文中的uboot,该文地址为 http://blog.csdn.net/csuwzc/archive/2011/05/29/6453623.aspx 再次提醒:我在发布资源时用的是MACH_TYPE_MICRO2440,之前的...
linux在TQ2440上移植4--yaffs2文件系统制作.pdf
yaffs2-src-20100329.tar.gzyaffs2-src-20100329.tar.gzyaffs2-src-20100329.tar.gz
一、首先建立自己的开发板 二、修改时钟 三、移植NOR FLASH 四、移植网卡DM9000 五、支持NAND FLASH读写 六、支持NAND FLASH启动 七、添加分区信息并启动jffs2文件系统 八、支持烧写yaffs文件系统
嵌入式linux yaffs文件系统源代码,非常不错,已用过
1.3.1 移植内核和根文件系统准备工作... 10 1.3.2 修改Linux源码中参数... 11 1.3.3 配置Linux内核... 15 1.3.4、编译内核... 17 第二章 制作根文件系统... 19 2.1 根文件系统预备知识... 19 2.2、构建根文件...
黄刚-u-boot-2009.08-nand flash-mini2440本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载等 。。。。
dnw for linuxyaffs2-src-20100329.tar.gz
ver4.0的基本功能: 1. SD boot,基于linaro u-boot的SPL功能实现 2. 从SD卡的FAT分区上加载文件到SDRAM 3. 将环境变量保存至SD卡 ...添加yaffs2文件系统烧写支持。 +13.添加显示Nandflash烧写进度。
实验七 Linux-2.6.22.6内核移植--Yaffs2文件系统移植 - 41 - 实验八 Linux-2.6.22.6内核移植--添加USB设备驱动 - 43 - 实验九 Linux-2.6.22.6内核移植--添加LCD驱动 - 45 - 实验十 SD卡驱动的移植 - 47 - 实验十一 ...
yaffs yaffs2 文件系统正确补丁包 移植LINUX常用 CSDN有的下载的编译不正确,特发布正确的。
不要用很多积分下载mkimage2yaffs-128M,都是骗积分的,使用这个工具就可以了,带源码。 1. 解压,进入目录,给内核打yaffs2补丁 yaffs2-tool$ ./patch-ker.sh c m ../linux-4.9.84 2. 进入yaffs2-tool/utils ,make...