quarta-feira, 10 de junho de 2026

FIBOCOM L610 - ARDUINO

                      

Arduino Core para
FIBOCOM L610

Manual completo de instalação, configuração e desenvolvimento

Autor: Miguel Alexandre WisintainerVersão: 1.0.0Data: Maio 2026IDE: Arduino 1.8.x — Windows

1O Módulo FIBOCOM L610

O FIBOCOM L610 é um módulo LTE Cat.1 baseado no chipset RDA/Unisoc ASR1601 com suporte a Open CPU — é possível executar código de aplicação diretamente no módulo, sem microcontrolador externo.

Especificações

CaracterísticaValor
ChipsetRDA/Unisoc ASR1601
CPUARM Cortex-A5 @ 312 MHz
ConectividadeLTE Cat.1, WiFi 802.11b/g/n, Bluetooth 4.2 + BLE
GNSSGPS / GLONASS / BeiDou
Flash16 MB
RAM8 MB
InterfacesUART, I2C, SPI, GPIO, ADC, PWM
Alimentação3.4V ~ 4.3V (VBAT)
Temperatura−40°C ~ +85°C
Dimensões28.5 × 32.0 × 2.9 mm

Kit de desenvolvimento

O kit ADP-L610-GL-33-00 inclui: conector SIM (NanoSIM), antenas LTE/GNSS/WiFi-BT, interface USB, conector LCD CON601 (27 pinos) e conector câmera CON600 (18 pinos).

⚠️
O SD Card (SDIO) e o BT A2DP não estão acessíveis no kit — os pinos não estão conectados ao conector de expansão. LCD e Câmera têm conectores próprios (CON601/CON600).

2Arquitetura do BSP

hardware/fibocom/l610/
├── boards.txt ← definição da placa e menus
├── platform.txt ← toolchain ARM e pipeline de build
├── package_index.json ← metadados do pacote
├── INSTALL_WINDOWS.md ← instruções de instalação
├── cores/l610/
│ ├── Arduino.h ← API Arduino (includes SDK + wrappers)
│ ├── fibo_sdk_fix.h ← fixes de compatibilidade C/C++
│ ├── main.c ← entrada RTOS (appimg_enter/exit)
│ ├── main_cpp_bridge.cpp ← bridge C/C++ para setup()/loop()
│ ├── wiring.c ← millis(), delay()
│ ├── wiring_digital.c ← pinMode(), digitalWrite()
│ ├── wiring_analog.c ← analogRead(), analogWrite()
│ └── HardwareSerial.h/.cpp ← Serial via UART
├── variants/l610/
│ ├── pins_arduino.h ← mapeamento de pinos
│ └── app_flashimg.ld ← linker script
└── libraries/ SPI/ Wire/

Pipeline de build

sketch.ino
    │
    ▼  arm-none-eabi-g++
sketch.elf
    │
    ▼  dtools.exe mkappimg
sketch.img
    │
    ▼  python pacgen.py
sketch.pac  ◄── este arquivo é gravado no L610

Toolchain

arm-none-eabi-gcc
  -mcpu=cortex-a5 -mtune=generic-armv7-a -mthumb
  -mfpu=neon-vfpv4 -mfloat-abi=hard -mno-unaligned-access
  -DCHIP_8910 -DARDUINO_FIBOCOM_L610
  -std=gnu++14 -Os -ffunction-sections -fdata-sections

3Instalação passo a passo

