quarta-feira, 20 de fevereiro de 2019

PROGRAMANDO NINA B112 COM Apache Mynewt

PROGRAMANDO NINA B112 COM Apache Mynewt

O objetivo deste BLOG é demonstrar de forma resumida como é possível fazer com que o módulo NINA B112 possa rodar o Apache Mynewt. Foi utilizado o EVK-NINA-B1 para o teste.


Sobre Apache Mynewt

Construído para wireless

Atenda às demandas de seu aplicativo a partir de uma variedade de pilhas de rede de código aberto, por exemplo. Bluetooth de baixa energia 5, Bluetooth Mesh, Wi-Fi, LoRaWAN e muito mais ...

Implementação flexível e poderosa do BLE 5 (NimBLE)

  • Full stack, host only ou controller only - a sua escolha
  • Máximo rendimento de 2Mbps
  • Mais de 32 conexões simultâneas, múltiplas conexões em funções centrais e periféricas simultaneas

Mais sobre o NimBLE ...

  • Suporte LoRa PHY e LoRaWAN
  • Rádio LoRa PHY / transceptor (SX1276)
  • Protocolo LoRaWAN para terminais de classe A e classe C
  • API para uso de aplicativos com um aplicativo de amostra

Malha Bluetooth

  • Modelos de Fundação (função de servidor)
  • Portadores de aprovisionamento: PB-ADV e PB-GATT
  • Portadores de publicidade e GATT para transporte de mensagens
  • Recursos opcionais de retransmissão e proxy

Suporte nativo para TCP / IP, UDP

  • Suporta protocolos para redes restritas, por ex. CoAP e 6LoWPAN
Segurança desde o início

Certifique-se de que a segurança esteja incorporada no código, bem como o gerenciamento do ciclo de vida do produto.

  • Bootloader seguro para verificar a integridade e autenticidade do firmware
  • Identidade do dispositivo para provisionamento seguro
  • Transferências de dados autenticadas, autorizadas e criptografadas
  • Interface abstraída para aproveitar a segurança de hardware
  • Mais sobre a segurança do Mynewt OS ..

Operações prontas

Prepare sua rede de bilhões de IoT para monitoramento, solução de problemas, gerenciamento e atualização remotos.

  • Módulo de gerenciamento de imagens para permitir atualizações de firmware remotas eficientes, com reconhecimento de falhas e confiáveis
  • Módulos de log que podem ser chamados em vários níveis de granularidade, incluindo logs de reinicialização especializados
  • Módulos de estatísticas ricamente instrumentados para componentes do SO e interfaces de rede
  • Fácil de usar a estrutura do sensor para conectar uma variedade de sensores
  • Descoberta automática e gerenciamento usando OIC1.1, o padrão de plataforma IoT da OCF (Open Connectivity Foundation)
Fácil de usar

Componha, ajuste e crie sua imagem em horas ou até minutos.

  • Inicialização de hardware em arquivo de configuração única para o BSP escolhido
  • Inicialização de parâmetros de serviço em um único arquivo de configuração para o módulo escolhido, e. Controlador BLE
  • Gerenciamento inteligente de pacotes e construção usando a ferramenta Newt
  • Auditorias automáticas de configuração usando o Newt Tool
Resumo de Instalação (LINUX)

A seguir, serão apresentados as sequências de passos para instalação do Apache MyNewt para o NINA B1 com algumas dicas importantes. Para maiores detalhes, consulte o site do Apache Mynewt.

Basicamente serão instalados o utilitário Newt tool e o CROSS TOOLS para ARM, além do NATIVE toolchain para permitir testar e simular na plataforma nativa (PC).

O Newt já esta compilado DEB e pode ser instalado no LINUX (use 18.04), se encontra no repositório https://github.com/JuulLabs-OSS/debian-mynewt

Tem que pegar a chave pública e então atualizar o link do repositório

