Sunday, March 16, 2014

Tutorial Internet of things (IOT) com 6LoWPAN

Tutorial completo.


O 6LoWPAN significa IPv6 Over Low Power Wireless Personal Network, ou seja, é uma rede IPv6 simplificada para rodar em sistemas microcontrolados.

http://en.wikipedia.org/wiki/6LoWPAN
http://pt.wikipedia.org/wiki/6LoWPAN

Para testar uma implementação que funcione de 6LoWPAN existem duas opções rápidas.
Uma totalmente gratuita que é o sistema operacional Contiki, que já possui 6LoWPAN nativo, com roteamento RPL de múltiplos saldos.

Baixe o Contiki
http://www.contiki-os.org/

Compre um dos hardwares listados em http://www.contiki-os.org/hardware.html,
no caso os únicos disponíveis em larga escala são o stm32w e o cc2530.

O STM32w é um ARM-Cortex M3 + RF 2.4GHz e custa menos $20 a breakout board.
http://www.aliexpress.com/wholesale?SearchText=stm32w

O CC2530 é um 8051 + RF 2.4GHz e custa menos de $8 a breakout board.
 http://www.aliexpress.com/wholesale?SearchText=cc2530

Ambos tem todo ambiente de desenvolvimento livre, com GCC, GDB, Eclipse-CDT, ....
É só buildar o contiki e montar sua rede com zilhões de dispositivos com rede IPv6 (internet) para controlar qualquer coisa que você imaginar de qualquer lugar da internet.

Um kit bastante interessante que você pode estar comprando aqui (somente se estiver nos estados unidos),
é o Texas CC-6LOWPAN-DK, que foi desenvolvimento de uma parceira da Texas com a Sensinode, atualmente a Sensinode foi comprada pela ARM, então podemos esperar que num futuro próximo veremos uma enxurrada de microcontroladores ARM com rede RF prontos para pendurar na internet.

O kit CC-6LOWPAN-DK custa menos de $900 mas ainda acho 'overpriced'
http://br.mouser.com/ProductDetail/Texas-Instruments/CC-6LOWPAN-DK-868/?qs=dn9%252bmHMlkg/KYkwM%252bua8Ow==

A Wiki do CC-6LOWPAN-DK 
http://processors.wiki.ti.com/index.php/CC-6LoWPAN
O kit é funcional, embora a documentação não seja muito extensa, dá para arrumar tudo buscando no Google.

O kit vem com uma placa OMAP-L138 EVM da PDLOGIC, e roda o Arago Linux 2009.11.
http://arago-project.org/wiki/index.php/Main_Page

Todos os binários para regravar o SDCard em caso de destruição acidental do sistema podem ser baixados daqui:
http://arago-project.org/files/releases/2009.11/images/da850-omapl138-evm/

A sequência é UBL -> uboot -> linux.
Não encontrei os arquivos do UBL no site do Arago, mas estão disponiveis dentro do SDK do OMAP fornecido pela Texas em:
http://software-dl.ti.com/dsps/dsps_public_sw/c6000/web/omapl138_lcdk_sdk/latest/index_FDS.html
e que depois foi atualizado para um novo SDK que ativa também o DSP que vem no OMAP.
http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/dvsdk/DVSDK_4_00/latest/index_FDS.html
Essas SDK das Texas são um pouco antigos e só são garantidos de rodar sobra o Ubuntu 10.04 LTS.
Provavelmente você também vai precisar criar uma VM só para isso como é de costume.

Para conectar no console serial do OMAP-L138 EVM é preciso de um cabo RS232 cruzado,
como de costume, se você não tiver um pronto, é só comprar 2 DB9, soldar assim:
Lado A | Lado B
pino 2  --- pino 3
pino 3 --- pino 2
pino 5 --- pino 5

Cabo serial cruzado para acessar o console serial do OMAP-L138.
Feito isso é só abrir o PuTTY, Minicom, termite, advance serial port console, ou qualquer outro software para porta serial de sua preferência. Eu recomendo o PuTTYtray e o minicom.

Putty tray é um fork do Putty com reconexão automática.
http://haanstra.eu/putty/