⚠️
Usar Arduino IDE 1.8.19. O Arduino IDE 2.x é incompatível com este BSP.
  1. Instalar o Arduino IDE 1.8.19

    Baixar em arduino.cc/en/software e instalar normalmente. Abrir e fechar uma vez para criar as pastas necessárias.

  2. Copiar o BSP para o Arduino

    Abrir o Explorador de Arquivos e navegar até:

    C:\Users\<SEU_UTILIZADOR>\AppData\Local\Arduino15\packages\
    ℹ️
    Se AppData não aparecer: Ver → Itens ocultos ✓

    Criar a seguinte estrutura de pastas e copiar o conteúdo do ZIP do BSP para a pasta 1.0.0\:

    Arduino15\packages\fibocom\hardware\l610\1.0.0\
    ├── boards.txt
    ├── platform.txt
    ├── cores\l610\
    ├── variants\l610\
    └── libraries\
  3. Instalar o SDK FIBOCOM

    Extrair o SDK Open CPU do L610 para:

    C:\fibocom\sdk\

    Verificar que estes arquivos existem:

    ArquivoEstado
    components\lib\core_stub.o✓ Obrigatório
    components\lib\fdl1.img✓ Obrigatório
    components\lib\fdl2.img✓ Obrigatório
    components\include\fibo_opencpu.h✓ Obrigatório
    prebuilts\win32\gcc-arm-none-eabi\bin\arm-none-eabi-gcc.exe✓ Obrigatório
    prebuilts\win32\python3\python.exe✓ Obrigatório
    tools\pacgen.py✓ Obrigatório
  4. Verificar endereços de memória

    Abrir C:\fibocom\sdk\cmake\core_config.cmake e confirmar que os endereços coincidem com os valores em boards.txt:

    l610.build.fdl1_addr  = 0x00000000
    l610.build.fdl2_addr  = 0x00010000
    l610.build.appimg_addr = 0x60334000
    l610.build.appimg_size = 0x12C000

    Se os valores forem diferentes, editar o boards.txt do BSP.

  5. Selecionar a placa no Arduino IDE

    Abrir o Arduino IDE 1.8.19 e configurar:

    • Tools → Board → FIBOCOM L610 (LTE Cat.1)
    • Tools → Task Stack → 8 KB (recomendado)
    • Tools → Debug Level → None
    💡
    Se a placa não aparecer no menu, fechar e reabrir o Arduino IDE.
  6. Compilar e gravar

    Clicar em Verify ✓ para compilar. O arquivo .pac é gerado em:

    C:\Users\<USER>\AppData\Local\Temp\arduino_build_XXXXXX\sketch.ino.pac

    Para gravar no L610:

    1. Conectar o L610 ao PC via USB
    2. AbrirFIBOCOM UpgradeDownload
    3. Carregar o arquivo.pac
    4. Clicar emStart
    5. Conectar/desconectar o módulo para iniciar o flash

4Primeiro Sketch — Blink

Todos os sketches Arduino para o L610 têm esta estrutura base:

#include <Arduino.h>

// OBRIGATORIO em todos os sketches — recebe eventos do sistema
void user_signal_process(GAPP_SIGNAL_ID_T sig, va_list arg)
{
    (void)sig; (void)arg;
}

void setup()
{
    Serial.begin(115200);
    fibo_taskSleep(2000);         // asalvar Serial inicializar
    pinMode(LED_BUILTIN, OUTPUT); // GPIO5 = LPG (LED de hardware)
    Serial.println("L610 Arduino ready!");
}

void loop()
{
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println("LED ON");
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("LED OFF");
    delay(1000);
}

Output esperado no Serial Monitor (115200 baud):

L610 Arduino ready!
LED ON
LED OFF
LED ON
...
ℹ️
user_signal_process() é obrigatório em todos os sketches — sem esta função o SDK não compila. Pode estar vazia se não precisares de eventos do sistema.

5API Arduino no L610

Digital I/O

pinMode(pin, mode)              // INPUT, OUTPUT, INPUT_PULLUP, INPUT_PULLDOWN
digitalWrite(pin, value)        // HIGH, LOW
int digitalRead(pin)
attachInterrupt(pin, cb, mode)  // RISING, FALLING, CHANGE
detachInterrupt(pin)

Analógico

int analogRead(pin)     // ADC pinos A0-A3
analogWrite(pin, value) // PWM via LPG hardware (0-255)

Tempo

unsigned long millis()  // ms desde boot
void delay(ms)          // ⚠️ APENAS em setup()/loop()
                        // Em threads: usar fibo_taskSleep(ms)

Serial

Serial.begin(115200)
Serial.print(...)   Serial.println(...)   Serial.printf(format, ...)
Serial.available()  Serial.read()         Serial.write(buf, len)

SPI e Wire (I2C)

#include <SPI.h>    → SPI.begin() / SPI.transfer() / SPI.end()
#include <Wire.h>   → Wire.begin() / Wire.beginTransmission() / Wire.write() / Wire.read()

Matemática

min(a,b)  max(a,b)  abs(x)  constrain(x,lo,hi)  map(x,in_min,in_max,out_min,out_max)
bit(b)  bitRead(v,b)  bitSet(v,b)  bitClear(v,b)  lowByte(w)  highByte(w)

6Pinout e Hardware

Constantes de pinos

