块的MTD擦除块大小为零

Lia*_*lly 9 embedded linux-device-driver embedded-linux

精致的问题

如何从擦除块大小为零的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"
Run Code Online (Sandbox Code Playgroud)

我找到了一个使用MTD工具格式化MTD的教程.我遇到的问题是我无法与SRAM/MTD设备接口,因为所有用户空间MTD/UBI/JFF2工具在查看此设备时崩溃,IE:

~# mtdinfo
Count of MTD devices:           1
Floating point exception (core dumped)
Run Code Online (Sandbox Code Playgroud)

此异常似乎正在发生,因为所有MTD实用程序都使用libmtd.mtd_get_dev_info1libmtd中的函数除以擦除块大小,在我的例子中,擦除块大小为零.

mtd->eb_cnt = mtd->size / mtd->eb_size;
Run Code Online (Sandbox Code Playgroud)

即使该芯片具有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
Run Code Online (Sandbox Code Playgroud)

然而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)
Run Code Online (Sandbox Code Playgroud)

更新#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
Run Code Online (Sandbox Code Playgroud)

更新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)
Run Code Online (Sandbox Code Playgroud)

Lia*_*lly 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,会出现错误(可以使用专家模式来解决)