class Flash – acesso ao armazenamento flash incorporado

A classe Flash fornece acesso direto ao nível de blocos ao chip flash QSPI externo do RP2040. O controlador implementa a interface vfs.AbstractBlockDev para que possa ser passado a vfs.mount() em configurações de sistema de ficheiros personalizadas.

A maioria dos scripts persiste dados através do sistema de ficheiros montado automaticamente em / e nunca constrói Flash diretamente. Construa uma manualmente quando necessitar de:

  • Montar um sistema de ficheiros não predefinido (p. ex., encapsulado com vfs.VfsFat) numa partição personalizada.

  • Ler ou escrever regiões de firmware ou blocos de dados de fábrica que não pertencem ao sistema de ficheiros.

  • Implementar um formato de armazenamento em flash personalizado que contorna a camada do sistema de ficheiros.

Construtores

class rp2.Flash Flash

Devolve o objeto singleton Flash do dispositivo de blocos suportado pelo chip flash QSPI do RP2040. O primeiro bloco exposto é o imediatamente a seguir à região do firmware, pelo que os chamadores veem apenas a área do chip elegível para o sistema de ficheiros.

Métodos

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

Lê bytes do flash para buf. Ponto de entrada padrão do dispositivo de blocos vfs.AbstractBlockDev utilizado pela camada do sistema de ficheiros.

Forma simples (readblocks(block_num, buf)): lê blocos completos a partir do índice de bloco block_num. len(buf) deve ser um múltiplo do tamanho do bloco flash.

Forma alargada (readblocks(block_num, buf, offset)): lê len(buf) bytes – não necessariamente um número inteiro de blocos – a partir do byte offset dentro do bloco block_num. Utilizado pelo littlefs e outros sistemas de ficheiros endereçáveis por byte.

writeblocks(block_num: int, buf: bytes) None
writeblocks(block_num: int, buf: bytes, offset: int) None

Escreve bytes de buf no flash. Ponto de entrada padrão do dispositivo de blocos vfs.AbstractBlockDev utilizado pela camada do sistema de ficheiros.

Forma simples (writeblocks(block_num, buf)): escreve blocos completos a partir do índice de bloco block_num. len(buf) deve ser um múltiplo do tamanho do bloco flash. Cada bloco afetado é apagado automaticamente antes de ser escrito.

Forma alargada (writeblocks(block_num, buf, offset)): escreve len(buf) bytes – não necessariamente um número inteiro de blocos – a partir do byte offset dentro do bloco block_num. Não é realizado nenhum apagamento implícito – o chamador deve garantir que os blocos afetados foram apagados através de uma chamada prévia a ioctl(6, block_num).

ioctl(cmd: int, arg: int) int | None

Ponto de entrada de controlo padrão vfs.AbstractBlockDev. Chamado pela camada do sistema de ficheiros na montagem/desmontagem e em cada sincronização. Valores de cmd reconhecidos:

  • 1 – inicializar. Devolve 0 em caso de sucesso.

  • 2 – desinicializar. Devolve 0 em caso de sucesso.

  • 3 – sincronizar escritas pendentes. Devolve 0.

  • 4 – devolver o número de blocos flash visíveis ao sistema de ficheiros.

  • 5 – devolver o tamanho do bloco em bytes (tipicamente o tamanho do setor flash, 4096).

  • 6 – apagar o bloco no índice arg. Necessário antes de utilizar a forma alargada de writeblocks.

  • 7 – devolver se o dispositivo suporta o comando de apagamento de bloco (1 no RP2040).

Os chamadores diretos normalmente não utilizam este método – o controlador do sistema de ficheiros despacha os códigos padrão automaticamente assim que a Flash é montada.