2017-10-18 117 views
8

精制问题MTD擦除块大小

如何阅读和使用擦除块大小为零的MTD SRAM器件写文本信息?

注:

  1. 我现在用的是23K256驱动
  2. 尝试使用MTD-的Util工具已经失败,因为libmtd不能处理的零次
  3. 尝试进行擦除块大小,人为添加的擦除块大小也失败(见下)
  4. 尝试使用echo >catmtdblock只能产生垃圾

原始 我正在尝试读写连接到运行Linux的ARM处理器的SRAM芯片。我不关心我是否像文件,串行设备或内存分区那样与SRAM进行交互。 SRAM芯片的现有设备驱动程序将该设备注册为MTD。我验证了这一点通过检查/proc/mtd

~# cat /proc/mtd 
dev: size erasesize name 
mtd0: 00020000 00000000 "spi1.0" 

我发现了一个教程使用MTD utils的格式化MTD。我遇到的问题是,我不能与SRAM/MTD设备接口,因为所有的用户空间MTD/UBI/JFF2工具崩溃看着这个设备时,IE:

~# mtdinfo 
Count of MTD devices:   1 
Floating point exception (core dumped) 

此异常似乎出现因为所有MTD实用程序都使用libmtd。 libmtd中的mtd_get_dev_info1函数除以擦除块大小,在我的情况下,擦除块大小为零。

mtd->eb_cnt = mtd->size/mtd->eb_size; 

尽管这个芯片有一个MTD驱动器,但我不认为写周期是一个问题,这就是为什么擦除块是零。所以我的问题如下:

  1. 我应该修改驱动程序给芯片一个擦除块的大小,以便实用程序工作正常吗?如果是这样的大小?
  2. 我应该修改libmtd来忽略零擦除块大小吗?如果是这样,我应该如何设置eb_cnt
  3. 有更好的方法来读取和写入数据到MTD设备吗?

其他注意事项:

  1. 稳定性比我的处境最佳的性能更重要
  2. 我试图做一个echo test > /dev/mtdblock0cat /dev/mtdblock0并没有什么,但垃圾

更新10/20 在驱动程序中将擦除块大小更改为1(我希望将其更改为4000 ,但我不确定单位)。 MTD Utils不再抛出之前给出的异常。

~# mtdinfo 
Count of MTD devices:   1 
Present MTD devices:   mtd0 
Sysfs interface supported:  yes 

然而ubiformat不会失败:

~# ubiformat /dev/mtd0 
ubiformat: mtd0 (ram), size 131072 bytes (128.0 KiB), 131072 eraseblocks of 
1 bytes, min. I/O size 1 bytes 
libscan: scanning eraseblock 0 -- 0 % complete libmtd: error!: bad offset 
0 or length 64, mtd0 eraseblock size is 1 
ubiformat: error!: failed to scan mtd0 (/dev/mtd0) 

更新#2 10/20 不幸的是设置擦除块大小4000(实际是0x4000的)导致内核中运行ubiformat

后崩溃
~# ubiformat /dev/mtd0 
ubiformat: mtd0 (ram), size 131072 bytes (128.0 KiB), 8 eraseblocks of 16384 
bytes (16.0 KiB), min. I/O size 1 bytes 
libscan: scanning erasebUnable to handle kernel NULL pointer dereference at 
virtual address 00000000 
libscanpgd = 8cc6c000te 
libscan: scanning eras[00000000] *pgd=8cbbb835, *pte=00000000, *ppte=00000000 
libscan: scanning eInternal error: Oops: 80000007 [#1] PREEMPT SMP ARM 

更新10/23 我试图用FDISK正常格式化驱动器,但似乎是对缺乏缸得到错误:

:~# fdisk /dev/mtdblock0 
... 
Command (m for help): p 
Disk /dev/mtdblock0: 0 MB, 131072 bytes 
255 heads, 63 sectors/track, 0 cylinders 
Units = cylinders of 16065 * 512 = 8225280 bytes 
     Device Boot  Start   End  Blocks Id System 
Command (m for help): n 
Unknown value(s) for: cylinders (settable in the extra functions menu) 
+2

除非你希望的0作为一个特殊的承认“不适用”逻辑上抹除大小将是内存的可寻址宽度 - 在大多数体系结构中为1个字节。但是,SLRAM驱动程序似乎使用其块大小为4k,可能跟在MMU页面大小之后。 –

+0

我将修改驱动程序以将擦除块大小设置为4K并报告发生的情况。 –

+0

+1 @ChrisStratton想法,即将写出4K听起来似乎合理,但我不确定为什么它首先使用这种接口。 – 0andriy

回答

0

有,一旦固定允许写入数据,并从/dev/mtdblock0读取底层硬件问题设备。这通过使用echo TEST > /dev/mtdblock0来编写和cat /dev/mtdblock来验证。

这里是同时研究这个问题

  1. 如果芯片被错误的23K256司机仍然会产生从cat /dev/mtdblock0调用输出正确数量的发现其他错误的摘要。输出将完全相同,而实际未初始化的芯片输出将是随机的。
  2. 所有使用libmtd的应用程序(包括所有mtd-utils)在处理擦除块大小为零的MTD设备时都会出错。
  3. 在驱动程序中人为地将SRAM擦除块大小设置为0x4000,可能会修复此问题。擦除大小为1是不可接受的。
  4. fdisk将错误,由于汽缸的大小为0(可能可以避开使用专家模式)