Vamos dar uma olhada no console serial do OMAP-L138 para ver o que tem de interessante.

OMAP-L138 EVM bootloader (UBL)


Booting with TI UBL
Device OPP (300MHz, 1.2V)

OMAP-L138 Uboot


U-Boot 2009.11 (Nov 09 2010 - 18:48:43)

I2C:   ready
DRAM:  64 MB
MMC:   davinci: 0
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
ARM Clock : 300000000 Hz
DDR Clock : 132000000 Hz
Net:   Ethernet PHY: GENERIC @ 0x00

Hit any key to stop autoboot:  0
reading boot.scr

** Unable to read "boot.scr" from mmc 0:1 **
reading uImage

1842560 bytes read
## Booting kernel from Legacy Image at c0700000 ...
   Image Name:   Linux-2.6.32-rc6
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1842496 Bytes =  1.8 MB
   Load Address: c0008000
   Entry Point:  c0008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

kernel do linux iniciando....


Uncompressing Linux.......................................................................................................................... done, booting the kernel.
Linux version 2.6.32-rc6 (jars@jars-desktop) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #13 PREEMPT Thu Aug 25 16:46:06 CEST 2011
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: DaVinci DA850/OMAP-L138 EVM
Memory policy: ECC disabled, Data cache writeback
DaVinci da850/omap-l138/am18x variant 0x1
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128
Kernel command line: mem=32M console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait ip=off
PID hash table entries: 128 (order: -3, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 28540KB available (3484K code, 266K data, 152K init, 0K highmem)
SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Hierarchical RCU implementation.
NR_IRQS:245
Console: colour dummy device 80x30
Calibrating delay loop... 149.50 BogoMIPS (lpj=747520)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
DaVinci: 144 gpio irqs
regulator: core version 0.5
NET: Registered protocol family 16
MUX: Setting register GPIO4_0
           PINMUX10 (0x00000028) = 0x22222222 -> 0x82222222
MUX: Setting register GPIO4_1
           PINMUX10 (0x00000028) = 0x82222222 -> 0x88222222
MUX: Setting register UART1_RXD
           PINMUX4 (0x00000010) = 0x00222288 -> 0x02222288
MUX: Setting register UART1_TXD
           PINMUX4 (0x00000010) = 0x02222288 -> 0x22222288
MUX: Setting register GPIO1_15
           PINMUX2 (0x00000008) = 0x88888880 -> 0x88888888
MUX: Setting register LCD_D_0
           PINMUX17 (0x00000044) = 0x00000000 -> 0x00000020
MUX: Setting register LCD_D_1
           PINMUX17 (0x00000044) = 0x00000020 -> 0x00000022
MUX: Setting register LCD_D_2
           PINMUX16 (0x00000040) = 0x00000000 -> 0x20000000
MUX: Setting register LCD_D_3
           PINMUX16 (0x00000040) = 0x20000000 -> 0x22000000
MUX: Setting register LCD_D_4
           PINMUX16 (0x00000040) = 0x22000000 -> 0x22200000
MUX: Setting register LCD_D_5
           PINMUX16 (0x00000040) = 0x22200000 -> 0x22220000
MUX: Setting register LCD_D_6
           PINMUX16 (0x00000040) = 0x22220000 -> 0x22222000
MUX: Setting register LCD_D_7
           PINMUX16 (0x00000040) = 0x22222000 -> 0x22222200
MUX: Setting register LCD_D_8
           PINMUX18 (0x00000048) = 0x00000000 -> 0x00000020
MUX: Setting register LCD_D_9
           PINMUX18 (0x00000048) = 0x00000020 -> 0x00000022
MUX: Setting register LCD_D_10
           PINMUX17 (0x00000044) = 0x00000022 -> 0x20000022
MUX: Setting register LCD_D_11
           PINMUX17 (0x00000044) = 0x20000022 -> 0x22000022
MUX: Setting register LCD_D_12
           PINMUX17 (0x00000044) = 0x22000022 -> 0x22200022
MUX: Setting register LCD_D_13
           PINMUX17 (0x00000044) = 0x22200022 -> 0x22220022
MUX: Setting register LCD_D_14
           PINMUX17 (0x00000044) = 0x22220022 -> 0x22222022
MUX: Setting register LCD_D_15
           PINMUX17 (0x00000044) = 0x22222022 -> 0x22222222
MUX: Setting register LCD_PCLK
           PINMUX18 (0x00000048) = 0x00000022 -> 0x02000022
MUX: Setting register LCD_MCLK
           PINMUX18 (0x00000048) = 0x02000022 -> 0x22000022
MUX: Setting register LCD_HSYNC
           PINMUX19 (0x0000004c) = 0x00000000 -> 0x00000002
MUX: Setting register LCD_VSYNC
           PINMUX19 (0x0000004c) = 0x00000002 -> 0x00000022
MUX: Setting register NLCD_AC_ENB_CS
           PINMUX19 (0x0000004c) = 0x00000022 -> 0x02000022
MUX: Setting register GPIO2_8
           PINMUX5 (0x00000014) = 0x00110110 -> 0x80110110
MUX: Setting register GPIO2_15
           PINMUX5 (0x00000014) = 0x80110110 -> 0x80110118
MUX: Setting register GPIO2_4
           PINMUX6 (0x00000018) = 0x00000000 -> 0x00008000
MUX: Setting register GPIO6_13
           PINMUX13 (0x00000034) = 0x00000000 -> 0x00000800
bio: create slab  at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
regulator: VDCDC1: 3200 <--> 3300 mV
regulator: VDCDC2: 1750 <--> 3300 mV
regulator: VDCDC3: 950 <--> 1300 mV
regulator: LDO1: 1800 mV
regulator: LDO2: 1150 <--> 1300 mV
pca953x 1-0020: failed reading register
pca953x: probe of 1-0020 failed with error -121
Switching to clocksource timer0_1
musb_hdrc: version 6.0, cppi4.1-dma, (host+peripheral), debug=0
Waiting for USB PHY clock good...
musb_hdrc: USB OTG mode controller at fee00000 using DMA, IRQ 58
musb_hdrc musb_hdrc: MUSB HDRC host driver
musb_hdrc musb_hdrc: new USB bus registered, assigned bus number 1
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
EMAC: MII PHY configured, RMII PHY will not be functional
MUX: Setting register GPIO2_6
           PINMUX6 (0x00000018) = 0x00008000 -> 0x00008080
JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
msgmni has been set to 55
io scheduler noop registered
io scheduler anticipatory registered (default)
da8xx_lcdc da8xx_lcdc.0: GLCD: Found Sharp_LK043T1DG01 panel
Console: switching to colour frame buffer device 60x34
Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A
serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A
serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A
console [ttyS2] enabled
brd: module loaded
ahci ahci: forcing PORTS_IMPL to 0x1
ahci ahci: AHCI 0001.0100 32 slots 1 ports 3 Gbps 0x1 impl SATA mode
ahci ahci: flags: ncq sntf pm led clo only pmp pio slum part ccc
scsi0 : ahci
ata1: SATA max UDMA/133 irq 67
m25p80 spi1.0: m25p64 (8192 Kbytes)
Creating 4 MTD partitions on "m25p80":
0x000000000000-0x000000040000 : "U-Boot"
0x000000040000-0x000000050000 : "U-Boot Environment"
0x000000050000-0x0000007f0000 : "Linux"
0x0000007f0000-0x000000800000 : "MAC Address"
Read MAC addr from EEPROM: 00:08:ee:05:0d:66
davinci SPI Controller driver at 0xfef0e000 (irq = 56) use_dma=1
tun: Universal TUN/TAP device driver, 1.6
tun: (C) 1999-2004 Max Krasnyansky 
console [netcon0] enabled
netconsole: network logging started
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ohci ohci.0: DA8xx OHCI
ohci ohci.0: new USB bus registered, assigned bus number 2
ohci ohci.0: irq 59, io mem 0x01e25000
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
g_ether gadget: using random self ethernet address
g_ether gadget: using random host ethernet address
usb0: MAC 3e:7a:01:62:bf:e2
usb0: HOST MAC 06:8c:ae:fe:d5:0b
g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
g_ether gadget: g_ether ready
omap_rtc omap_rtc: rtc core: registered omap_rtc as rtc0
omap_rtc: RTC power up reset detected
i2c /dev entries driver
watchdog watchdog: heartbeat 60 sec
cpuidle: using governor ladder
cpuidle: using governor menu
davinci_mmc davinci_mmc.0: Using DMA, 4-bit mode
usbcore: registered new interface driver usbhid
usbhid: v2.6:USB HID core driver
TCP cubic registered
NET: Registered protocol family 17
Clocks: disable unused emac
regulator_init_complete: incomplete constraints, leaving LDO2 on
regulator_init_complete: incomplete constraints, leaving LDO1 on
regulator_init_complete: incomplete constraints, leaving VDCDC3 on
regulator_init_complete: incomplete constraints, leaving VDCDC2 on
regulator_init_complete: incomplete constraints, leaving VDCDC1 on
emac-mii: probed
omap_rtc omap_rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
ata1: SATA link down (SStatus 0 SControl 300)
mmc0: new high speed SDHC card at address 1234
mmcblk0: mmc0:1234 SA04G 3.68 GiB
Waiting for root device /dev/mmcblk0p2...
 mmcblk0: p1 p2
g_ether gadget: high speed config #2: RNDIS
EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
kjournald starting.  Commit interval 5 seconds
EXT3 FS on mmcblk0p2, internal journal
EXT3-fs: recovery complete.
EXT3-fs: mounted filesystem with writeback data mode.
VFS: Mounted root (ext3 filesystem) on device 179:2.
Freeing init memory: 152K
serial_link_irq_chain
ttyS2: request irq 61
serial_link_irq_chain
ttyS2: request irq 61
serial_link_irq_chain
ttyS2: request irq 61
INIT: serial_link_irq_chain
ttyS2: request irq 61
version 2.86 bootingserial_link_irq_chain
ttyS2: request irq 61

serial_link_irq_chain
ttyS2: request irq 61
Please wait: booting...
Starting udev
udev: starting version 141
udevd[458]: inotify_add_watch(3, (null), 10) failed: Bad address

udevd[458]: inotify_add_watch(3, (null), 10) failed: Bad address

udevd[458]: inotify_add_watch(3, (null), 10) failed: Bad address

udevd[458]: inotify_add_watch(3, (null), 10) failed: Bad address

Remounting root file system...
NET: Registered protocol family 10
root: mount: mounting rootfs on / failed: No such file or directory
root: mount: mounting usbfs on /proc/bus/usb failed: No such file or directory
Setting up IP spoofing protection: rp_filter.
Configuring network interfaces... eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=1:00, id=7c0f1)
ADDRCONF(NETDEV_UP): eth0: link is not ready
ifconfig: SIOCGIFFLAGS: No such device
ifconfig: SIOCSIFADDR: No such device
route: SIOCADDRT: No such device
done.
Sat Dec 12 04:23:00 UTC 2009
serial_link_irq_chain
ttyS2: request irq 61
INIT: serial_link_irq_chain
ttyS2: request irq 61
Entering runlevel: 5serial_link_irq_chain
ttyS2: request irq 61