ConstanteGPIOFunção
LED_BUILTIN5LPG — LED de hardware / PWM
PIN_SPI_SCK8SPI Clock
PIN_SPI_MISO9SPI MISO
PIN_SPI_MOSI10SPI MOSI
PIN_SPI_SS12SPI Chip Select
PIN_WIRE_SDA41I2C SDA
PIN_WIRE_SCL42I2C SCL
A0 ~ A3Canais ADC 0 a 3

LCD — Conector CON601 (ST7735 128×160)

Pino CON601Sinal L610GPIOFunção LCD
14LCD_SIOGPIO0MOSI / SDA
15LCD_SDCGPIO1DC / A0
17LCD_CLKGPIO2SCK / CLK
12LCD_CSGPIO3CS
11LCD_RSTBGPIO6RESET
7IOVCC1.8V ou 3.3V
8VDD2.8V
9LED_ABacklight + (3.3V)
10LED_KBacklight − (GND)

Câmera — Conector CON600 (GC0308 VGA)

Pino CON600SinalFunção
2VDDIO1.8V
3SDAI2C config
4SCLI2C config
5CMRSTReset câmera
6CMPDNPower Down
8CMMCLKClock de referência
10CMCSKSPI Clock
11CMCSD0SPI Data 0
13VCAMA2.8V alimentação
7,9,19,20GNDMassa

7Arquitetura de uma Aplicação

O L610 usa FreeRTOS. O código pesado deve correr em threads separadas, não no loop().

#include <Arduino.h>

// 1. OBRIGATORIO — eventos assíncronos
void user_signal_process(GAPP_SIGNAL_ID_T sig, va_list arg)
{
    switch (sig) {
    case GAPP_SIG_PDP_ACTIVE_ADDRESS: {
        char *addr = (char*)va_arg(arg, char*);
        va_end(arg);
        Serial.printf("[LTE] IP: %s\n", addr);
        break;
    }
    default: break;
    }
}

// 2. Thread de trabalho
static void _my_thread(void *param)
{
    Serial.println("Thread iniciada!");
    while (true) {
        // trabalho aqui...
        fibo_taskSleep(1000);   // NÃO usar delay() em threads!
    }
    fibo_thread_delete();
}

// 3. Criar thread em setup()
void setup()
{
    Serial.begin(115200);
    fibo_taskSleep(2000);

    fibo_thread_create((void*)_my_thread, (INT8*)"mythread",
                       1024*4,   // stack 4KB
                       NULL, OSI_PRIORITY_NORMAL);
}

void loop() { delay(60000); }

Regras importantes

RegraRazão
user_signal_process() obrigatórioSDK exige esta função — sem ela o link falha
fibo_taskSleep() em threadsdelay() não funciona correctamente em contexto RTOS
fibo_getSysTick() em threadsmillis() pode não funcionar em threads
extern "C" para headers SDKoc_ws.h, oc_coap.h são código C puro
Stack mínimo 4KBMenos pode causar stack overflow
fibo_taskSleep(2000) após Serial.beginUART precisa de tempo para inicializar

8Rede e PDP

Todos os exemplos de rede usam esta função padrão waitNetworkAndPDP():

static UINT8 _pdp_ip[50] = {0};

static bool waitNetworkAndPDP()
{
    // Asalvar registo LTE — aceitar home (1) E roaming (5)
    Serial.print("[LTE] A asalvar registo");
    for (int i = 0; i < 120; i++) {
        reg_info_t reg;
        fibo_getRegInfo(®, (CFW_SIM_ID)0);
        if (reg.nStatus == 1 || reg.nStatus == 5) {
            Serial.printf(" OK (status=%d)\n", reg.nStatus);
            break;
        }
        if (i % 10 == 0) Serial.printf("\n[LTE] status=%d...", reg.nStatus);
        else Serial.print(".");
        fibo_taskSleep(1000);
    }

    // Verificar se PDP já está ativo
    UINT8 status = 0;
    memset(_pdp_ip, 0, sizeof(_pdp_ip));
    fibo_PDPStatus(1, _pdp_ip, &status, (CFW_SIM_ID)0);
    if (status == 1 && _pdp_ip[0]) {
        Serial.printf("[LTE] PDP ja ativo IP=%s\n", _pdp_ip);
        return true;
    }

    // Ativar PDP com polling (mais robusto que semáforo)
    Serial.println("[LTE] A ativar PDP...");
    memset(_pdp_ip, 0, sizeof(_pdp_ip));
    fibo_PDPActive(1, NULL, NULL, NULL, 0, (CFW_SIM_ID)0, NULL);
    for (int i = 0; i < 30; i++) {
        fibo_taskSleep(1000);
        Serial.print(".");
        fibo_PDPStatus(1, _pdp_ip, &status, (CFW_SIM_ID)0);
        if (status == 1 && _pdp_ip[0]) break;
    }
    Serial.println();

    if (status == 1 && _pdp_ip[0]) {
        Serial.printf("[LTE] IP: %s\n", _pdp_ip);
        return true;
    }
    Serial.println("[LTE] PDP falhou!");
    return false;
}