wget -qO - https://raw.githubusercontent.com/JuulLabs-OSS/debian-mynewt/master/mynewt.gpg.key | sudo apt-key add -
$ sudo tee /etc/apt/sources.list.d/mynewt.list <<EOF
deb https://raw.githubusercontent.com/JuulLabs-OSS/debian-mynewt/master latest main
EOF
 sudo apt-get update

Agora instale o newt de duas formar, via apt-get install ou instalação do DEB.

$ sudo apt-get update
$ sudo apt-get install newt
$ wget https://raw.githubusercontent.com/JuulLabs-OSS/binary-releases/master/mynewt-newt-tools_1.5.0/newt_1.5.0-1_amd64.deb
$ sudo dpkg -i newt_1.5.0-1_amd64.deb

Você pode baixar os fontes e compilar do zero também!

Verificando versão e testando Newt

$ which newt
/usr/bin/newt
$ newt version
Apache Newt version: 1.5.0

$ newt
Newt allows you to create your own embedded application based on the Mynewt
operating system. Newt provides both build and package management in a single
tool, which allows you to compose an embedded application, and set of
projects, and then build the necessary artifacts from those projects. For more
information on the Mynewt operating system, please visit
https://mynewt.apache.org/.

Please use the newt help command, and specify the name of the command you want
help for, for help on how to use a specific command

Usage:
  newt [flags]
  newt [command]

Examples:
  newt
  newt help [<command-name>]
    For help on <command-name>.  If not specified, print this message.

Available Commands:
  build        Build one or more targets
  clean        Delete build artifacts for one or more targets
  create-image Add image header to target binary
  debug        Open debugger session to target
  help         Help about any command
  info         Show project info
  install      Install project dependencies
  load         Load built target to board
  mfg          Manufacturing flash image commands
  new          Create a new project
  pkg          Create and manage packages in the current workspace
  resign-image Re-sign an image.
  run          build/create-image/download/debug <target>
  size         Size of target components
  sync         Synchronize project dependencies
  target       Commands to create, delete, configure, and query targets
  test         Executes unit tests for one or more packages
  upgrade      Upgrade project dependencies
  vals         Display valid values for the specified element type(s)
  version      Display the Newt version number

Flags:
  -h, --help              Help for newt commands
  -j, --jobs int          Number of concurrent build jobs (default 4)
  -l, --loglevel string   Log level (default "WARN")
  -o, --outfile string    Filename to tee output to
  -q, --quiet             Be quiet; only display error output
  -s, --silent            Be silent; don't output anything
  -v, --verbose           Enable verbose output when executing commands

Use "newt [command] --help" for more information about a command.

Instale agora o ToolChain para LINUX

GCC/Libc
$ sudo apt-get install gcc-multilib libc6-i386

GDB (Debugger)

$ sudo apt-get install gdb

Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  gdb-doc gdbserver
The following NEW packages will be installed:
  gdb
...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up gdb (7.7.1-0ubuntu5~14.04.2) ...

Instale agora o CROSSTOOLS para ARM (NINA B1 utiliza ARM)

$ sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi
$ sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
$ sudo apt-get update
$ sudo apt-get install gcc-arm-none-eabi

No caso de $ sudo apt-get install gdb-arm-none-eabi, entre no LINK abaixo para resolver


Neste voce encontrará o binário de gdb-arm-none-eabi o qual deve ser copiado para /usr/bin do Linux

Instale agora o SEGGER J-LINK, maiores detalhes no link abaixo, o segger é utilizado para transferir o BOOTLOADER e APP para o NINA B1.

https://www.segger.com/downloads/jlink/

Agora vamos testar o Netw para criar um projeto BÁSICO e fazer a busca do repositório, a idéia aqui é para compreender como funciona o newt.

Recomendo ler este link para ter uma idéia do conceito do Newt


Criando o projeto

$ cd ~/dev
$ newt new myproj
Downloading project skeleton from apache/mynewt-blinky...
Installing skeleton in myproj...
Project myproj successfully created.

Estrutura do projeto (use tree)

