gpt4 book ai didi

embedded - SRAM 的 MTD 删除 block 大小为零

转载 作者:行者123 更新时间:2023-12-04 04:40:17 28 4
gpt4 key购买 nike

细化问题

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

笔记:

  • 我正在使用 23K256司机
  • 尝试使用 MTD-Util 工具失败,因为 libmtd无法处理大小为零的删除 block
  • 尝试人为地添加删除 block 大小也失败了(见下文)
  • 尝试使用 echo >catmtdblock只生产垃圾

  • 原创
    我正在尝试读取和写入连接到运行 Linux 的 ARM 处理器的 SRAM 芯片。我不在乎我是否像文件、串行设备或内存分区那样与 SRAM 接口(interface)。 SRAM 芯片的现有设备驱动程序将该设备注册为 MTD。我通过检查 /proc/mtd 验证了这一点:
    ~# cat /proc/mtd
    dev: size erasesize name
    mtd0: 00020000 00000000 "spi1.0"

    我找到了一个使用 MTD utils 格式化 MTD 的教程。我遇到的问题是我无法与 SRAM/MTD 设备交互,因为所有用户空间 MTD/UBI/JFF2 工具在查看此设备时都会崩溃,即:
    ~# mtdinfo
    Count of MTD devices: 1
    Floating point exception (core dumped)

    由于所有 MTD 实用程序都使用 libmtd,因此似乎正在发生此异常。 mtd_get_dev_info1 libmtd 中的函数除以删除 block 大小,在我的情况下,删除 block 大小为零。
    mtd->eb_cnt = mtd->size / mtd->eb_size;

    即使这个芯片有一个 MTD 驱动程序,我不认为写周期是一个问题,这就是删除 block 为零的原因。所以我的问题如下:
  • 我应该修改驱动程序以给芯片一个删除 block 大小,以便实用程序正常工作吗?如果有,尺寸是多少?
  • 我应该修改libmtd忽略零删除 block 大小?如果是这样,我应该如何设置 eb_cnt到?
  • 有没有更好的方法来读取和写入 MTD 设备的数据?

  • 补充笔记:
  • 在我的情况下,稳定性比最佳性能更重要
  • 我试着做一个 echo test > /dev/mtdblock0cat /dev/mtdblock0除了垃圾什么都没有得到

  • 更新 10/20
    在驱动程序中将删除 block 大小更改为 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
    不幸的是,将删除 block 大小设置为 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 ,在处理删除 block 大小为零的 MTD 设备时会出错。
  • 在驱动程序中人为地将 SRAM 删除 block 大小设置为 0x4000 可能会解决此问题。删除大小为 1 是 Not Acceptable 。
  • fdisk由于柱面大小为 0 会出错(可能使用专家模式绕过)
  • 关于embedded - SRAM 的 MTD 删除 block 大小为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46815796/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com