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.