$ cd myproj
$ tree
.
├── DISCLAIMER
├── LICENSE
├── NOTICE
├── README.md
├── apps
│   └── blinky
│       ├── pkg.yml
│       └── src
│           └── main.c
├── project.yml
└── targets
    ├── my_blinky_sim
    │   ├── pkg.yml
    │   └── target.yml
    └── unittest
        ├── pkg.yml
        └── target.yml

6 directories, 11 files

Você pode alterar o endereço do repositório e baixar pacotes em project.yml

repository.apache-mynewt-core:
    type: github
    vers: 1-latest
    user: apache
    repo: mynewt-core

$ newt install
apache-mynewt-core successfully installed version 1.3.0-none

Veja a quantidade pacotes interessantes

$ tree -L 2 repos/apache-mynewt-core/

repos/apache-mynewt-core/
├── CODING_STANDARDS.md
├── DISCLAIMER
├── LICENSE
├── NOTICE
├── README.md
├── RELEASE_NOTES.md
├── apps
│   ├── blecent
│   ├── blehci
│   ├── bleprph
│   ├── bleprph_oic
│   ├── blesplit
│   ├── bletest
│   ├── bleuart
│   ├── boot
│   ├── btshell
│   ├── fat2native
│   ├── ffs2native
│   ├── ocf_sample
│   ├── slinky
│   ├── slinky_oic
│   ├── spitest
│   ├── splitty
│   ├── test
│   ├── testbench
│   └── timtest
├── boot
│   ├── boot_serial
│   ├── bootutil
│   ├── split
│   └── split_app
├── compiler
│   ├── arm-none-eabi-m0
│   ├── arm-none-eabi-m4
│   ├── gdbmacros
│   ├── mips
│   ├── sim
│   └── sim-mips
├── crypto
│   ├── mbedtls
│   └── tinycrypt
├── docs
│   └── doxygen.xml
├── encoding
│   ├── base64
│   ├── cborattr
│   ├── json
│   └── tinycbor
├── fs
│   ├── disk
│   ├── fatfs
│   ├── fcb
│   ├── fs
│   └── nffs
├── hw
│   ├── bsp
│   ├── cmsis-core
│   ├── drivers
│   ├── hal
│   ├── mcu
│   └── scripts
├── kernel
│   └── os
├── libc
│   └── baselibc
├── mgmt
│   ├── imgmgr
│   ├── mgmt
│   ├── newtmgr
│   └── oicmgr
├── net
│   ├── ip
│   ├── nimble
│   ├── oic
│   └── wifi
├── project.yml
├── repository.yml
├── sys
│   ├── config
│   ├── console
│   ├── coredump
│   ├── defs
│   ├── flash_map
│   ├── id
│   ├── log
│   ├── mfg
│   ├── reboot
│   ├── shell
│   ├── stats
│   └── sysinit
├── targets
│   └── unittest
├── test
│   ├── crash_test
│   ├── flash_test
│   ├── runtest
│   └── testutil
├── time
│   └── datetime
└── util
    ├── cbmem
    ├── crc
    └── mem

94 directories, 9 files

Você pode verificar também se os pacotes estão OK

$ newt test @apache-mynewt-core/sys/config
Testing package @apache-mynewt-core/sys/config/test-fcb
Compiling bootutil_misc.c
Compiling image_ec.c
Compiling image_rsa.c
Compiling image_validate.c

...

