incubator-nuttx/include/nuttx/modem/alt1250.h

402 lines
14 KiB
C

/****************************************************************************
* include/nuttx/modem/alt1250.h
*
* 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.
*
****************************************************************************/
#ifndef __INCLUDE_NUTTX_MODEM_ALT1250_H
#define __INCLUDE_NUTTX_MODEM_ALT1250_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/spi/spi.h>
#include <nuttx/queue.h>
#include <nuttx/mutex.h>
#include <semaphore.h>
#include <debug.h>
#include <nuttx/irq.h>
#include <pthread.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Debug ********************************************************************/
/* Non-standard debug that may be enabled just for testing the modem driver */
#ifdef CONFIG_MODEM_ALT1250_DEBUG
# define m_err _err
# define m_warn _warn
# define m_info _info
#else
# define m_err(...)
# define m_warn(...)
# define m_info(...)
#endif
#define ALT1250_IOC_POWER _MODEMIOC(1)
#define ALT1250_IOC_SEND _MODEMIOC(2)
#define ALT1250_IOC_SETEVTBUFF _MODEMIOC(3)
#define ALT1250_IOC_EXCHGCONTAINER _MODEMIOC(4)
#define ALT1250_EVTBIT_RESET (1ULL << 63)
#define ALT1250_EVTBIT_REPLY (1ULL << 62)
#define ALT1250_EVTBIT_STOPAPI (1ULL << 61)
#define ALT1250_EVTBIT_SUSPEND (1ULL << 60)
/* Number of sockets */
#define ALTCOM_NSOCKET 10
/* Macros for fcntl */
#define ALTCOM_GETFL 3
#define ALTCOM_SETFL 4
#define ALTCOM_O_NONBLOCK 0x01
#define ALTCOM_FD_SETSIZE ALTCOM_NSOCKET
#define ALTCOM_FDSETSAFESET(s, code) \
do { \
if (((s) < ALTCOM_FD_SETSIZE) && ((int)(s) >= 0)) \
{ \
code; \
} \
} while(0)
#define ALTCOM_FDSETSAFEGET(s, code) \
(((s) < ALTCOM_FD_SETSIZE) && ((int)(s) >= 0) ? (code) : 0)
#define ALTCOM_FD_SET(s, set) ALTCOM_FDSETSAFESET(s, (set)->fd_bits[(s)/8] |= (1 << ((s) & 7)))
#define ALTCOM_FD_CLR(s, set) ALTCOM_FDSETSAFESET(s, (set)->fd_bits[(s)/8] &= ~(1 << ((s) & 7)))
#define ALTCOM_FD_ISSET(s, set) ALTCOM_FDSETSAFEGET(s, (set)->fd_bits[(s)/8] & (1 << ((s) & 7)))
#define ALTCOM_FD_ZERO(set) memset((void*)(set), 0, sizeof(*(set)))
#define ALTCOM_DNS_SERVERS (4)
#define ALTCOM_REPEVT_FLAG_SIMSTAT (1 << 0)
#define ALTCOM_REPEVT_FLAG_LTIME (1 << 1)
#define ALTCOM_VERX (0)
#define ALTCOM_VER1 (1)
#define ALTCOM_VER4 (4)
#define APICMDID_UNKNOWN (0x0000)
#define APICMDID_POWER_ON (0x0001)
#define ALTCOM_CMDID_POWER_ON_V1 (0x0001)
#define ALTCOM_CMDID_POWER_ON_V4 (0x0311)
#define APICMDID_GET_VERSION (0x000C)
#define APICMDID_GET_PHONENO (0x000D)
#define APICMDID_GET_IMSI (0x000E)
#define APICMDID_GET_IMEI (0x000F)
#define APICMDID_GET_PINSET (0x0010)
#define APICMDID_SET_PIN_LOCK (0x0011)
#define APICMDID_SET_PIN_CODE (0x0012)
#define APICMDID_ENTER_PIN (0x0013)
#define APICMDID_GET_LTIME (0x0014)
#define APICMDID_GET_OPERATOR (0x0015)
#define APICMDID_SET_REP_EVT (0x0019)
#define APICMDID_SET_REP_QUALITY (0x001A)
#define APICMDID_SET_REP_CELLINFO (0x001B)
#define APICMDID_REPORT_EVT (0x001D)
#define APICMDID_REPORT_QUALITY (0x001E)
#define APICMDID_REPORT_CELLINFO (0x001F)
#define APICMDID_GET_EDRX (0x0020)
#define APICMDID_SET_EDRX (0x0021)
#define APICMDID_GET_PSM (0x0022)
#define APICMDID_SET_PSM (0x0023)
#define APICMDID_GET_CE (0x0024)
#define APICMDID_SET_CE (0x0025)
#define APICMDID_RADIO_ON (0x0026)
#define APICMDID_RADIO_OFF (0x0027)
#define APICMDID_ACTIVATE_PDN (0x0028)
#define APICMDID_DEACTIVATE_PDN (0x0029)
#define APICMDID_DATA_ALLOW (0x002A)
#define APICMDID_GET_NETINFO (0x002B)
#define APICMDID_GET_IMS_CAP (0x002C)
#define APICMDID_SETREP_NETINFO (0x002D)
#define APICMDID_REPORT_NETINFO (0x002E)
#define APICMDID_REPORT_RESTART (0x002F)
#define APICMDID_ERRINFO (0x0030)
#define APICMDID_SET_REP_EVT_LTIME (0x0031)
#define APICMDID_SET_REP_EVT_SIMSTATE (0x0032)
#define APICMDID_POWER_OFF (0x0033)
#define APICMDID_GET_SIMINFO (0x0034)
#define APICMDID_GET_DYNAMICEDRX (0x0035)
#define APICMDID_GET_DYNAMICPSM (0x0036)
#define APICMDID_GET_QUALITY (0x0037)
#define APICMDID_ACTIVATE_PDN_CANCEL (0x0038)
#define APICMDID_FW_INJECTDELTAIMG (0x1040)
#define APICMDID_FW_GETDELTAIMGLEN (0x1041)
#define APICMDID_FW_EXECDELTAUPDATE (0x1042)
#define APICMDID_FW_GETUPDATERESULT (0x1043)
#define APICMDID_CLOGS (0x1023)
#define APICMDID_LOGLIST (0x1024)
#define APICMDID_LOGOPEN (0x1030)
#define APICMDID_LOGCLOSE (0x1031)
#define APICMDID_LOGREAD (0x1033)
#define APICMDID_LOGREMOVE (0x1034)
#define APICMDID_LOGLSEEK (0x1035)
/* dummy ID because not support V1 */
#define APICMDID_GET_CELLINFO (0x0039)
#define APICMDID_GET_RAT (0x00A0)
#define APICMDID_SET_RAT (0x00A1)
#define APICMDID_SEND_ATCMD (0x00B0)
#define APICMDID_URC_EVENT (0x00B2)
#define APICMDID_GET_VERSION_V4 (0x000B)
#define APICMDID_GET_PHONENO_V4 (0x000C)
#define APICMDID_GET_IMSI_V4 (0x000D)
#define APICMDID_GET_IMEI_V4 (0x000E)
#define APICMDID_GET_PINSET_V4 (0x000F)
#define APICMDID_SET_PIN_LOCK_V4 (0x0010)
#define APICMDID_SET_PIN_CODE_V4 (0x0011)
#define APICMDID_ENTER_PIN_V4 (0x0012)
#define APICMDID_GET_LTIME_V4 (0x0013)
#define APICMDID_GET_OPERATOR_V4 (0x0014)
#define APICMDID_GET_SLPMODESET_V4 (0x0015)
#define APICMDID_SET_SLPMODESET_V4 (0x0016)
#define APICMDID_SET_REP_NETSTAT_V4 (0x0017)
#define APICMDID_SET_REP_EVT_V4 (0x0018)
#define APICMDID_SET_REP_QUALITY_V4 (0x0019)
#define APICMDID_SET_REP_CELLINFO_V4 (0x001A)
#define APICMDID_REPORT_NETSTAT_V4 (0x001B)
#define APICMDID_REPORT_EVT_V4 (0x001C)
#define APICMDID_REPORT_QUALITY_V4 (0x001D)
#define APICMDID_REPORT_CELLINFO_V4 (0x001E)
#define APICMDID_GET_EDRX_V4 (0x001F)
#define APICMDID_SET_EDRX_V4 (0x0020)
#define APICMDID_GET_PSM_V4 (0x0021)
#define APICMDID_SET_PSM_V4 (0x0022)
#define APICMDID_GET_CELLINFO_V4 (0x0024)
#define APICMDID_GET_QUALITY_V4 (0x0025)
#define APICMDID_GET_SIMINFO_V4 (0x0310)
#define APICMDID_POWER_ON_V4 (0x0311)
#define APICMDID_RADIO_ON_V4 (0x0312)
#define APICMDID_RADIO_OFF_V4 (0x0313)
#define APICMDID_ACTIVATE_PDN_V4 (0x0314)
#define APICMDID_ACTIVATE_PDN_CANCEL_V4 (0x0315)
#define APICMDID_DEACTIVATE_PDN_V4 (0x0316)
#define APICMDID_DATA_ALLOW_V4 (0x0317)
#define APICMDID_GET_NETINFO_V4 (0x0318)
#define APICMDID_GET_IMS_CAP_V4 (0x0319)
#define APICMDID_SETREP_NETINFO_V4 (0x031A)
#define APICMDID_REPORT_NETINFO_V4 (0x031B)
#define APICMDID_ERRINFO_V4 (0xFFFD)
#define APICMDID_GET_RAT_V4 (0x00A0)
#define APICMDID_SET_RAT_V4 (0x00A1)
#define APICMDID_SEND_ATCMD_V4 (0x0030)
#define APICMDID_URC_EVENT_V4 (0x0032)
#define APICMDID_FW_INJECTDELTAIMG_V4 (0x0270)
#define APICMDID_FW_GETDELTAIMGLEN_V4 (0x0271)
#define APICMDID_FW_EXECDELTAUPDATE_V4 (0x0272)
#define APICMDID_FW_GETUPDATERESULT_V4 (0x0273)
#define APICMDID_CLOGS_V4 (0x0300)
#define APICMDID_LOGLIST_V4 (0x0301)
#define APICMDID_LOGOPEN_V4 (0x0280)
#define APICMDID_LOGCLOSE_V4 (0x0281)
#define APICMDID_LOGREAD_V4 (0x0283)
#define APICMDID_LOGREMOVE_V4 (0x0284)
#define APICMDID_LOGLSEEK_V4 (0x0285)
#define APICMDID_SOCK_ACCEPT (0x0080)
#define APICMDID_SOCK_BIND (0x0081)
#define APICMDID_SOCK_CLOSE (0x0082)
#define APICMDID_SOCK_CONNECT (0x0083)
#define APICMDID_SOCK_FCNTL (0x0084)
#define APICMDID_SOCK_GETADDRINFO (0x0085)
#define APICMDID_SOCK_GETHOSTBYNAME (0x0086)
#define APICMDID_SOCK_GETHOSTBYNAMER (0x0087)
#define APICMDID_SOCK_GETSOCKNAME (0x0088)
#define APICMDID_SOCK_GETSOCKOPT (0x0089)
#define APICMDID_SOCK_LISTEN (0x008A)
#define APICMDID_SOCK_RECV (0x008B)
#define APICMDID_SOCK_RECVFROM (0x008C)
#define APICMDID_SOCK_SELECT (0x008D)
#define APICMDID_SOCK_SEND (0x008E)
#define APICMDID_SOCK_SENDTO (0x008F)
#define APICMDID_SOCK_SHUTDOWN (0x0090)
#define APICMDID_SOCK_SOCKET (0x0091)
#define APICMDID_SOCK_SETSOCKOPT (0x0092)
#define APICMDID_TLS_CONFIG_VERIFY_CALLBACK (0x0129)
#define APICMDID_TLS_CONFIG_VERIFY_CALLBACK_V4 (0x0161)
#define APICMDID_SMS_INIT (0x0330)
#define APICMDID_SMS_FIN (0x0331)
#define APICMDID_SMS_SEND (0x0332)
#define APICMDID_SMS_REPORT_RECV (0x0333)
#define APICMDID_SMS_DELETE (0x0334)
#define ALTCOM_CMDID_ERRIND (0xFFFF)
#define ALTCOM_CMDID_REPLY_BIT (0x8000)
/****************************************************************************
* Public Types
****************************************************************************/
struct alt_power_s
{
uint32_t cmdid;
int resp;
};
typedef struct alt_container_s
{
sq_entry_t node;
int sock;
unsigned long priv;
uint32_t cmdid;
uint16_t altcid;
uint16_t alttid;
int result;
FAR void **inparam;
size_t inparamlen;
FAR void **outparam;
size_t outparamlen;
} alt_container_t;
typedef enum alt_evtbuf_state_e
{
ALTEVTBUF_ST_WRITABLE = 0,
ALTEVTBUF_ST_NOTWRITABLE = 1,
} alt_evtbuf_state_t;
typedef struct alt_evtbuf_inst_s
{
uint32_t cmdid;
uint16_t altcid;
FAR void **outparam;
size_t outparamlen;
mutex_t stat_lock;
alt_evtbuf_state_t stat;
} alt_evtbuf_inst_t;
struct alt_evtbuffer_s
{
unsigned int ninst;
alt_evtbuf_inst_t *inst;
};
struct alt_readdata_s
{
uint64_t evtbitmap;
FAR struct alt_container_s *head;
};
struct alt1250_lower_s
{
FAR struct spi_dev_s * (*poweron)(bool keep_on);
void (*poweroff)(void);
bool (*powerstatus)(void);
int (*hiber_mode)(bool);
void (*reset)(void);
void (*irqattach)(xcpt_t handler);
void (*irqenable)(bool enable);
bool (*get_sready)(void);
void (*set_mready)(bool on);
void (*set_wakeup)(bool on);
};
struct altcom_fd_set_s
{
unsigned char fd_bits[(ALTCOM_FD_SETSIZE + 7) / 8];
};
typedef struct altcom_fd_set_s altcom_fd_set;
struct alt_queue_s
{
sq_queue_t queue;
mutex_t lock;
};
struct alt1250_dev_s
{
FAR struct spi_dev_s *spi;
FAR const struct alt1250_lower_s *lower;
mutex_t refslock;
uint8_t crefs;
struct alt_queue_s waitlist;
struct alt_queue_s replylist;
uint64_t evtbitmap;
mutex_t evtmaplock;
mutex_t pfdlock;
FAR struct pollfd *pfd;
int rxthread_pid;
sem_t rxthread_sem;
FAR struct alt_evtbuffer_s *evtbuff;
uint32_t discardcnt;
mutex_t senddisablelock;
bool senddisable;
FAR alt_container_t *select_container;
struct alt_evtbuf_inst_s select_inst;
};
typedef int32_t (*compose_handler_t)(FAR void **arg, size_t arglen,
uint8_t altver, FAR uint8_t *pktbuf, const size_t pktsz,
FAR uint16_t *altcid);
typedef int32_t (*parse_handler_t)(FAR struct alt1250_dev_s *dev,
FAR uint8_t *pktbuf, size_t pktsz, uint8_t altver, FAR void **arg,
size_t arglen, FAR uint64_t *bitmap);
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Name: alt1250_register
*
* Description:
* Register the ALT1250 character device as 'devpath'.
*
* Input Parameters:
* devpath - The full path to the driver to register. E.g., "/dev/alt1250".
* dev - An instance of the SPI interface to use to communicate with
* ALT1250.
* lower - An instance of the lower interface.
*
* Returned Value:
* Not NULL on success; NULL on failure.
*
****************************************************************************/
FAR void *alt1250_register(FAR const char *devpath,
FAR struct spi_dev_s *dev, FAR const struct alt1250_lower_s *lower);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __INCLUDE_NUTTX_MODEM_ALT1250_H */