serial_link_irq_chain
ttyS2: request irq 61
Starting telnet daemon.
Starting syslogd/klogd: done
Starting thttpd.
net.ipv6.conf.all.proxy_ndp = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.proxy_ndp = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.eth0.proxy_ndp = 1
net.ipv6.conf.eth0.forwarding = 1
net.ipv6.conf.eth0.autoconf = 0
cp: cannot stat 'default.txt': No such file or directory
Starting NanoRouter:
serial_link_irq_chain
ttyS2: request irq 61
serial_link_irq_chain
ttyS2: request irq 61

 _____                    _____           _         _
|  _  |___ ___ ___ ___   |  _  |___ ___  |_|___ ___| |_
|     |  _| .'| . | . |  |   __|  _| . | | | -_|  _|  _|
|__|__|_| |__,|_  |___|  |__|  |_| |___|_| |___|___|_|
              |___|                    |___|

Arago Project http://arago-project.org da850-omapl138-evm ttyS2

Arago 2009.11 da850-omapl138-evm ttyS2

da850-omapl138-evm login:

Detalhes do OMAP

A placa tem de 64MB de RAM, 32MB para o Linux e 32MB para o DSP.

O ARM926EJ é v5 de 300MHz
root@da850-omapl138-evm:~# uname -a
Linux da850-omapl138-evm 2.6.32-rc6 #13 PREEMPT Thu Aug 25 16:46:06 CEST 2011 armv5tejl unknown
r

