alif — funções do SoC Alif Ensemble

O módulo alif expõe funcionalidades específicas da porta para o SoC Alif Ensemble, incluindo um wrapper de dispositivo de blocos para a flash OSPI embarcada e um auxiliar para obter 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

Imprime no terminal serial as informações do dispositivo coletadas dos serviços do Alif Secure Enclave (SE services).

Classes

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

Cria um objeto de dispositivo de blocos respaldado pela flash OSPI embarcada. Esta classe só está disponível quando o firmware é compilado com suporte a OSPI habilitado.

Quando chamado sem argumentos, retorna o objeto singleton padrão que cobre a região gravável do sistema de arquivos da flash.

start é o deslocamento em bytes dentro da região de armazenamento da flash. Deve ser múltiplo do tamanho do bloco da flash e estar dentro da faixa de armazenamento da flash. O padrã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 do bloco da flash e não estender além do fim da região de armazenamento da flash. O padrão é -1, o que significa usar todos os bytes restantes a partir de start.

O objeto também implementa o protocolo de buffer, permitindo acesso somente leitura mapeado em memória à região da flash por meio da base OSPI XIP. Isso disponibiliza uma visão zero-copy de toda a região sem emitir nenhuma leitura da 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 estendida:

Forma simples (readblocks(block_num, buf)): lê blocos inteiros começando no índice de bloco block_num. len(buf) deve ser múltiplo do tamanho do bloco da flash.

Forma estendida (readblocks(block_num, buf, offset)): lê len(buf) bytes – não necessariamente um número inteiro de blocos – começando no byte offset dentro do bloco block_num. len(buf) não tem restrição de alinhamento.

Retorna 0 em caso de sucesso ou um código de erro negativo. Observe que o protocolo padrão de dispositivo de blocos do MicroPython retorna None; o driver alif expõe intencionalmente o código de status subjacente do OSPI 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 estendida:

Forma simples (writeblocks(block_num, buf)): escreve blocos inteiros começando no índice de bloco block_num. len(buf) deve ser múltiplo do tamanho do bloco da flash. Cada bloco afetado é apagado automaticamente antes de ser escrito.

Forma estendida (writeblocks(block_num, buf, offset)): escreve len(buf) bytes – não necessariamente um número inteiro de blocos – começando no byte offset dentro do bloco block_num. len(buf) não tem restrição de alinhamento e nenhum apagamento implícito é realizado – o chamador deve garantir que os blocos afetados tenham sido apagados por meio de uma chamada ioctl(6, block_num) anterior.

Retorna 0 em caso de sucesso ou um código de erro negativo (veja readblocks() para a justificativa).

ioctl(cmd: int, arg: int) int

Realiza uma operação de controle do dispositivo de blocos. cmd é um dos comandos padrão MP_BLOCKDEV_IOCTL_* do MicroPython:

  • 1 (init) — retorna 0.

  • 2 (deinit) — retorna 0.

  • 3 (sync) — retorna 0.

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

  • 5 (tamanho do bloco) — retorna o tamanho do bloco da flash em bytes.

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

Outros valores de cmd retornam None.

Constantes

alif.usb_msc: bool

Presente e definido como True apenas quando o firmware é compilado com suporte a USB Mass Storage Class habilitado. Caso contrário, o atributo está ausente.