플래시 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
이제 저는 리눅스 시스템을 운영하고 있습니다.
.
.
.
.
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
(루트 권한 필요). 모든 일이 순조롭게 진행된다면 둘은 좋은 궁합을 이룰 것입니다!
이제 파티션 크기가 너무 작다고 가정하면 파티션 크기를 늘려야 합니다. (다른 질문에서도 그랬습니다!) 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.4GB를 다운로드할 공간이 충분하지 않을 수 있다는 점에 유의하세요. 소스 트리의 루트 내부에서 다음 명령은 값이 설정된 대부분의 위치를 보여줍니다 (코드는 구조의 이름을 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
매개변수에 추가하는 것입니다. 재부팅하면 원하는 파티션 크기를 얻을 수 있을 것입니다.