Output típico:

[LTE] A asalvar registo
[LTE] status=0.... OK (status=1)
[LTE] A ativar PDP...
.
[LTE] IP: 10.69.150.81,2804:389:C0C2:C3EF:E621:86CE:F33A:F31D
ℹ️
O L610 com dual stack IPv4+IPv6 mostra ambos os IPs separados por vírgula. O módulo em roaming retorna nStatus=5 — é importante aceitar este estado além de nStatus=1.

9Os 58 Exemplos

Base
01

01_Blink

LED GPIO pisca usando o LPG hardware (GPIO5). O "Hello World" do L610.

✓ Testado
02

02_Serial

Echo UART — recebe bytes pelo Serial e retransmite. Testa a comunicação básica.

✓ Testado
Rede — Protocolos
03

03_MQTT

Publish/Subscribe no broker público HiveMQ (broker.hivemq.com:1883). Inclui callbacks de RX, PUB e SUB.

✓ Testado
04

04_HTTP

HTTP GET e POST para httpbin.org. Usa callback assíncrono para receber a resposta.

✓ Testado
06

06_TCP

Socket TCP raw conectando a httpbin.org:80. Resolve DNS, liga, envia GET e recebe resposta.

✓ Testado
14

14_FTP

Upload e download de arquivos via FTP. Servidor de teste: ftp.dlptest.com.

✓ Testado
28

28_SSL

Socket TLS/HTTPS conectando a httpbin.org:443. Nota: requer 10s de espera após PDP.

✓ Testado
32

32_WebSocket

WebSocket client com callbacks de recepção e fechamento. Servidor: echo.websocket.org.

✓ Testado
44

44_CoAP

Protocolo CoAP (UDP) para IoT constrangido. GET /hello no servidor coap.me:5683.

✓ Testado
Rede — Utilitários
26

26_Ping

ICMP ping via fibo_mping. Mostra RTT e estatísticas. Nota: alguns operadores bloqueiam ICMP.

✓ Testado
27

27_NTP

Sincronização de tempo com pool NTP brasileiro (a.st1.ntp.br). Atualiza o RTC interno.

✓ Testado
29

29_LBS

Localização por Cell ID. Mostra TAC e CellID LTE. Compatível com opencellid.org.

✓ Testado
30

30_CellInfo

Info detalhada da célula LTE: TAC, CellID, RSSI em dBm, IMEI, IMSI, ICCID.

✓ Testado
36

36_DNS

Resolução DNS de múltiplos hosts. Mostra os servidores DNS do operador e IPs resolvidos.

✓ Testado
38

38_MultiPDP

Ativação de múltiplos contextos PDP (CID 1-7). Útil para separar tráfego IoT/dados.

✓ Testado
56

56_SpeedTest

Teste de velocidade download e upload via TCP raw. Mostra Kbps e KB/s.

✓ Testado
Hardware
05

05_GPIO

Input, Output e Interrupções GPIO. Debounce e detecção de flancos.

✓ Testado
09

09_I2C

Sensor de temperatura/humidade SHT40 via I2C. Lê valores e mostra no Serial.

✓ Testado
10

10_SPI_Flash

Flash SPI externa GD25LQ64C — erase, write, read e verificação.

✓ Testado
11

11_InnerFlash

Flash interna NVM do L610 — salvar e recuperar dados persistentes.

✓ Testado
12

12_RTC

Relógio em tempo real — set/get hora, alarme e incremento periódico.

✓ Testado
13

13_File

Filesystem /FFS/ — criar, escrever, ler, listar e excluir arquivos.

✓ Testado
17

17_PWM_LPG

PWM via hardware LPG do L610. Controlo de intensidade luminosa.

✓ Testado
18

18_SDCard

SD Card via interface SDIO. Leitura/escrita de arquivos.

⚠️ HW kit
49

49_LCD_ST7735

Display SPI colorido 128×160. Preenchimento, linhas, pixels, gradiente e sleep/wake.

✓ Compilado
50

50_Camera

Câmera SPI GC0308 VGA — preview contínuo no LCD e captura de foto.

