471 lines
14 KiB
C
471 lines
14 KiB
C
/******************************************************************************
|
|
|
|
*(C) Copyright 2018 EIGENCOMM International Ltd.
|
|
|
|
* All Rights Reserved
|
|
|
|
******************************************************************************
|
|
* Filename: ccio_base.h
|
|
*
|
|
* Description:
|
|
*
|
|
* History: 2021/1/19 created by xuwang
|
|
*
|
|
* Notes: basic elements of Channel Centre for Input/Output(CCIO) service
|
|
*
|
|
******************************************************************************/
|
|
#ifndef CCIO_BASE_H
|
|
#define CCIO_BASE_H
|
|
|
|
/*----------------------------------------------------------------------------*
|
|
* INCLUDES *
|
|
*----------------------------------------------------------------------------*/
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include DEBUG_LOG_HEADER_FILE
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/*----------------------------------------------------------------------------*
|
|
* MACROS *
|
|
*----------------------------------------------------------------------------*/
|
|
/* undefined value */
|
|
#define CCIO_VAL_UINT8_UNDEF (0xff)
|
|
#define CCIO_VAL_UINT16_UNDEF (0xffff)
|
|
#define CCIO_VAL_UINT32_UNDEF (0xffffffff)
|
|
|
|
/* buffer size */
|
|
#define CCIO_BUF_SIZE_8 (8)
|
|
#define CCIO_BUF_SIZE_16 (16)
|
|
#define CCIO_BUF_SIZE_32 (32)
|
|
#define CCIO_BUF_SIZE_64 (64)
|
|
#define CCIO_BUF_SIZE_128 (128)
|
|
#define CCIO_BUF_SIZE_256 (256)
|
|
#define CCIO_BUF_SIZE_512 (512)
|
|
#define CCIO_BUF_SIZE_1K (1024)
|
|
#define CCIO_BUF_SIZE_2K (2048)
|
|
#define CCIO_BUF_SIZE_4K (4096)
|
|
#define CCIO_BUF_SIZE_1_28K (1280)
|
|
#define CCIO_BUF_SIZE_8K (CCIO_BUF_SIZE_4K << 1)
|
|
#define CCIO_BUF_SIZE_16K (CCIO_BUF_SIZE_4K << 2)
|
|
#define CCIO_BUF_SIZE_32K (CCIO_BUF_SIZE_4K << 3)
|
|
|
|
/* alignment size */
|
|
#define CCIO_ALIGN_SIZE_1 (1 << 0)
|
|
#define CCIO_ALIGN_SIZE_2 (1 << 1)
|
|
#define CCIO_ALIGN_SIZE_4 (1 << 2)
|
|
#define CCIO_ALIGN_SIZE_8 (1 << 3)
|
|
|
|
#define CCIO_INFINITE_CYCLE_CNT CCIO_VAL_UINT16_UNDEF
|
|
/* mac addr length */
|
|
#define CCIO_MAC_ADDR_MAXSIZE 6
|
|
/* ipv4 addr length */
|
|
#define CCIO_IP4_ADDR_MAXSIZE 4
|
|
/* ipv6 addr length */
|
|
#define CCIO_IP6_ADDR_MAXSIZE 16
|
|
/* ipv6 interface id length */
|
|
#define CCIO_IP6_ID_MAXSIZE 8
|
|
|
|
/* 5bits */
|
|
#define CCIO_CHAN_MAXNUM 48
|
|
#define CCIO_CHAN_USB_MAXNUM 6
|
|
#define CCIO_CHAN_UART_MAXNUM 4
|
|
#define CCIO_CHAN_SPI_MAXNUM 2
|
|
#define CCIO_CHAN_I2S_MAXNUM 2
|
|
#define CCIO_CHAN_I2C_MAXNUM 2
|
|
#define CCIO_CHAN_VIRT_MAXNUM 8
|
|
#define CCIO_CHAN_RADIO_MAXNUM 16
|
|
|
|
/* lan channel: usb/uart/spi */
|
|
#define CCIO_CHAN_LAN_MAXNUM (CCIO_CHAN_USB_MAXNUM + CCIO_CHAN_UART_MAXNUM + CCIO_CHAN_SPI_MAXNUM)
|
|
/* wan channel: radio(pdp) */
|
|
#define CCIO_CHAN_WAN_MAXNUM (CCIO_CHAN_RADIO_MAXNUM)
|
|
|
|
#define CCIO_CHAN_ID_ANY CCIO_CHAN_ID_UNDEF
|
|
#define CCIO_CHAN_ID_UNDEF CCIO_DEV_ID_UNDEF
|
|
#define CCIO_CHAN_NO_GET(chanId) CCIO_DEV_NO_GET(chanId)
|
|
|
|
/* chanId & devId has the same definition,
|
|
* and the FORMAT is described as FOLLOWS.
|
|
* ******************************************************
|
|
*
|
|
* 31 26 22 18 14 8 0
|
|
* |--- rsvd---+-ht-+-dt-+-st-+--llsn--+-----No.-----|
|
|
* |=====+=====+====+====+====+========+=============|
|
|
* | Channel/Device ID |
|
|
* |=====+=====+====+====+====+========+=============|
|
|
*
|
|
*/
|
|
#define CCIO_DEV_NO_MAX(base, cnt) ((base) + ((cnt) - 1))
|
|
|
|
/* USB: 0-5 */
|
|
#define CCIO_DEV_NO_BASE_USB 0
|
|
#define CCIO_DEV_NO_MAX_USB CCIO_DEV_NO_MAX(CCIO_DEV_NO_BASE_USB, CCIO_CHAN_USB_MAXNUM)
|
|
/* UART: 6-9 */
|
|
#define CCIO_DEV_NO_BASE_UART (CCIO_DEV_NO_MAX_USB + 1)
|
|
#define CCIO_DEV_NO_MAX_UART CCIO_DEV_NO_MAX(CCIO_DEV_NO_BASE_UART, CCIO_CHAN_UART_MAXNUM)
|
|
/* SPI: 10-11 */
|
|
#define CCIO_DEV_NO_BASE_SPI (CCIO_DEV_NO_MAX_UART + 1)
|
|
#define CCIO_DEV_NO_MAX_SPI CCIO_DEV_NO_MAX(CCIO_DEV_NO_BASE_SPI, CCIO_CHAN_SPI_MAXNUM)
|
|
/* I2S: 12-13 */
|
|
#define CCIO_DEV_NO_BASE_I2S (CCIO_DEV_NO_MAX_SPI + 1)
|
|
#define CCIO_DEV_NO_MAX_I2S CCIO_DEV_NO_MAX(CCIO_DEV_NO_BASE_I2S, CCIO_CHAN_I2S_MAXNUM)
|
|
|
|
/*
|
|
* * 14~23 is reserved for other hw type, such as i2c, sdio...
|
|
*/
|
|
|
|
/* VIRTUAL: 24-31 */
|
|
#define CCIO_DEV_NO_BASE_VIRT 24
|
|
#define CCIO_DEV_NO_MAX_VIRT CCIO_DEV_NO_MAX(CCIO_DEV_NO_BASE_VIRT, CCIO_CHAN_VIRT_MAXNUM)
|
|
|
|
/* stricted by 'pendTccm', thus, lan maxDevNo = 31 */
|
|
|
|
/* RADIO: 32-47 */
|
|
#define CCIO_DEV_NO_BASE_RADIO 32
|
|
#define CCIO_DEV_NO_MAX_RADIO CCIO_DEV_NO_MAX(CCIO_DEV_NO_BASE_RADIO, CCIO_CHAN_RADIO_MAXNUM)
|
|
|
|
/* RSVD for future: 48-255 */
|
|
|
|
|
|
#define CCIO_DEV_ID_BIT_MAXNUM 32
|
|
#define CCIO_DEV_NO_BIT_MAXNUM 8 /* bit0 ~ 7 */
|
|
#define CCIO_DEV_LLSN_BIT_MAXNUM 6 /* bit8 ~13 */
|
|
#define CCIO_DEV_SUBTYPE_BIT_MAXNUM 4 /* bit14~17 */
|
|
#define CCIO_DEV_TYPE_BIT_MAXNUM 4 /* bit18~21 */
|
|
#define CCIO_DEV_HWTYPE_BIT_MAXNUM 4 /* bit22~25 */
|
|
#define CCIO_DEV_RSVD_BIT_MAXNUM 6 /* bit26~31 */
|
|
|
|
#define CCIO_DEV_NO_BIT_BEGIN 0
|
|
#define CCIO_DEV_LLSN_BIT_BEGIN 8
|
|
#define CCIO_DEV_SUBTYPE_BIT_BEGIN 14
|
|
#define CCIO_DEV_TYPE_BIT_BEGIN 18
|
|
#define CCIO_DEV_HWTYPE_BIT_BEGIN 22
|
|
|
|
#define CCIO_DEV_ID_UNDEF CCIO_VAL_UINT32_UNDEF
|
|
|
|
#define CCIO_DEV_ID_MASK CCIO_BITMASK(CCIO_DEV_ID_BIT_MAXNUM,0)
|
|
#define CCIO_DEV_NO_MASK CCIO_BITMASK(CCIO_DEV_NO_BIT_MAXNUM,CCIO_DEV_NO_BIT_BEGIN)
|
|
#define CCIO_DEV_LLSN_MASK CCIO_BITMASK(CCIO_DEV_LLSN_BIT_MAXNUM,CCIO_DEV_LLSN_BIT_BEGIN)
|
|
#define CCIO_DEV_SUBTYPE_MASK CCIO_BITMASK(CCIO_DEV_SUBTYPE_BIT_MAXNUM,CCIO_DEV_SUBTYPE_BIT_BEGIN)
|
|
#define CCIO_DEV_TYPE_MASK CCIO_BITMASK(CCIO_DEV_TYPE_BIT_MAXNUM,CCIO_DEV_TYPE_BIT_BEGIN)
|
|
#define CCIO_DEV_HWTYPE_MASK CCIO_BITMASK(CCIO_DEV_HWTYPE_BIT_MAXNUM,CCIO_DEV_HWTYPE_BIT_BEGIN)
|
|
|
|
#define CCIO_DEV_NO_GET(id) ( (id) & CCIO_DEV_NO_MASK)
|
|
#define CCIO_DEV_LLSN_GET(id) (((id) & CCIO_DEV_LLSN_MASK) >> CCIO_DEV_LLSN_BIT_BEGIN)
|
|
#define CCIO_DEV_SUBTYPE_GET(id) (((id) & CCIO_DEV_SUBTYPE_MASK) >> CCIO_DEV_SUBTYPE_BIT_BEGIN)
|
|
#define CCIO_DEV_TYPE_GET(id) (((id) & CCIO_DEV_TYPE_MASK) >> CCIO_DEV_TYPE_BIT_BEGIN)
|
|
#define CCIO_DEV_HWTYPE_GET(id) (((id) & CCIO_DEV_HWTYPE_MASK) >> CCIO_DEV_HWTYPE_BIT_BEGIN)
|
|
|
|
#define CCIO_DEV_ID_SET(ht,dt,st,llsn,no) ((((ht) << CCIO_DEV_HWTYPE_BIT_BEGIN) & CCIO_DEV_HWTYPE_MASK) | \
|
|
(((dt) << CCIO_DEV_TYPE_BIT_BEGIN) & CCIO_DEV_TYPE_MASK) | \
|
|
(((st) << CCIO_DEV_SUBTYPE_BIT_BEGIN) & CCIO_DEV_SUBTYPE_MASK) | \
|
|
(((llsn) << CCIO_DEV_LLSN_BIT_BEGIN) & CCIO_DEV_LLSN_MASK) | \
|
|
(((no) << CCIO_DEV_NO_BIT_BEGIN) & CCIO_DEV_NO_MASK))
|
|
|
|
#define CCIO_BITMASK(nbits,lsh) (((1 << (nbits)) - 1) << lsh)
|
|
|
|
#define CCIO_CMUX_DLC_ENTRY(en, id, prior, n1, alias) {en, id, prior, n1, alias}
|
|
/*----------------------------------------------------------------------------*
|
|
* DATA TYPE DEFINITION *
|
|
*----------------------------------------------------------------------------*/
|
|
typedef bool bool_t;
|
|
|
|
typedef void CcioPbuf_t;
|
|
|
|
/* The type which is used to hold the size and the indicies of the buffer. */
|
|
typedef uint16_t RbufSize_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t *buf;
|
|
size_t len;
|
|
//size_t offs;
|
|
}CcioBufDesc_t;
|
|
|
|
/* 2bits: ccio speed type definition */
|
|
typedef enum
|
|
{
|
|
CCIO_ST_SLOW = 0,
|
|
CCIO_ST_MEDIUM,
|
|
CCIO_ST_HIGH,
|
|
|
|
CCIO_ST_MAXNUM
|
|
}CcioSpeedType_e;
|
|
|
|
/* 3bits: ccio hardware type definition */
|
|
typedef enum
|
|
{
|
|
CCIO_HT_USB = 0,
|
|
CCIO_HT_UART,
|
|
CCIO_HT_SPI,
|
|
CCIO_HT_I2S,
|
|
CCIO_HT_RSVD,
|
|
CCIO_HT_RADIO,
|
|
CCIO_HT_VIRT,
|
|
|
|
CCIO_HT_HWIND, /* hw independent */
|
|
CCIO_HT_MAXNUM
|
|
}CcioHwType_e;
|
|
|
|
/* 3bits: ccio device type definition */
|
|
typedef enum
|
|
{
|
|
CCIO_DT_SERIAL = 0,
|
|
CCIO_DT_RNDIS,
|
|
CCIO_DT_ECM,
|
|
CCIO_DT_EUTRA,
|
|
CCIO_DT_CCID,
|
|
|
|
CCIO_DT_MAXNUM
|
|
}CcioDevType_e;
|
|
|
|
/* 3bits: Serial device subtype definition */
|
|
typedef enum
|
|
{
|
|
CSIO_DT_AT = 0,
|
|
CSIO_DT_PPP,
|
|
CSIO_DT_DIAG,
|
|
CSIO_DT_OPAQ,
|
|
CSIO_DT_AUDIO,
|
|
CSIO_DT_ETH, /* EOS NIC-like */
|
|
CSIO_DT_MUX,
|
|
|
|
CSIO_DT_MAXNUM
|
|
}CsioDevType_e;
|
|
|
|
/* 3bits: rndis/ecm(Net) device subtype definition */
|
|
typedef enum
|
|
{
|
|
CNIO_DT_ETHER = 0,
|
|
|
|
CNIO_DT_MAXNUM
|
|
}CnioDevType_e;
|
|
|
|
/* 3bits: eUtra device subtype definition: cp&up? */
|
|
typedef enum
|
|
{
|
|
CUIO_DT_CTRL = 0,
|
|
CUIO_DT_DATA,
|
|
|
|
CUIO_DT_MAXNUM
|
|
}CuioDevType_e;
|
|
|
|
|
|
/* 3bits:cciD device subtype definition: currently only one */
|
|
typedef enum
|
|
{
|
|
CDIO_DT_DATA = 0,
|
|
|
|
CDIO_DT_MAXNUM
|
|
}CdioDevType_e;
|
|
|
|
|
|
/* 2bits: disable/en~ uplink/downlink hardware acceleration mechanism */
|
|
typedef enum
|
|
{
|
|
CCIO_DEV_HWACM_NONE = 0,
|
|
CCIO_DEV_HWACM_UL = (1 << 0), /* bit0 */
|
|
CCIO_DEV_HWACM_DL = (1 << 1), /* bit1 */
|
|
|
|
CCIO_DEV_HWACM_MAXNUM
|
|
}CcioDevHwAcm_e;
|
|
|
|
/* 2bits: ccio device working state definition */
|
|
typedef enum
|
|
{
|
|
CCIO_DWS_UNDEF = 0, /* never initialized */
|
|
CCIO_DWS_INITIAL, /* initialized */
|
|
CCIO_DWS_ASSIGNED, /* established, but unable to work */
|
|
CCIO_DWS_WORKING,
|
|
CCIO_DWS_STOPPING, /* terminating to work */
|
|
|
|
CCIO_DWS_MAXNUM
|
|
}CcioDevWorkState_e;
|
|
|
|
/** \brief List of channel Tx/Rx task create/kill flag */
|
|
typedef enum
|
|
{
|
|
CCIO_TASK_FLAG_NONE = 0x0, /**< None of send and recv task is created */
|
|
CCIO_TASK_FLAG_RX = 0x1, /**< Will create/kill recv task during device initialization and start to recv after successful call */
|
|
CCIO_TASK_FLAG_TX1 = 0x2, /**< Will create/kill send task1 during device initialization */
|
|
CCIO_TASK_FLAG_TX2 = 0x4, /**< Will create/kill send task2 during device initialization */
|
|
CCIO_TASK_FLAG_TX3 = 0x8, /**< Will create/kill send task3 during device initialization */
|
|
CCIO_TASK_FLAG_TX = (CCIO_TASK_FLAG_TX1 | CCIO_TASK_FLAG_TX2 | CCIO_TASK_FLAG_TX3)
|
|
}CcioTaskOperFlag_e;
|
|
|
|
typedef enum
|
|
{
|
|
CCIO_SERL_STATE_DCD = 0,
|
|
CCIO_SERL_STATE_RI,
|
|
|
|
CCIO_SERL_STATE_MAXNUM
|
|
}CcioSerlState_e;
|
|
|
|
typedef enum
|
|
{
|
|
CCIO_SERL_DCD_OFF = 0,
|
|
CCIO_SERL_DCD_ON,
|
|
}CcioSerlDcdState_e;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t stateId; /* CcioSerlState_e */
|
|
uint8_t rsvd[3];
|
|
uint32_t data;
|
|
uint32_t extras;
|
|
void *chdev;
|
|
}CcioSerlState_t;
|
|
|
|
/* lan media state between DTE & DCE */
|
|
typedef enum
|
|
{
|
|
CCIO_LMS_DISCONNECTED = 0,
|
|
CCIO_LMS_NEGOTIATING,
|
|
CCIO_LMS_CONNECTED
|
|
}CcioLanMediaState_e;
|
|
|
|
typedef enum _EPAT_CcioLanMediaTypeTag
|
|
{
|
|
CCIO_LAN_MEDIA_UNDEF = 0,
|
|
CCIO_LAN_MEDIA_RNDIS,
|
|
CCIO_LAN_MEDIA_ECM,
|
|
CCIO_LAN_MEDIA_PPP,
|
|
CCIO_LAN_MEDIA_AT,
|
|
CCIO_LAN_MEDIA_EOS, /* Ethernet Over Spi */
|
|
|
|
CCIO_LAN_MEDIA_XDATA, /* rsvd for unknown data */
|
|
CCIO_LAN_MEDIA_MAXNUM = CCIO_LAN_MEDIA_XDATA
|
|
}CcioLanMediaType_e;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t lanType; /* refer to 'CcioLanMediaType_e' */
|
|
uint8_t lanState; /* refer to 'CcioLanMediaState_e' */
|
|
uint8_t rsvd[2];
|
|
void *chdev;
|
|
}CcioLanMedia_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t lanType; /* refer to 'CcioLanMediaType_e' */
|
|
uint8_t isWakeUp;
|
|
uint16_t mtu;
|
|
}CcioLanLinkUp_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t lanType; /* refer to 'CcioLanMediaType_e' */
|
|
uint8_t isForce; /* is the lan forced to be down or not? */
|
|
uint8_t rsvd[2];
|
|
}CcioLanLinkDown_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t isAvlb;
|
|
uint8_t isPppType; /* 0-eth, 1-ppp */
|
|
uint8_t pdp4Cid; /* bit7: 0/1 exist or not; others: cid info! */
|
|
uint8_t pdp6Cid; /* bit7: 0/1 exist or not; others: cid info! */
|
|
}CcioDataPathCap_t;
|
|
|
|
typedef enum
|
|
{
|
|
CCIO_IP4_TYPE = (1 << 0),
|
|
CCIO_IP6_TYPE = (1 << 1)
|
|
}CcioIpType_e;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t ipType; /* CcioIpType_e */
|
|
uint8_t pdp4Cid; /* bit7: 0/1 exist or not; others: cid info! */
|
|
uint8_t pdp6Cid; /* bit7: 0/1 exist or not; others: cid info! */
|
|
uint8_t rsvd;
|
|
|
|
uint8_t ip4Addr[CCIO_IP4_ADDR_MAXSIZE];
|
|
uint8_t ip6Id[CCIO_IP6_ID_MAXSIZE];
|
|
|
|
uint8_t ip4Dns[2][CCIO_IP4_ADDR_MAXSIZE];
|
|
uint8_t ip6Dns[2][CCIO_IP6_ADDR_MAXSIZE];
|
|
}CcioDataPathHostConf_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t mac[CCIO_MAC_ADDR_MAXSIZE];
|
|
}CcioMacAddr_t;
|
|
|
|
typedef enum
|
|
{
|
|
CCIO_AUTH_NONE = 0,
|
|
CCIO_AUTH_PAP,
|
|
CCIO_AUTH_CHAP
|
|
}CcioAuthType_e;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t userLen;
|
|
uint16_t pwdLen;
|
|
uint8_t user[CCIO_BUF_SIZE_64];
|
|
uint8_t pwd[CCIO_BUF_SIZE_64];
|
|
}CcioAuthPap_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t challLen;
|
|
uint16_t respLen;
|
|
uint8_t chall[CCIO_BUF_SIZE_64];
|
|
uint8_t resp[CCIO_BUF_SIZE_64];
|
|
}CcioAuthChap_t;
|
|
|
|
typedef union
|
|
{
|
|
CcioAuthPap_t pap;
|
|
CcioAuthChap_t chap;
|
|
}CcioAuthInfo_t;
|
|
|
|
typedef enum
|
|
{
|
|
CCIO_REMOTE_FLAGS_WKUP = 0,
|
|
CCIO_REMOTE_FLAGS_VBUS
|
|
}CcioRemoteFlags_e;
|
|
|
|
#define CCIO_REMOTE_BM_FLAGS_WKUP (1 << CCIO_REMOTE_FLAGS_WKUP)
|
|
#define CCIO_REMOTE_BM_FLAGS_VBUS (1 << CCIO_REMOTE_FLAGS_VBUS)
|
|
typedef uint8_t CcioRemoteFlags_bm;
|
|
|
|
|
|
typedef enum
|
|
{
|
|
CCIO_EOK = 0, /* operation completed successfull */
|
|
CCIO_ERR = -1, /* unspecified error: no other errno fits */
|
|
CCIO_EARGS = -2, /* invalid argument(s) */
|
|
CCIO_EFOUND = -3, /* item not found */
|
|
CCIO_EEXIST = -4, /* item already exists */
|
|
CCIO_EPERM = -5, /* operation/scenario not permitted */
|
|
CCIO_EMALLOC = -6, /* memory alloc failure */
|
|
CCIO_EMFREE = -7, /* memory free failure */
|
|
CCIO_EMATCHED = -8, /* unmatched value/item */
|
|
CCIO_EEMPTY = -9, /* table/list is empty */
|
|
CCIO_EMORE = -10, /* wanted more data/info */
|
|
CCIO_EMOREPAD = -11, /* wanted more padding */
|
|
CCIO_EOBZP = -12, /* usb1.0 ecm obzp padding */
|
|
|
|
CCIO_STATUS_RSVD = 0x7FFFFFFF
|
|
}CcioStatus_e;
|
|
|
|
/*----------------------------------------------------------------------------*
|
|
* GLOBAL FUNCTIONS DECLEARATION *
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|
|
|