Linking ~/dev/myproj/bin/targets/unittest/sys_config_test-fcb/app/sys/config/test-fcb/sys_config_test-fcb.elf
Executing test: ~/dev/myproj/bin/targets/unittest/sys_config_test-fcb/app/sys/config/test-fcb/sys_config_test-fcb.elf
Testing package @apache-mynewt-core/sys/config/test-nffs
Compiling repos/apache-mynewt-core/encoding/base64/src/hex.c
Compiling repos/apache-mynewt-core/fs/fs/src/fs_cli.c
Compiling repos/apache-mynewt-core/fs/fs/src/fs_dirent.c
Compiling repos/apache-mynewt-core/fs/fs/src/fs_mkdir.c
Compiling repos/apache-mynewt-core/fs/fs/src/fs_mount.c
Compiling repos/apache-mynewt-core/encoding/base64/src/base64.c
Compiling repos/apache-mynewt-core/fs/fs/src/fs_file.c
Compiling repos/apache-mynewt-core/fs/disk/src/disk.c
Compiling repos/apache-mynewt-core/fs/fs/src/fs_nmgr.c
Compiling repos/apache-mynewt-core/fs/fs/src/fsutil.c
Compiling repos/apache-mynewt-core/fs/nffs/src/nffs.c

...

Linking ~/dev/myproj/bin/targets/unittest/sys_config_test-nffs/app/sys/config/test-nffs/sys_config_test-nffs.elf
Executing test: ~/dev/myproj/bin/targets/unittest/sys_config_test-nffs/app/sys/config/test-nffs/sys_config_test-nffs.elf
Passed tests: [sys/config/test-fcb sys/config/test-nffs]
All tests passed

Você pode também testar simular no PC o projeto!

Para maiores detalhes do conceito de Projeto do Newt, acesse este link


Criando Projeto para rodar no NINA-B1

Pré-requisitos

Atenda aos pré-requisitos listados no Project Blinky.
Instale o software Segger JLINK e o pacote de documentação.

Crie o projeto

$ mkdir ~/dev
$ cd ~/dev
$ newt new myproj
Downloading project skeleton from apache/mynewt-blinky...
Installing skeleton in myproj...
Project myproj successfully created.
$ cd myproj
$ newt install
apache-mynewt-core

Crie os destinos Boot e APP

$ newt target create nrf52_boot
$ newt target set nrf52_boot app=@apache-mynewt-core/apps/boot
$ newt target set nrf52_boot bsp=@apache-mynewt-core/hw/bsp/nina-b1
$ newt target set nrf52_boot build_profile=optimized

$ newt target create nrf52_blinky
$ newt target set nrf52_blinky app=apps/blinky
$ newt target set nrf52_blinky bsp=@apache-mynewt-core/hw/bsp/nina-b1
$ newt target set nrf52_blinky build_profile=debug

Veja se criou

$ newt target show
targets/nrf52_blinky
    app=apps/blinky
    bsp=@apache-mynewt-core/hw/bsp/nina-b1
    build_profile=debug
targets/nrf52_boot
    app=@apache-mynewt-core/apps/boot
    bsp=@apache-mynewt-core/hw/bsp/nina-b1
    build_profile=optimized

Gere os executáveis (Boot e APP)

$ newt build nrf52_boot
Building target targets/nrf52_boot
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec256.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_rsa.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/aes.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/loader.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_validate.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/bootutil_misc.c
Compiling repos/apache-mynewt-core/apps/boot/src/boot.c

    ...

Archiving sys_mfg.a
Archiving sys_sysinit.a
Archiving util_mem.a
Linking ~/dev/myproj/bin/targets/nrf52_boot/app/apps/boot/boot.elf
Target successfully built: targets/nrf52_boot

$ newt build nrf52_blinky
Building target targets/nrf52_blinky
Assembling repos/apache-mynewt-core/hw/bsp/nrf52dk/src/arch/cortex_m4/gcc_startup_nrf52_split.s
Compiling repos/apache-mynewt-core/hw/bsp/nrf52dk/src/sbrk.c
Compiling repos/apache-mynewt-core/hw/cmsis-core/src/cmsis_nvic.c
Compiling repos/apache-mynewt-core/hw/drivers/uart/uart_hal/src/uart_hal.c
Assembling repos/apache-mynewt-core/hw/bsp/nrf52dk/src/arch/cortex_m4/gcc_startup_nrf52.s
Compiling apps/blinky/src/main.c

    ...