✓ Compilado
52

52_RS485

Interface RS485 half-duplex para Modbus RTU e sensores industriais.

✓ Compilado
53

53_ExtFlash

Flash SPI externa com filesystem montado como /ext/. Erase, write, read.

✓ Compilado
Wireless
07

07_GNSS

GPS/GLONASS NMEA parser — latitude, longitude, altitude, velocidade e satélites.

✓ Testado
08

08_SMS

Envio e recepção de SMS. Leitura de mensagens recebidas via sinal.

✓ Testado
16

16_BLE_Client

BLE scan, connect, discover services e leitura de características.

✓ Testado
21

21_BT_SPP

Bluetooth SPP (Serial Port Profile) — emula porta série over Bluetooth.

✓ Testado
22

22_BLE_Server

BLE GATT Server com serviço personalizado, notificações e writes.

✓ Testado
23

23_BT_Classic

Bluetooth Classic — scan, pair e troca de dados.

✓ Testado
24

24_BT_A2DP

Bluetooth A2DP Audio Sink — receber áudio de smartphone.

⚠️ HW kit
25

25_WiFiScan

Scan passivo de redes WiFi — lista SSIDs, BSSIDs, canais e RSSI.

✓ Testado
39

39_DualSIM

Gestão dual SIM — sinal por SIM, troca ativa com cfun0/cfun1.

✓ Testado
Sistema e USB
15

15_AT_Commands

Envio de comandos AT raw e recepção de respostas via arduino_at_response().

✓ Testado
19

19_USB_Device

USB CDC Device — emula porta série USB no PC.

✓ Testado
20

20_Debug

Debug logs via OSI_LOGI — visível no output do compilador e debug serial.

✓ Testado
33

33_CPU_Usage

Monitor de CPU e RAM em tempo real. Útil para optimizar aplicações.

✓ Testado
34

34_DeviceInfo

IMEI, IMSI, ICCID, número de série, versão de firmware e hardware.

✓ Testado
40

40_XML

Parser XML SAX via Expat. Parsing de documentos XML com callbacks.

✓ Testado
55

55_AppVersion

Gestão de versão da aplicação Arduino. Acessível via AT+APP.

✓ Compilado
57

57_RTOS

FreeRTOS: criação de tasks, semáforos, event groups, secções críticas e gestão de memória.

✓ Compilado
Áudio e Media
31

31_MP3_Player

Reprodutor MP3/AMR de arquivos no filesystem /FFS/. Controlo play/pause/stop.

✓ Compilado
35

35_TTS

Text-to-Speech — converter texto em fala com voz em Português/Chinês.

✓ Compilado
41

41_POC

Push-to-Talk (PoC) — streaming de áudio bidirecional em tempo real.

✓ Compilado
42

42_AudioList

Playlist de arquivos MP3/AMR com fibo_audio_list_play. Útil para síntese de voz.

✓ Testado
54

54_AudioStream

Audio stream PCM via buffer circular. Para VoIP e streaming em tempo real.

✓ Compilado
58

58_QRCode

Leitura de QR Code e Barcodes via câmera SPI. Usa fibo_sweep_code().

✓ Compilado
Energia e OTA
43

43_PSM

Power Saving Mode — consumo de ~5µA durante sono. T3412/T3324 configuráveis.

✓ Testado
45

45_OTA

OTA update da aplicação Arduino via HTTP. Download + apply + reboot automático.

✓ Testado
46

46_Charger

Monitor de bateria e carregador — tensão, nível %, corrente, estado de carga.

✓ Testado
47

47_PowerKey

Botão de power com shutdown gracioso — executa código antes de desconectar.

✓ Testado
48

48_FOTA

Firmware OTA — atualizar o firmware do modem via HTTP. fibo_firmware_ota().

✓ Testado
Criptografia
37

37_Crypto

SHA256, HMAC-SHA1 e Base64. Para autenticação em serviços cloud IoT.

✓ Compilado
51

51_Base64

Base64 encode/decode com 6 casos práticos: HTTP Basic Auth, JWT, dados binários.

✓ Compilado
Legenda: ✓ Testado hardware real confirmado ✓ Compilado compila, hardware não disponível para teste ⚠️ HW kit pinos não acessíveis no kit ADP-L610-GL-33-00

10Referência da API FIBOCOM

MQTT