Com esses bogomips é equivalente a um Pentium 100 Mhz
root@da850-omapl138-evm:~# cat /proc/cpuinfo
Processor       : ARM926EJ-S rev 5 (v5l)
BogoMIPS        : 149.50
Features        : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5

Hardware        : DaVinci DA850/OMAP-L138 EVM
Revision        : 0000
Serial          : 0000000000000000

root@da850-omapl138-evm:~# free
              total         used         free       shared      buffers
  Mem:        28692        15208        13484            0         1500
 Swap:            0            0            0
Total:        28692        15208        13484

O IPv6 padrão do kit é configurado estaticamente para 2001::11/64

root@da850-omapl138-evm:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:08:EE:05:0D:66
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 2001::11/64 Scope:Global
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:33

Agora é só faz um ssh de máquina qualquer no esteja na rede 2001::xx/64,
no caso configurei meu windows para ficar com o IPv6 2001::69/64.

Configurando o windows com IPv6 2001::69/64
Feito isso é testar com o ping para ver se deu cerco.
C:\Users\mpontes>ping 2001::11

Disparando 2001::11 com 32 bytes de dados:
Resposta de 2001::11: tempo=4ms
Resposta de 2001::11: tempo=1ms
Resposta de 2001::11: tempo=17ms
Resposta de 2001::11: tempo=2ms

