Manual

do

Maker

.

com

Laboratório Maker 13: JTAG com ESP32

Laboratório Maker 13: JTAG com ESP32

Os artigos da série "Laboratório Maker" saem com frequência bem menor, mas confesso que é uma das categorias que mais me empolga. Interessante que depende de inspiração e pesquisa, o que me fez chegar ao artigo número 12 da série, com o analisador lógico com a RP Pico. Dessa vez, não menos interessante, vamos fazer um JTAG com ESP32 que tem outras funções também. Acho que até os corações mais peludos se empolgarão dessa vez!

JTAG com ESP32

Baseado no ESP-IDF, o projeto ESP USB Bridge transforma um ESP32-S2 ou ESP32-S3 em um JTAG ou USB-UART. É no mínimo fantástico, um JTAG para ESP feito com ESP! Para esse artigo, estou usando o ESP32-S3. Só encontrei na loja da TAR Eletrônica, no Mercado Livre. Não perca a oportunidade, porque um dos projetos que dá pra fazer nessa placa é reconhecimento de voz e, assim que tiver um tempinho, vou escrever sobre isso também, sem dúvidas.

jtag-with-esp32-1024x372.jpg

Já escrevi um artigo dos primeiros passos com OpenOCD, também fiz um debug com OpenOCD e GDB, um outro sobre o OpenOCD no Raspberry Pi 400 (cujo Raspberry você encontra na Saravati) e claro, fiz um vídeo do setup do SWD para upload e depuração com OpenOCD. Material para se tornar íntimo com o tema não falta.

Serial Bridge Mode

Nesse modo ele funciona como uma ferramenta para flashing. Nada muito significativo, considerando que as placas vem com porta USB, mas é bom saber que nesse modo ele é um USB/TTL.

JTAG bridge mode

Nesse modo ele serve como ferramenta de debug, utilizando OpenOCD para atuar com o JTAG. Se não sabe o que é, consulte os materiais disponibilizados nos links acima. Para desenvolvedores, usar OpenOCD e GDB é uma maneira de agilizar o desenvolvimento e resolver bugs, fazendo pausa no processamento para analisar, por exemplo, valores sendo atribuídos a variáveis.

Mass Storage Device

E aqui temos o recurso mais encantador da RP Pico. Sabe aquele modo de arrastar o firmware para dentro da RP Pico, como se ela fosse um pendrive? Pois então, esse modo habilita esse recurso para nossas MCUs Espressif! Esse modo é suportado "apenas" para as MCUs Espressif; não vai funcionar para gravar firmware em outra coisa.

Como fazer o JTAG com ESP32

O projeto está no github e já fiz um fork do projeto para garantir. Para compilar, precisaremos do ESP-IDF v4.3 ou mais atual, usado para compilar o projeto. Se está habituado a usar a API do Arduino (assim como eu), pode ser que o fato de usar o ESP-IDF lhe incomode, mas calma, só precisaremos para essa etapa.

Para modificar qualquer coisa na configuração padrão, executaremos idf.py menuconfig.

Para compilar o firmware, usamos idf.py build.

Para fazer a gravação no ESP32-S2 ou ESP32-S3, usamos idf.py -p PORTA flash monitor. No caso, monitor é para (obviamente) monitorar.

A gravação deve ser feita por um USB_UART, mas não pela USB da placa que se tornará o JTAG e será utilizada apenas para esse flashing. Posteriormente usaremos a porta USB para fazer a bridge normalmente.

Já mostrei um JTAG próprio para ESP32, o ESP-Prog. Também não poderia deixar de fazer um vídeo com a ESP-Prog no VS Code.

Configurando o ESP-IDF

Normalmente instalo o ESP-IDF no Linux. Podemos fazê-lo no Windows de forma nativa, através de um instalador único - ou, usar o WSL e ter o ambiente configurado no Linux. Acredito que ambas as formas merecem abordagem, até porque o procedimento feito através de WSL no Windows servirá também para um Linux nativo.

