精炼问题
如何从擦除块大小为零的MTD SRAM器件读取和写入文本信息?
注意:
libmtd
无法处理擦除块大小为零echo >
和cat
用于mtdblock
只生成垃圾 原始
我正在尝试读取和写入连接到运行Linux的ARM处理器的SRAM芯片。我不在乎我是否像文件,串行设备或内存分区一样与SRAM接口。 SRAM芯片的现有设备驱动程序将设备注册为MTD。我通过检查/proc/mtd
:
~# cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00000000 "spi1.0"
我找到了一个使用MTD工具格式化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驱动程序,我也不认为写周期是一个问题,这就是擦除块为零的原因。所以我的问题如下:
libmtd
以忽略零擦除块大小吗?如果是这样,我应该将eb_cnt
设置为?附加说明:
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)
答案 0 :(得分:0)
有一个基础硬件问题,一旦修复,允许从/dev/mtdblock0
设备写入和读取数据。这是通过使用echo TEST > /dev/mtdblock0
编写和cat /dev/mtdblock
来阅读来验证的。
以下是研究此问题时发现的其他错误的摘要
cat /dev/mtdblock0
电话产生正确的输出量。输出将完全相同,而实际的未初始化芯片输出将是随机的。 libmtd
的所有应用程序(包括所有mtd-utils
)在处理擦除块大小为零的MTD设备时都会出错。 fdisk
会因柱面尺寸为0而出错(可能会使用专家模式绕行)