Eu fui um dos muitos (mais de 5500) patrocinadores do projeto SparkCore no Kickstarter e fique muito ansioso para que o módulo chegasse logo.
Depois de uma longa espera meu SparkCore chegou e para minha surpresa ele não funcionou como o esperado. Assim que eu liguei ele acendeu na cor magenta (LEDs azul e vermelho acesos) e o aplicativo para Android não reconheceu meu dispositivo.
Tentei todas as dicas do site: https://community.spark.io/t/spark-core-troubleshooting-guide-spark-team/696, mas ele definitivamente não entrava no modo DFU e a função de restaurar configurações de fábrica não dava nenhum resultado. Contactei o pessoal do SparkLab e eles disseram que minha placa era uma das 1% que por algum motivo falhavam durante a produção.
Foi então que resolvi fazer alguma coisa, compilei o firmware deles a partir do código fonte e gravei usando uma placa STM32F4Discovery (st-linkv2) como programador SWD usando o OpenOCD, como expliquei aqui: https://acassis.wordpress.com/2014/01/19/flashing-spark-core-when-dfu-fails/
Este deu algum resultado, mas foi então que meu amigo David Sidrane sugeriu que eu gravasse o bootloader DFU no STM32 e a partir dele gravasse a memória serial flash externa.
Para entrar em modo DFU você deve pressionar ao mesmo tempo os botões MODE e RST, então solte o botão RST e mantenha o MODE pressionado por 3 segundos. E assim eu fiz:
$sudo dfu-util -d 1d50:607f -a 0 -s 0x08000000 -D bootloader.bin $sudo dfu-util -d 1d50:607f -a 0 -s 0x08005000:leave -D core-firmware.bin
Com o bootloader gravado resolvi fazer um backup do conteúdo original da serial flash externa. Para minha surpresa ela estava limpa (cheia de 0xFF) indicando que estivesse formatada. Como eu não formatei, acredito que durante o processo de gravação do firmware na fábrica ela não chegou a ser gravada. Contactei o SparkLab novamente para explicar o problema e eles decidiram me enviar uma placa substituta, mas eu não precisaria mandar de volta a placa que estava comigo.
Após fazer o “backup” resolvi gravar o firmware na serial flash externa e criar os certificados, como explicado nesta página: https://community.spark.io/t/troubleshooting-my-core-is-flashing-yellow-red-lights-after-it-connects-to-wifi/627/2
Criando as chaves do certificado:
openssl genrsa -out core.pem 1024 openssl rsa -in core.pem -pubout -out core_public.pem openssl rsa -in core.pem -outform DER -out core_private.der
Gravar o firmware na serial flash:
$sudo dfu-util -d 1d50:607f -a 1 -s 0x00020000 -D factory_firmware.bin
Gravar o certificado:
$ sudo dfu-util -d 1d50:607f -a 1 -s 0x00002000 -v -D core_private.der
Gravar a chave pública do servidor:
$ wget https://s3.amazonaws.com/spark-website/cloud_public.der $ sudo dfu-util -d 1d50:607f -a 1 -s 0x00001000 -v -D cloud_public.der
Só precisei enviar minha chave pública (core_public.pem) e o ID do meu SparkCore para hello@spark.io e depois disso consegui conectar meu roteador wireless e criar as aplicações para a SparkCore.
Nota: Para ler o ID do seu SparkCore você deve entrar em “Listening Mode”, pressione o botão MODE por 3 segundos até o LED do seu módulo ficar azul. Use o minicom ou outro programa configurado para 9600 8N1 e pressione ‘i’ para exibir seu ID.