nandflash格式化分区

来源:互联网 发布:python数据挖掘介绍 编辑:程序博客网 时间:2024/06/05 13:25
 

 把nandflash做成ubifs的文件系统(本文章是因为nandflash已经用了一部分了,把剩下的大约200M也格式化了,前面已经用到了mtd0,mtd1,mtd2,所以这次分到了mtd3)

 

1,由IBM、nokia工程师Thomas Gleixner,Artem Bityutskiy等人于2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决当前嵌入式环境下以FLASH作为MTD设备使用时的技术瓶颈。
关键字:
UBI:一种类似于LVM的逻辑卷管理层。主要实现损益均衡,逻辑擦除块、卷管理,坏块管理等。
UBIFS:基于UBI的FLASH日志文件系统。
有关ubifs的详细介绍,请参考:
http://www.linux-mtd.infradead.org/doc/ubi.html
http://www.linux-mtd.infradead.org/doc/ubifs.html


2.2、如何得到ubifs?
2.6.22以后,ubifs活跃于git管理工程中:
git://git.infradead.org/ubi-2.6.git
2.6.27以后,ubifs被整合进内核树中,用户只需下载最新内核即可获取ubifs支持。

内核树中ubifs选项选上步骤:(内核版本 linux-2.6-28)

Device Drivers --> Memory Technology Device(MTD) support --->UBI -Usorted block images--->Enable UBI

File systems--->Miscellaneous filesystems--->UBIFS file system support

 

3,在内核中linux-2.6.28\arch\arm\mach-at91\board-sam9263ek.c中

static struct mtd_partition __initdata ek_nand_partition[]{

}里面后加上

{
  .name = "rootfs4",
  .offset = 0x4000000,
  .size = 0xc800000,
 },

4,ubifs工具

4.1、mtd-utils工具(flash_eraseall、ubiattach、ubimkvol)准备
1)下载(mtd-utils、zlib、lzo)源码
wget http://debian.mirror.inra.fr/debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gz
wget http://www.zlib.net/zlib-1.2.3.tar.gz
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz

2)编译安装zlib
tar xzvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
CC=arm-linux-gcc ./configure --shared --prefix=/usr/local/arm/3.4.5/arm-linux
make
make install
cd ..

3)编译安装lzo
tar xzvf lzo-2.03.tar.gz
cd lzo-2.03
CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/usr/local/arm/3.4.5/arm-linux
make
make install
cd ..

4)编译mtd-utils
tar xzvf mtd-utils_20080508.orig.tar.gz
cd mtd-utils-20080508

修改Makefile文件:
#CROSS=arm-linux-
修改为  CROSS=arm-linux-
BUILDDIR := $(CROSS:-=)
修改为  BUILDDIR := .

修改ubi-utils/Makefile文件:
添加    CROSS=arm-linux-

修改    ubi-utils/new-utils/Makefile文件:
添加    CROSS=arm-linux-

make WITHOUT_XATTR=1

ubi-utils子目录下生成我们需要的ubiattach、ubimkvol等文件(请确保是交叉编译所得)

4.2、mtd-utils工具(mkfs.ubifs、ubinize)准备
git clone git://git.infradead.org/mtd-utils.git
cd mtd-utils/
make

mkfs.ubifs子目录下生成我们需要的mkfs.ubifs工具
ubi-utils/new-utils子目录下生成我们需要的ubinize工具

 

5,把生产的ubiattch   ubimkvol  mkfs.ubifs拷到文件系统中的bin目录下


6,将一个MTD分区挂载为UBIFS格式
● flash_eraseall /dev/mtd3 //擦除mtd3
● ubiattach /dev/ubi_ctrl -m 3 -d 0 //UBI和mtd3关联 ->ubi0
● ubimkvol /dev/ubi0 -n 0 -N rootfs0 -s 190MiB //创建分区ubi0_0设定volume 大小

●mount -t ubifs ubi0_0  /tmp或mount -t ubifs ubi0:rootfs0 /tmp //挂载

7,当用串口调试的时候,把数据存储到tmp文件后,需要执行命令sync,就是把缓存里面的内容真正存储到tmp里去,所以在应用程序中每次存储到tmp文件中的时候都需要执行sync命令

 

8,写个脚本程序放到文件系统里去,当系统运行时候,自动把mtd3挂载到tmp文件下,就不需要执行第6步了

脚本如下:(就是每次开机时候,先关联和挂载,如果挂载不成功,就执行擦除、关联、分空间大小、挂载)

if

      ubiattach /dev/ubi_ctrl -m 3 -d 0 //UBI和mtd3关联 ->ubi0

      mount -t ubifs ubi0_0  /tmp或mount -t ubifs ubi0:rootfs0 /tmp //挂载

}else

{

      flash_eraseall /dev/mtd3 //擦除mtd3
      ubiattach /dev/ubi_ctrl -m 3 -d 0 //UBI和mtd3关联 ->ubi0
      ubimkvol /dev/ubi0 -n 0 -N rootfs0 -s 190MiB //创建分区ubi0_0设定volume 大小

      mount -t ubifs ubi0_0  /tmp或mount -t ubifs ubi0:rootfs0 /tmp //挂载

 

}


9,在应用程序里面,就可以把数据存储到文件/tmp里面了

 

附加功能:

1、如果你想使用ubifs为rootfs,把文件系统内容解压到ubifs挂载目录下,并修改内核启动参数为:
console=ttySAC0 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs

2、如果你想直接在bootloader下烧写ubifs映像,使用以下命令制作ubi烧写映像:
mkfs.ubifs -r rootfs -m 512 -e 15872 -c 3303 -o ubifs.img
ubinize -o ubi.img -m 512 -p 16KiB -s 256 ubinize.cfg

其中:
1)以上命令的参数可从ubifs挂载信息中提取:
UBI: attaching mtd4 to ubi0                                                     
UBI: physical eraseblock size:   16384 bytes (16 KiB)                           
UBI: logical eraseblock size:    15872 bytes                                    
UBI: smallest flash I/O unit:    512                                            
UBI: sub-page size:              256                                            
UBI: VID header offset:          256 (aligned 256)                              
UBI: data offset:                512                                            
UBI: attached mtd4 to ubi0              

2)配置文件ubinize.cfg的内容为:
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=50MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize


 

 


 

原创粉丝点击