2020 - Rogerio Altmeyer
- Descrição Básica
- O que o projeto contém
- Placa de circuito
- Firmware da placa
- Cliente de linha de comando
- Detalhes da Placa
Esse gravador de EEPROMs nasceu para dar suporte ao desenvolvimento de outro projeto de retro-computing em que estou trabalhando, onde o foco é recriar computadores da década de 80 do zero de forma modular e que seja possível rodar binários originais da época.
O gravador foi criado com base na EEPROM AT28C256 de 32Kb da ATMel, e até o momento o firmware é compativel apenas com esse chip, podendo ser facilmente convertido para outras memórias paralelas.
O projeto é dividido em três partes:
- Projeto esquemático do circuito e desenho da placa PCB (Hardware).
- Firmware que controla a placa (C++)
- Cliente que roda na máquina host responsável pela comunicação com a placa (Python)
A placa usa o Arduino Nano como componente principal, responsavel pela comunicação com o computador host e a programação do chip de memória.
As linhas de controle e o bus de dados estão conectados diretamente ao Nano, e as 15 linhas de endereçamento do chip são alimentadas através de dois shift registers de 8 bits ligados em sequência.
Esquemático do Circuito da Placa V1.3
O projeto da placa está disponível em ZIP com Gerber da Placa. Utilizei os serviços de confecção da JLCPCB.com e recomendo.
O firmware da placa foi desenvolvido em C++ no Eclipse IDE, e traz como característica principal a implementação de interpretador de mensagens vindas do computador host. Com o interpretador de mensagens, foi possível organizar e facilitar a codificação de novas funcionalidades ao firmware.
- 28c_programmer.h Header principal do firmware
- pin_defs.h Header com a definição de pinos
- main.cpp Fonte principal contendo as funções setup() e loop()
- interface.cpp Contém todas as funções responsáveis pela interface entre Arduino e EEPROM
- util.cpp Funções diversas de apoio ao código
- cmd_processor.cpp Implementa o interpretador de mensagens com o host
- cmd_clear_block.cpp Função para limpar EEPROM
- cmd_get_version.cpp Função que retorna a versão do firmware da placa
- cmd_read_block.cpp Função que lê um bloco de 16 bytes e retorna para o host
- cmd_read_byte.cpp Função que lê 1 byte
- cmd_write_block.cpp Função que grava de 1 a 16 bytes na EEPROM
Escrito em Python3, essa camada do projeto é responsável por ler/escrever arquivos na máquina host e enviar/receber para o firmware da placa.
Para rodar o cliente, é preciso ter python3
e instalar as seguintes dependências:
pip3 install argparse
pip3 install pyserial
Também será necessário ajustar as permissões:
chmod +x programmer.py
O cliente irá mostrar o seguinte help abaixo indicando os parâmetros suportados:
#./programmer.py
usage: programmer.py [-h] [--file FILE] [--address ADDRESS_BEGIN]
[--address-end ADDRESS_END]
serial {write,read,clear}
programmer.py: error: the following arguments are required: serial, mode
Parâmetros obrigatórios:
- porta serial
- modo de operação
- write
- read
- clear
Parâmetros opcionais:
- --address Especifica o endereço inicial da operação
- --address-end Especifica o endereço final da operação
- --file Obrigatório para os modos write e read, especifica o arquivo a ser lido/gravado
Gravar o arquivo boot.hex na posição 0x0000
./programmer.py /dev/porta_serial write --file boot.hex
Gravar o arquivo dado.hex na posição 0x1E00
./programmer.py /dev/porta_serial write --file dado.hex --address 0x1e00
Ler toda a EEPROM para o arquivo dump.bin
./programmer.py /dev/porta_serial read --file dump.bin
Ler da EEPROM do endereço 0x1E00 até 0x2A00 para o arquivo dump.bin
./programmer.py /dev/porta_serial read --file dump.bin --address 0x1e00 --address-end 0x2a00
Limpar toda a EEPROM (irá gravar 0xFF em todas as posições de memória)
./programmer.py /dev/porta_serial clear
Limpar um bloco da EEPROM
./programmer.py /dev/porta_serial clear --address 0x1e00 --address-end 0x2a00