linux 中mtd设备一般用来干啥的? mtdblock呢,又是干啥的????

linux 中mtd设备一般用来干啥的? mtdblock呢,又是干啥的????,第1张

mtd是字符设备,mtdblock是块设备可以看看dd命令的实现,在busybox里有补充:/dev/mtd/* 或者 /dev/mtd* 这两种表示方式一般表示的是字符设备/dev/mtdblock/* 或者 /dev/mtdblock* 这两种是块设备的表示方式mount 的一般都是块设备貌似dd只对字符设备进行 *** 作举例:The mtd0 is char device of mtdblock0. Create char mtd devices >>mknod /dev/mtd0 c 90 0>mknod /dev/mtd1 c 90 2 Linux系统中/dev/mtd与/dev/mtdblock的区别,即MTD字符设备和块设备的区别1. /dev/mtdN 是Linux 中的MTD架构中,系统自己实现的mtd分区所对应的字符设备,其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。而mtd-util中的flash_eraseall等工具,就是以这些ioctl为基础而实现的工具,实现一些关于Flash的 *** 作。比如,mtd 工具中的 flash_eraseall中的:if (ioctl(fd, MEMGETINFO, &meminfo) != 0) { fprintf(stderr, "%s: %s: unable to get MTD device info\n", exe_name, mtd_device) return 1}其中,MEMGETINFO,就是Linux MTD中的drivers/mtd/nand/mtdchar.c中的:static int mtd_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg){。。。。。case MEMGETINFO: info.type = mtd->type info.flags = mtd->flags info.size = mtd->size info.erasesize = mtd->erasesize info.writesize = mtd->writesize info.oobsize = mtd->oobsize /* The below fields are obsolete */ info.ecctype = -1 info.eccsize = 0 if (copy_to_user(argp, &info, sizeof(struct mtd_info_user)))return -EFAULT break。。。}而/dev/mtdblockN,是Nand Flash驱动中,驱动在用add_mtd_partitions()添加MTD设备分区,而生成的对应的块设备。根据以上内容,也就更加明白,为什么不能用nandwrite,flash_eraseall,flash_erase等工具去对/dev/mtdblockN去 *** 作了。因为/dev/mtdblock中不包含对应的ioctl,不支持你这么 *** 作。2. mtd char 设备的主设备号是90,而mtd block设备的主设备号是31:# ls /dev/mtd? -l crw-r-----1 root root 90, 0 May 30 2007 /dev/mtd0crw-r-----1 root root 90, 2 May 30 2007 /dev/mtd1crw-r-----1 root root 90, 4 Jul 17 2009 /dev/mtd2crw-r-----1 root root 90, 6 May 30 2007 /dev/mtd3crwxrwxrwx1 root root 90, 8 May 30 2007 /dev/mtd4crwxrwxrwx1 root root 90, 10 May 30 2007 /dev/mtd5crwxrwxrwx1 root root 90, 12 May 30 2007 /dev/mtd6crwxrwxrwx1 root root 90, 14 May 30 2007 /dev/mtd7crwxrwxrwx1 root root 90, 16 May 30 2007 /dev/mtd8crwxrwxrwx1 root root 90, 18 May 30 2007 /dev/mtd9# ls /dev/mtdblock? -lbrw-r-----1 root root 31, 0 May 30 2007 /dev/mtdblock0brw-r-----1 root root 31, 1 May 30 2007 /dev/mtdblock1brw-r-----1 root root 31, 2 May 30 2007 /dev/mtdblock2brw-r-----1 root root 31, 3 May 30 2007 /dev/mtdblock3brwxrwxrwx1 root root 31, 4 May 30 2007 /dev/mtdblock4brwxrwxrwx1 root root 31, 5 May 30 2007 /dev/mtdblock5brwxrwxrwx1 root root 31, 6 May 30 2007 /dev/mtdblock6brwxrwxrwx1 root root 31, 7 May 30 2007 /dev/mtdblock7brwxrwxrwx1 root root 31, 8 May 30 2007 /dev/mtdblock8brwxrwxrwx1 root root 31, 9 May 30 2007 /dev/mtdblock9此设备号,定义在/include/linux/mtd/mtd.h中 :#define MTD_CHAR_MAJOR 90#define MTD_BLOCK_MAJOR 313. 其中,mtd的块设备的大小,可以通过查看分区信息获得:# cat /proc/partitionsmajor minor #blocks name31 0 1024 mtdblock031 1 8192 mtdblock131 2 204800 mtdblock231 3 65536 mtdblock331 4 225280 mtdblock4上面中显示的块设备大小,是block的数目,每个block是1KB。而每个字符设备,其实就是对应着上面的每个块设备。即/dev/mtd0对应/dev/mtdblock0,其他以此类推。换句话说,mtdblockN的一些属性,也就是mtdN的属性,比如大小。4。对每个mtd字符设备的 *** 作,比如利用nandwrite去对/dev/mtd0写数据,实际就是 *** 作/dev/mtdblock0。而这些 *** 作里面涉及到的偏移量offset,都指的是此mtd 分区内的偏移。比如向/dev/mtd1的offset为0的位置写入数据,实际 *** 作的是物理偏移offset=/dev/mtd0的大小=1MB=0x100000。

