嵌入式Linux - flashcp命令在写入大于16MiB的映像时失败

描述

我正在尝试使用flashcp命令写入128Mib闪存器件。

我想写的图像超过16MiB。

我使用以下命令:

 flashcp -v /mnt/image.ub/ / dev / mtd2 

在写入操作的大约一半时,会发生Linux内核错误:

root @ zynq-microzed-z7020:〜#flashcp -v /mnt/image.ub / dev / mtd2
擦除块:1789/1789(100%)
写作数据:7154k / 0k(100%))
验证数据:7154k / 0k(100%))
root @ zynq-microzed-z7020:〜#flashcp -v /mnt/from_cust/image.ub / dev / mtd2
擦除块:4859/4859(100%)
写入数据:11140k / 0k(19433%)无法在虚拟地址ef800000处理内核分页请求
pgd = ee37c000
[ef800000] * pgd = 00000000
内部错误:糟糕:5 [#1] PREEMPT SMP ARM
链接的模块:ipv6
CPU:0 PID:442通讯:spi32766未受污染3.18.0-xilinx-g3913e72#10
任务:eeb14040 ti:ee2aa000 task.ti:ee2aa000
PC位于zynq_qspi_fill_tx_fifo + 0x28 / 0x5c
LR位于zynq_qspi_start_transfer + 0x50 / 0xe8
pc:[<c02f9b20>] lr:[<c02fa37c>] psr:a00f0013
sp:ee2abe90 ip:ef800000 fp:00000000
r10:c0a99d50 r9:0000000a r8:00000000
r7:00000004 r6:00000100 r5:ee9d7dbc r4:ee26a3b0
r3:f006e000 r2:00000000 r1:0000003f r0:ee26a3b0
标志:模式SVC_32 ISA ARM段内核上的FIQ上的NzCv IRQ
控制:18c5387d表:2e37c04a DAC:00000015
处理spi32766(pid:442,堆栈限制= 0xee2aa238)
堆栈:(0xee2abe90到0xee2ac000)
be80:ee26a000 ee26ec00 ee9d7dbc ee9d7d50
bea0:ee9d7dbc ee26a000 00000004 c02f7064 c02f6ff8 ee26a30c ee26a000 ee9d7d50
bec0:00000000 c128124c 00000001 00000000 00000000 c02f7820 eeb14040 ee2aa030
bee0:00000001 c04d4700 c128124c ee26a30c ee26a2d8 ee2aa000 ee2aa010 c128124c
bf00:00000001 00000000 00000000 c003da68 ee26dc00 00000000 ee26a2d8 c003d9bc
bf20:00000000 00000000 00000000 c003d958 ee2aa000 00000000 eeb14040 ee26a2d8
bf40:00000000 00000000 dead4ead ffffffff ffffffff c0acf648 00000000 00000000
bf60:c06019f0 ee2abf64 ee2abf64 00000000 00000000 dead4ead ffffffff ffffffff
bf80:c0acf648 00000000 00000000 c06019f0 ee2abf90 ee2abf90 ee2abfac ee26dc00
bfa0:c003d87c 00000000 00000000 c000e8e8 00000000 00000000 00000000 00000000
bfc0:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
bfe0:00000000 00000000 00000000 00000000 00000013 00000000 35777cff 96ff7e27
来自[<c02fa37c>]的[<c02f9b20>](zynq_qspi_fill_tx_fifo)(zynq_qspi_start_transfer + 0x50 / 0xe8)
来自[<c02f7064>]的[<c02fa37c>](zynq_qspi_start_transfer)(spi_transfer_one_message + 0x6c / 0x1c8)
来自[<c02f7820>]的[<c02f7064>](spi_transfer_one_message)(spi_pump_messages + 0x42c / 0x468)
来自[<c003da68>]的[<c02f7820>](spi_pump_messages)(kthread_worker_fn + 0xac / 0x158)
来自[<c003d958>]的[<c003da68>](kthread_worker_fn)(kthread + 0xdc / 0xf0)
来自[<c000e8e8>]的[<c003d958>](kthread)(ret_from_fork + 0x14 / 0x2c)
代码:e590c010 e5903000 e35c0000 0a000005(e59cc000)
--- [结束追踪244300203ab18e73] ---

要解决此问题,您可以执行以下任一操作:

注意:从2015年发布标记开始,下面概述的源代码修改已集成到git.xilinx.com上的官方Xilinx GitHub源代码库中。


1.您可以使用dd命令复制映像而不是flashcp命令:

dd if = / mnt / image.ub of = / dev / mtd2

2.或者,您可以在Linux源代码存储库的以下位置对m25p80.c进行以下更改:


Linux的XLNX /司机/ MTD /器件/ m25p80.c

应添加下面的粗体线,另一个注释掉。

+++ devices / m25p80.c 2015-02-23 18:07:08.000000000 +0100
@@ -102,7 +102,7 @@
spi_sync(spi,&m);
- * retlen + = m.actual_length - cmd_sz;
+ * retlen = m.actual_length - cmd_sz;
}
static inline unsigned int m25p80_rx_nbits(struct spi_nor * nor)

更改完成后,重新编译Linux内核源代码。
编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-30 20:43:47 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它