<p>Se você preferir ignorar a longa e entediante introdução sobre o OpenOCD e ir direto para a área de download dos scripts do OpenOCD, clique nos links abaixo:</p>
<ul><li><p><ahref="http://www.eluaproject.net/en/Using_OpenOCD?p=Using_OpenOCD#str9files">Arquivos de configuração para STR9-comStick</a></p></li><li><p><ahref="http://www.eluaproject.net/en/Using_OpenOCD?p=Using_OpenOCD#lpc2888files">Arquivos de configuração para LPC2888</a></p></li><li><p><ahref="http://www.eluaproject.net/en/Using_OpenOCD?p=Using_OpenOCD#str7files">Arquivos de configuração para STR7</a></p></li></ul>
<ahref="tut_openocd.html">OpenOCD</a>é uma ferramenta de código aberto que pode ser usada para conectar CPU's de interface <ahref="http://en.wikipedia.org/wiki/JTAG">JTAG</a>. O uso do OpenOCD com uma conexão física JTAG permite a gravação da memória flash (on-chip) de sua CPU (ou carregar o código diretamente para a memória RAM), a leitura da memória interna da CPU (Flash / RAM) e o uso da <ahref="http://sourceware.org/gdb/">gdb</a> para depurar o seu código. É desnecessário afirmar que esta é uma ferramenta muito útil (e especialmente quando a sua CPU for montada em volta de um núcleo ARM, uma vez que, neste caso, é quase certo existir uma interface JTAG que você; pode usar). Dito isto, se o seu único objetivo é gravar o seu firmware, sugiro se possível, que evite usar o OpenOCD. Não é fácil aprender a usá-la adequadamente, por ser uma ferramenta de linha de comando que utiliza configuração de arquivos com muitos parâmetros diferentes, e isso certamente leva tempo para acostumar. Pior, parece que não é muito bem documentada. Na wiki existem poucas informações sobre os parâmetros de configuração, no entanto, existem alguns bons tutoriais de OpenOCD na internet, mas nenhum deles consegue ser completo. E a sintaxe (e mesmo alguns comandos) parece mudar entre versões, o que torna as coisas ainda mais difíceis. É por isso que geralmente uso uma outra ferramenta para grava&cceidl;ão de firmware, quando disponível, e uso o OpenOCD apenas quando não encontro um bom gravador de firmware. Entretanto, se você precisa depurar o seu código, provavelmente você vai precisar usar o OpenOCD, uma vez que as alternativas não são baratas.
Para resumir, você pode esquecer OpenOCD quando:</p>
<ul>
<li><p> o fabricante de sua CPU fornece um programa para gravação em firmware. Certamente este é o caso, porém na maioria das vezes esses programas funcionam somente para Windows;</p></li>
<li><p> precisa depurar o seu código, porém você já tem uma boa noção sobre onde pode estar o seu problema. Neste caso, simplesmente conecte um LED na porta PIO e ligue-o e desligue-o em vários pontos do seu código até localizar exatamente a origem do seu problema. Não me lembro qual foi a última vêz que usei gdb para depuração, pois "depuração com LED" foi da única coisa que precisei.</p></li>
</ul>
<p>Por outro lado, você provavelmente usar´ OpenOCD quando:</p>
<li><p>seu fabricante de sua CPU não fornecer uma programa para gravação em firmware (ou quando é fornecido, este não é o que você precisa);</p></li>
<li><p>você está usando Linux, MacOS ou outro sistema operacional que não é suportado pelo programa fornecido pelo fabricante;</p></li>
<li><p>você precisa realizar difíceis depurações a fim de tentar entender o que existe de errado com a sua aplicação.</p></li>
<p>Afinal, se você resolveu não utilzar o OpenOCD, agora é hora de abandonar esta página e se previnir de possíveis problemas. Caso você precise do OpenOCD, então continue lendo e tentarei tornar este tutorial o menos complicado possível. Entretanto, não espere que este tutorial esgote o assunto sobre OpenOCD, pois não é, minha intenção é dar a você informações suficientes para usar o OpenOCD para gravar eLua na sua placa. Portanto, não citarei aqui qualquer informação sobre depuração usando OpenOCD, somente gravação de firmware. E, antes de começarmos, por favor leia o aviso abaixo.</p>
<p>AVISO: o uso inapropriado do OpenOCD pode causar um comportamento inesperado de sua CPU. Apesar da remota possibilidade de danificar fisicamente a sua CPU devido ao uso do OpenOCD, você pode acabar travando o seu chip, pode apagar uma área de memória que não poderia ser apagada, ou pode até desabilitar a interface JTAG (tornando-a inútil). Se você alterar os scripts fornecidos pelo tutorial, por favor, certifique-se do está fazendo. Além disso, não sou um especialista em OpenOCD, meus arquivos de configuração foram testados, no entanto podem conter erros. Resumindo, este tutorial não possui garantias de funcionamento.</p>
<h2>Obtendo o OpenOCD</h2>
<p>Caso você utilize Windows, o melhor site para baixar o OpenOCD compilado e pronto para usar é o <ahref="http://www.yagarto.de/">Yagarto home page</a>. Este site fornece um instalador muito bom, e parece manter o mesmo padrão de evolução do OpenOCD (as versões do site Yagarto não são as mais recentes, mas estão quase sempre atualizadas). No entanto, se você usa Linux, poderá usar o apt-get ou o pacote gerenciador de sua distribuição:</p>
<p>Parece que a coisa não é bem assim: a versão do OpenOCD que baixei pelo apt-get é do dia 5/9/2007, enquanto a versão do site Yagarto é do dia 19/6/2008. Já que estou usando o OpenOCD para Windowns (devido ao Ubuntu 8.04 não detectar direito o meu adaptador USB-to-JTAG), minhas instruções são relevantes para a versão do Yagarto. Como foi dito na introdução, a função e os parâmetros de comandos diferentes podem variar entre uma versão e outra do OpenOCD, logo, se você deseja utilizar a versão do Yagarto em seu sistema não-Windows, terá que montá-la a partir dos fontes (veja abaixo). A principal fonte de pequisa sobre como montar o OpenOCD a partir dos programa fontes é o site <ahref="http://openfacts.berlios.de/index-en.phtml?title=Building_OpenOCD">OpenOCD build page</a> encontrado na wiki OpenOCD. Além desse site, existe um outro bom tutorial localizado em <ahref="http://forum.sparkfun.com/viewtopic.php?t=11221">aqui</a>. Não irei fornecer as instruções para montagem, pois os dois links mencionados acima tratam muito bem do assunto, e além disso, o processo de montagem é relativamente simples. Entretanto, como os tutoriais explicam como montar baseados na última versão do OpenOCD, você precisará fazer uma pequena modificação para a versão do site Yagarto. A modificação se dá na etapa de verificação do SVN. Substitua este comando:</p>
<p>Não encontrei nenhum site que mostrasse alguma lista de dispositivos suportados pelo OpenOCD. Logo, se você deseja verificar se sua CPU funciona com o OpenOCD, recomendo baixar os fontes mais recentes (como descrito na seção anterior) e faça uma listagem do diretório trunk/src/target/target:</p>
<p>Caso esta listagem contenha algo que pareça com a sua CPU, vocêé um cara de sorte. OpenOCD funciona com o LPC da NXP, AT91SAM da Atmel, STR7/STR9 da ST, e muitos outros.</p>
<p>Em alguns casos, a placa da sua CPU já vem com um adaptador embutido. Por exemplo, a minha <ahref="http://www.luminarymicro.com/products/lm3s8962_can_ethernet_evaluation_kit.html">LM3S8962</a> já vem com os adaptadores USB-JTAG e USB-serial, alternando-se automaticamente. O mesmo acontece com a minha <ahref="http://www.hitex.com/index.php?id=383">STR9-comStick</a>. Entretanto, no caso da minha <ahref="http://www.olimex.com/dev/sam7-ex256.html">SAM7-EX256</a>, só existe um conector JTAG, logo, preciso de um adaptador JTAG separado para conectá-lo. Estou usando o <ahref="http://www.olimex.com/dev/arm-usb-tiny.html">ARM-USB-TINY</a> da Olimex, porém existem adaptadores USB-JTAG de outros fabricantes disponíveis no mercado, como o Amontec <ahref="http://www.amontec.com/jtagkey-tiny.shtml">JTAGKey-Tiny</a>. Além disso, você pode <ahref="http://www.hs-augsburg.de/%7Ehhoegl/proj/usbjtag/usbjtag.html">constuir seu próprio adptador</a>. Apesar de preferir trabalhar com a interface USB, você encontrará também adaptadores para portas LPT. O interessante é que, quando você compra um adaptador JTAG, muito provavelmente, este funcionará com muitas placas usando diferentes CPUs, pois o layout do conector JTAG é padrão e a maioria dos adpatadores JTAG estão prontos para funcionar em diferentes voltagens.
Na verdade, para usar o OpenOCD, você precisará de um arquivo de configuração. O arquivo de configuração serve para o OpenOCD conhecer a composição do seu hardware, tais como:</p>
<pre><code>* the kind of JTAG interface that you're using.<br>* the actual hardware platform you're using (ATM7TDMI, ARM966 and others).<br>* the memory configuration of your CPU (flash banks).<br>* the script used to program the flash memory.<br></code></pre>
<p>Apresentar uma lista com toda as opções de possíveis configurações e os seus respectivos significados, está muito além do escopo deste documento, logo não irei fazer isto, apresentarei exemplos. Para exemplificar, usarei trechos do meu arquivo de configuração da STR-comtick (comstick.cfg) adaptado da distribuição OpenOCD e de outros exemplos (não se preocupe, todos os links para os arquivos citados são fornecidos neste tutorial). Primeiramente, precisamos avisar ao OpenOCD que estamos usando um adaptador STR9-comstick USB-JTAG:</p>
<p>As instruções acima, dizem ao OpenOCD que a qrquitetura utilizada é a ARM966-E sendo executado no modo endian, com dois bancos de memória flash, o primeiro iniciando em 0x0 com 0x80000 bytes de tamanho e o outro iniciando em 0x80000 e com 0x80000 byte de tamanho. Finalmente, o OpenOCD deve saber qual o nome do arquivo de script (este é o arquivo usado para fisicamente programar a memória da CPU):
<p>Também não vou tentar explicar os comandos acima :) Basicamente, eles desprotegem a memória flash, apaga-a, gravam nela o conteúdo do arquivo "main.bin" e em seguida reinicia a CPU. Caso você precise gravar um arquivo com um nome diferente, modifique apenas o "main.bin" na linha de comando "flash write_bank". Para realizar tudo isso, é necessário avisar ao OpenOCD para utilizar o nosso arquivo de configuração:
<p>(nota: no Windows, o nome do arquivo executável do OpenOCD é "openocd-ftd2xx". No Linux é simplesmente "openocd". Substitua-o pelo no do seu executável.) Este é o fim do seu curso relâmpago de OpenOCD. É claro que existe muito mais para se aprender, portanto aqui vai uma lista de links com mais informações sobre esta matéria:</p>
<li><ahref="http://www.hs-augsburg.de/%7Ehhoegl/proj/openocd/oocd-quickref.pdf">Cartela para consulta rápida do OpenOCD</a>. (pouco desatualizado)</li>
<li>Um tutorial muito bom.</li>
<li><ahref="http://openfacts.berlios.de/index-en.phtml?title=OpenOCD_scripts">Exemplos de configuração</a> da página oficial da wiki do OpenOCD.</li>
<li>Uma página excelente sobre o uso do <ahref="http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/openocd_intro/index.html">OpenOCD com controladores ARM</a>, contendo muitos exemplos práticos.</li>
<li>Um interessante <ahref="http://forum.sparkfun.com/viewtopic.php?p=42079">tópico no fórum do SparkFun</a> sobre STR9 e OpenOCD.</li>
<p>O arquivo de configuração comstick.cfg serve para programar o STR9-comStick. O comrst.cfg serve para resetá-lo. O comStick possui um hábito muito interessante: assim que você o liga (via USB) ele não inicia a execução do código da memória flash interna, para iniciá-lo é necessário executar o OpenOCD com o script comreset.cfg. Este script faz exatamente o que ele diz: executa um reset da CPU (já que a placa não possui um botão de RESET). Este é um comportamento bastante peculiar, e não tenho certeza se é algo genérico ou algum problema específico da minha comStick. Acredito que exista algum problema no tratamento do sinal de RESET da CPU pelo conversor USB-JTAG embutido na placa, e a única soluçõ foi executar este script toda vêz que você liga a placa ou precisa dar um RESET.</p>
<p>LPC2888 é algo bastante diferente. Não consegui encontrar um arquivo de configuração "oficial"
do LPC2888 para o OpenOCD, logo tive que aprender como criar o meu próprio arquivo. Ele funciona, porém acredito que possa ser melhorado. No momento, o arquivo de configuração é compatível com o última versão (SVN) do OpenOCD, logo leia este tutorial para entender como obter os mais recentes arquivo fontes do OpenOCD e como compilá-los (esta seção é baseada na verão 922 do repositório do OpenOCD). Então utilize o arquivo abaixo para gravar no chip o arquivo de imagem binária:</p>
<p>Se o nome da sua imagem binária não é main.bin modifique o arquivo alterando a linha correspondente (flash write_bank 0 main.bin 0), e enão chame o OpenOCD da eguinte forma:</p>
da Olimex, no entanto, deve ser fácil usar este script com qualquer outro adaptador JTAG (nã esqueça de alterar o script para se ajustar ao seu adaptador).</p>
<p>Para o STR7, estou usando o Yagarto OpenOCD feito para Windows (repositório versão 717, como está descrito no início deste tutorial). O arquivo de configuração str7prg.cfg serve para programar o STR9-comStick. str7rst.cfg serve para resetá-lo. Estou usando a placa STR711FR2 da <ahref="http://www.sctec.com.br/content/view/101/30/">ScTec</a> na qual conectei alguns LEDs e um conversor MAX3232TTL-R232 para comunicação serial. A placa vem com seu próprio adaptador JTAG, mas ele é usado para uma interface paralela, e como o meu computador não tem uma entrada paralela, usei o <ahref="http://www.olimex.com/dev/arm-usb-tiny.html">ARM-USB-TINY</a> da Olimex. Para usá-los, chamei o OpenOCD da seguinte forma:</p>
<p>(nota: no Windows, o nome do executável do OpenOCD chama-se normalmente "openocd-ftd2xx". No Linux chama-se simplesmente "openocd". Substitua-o com o nome do seu executá atual.) Além disso, certifique-e de alterar o arquivo str7_flashprogram.script caso o nome do seu arquivo imagem não seja main.bin.</p><p></p><p></p><p></p><p></p>