首先说明一下:

在YAFFS2源文件的utils目录下,执行make就可以生成 mkyaffs2image工具,执行

.(要制作yaffs2的目录) (目标镜像)/mkyaffs2image

acl_2.2.47.orig.tar.gz

lzo-2.03.tar.gz

mtd-utils_20080508.orig.tar.gz

zlib-1.2.3.tar.gz

mkfs.jffs2.for.arm-linux-gcc.3.4.1平台.tar.bz2

mkfs.jffs2.for.arm-linux-gcc.4.3.2平台.tar.bz2

mkfs.jffs2.for.pc平台.tar.bz2

如果只需要mkfs.jffs2工具,那么ubuntu 8.10下直接安装jffnms软件包即可,

luther@gliethttp:~$ sudo apt-get install jffnms

如果需要将jffs2移植到arm开发板上,那么就需要下载源码进行交叉编译了,这就是本文的内容.

1.下载工具软件源码包

luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gz

luther@gliethttp:~$ wget http://www.zlib.net/zlib-1.2.3.tar.gz

luther@gliethttp:~$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz

luther@gliethttp:~$ mkdir libs 用来存放下面生成的lib库.

2.编译zlib库

luther@gliethttp:~/zlib-1.2.3$ ./configure --prefix=~/libs --shared

对于交叉编译输入如下指令

luther@gliethttp:~/zlib-1.2.3$ CC=arm-linux-gcc ./configure --prefix=~/libs --shared

luther@gliethttp:~/zlib-1.2.3$ make -j4

luther@gliethttp:~/zlib-1.2.3$ make install

luther@gliethttp:~$ tree ~/libs

/home/ubuntu/libs

|-- include

| |-- zconf.h

| `-- zlib.h

|-- lib

| |-- libz.so ->libz.so.1.2.3

| |-- libz.so.1 ->libz.so.1.2.3

| `-- libz.so.1.2.3

`-- share

`-- man

`-- man3

`-- zlib.3

5 directories, 6 files

这就表示完成了.

3.编译lzo库

luther@gliethttp:~/lzo-2.03$ ./configure --prefix=/home/ubuntu/libs --enable-shared

对于交叉编译输入如下指令

luther@gliethttp:~/lzo-2.03$ CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/home/ubuntu/libs --enable-shared --disable-static

这个还必须要绝对路径才行.

luther@gliethttp:~/lzo-2.03$ make

luther@gliethttp:~/lzo-2.03$ make install

luther@gliethttp:~$ tree ~/libs

.

