====== JTAG ======
__NOTOC__
{{wiki:jtag_header.jpg |Interface JTAG com barra de pinos 5x2, 90°}}
----
**ATENÇÃO**
**Os terminais no Zeebo onde devem ser soldados os fios são bastante frágeis. Não exerça muita força ou demore muito tempo com o ferro de solda sobre eles, ou poderão se soltar. Caso isso aconteça, dê ADEUS ao JTAG no Zeebo.**
**Se não tiver experiência com solda ou não estiver confiante para fazer, peça alguém que entenda. Pode ser em alguma eletrônica ou loja onde trabalhem com Xbox.**
----
Na placa filha do Zeebo, como chamada pelo site oficial Mexicano (que deveria ser chamada de mãe :)), existem 10 pads que expõe a interface JTAG primária do MSM7201A (ele também possui a auxiliar, que comumente está ligada ao tap do ARM11, mas não é exposta no Zeebo).
Para utilizar a interface, você precisará de um dongle JTAG. Existem inúmeros modelos de dongles disponíveis no mercado. O único requisito para usá-lo no Zeebo é que ele aceite o nível de tensão que a interface JTAG do MSM7201A trabalha, ou seja, **2,6 V**.
Se não pretende comprar um, você pode fabricar o famoso //Wiggler//, que é um //pseudo-dongle// que utiliza o porta paralela do PC. Muitos dos projetos deste cabo **NÃO** são adequados para o Zeebo, pois trabalham com níveis de tensão maiores e podem danificar o console. Por isso, é necessário o projeto de um Wiggler apropriado: a versão Baixa Tensão, ou Low Voltage (LV).
Com o cabo/dongle em mãos, está na hora de ligá-lo ao Zeebo. Já que na placa só existem os pads, você pode soldar uma barra de pinos 5x2, 90° ou 180°, assim fica mais fácil de ligar os fios. Se preferir, pode também soldar os fios diretamente. Só não demore muito com o ferro de solda nos pads.
===== Construindo um Wiggler-compatível =====
Caso queira construir um cabo, use o projeto abaixo. Ele foi baseado na versão LV encontrado no fórum XDA-Developers ( [[http://forum.xda-developers.com/showpost.php?p=6055979&postcount=412]] ). Seu diagrama foi modificado e simplificado e é específico para o Zeebo. Alguns outros hardwares podem, com pouca ou nenhuma adaptação, ser usados com este cabo, mas foi criado com o Z em mente.
{|class = "wikitable" style="width: 0%;" align="center"
|-
|{{ wiki:R2_sch.png |Esquemático}}
|{{ wiki:R2_brd.png |Layout PCI}}
|}
O projeto em Eagle pode ser obtido aqui: [[http://tripleoxygen.net/files/openzeebo/hardware/zeebojtag_r2.zip]]
O layout foi feito para PCIs com apenas um lado cobreado, e assim facilitar a fabricação.
===== Abrindo o Zeebo =====
Para ter acesso à interface JTAG, basta remover a tampa superior do Zeebo. Siga os detalhes em [[hardware]].
===== Conexão =====
Independente de qual dongle usará, use esta referência para a pinagem no Zeebo.
{{ wiki:jtag_zeebo.jpg |Pinagem JTAG no Zeebo}}
Nos dois casos, o pino //JTAG_TRST// **deve** ser conectado ao pino //VREG_MSMP//, e caso o dongle não tenha clock adaptivo, o pino //JTAG_RTCK// do Zeebo deve ser conectado ao GND. Para os pinos que não forem citados nos diagramas abaixo, deixe-os desconectados.
==== Se fabricou o Wiggler (ARM 14 pinos) ====
{| border="1" cellpadding="5" cellspacing="0" align="center"
|-
! Pino no Zeebo
! Pino no dongle
|-
|| VREG_MSMP || 1 - VREG_MSMP
|-
|| JTAG_TMS || 7 - JTAG_TMS
|-
|| JTAG_TCK || 9 - JTAG_TCK
|-
|| JTAG_TDO || 11 - JTAG_TDO
|-
|| GND || 2 - GND
|-
|| JTAG_RTCK || 4 - GND
|-
|| JTAG_TDI || 5 - JTAG_TDI
|-
|| JTAG_TRST || 3 - VREG_MSMP
|}
==== Outro dongle com pinagem padrão ARM 20 pinos ====
{{ wiki:arm_jtag_20.png |Pinagem padrão ARM 20 pinos}}
{| border="1" cellpadding="5" cellspacing="0" align="center"
|-
! Pino no Zeebo
! Pino no dongle
|-
|| VREG_MSMP || 1 - VCC
|-
|| JTAG_TMS || 7 - TMS
|-
|| JTAG_TCK || 9 - TCLK
|-
|| JTAG_TDO || 13 - TDO
|-
|| GND || Qualquer GND (20, por exemplo)
|-
|| JTAG_TDI || 5 - TDI
|-
|| JTAG_RTCK || 11 - RTCK (se o dongle não tiver RTCK, conecte o pino do Zeebo ao GND)
|}
==== Software ====
Com o cabo ligado, você precisará ter o [[http://openocd.berlios.de/web/|OpenOCD]] instalado em sua máquina para comunicar com o console.
Caso esteja no Linux, é necessário compilar o OpenOCD. Siga os passos em [[http://www.openplug.org/plugwiki/index.php/Setting_Up_OpenOCD_Under_Linux]]. Siga até o passo "Building OpenOCD", pois o resto não servirá. Se for usar Wiggler no Linux, na linha onde se lê:
$ ./configure --enable-maintainer-mode --enable-ft2232_libftdi
Inclua a porta paralela:
$ ./configure --enable-maintainer-mode --enable-ft2232_libftdi --enable-parport --enable-parport_ppdev
Para usuários Windows, baixe-o já compilado daqui: [[http://www.freddiechopin.info/index.php/en/download/category/4-openocd]]
Nos dois casos, opte pela versão 0.4.0.
O OpenOCD necessita de um arquivo de configuração que explica como ele deve comunicar com o dispositivo: qual CPU, IDCODE, velocidade do JTAG, etc... Para o Zeebo, você necessitará de 2 arquivos: um para o ARM9 e outro para o ARM11. Copie os respectivos textos abaixo e salve na pasta "scripts/target" contida na pasta do OpenOCD:
=== ARM9 ===
0@@
=== ARM11 ===
1@@
Estes arquivos servem para o dongle da Signalyzer. Para usá-lo com o Wiggler, substitua o trecho:
2@@
por
3@@
Salve os arquivos com os nomes: "msm7201a_arm9.cfg" e "msm7201a_arm11.cfg", na pasta "target" do OpenOCD. Para usuários Windows, estará na pasta de instalação do OpenOCD. Linux, geralmente em /usr/local/share/openocd.
Ligue seu Zeebo, abra uma janela do terminal e execute (de acordo com qual núcleo pretende controlar/depurar):
sudo openocd -f target/msm7201a_arm9.cfg
Se obter esta saída do OpenOCD, para o ARM9:
4@@
ou para o ARM11:
5@@
Observe as linhas:
Info : JTAG tap: arm9.cpu tap/device found: 0xa01700e1 (mfg: 0x070, part: 0x0170, ver: 0xa)
Info : JTAG tap: arm11.cpu tap/device found: 0xa7b360e1 (mfg: 0x070, part: 0x7b36, ver: 0xa)
Dependendo de qual núcleo, aparecerá os respectivos IDCODEs:
ARM9 - 0xa01700e1
ARM11 - 0xa7b360e1
Agora, abra outro terminal e digite:
telnet localhost 4444
Você verá um prompt fornecido pelo OpenOCD:
6@@
Daqui você envia comandos ao OpenOCD. Agora você já pode ler, escrever na memória; executar passo a passo; modificar registradores; ... enfim,agora tem controle sobre o console!
Já existem algums funções úteis que inclui no arquivo de configuração e que podem ser chamadas no OpenOCD:
***mf** - Pausa a execução e desliga a MMU
***mo** - Liga a MMU e resume a execução
***rst** - Reseta o console
***brew** - Força a execução do BREW Appmgr como primeiro aplicativo.
***em** - Força a execução do EMAPPLET como primeiro aplicativo.
Estas funções serão detalhadas conforme forem usadas pelos outros artigos.