Estatísticas do Ping para 2001::11:
    Pacotes: Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de
             perda),
Aproximar um número redondo de vezes em milissegundos:
    Mínimo = 1ms, Máximo = 17ms, Média = 6ms

C:\Users\mpontes>

Ok, conectar pelo telnet, já que o OMAP não vem SSH.
Agora é a uma boa hora de usar o puttytray com reconexão automática.
putty conectado no telnet IPv6 do OMAP
Agora é hora de depurar o programas da sensinode que vem junto com o kit.
Dentro da pasta /home/root do omap você vai encontrar esses arquivos ai:

root@da850-omapl138-evm:~# find last tools
last
last/NAPSocketServer
last/NAPSocketServer/NAPSocketServer
last/NAPSocketServer/Version.txt
last/configFiles
last/configFiles/rf_configuration_ttyS1.conf
last/configFiles/if_full.txt
last/ConfSv
last/ConfSv/Version.txt
last/ConfSv/ConfSv
last/nanorouter
last/6routed
last/6routed/Version.txt
last/6routed/6routed
tools
tools/NanoBoot_host_10_8552
tools/ENCRYPTED_CC1180_AP_FW.hex
root@da850-omapl138-evm:~#

Todos esses arquivos podem ser baixados daqui:
Para instalar no OMAP ou BeagleBone, ou qualquer outro Linux para ARM.

O nanoboot_host e o firmware do CC1180 podem ser baixados direto da página da sensinode.

O nanorouter é o daemon pai de todos os processos da rede 6lowpan. Quando executado ele vai subir os outros daemons filhos: NAPSocketServer, ConfSv e 6routed. 
O nanorouter vai criar uma subnet baseado no IPv6 da interface eth0 para alocar os IPv6 de todos dispositivos da rede 6LowPAN.

Quando for rodar pela primeira vez, é provável que o kit trave por algum ruido no conector do CC1180 que é muito frágil. Quando isto ocorre, os leds do CC1180 ficam acessos por toda eternidade.
Para resolver esse problema é necessário mexer no GPIO do OMAP até que o travamento suma.
Talvez seja necessário atualizar ou gravar o firmware do CC1180 se ele estiver zerado de fábrica.