|-- include

| |-- lzo

| | |-- lzo1.h

| | |-- lzo1a.h

| | |-- lzo1b.h

| | |-- lzo1c.h

| | |-- lzo1f.h

| | |-- lzo1x.h

| | |-- lzo1y.h

| | |-- lzo1z.h

| | |-- lzo2a.h

| | |-- lzo_asm.h

| | |-- lzoconf.h

| | |-- lzodefs.h

| | `-- lzoutil.h

| |-- zconf.h

| `-- zlib.h

|-- lib

| |-- liblzo2.a

| |-- liblzo2.la

| |-- liblzo2.so ->liblzo2.so.2.0.0

| |-- liblzo2.so.2 ->liblzo2.so.2.0.0

| |-- liblzo2.so.2.0.0

| `-- libz.a

`-- share

`-- man

`-- man3

`-- zlib.3

6 directories, 22 files

手工将静态库删掉就行了,

如果是arm平台还需要strip优化.

4.编译mtd-utils-20080508前的准备工作.

编译之前的代码工作

luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/a/acl/acl_2.2.47.orig.tar.gz

luther@gliethttp:~$ mkdir libs/include/sys -p

luther@gliethttp:~$ cp acl-2.2.47/include/acl.h libs/include/sys

luther@gliethttp:~/mtd-utils-20080508$ export LD_LIBRARY_PATH=~/libs/lib:$LD_LIBRARY_PATH

如果还找不到-llzo2,那么把他拷到/usr/lib下,对于交叉编译器,就是拷贝到

比如

luther@gliethttp:~/libs/lib$ sudo cp -a * /vobs/tools/arm-tools/arm-linux-gcc-3.4.1/arm-linux/lib/

luther@gliethttp:~/mtd-utils-20080508$ vim Makefile

修改安装路径

DESTDIR=.

SBINDIR=gliethttp/sbin

MANDIR=gliethttp/share/man

INCLUDEDIR=gliethttp/include

修改CFLAGS变量

CFLAGS := -I./include -I/home/ubuntu/libs/include $(OPTFLAGS)

如果是arm-linux-gcc定义为

CFLAGS := -I./include -I/home/ubuntu/libs/include -DAI_ADDRCONFIG=0x0020 $(OPTFLAGS)

来自/usr/include/netdb.h

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/Makefile

DESTDIR := ~/mtd-utils-20080508

SBINDIR=gliethttp/sbin

MANDIR=gliethttp/share/man

INCLUDEDIR=gliethttp/include

luther@gliethttp:~/mtd-utils-20080508$ vim recv_image.c

拷贝/usr/include/netinet/in.h文件中

arm-linux-gcc中不需要拷贝它.

struct ip_mreq

{

struct in_addr imr_multiaddr

struct in_addr imr_interface

}

结构体数据到头部,否则在u盘版的ubuntu 8.10上老是提示没有ip_mreq定义,虽然上面明明写了#define _USE_MISC

arm-linux-gcc中还需要创建如3下个目录

luther@gliethttp:~/mtd-utils-20080508$ mkdir arm-linux

luther@gliethttp:~/mtd-utils-20080508$ cp -r ubi-utils arm-linux/

luther@gliethttp:~/mtd-utils-20080508$ cp -r include arm-linux/

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/libpfiflash.c

将所有EBUF(PFIFLASH_ERRSTR[-rc])全部替换为EBUF("%s", PFIFLASH_ERRSTR[-rc])

vim下替换脚本为

:%s/EBUF(PFIFLASH_ERRSTR\[-rc\])/EBUF("\%s", PFIFLASH_ERRSTR\[-rc\])/g

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/ubimirror.c

将第206行的

fprintf(stderr, err_buf)

改为

fprintf(stderr, "%s", err_buf) // 想法是好的,因为err_buf中含有%d等format信息,这样接口更加统一,但是编译器似乎还并不支持这样的 *** 作.[luther.gliethttp]

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/unubi.c

将第898行

char fname[PATH_MAX]

改为

char fname[PATH_MAX+1]

luther@gliethttp:~/mtd-utils-20080508$ cd ubi-utils/new-utils

因为-O2优化的原因,会导致如下log信息

error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result

所有手工先编译.o

luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o

对于交叉编译执行如下1条语句

luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ arm-linux-gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o

luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ cd -

好了,上面的所有修改完成之后,就可以执行make成功编译了[luther.gliethttp].

luther@gliethttp:~/mtd-utils-20080508$ make

如果是交叉编译,执行

luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux-

luther@gliethttp:~/mtd-utils-20080508$ make install

对于交叉编译,执行

luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux- install

luther@gliethttp:~/mtd-utils-20080508$ tree gliethttp/

gliethttp/

|-- sbin

| |-- bin2nand

| |-- doc_loadbios

| |-- docfdisk

| |-- flash_erase

| |-- flash_eraseall

| |-- flash_info

| |-- flash_lock

| |-- flash_otp_dump

| |-- flash_otp_info

| |-- flash_unlock

| |-- flashcp

| |-- ftl_check

| |-- ftl_format

| |-- jffs2dump

| |-- mkbootenv

| |-- mkfs.jffs2

| |-- mkpfi

| |-- mtd_debug

| |-- nand2bin

| |-- nanddump

| |-- nandtest

| |-- nandwrite

| |-- nftl_format

| |-- nftldump

| |-- pddcustomize

| |-- pfi2bin

| |-- pfiflash

| |-- recv_image

| |-- rfddump

| |-- rfdformat

| |-- serve_image

| |-- sumtool

| |-- ubiattach

| |-- ubicrc32

| |-- ubicrc32.pl

| |-- ubidetach

| |-- ubigen

| |-- ubimirror

| |-- ubimkvol

| |-- ubinfo

| |-- ubinize

| |-- ubirmvol

| |-- ubiupdatevol

| `-- unubi

