alif — funções do SoC Alif Ensemble

O módulo alif expõe funcionalidades específicas da plataforma para o SoC Alif Ensemble, incluindo um wrapper de dispositivo de bloco para a memória flash OSPI integrada e um utilitário para apresentar informações do SoC a partir dos serviços do Secure Enclave.

Exemplo:

import alif

alif.info()
flash = alif.Flash()

Funções

alif.info() None

Apresenta informações do dispositivo recolhidas dos serviços do Alif Secure Enclave (SE services) no terminal série.

Classes

class alif.Flash(*, start: int = -1, len: int = -1)

Cria um objeto de dispositivo de bloco suportado pela memória flash OSPI integrada. Esta classe só está disponível quando o firmware é compilado com suporte OSPI ativado.

Quando invocada sem argumentos, devolve o objeto singleton predefinido que abrange a região de sistema de ficheiros gravável da flash.

start é o deslocamento em bytes na região de armazenamento da flash. Deve ser múltiplo do tamanho de bloco da flash e estar dentro do intervalo de armazenamento da flash. Por omissão é -1, o que significa começar no deslocamento 0.

len é o comprimento em bytes da região da flash exposta pelo objeto. Deve ser múltiplo do tamanho de bloco da flash e não ultrapassar o fim da região de armazenamento da flash. Por omissão é -1, o que significa usar todos os bytes restantes a partir de start.

O objeto implementa também o protocolo de buffer, permitindo acesso de leitura por mapeamento de memória à região da flash via a base XIP OSPI. Isto disponibiliza uma vista sem cópia de toda a região sem emitir qualquer leitura de flash:

flash = alif.Flash()
view = memoryview(flash)
magic = bytes(view[:4])      # read the first 4 bytes directly from XIP
readblocks(block_num: int, buf: bytearray) int
readblocks(block_num: int, buf: bytearray, offset: int) int

Lê bytes da flash para buf. Duas sobrecargas expõem as interfaces simples e alargada:

Forma simples (readblocks(block_num, buf)): lê blocos completos a partir do índice de bloco block_num. len(buf) deve ser múltiplo do tamanho de bloco da 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. len(buf) não tem restrição de alinhamento.

Devolve 0 em caso de sucesso ou um código de erro negativo. Note que o protocolo padrão de dispositivo de bloco do MicroPython devolve None; o driver alif expõe intencionalmente o código de estado OSPI subjacente para que os chamadores que ignoram vfs possam reagir a erros de hardware.

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

Escreve bytes de buf na flash. Duas sobrecargas expõem as interfaces simples e alargada:

Forma simples (writeblocks(block_num, buf)): escreve blocos completos a partir do índice de bloco block_num. len(buf) deve ser múltiplo do tamanho de bloco da 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. len(buf) não tem restrição de alinhamento, e nenhum apagamento implícito é efetuado – o chamador deve garantir que os blocos afetados foram apagados através de uma chamada prévia a ioctl(6, block_num).

Devolve 0 em caso de sucesso ou um código de erro negativo (consulte readblocks() para a justificação).

ioctl(cmd: int, arg: int) int

Executa uma operação de controlo do dispositivo de bloco. cmd é um dos comandos padrão do MicroPython MP_BLOCKDEV_IOCTL_*:

  • 1 (init) — devolve 0.

  • 2 (deinit) — devolve 0.

  • 3 (sync) — devolve 0.

  • 4 (contagem de blocos) — devolve o número de blocos na região.

  • 5 (tamanho de bloco) — devolve o tamanho de bloco da flash em bytes.

  • 6 (apagar bloco) — apaga o bloco no índice arg e devolve o resultado da operação de apagamento.

Outros valores de cmd devolvem None.

Constantes

alif.usb_msc: bool

Presente e definido como True apenas quando o firmware é compilado com suporte à classe USB Mass Storage ativado. O atributo está ausente caso contrário.