Como instalar o ESP-IDF no Windows (nativo)

O termo "nativo" se aplica a execuções feitas no próprio ambiente; no sistema operacional hospedeiro. No caso, utilizando um laptop com Windows instalado no SSD.

A instalação do ESP-IDF através do WSL significa que estamos instalando "nativamente" o ESP-IDF em um sistema virtualizado. Por fim, os binários que geramos para outra plataforma é chamado de "cross-compiling". Para dar um exemplo claro, quando compilamos um firmware para Arduino, estamos gerando um binário para AVR em uma plataforma x86, portanto estamos fazendo "cross-compiling". Esclarecidos os termos, sigamos com a instalação nativa.

No site da Espressif tem um link para o instalador. Desça a página até o título "ESP-IDF Tools Installer". Clique no link de download e baixe a primeira opção (abaixo é só uma imagem, o link está no início deste parágrafo):

download-esp-idf.jpg

Aceite as configurações padrão e apenas confirme tudo até o final. Se abrirão 2 terminais; o primeiro adicionará os paths no Windows. Isso acontecerá apenas uma vez. O segundo terminal é semelhante, mas é o terminal de operação. Nesse ponto já podemos seguir com nosso projeto de JTAG com ESP32. Na próxima vez que for utilizar o ESP-IDF (se for utilizar), haverá um atalho no desktop.

Compilando o projeto de JTAG com ESP32

Se ficar com dúvida em qualquer etapa, assista o vídeo (que deverá ser publicado em 1 ou mais dias, após a publicação desse artigo), que estará em nosso canal DobitaobyteBrasil no Youtube.

No vídeo mostrarei algo que já sabia, mas esqueci; o path para o ESP-IDF não deve conter espaços, caracteres especiais e tem um tamanho limitado. Meu usuário era "Djames Suhanko" e por conta disso a compilação falhou. "Acho" que não mostrei o procedimento no vídeo (que faço por tomadas - ou, "takes", se preferir), mas descrevo o procedimento mais adiante.

Nesse terminal, sugiro a criação de um diretório, por exemplo LAB. Entre no diretório e clone o repositório:

mkdir LAB
cd LAB
git clone https://github.com/DjamesSuhanko/esp-usb-bridge.git

Entre no diretório do projeto clonado e vamos às considerações.

cd esp-usb-bridge

Dependendo da placa, pode ser necessário modificar algum GPIO. Se for o caso, digite:

idf.py menuconfig

Depois que o menu estiver aberto, desça até o menu Bridge Configuration. No vídeo estou mostrando isso. A tela nesse momento será essa:

bridge-menu-1024x620.jpg

Para sair do menu, use Esc. Se alterar algo, use os atalhos descritos no menu abaixo - no caso, a letra S, para salvar.

Se fosse um ESP32-S2, bastaria compilar e fazer flashing. Porém, o tutorial é feito com o ESP32-S3 e, nesse caso, temos que fazer uma pequena mudança. Para "migrar" para o ESP32-S3, digite:

idf.py set-target esp32s3

Isso deve mudar o projeto para o ESP32-S3 e acabam-se os problemas, certo? - Bom, não pra mim. Claro que "eu" devo ter feito algo errado, uma vez que a Espressif não começou escrever o SDK ontem. Porém, por não saber outra forma de fazer, abri um terminal do Ubuntu (instalado pelo já citado outras vezes, WSL) e procurei pelos arquivos contendo referência para o ESP32-S2 (no caso, esp32s2). Modifiquei as ocorrências encontradas no arquivo sdkconfig, dependencies.lock e main/main.c. Todos esses arquivos estão dentro do diretório do projeto. Tem um arquivo que eu só vi depois e recomendo que faça a troca previamente; o sdkconfig.defaults também tem uma referência ao esp32s2.

Para compilar, use:

idf.py build

Para fazer o flashing e também monitorar, use:

idf.ph -p PORTA flash monitor

No caso, "PORTA", varia conforme o sistema operacional e ocupação. Tratando-se de Windows, será COMx, onde "x" pode ser qualquer valor, conforme determinado pela lógica do sistema operacional - que confesso, não faço ideia como o Windows determina uma COM.

O projeto diz explicitamente que deve-se gravar a placa pela UART, não pela USB. Porém não consegui gravar pela UART, então na loucura fiz pela USB. Só que o projeto foi feito usando uma placa ESP32-S2 (cujo modelo não tenho a mínima ideia de qual seja). Lembre-se que essa ESP32-S3 é a da Tar Eletrônica, não é o DevKit, então não sei dizer se o comportamento será igual, mas gravando normalmente pela USB, não tive problemas.

jtag-esp32s3.jpg

A placa tem um LED RGB. Ao fazer o flashing, o LED ficou roxo, logo, ao menos 2 dos GPIOs dedicados ao LED foram acionados, por isso será necessário fazer uma modificação nos GPIOs através do menuconfig. A respectiva tela já foi mostrada mais acima, mas não será nesse artigo que farei os ajustes. No próximo artigo devo mostrar como utilizar esse JTAG e aí já terei corrigido os GPIO. Por enquanto, me dou por satisfeito de ter chegado nesse ponto.

Ponto de atenção - Trocar o nome do diretório do usuário

Se seu usuário no Windows tiver espaço no nome, por exemplo, "Djames Suhanko", vai dar erro na compilação. Foi exatamente o meu caso, mas serviu para demonstração no vídeo. Nesse caso, será necessário fazer um procedimento de m3rd4.

Abra o menu do Windows e digite "configurações". Abra as configurações e clique em "Contas". Clique em "Família e outros usuários" e então "Adicionar outro usuário". Coloque-o como administrador e use a mesma conta de email sua para facilitar. Crie um PIN para servir de login. Reinicie o computador e faça login com esse novo usuário.

Abra novamente o menu do Windows e digite "regedit". Abra um terminal e digite:

wmic usertaccount get name,SID

Observe o SID do usuário que será renomeado.

No regedit, procure pelo caminho:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Clique na conta com o SID correspondente. Do lado direito aparecerá o ProfileImagePath. Clique com o botão direito e então clique em "Modificar". Retire espaço, acento, caractere especial. Faça algo tão simples quanto tudo minúsculo. Evite qualquer novo problema.

Agora abra o Explorer, seja apertando a combinação Win+E ou clicando no Explorer na barra de tarefas. Clique em "Este computador", então vá até C:\Usuários e clique sobre o diretório do usuário a ser renomeado. Agora pressione F2 para renomear. Troque para o nome inserido no registro do windows.

Reinicie o computador e lembre-se: Se fosse Linux, seria diferente, mas bem mais fácil. Haverá um efeito colateral; aplicações que você tenha determinado um path que inclua o nome com espaço antes de ser renomeado falharão em buscar o caminho. Foi o caso do DaVinci Resolve, que incluía o nome do usuário do path do cache. Os "Acessos rápidos" que estiverem no Explorer também deixarão de funcionar. Se são importantes para você, basta recriá-los; ou elimine-os e aguarde que o sistema reestabeleça as prioridades após algum tempo de uso. "Eliminá-los" não quer dizer "apagar". Clique com o botão esquerdo sobre o atalho, então clique em "mostra mais opções". Daí clique em "Desafixar do Acesso rápido".

acesso_rapido.jpg

Vídeo do JTAG com ESP32

Como citei anteriormente, o vídeo estará relacionado ao próximo artigo, mas darei uma passada rápida no que foi mostrado aqui para auxiliar no esclarecimento do processo. Mas aproveite para se inscrever em nosso canal DobitaobyteBrasil no Youtube e clique no sininho para receber notificações, assim você não perde nada, ainda que tenha alguma mudança eventual!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.