首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于SRAM的MTD擦除块大小为零

用于SRAM的MTD擦除块大小为零
EN

Stack Overflow用户
提问于 2017-10-18 17:19:40
回答 1查看 1.7K关注 0票数 10

精化问题

如何从擦除块大小为零的MTD SRAM设备中读取和写入文本信息?

备注:

  1. 我正在使用23K256驱动程序
  2. 使用MTD-Util工具的尝试失败,因为libmtd无法处理擦除块大小为零的操作。
  3. 人为地添加擦除块大小的尝试也失败了(见下文)
  4. 试图将echo >cat用于mtdblock的尝试只会产生垃圾。

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

代码语言:javascript
复制
~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00000000 "spi1.0"

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

代码语言:javascript
复制
~# mtdinfo
Count of MTD devices:           1
Floating point exception (core dumped)

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

代码语言:javascript
复制
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不再抛出以前给出的异常。

代码语言:javascript
复制
~# mtdinfo
Count of MTD devices:           1
Present MTD devices:            mtd0
Sysfs interface supported:      yes

然而,泛格式确实失败了:

代码语言:javascript
复制
~# 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)导致内核在运行泛格式后崩溃

代码语言:javascript
复制
~# 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

Update 10/23 I试图正常使用fdisk格式化驱动器,但由于缺少柱面,似乎出现了错误:

代码语言:javascript
复制
:~# 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-26 19:17:22

存在一个底层硬件问题,一旦修复,就允许从/dev/mtdblock0设备中写入和读取数据。通过使用echo TEST > /dev/mtdblock0编写和cat /dev/mtdblock读取验证了这一点。

以下是在研究这个问题时发现的其他bug的总结

  1. 如果芯片出现故障,23K256驱动程序仍将从cat /dev/mtdblock0调用中产生正确的输出量。输出将是相同的,而实际未初始化的芯片输出将是随机的。
  2. 所有使用libmtd的应用程序,包括所有mtd-utils,在处理擦除块大小为零的MTD设备时都会出错。
  3. 在驱动程序中人为地将SRAM擦除块大小设置为0x4000可能会解决此问题。擦除1的大小是不能接受的。
  4. 由于气缸尺寸为0,fdisk会出错(可以使用专家模式绕开)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46815796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档