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==
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
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.
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.
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.
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:~#
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.
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
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.
Depois de adicionado, é hora de criar uma interface, configurar a rede, frequência,....
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.
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};
O Led do CC430 fica piscando vermelho quando está procurando o access point da rede 6LowPAN.
Quando conecta fica verde.
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
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.
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.
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-6LoWPANO 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. |
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 slabat 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
no caso configurei meu windows para ficar com o IPv6 2001::69/64.
Configurando o windows com IPv6 2001::69/64 |
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 |
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.
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=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.
<serial_port: ...ok="" dev="" opening="" port="" serial="" to="" ttys1=""></serial_port:>
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!
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
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
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) |
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 |
Quando conecta fica verde.
CC430 conectado ao OMAP + CC1180 com sucesso! |
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.ziphttp://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. |
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.