Tuesday, November 11, 2014

CC3200 : ARM Cortex M4 (Dual Core) com WiFi b/g/n com Nuttx , FreeRTOS, Energia

A CC3200-launchxl é um kit ARM cortex-m4 + WiFi b/g/n + sensores.
É um ponto de entrada para a Internet das coisas (IoT).




CC3200 : ARM Cortex com WiFi b/g/n 
Para testar é interessante ter sempre mais de uma placa. Isso vale para qualquer projeto.
A CC3200 tem várias revisões de hardware, a que recebi tem na PCB a versão 4.1
O software padrão que é baseado no FreeRTOS.
No SDK tem vários exemplos com FreeRTOS no IAR.

CC3200 revisão de hardware 4.1

Ferramentas e manuais

CC3200 Datasheet
http://www.ti.com/lit/ds/symlink/cc3200.pdf

CC3200 Launch XL - Esquemático do hardware
http://www.ti.com/lit/zip/swrc289

SimpleLink Wi-Fi Starter (para Android e IOS) - configurar o CC3200 pelo smartphone
http://www.ti.com/tool/wifistarter

CC3200 User guide hardware
http://www.ti.com/lit/ug/swru372a/swru372a.pdf

CC3200 User guide software
http://www.ti.com/lit/ug/swru376a/swru376a.pdf

IDE: CCS / IAR
http://www.ti.com/tool/ccstudio-wcs

SDK / examples / Servicepack / OTA
http://www.ti.com/tool/cc3200sdk

Radio test SW+FW
http://www.ti.com/tool/cc3xxxradiotest

Uniflash (necessário para gravar na spi flash e instalar o servicepack do radio)
http://www.ti.com/tool/uniflash

Pinmux utility
http://www.ti.com/tool/pinmuxtool

Especificação de hardware

MCU: cc3200R1m2 ARM Cortex-m4 (dual core) 80 MHz 256kbytes RAM WiFi b/g/n
Flash: 25PX80 (8 mbits / 1024 kbytes) com opção de 128 mbits / 16 mbytes
Acelerômetro: Bosh BMA222 (I2C addr=0x18)
Termômetro:  Texas TMP008 (I2C addr=0x41)
JTAG: FTDI FT2232D (dual port)

Recursos do MCU cc3200R1m2
1 x SPI
2 x UART
1 x 8 bit Parallel Camera
1 x McASP (aplicações de audio)
1 x SD / MMC / SD Card
1 x I2C
6 x PWM (16-bit)
8 x Capture and Compare
1 x Watchdog Timer
4 x  ADC (12-bit)
27 x GPIO

Arquitetura de hardware

O CC3200 é um dual core, um núcleo só para aplicação e outro só para rede.
Eles se comunicam via SPI.

O CC3200 não contém flash interna, toda a memória flash é externa conectada via SPI.
A memória SPI contém um sistema de arquivos proprietário.
Para gravar na SPI flash é preciso usar o Uniflash,
O projeto energia desenvolveu a ferramenta CC3200prog que também grava na flash, mas não tem todas opções da ferramenta oficial Uniflash.

O CC3200 contém uma memória ROM interna com bootloader e a pilha TCP/IP.
O bootloader é serial, e precisa ser ativado através do pino SOP2.

O debug via SWD e JTAG é feito na RAM. Dá para desenvolver e testar tudo na RAM, após completar o projeto, é possível gravar o binário na spi flash externa para usar em campo.
Usando a biblioteca de acesso a SPI flash é possível gravar arquivos no formato reconhecido pelo bootloader, portanto um executável pode gravar a si mesmo na spi flash externa, o arquivo lido pelo bootloader é o /sys/mcuimg.bin. O sistema de arquivos da spi flash suporta até 128 arquivos.
Isso permite implementar um upgrade over-the-air (OTA), baixando um novo programa via WiFI e gravando em um arquivo (download.bin) para então chavear o /sys/mcuimg.bin.

Pinout, Conectores, jumpers, botões e LEDs


V1 - pinout inicial
V2 - adicionando SWD / SWO

