Flash mtd3パーティションに入れたいファイルシステムがあります。まず、ubootを使用して起動し、run sdboot
次のようにSDカードを使用しました。
U-Boot-PetaLinux>
U-Boot-PetaLinux> printenv mtdparts
mtdparts=mtdparts=0:5M(boot),128K(bootenv),10752K(image),4M(spare)
U-Boot-PetaLinux>run sdboot
今私はLinuxシステムを運営しています。
.
.
.
.
root@Xilinx-ZC702-14_7:/mnt/flashboot# nandwrite -p /dev/mtd3 rootfs.jffs2
Image 3513340 bytes, NAND page 1 bytes, OOB area 0 bytes, device size 393216 bytes
nandwrite: error!: Input file does not fit into device
error 0 (Success)
nandwrite: error!: Data was only partially written due to error
error 0 (Success)
では、なぜ表示されますか?
ナンドライト:エラー! :入力ファイルがデバイスに収まりません。
最初の行で私の環境変数を見ることができます。 4MBの十分なスペースを提供しましたが、なぜ3513340バイト(3.35MB)サイズの画像がデバイスに収まらないのですか?そしてこれはどこから来たのですか?
デバイスサイズは393216バイトになりますか?
追加情報
#cat /proc/cmdline
console=ttyPS0,115200
MTD情報:
Count of MTD devices: 4
Present MTD devices: mtd0, mtd1, mtd2, mtd3
Sysfs interface supported: yes
分割
root@Xilinx-ZC702-14_7:/# cat /proc/mtd
dev: size erasesize name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00a80000 00010000 "image"
mtd3: 00060000 00010000 "spare"
また見ることができます:
root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd0
mtd0
Name: boot
Type: nor
Eraseblock size: 65536 bytes, 64.0 KiB
Amount of eraseblocks: 80 (5242880 bytes, 5.0 MiB)
Minimum input/output unit size: 1 byte
Sub-page size: 1 byte
Character device major/minor: 90:0
Bad blocks are allowed: false
Device is writable: true
root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd1
mtd1
Name: bootenv
Type: nor
Eraseblock size: 65536 bytes, 64.0 KiB
Amount of eraseblocks: 2 (131072 bytes, 128.0 KiB)
Minimum input/output unit size: 1 byte
Sub-page size: 1 byte
Character device major/minor: 90:2
Bad blocks are allowed: false
Device is writable: true
root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd2
mtd2
Name: image
Type: nor
Eraseblock size: 65536 bytes, 64.0 KiB
Amount of eraseblocks: 168 (11010048 bytes, 10.5 MiB)
Minimum input/output unit size: 1 byte
Sub-page size: 1 byte
Character device major/minor: 90:4
Bad blocks are allowed: false
Device is writable: true
root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd3
mtd3
Name: spare
Type: nor
Eraseblock size: 65536 bytes, 64.0 KiB
Amount of eraseblocks: 6 (393216 bytes, 384.0 KiB)
Minimum input/output unit size: 1 byte
Sub-page size: 1 byte
Character device major/minor: 90:6
Bad blocks are allowed: false
Device is writable: true
システム
ARM Cortex A9で実行されているpetalinux
http://www.wiki.xilinx.com/Linux
構成ツールのパーティション これは、image.ubを構築する前に使用した設定ツールです。 jffs2のサイズを見ると、rootfs.jffs2ファイルの実際のサイズより大きいです。
/sys/クラス/mtd
root@Xilinx-ZC702-14_7:/sys/class/mtd# ls -ld *
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd0 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd0
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd0ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd0ro
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd1 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd1
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd1ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd1ro
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd2 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd2
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd2ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd2ro
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd3 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd3
lrwxrwxrwx 1 root root 0 Jan 1 00:00 mtd3ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd3ro
root@Xilinx-ZC702-14_7:/sys/class/mtd#
ドライバー
root@Xilinx-ZC702-14_7:~# ls /sys/bus/*/drivers
/sys/bus/amba/drivers:
/sys/bus/clocksource/drivers:
/sys/bus/cpu/drivers:
/sys/bus/hid/drivers:
hid-generic
/sys/bus/i2c/drivers:
at24 dummy pca954x
/sys/bus/mdio_bus/drivers:
Generic PHY
/sys/bus/mmc/drivers:
mmcblk
/sys/bus/platform/drivers:
alarmtimer vexpress-sysreg xilinx-gpio xusbps-dr
of-flash xadcps xilinx_emaclite xusbps-ehci
physmap-flash xdevcfg xqspips xusbps-otg
sdhci-zynq xemacps xslcr xusbps-udc
uio_pdrv_genirq xgpiops xsmcps xwdtps
vexpress-reset xi2cps xuartps zynq_remoteproc
/sys/bus/rpmsg/drivers:
rpmsg_proto rpmsg_server_sample
/sys/bus/scsi/drivers:
ch osst sd sr st
/sys/bus/sdio/drivers:
/sys/bus/serio/drivers:
/sys/bus/spi/drivers:
m25p80
/sys/bus/usb/drivers:
hub usb usb-storage usbfs usbhid
/sys/bus/virtio/drivers:
virtio_rpmsg_bus
root@Xilinx-ZC702-14_7:~#
mmカードドライバ
root@Xilinx-ZC702-14_7:/# cd /sys/bus/mmc/drivers/mmcblk/
root@Xilinx-ZC702-14_7:/sys/bus/mmc/drivers/mmcblk# ls
bind mmc0:1234 uevent unbind
root@Xilinx-ZC702-14_7:/sys/bus/mmc/drivers/mmcblk# cd mmc0\:1234/
root@Xilinx-ZC702-14_7:/sys/devices/amba.0/e0100000.ps7-sdio/mmc_host/mmc0/mmc0:1234# ls
cid hwrev scr
csd manfid serial
date name subsystem
driver oemid type
erase_size power uevent
fwr
解決策
設定ツールを使用し、以前に選択していなかった次の項目を選択して問題を解決しました。
File systems --->
-*- Native language support --->
<*> Codepage 437 (United States, Canada)
...
<*> NLS ISO 8859-1 (Latin 1; Western European Languages)
...
答え1
まず、mtdparts
環境変数が実際のパーティションサイズに関する意味のある情報を渡さないと思います。mtdparts
環境変数ではなくカーネル起動パラメーターでなければなりません。 PetaLinux は起動時にこれらの値を環境に入れることができます。しかし、それでもフォーマットが間違っているようです。カーネルブートパラメータを表示するには、次の手順を実行できますcat /proc/cmdline
。
カーネルが作成するパーティションのサイズを確認するには、/proc/mtd
他の質問を参照してください。実際に生成されたブロックデバイスのサイズをバイト単位で確認するには、次の手順を実行できますblockdev --getsize64 /dev/mtd3
(root権限が必要)。すべてが順調に進むなら、二人は良い相性を実現します!
パーティションサイズが小さすぎると仮定すると、パーティションサイズを増やす必要があります。 (他の質問でもそうでした!)mtdparts
これを行う正しい方法は、起動時にパラメータを指定することです。drivers/mtd/cmdlinepart.c
カーネルソースコードでは、(drivers/mtd/Kconfig
以前に使用されていたほぼ同じコードスニペットよりも少し多くの情報を提供することに注意してください)、正しいフォーマット仕様は次のとおりです。
* The format for the command line is as follows:
*
* mtdparts=<mtddef>[;<mtddef]
* <mtddef> := <mtd-id>:<partdef>[,<partdef>]
* <partdef> := <size>[@<offset>][<name>][ro][lk]
* <mtd-id> := unique name used in mapping driver/device (mtd->name)
* <size> := standard linux memsize OR "-" to denote all remaining space
* size is automatically truncated at end of device
* if specified or trucated size is 0 the part is skipped
* <offset> := standard linux memsize
* if omitted the part will immediately follow the previous part
* or 0 if the first part
* <name> := '(' NAME ')'
* NAME will appear in /proc/mtd
*
* <size> and <offset> can be specified such that the parts are out of order
* in physical memory and may even overlap.
*
* The parts are assigned MTD numbers in the order they are specified in the
* command line regardless of their order in physical memory.
*
* Examples:
*
* 1 NOR Flash, with 1 single writable partition:
* edb7312-nor:-
*
* 1 NOR Flash with 2 partitions, 1 NAND with one
* edb7312-nor:256k(ARMboot)ro,-(root);edb7312-nand:-(home)
それが正確に何を意味するのかstandard linux memsize
は不明です。Documentation/kernel-parameters.txt
次の段落を見ると:
Finally, the [KMG] suffix is commonly described after a number of kernel
parameter values. These 'K', 'M', and 'G' letters represent the _binary_
multipliers 'Kilo', 'Mega', and 'Giga', equalling 2^10, 2^20, and 2^30
bytes respectively. Such letter suffixes can also be entirely omitted.
これは予想される大文字の使用ですが、k
例で使用されている小文字が同じ能力を指定するのか、それとも別の能力を指定するのかについては言及していませんK
(これを無視して状況に応じて大文字を使用するのが最善です)。
質問した内容で見ると、このmtdparts=mtdparts=
部分が間違っているようです。通常、環境変数の場合、変数名は変数値の一部ではありません。それ0
も効果的ではないようですmtd-id
。
あなたが与えた他のすべてはmtdparts
大丈夫だと思います。パーティションのサイズは削除ブロックと同じサイズになるように慎重に選択する必要がありますが、/proc/mtd
他の質問の削除ブロックサイズが64KiBであることを考慮するとそうです。
正しいものを探すmtd-id
実行中のシステムではこれを確認する方法がないようです。 MTDデバイスに関するさまざまな情報は以下で確認できますが、/sys/class/mtd
現在この情報は利用できません。このmtdinfo
コマンドは、この情報を読み込んで書式設定する以外に何もしないように見えるため、あまり役に立ちません。
ただし、使用されているドライバの場合は、カーネルソースコードを見るとそれを見つけることができます。これを行うには、次のコマンドを使用して安定した最新のソースツリーを表示できます。
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
あるいは、ディストリビューションで使用されているカーネルバージョンのコードを使用することをお勧めします。デバイス自体には約1.4 GBをダウンロードするのに十分なスペースがない可能性があることに注意してください。ソースツリーのルート内で、次のコマンドは値が設定されたほとんどの場所を示しています(コードは構造の名前をmtd->name
使用する必要はありませんが、一般的に使用します)。mtd
grep -rE 'mtd(\.|->|-)name[[:space:]]*='
ほとんどの場合、ドライバにハードコードされているか、情報がファイルにあります.dts
。これはまた、私たちが探しているドライバーがここにいる可能性があることを示していますdrivers/mtd
。詳しくは、次のコマンドを使用してください。
for drv in a bunch of drivers; do
find . -iname "*$drv*"
done | grep mtd
ディスプレイMTDドライバは、m25p80
SPIを介して通信するさまざまなフラッシュデバイスで動作します(PCI関連の項目を見つけることが役に立たない理由を説明します)。ソースファイルを見ると、次のコードスニペットに設定されているdrivers/mtd/devices/m25p80.c
ことがわかります。mtd->name
if (data && data->name)
flash->mtd.name = data->name;
else
flash->mtd.name = dev_name(&spi->dev);
残念ながら、ドライバは単一の特定の名前を使用せず、代わりに名前が異なる場所で定義され、使用されるハードウェアによって異なります。もっと詳しく調べてみると、これが構造であることがdata
わかりましたflash_platform_data
。定義を調べると、次のような意見がありますinclude/linux/spi/flash.h
。
* struct flash_platform_data: board-specific flash data
* @name: optional flash device name (eg, as used with mtdparts=)
* @parts: optional array of mtd_partitions for static partitioning
* @nr_parts: number of mtd_partitions for static partitoning
* @type: optional flash device type (e.g. m25p80 vs m25p64), for use
* with chips that can't be queried for JEDEC or other IDs
*
* Board init code (in arch/.../mach-xxx/board-yyy.c files) can
* provide information about SPI flash parts (such as DataFlash) to
* help set up the device and its appropriate default partitioning.
*
* Note that for DataFlash, sizes for pages, blocks, and sectors are
* rarely powers of two; and partitions should be sector-aligned.
mtd-id
フラッシュ自体ではなくマザーボードに固有のようです。この構造の使用法は、-A 2
一致後に2行を印刷し、使用されたほとんどの名前を表示します。
grep -rA 2 '[[:space:]]flash_platform_data'
ファイル名にはボード名も反映されますので、ボードがそこにあることを願っています。よく使われていたので、m25p80
おそらくmtd-id
そうです。
失敗した場合、コードスニペットの他のブランチはデバイスを再追跡しinit_name
ますが、デバイスを見つける方法はわかりません(dmesg
?)。
m25p80
yesと仮定すると、mtd-id
カーネルパラメータは次のようになります。
mtdparts=m25p80:5M(boot),128K(bootenv),10752K(image),4M(spare)
残りはU Bootを再設定してbootargs
パラメータに追加することです。再起動すると、必要なパーティションサイズが得られます。