Archiving sys_mfg.a
Archiving sys_sysinit.a
Archiving util_mem.a
Linking ~/dev/myproj/bin/targets/nrf52_blinky/app/apps/blinky/blinky.elf
Target successfully built: targets/nrf52_blinky

Crie a imagem da aplicação

$ newt create-image nrf52_blinky 1.0.0
App image succesfully generated: ~/dev/myproj/bin/targets/nrf52_blinky/app/apps/blinky/blinky.img

Transfira o Boot e APP

$ newt load nrf52_boot
Loading bootloader
$

$ newt load nrf52_blinky
Loading app image into slot 1

Conecte um LED no pino 1/9 do EVK-NINA-B1



Código fonte

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#include <assert.h>
#include <string.h>

#include "sysinit/sysinit.h"
#include "os/os.h"
#include "bsp/bsp.h"
#include "hal/hal_gpio.h"
#ifdef ARCH_sim
#include "mcu/mcu_sim.h"
#endif

static volatile int g_task1_loops;

/* For LED toggling */
int g_led_pin;

/**
 * main
 *
 * The main task for the project. This function initializes packages,
 * and then blinks the BSP LED in a loop.
 *
 * @return int NOTE: this function should never return!
 */
int
main(int argc, char **argv)
{
    int rc;

#ifdef ARCH_sim
    mcu_sim_parse_args(argc, argv);
#endif

    sysinit();

    g_led_pin = LED_BLINK_PIN;
    hal_gpio_init_out(g_led_pin, 1);

    while (1) {
        ++g_task1_loops;

        /* Wait one second */
        os_time_delay(OS_TICKS_PER_SEC);

        /* Toggle the LED */
        hal_gpio_toggle(g_led_pin);
    }
    assert(0);

    return rc;
}

Abaixo um excelente artigo em que o autor adiciona BLE e ADC no Mynewt (baseado no NRF52832)

Introdução

Passei muito tempo nos últimos meses trabalhando no sistema operacional Apache MyNewt IoT. Se você não sabe o que é isso, então você deveria! É um projeto Apache relativamente novo, ainda na fase de "incubação", mas está prestes a lançar sua segunda versão beta do lançamento 1.0 (acho que todos os votos estão em aprovação). Sim, ainda faltam algumas coisas e algumas vantagens, mas tudo está se encaixando bem e, se você estiver procurando por um SO de IoT de código aberto para o seu dispositivo, o MyNewt pode ser exatamente o que você está procurando. É extremamente pequeno (o bootloader que eu construí é de 9Kb!), Rápido e muito flexível. Escrevi alguns aplicativos para ele - um aplicativo de sensor ambiental baseado em UART e um aplicativo de sensor analógico - que vou escrever aqui separadamente. Por hoje, começarei com o sensor analógico usando o conversor analógico-digital (ADC). Então vamos começar!

Eu baseei esta demo no Nordic Semi NRF52DK Developer Board, que é uma placa de desenvolvimento Bluetooth SoC baseada em Cortex M4F. Ele tem muito a oferecer, e o chip NRF52 é um chip IoT extremamente comum, por isso é ideal para desenvolvimento (na verdade, o próximo aplicativo que escrevi é para uma placa Arduino Primo, que também usa o SoC NRF52). Para o meu sensor analógico eu escolhi um sensor de nível de líquido eTape que eu peguei da Adafruit. Por que escolhi esse sensor? Principalmente porque eu comprei há algum tempo atrás por um ótimo motivo que eu não consigo lembrar, então estava na minha mesa! É um sensor analógico de tensão resistiva simples, e eu já o tinha, então era ideal. Eu também comprei um cilindro graduado de 1000 ml no eBay para montá-lo, apenas para facilitar as coisas. Agora que todo esse histórico está fora do caminho, vamos começar a criar o próprio aplicativo.

Continua...


Suporte: suporte@smartcore.com.br

Fontes:

Citadas no proprio texto.

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portifólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.
Mais detalhes em www.smartcore.com.br