J1: USB /  FT2232D JTAG
J2: Sensores I2C SDA
J3: Sensores I2C SCL
J4: Sensores IRQ acelerômetro
J5: Debug de rede
J6: UART 0 RX - fechado FT2232D serial / aberto Boostpack (usado no bootloader com SOP2)
J7: UART 0 TX - fechado FT2232D serial / aberto Boostpack (usado no bootloader com SOP2)
J8: FT2232D JTAG TCK (usado no workaround do CC3200prog junto com SOP2)
J9: FT2232D JTAG TMS
J10: FT2232D JTAG TDI
J11: FT2232D JTAG TDO
J12: medição de corrente
J13: energia por usb do J1
J14: energia por bateria do J20
J15: SOP2 - fechado bootloader via serial (gravação) / aberto bootloader via flash (normal)
J16: SOP1
J17: SOP0 - fechado ativa SWD
J18: antena
J19: usb power output 5v - 0.4v (diodo) = 4,6v
J20: bateria 2xAA funciona até descarrega para 2,3V

P1: Boostpack
P2: Boostpack
P3: Boostpack
P4: Boostpack

SW2: GPIO 22
SW3: GPIO 13

D5 (verde): GPIO 11
D6 (amarelo): GPIO 10
D7 (vermelho): GPIO 9

Configurando CC3200 para funcionar no Windows

Instalar o SDK oficial, e depois atualizar no painel de controle os drivers usando a pasta do SDK.

Configurando CC3200 para funcionar no Linux

Precisa notificar o driver do ftdi-sio  do novo ID do FT2232D que vem na CC3200
modprobe ftdi_sio
echo 0451 c32a > /sys/bus/usb-serial/drivers/ftdi_sio/new_id


Para deixar as seriais do CC3200 permanente pós reboot, é preciso adicionar uma regra no udev
nano /etc/udev/rules.d/98-usbftdi.rules

Uma vez aberto o nano, cole essa regra
SUBSYSTEM=="usb", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="c32a", MODE="0660", GROUP="dialout",
RUN+="/sbin/modprobe ftdi-sio" RUN+="/bin/sh -c '/bin/echo 0451 c32a > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"

Depois de salvo, recarregue as regras do udev
sudo udevadm control --reload-rules

Se seu usuário não estiver no grupo dialout então adicione
sudo usermod -a -G dialout username


Depois isso, vai detectar duas portas USB novas
[ 4656.103297] usb 2-1.1: new full-speed USB device number 15 using ehci-pci
[ 4656.205927] usb 2-1.1: New USB device found, idVendor=0451, idProduct=c32a
[ 4656.205940] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 4656.205948] usb 2-1.1: Product: USB <-> JTAG/SWD
[ 4656.205954] usb 2-1.1: Manufacturer: FTDI
[ 4656.205960] usb 2-1.1: SerialNumber: cc3101
[ 4656.208581] ftdi_sio 2-1.1:1.0: FTDI USB Serial Device converter detected
[ 4656.208685] usb 2-1.1: Detected FT2232C
[ 4656.208692] usb 2-1.1: Number of endpoints 2
[ 4656.208697] usb 2-1.1: Endpoint 1 MaxPacketSize 64
[ 4656.208703] usb 2-1.1: Endpoint 2 MaxPacketSize 64
[ 4656.208709] usb 2-1.1: Setting MaxPacketSize 64
[ 4656.210232] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB4
[ 4656.212552] ftdi_sio 2-1.1:1.1: FTDI USB Serial Device converter detected
[ 4656.212646] usb 2-1.1: Detected FT2232C
[ 4656.212652] usb 2-1.1: Number of endpoints 2
[ 4656.212659] usb 2-1.1: Endpoint 1 MaxPacketSize 64
[ 4656.212665] usb 2-1.1: Endpoint 2 MaxPacketSize 64
[ 4656.212671] usb 2-1.1: Setting MaxPacketSize 64
[ 4656.214985] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB5

Desenvolvimento usando Energia.nu 0101E0013

É preciso mexer em jumpers fisicamente para habilitar a gravação dos projetos pelo Energia.
O SOP2 serve para ativar o bootloader serial do CC3200.
Quando o SOP2 está fechado o CC3200 sempre vai iniciar o bootloader que vem na ROM.
Quando o SOP2 está aberto o CC3200 continua usando o bootloader da ROM, mas vai tentar carregar o arquivo /sys/mcuimg.bin da SPI flash para RAM e repassar o controle para ele.
No projeto Energia a turma faz um workaround para não ficar com essa "frescura" de botar e tirar jumper. O TCK do JTAG é usado para ligar e desligar o bootloader, obviamente o debug por JTAG e SWD não irão funcionar já que perdeu um sinal, mas a gravação por serial agora ficou automática.
Como o JTAG e SWD vão ficar inutilizados, dá para abrir o J9, J10, J11. E usar os sinais dos J8, J9, J10, J11 para qualquer coisa, no meu caso vou aproveitar eles como PWM.

