É possível fazer uma interface JTAG com um arduino?

14

Em caso afirmativo, alguém poderia me direcionar para um site que informa como fazer isso? Acredito que posso ter encontrado um caminho , mas não tenho certeza se ele funcionaria ou não ainda (preciso encontrar algo para testá-lo).

Esta pergunta está relacionada a uma pergunta anterior localizada aqui.

Caso seja necessária mais informação de base.

zec
fonte
JBailey Deparei-me com a sua pergunta sobre o uso de arduino para fazer um conversor JTAG-USB e eu queria saber como é que você faz fora \?

Respostas:

14

Sim, é possível transformar um Arduino em um adaptador ARM JTAG.

Existem três problemas: tensão, velocidade e drivers.

O Arduino roda nativamente a 5V. A maioria dos microcontroladores ARM não é tolerante a 5V em seus pinos JTAG e requer 3,3V. A solução mais fácil é executar o seu Arduino em 3,3V, falhando que você precisará de algum tipo de conversão de nível (consulte I2C de 3,3 a 5,0 V para obter idéias).

O Arduino está conectado a um PC através de um link serial. Duvido que seja possível ir mais rápido que 115200bps, o que tornará as atividades interativas como percorrer o código em um depurador muito lentas. Mas você poderá fazer o upload de códigos e dispositivos de atualização.

O JTAG é um protocolo de alto nível, específico para cada família de processadores, que usa uma interface semelhante à SPI para trocar dados. A maioria dos dongles JTAG fornece apenas uma interface SPI via USB e deixa o restante do trabalho em um aplicativo para PC. OpenOCD e URJTag são escolhas populares. Você precisará de um driver em um destes para o protocolo JTAG do Arduino.

O Bus Pirate é muito parecido com o Arduino (microcontrolador de baixa velocidade + chip FTDI). Ele suporta JTAG com OpenOCD, portanto é certamente possível.

Se você usar uma placa Teensy / Opendous ou outra AVR-USB, poderá usar o eStick-JTAG .

Mas, por JTAG de custo perdido, eu recomendaria um dos dongles baseados em FTDI2232. Eles são baratos e bem suportados pelo OpenOCD.

Toby Jaffey
fonte
5

É possível, mas muito difícil. Eu não gosto dos JTAGs baseados em FTDI, porque os chips FTDI são caixas pretas prontas e ninguém realmente aprende usando-os.

Se eu quisesse construir um USB-JTAG com AVR, conseguiria um com pelo menos suporte USB de velocidade total no chip. Em seguida, obtenha a pilha usb do AVR (códigos-fonte c) e veja um exemplo de USB para serial. Como bitbanging sobre usb é uma péssima idéia (alta latência), ele precisa ser convertido em comandos de nível superior que instruirão o MCU a fazer o bitbanging (ou usar SPI, se possível) e retornar o resultado de alto nível em usb (bytes completos ) Mas vem a necessidade de escrever drivers para o IDE para dar suporte ao novo dispositivo JTAG para depuração. O OpenOCD e o URJTag têm código-fonte de drivers para muitos dispositivos jtag, então você precisará obter e refazer um para o seu dispositivo recém-inventado. Veja como algumas pessoas fizeram trabalhos semelhantes: http://code.google.com/p/estick-jtag/

A.Genchev
fonte
1

Veja o openocd. Os back-end são baseados principalmente na abordagem de bit bang de porta paralela, acho que chega ao ponto de mudar apenas um bit de cada vez. É bastante simples usar o que eu acho que eles chamam de back-end fictício, que é um exemplo. Envie qualquer comando de gravação de bits para o arduino e configure-o ou limpe-o. Quando solicitado a ler o bit de entrada, envie um comando ao arduino para executar essa tarefa e retornar os resultados.

Eu fiz exatamente isso com sucesso, mas não com um arduino, tive uma conversa aberta de um host em um núcleo de braço simulado rodando em um simulador hdl.

Observe que algumas especificações jtag estão fechadas, o córtex-m3, por exemplo, é algum tipo de número reduzido serializado de pinos jtag, que da última vez que olhei não estava disponível sem um NDA. isso pode não importar, porque o openocd cuida de tudo isso enquanto você estiver usando uma interface jtag que o openocd suporta, o back-end é onde o seu arduino e qualquer interface que você usa para acessá-lo entram e tocam .

Como já foi mencionado por Joby, você precisa ter cuidado com as tensões (nem todos os sabores do arduino são 5V e nem todos os controladores de braço são 3,3 volts), o condicionamento de sinais, o aterramento e tudo mais. Se o seu painel de destino for alimentado por um suprimento que esteja em um nível diferente em relação ao que você alimenta seu arduino, você poderá derreter algo ao conectar os dois.

old_timer
fonte
Observe que o uso de uma interface serial (ou pior, USB com seu transporte em pacotes) para a troca de bits de proxy pode ser extremamente lento. É muito mais eficiente fazer com que o microcontrolador execute operações completas e se comunique com ele em um nível mais alto, ou seja, peça para ler este registro, escrever um ou mesmo programar esse bloco de dados.
Chris Stratton
1

É possível, e eu realmente o implementei e expliquei tudo aqui .

Há uma biblioteca no github aqui que consiste em duas partes: o programa que roda no arduino e um script python que envia arquivos XSVF para o arduino.

Você provavelmente precisará de alguns resistores para converter 5 V a 3,3 V, pois a maioria dos FPGAs e CPLDs usa esse nível de tensão.

Também fiz algumas experiências escrevendo um assembler / desmontador para arquivos XSVF, o código está na mesma biblioteca do github e é explicado neste post aqui .

Marcelo Roberto Jimenez
fonte