1.编译启动内核
1.1 重新设置编译内核(去掉默认的nand flash驱动)
make menuconfig ,进入menu菜单重新设置内核参数:
进入-> Device Drivers-> Memory Technology Device (MTD) support-> NAND Device Support
< > NAND Flash support for S3C2410/S3C2440 SoC //去掉默认的nandflash驱动
然后make uImage 编译内核
将新的nandflash驱动模块放入nfs文件系统目录中
1.2然后烧写内核,启动内核
如下图,发现内核启动时,卡住了,是因为我们使用的文件系统是存在nand flash上
所以设置为nfs文件系统才行.
2.挂载nand flash 驱动
2.1如下图,可以看到共添了4个分区: bootloader、params、kernel、root、
刚好对应了程序中的mynand_part数组里面的分区信息
2.2 如下图,可以看到/dev下共创建了4个MTD块设备(mtdblock%d),4个MTD字符设备(mtd%d、mtd%dro)
2.3 如下图,使用cat /proc/partitions ,可以看到分区信息
其中blocks表示分区的容量,每个blocks是1KB
- 使用mount来挂载mtd块设备
mount /dev/mtdblock3 /mnt/ //挂载, mount会自动获取该设备的文件类型
二.使用mtd-util 工具擦除mtdblock3(使用nand之前最好擦除一次)
因为flash的特性如下:
写入,只能把数据(bit)从1改为0;
擦除,只能把所有数据(bit)从0改为1。
所以,要想写入数据之前必须先擦除。因为flash只能写0,写1时其实是保持原来的状态。
1.1 使用mtd-util工具步骤如下:
tar -xjf mtd-utils-05.07.23.tar.bz2 //解压mtd-util工具
cd mtd-utils-05.07.23/util / //进入util目录
vi Makefile //修改交叉编译改为: CROSS=arm-linux-
make //编译,生成flashcp 、flash_erase、flash_eraseall等命令
cp flash_erase flash_eraseall /nfs文件系统目录 //复制命令
1.2mtd-util工具的常用命令介绍
命令:flashcp
作用: copy数据到 flash 中
实例:
./flashcp fs.yaffs2 /dev/mtd0 //将文件系统yaffs2复制到mtd0中
命令:flash_erase
常用参数:
-j 使用jffs2来格式化分区
-q 不打印过程信息
作用:擦除某个分区的指定范围 (其中指定位置必须以0x20000(128K)为倍数)
实例:
./flash_erase /dev/mtd0 0x20000 5 //擦除mtd0从0x20000开始的5块数据 ,128K/块
命令**:flash_eraseall**
常用参数:
-j 使用jffs2来格式化分区(对于norflash才加该参数)
-q 不打印过程信息
作用:擦除整个分区的内容
实例:
./flash_eraseall -q /dev/mtd0 //擦除mtd0,并不打印过程信息
1.3为什么这里的实例都是对mtd字符设备进行操作,而不是mtdblock块设备?
因为每个分区的字符设备,其实就是对应着每个分区块设备。即/dev/mtd3对应/dev/mtdblock3
flash_eraseall, flash_erase那些命令是以ioctl等基础而实现, 而块设备不支持ioctl, 只有字符设备支持
1.4 使用flash_eraseall来擦除分区3
umount /mnt //擦除之前需要使用umount mnt来取消之前的挂载
./flash_eraseall /dev/mtd3 //擦除mtd3
mount -t yaffs /dev/mtdblock3 /mnt/ //使用yaffs类型来挂载mtdblock3块设备
//因为当前的mtdblock3为空,mount命令无法自动获取mtdblock3的文件类型
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20191222202528695.png)