Para grava usando o CC3200prog é preciso fazer um pequeno ajuste na placa,
ligando o TCK de cima com o SOP2 de baixo

A revisão de hardwdare 4.1 tem problemas de gravação com o CC3200prog do energia 0101E0013.
Esse bug já foi reportado: https://github.com/energia/Energia/issues/507
Tem de baixar o cc3200 corrigido e jogar por cima do que vem na versão 0101E0013
http://energia.nu/files/cc3200prog_win.zip
http://energia.nu/files/cc3200prog_mac.zip
http://energia.nu/files/cc3200prog_linux64.tar.gz
http://energia.nu/files/cc3200prog_linux.tar.gz

Além do cc3200prog precisa dos bootloaders do energia para funcionar, então fiz um pacote das versões windows, mac e linux que roda standalone, o download pode ser feito no meu bitbucket.
https://bitbucket.org/murilorebelopontes/dronespersonalizados/downloads/cc3200prog-hw-4.1-windows-mac-linux.zip

Somente 192kb de RAM usável
https://github.com/energia/Energia/issues/517
Antes da revisão de hardware 4.1 com CC3200R1M2 com ROM 1.33 somente 192kb podiam ser usados, com a ROM 1,33 todos 256kb de RAM podem ser usados quando resolverem o problema do linker.

Falta de API / Driver para escrever na SPI Flash
https://github.com/energia/Energia/issues/494
Um projeto já resolveu isso, mas ainda não foi integrado https://github.com/spirilis/SLFS
Com o SLFS dá para implementar OTA, criando um arquivo de download ou escrevendo por cima da /sys/mcuimg.bin

Veja o que acontece no log do Energia com o CC3200prog bugado...
Binary sketch size: 2.720 bytes (of a 262.144 byte maximum)
Open UART /dev/ttyUSB1
open UART success
Getting storage list
Bootloader Version: 4
Silicon version ES1.32
Bootloader version is 2, 1, 4, 0
It's a CC3101 device: PG1.32
BlockSize is 4096, number of blocks is 64
erasing 1 blocks starting from  4
Switch to NWP bootloader complete
Silicon version ES1.32
Bootloader version is 2, 0, 4, 0
BlockSize is 4096, number of blocks is 16
erasing 12 blocks starting from  0   TRAVOU
Veja o que acontece no log do Energia com o CC3200prog corrigido...
Binary sketch size: 2.720 bytes (of a 262.144 byte maximum)
Opening COM5
Getting storage list
Bootloader Version: 4
Silicon version ES1.32 or higher
Bootloader version is 2, 1, 4, 0
It's a CC3200 device: PG1.33 or higher
Switch UART pinmux to APPS
Switch to NWP bootloader complete
Load common boot command for PG1.33 or higher
Bootloader version is 2, 0, 4, 0
BlockSize is 4096, number of blocks is 16
erasing 13 blocks starting from  0
erasing file "/sys/mcuimg.bin"
deleting file "/sys/mcuimg.bin"
erase file completed
Downloading file "/sys/mcuimg.bin" with size 2720
.Download complete    TUDO PERFEITO

Desenvolvimento com Nuttx


Baixar e buildar o Nuttx para CC3200
git clone git://git.code.sf.net/p/nuttx/git nuttx-git
cd nuttx-git/nuttx
make distclean
cd tools
./configure.sh cc3200-launchpad/nsh
cd ..
make


Preparar para debug com OpenOCD

[root@debian ~/workspace/nuttx-tiva/nuttx/configs/cc3200-launchpad/tools]# openocd -f cc3200.cfg
Open On-Chip Debugger 0.8.0 (2014-10-20-21:48)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
Info : clock speed 1000 kHz
Info : JTAG tap: cc3200.jrc tap/device found: 0x0b97c02f (mfg: 0x017, part: 0xb97c, ver: 0x0)
Info : JTAG tap: cc3200.dap enabled
Info : cc3200.cpu: hardware has 6 breakpoints, 4 watchpoints

