This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MTD utilities can not be installed



我这边使用的是AM335X EVM platform ,操作系统是 ubuntu 10.04。

我参考了http://processors.wiki.ti.com/index.php/MTD_Utilities去编译mtd utilities,结果却出现了跟下面这位网友完全一样的问题:http://e2e.ti.com/support/embedded/linux/f/354/p/249979/878759.aspx。然后我很好奇的是:在编译mtd-utils时,mtd-utils-d37fcc0目录下面的Makefile,为什么添加上的是CROSS=arm-none-linux-gnueabi-,而不是CROSS=arm-arago-linux-gnueabi-?

 

  • 想问一下TI的FAQ,有没有可以直接使用在am335x平台上的mkfs.jffs2工具可以下载?这个有点急。。。我想在SPI  FLASH上面跑起来文件系统,不知道除了默认的jffs2格式外,还能不能用其他的格式?

  • 我后来换了一个mtd-utils版本,然后就可以通过了。但是编译出来的mkfs.jffs2却不能使用。我使用如下命令去制作镜像文件:

    ~/mtd/install/sbin$ sudo ./mkfs.jffs2 -lqn -e 64 -r fs -o 12.jffs2
    ./mkfs.jffs2: 1: Syntax error: word unexpected (expecting ")")

    为什么会出现这样的提示错误,难道是还没安装成功吗?

    ~/mtd/install/sbin$ file mkfs.jffs2
    mkfs.jffs2: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

  • 看起来您是想在嵌入式系统中使用交叉编译好的MTD 工具,其实你完全可以在宿主机Ubuntu下编译和使用MTD工具来制作JFFS2文件系统,并烧写到SPI FALSH中去。

  • 我是已经按照你的说法,在ubuntu下编译和使用mtd-utils,来生成mkfs.jffs2工具。我生成jffs2文件系统的命令是:sudo mkfs.jffs2 -lqn –e 64 -r target -o fs.jffs2,另外我使用的spi flash是winbond的W25Q64,block size:64kB。 当我把生成的文件系统烧写到flash上面后,内核不断的打印如下信息:[    9.039459] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043000: 0xbc30 instead
    [    9.048797] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043004: 0x961c instead
    [    9.058074] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043008: 0x515d instead
    [    9.067321] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0004300c: 0x9e45 instead
    [    9.076599] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043010: 0x643d instead
    [    9.085845] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043014: 0x059f instead
    [    9.095092] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043018: 0x7d32 instead
    [    9.104339] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0004301c: 0x071f instead
    [    9.113586] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043020: 0xe89f instead
    [    9.122863] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00043024: 0x9fa4 instead
    [    9.132110] Further such events for this erase block will not be printed
    [    9.141326] Node at 0x000438f0 with length 0x00000b30 would run over the end of the erase block
    [    9.150421] Perhaps the file system was created with the wrong erase size?
    [    9.157989] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00044000: 0x4e7e instead

     

    我后来从SD卡启动,然后查看Flash erase size,竟然erase size是4KB:

    root@am335x:/usr# cat /proc/mtd
    dev:         size        erasesize name
    mtd0: 00020000 00001000 "SPL"
    mtd1: 00040000 00001000 "U-Boot"
    mtd2: 00002000 00001000 "U-Boot Env"
    mtd3: 00380000 00001000 "Kernel"
    mtd4: 003c0000 00001000 "File System"
    mtd5: 0005d000 00001000 "FPGA File"
    mtd6: 00001000 00001000 "Parameter"

    但是,当我制作文件系统时,sudo mkfs.jffs2 -lqn –e 4 -r target -o fs.jffs2,电脑却提示: Erase size 0x1000 to small. Increasing to 8 KiB minimum。我这一下子就晕了,难道我不应该用w25q64这款flash。如果是这样的话,那我想请问下,从SPI FLASH启动,应该选用那款flash比较合适?

  • JFFS2好像不支持4K擦除,最好改成64K或者32K,另外spi driver也要修改

  • 能说得具体一点怎么改吗?我应该修改spi driver,还是说换一款spi flash?如果是修改spi driver,能具体说一下吗?

  • board-am335xevm.c中的spi分区表要改成64K或者32K对齐的,m25p_probe()这个函数下的eraseblock大小也要修改。

    应该不需要更换spi flash

  • 你好,我按照你说的,改了erase block为64K,把生成的镜像的erase size也设置成64K,该jffs2镜像可以被成功挂载。但是,成功挂载后,只要往里面写入点东西,下次再启动的时候,该jffs2文件系统就不能再被正常识别了。请问下为什么会这样?

  • 你有修改board-am335xevm.c里的分区表吗?这个也要修改

  • 这个是已经修改成64KB对齐的了,因为整个系统和应用程序都可以正常运行。我使用的是windbond的W25Q128,我在m25p80.c这个驱动文件里面的m25p_ids[]这个数组里添加了如下一句话:{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, 0) },最后的flags改为0,系统将会认为该flash的erasesize为64*1024。      但是,当我从SPI FLASH启动,再往跟文件系统里面写点东西,下次再启动,就会出现如下错误:

    [    5.281023] JFFS2 error: (1) jffs2_link_node_ref: Adding new ref cfa8a730 at (0x00920000-0x0092052c) not immediately after previous (0x00920000-0x00920000)
    [    5.295638] ------------[ cut here ]------------
    [    5.300463] kernel BUG at fs/jffs2/nodelist.c:644!
    [    5.305466] Internal error: Oops - undefined instruction: 0 [#1]
    [    5.311730] Modules linked in:
    [    5.314923] CPU: 0    Not tainted  (3.2.0 #78)
    [    5.319572] PC is at jffs2_link_node_ref+0x1a8/0x1b4
    [    5.324764] LR is at console_unlock+0x170/0x1f8
    [    5.329492] pc : [<c0149c90>]    lr : [<c003cf14>]    psr: 60000013
    [    5.329499] sp : cf81db78  ip : cf81da70  fp : cf81dbac
    [    5.341475] r10: 00000000  r9 : 00000000  r8 : cf914000
    [    5.346937] r7 : 00010000  r6 : 0000fff4  r5 : cfa8a730  r4 : cf911da8
    [    5.353750] r3 : c04a5c88  r2 : c04a5c88  r1 : 00000000  r0 : 000000a5
    [    5.360566] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
    [    5.368194] Control: 10c5387d  Table: 80004019  DAC: 00000015
    [    5.374194] Process swapper (pid: 1, stack limit = 0xcf81c2f0)
    [    5.380280] Stack: (0xcf81db78 to 0xcf81e000)
    [    5.384833] db60:                                                       00920000 0092052c
    [    5.393378] db80: 00920000 00920000 cf911da8 0000052c cf911da8 00000000 cfa49000 0000000c
  • 往根文件系统写文件或者多次重启造成的根文件系统出现如上的bug,解决方法: 
    jffs2文件系统在配置上错误所导致的。下面这两条都选上的,去掉后,即可 
    File systems ---> 
    Miscellaneous filesystems ---> 
    [*] JFFS2 summary support (EXPERIMENTAL) 
    [*] JFFS2 XATTR support (EXPERIMENTAL) 
    改为 
    File systems ---> 
    Miscellaneous filesystems ---> 
    [ ] JFFS2 summary support (EXPERIMENTAL) 
    [ ] JFFS2 XATTR support (EXPERIMENTAL)

     

    从网上找的答案,问题算是解决了。但是不清楚为什么跟这两个选项有什么关系?如果有哪位大牛知道的,欢迎解释一下。