fibo_mqtt_set((INT8*)user, (INT8*)pass)
fibo_mqtt_connect(client_id, host, port, clean_session, keepalive, tls)
fibo_mqtt_pub(topic, qos, retain, message, msglen)
fibo_mqtt_sub(topic, qos)
// Sinais: GAPP_SIG_CONNECT_RSP, GAPP_SIG_INCOMING_DATA_RSP,
//         GAPP_SIG_CLOSE_RSP, GAPP_SIG_PUB_RSP, GAPP_SIG_SUB_RSP

HTTP

oc_http_param_t *http = fibo_http_new()
strncpy((char*)http->url, url, OC_HTTP_URL_LEN-1)
http->enHttpReadMethod = OC_USER_CALLBACK
http->cbReadBody = my_cb   // void cb(UINT8 *buf, UINT32 len, INT32 flag)
fibo_http_get(http, NULL)
fibo_http_post_ex(http, data, header, len)
fibo_http_delete(http)

SSL / TLS

fibo_set_ssl_chkmode(0)              // 0 = sem verificar CA
fibo_taskSleep(10000)                // OBRIGATORIO após PDP!
INT32 ssl = fibo_ssl_sock_create()
fibo_ssl_sock_connect(ssl, host, port)
fibo_ssl_sock_send / recv / close

TCP Socket

INT32 sock = fibo_sock_create(GAPP_IPPROTO_TCP)
GAPP_TCPIP_ADDR_T addr;
addr.sin_port = (uint16_t)(((port&0xFF)<<8)|((port>>8)&0xFF));
addr.sin_addr = server_ip;  // de fibo_getHostByName
fibo_sock_connect(sock, &addr)
fibo_sock_send / recv / close

WebSocket

extern "C" { #include "oc_ws.h" }
fibo_ws_opt_t opt = {30000, 10000, true, NULL};
void *ws = fibo_ws_open(url, &opt, data_cb, close_cb, NULL)
fibo_ws_send_text(ws, (INT8*)msg)
fibo_ws_close(ws)

CoAP

extern "C" { #include "oc_coap.h" }
void *h = fibo_coap_open(host, 5683, 0)
void *msg = fibo_coap_message_create(id, FIBOCOM_COAP_MSG_CON,
            0, FIBOCOM_COAP_GET, payload, plen, token, tlen)
fibo_coap_message_add_uri(msg, "/path")
fibo_coap_send(h, msg) / fibo_coap_message_destroy(msg)
fibo_copa_wait_mesg(h, 1000)
void *r = fibo_coap_recv(h)
fibo_coap_close(h)

Dispositivo

fibo_get_imei(imei, (CFW_SIM_ID)0)
fibo_get_imsi(imsi)                   // sem argumento simID!
fibo_get_ccid(iccid)
fibo_get_csq(&rssi, &ber)            // INT32* — sem argumento simID!
fibo_getRegInfo(®, (CFW_SIM_ID)0)
// reg.nStatus: 1=home, 5=roaming
// reg.curr_rat: 7=LTE, 3=GSM
// reg.lte_scell_info.tac / cell_id
// reg.gsm_scell_info.lac / cell_id

RTOS

fibo_thread_create(fn, name, stack, param, OSI_PRIORITY_NORMAL)
fibo_thread_delete()
fibo_taskSleep(ms)
fibo_getSysTick()               // ms desde boot
UINT32 sem = fibo_sem_new(0)
fibo_sem_wait(sem)
int ret = fibo_sem_try_wait(sem, timeout_ms)  // 0=OK, !=0=timeout
fibo_sem_signal(sem) / fibo_sem_free(sem)
void *p = fibo_malloc(size) / fibo_free(p)
UINT32 st = fibo_enterCS() / fibo_exitCS(st)

Energia

fibo_psm_mode(1, "01000001", "00000001")  // 1h sleep, 2s active
fibo_getVbatStaticVol()    // tensão mV
fibo_getVbatVolLevel()     // nível %
fibo_ischargering()        // true=a carregar
fibo_set_pwr_callback((key_callback)cb, 4000)
fibo_softPowerOff()
fibo_softReset()

OTA

fibo_ota_set_callback(cb)   // void cb(UINT32 received, UINT32 total)
fibo_open_ota(0, url, NULL, NULL, NULL)        // APP OTA
fibo_firmware_ota(0, url, NULL, NULL, NULL)    // FW OTA
fibo_ota_errcode()                              // código de erro

Manual desenvolvido por Miguel Alexandre Wisintainer

Baseado no SDK Open CPU FIBOCOM © RDA/Unisoc Technologies  ·  CC BY 4.0