rootfs.jffs2 sistema de arquivos não vai caber em mtd3

3

Eu tenho um sistema de arquivos que estou tentando colocar na partição de memória flash mtd3. Inicializo primeiro usando o uboot e, em seguida, faço run sdboot para inicializar usando o cartão SD como mostrado abaixo:

U-Boot-PetaLinux>
U-Boot-PetaLinux> printenv mtdparts
mtdparts=mtdparts=0:5M(boot),128K(bootenv),10752K(image),4M(spare)
U-Boot-PetaLinux>run sdboot

Agora eu tenho um sistema Linux em execução.

.
.
.
.
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)

Então, por que mostra:

nandwrite: error!: Input file does not fit into device

Você pode ver minhas variáveis ambientais na primeira linha, eu dei espaço suficiente de 4MB, então por que uma imagem de tamanho 3513340 bytes (3.35 MB) não vai caber em um dispositivo? E de onde isso

device size 393216 bytes coming?

Informações adicionais

#cat /proc/cmdline
console=ttyPS0,115200

mtdinfo:

Count of MTD devices:           4
Present MTD devices:            mtd0, mtd1, mtd2, mtd3
Sysfs interface supported:      yes

partições

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"

também pode ser visto que:

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

Sistema

petalinux em execução no córtex ARM A9

link

link

Árvore de dispositivos link

Partição na Ferramenta de Configuração Esta é a ferramenta para configuração que eu uso antes de construir image.ub. Veja o tamanho de jffs2 que é maior que o tamanho real do arquivo rootfs.jffs2.

/ sys / class / 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#

Drivers

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:~#

drivers mmc

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

Solução

Eu resolvi isso usando a ferramenta de configuração e fazendo as seguintes seleções que foram desviadas anteriormente.

File systems  ---> 
-*- Native language support  --->
    <*>   Codepage 437 (United States, Canada)
    ...
    <*>   NLS ISO 8859-1  (Latin 1; Western European Languages)
    ... 
    
por gpuguy 20.03.2014 / 15:44

1 resposta

2

Em primeiro lugar, não acho que a variável mtdparts do ambiente transmita informações significativas sobre quais são os tamanhos reais das partições. mtdparts é suposto ser um parâmetro de inicialização do kernel, em vez de uma variável de ambiente. Pode ser que o PetaLinux esteja colocando esses valores no ambiente durante a inicialização. No entanto, mesmo assim, parece estar no formato errado. Para ver os parâmetros de inicialização do kernel, você pode fazer cat /proc/cmdline .

Para descobrir os tamanhos das partições que o kernel tenta criar, você pode olhar em /proc/mtd conforme sua outra pergunta. Para descobrir o tamanho do dispositivo de bloco real criado (em bytes), você pode fazer blockdev --getsize64 /dev/mtd3 (precisa de privilégios de root). Tudo indo bem os dois devem combinar!

Agora, assumindo que o tamanho da partição é muito pequeno, você vai querer aumentar o tamanho da partição (isto é o que a outra pergunta pergunta!). A especificação do parâmetro mtdparts no momento da inicialização é a maneira correta de fazer isso. De drivers/mtd/cmdlinepart.c no código-fonte do kernel (observe que isso oferece um pouco mais de informações do que o snippet quase idêntico de drivers/mtd/Kconfig que foi usado anteriormente), esta é a especificação de formato correta:

 * 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)

O que exatamente significa standard linux memsize não está claro. Documentation/kernel-parameters.txt dê o seguinte parágrafo:

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.

Este é o uso esperado de letras maiúsculas, mas se o minúsculo k usado no exemplo especifica a mesma ou diferente potência que K não é mencionado (melhor ignorar isso e usar letras maiúsculas pela aparência das coisas).

De sua pergunta, a parte mtdparts=mtdparts= parece estar errada. Normalmente, para uma variável de ambiente, o nome da variável não faz parte do valor da variável. Também 0 não parece ser um mtd-id válido.

Tudo o mais para o seu dado mtdparts parece bem. O tamanho da partição deve ser cuidadosamente escolhido para ser do mesmo tamanho que os blocos de apagar, mas este parece ser o caso, dado o tamanho do bloco de apagar de 64 KiB em /proc/mtd para sua outra pergunta.

Encontrando o mtd-id correto

Parece não haver um método para determinar isso em um sistema em execução. Embora várias informações sobre dispositivos mtd possam ser encontradas em /sys/class/mtd , essas informações não estão disponíveis no momento. O comando mtdinfo parece não fazer nada além de ler e formatar essas informações, de modo que não é muito útil também

No entanto, dado o driver sendo usado, deve ser possível descobrir isso consultando o código-fonte do kernel. Para obter isso, você pode verificar a última árvore de fontes estáveis com:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

Ou você pode preferir usar o código da sua distro para a versão do kernel usada. Observe que provavelmente não haverá espaço suficiente no próprio dispositivo para o download de ~ 1,4 GB. Na raiz da árvore de origem, o comando a seguir revela uma boa parte dos locais em que um valor mtd->name está definido (observe que o código não precisa usar o nome mtd para a estrutura, mas geralmente ):

grep -rE 'mtd(\.|->|-)name[[:space:]]*='

Na maioria dos casos, ele é codificado no driver ou as informações estão em um arquivo .dts . Também mostra que o driver que estamos procurando provavelmente está abaixo de drivers/mtd . Continuando, usando comandos como este:

for drv in a bunch of drivers; do
  find . -iname "*$drv*"
done | grep mtd

mostra que o driver mtd é m25p80 . Isso é para vários dispositivos flash que se comunicam via SPI (isso explica porque procurar por coisas relacionadas a PCI não foi útil). Observando o arquivo de origem drivers/mtd/devices/m25p80.c , vemos que mtd->name está definido no seguinte snippet:

  if (data && data->name)
    flash->mtd.name = data->name;
  else
    flash->mtd.name = dev_name(&spi->dev);

Infelizmente, não há um único nome específico usado por esse driver, mas os nomes são definidos em outro lugar e dependem do hardware usado. Indo mais longe, vemos que data é uma estrutura flash_platform_data . Procurando por sua definição, recebemos este comentário em 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.

Parece que o mtd-id é específico da placa em vez da própria memória flash. O dá usos dessa estrutura, o -A 2 imprime duas linhas após a partida e mostra a maioria dos nomes usados:

grep -rA 2 '[[:space:]]flash_platform_data'

Os nomes de arquivos também refletem os nomes das placas, então, esperamos que a sua esteja lá. Bastante usar apenas m25p80 como mtd-id , então provavelmente é isso.

Se isso falhar, a outra ramificação do snippet de código será rastreada até init_name do dispositivo, embora eu não saiba como encontrar isso ( dmesg ?).

Assumindo que m25p80 é o mtd-id , o parâmetro do kernel deve ser:

mtdparts=m25p80:5M(boot),128K(bootenv),10752K(image),4M(spare)

Tudo o que deve permanecer é reconfigurar o U Boot com isso adicionado ao parâmetro bootargs . Reinicie e esperamos que você tenha os tamanhos de partição necessários.

    
por 25.03.2014 / 12:45