a16fb23dd7
Notice instance information of LwM2M server operation to application.
2197 lines
58 KiB
C
2197 lines
58 KiB
C
/****************************************************************************
|
|
* apps/lte/alt1250/callback_handlers/alt1250_evt.c
|
|
*
|
|
* 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
#include <semaphore.h>
|
|
#include <nuttx/modem/alt1250.h>
|
|
#include <nuttx/wireless/lte/lte_ioctl.h>
|
|
#include <nuttx/net/sms.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/wait.h>
|
|
#include <fcntl.h>
|
|
#include <netinet/in.h>
|
|
#include <assert.h>
|
|
|
|
#include <nuttx/net/dns.h>
|
|
#include <lte/lte_lwm2m.h>
|
|
|
|
#include "alt1250_dbg.h"
|
|
#include "lte/lapi.h"
|
|
#include "lte/lte_api.h"
|
|
|
|
#include "alt1250_evt.h"
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
#define TABLE_CONTENT(cid, acid, outp) \
|
|
{ .cmdid = LTE_CMDID_##cid, .altcid = APICMDID_##acid, \
|
|
.outparam = outp, .outparamlen = nitems(outp) }
|
|
|
|
#define TABLE_CONTENT_NOARG(cid, acid) \
|
|
{ .cmdid = LTE_CMDID_##cid, .altcid = APICMDID_##acid, \
|
|
.outparam = NULL, .outparamlen = 0 }
|
|
|
|
#define NCBTABLES (8 + ALTCOM_NSOCKET) /* 8 is the maximum number of events */
|
|
|
|
#define IS_REPORT_API(cmdid) \
|
|
( LTE_ISCMDGRP_EVENT(cmdid) || cmdid == LTE_CMDID_SETRESTART )
|
|
|
|
#define EVTTASK_NAME "lteevt_task"
|
|
#define LAPIEVT_QNAME "/lapievt"
|
|
|
|
#define clr_evtcb(info) reg_evtcb(info, 0, NULL)
|
|
#define search_free_evtcb() search_evtcb(0)
|
|
|
|
/****************************************************************************
|
|
* Private Function Prototypes
|
|
****************************************************************************/
|
|
|
|
static uint64_t lte_set_report_restart_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
static uint64_t lte_radio_on_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_radio_off_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
static uint64_t lte_activate_pdn_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
static uint64_t lte_deactivate_pdn_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_netinfo_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_imscap_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_version_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_phoneno_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_imsi_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_imei_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_pinset_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_pinenable_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_change_pin_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_enter_pin_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_localtime_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_operator_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_edrx_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_edrx_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_psm_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_psm_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_ce_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_ce_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_siminfo_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_current_edrx_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_current_psm_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_get_quality_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
static uint64_t lte_set_report_netinfo_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_report_simstat_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_report_localtime_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_report_quality_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lte_set_report_cellinfo_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t tls_config_verify_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
|
|
static uint64_t lwm2m_read_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lwm2m_write_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lwm2m_exec_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lwm2m_ovstart_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lwm2m_ovstop_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lwm2m_operation_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
static uint64_t lwm2m_fwupdate_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
|
|
static FAR void *get_cbfunc(uint32_t cmdid);
|
|
static uint64_t alt1250_evt_search(uint32_t cmdid);
|
|
|
|
/****************************************************************************
|
|
* Private Data Types
|
|
****************************************************************************/
|
|
|
|
struct cbinfo_s
|
|
{
|
|
uint32_t cmdid;
|
|
CODE uint64_t (*cb)(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable);
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Private Data
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_LTE_ALT1250_LAUNCH_EVENT_TASK
|
|
static int g_cbpid;
|
|
#endif
|
|
|
|
/* event argument for LTE_CMDID_SETRESTART */
|
|
|
|
static uint32_t g_reason;
|
|
static void *g_setrestartargs[] =
|
|
{
|
|
&g_reason
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETVER */
|
|
|
|
static int g_getverret;
|
|
static lte_version_t g_ver;
|
|
static FAR void *g_getverargs[] =
|
|
{
|
|
&g_getverret, &g_ver
|
|
};
|
|
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
|
|
/* event argument for LTE_CMDID_RADIOON */
|
|
|
|
static int g_radioonret;
|
|
static FAR void *g_radioonargs[] =
|
|
{
|
|
&g_radioonret
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_RADIOOFF */
|
|
|
|
static int g_radiooffret;
|
|
static FAR void *g_radiooffargs[] =
|
|
{
|
|
&g_radiooffret
|
|
};
|
|
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
|
|
/* event argument for LTE_CMDID_ACTPDN */
|
|
|
|
static int g_actpdnret;
|
|
static lte_pdn_t g_pdn;
|
|
static FAR void *g_actpdnargs[] =
|
|
{
|
|
&g_actpdnret, &g_pdn
|
|
};
|
|
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
|
|
/* event argument for LTE_CMDID_DEACTPDN */
|
|
|
|
static int g_deactpdnret;
|
|
static FAR void *g_deactpdnargs[] =
|
|
{
|
|
&g_deactpdnret
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETNETINFO */
|
|
|
|
static int g_getnetinforet;
|
|
static lte_pdn_t g_pdninfo[LTE_SESSION_ID_MAX];
|
|
static lte_netinfo_t g_netinfo =
|
|
{
|
|
.pdn_stat = g_pdninfo
|
|
};
|
|
|
|
static uint8_t g_pdn_num = LTE_SESSION_ID_MAX;
|
|
static FAR void *g_netinfoargs[] =
|
|
{
|
|
&g_getnetinforet, &g_netinfo, &g_pdn_num
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_IMSCAP */
|
|
|
|
static int g_imscapret;
|
|
static bool g_imscap;
|
|
static FAR void *g_imscapargs[] =
|
|
{
|
|
&g_imscapret, &g_imscap
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETPHONE */
|
|
|
|
static int g_getphoneret;
|
|
static uint8_t g_getphoneerrcause;
|
|
static char g_phoneno[LTE_PHONENO_LEN];
|
|
#ifndef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
static size_t g_phonenolen = LTE_PHONENO_LEN;
|
|
#endif
|
|
static FAR void *g_getphoneargs[] =
|
|
{
|
|
#ifdef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
&g_getphoneret, &g_getphoneerrcause, g_phoneno
|
|
#else
|
|
&g_getphoneret, &g_getphoneerrcause, g_phoneno, &g_phonenolen
|
|
#endif
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETIMSI */
|
|
|
|
static int g_getimsiret;
|
|
static uint8_t g_getimsierrcause;
|
|
static char g_imsi[LTE_SIMINFO_IMSI_LEN];
|
|
#ifndef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
static size_t g_imsilen = LTE_SIMINFO_IMSI_LEN;
|
|
#endif
|
|
static FAR void *g_getimsiargs[] =
|
|
{
|
|
#ifdef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
&g_getimsiret, &g_getimsierrcause, g_imsi
|
|
#else
|
|
&g_getimsiret, &g_getimsierrcause, g_imsi, &g_imsilen
|
|
#endif
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETIMEI */
|
|
|
|
static int g_getimeiret;
|
|
static char g_imei[LTE_IMEI_LEN];
|
|
#ifndef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
static size_t g_imeilen = LTE_IMEI_LEN;
|
|
#endif
|
|
static FAR void *g_getimeiargs[] =
|
|
{
|
|
#ifdef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
&g_getimeiret, g_imei
|
|
#else
|
|
&g_getimeiret, g_imei, &g_imeilen
|
|
#endif
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETPINSET */
|
|
|
|
static int g_getpinsetret;
|
|
static lte_getpin_t g_pinset;
|
|
static FAR void *g_getpinsetargs[] =
|
|
{
|
|
&g_getpinsetret, &g_pinset
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_PINENABLE */
|
|
|
|
static int g_pinenableret;
|
|
static uint8_t g_pineattleft;
|
|
static FAR void *g_pinenableargs[] =
|
|
{
|
|
&g_pinenableret, &g_pineattleft
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_CHANGEPIN */
|
|
|
|
static int g_changepinret;
|
|
static uint8_t g_chanattleft;
|
|
static FAR void *g_changepinargs[] =
|
|
{
|
|
&g_changepinret, &g_chanattleft
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_ENTERPIN */
|
|
|
|
static int g_enterpinret;
|
|
static uint8_t g_entpinsimstat;
|
|
static uint8_t g_entpinattleft;
|
|
static FAR void *g_enterpinargs[] =
|
|
{
|
|
&g_enterpinret, &g_entpinsimstat, &g_entpinattleft
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETLTIME */
|
|
|
|
static int g_getltimeret;
|
|
static lte_localtime_t g_ltime;
|
|
static FAR void *g_getltimeargs[] =
|
|
{
|
|
&g_getltimeret, &g_ltime
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETOPER */
|
|
|
|
static int g_getoperret;
|
|
static char g_oper[LTE_OPERATOR_LEN];
|
|
#ifndef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
static size_t g_operlen = LTE_OPERATOR_LEN;
|
|
#endif
|
|
static FAR void *g_getoperargs[] =
|
|
{
|
|
#ifdef CONFIG_LTE_LAPI_KEEP_COMPATIBILITY
|
|
&g_getoperret, g_oper
|
|
#else
|
|
&g_getoperret, g_oper, &g_operlen
|
|
#endif
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETEDRX */
|
|
|
|
static int g_getedrxret;
|
|
static lte_edrx_setting_t g_getedrx;
|
|
static bool g_is_getedrxevt;
|
|
static FAR void *g_getedrxargs[] =
|
|
{
|
|
&g_getedrxret, &g_getedrx, &g_is_getedrxevt
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_SETEDRX */
|
|
|
|
static int g_setedrxret;
|
|
static FAR void *g_setedrxargs[] =
|
|
{
|
|
&g_setedrxret
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETPSM */
|
|
|
|
static int g_getpsmret;
|
|
static lte_psm_setting_t g_getpsm;
|
|
static bool g_is_getpsmevt;
|
|
static FAR void *g_getpsmargs[] =
|
|
{
|
|
&g_getpsmret, &g_getpsm, &g_is_getpsmevt
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_SETPSM */
|
|
|
|
static int g_setpsmret;
|
|
static FAR void *g_setpsmargs[] =
|
|
{
|
|
&g_setpsmret
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETCE */
|
|
|
|
static int g_getceret;
|
|
static lte_ce_setting_t g_getce;
|
|
static FAR void *g_getceargs[] =
|
|
{
|
|
&g_getceret, &g_getce
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_SETCE */
|
|
|
|
static int g_setceret;
|
|
static FAR void *g_setceargs[] =
|
|
{
|
|
&g_setceret
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETSIMINFO */
|
|
|
|
static int g_setsiminforet;
|
|
static lte_siminfo_t g_siminfo;
|
|
static FAR void *g_getsiminfoargs[] =
|
|
{
|
|
&g_setsiminforet, &g_siminfo
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETCEDRX */
|
|
|
|
static int g_getcedrxret;
|
|
static lte_edrx_setting_t g_getcedrx;
|
|
static bool g_is_getcedrxevt;
|
|
static FAR void *g_getcedrxargs[] =
|
|
{
|
|
&g_getcedrxret, &g_getcedrx, &g_is_getcedrxevt
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETCPSM */
|
|
|
|
static int g_getcpsmret;
|
|
static lte_psm_setting_t g_getcpsm;
|
|
static bool g_is_getcpsmevt;
|
|
static FAR void *g_getcpsmargs[] =
|
|
{
|
|
&g_getcpsmret, &g_getcpsm, &g_is_getcpsmevt
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETQUAL */
|
|
|
|
static int g_getqualret;
|
|
static lte_quality_t g_getqual;
|
|
static FAR void *g_getqualargs[] =
|
|
{
|
|
&g_getqualret, &g_getqual
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETCELL */
|
|
|
|
static int g_getcellret;
|
|
static lte_neighbor_cell_t g_neighbors[LTE_NEIGHBOR_CELL_MAX];
|
|
static lte_cellinfo_t g_getcell =
|
|
{
|
|
.neighbors = g_neighbors
|
|
}
|
|
;
|
|
static FAR void *g_getcellargs[] =
|
|
{
|
|
&g_getcellret, &g_getcell
|
|
};
|
|
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
|
|
/* event argument for LTE_CMDID_GETRAT */
|
|
|
|
static int g_getratret;
|
|
static FAR void *g_getratargs[] =
|
|
{
|
|
&g_getratret
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_SETRAT */
|
|
|
|
static int g_setratret;
|
|
static FAR void *g_setratargs[] =
|
|
{
|
|
&g_setratret
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETRATINFO */
|
|
|
|
static int g_getratinforet;
|
|
static lte_ratinfo_t g_ratinfo;
|
|
static FAR void *g_getratinfoargs[] =
|
|
{
|
|
&g_getratinforet, &g_ratinfo
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_REPNETINFO */
|
|
|
|
static lte_pdn_t g_reppdninfo[LTE_SESSION_ID_MAX];
|
|
static lte_netinfo_t g_repnetinfo =
|
|
{
|
|
.pdn_stat = g_reppdninfo
|
|
};
|
|
|
|
static uint8_t g_ndnsaddrs;
|
|
static struct sockaddr_storage g_dnsaddrs[ALTCOM_DNS_SERVERS];
|
|
static FAR void *g_repnetinfoargs[] =
|
|
{
|
|
&g_repnetinfo, &g_ndnsaddrs, g_dnsaddrs
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_REPSIMSTAT */
|
|
|
|
static uint32_t g_repsimstat;
|
|
static FAR void *g_repsimstatargs[] =
|
|
{
|
|
&g_repsimstat
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_REPLTIME */
|
|
|
|
static lte_localtime_t g_repltime;
|
|
static FAR void *g_repltimeargs[] =
|
|
{
|
|
&g_repltime
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_REPQUAL */
|
|
|
|
static lte_quality_t g_repqual;
|
|
static FAR void *g_repqualargs[] =
|
|
{
|
|
&g_repqual
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_REPCELL */
|
|
|
|
static lte_neighbor_cell_t g_repneighbors[LTE_NEIGHBOR_CELL_MAX];
|
|
static lte_cellinfo_t g_repcell =
|
|
{
|
|
.neighbors = g_repneighbors
|
|
};
|
|
|
|
static FAR void *g_repcellargs[] =
|
|
{
|
|
&g_repcell
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_GETERRINFO */
|
|
|
|
static lte_errinfo_t g_geterrinfo;
|
|
static FAR void *g_geterrinfoargs[] =
|
|
{
|
|
&g_geterrinfo
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_TLS_CONFIG_VERIFY_CALLBACK */
|
|
|
|
static uint32_t g_crt;
|
|
static int32_t g_depth;
|
|
static FAR void *g_vrfycbargs[] =
|
|
{
|
|
&g_crt, &g_depth
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_SMS_REPORT_RECV */
|
|
|
|
static uint16_t g_smsmsg_index;
|
|
static uint16_t g_smsrecv_sz;
|
|
static uint8_t g_sms_maxnum;
|
|
static uint8_t g_sms_seqnum;
|
|
static struct sms_deliver_msg_max_s g_recvmsg;
|
|
static FAR void *g_smsreportargs[] =
|
|
{
|
|
&g_smsmsg_index, &g_smsrecv_sz, &g_sms_maxnum, &g_sms_seqnum, &g_recvmsg
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_LWM2M_READ_EVT */
|
|
|
|
static struct lwm2mstub_instance_s g_lwm2mread_inst;
|
|
static FAR void *g_lwm2mreadargs[] =
|
|
{
|
|
NULL, NULL, &g_lwm2mread_inst
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_LWM2M_WRITE_EVT */
|
|
|
|
static struct lwm2mstub_instance_s g_lwm2mwrite_inst;
|
|
static char g_lwm2mwrite_value[LWM2MSTUB_MAX_WRITE_SIZE];
|
|
static FAR void *g_lwm2mwriteargs[] =
|
|
{
|
|
NULL, NULL, &g_lwm2mwrite_inst, g_lwm2mwrite_value,
|
|
NULL, (FAR void *)LWM2MSTUB_MAX_WRITE_SIZE
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_LWM2M_EXEC_EVT */
|
|
|
|
static struct lwm2mstub_instance_s g_lwm2mexec_inst;
|
|
static FAR void *g_lwm2mexecargs[] =
|
|
{
|
|
NULL, NULL, &g_lwm2mexec_inst, NULL
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_LWM2M_OVSTART_EVT */
|
|
|
|
static struct lwm2mstub_instance_s g_lwm2movstart_inst;
|
|
static char g_lwm2movstart_token[LWM2MSTUB_MAX_TOKEN_SIZE];
|
|
static struct lwm2mstub_ovcondition_s g_lwm2movstart_cond;
|
|
static FAR void *g_lwm2movstartargs[] =
|
|
{
|
|
NULL, NULL, &g_lwm2movstart_inst, g_lwm2movstart_token,
|
|
(FAR void *)LWM2MSTUB_MAX_TOKEN_SIZE, &g_lwm2movstart_cond
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_LWM2M_OVSTOP_EVT */
|
|
|
|
static struct lwm2mstub_instance_s g_lwm2movstop_inst;
|
|
static char g_lwm2movstop_token[LWM2MSTUB_MAX_TOKEN_SIZE];
|
|
static FAR void *g_lwm2movstopargs[] =
|
|
{
|
|
NULL, NULL, &g_lwm2movstop_inst, &g_lwm2movstop_token,
|
|
(FAR void *)LWM2MSTUB_MAX_TOKEN_SIZE
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_LWM2M_SERVEROP_EVT */
|
|
|
|
static struct lwm2mstub_instance_s g_lwm2msrvop_inst;
|
|
static FAR void *g_lwm2moperationargs[] =
|
|
{
|
|
NULL, NULL, &g_lwm2msrvop_inst
|
|
};
|
|
|
|
/* event argument for LTE_CMDID_LWM2M_FWUP_EVT */
|
|
|
|
static FAR void *g_lwm2mfwupargs[] =
|
|
{
|
|
NULL
|
|
};
|
|
|
|
static struct alt_evtbuffer_s g_evtbuff;
|
|
static struct alt_evtbuf_inst_s g_evtbuffers[] =
|
|
{
|
|
TABLE_CONTENT(SETRESTART, POWER_ON, g_setrestartargs),
|
|
TABLE_CONTENT(GETVER, GET_VERSION, g_getverargs),
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
TABLE_CONTENT(RADIOON, RADIO_ON, g_radioonargs),
|
|
TABLE_CONTENT(RADIOOFF, RADIO_OFF, g_radiooffargs),
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
TABLE_CONTENT(ACTPDN, ACTIVATE_PDN, g_actpdnargs),
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
TABLE_CONTENT(DEACTPDN, DEACTIVATE_PDN, g_deactpdnargs),
|
|
TABLE_CONTENT(GETNETINFO, GET_NETINFO, g_netinfoargs),
|
|
TABLE_CONTENT(IMSCAP, GET_IMS_CAP, g_imscapargs),
|
|
TABLE_CONTENT(GETPHONE, GET_PHONENO, g_getphoneargs),
|
|
TABLE_CONTENT(GETIMSI, GET_IMSI, g_getimsiargs),
|
|
TABLE_CONTENT(GETIMEI, GET_IMEI, g_getimeiargs),
|
|
TABLE_CONTENT(GETPINSET, GET_PINSET, g_getpinsetargs),
|
|
TABLE_CONTENT(PINENABLE, SET_PIN_LOCK, g_pinenableargs),
|
|
TABLE_CONTENT(CHANGEPIN, SET_PIN_CODE, g_changepinargs),
|
|
TABLE_CONTENT(ENTERPIN, ENTER_PIN, g_enterpinargs),
|
|
TABLE_CONTENT(GETLTIME, GET_LTIME, g_getltimeargs),
|
|
TABLE_CONTENT(GETOPER, GET_OPERATOR, g_getoperargs),
|
|
TABLE_CONTENT(GETEDRX, GET_EDRX, g_getedrxargs),
|
|
TABLE_CONTENT(SETEDRX, SET_EDRX, g_setedrxargs),
|
|
TABLE_CONTENT(GETPSM, GET_PSM, g_getpsmargs),
|
|
TABLE_CONTENT(SETPSM, SET_PSM, g_setpsmargs),
|
|
TABLE_CONTENT(GETCE, GET_CE, g_getceargs),
|
|
TABLE_CONTENT(SETCE, SET_CE, g_setceargs),
|
|
TABLE_CONTENT(GETSIMINFO, GET_SIMINFO, g_getsiminfoargs),
|
|
TABLE_CONTENT(GETCEDRX, GET_DYNAMICEDRX, g_getcedrxargs),
|
|
TABLE_CONTENT(GETCPSM, GET_DYNAMICPSM, g_getcpsmargs),
|
|
TABLE_CONTENT(GETQUAL, GET_QUALITY, g_getqualargs),
|
|
TABLE_CONTENT(GETCELL, GET_CELLINFO, g_getcellargs),
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
TABLE_CONTENT(GETRAT, GET_RAT, g_getratargs),
|
|
TABLE_CONTENT(SETRAT, SET_RAT, g_setratargs),
|
|
TABLE_CONTENT(GETRATINFO, GET_RAT, g_getratinfoargs),
|
|
TABLE_CONTENT(REPNETINFO, REPORT_NETINFO, g_repnetinfoargs),
|
|
TABLE_CONTENT_NOARG(REPEVT_DUMMY, REPORT_EVT),
|
|
TABLE_CONTENT(REPSIMSTAT, UNKNOWN, g_repsimstatargs),
|
|
TABLE_CONTENT(REPLTIME, UNKNOWN, g_repltimeargs),
|
|
TABLE_CONTENT(REPQUAL, REPORT_QUALITY, g_repqualargs),
|
|
TABLE_CONTENT(REPCELL, REPORT_CELLINFO, g_repcellargs),
|
|
TABLE_CONTENT(GETERRINFO, ERRINFO, g_geterrinfoargs),
|
|
TABLE_CONTENT(TLS_CONFIG_VERIFY, TLS_CONFIG_VERIFY_CALLBACK,
|
|
g_vrfycbargs),
|
|
TABLE_CONTENT(SMS_REPORT_RECV, SMS_REPORT_RECV, g_smsreportargs),
|
|
|
|
/* For Unsolicited event */
|
|
|
|
TABLE_CONTENT_NOARG(LWM2M_URC_DUMMY, URC_EVENT),
|
|
TABLE_CONTENT(LWM2M_READ_EVT, UNKNOWN, g_lwm2mreadargs),
|
|
TABLE_CONTENT(LWM2M_WRITE_EVT, UNKNOWN, g_lwm2mwriteargs),
|
|
TABLE_CONTENT(LWM2M_EXEC_EVT, UNKNOWN, g_lwm2mexecargs),
|
|
TABLE_CONTENT(LWM2M_OVSTART_EVT, UNKNOWN, g_lwm2movstartargs),
|
|
TABLE_CONTENT(LWM2M_OVSTOP_EVT, UNKNOWN, g_lwm2movstopargs),
|
|
TABLE_CONTENT(LWM2M_SERVEROP_EVT, UNKNOWN, g_lwm2moperationargs),
|
|
TABLE_CONTENT(LWM2M_FWUP_EVT, UNKNOWN, g_lwm2mfwupargs),
|
|
|
|
/* Add the command ID of LTE_CMDID_SELECT to the table so that the driver
|
|
* can identify the bitmap of the select event.
|
|
* The output parameter is NULL since a container for select is used.
|
|
*/
|
|
|
|
TABLE_CONTENT_NOARG(SELECT, SOCK_SELECT)
|
|
};
|
|
|
|
static struct cbinfo_s g_execbtable[] =
|
|
{
|
|
{LTE_CMDID_SETRESTART, lte_set_report_restart_exec_cb},
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
{LTE_CMDID_GETVER, lte_get_version_exec_cb},
|
|
{LTE_CMDID_RADIOON, lte_radio_on_exec_cb},
|
|
{LTE_CMDID_RADIOOFF, lte_radio_off_exec_cb},
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
{LTE_CMDID_ACTPDN, lte_activate_pdn_exec_cb},
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
{LTE_CMDID_DEACTPDN, lte_deactivate_pdn_exec_cb},
|
|
{LTE_CMDID_GETNETINFO, lte_get_netinfo_exec_cb},
|
|
{LTE_CMDID_IMSCAP, lte_get_imscap_exec_cb},
|
|
{LTE_CMDID_GETPHONE, lte_get_phoneno_exec_cb},
|
|
{LTE_CMDID_GETIMSI, lte_get_imsi_exec_cb},
|
|
{LTE_CMDID_GETIMEI, lte_get_imei_exec_cb},
|
|
{LTE_CMDID_GETPINSET, lte_get_pinset_exec_cb},
|
|
{LTE_CMDID_PINENABLE, lte_set_pinenable_exec_cb},
|
|
{LTE_CMDID_CHANGEPIN, lte_change_pin_exec_cb},
|
|
{LTE_CMDID_ENTERPIN, lte_enter_pin_exec_cb},
|
|
{LTE_CMDID_GETLTIME, lte_get_localtime_exec_cb},
|
|
{LTE_CMDID_GETOPER, lte_get_operator_exec_cb},
|
|
{LTE_CMDID_GETEDRX, lte_get_edrx_exec_cb},
|
|
{LTE_CMDID_SETEDRX, lte_set_edrx_exec_cb},
|
|
{LTE_CMDID_GETPSM, lte_get_psm_exec_cb},
|
|
{LTE_CMDID_SETPSM, lte_set_psm_exec_cb},
|
|
{LTE_CMDID_GETCE, lte_get_ce_exec_cb},
|
|
{LTE_CMDID_SETCE, lte_set_ce_exec_cb},
|
|
{LTE_CMDID_GETSIMINFO, lte_get_siminfo_exec_cb},
|
|
{LTE_CMDID_GETCEDRX, lte_get_current_edrx_exec_cb},
|
|
{LTE_CMDID_GETCPSM, lte_get_current_psm_exec_cb},
|
|
{LTE_CMDID_GETQUAL, lte_get_quality_exec_cb},
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
{LTE_CMDID_REPNETINFO, lte_set_report_netinfo_exec_cb},
|
|
{LTE_CMDID_REPSIMSTAT, lte_set_report_simstat_exec_cb},
|
|
{LTE_CMDID_REPLTIME, lte_set_report_localtime_exec_cb},
|
|
{LTE_CMDID_REPQUAL, lte_set_report_quality_exec_cb},
|
|
{LTE_CMDID_REPCELL, lte_set_report_cellinfo_exec_cb},
|
|
{LTE_CMDID_TLS_CONFIG_VERIFY, tls_config_verify_exec_cb},
|
|
{LTE_CMDID_LWM2M_READ_EVT, lwm2m_read_evt_cb},
|
|
{LTE_CMDID_LWM2M_WRITE_EVT, lwm2m_write_evt_cb},
|
|
{LTE_CMDID_LWM2M_EXEC_EVT, lwm2m_exec_evt_cb},
|
|
{LTE_CMDID_LWM2M_OVSTART_EVT, lwm2m_ovstart_evt_cb},
|
|
{LTE_CMDID_LWM2M_OVSTOP_EVT, lwm2m_ovstop_evt_cb},
|
|
{LTE_CMDID_LWM2M_SERVEROP_EVT, lwm2m_operation_evt_cb},
|
|
{LTE_CMDID_LWM2M_FWUP_EVT, lwm2m_fwupdate_evt_cb},
|
|
};
|
|
|
|
static struct cbinfo_s g_cbtable[NCBTABLES];
|
|
static sem_t g_cbtablelock;
|
|
|
|
/****************************************************************************
|
|
* Private Functions
|
|
****************************************************************************/
|
|
|
|
static uint64_t lte_set_report_restart_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
restart_report_cb_t callback = (restart_report_cb_t)cb;
|
|
FAR uint32_t *param = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*param);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
|
|
static uint64_t lte_radio_on_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
radio_on_cb_t callback = (radio_on_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_radio_off_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
radio_off_cb_t callback = (radio_off_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
|
|
static uint64_t lte_activate_pdn_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
activate_pdn_cb_t callback = (activate_pdn_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_pdn_t *pdn = (FAR lte_pdn_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, pdn);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
#ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API
|
|
|
|
static uint64_t lte_deactivate_pdn_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
deactivate_pdn_cb_t callback = (deactivate_pdn_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_netinfo_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_netinfo_cb_t callback = (get_netinfo_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_netinfo_t *info = (FAR lte_netinfo_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, info);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_imscap_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_imscap_cb_t callback = (get_imscap_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR bool *imscap = (FAR bool *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, *imscap);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_version_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_ver_cb_t callback = (get_ver_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_version_t *version = (FAR lte_version_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, version);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_phoneno_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_phoneno_cb_t callback = (get_phoneno_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR uint8_t *errcause = (FAR uint8_t *)cbarg[1];
|
|
FAR char *phoneno = (FAR char *)cbarg[2];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, *errcause, phoneno);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_imsi_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_imsi_cb_t callback = (get_imsi_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR uint8_t *errcause = (FAR uint8_t *)cbarg[1];
|
|
FAR char *imsi = (FAR char *)cbarg[2];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, *errcause, imsi);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_imei_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_imei_cb_t callback = (get_imei_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR char *imei = (FAR char *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, imei);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_pinset_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_pinset_cb_t callback = (get_pinset_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_getpin_t *pinset = (FAR lte_getpin_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, pinset);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_pinenable_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
set_pinenable_cb_t callback = (set_pinenable_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR uint8_t *attemptsleft = (FAR uint8_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, *attemptsleft);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_change_pin_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
change_pin_cb_t callback = (change_pin_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR uint8_t *attemptsleft = (FAR uint8_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, *attemptsleft);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_enter_pin_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
enter_pin_cb_t callback = (enter_pin_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR uint8_t *simstat = (FAR uint8_t *)cbarg[1];
|
|
FAR uint8_t *attemptsleft = (FAR uint8_t *)cbarg[2];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, *simstat, *attemptsleft);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_localtime_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_localtime_cb_t callback = (get_localtime_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_localtime_t *localtime = (FAR lte_localtime_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, localtime);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_operator_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_operator_cb_t callback = (get_operator_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR char *oper = (FAR char *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, oper);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_edrx_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_edrx_cb_t callback = (get_edrx_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_edrx_setting_t *settings = (FAR lte_edrx_setting_t *)cbarg[1];
|
|
FAR bool *is_getedrxevt = (FAR bool *)cbarg[2];
|
|
|
|
if (!(*is_getedrxevt))
|
|
{
|
|
return alt1250_evt_search(LTE_CMDID_GETCEDRX);
|
|
}
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, settings);
|
|
*is_getedrxevt = false;
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_edrx_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
set_edrx_cb_t callback = (set_edrx_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_psm_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_psm_cb_t callback = (get_psm_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_psm_setting_t *settings = (FAR lte_psm_setting_t *)cbarg[1];
|
|
FAR bool *is_getpsmevt = (FAR bool *)cbarg[2];
|
|
|
|
if (!(*is_getpsmevt))
|
|
{
|
|
return alt1250_evt_search(LTE_CMDID_GETCPSM);
|
|
}
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, settings);
|
|
*is_getpsmevt = false;
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_psm_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
set_psm_cb_t callback = (set_psm_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_ce_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_ce_cb_t callback = (get_ce_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_ce_setting_t *settings = (FAR lte_ce_setting_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, settings);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_ce_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
set_ce_cb_t callback = (set_ce_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_siminfo_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_siminfo_cb_t callback = (get_siminfo_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_siminfo_t *siminfo = (FAR lte_siminfo_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, siminfo);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_current_edrx_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_current_edrx_cb_t callback = (get_current_edrx_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_edrx_setting_t *settings = (FAR lte_edrx_setting_t *)cbarg[1];
|
|
FAR bool *is_getcedrxevt = (FAR bool *)cbarg[2];
|
|
|
|
if (!(*is_getcedrxevt))
|
|
{
|
|
return alt1250_evt_search(LTE_CMDID_GETEDRX);
|
|
}
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, settings);
|
|
*is_getcedrxevt = false;
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_current_psm_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_current_psm_cb_t callback = (get_current_psm_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_psm_setting_t *settings = (FAR lte_psm_setting_t *)cbarg[1];
|
|
FAR bool *is_getcpsmevt = (FAR bool *)cbarg[2];
|
|
|
|
if (!(*is_getcpsmevt))
|
|
{
|
|
return alt1250_evt_search(LTE_CMDID_GETPSM);
|
|
}
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, settings);
|
|
*is_getcpsmevt = false;
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_get_quality_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
get_quality_cb_t callback = (get_quality_cb_t)cb;
|
|
FAR uint32_t *result = (FAR uint32_t *)cbarg[0];
|
|
FAR lte_quality_t *quality = (FAR lte_quality_t *)cbarg[1];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*result, quality);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
#endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */
|
|
|
|
static uint64_t lte_set_report_netinfo_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
netinfo_report_cb_t callback = (netinfo_report_cb_t)cb;
|
|
FAR lte_netinfo_t *info = (FAR lte_netinfo_t *)cbarg[0];
|
|
uint8_t ndnsaddrs = *((FAR uint8_t *)cbarg[1]);
|
|
FAR struct sockaddr_storage *dnsaddr =
|
|
(FAR struct sockaddr_storage *)cbarg[2];
|
|
#if defined(CONFIG_NETDB_DNSCLIENT)
|
|
socklen_t addrlen;
|
|
uint8_t i;
|
|
#endif
|
|
|
|
#if defined(CONFIG_NETDB_DNSCLIENT)
|
|
DEBUGASSERT(ndnsaddrs <= ALTCOM_DNS_SERVERS);
|
|
|
|
ndnsaddrs = (ndnsaddrs > ALTCOM_DNS_SERVERS) ?
|
|
ALTCOM_DNS_SERVERS : ndnsaddrs;
|
|
|
|
for (i = 0; (i < ndnsaddrs) && (i < CONFIG_NETDB_DNSSERVER_NAMESERVERS);
|
|
i++)
|
|
{
|
|
addrlen = (dnsaddr[i].ss_family == AF_INET) ?
|
|
sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
|
|
dns_add_nameserver((FAR const struct sockaddr *)&dnsaddr[i], addrlen);
|
|
}
|
|
|
|
if (info->pdn_num > 0)
|
|
{
|
|
FAR lte_pdn_t *pdn = &info->pdn_stat[0];
|
|
FAR lte_ipaddr_t *ipaddr = &pdn->address[0];
|
|
|
|
/* ALT1250 can only connect one PDN, so check the first PDN. */
|
|
|
|
if ((pdn->ipaddr_num == 1) && (ipaddr->ip_type == LTE_IPTYPE_V4))
|
|
{
|
|
dns_set_queryfamily(AF_INET);
|
|
}
|
|
else if ((pdn->ipaddr_num == 1) && (ipaddr->ip_type == LTE_IPTYPE_V6))
|
|
{
|
|
dns_set_queryfamily(AF_INET6);
|
|
}
|
|
else
|
|
{
|
|
dns_set_queryfamily(AF_UNSPEC);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dns_set_queryfamily(AF_UNSPEC);
|
|
}
|
|
#endif
|
|
|
|
if (callback)
|
|
{
|
|
callback(info);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_report_simstat_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
simstat_report_cb_t callback = (simstat_report_cb_t)cb;
|
|
FAR uint32_t *simstat = (FAR uint32_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(*simstat);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_report_localtime_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
localtime_report_cb_t callback = (localtime_report_cb_t)cb;
|
|
FAR lte_localtime_t *localtime = (FAR lte_localtime_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(localtime);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_report_quality_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
|
|
FAR bool *set_writable)
|
|
{
|
|
quality_report_cb_t callback = (quality_report_cb_t)cb;
|
|
FAR lte_quality_t *quality = (FAR lte_quality_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(quality);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lte_set_report_cellinfo_exec_cb(FAR void *cb,
|
|
FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
cellinfo_report_cb_t callback = (cellinfo_report_cb_t)cb;
|
|
FAR lte_cellinfo_t *cellinfo = (FAR lte_cellinfo_t *)cbarg[0];
|
|
|
|
if (callback)
|
|
{
|
|
callback(cellinfo);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t tls_config_verify_exec_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
CODE void (*callback)(FAR void **cbarg) = cb;
|
|
FAR void *arg[2];
|
|
|
|
uint32_t crt = *((FAR uint32_t *)cbarg[0]);
|
|
int32_t depth = *((FAR int32_t *)cbarg[1]);
|
|
|
|
arg[0] = &crt;
|
|
arg[1] = &depth;
|
|
|
|
/* Here, need to set the status of the event argument to "writable".
|
|
* The callback function below will send a response command to ALT1250
|
|
* for this event. After receiving the response command,
|
|
* ALT1250 may send this event again.
|
|
* If the status of the event argument is "not writable", the ALTCOM driver
|
|
* will discard this event.
|
|
*/
|
|
|
|
alt1250_setevtarg_writable(LTE_CMDID_TLS_CONFIG_VERIFY);
|
|
*set_writable = true;
|
|
|
|
/* Use a callback to pass event arguments. */
|
|
|
|
callback(arg);
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lwm2m_read_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
lwm2mstub_read_cb_t callback = (lwm2mstub_read_cb_t)cb;
|
|
|
|
if (callback)
|
|
{
|
|
callback((int)cbarg[0], (int)cbarg[1],
|
|
(FAR struct lwm2mstub_instance_s *)cbarg[2]);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lwm2m_write_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
lwm2mstub_write_cb_t callback = (lwm2mstub_write_cb_t)cb;
|
|
|
|
if (callback)
|
|
{
|
|
callback((int)cbarg[0], (int)cbarg[1],
|
|
(FAR struct lwm2mstub_instance_s *)cbarg[2],
|
|
(FAR char *)cbarg[3], (int)cbarg[4]);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lwm2m_exec_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
lwm2mstub_exec_cb_t callback = (lwm2mstub_exec_cb_t)cb;
|
|
|
|
if (callback)
|
|
{
|
|
callback((int)cbarg[0], (int)cbarg[1],
|
|
(FAR struct lwm2mstub_instance_s *)cbarg[2]);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lwm2m_ovstart_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
lwm2mstub_ovstart_cb_t callback = (lwm2mstub_ovstart_cb_t)cb;
|
|
|
|
if (callback)
|
|
{
|
|
callback((int)cbarg[0], (int)cbarg[1],
|
|
(FAR struct lwm2mstub_instance_s *)cbarg[2],
|
|
(FAR char *)cbarg[3],
|
|
(FAR struct lwm2mstub_ovcondition_s *)cbarg[5]);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lwm2m_ovstop_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
lwm2mstub_ovstop_cb_t callback = (lwm2mstub_ovstop_cb_t)cb;
|
|
|
|
if (callback)
|
|
{
|
|
callback((int)cbarg[0], (int)cbarg[1],
|
|
(FAR struct lwm2mstub_instance_s *)cbarg[2],
|
|
(FAR char *)cbarg[3]);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lwm2m_operation_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
lwm2mstub_operation_cb_t callback = (lwm2mstub_operation_cb_t)cb;
|
|
|
|
if (callback)
|
|
{
|
|
callback((int)cbarg[0], (int)cbarg[1],
|
|
(FAR struct lwm2mstub_instance_s *)cbarg[2]);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
static uint64_t lwm2m_fwupdate_evt_cb(FAR void *cb, FAR void **cbarg,
|
|
FAR bool *set_writable)
|
|
{
|
|
lwm2mstub_fwupstate_cb_t callback = (lwm2mstub_fwupstate_cb_t)cb;
|
|
|
|
if (callback)
|
|
{
|
|
callback((int)cbarg[0]);
|
|
}
|
|
|
|
return 0ULL;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: evtbuffer_init
|
|
****************************************************************************/
|
|
|
|
static FAR struct alt_evtbuffer_s *evtbuffer_init(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < nitems(g_evtbuffers); i++)
|
|
{
|
|
nxmutex_init(&g_evtbuffers[i].stat_lock);
|
|
g_evtbuffers[i].stat = ALTEVTBUF_ST_WRITABLE;
|
|
}
|
|
|
|
g_evtbuff.ninst = nitems(g_evtbuffers);
|
|
g_evtbuff.inst = g_evtbuffers;
|
|
|
|
return &g_evtbuff;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: clear_callback
|
|
****************************************************************************/
|
|
|
|
static void clear_callback(uint32_t cmdid)
|
|
{
|
|
int i;
|
|
|
|
sem_wait(&g_cbtablelock);
|
|
|
|
for (i = 0; i < nitems(g_cbtable); i++)
|
|
{
|
|
if (g_cbtable[i].cmdid == cmdid)
|
|
{
|
|
g_cbtable[i].cmdid = 0;
|
|
g_cbtable[i].cb = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
sem_post(&g_cbtablelock);
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: errno2result
|
|
****************************************************************************/
|
|
|
|
static void errno2result(FAR int32_t *result_ptr)
|
|
{
|
|
if (result_ptr && *result_ptr < 0)
|
|
{
|
|
if (*result_ptr == -ECANCELED)
|
|
{
|
|
*result_ptr = LTE_RESULT_CANCEL;
|
|
}
|
|
else
|
|
{
|
|
*result_ptr = LTE_RESULT_ERROR;
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: exec_callback
|
|
****************************************************************************/
|
|
|
|
static uint64_t exec_callback(uint32_t cmdid,
|
|
CODE uint64_t (*func)(FAR void *cb,
|
|
FAR void **arg,
|
|
FAR bool *set_writable),
|
|
FAR void **arg, FAR bool *set_writable)
|
|
{
|
|
uint64_t evtbitmap = 0ULL;
|
|
FAR int32_t *result = NULL;
|
|
FAR void *callback = NULL;
|
|
|
|
callback = get_cbfunc(cmdid);
|
|
if (callback)
|
|
{
|
|
if (!IS_REPORT_API(cmdid))
|
|
{
|
|
/* APIs that have result as a callback argument
|
|
* change the value before execution.
|
|
*/
|
|
|
|
result = (int32_t *)arg[0];
|
|
errno2result(result);
|
|
}
|
|
|
|
evtbitmap = func(callback, arg, set_writable);
|
|
return evtbitmap;
|
|
}
|
|
|
|
/* When callback is not found,
|
|
* GETPSM and GETEDRX, REPNETINFO, REPSIMSTAT, REPLTIME will
|
|
* execute func() and update the evtbitmap
|
|
*/
|
|
|
|
if (cmdid == LTE_CMDID_GETPSM ||
|
|
cmdid == LTE_CMDID_GETEDRX ||
|
|
cmdid == LTE_CMDID_REPNETINFO ||
|
|
cmdid == LTE_CMDID_REPSIMSTAT ||
|
|
cmdid == LTE_CMDID_REPLTIME)
|
|
{
|
|
evtbitmap = func(NULL, arg, set_writable);
|
|
}
|
|
|
|
return evtbitmap;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: get_evtarg
|
|
****************************************************************************/
|
|
|
|
static FAR void **get_evtarg(int idx)
|
|
{
|
|
FAR alt_evtbuf_inst_t *inst = &g_evtbuffers[idx];
|
|
|
|
return inst->outparam;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: get_cmdid_byidx
|
|
****************************************************************************/
|
|
|
|
static uint32_t get_cmdid_byidx(int idx)
|
|
{
|
|
FAR alt_evtbuf_inst_t *inst = &g_evtbuffers[idx];
|
|
|
|
return inst->cmdid;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: update_evtarg_writable
|
|
****************************************************************************/
|
|
|
|
static void update_evtarg_writable(int idx)
|
|
{
|
|
FAR alt_evtbuf_inst_t *inst = &g_evtbuffers[idx];
|
|
|
|
nxmutex_lock(&inst->stat_lock);
|
|
|
|
inst->stat = ALTEVTBUF_ST_WRITABLE;
|
|
|
|
nxmutex_unlock(&inst->stat_lock);
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: update_evtarg_writableall
|
|
****************************************************************************/
|
|
|
|
static void update_evtarg_writableall(void)
|
|
{
|
|
int idx;
|
|
|
|
for (idx = 0; idx < nitems(g_evtbuffers); idx++)
|
|
{
|
|
FAR alt_evtbuf_inst_t *inst = &g_evtbuffers[idx];
|
|
|
|
nxmutex_lock(&inst->stat_lock);
|
|
|
|
inst->stat = ALTEVTBUF_ST_WRITABLE;
|
|
|
|
nxmutex_unlock(&inst->stat_lock);
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: get_execfunc
|
|
****************************************************************************/
|
|
|
|
static FAR void *get_execfunc(int idx)
|
|
{
|
|
int i;
|
|
uint32_t cmdid;
|
|
|
|
cmdid = get_cmdid_byidx(idx);
|
|
|
|
for (i = 0; i < nitems(g_execbtable); i++)
|
|
{
|
|
if (g_execbtable[i].cmdid == cmdid)
|
|
{
|
|
return g_execbtable[i].cb;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: get_cbfunc
|
|
****************************************************************************/
|
|
|
|
static FAR void *get_cbfunc(uint32_t cmdid)
|
|
{
|
|
int i;
|
|
FAR void *ret = NULL;
|
|
|
|
sem_wait(&g_cbtablelock);
|
|
|
|
for (i = 0; i < nitems(g_cbtable); i++)
|
|
{
|
|
if (g_cbtable[i].cmdid == cmdid)
|
|
{
|
|
ret = g_cbtable[i].cb;
|
|
break;
|
|
}
|
|
}
|
|
|
|
sem_post(&g_cbtablelock);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_search_execcb
|
|
****************************************************************************/
|
|
|
|
static uint64_t alt1250_search_execcb(uint64_t evtbitmap)
|
|
{
|
|
int idx;
|
|
uint64_t ret = 0ULL;
|
|
uint64_t l_evtbitmap = 0ULL;
|
|
CODE uint64_t (*func)(FAR void *cb, FAR void **arg,
|
|
FAR bool *set_writable);
|
|
bool set_writable;
|
|
|
|
for (idx = 0; idx < nitems(g_evtbuffers); idx++)
|
|
{
|
|
if (evtbitmap & (1ULL << idx))
|
|
{
|
|
dbg_alt1250("idx=%d\n", idx);
|
|
|
|
set_writable = false;
|
|
|
|
func = get_execfunc(idx);
|
|
l_evtbitmap = exec_callback(g_evtbuffers[idx].cmdid, func,
|
|
get_evtarg(idx), &set_writable);
|
|
|
|
ret |= l_evtbitmap;
|
|
|
|
if (l_evtbitmap == 0ULL)
|
|
{
|
|
if (LTE_ISCMDGRP_NORMAL(g_evtbuffers[idx].cmdid))
|
|
{
|
|
clear_callback(g_evtbuffers[idx].cmdid);
|
|
}
|
|
}
|
|
|
|
if (l_evtbitmap == 0ULL)
|
|
{
|
|
if (!set_writable)
|
|
{
|
|
update_evtarg_writable(idx);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
dbg_alt1250("evtbitmap=0x%llx\n", ret);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_evt_search
|
|
****************************************************************************/
|
|
|
|
static uint64_t alt1250_evt_search(uint32_t cmdid)
|
|
{
|
|
int idx;
|
|
|
|
uint64_t evtbitmap = 0ULL;
|
|
|
|
for (idx = 0; idx < nitems(g_evtbuffers); idx++)
|
|
{
|
|
if (g_evtbuffers[idx].cmdid == cmdid)
|
|
{
|
|
evtbitmap = (1ULL << idx);
|
|
}
|
|
}
|
|
|
|
return evtbitmap;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: reg_evtcb
|
|
****************************************************************************/
|
|
|
|
static int reg_evtcb(struct cbinfo_s *info, uint32_t cmdid, FAR void *cb)
|
|
{
|
|
if (info == NULL)
|
|
{
|
|
return ERROR;
|
|
}
|
|
|
|
info->cmdid = cmdid;
|
|
info->cb = cb;
|
|
|
|
return OK;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: search_evtcb
|
|
****************************************************************************/
|
|
|
|
static FAR struct cbinfo_s *search_evtcb(uint32_t cmdid)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < nitems(g_cbtable); i++)
|
|
{
|
|
if (g_cbtable[i].cmdid == cmdid)
|
|
{
|
|
return &g_cbtable[i];
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: register_evtcb
|
|
****************************************************************************/
|
|
|
|
static int register_evtcb(uint32_t cmdid, FAR void *cb)
|
|
{
|
|
if (search_evtcb(cmdid) == NULL)
|
|
{
|
|
if (reg_evtcb(search_free_evtcb(), cmdid, cb) == ERROR)
|
|
{
|
|
return -EBUSY;
|
|
}
|
|
|
|
return OK;
|
|
}
|
|
else
|
|
{
|
|
return IS_REPORT_API(cmdid) ? -EALREADY : -EINPROGRESS;
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: clear_evtcb
|
|
****************************************************************************/
|
|
|
|
static int clear_evtcb(uint32_t cmdid)
|
|
{
|
|
clr_evtcb(search_evtcb(cmdid));
|
|
return OK;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Public Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_setevtbuff
|
|
****************************************************************************/
|
|
|
|
FAR struct alt_evtbuffer_s *init_event_buffer(void)
|
|
{
|
|
sem_init(&g_cbtablelock, 0, 1);
|
|
return evtbuffer_init();
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_evtdatadestroy
|
|
****************************************************************************/
|
|
|
|
int alt1250_evtdatadestroy(void)
|
|
{
|
|
sem_destroy(&g_cbtablelock);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_regevtcb
|
|
****************************************************************************/
|
|
|
|
int alt1250_regevtcb(uint32_t cmdid, FAR void *cb)
|
|
{
|
|
int ret;
|
|
|
|
sem_wait(&g_cbtablelock);
|
|
|
|
if (cb == NULL)
|
|
{
|
|
ret = clear_evtcb(cmdid);
|
|
}
|
|
else
|
|
{
|
|
ret = register_evtcb(cmdid, cb);
|
|
}
|
|
|
|
sem_post(&g_cbtablelock);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_execcb
|
|
****************************************************************************/
|
|
|
|
void alt1250_execcb(uint64_t evtbitmap)
|
|
{
|
|
uint64_t l_evtbitmap = 0ULL;
|
|
|
|
if (evtbitmap & ALT1250_EVTBIT_RESET)
|
|
{
|
|
/* call LTE_CMDID_SETRESTART */
|
|
|
|
alt1250_search_execcb(alt1250_evt_search(LTE_CMDID_SETRESTART));
|
|
|
|
update_evtarg_writableall();
|
|
}
|
|
else
|
|
{
|
|
l_evtbitmap = alt1250_search_execcb(evtbitmap);
|
|
|
|
if (l_evtbitmap != 0ULL)
|
|
{
|
|
alt1250_search_execcb(l_evtbitmap);
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_getevtarg
|
|
****************************************************************************/
|
|
|
|
FAR void **alt1250_getevtarg(uint32_t cmdid)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < nitems(g_evtbuffers); i++)
|
|
{
|
|
if (g_evtbuffers[i].cmdid == cmdid)
|
|
{
|
|
return g_evtbuffers[i].outparam;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_checkcmdid
|
|
****************************************************************************/
|
|
|
|
bool alt1250_checkcmdid(uint32_t cmdid, uint64_t evtbitmap,
|
|
FAR uint64_t *bit)
|
|
{
|
|
int idx;
|
|
bool ret = false;
|
|
|
|
for (idx = 0; idx < nitems(g_evtbuffers); idx++)
|
|
{
|
|
if (evtbitmap & (1ULL << idx))
|
|
{
|
|
dbg_alt1250("idx=%d\n", idx);
|
|
|
|
if (g_evtbuffers[idx].cmdid == cmdid)
|
|
{
|
|
ret = true;
|
|
*bit = 1ULL << idx;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_setevtarg_writable
|
|
****************************************************************************/
|
|
|
|
void alt1250_setevtarg_writable(uint32_t cmdid)
|
|
{
|
|
int idx;
|
|
FAR alt_evtbuf_inst_t *inst = NULL;
|
|
|
|
for (idx = 0; idx < nitems(g_evtbuffers); idx++)
|
|
{
|
|
if (g_evtbuffers[idx].cmdid == cmdid)
|
|
{
|
|
inst = &g_evtbuffers[idx];
|
|
|
|
nxmutex_lock(&inst->stat_lock);
|
|
|
|
inst->stat = ALTEVTBUF_ST_WRITABLE;
|
|
|
|
nxmutex_unlock(&inst->stat_lock);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: alt1250_clrevtcb
|
|
****************************************************************************/
|
|
|
|
int alt1250_clrevtcb(uint8_t mode)
|
|
{
|
|
int ret = OK;
|
|
int i;
|
|
|
|
sem_wait(&g_cbtablelock);
|
|
|
|
if (mode == ALT1250_CLRMODE_WO_RESTART)
|
|
{
|
|
for (i = 0; i < nitems(g_cbtable); i++)
|
|
{
|
|
if (g_cbtable[i].cmdid != LTE_CMDID_SETRESTART)
|
|
{
|
|
g_cbtable[i].cb = NULL;
|
|
g_cbtable[i].cmdid = 0;
|
|
}
|
|
}
|
|
}
|
|
else if (mode == ALT1250_CLRMODE_ALL)
|
|
{
|
|
memset(g_cbtable, 0, sizeof(struct cbinfo_s) * NCBTABLES);
|
|
}
|
|
else
|
|
{
|
|
ret = -EINVAL;
|
|
}
|
|
|
|
sem_post(&g_cbtablelock);
|
|
|
|
return ret;
|
|
}
|
|
|
|
#ifdef CONFIG_LTE_ALT1250_LAUNCH_EVENT_TASK
|
|
static int internal_evttask(int argc, FAR char *argv[])
|
|
{
|
|
int ret;
|
|
bool is_running = true;
|
|
|
|
ret = lapi_evtinit(LAPIEVT_QNAME);
|
|
if (ret < 0)
|
|
{
|
|
dbg_alt1250("lapi_evtinit() failed: %d\n", ret);
|
|
goto errout;
|
|
}
|
|
|
|
while (is_running)
|
|
{
|
|
ret = lapi_evtyield(-1);
|
|
if (ret == 0)
|
|
{
|
|
dbg_alt1250("lapi_evtyield() finish normaly\n");
|
|
is_running = false;
|
|
}
|
|
else if (ret < 0)
|
|
{
|
|
dbg_alt1250("lapi_evtyield() failed: %d\n", ret);
|
|
}
|
|
}
|
|
|
|
errout:
|
|
lapi_evtdestoy();
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
static int evt_qsend(FAR mqd_t *mqd, uint64_t evtbitmap)
|
|
{
|
|
int ret = ERROR;
|
|
|
|
if (*mqd != (mqd_t)-1)
|
|
{
|
|
ret = mq_send(*mqd, (FAR const char *)&evtbitmap, sizeof(evtbitmap),
|
|
0);
|
|
if (ret < 0)
|
|
{
|
|
ret = -errno;
|
|
dbg_alt1250("failed to send mq: %d\n", errno);
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int alt1250_evttask_sendmsg(FAR struct alt1250_s *dev, uint64_t msg)
|
|
{
|
|
return evt_qsend(&dev->evtq, msg);
|
|
}
|
|
|
|
int alt1250_evttask_start(void)
|
|
{
|
|
#ifdef CONFIG_LTE_ALT1250_LAUNCH_EVENT_TASK
|
|
g_cbpid = task_create(EVTTASK_NAME, CONFIG_LTE_ALT1250_EVENT_TASK_PRIORITY,
|
|
CONFIG_LTE_ALT1250_EVENT_TASK_STACKSIZE,
|
|
internal_evttask, NULL);
|
|
return g_cbpid;
|
|
#else
|
|
return 1; /* Always success */
|
|
#endif
|
|
}
|
|
|
|
void alt1250_evttask_stop(FAR struct alt1250_s *dev)
|
|
{
|
|
if (alt1250_evttask_sendmsg(dev, 0ULL) == OK)
|
|
{
|
|
#ifdef CONFIG_LTE_ALT1250_LAUNCH_EVENT_TASK
|
|
int stat;
|
|
|
|
waitpid(g_cbpid, &stat, WEXITED);
|
|
#endif
|
|
}
|
|
|
|
alt1250_evttask_msgclose(dev);
|
|
}
|
|
|
|
void alt1250_evttask_msgclose(FAR struct alt1250_s *dev)
|
|
{
|
|
if (dev->evtq != (mqd_t)-1)
|
|
{
|
|
/* FIXME: In case of the event callback task is not launched yet,
|
|
* this message may be dropped.
|
|
* Now, above behavior is not rescued..
|
|
*/
|
|
|
|
mq_close(dev->evtq);
|
|
mq_unlink(LAPIEVT_QNAME);
|
|
}
|
|
}
|
|
|
|
int alt1250_evttask_msgconnect(FAR const char *qname,
|
|
FAR struct alt1250_s *dev)
|
|
{
|
|
int ret = OK;
|
|
|
|
alt1250_evttask_msgclose(dev);
|
|
|
|
dev->evtq = mq_open(qname, O_WRONLY);
|
|
if (dev->evtq == (mqd_t)-1)
|
|
{
|
|
ret = -errno;
|
|
dbg_alt1250("failed to open mq(%s): %d\n", qname, errno);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t alt1250_search_registered_callback(FAR int *index)
|
|
{
|
|
uint32_t ret = 0x00;
|
|
int i;
|
|
|
|
for (i = *index; i < NCBTABLES; i++)
|
|
{
|
|
if (g_cbtable[i].cb != NULL && IS_LTE_REPORT_EVENT(g_cbtable[i].cmdid))
|
|
{
|
|
ret = g_cbtable[i].cmdid;
|
|
*index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int alt1250_get_report_ltecmd(FAR struct alt1250_s *dev, uint32_t cmdid,
|
|
FAR struct lte_ioctl_data_s *ltecmd)
|
|
{
|
|
int ret = OK;
|
|
static int result;
|
|
static int32_t param;
|
|
static FAR void *inparam[2];
|
|
static FAR void *outparam[1];
|
|
|
|
/* Generate ltecmd:
|
|
* cmdid : LAPI command ID
|
|
* inparam : Array of input arguments
|
|
* (First argument is callback pointer.)
|
|
* inparamlen : Size of inparam array
|
|
* outparam : Array of output arguments
|
|
* (The result parameter only.)
|
|
* outparamlen: Size of outparam array
|
|
*/
|
|
|
|
ltecmd->cmdid = cmdid;
|
|
ltecmd->inparam = inparam;
|
|
ltecmd->outparam = outparam;
|
|
ltecmd->outparamlen = 1;
|
|
|
|
inparam[0] = get_cbfunc(cmdid);
|
|
outparam[0] = (FAR void *)&result;
|
|
|
|
switch (cmdid)
|
|
{
|
|
case LTE_CMDID_REPNETINFO:
|
|
ltecmd->inparamlen = 1;
|
|
break;
|
|
case LTE_CMDID_REPSIMSTAT:
|
|
param = cmdid;
|
|
inparam[1] = (FAR void *)¶m;
|
|
ltecmd->inparamlen = 2;
|
|
break;
|
|
case LTE_CMDID_REPLTIME:
|
|
param = cmdid;
|
|
inparam[1] = (FAR void *)¶m;
|
|
ltecmd->inparamlen = 2;
|
|
break;
|
|
case LTE_CMDID_REPQUAL:
|
|
param = dev->quality_report_period;
|
|
inparam[1] = (FAR void *)¶m;
|
|
ltecmd->inparamlen = 2;
|
|
break;
|
|
case LTE_CMDID_REPCELL:
|
|
param = dev->cellinfo_report_period;
|
|
inparam[1] = (FAR void *)¶m;
|
|
ltecmd->inparamlen = 2;
|
|
break;
|
|
default:
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|