$$HEADER$$
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:
OpenOCD é uma ferramenta de código aberto que pode ser usada para conectar CPU's de interface JTAG. 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 gdb 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:
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;
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.
Por outro lado, você provavelmente usar´ OpenOCD quando:
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);
você está usando Linux, MacOS ou outro sistema operacional que não é suportado pelo programa fornecido pelo fabricante;
você precisa realizar difíceis depurações a fim de tentar entender o que existe de errado com a sua aplicação.
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.
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.
Caso você utilize Windows, o melhor site para baixar o OpenOCD compilado e pronto para usar é o Yagarto home page. 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:
$ sudo apt-get install openocd
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 OpenOCD build page encontrado na wiki OpenOCD. Além desse site, existe um outro bom tutorial localizado em aqui. 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:
$ svn checkout svn://svn.berlios.de/openocd/trunk
Por este ('717' é uma revisão SVN do Yagarto OpenOCD):
$ svn checkout -r 717 svn://svn.berlios.de/openocd/trunk
Continue as instruções restantes, e ao final você terá o OpenOCD funcionando.
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:
$ ls trunk/src/target/target
at91eb40a.cfg
at91r40008.cfg
cfi.c
....
str9comstick.cfg
....
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.
Para usar o OpenOCD, você precisará de:
Em alguns casos, a placa da sua CPU já vem com um adaptador embutido. Por exemplo, a minha LM3S8962 já vem com os adaptadores USB-JTAG e USB-serial, alternando-se automaticamente. O mesmo acontece com a minha STR9-comStick. Entretanto, no caso da minha SAM7-EX256, só existe um conector JTAG, logo, preciso de um adaptador JTAG separado para conectá-lo. Estou usando o ARM-USB-TINY da Olimex, porém existem adaptadores USB-JTAG de outros fabricantes disponíveis no mercado, como o Amontec JTAGKey-Tiny. Além disso, você pode constuir seu próprio adptador. 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:
* the kind of JTAG interface that you're using.
* the actual hardware platform you're using (ATM7TDMI, ARM966 and others).
* the memory configuration of your CPU (flash banks).
* the script used to program the flash memory.
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:
interface ft2232
ft2232_device_desc "STR9-comStick A"
ft2232_layout comstick
ft2232_vid_pid 0x0640 0x002C
jtag_speed 4
jtag_nsrst_delay 100
jtag_ntrst_delay 100
Além disso, o OpenOCD precisa ser informado sobre qual a arquitetura que será usada e o layout de memória:
target arm966e little run_and_init 1 arm966e
run_and_halt_time 0 50
working_area 0 0x50000000 32768 nobackup
flash bank str9x 0x00000000 0x00080000 0 0 0
flash bank str9x 0x00080000 0x00008000 0 0 0
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):
#Script used for FLASH programming
target_script 0 reset str91x_flashprogram.script
O conteúdo do arquivo str91x_flashprogram.script é específico e depende diretamente da arquitetura utilizada:
wait_halt
str9x flash_config 0 4 2 0 0x80000
flash protect 0 0 7 off
flash erase_sector 0 0 7
flash write_bank 0 main.bin 0
reset run
sleep 10
shutdown
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:
openocd-ftd2xx -f comstick.cfg
(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:
Faça o download deles abaixo:
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.
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:
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:
openocd -f lpc2888.cfg
Estou usando ARM-USB-TINY 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).
Faça o download deles abaixo:
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 ScTec 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 ARM-USB-TINY da Olimex. Para usá-los, chamei o OpenOCD da seguinte forma:
openocd-ftd2xx -f str7prg.cfg
(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.
$$FOOTER$$