Gravando o Nuttx pelo GDB e executar

[root@debian ~/workspace/nuttx-tiva/nuttx]# arm-none-eabi-gdb
GNU gdb (7.7.1+dfsg-1+6) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) file nuttx
Reading symbols from nuttx...done.
(gdb) target extended :3333
Remote debugging using :3333
0x00001f5e in ?? ()
(gdb) monitor reset halt
adapter speed: 1000 kHz
JTAG tap: cc3200.jrc tap/device found: 0x0b97c02f (mfg: 0x017, part: 0xb97c, ver: 0x0)
JTAG tap: cc3200.dap enabled
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x41000000 pc: 0x00001f5e msp: 0x20003fe0
(gdb) load
Loading section .text, size 0xd43b lma 0x20004000
Loading section .ARM.exidx, size 0x8 lma 0x2001143c
Loading section .data, size 0x54 lma 0x20011444
Start address 0x20004484, load size 54423
Transfer rate: 64 KB/sec, 3401 bytes/write.
(gdb) monitor reset init
adapter speed: 1000 kHz
JTAG tap: cc3200.jrc tap/device found: 0x0b97c02f (mfg: 0x017, part: 0xb97c, ver: 0x0)
JTAG tap: cc3200.dap enabled
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x41000000 pc: 0x00001f5e msp: 0x20003fe0
(gdb) continue
Continuing.


Com a última revisão do git, o Nuttx não funcionou na CC3200R1M2 PCB v4.1.

No lugar do NSH só aparece isso e trava.
Airq_unexpected_isr: irq: 15
up_assert: Assertion failed at file:irq/irq_unexpectedisr.c line: 85


Debug com FT2232D para usar SWD com SWO

Dá para usar o SWD para fazer debug com o SWO, usando uma JTAG externa, o FT2232D não tem suporte para SWO.
http://searchingforbit.blogspot.com.br/2014/07/cc3200-launchpad-with-external-debugger.html
http://e2e.ti.com/support/wireless_connectivity/f/968/p/360927/1276370.aspx#1276370

CC3200prog gravando o Nuttx na flash

Bootloaders do cc3200 fica na pasta DLL, tem um bootloader para cada versão do silício.
Quando tentei rodar fora da pasta do cc3200prog, estouro o erro abaixo:

[root@debian ~/workspace/nuttx-tiva/nuttx]# /opt/energia-0101E0013/hardware/tools/lm4f/bin/cc3200prog /dev/ttyUSB1 nuttx.bin
Open UART /dev/ttyUSB1
open UART success
Getting storage list
Bootloader Version: 4
Unable to open file dll/rbtl3101_132.dll
Silicon version ES1.32 or higher
Unable to open file dll/rbtl3100s.dll
Load common boot command for PG1.33 or higher
erasing file "/sys/mcuimg.bin"
deleting file "/sys/mcuimg.bin"
erase file completed
Downloading file "/sys/mcuimg.bin" with size 61428
Open operation failed

Quando roda na pasta junto com os bootloaders, a gravação é perfeita

[root@debian /opt/energia-0101E0013/hardware/tools/lm4f/bin]# ./cc3200prog /dev/ttyUSB1 /root/workspace/nuttx-tiva/nuttx/nuttx.bin
Open UART /dev/ttyUSB1
open UART success
Getting storage list
Bootloader Version: 4
Silicon version ES1.32 or higher
Bootloader version is 2, 1, 4, 0
It's a CC3200 device: PG1.33 or higher
Switch UART pinmux to APPS
Switch to NWP bootloader complete
Load common boot command for PG1.33 or higher
Bootloader version is 2, 0, 4, 0
BlockSize is 4096, number of blocks is 16
erasing 13 blocks starting from  0
erasing file "/sys/mcuimg.bin"
deleting file "/sys/mcuimg.bin"
erase file completed
Downloading file "/sys/mcuimg.bin" with size 61428
...............
Download complete

Nuttx rodando na CC3200 após ser gravado na flash pelo CC3200prog do Energia.nu
Até agora só tem a UART funcionando, falta ainda:
wifi, i2c, spi, camera, ccp, pwm, i2s, adc, sdcard