Hora de matar todos os processos do nanorouter, para fazer o debug do GPIO e do firmware do CC1180
killall -9 6routed ConfSv NAPSocketServer nanorouter 

Crie também dois scripts para mudar o nivel do GPIO do OMAP que está ligado no CC1180.

root@da850-omapl138-evm:~# cat um.sh
echo 31 >/sys/class/gpio/export
echo out > /sys/class/gpio/gpio31/direction
echo 1 > /sys/class/gpio/gpio31/value

root@da850-omapl138-evm:~# cat zero.sh
echo 31 >/sys/class/gpio/export
echo out > /sys/class/gpio/gpio31/direction
echo 0 > /sys/class/gpio/gpio31/value

Segundo o datasheet do CC1180 se os 2 leds estiverem acessos continuamente sem piscar, é porque o CC1180 encontra-se em modo de bootloader.

CC1180 com leds acessos sem piscar = modo bootloader
MODE=0 -> modo bootloader
MODE=1 -> modo aplicativo

Com o CC1180 em modo bootloader é possivel usar o nanoboot_host para gravar o firmware de Access Point (AP) da rede 6lowpan.

O CC1180 na verdade é o CC1110F32 pre gravado com o bootloader da sensinode, que é proprietário e na está disponível para download.  Este bootloader ocupa 5k dos 32k do CC1110F32.
A parte atualizável do firmware são os 27K que estão disponíveis no link:
http://www.sensinode.com/media/ti-cc-6lowpan/encrypted_cc1180_ap_fw.zip

Neste outro link tem o nanoboot_host para ARM e PC
http://www.sensinode.com/media/ti-cc-6lowpan/nanoboot-host-1.0.zip

Para atualizar o kit do OMAP-L138, é só extrair o encrypted_cc1180_ap_fw.zip e o nanoboot-host-1.0.zip para ARM, colocar no SDCard do OMAP e executar os comandos que seguem...

root@da850-omapl138-evm:~/tools# ./NanoBoot_host_10_8552 /dev/ttyS1 ENCRYPTED_CC1180_AP_FW.hex


NanoBoot HOST application 1.0
Pserial_link_irq_chain
ress 1 and enterttyS1: request irq 53
 to open menu.


Requesting version...
NanoBoot 1.1
Firmware version info:  ff ff ff ff ff ff
1
Select packet type:
0. Check mac address (sanity check)
1. Write binary ENCRYPTED_CC1180_AP_FW.hex
2. Set MAC address.
3. Switch to application mode
4. Firmware versions
6. Toggle GPIO line (For mode change).

Select packet type:
0. Check mac address (sanity check)
1. Write binary ENCRYPTED_CC1180_AP_FW.hex
2. Set MAC address.
3. Switch to application mode
4. Firmware versions
6. Toggle GPIO line (For mode change).
1
File ok
...............1 Page Done OK!
...............2 Page Done OK!
...............3 Page Done OK!
...............4 Page Done OK!
...............5 Page Done OK!
...............6 Page Done OK!
...............7 Page Done OK!
...............8 Page Done OK!
...............9 Page Done OK!
...............10 Page Done OK!
...............11 Page Done OK!
...............12 Page Done OK!
...............13 Page Done OK!
...............14 Page Done OK!
...............15 Page Done OK!
...............16 Page Done OK!
...............17 Page Done OK!
...............18 Page Done OK!
...............19 Page Done OK!
...............20 Page Done OK!
...............21 Page Done OK!
...............22 Page Done OK!
...............23 Page Done OK!
...............24 Page Done OK!
...............25 Page Done OK!
...............26 Page Done OK!
...............27 Page Done OK!
Firmware update completed.

Prontinho, firmware do CC1180 gravado com sucesso!

Usando o opção 4 do menu do nanoboot temos o seguinte
Select packet type:
0. Check mac address (sanity check)
1. Write binary ENCRYPTED_CC1180_AP_FW.hex
2. Set MAC address.
3. Switch to application mode
4. Firmware versions
6. Toggle GPIO line (For mode change).
4
NanoBoot 1.1
Firmware version info:  01 10 01 00 23 93

