SRAM 的 MTD 擦除块大小为零
MTD Erase Block Size of zero for SRAM
细化问题
如何从擦除块大小为零的 MTD SRAM 设备读取和写入文本信息?
备注:
- 我正在使用 23K256 驱动程序
- 尝试使用 MTD-Util 工具失败,因为
libmtd
无法处理大小为零的擦除块
- 人为添加擦除块大小的尝试也失败了(见下文)
- 尝试使用
echo >
和 cat
到 mtdblock
只产生了垃圾
原创
我正在尝试读取和写入连接到 ARM 处理器 运行 Linux 的 SRAM 芯片。我不关心我是否像文件、串行设备或内存分区那样与 SRAM 接口。 SRAM 芯片的现有设备驱动程序将设备注册为 MTD。我通过检查 /proc/mtd
:
验证了这一点
~# cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00000000 "spi1.0"
我找到了使用 MTD 实用程序格式化 MTD 的教程。我遇到的问题是我无法与 SRAM/MTD 设备交互,因为所有用户-space 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 驱动程序,但我认为写周期不是问题,这就是擦除块为零的原因。所以我的问题如下:
- 我是否应该修改驱动程序来为芯片提供擦除块大小,以便实用程序正常工作?如果有,尺寸是多少?
- 我应该修改
libmtd
以忽略零擦除块大小吗?如果是这样,我应该将 eb_cnt
设置为什么?
- 有没有更好的方法来读写MTD设备的数据?
补充说明:
- 在我的情况下,稳定性比最佳性能更重要
- 我试着做了一个
echo test > /dev/mtdblock0
和 cat /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)
存在一个潜在的硬件问题,修复后允许从 /dev/mtdblock0
设备写入和读取数据。这是通过使用 echo TEST > /dev/mtdblock0
写入和 cat /dev/mtdblock
读取来验证的。
这是在研究这个问题时发现的其他错误的总结
- 如果芯片出现故障,23K256 驱动程序仍会从
cat /dev/mtdblock0
调用中产生正确数量的输出。输出都是一样的,而实际未初始化的芯片输出是随机的。
- 所有使用
libmtd
的应用程序,包括所有 mtd-utils
,在处理擦除块大小为零的 MTD 设备时都会出错。
- 在驱动程序中将 SRAM 擦除块大小人为设置为 0x4000 可能 解决此问题。擦除大小 1 是不可接受的。
fdisk
会因为圆柱体大小为 0 而出错(也许可以使用专家模式绕过)
细化问题
如何从擦除块大小为零的 MTD SRAM 设备读取和写入文本信息?
备注:
- 我正在使用 23K256 驱动程序
- 尝试使用 MTD-Util 工具失败,因为
libmtd
无法处理大小为零的擦除块 - 人为添加擦除块大小的尝试也失败了(见下文)
- 尝试使用
echo >
和cat
到mtdblock
只产生了垃圾
原创
我正在尝试读取和写入连接到 ARM 处理器 运行 Linux 的 SRAM 芯片。我不关心我是否像文件、串行设备或内存分区那样与 SRAM 接口。 SRAM 芯片的现有设备驱动程序将设备注册为 MTD。我通过检查 /proc/mtd
:
~# cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00000000 "spi1.0"
我找到了使用 MTD 实用程序格式化 MTD 的教程。我遇到的问题是我无法与 SRAM/MTD 设备交互,因为所有用户-space 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 驱动程序,但我认为写周期不是问题,这就是擦除块为零的原因。所以我的问题如下:
- 我是否应该修改驱动程序来为芯片提供擦除块大小,以便实用程序正常工作?如果有,尺寸是多少?
- 我应该修改
libmtd
以忽略零擦除块大小吗?如果是这样,我应该将eb_cnt
设置为什么? - 有没有更好的方法来读写MTD设备的数据?
补充说明:
- 在我的情况下,稳定性比最佳性能更重要
- 我试着做了一个
echo test > /dev/mtdblock0
和cat /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)
存在一个潜在的硬件问题,修复后允许从 /dev/mtdblock0
设备写入和读取数据。这是通过使用 echo TEST > /dev/mtdblock0
写入和 cat /dev/mtdblock
读取来验证的。
这是在研究这个问题时发现的其他错误的总结
- 如果芯片出现故障,23K256 驱动程序仍会从
cat /dev/mtdblock0
调用中产生正确数量的输出。输出都是一样的,而实际未初始化的芯片输出是随机的。 - 所有使用
libmtd
的应用程序,包括所有mtd-utils
,在处理擦除块大小为零的 MTD 设备时都会出错。 - 在驱动程序中将 SRAM 擦除块大小人为设置为 0x4000 可能 解决此问题。擦除大小 1 是不可接受的。
fdisk
会因为圆柱体大小为 0 而出错(也许可以使用专家模式绕过)