`-- share

`-- man

`-- man1

`-- mkfs.jffs2.1.gz

4 directories, 45 files

ep9312开发板上没有任何文件系统flash数据读取

# ./mtd_debug read /dev/mtd0 0 100 gliethttp.bin

Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin

# hexdump gliethttp.bin

0000000 03ff ea00 350c e59f 001c e583 410e e3a0

0000010 4004 e583 4a03 e3a0 4001 e254 fffd 1aff

0000020 4106 e3a0 4004 e583 420f e202 5000 e594

0000030 4001 e084 5000 e594 4001 e084 5000 e594

0000040 4001 e084 5000 e594 4010 e3a0 4008 e583

0000050 4050 e3a0 4001 e254 fffd 1aff 4e1e e3a0

0000060 4008 e583

0000064

#

# ./mtd_debug read /dev/mtd2 0 100 gliethttp.binhexdump gliethttp.bin -Cv

Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin

00000000 1f 8b 08 00 ca 14 7d 4a 02 03 e4 5a 0f 70 93 e7 |......}J...Z.p..|

00000010 79 7f 3f 49 36 b2 31 41 80 a0 0e 38 cd 57 70 16 |y.?I6.1A...8.Wp.|

00000020 93 18 f3 19 3b 60 12 9a d9 60 08 09 4e 22 c0 a4 |....`...`..N"..|

00000030 b4 81 ca 42 92 6d 0d 59 d2 49 72 02 2b 4d dd 60 |...B.m.Y.Ir.+M.`|

00000040 72 84 e1 86 03 a7 21 01 8a d2 b2 4b 2e f3 56 76 |r.....!....K..Vv|

00000050 63 b7 34 0b 1d cd b1 1d 6b b3 95 36 dc 95 db d1 |c.4.....k..6....|

00000060 8b 90 d1 ea |....|

00000064


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7289243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存