Testando o endereço MAC de 64-bit do CC1180

Select packet type:
0. Check mac address (sanity check)
1. Write binary ENCRYPTED_CC1180_AP_FW.hex
2. Set MAC address.
3. Switch to application mode
4. Firmware versions
6. Toggle GPIO line (For mode change).
0
HW address bytes: ff:ff:ff:ff:ff:ff:ff:ff

Endereço ff:ff:ff:ff:ff:ff:ff:ff é inválido / broadcast / reversado, vamos criar um com o tradicional 1,2,3,4,5,6,7,8

Select packet type:
0. Check mac address (sanity check)
1. Write binary ENCRYPTED_CC1180_AP_FW.hex
2. Set MAC address.
3. Switch to application mode
4. Firmware versions
6. Toggle GPIO line (For mode change).
2
MAC address in hex format (8 bytes):
byte 1: 1
byte 2: 2
byte 3: 3
byte 4: 4
byte 5: 5
byte 6: 6
byte 7: 7
byte 8: 8

given MAC address:
01:02:03:04:05:06:07:08:

HW address bytes: 01:02:03:04:05:06:07:08

Pronto agora o CC1180, já tem firmware e MAC válidos para montar um rede 6lowpan.
Então vamos dar outro pipoco (rode o script um.sh que foi criado anteriormente) no GPIO do OMAP para que o CC1180 entre em modo aplicativo,
ou seja, os leds agora devem ficar piscando.

Apos rodar o script um.sh, os leds do CC1180 vão começar a piscar juntos, de 5 em 5 segundos.
É sinal que o CC1180 está em modo aplicativo, mas que ninguém está comandando ele.
Na verdade esse pisca pisca, segundo a documentação da sensinode é o tempo que o watchdog leva para resetar o CC1180 se nenhum comando de controle for recebido.

Hora de finalmente rodar o nanorouter para começar a formar a rede 6lowpan.


root@da850-omapl138-evm:~/last# ./nanorouter

NanoRouter 2.0 - 6routed v2.0
------------STARTING CONFIGURATION SERVER Version: 2.0------------
------------STARTING 6ROUTED Version: 2.0------------
Server::socket_server_set_params: cannot bind port number 50005
Server::socket_server_set_params: binding port number 50006
ConfSv::handshake - trying a new port: 50005
ConfSv::handshake - trying a new port: 50006
ConfSv::handshake - trying a new port: 50007
Configuration::constructor- handshake done!
New get address got: 2001:0000:0000:0000:0000:0000:0000:0011

Core::read_config - create Ethernet interface by default
Ethernet::Device /dev/net/tun opened successfully
Ethernet::Failed an ioctl() call on virtual interface fd
Ethernet::Could not open virtual network interface to communicate with the kernel
Bailing out
ConfSv::handshake - done!
Server::socket_server_set_params: cannot bind port number 50004
Server::socket_server_set_params: cannot bind port number 50005
Server::socket_server_set_params: cannot bind port number 50006
Server::socket_server_set_params: binding port number 50007

Agora, nanorouter está pronto para ser configurado e controlador pelo nodeview
http://www.sensinode.com/media/ti-cc-6lowpan/nodeview-2.0.zip

Extrai e execute o nodeview, e adicione o IPv6 do OMAP.

Adicionando IPv6 do OMAP ao NodeView

Depois de adicionado, é hora de criar uma interface, configurar a rede, frequência,....

NodeView -> show interfaces para listar as interfaces configuradas do roteador
Configurando a interface para 915MHz,
26MHz o cristal do CC1101 que fica dentro do CC1180,
Date rate 50Kbs
Channel space 200KHz,
PATABLE do CC1101 = C2 (1mW)

Depois de configurada a interface o CC1180 do OMAP vai ficar com o led verde acesso direto, o led vermelho vai piscar quando houver dados trafegando na rede.

CC1180 do OMAP depois de configurada a interface de rede pelo NodeView

