嵌入式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内核源代码。
添加评论