Para um projeto de flashcart para o Master System, eu precisei de um gravador de EEPROMs, daqueles que geralmente custam mais de 200 reais. Como eu já tinha alguns componentes necessários em mãos, resolvi montar meu próprio gravador por bem menos.
O design original foi feito pelo Tiido Priimägi, que utilizava uma porta paralela. Como eu tenho um sistema 64bits, isso não funcionaria para mim. Me baseei também no projeto MEEPROMMER, que é feito para chips menores e portanto com menos linhas de endereçamento.
Os componentes que eu usei são:
- 1 Arduino-compatível
- 3 Octal Flip-Flops (74HC574)
- 1 Flash EEPROM 4Mbit (512KB) Atmel (AT29C040A)
- Muitos jumpers!
Eu não tenho um esquema em mãos, mas a idéia básica é a seguinte:
- O EEPROM possui 19 linhas de endereçamento, 8 linhas de dados (byte), linhas Chip Enable, Output Enable e Write Enable
- Para ler um byte da memória (ROM padrão JEDEC) basta ligar (LOW-enabled) as linhas que correspondem ao endereço desejado, ligar a linha OE e ler as 8 linhas de dados.
- Para gravar um byte da memória (após ser escrito o código de destravamento, que varia de chip pra chip e está no datasheet) você precisa informar o endereço, ligar o byte a ser gravado nos dados e pulsar (LOW-HIGH) a linha WE. No caso da minha EEPROM é preciso gravar em “páginas” de 256 bytes de cada vez, lendo o último byte e esperando que ele mude antes de começar a próxima página.
Mas você deve estar se perguntando: “Como eu consigo 33(!) linhas no Arduino? O meu só tem 13!” A resposta simples são Shift Registers (74HC595), que recebem uma entrada serial (1 linha) e enviam o resultado em paralelo, em 8 linhas ou mais se juntar com mais Shift Registers.
Porém, para uma EEPROM Flash, isso pode ser um pouco lento demais. Portanto, no meu design eu usei Flip-Flops que mudam instantaneamente com entrada e saída paralelas (8 linhas). Ligando 3 no mesmo “bus”, eu posso usar as mesmas 8 linhas para controlar os 19 bits de endereçamento e depois como I/O de dados. O Flip-Flop é um latch que guarda a entrada na saída quando acionado, isso é, eu posso jogar um byte na sua entrada, acionar e depois mudar a entrada que a saída continua a mesma. Com 3 deles posso endereçar até 24 bits e depois usar as ligações diretas com o Arduino como I/O.
Com isso, a ligação fica assim:
- 8 linhas digitais Input/Output para o “bus”
- 3 linhas digitais Output para controlar cada um dos Flip-Flops
- 3 linhas analógicas usadas como Outputs digitais para controlar as linhas CE, OE e WE da EEPROM.
Feito o hardware do gravador, eu adaptei versões do firmware do projeto EEPROMMER baseado no esquema mostrado acima e do gravador em Python para mandar ROMs pela porta serial. O código está meio “gambiarra” e pode não funcionar para outros chips se não o 29C040, portanto eu não recomendo que usem sem modificações, mas se alguém quiser eu disponibilizo. Quando eu me der bem com algum CAD de esquemas também posto aqui o esquema da ligação se ainda não ficar claro para alguém.