Agora precisamos adicionar os dispositivos de rede,
os módulos são de dois tipos:
1) CC430 (soc de msp430 + CC1101),
2) MSP430 com cc1180 (cc1110f32).

O código para o CC430 (F5137) pode ser baixado da página da sensinode
http://www.sensinode.com/media/ti-cc-6lowpan/cc430f5137-library-model.zip

Depois de extraído as únicas modificações necessárias são ajustas o MAC e a frequência e potência

//MAC
__root __code const uint8_t hard_coded_mac[8] @ 0xff70 = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x42, 0x25};

//default settings for RF interface
static rf_conf_settings_t rf_configurations = {
  DATA_RATE_200, 
  CHANNEL_SPACING_200, 
  MODULATION_INDEX_10, 
//  0x21,0x65,0x6A, //868mhz smartrf freq2,freq1,freq0
  0x23,0x31,0x3b, //915mhz smartrf studio freq2,freq1,freq0
  0xc3, //smart studio rf PATABLE 10dbm cc430
  RX_ATTENUATION_0dbm};

SmartRF Studio - janela do CC430 configurado para 915MHz
Depois é só compilar com o IAR para MSP430, e gravar com o MSP430 Debug-interface.

Gravando o CC430 com o MSP430 Debug Interface
O Led do CC430 fica piscando vermelho quando está procurando o access point da rede 6LowPAN.
Quando conecta fica verde.

CC430 conectado ao OMAP + CC1180 com sucesso!


Cada placa deve ter um endereço MAC diferente,
que é justamente a configuração feita no main.C
__root __code const uint8_t hard_coded_mac[8] @ 0xff70 = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x42, 0x25}
Ainda resta os módulos MSP430 (F5438A - 16K RAM 256K FLASH) + CC1180, para entrar na rede 6lowpan.
Módulos MSP430F5438A + CC1180 915 MHz

No caso desses módulos é preciso fazer a mesma coisa que foi feita com o CC1180 do OMAP, mas desta vez usando o firmware CC1180-NWP, que pode ser baixado daqui:
http://www.sensinode.com/media/ti-cc-6lowpan/encrypted_cc1180_nwp.zip
Para estes módulos o código fonte do exemplo para entrar na rede 6LowPAN é baixado daqui:
http://www.sensinode.com/media/ti-cc-6lowpan/nanohost-example-1.0.zip
http://www.sensinode.com/media/ti-cc-6lowpan/napsocket-library-1.0.zip
É preciso fazer o merge dos arquivos e configurações desses 2 exemplos,
como é muito coisa para explicar, já disponibilizei o código pronto no meu github,
https://github.com/murix/6lowpan-MSP430F5138A-CC1180
No caso os endereços MAC desses módulos são gravados do mesmo jeito do OMAP, usando o nanoboot_host como foi feito anteriormente.

Depois de alguns experimentos, os módulos MSP430F5138A-CC1180 não entraram na  rede, provavelmente pode ser a antena na PCB que é para 868 MHz, depois com mais tempo verifico melhor.

Vamos olhar no nodeview como ficou a rede depois de todo o trabalho.

Quando o nodeview é aberto / detecta um módulo pela primeira vez,
é enviado o pacote de configuração para ajustar a velocidade de atualização do nodeview.
A melhor coisa do 6lowpan é que o roteamento em mesh funciona,
ou seja, pacotes de dados podem dar vários saltos.
Também é possível copiar o IPv6 de qualquer módulo do nodeview, e pingar direto do windows ou linux.
Se houver mais serviço de rede nos módulos, todos poderão ser acessos diretamente no IPv6 do módulo de destino.

Toda a rede roda encima do CC1180 (CC1110F32), um 8051 com 4K de RAM e 32K de FLASH junto com o CC1101 / CC110L. Ou CC430F5137, um MSP430 com 4K de RAM e 32K de FLASH.
Ou seja, o footprint de uma rede 6lowpan otimizada, é de 4K de RAM e 32K de FLASH.
Sendo assim, qualquer coisa com especificação parecida como PIC18F, PIC16, AVR, ARM Cortex-M0,.... junto com um rádio pode fazer o mesmo, é só instalar o Contiki-OS.