Exportable version of WizziLab's modem driver.
Diff: include/alp_spec.h
- Revision:
- 30:74aa36420c61
- Parent:
- 26:2c934a269914
- Child:
- 35:ac940cf8ebe6
--- a/include/alp_spec.h Wed May 16 11:14:32 2018 +0000 +++ b/include/alp_spec.h Mon Jun 04 15:32:05 2018 +0000 @@ -1,6 +1,6 @@ /// @copyright /// ========================================================================={{{ -/// Copyright (c) 2012-2013 WizziLab / +/// Copyright (c) 2012-2018 WizziLab / /// All rights reserved / /// / /// IMPORTANT: This Software may not be modified, copied or distributed unless / @@ -53,87 +53,86 @@ #include "hal_types.h" // Opcode Modifiers / Preemption flags -#define ALP_OPCODE_RESP 0x40 -#define ALP_OPCODE_GROUP 0x80 -#define ALP_OPCODE_ERR 0x40 -#define ALP_OPCODE_EOP 0x80 -#define ALP_OPCODE_ITF 0x40 -#define ALP_OPCODE_INDIRECT 0x40 -#define ALP_OPCODE_OVERLOAD 0x80 +#define ALP_OPCODE_RESP 0x40 +#define ALP_OPCODE_GROUP 0x80 +#define ALP_OPCODE_ERR 0x40 +#define ALP_OPCODE_EOP 0x80 +#define ALP_OPCODE_ITF 0x40 +#define ALP_OPCODE_INDIRECT 0x40 +#define ALP_OPCODE_OVERLOAD 0x80 typedef enum { -// OPCODE | OPERAND - ALP_OPCODE_NOP = 0, //| - +// OPCODE | OPERAND + ALP_OPCODE_NOP = 0, //| - - ALP_OPCODE_F_RD_DATA = 1, //| FDR - ALP_OPCODE_F_RD_PROP = 2, //| FID + ALP_OPCODE_F_RD_DATA = 1, //| FDR + ALP_OPCODE_F_RD_PROP = 2, //| FID - ALP_OPCODE_F_WR_DATA = 4, //| FD - ALP_OPCODE_F_WR_FLUSH = 5, //| FD - ALP_OPCODE_F_WR_PROP = 6, //| FD - ALP_OPCODE_F_TOUCH = 7, //| FD + ALP_OPCODE_F_WR_DATA = 4, //| FD + ALP_OPCODE_F_WR_FLUSH = 5, //| FD + ALP_OPCODE_F_WR_PROP = 6, //| FD + ALP_OPCODE_F_TOUCH = 7, //| FD - ALP_OPCODE_QUERY = 8, //| Q - ALP_OPCODE_QBREAK = 9, //| Q - ALP_OPCODE_PERM_REQ = 10, //| P + ALP_OPCODE_QUERY = 8, //| Q + ALP_OPCODE_QBREAK = 9, //| Q + ALP_OPCODE_PERM_REQ = 10, //| P - ALP_OPCODE_CRC_CHECK = 11, //| Q + ALP_OPCODE_CRC_CHECK = 11, //| Q - ALP_OPCODE_F_EXIST = 16, //| FID - ALP_OPCODE_F_CREATE = 17, //| FD - ALP_OPCODE_F_DELETE = 18, //| FID - ALP_OPCODE_F_RESTORE = 19, //| FID - ALP_OPCODE_F_FLUSH = 20, //| FID - ALP_OPCODE_F_DECLARE = 21, //| FH XXX Deprecated DO NOT USE !!! - ALP_OPCODE_F_CLOSE = 22, //| FID - ALP_OPCODE_F_COPY = 23, //| 2xFID - ALP_OPCODE_F_EXECUTE = 31, //| FID + ALP_OPCODE_F_EXIST = 16, //| FID + ALP_OPCODE_F_CREATE = 17, //| FD + ALP_OPCODE_F_DELETE = 18, //| FID + ALP_OPCODE_F_RESTORE = 19, //| FID + ALP_OPCODE_F_FLUSH = 20, //| FID + ALP_OPCODE_F_DECLARE = 21, //| FH XXX Deprecated DO NOT USE !!! + ALP_OPCODE_F_CLOSE = 22, //| FID + ALP_OPCODE_F_COPY = 23, //| 2xFID + ALP_OPCODE_F_EXECUTE = 31, //| FID - ALP_OPCODE_RSP_F_DATA = 32, //| FD - ALP_OPCODE_RSP_F_PROP = 33, //| FH - ALP_OPCODE_RSP_STATUS = 34, //| S - ALP_OPCODE_RSP_ISTATUS = ALP_OPCODE_RSP_STATUS + ALP_OPCODE_ITF, //| SI - ALP_OPCODE_RSP_TAG = 35, //| PID - ALP_OPCODE_RSP_EOPTAG = ALP_OPCODE_RSP_TAG + ALP_OPCODE_EOP, //| PID - ALP_OPCODE_RSP_ERRTAG = ALP_OPCODE_RSP_TAG + ALP_OPCODE_ERR, //| PID - ALP_OPCODE_RSP_URC = 36, //| + ALP_OPCODE_RSP_F_DATA = 32, //| FD + ALP_OPCODE_RSP_F_PROP = 33, //| FH + ALP_OPCODE_RSP_STATUS = 34, //| S + ALP_OPCODE_RSP_ISTATUS = ALP_OPCODE_RSP_STATUS + ALP_OPCODE_ITF, //| SI + ALP_OPCODE_RSP_TAG = 35, //| PID + ALP_OPCODE_RSP_EOPTAG = ALP_OPCODE_RSP_TAG + ALP_OPCODE_EOP, //| PID + ALP_OPCODE_RSP_ERRTAG = ALP_OPCODE_RSP_TAG + ALP_OPCODE_ERR, //| PID + ALP_OPCODE_RSP_URC = 36, //| - ALP_OPCODE_CHUNK = 48, //| - - ALP_OPCODE_LOGIC = 49, //| - - ALP_OPCODE_FORWARD = 50, //| I - ALP_OPCODE_IFORWARD = 51, //| IFID - ALP_OPCODE_TAG = 52, //| PID - ALP_OPCODE_URCC = 53, //| + ALP_OPCODE_CHUNK = 48, //| - + ALP_OPCODE_LOGIC = 49, //| - + ALP_OPCODE_FORWARD = 50, //| I + ALP_OPCODE_IFORWARD = 51, //| IFID + ALP_OPCODE_TAG = 52, //| PID + ALP_OPCODE_URCC = 53, //| - ALP_OPCODE_EXT = 63, //| OP |ARGC| ARGS | - //| 1B | 1B | ARGC-bytes | -RFU - - + ALP_OPCODE_EXT = 63, //| OP |ARGC| ARGS | + //| 1B | 1B | ARGC-bytes | } alp_opcodes_t; -#define ALP_OPCODE_UNKNOWN (-1) +#define ALP_OPCODE_UNKNOWN (-1) typedef enum { - ALP_ITF_TYPE_HOST = 0x00, - ALP_ITF_TYPE_BLE = 0xB0, - ALP_ITF_TYPE_COM = 0xC0, - ALP_ITF_TYPE_D7A = 0xD7, // Only this one actually in D7A Spec - ALP_ITF_TYPE_LWAN = 0x10, + ALP_ITF_TYPE_HOST = 0x00, + ALP_ITF_TYPE_BLE = 0xB0, + ALP_ITF_TYPE_COM = 0xC0, + ALP_ITF_TYPE_D7A = 0xD7, // Only this one actually in D7A Spec + ALP_ITF_TYPE_LWAN = 0x10, + + ALP_ITF_TYPE_NONE = 0xFF } alp_itf_type_t; // EXTOpcode Modifiers / Preemption flags -#define ALP_EXTOPCODE_DISTANT 0x40 // Used w/ EXTOPCODE_F_DECLARE +#define ALP_EXTOPCODE_DISTANT 0x40 // Used w/ EXTOPCODE_F_DECLARE typedef enum { // WIZZILAB OPCODE EXTENSION - ALP_EXTOPCODE_ITF_START = 0, //| 'ITF' activation operations: - ALP_EXTOPCODE_ITF_STOP = 1, //| TYPE | DEVQ | IFID | FLAGS | - ALP_EXTOPCODE_ITF_PAUSE = 2, //| 1B | 1B | 1B | 1B | - //| TYPE: ITF Type (D7A,LWAN,BLE...) - //| DEVQ: ITF Max Device number if applicable - //| IFID: ITF Config file if applicable - //| FLAG: Additional configuration flags if applicable - ALP_EXTOPCODE_F_DECLARE = 21, //| FH + ALP_EXTOPCODE_ITF_START = 0, //| 'ITF' activation operations: + ALP_EXTOPCODE_ITF_STOP = 1, //| TYPE | DEVQ | IFID | FLAGS | + ALP_EXTOPCODE_ITF_PAUSE = 2, //| 1B | 1B | 1B | 1B | + //| TYPE: ITF Type (D7A,LWAN,BLE...) + //| DEVQ: ITF Max Device number if applicable + //| IFID: ITF Config file if applicable + //| FLAG: Additional configuration flags if applicable + ALP_EXTOPCODE_F_DECLARE = 21, //| FH } alp_ext_opcodes_t; typedef enum @@ -166,19 +165,54 @@ } alp_errors_t; typedef enum { + ALP_QCOMP_NE = 0, + ALP_QCOMP_EQ = 1, + ALP_QCOMP_LT = 2, + ALP_QCOMP_LTE = 3, + ALP_QCOMP_GT = 4, + ALP_QCOMP_GTE = 5 +} alp_q_comp_t; +#define ALP_QCOMP(v) (((v) & 7) << 0) + +typedef enum { + // This is not matching ALP's spec on purpose... + ALP_QLOGIC_AND = 0, + ALP_QLOGIC_OR = 1, + ALP_QLOGIC_XOR = 2, + ALP_QLOGIC_NOR = 3, + ALP_QLOGIC_NAND = 4, +} alp_q_logic_t; + +typedef enum { + ALP_QDATA_SIGNED = 0, + ALP_QDATA_UNSIGNED = 1 +} alp_q_data_t; +#define ALP_QDATA(v) (((v) & 1) << 3) +#define ALP_QMASK(v) (((v) & 1) << 4) + +typedef enum { + ALP_QTYPE_NONVOID = 0, // This is better done by "EXIST" + ALP_QTYPE_ACOMP_ZERO = 1, + ALP_QTYPE_ACOMP_IMMEDIATE = 2, + ALP_QTYPE_ACOMP_FILE = 3, + ALP_QTYPE_INRANGE = 4, + ALP_QTYPE_STR_TOKEN = 7 // +}alp_q_type_t; +#define ALP_QTYPE(v) (((v) & 7) << 5) + +typedef enum { /// Disable all URCs on requesting ITF - ALP_URC_TYPE_NONE = 0xFF, + ALP_URC_TYPE_NONE = 0xFF, /// Enable Link Quality (on IFID) URCs on requesting ITF - ALP_URC_TYPE_LQUAL = 0, + ALP_URC_TYPE_LQUAL = 0, /// Enable Link Down (on IFID) URCs on requesting ITF - ALP_URC_TYPE_LDOWN = 1, + ALP_URC_TYPE_LDOWN = 1, ALP_URC_TYPE_QTY, - ALP_URC_TYPE_BUSY = 2, // XXX TODO this is awkward: BUSY is not an ITF-URC but a system/modem URC + ALP_URC_TYPE_BUSY = 2, // XXX TODO this is awkward: BUSY is not an ITF-URC but a system/modem URC } alp_urc_type_t; - TYPEDEF_STRUCT_PACKED { u8 perm; u8 prop; @@ -205,6 +239,8 @@ // _fid : File ID // _o : Access Offset // _l : Access Length +// _m : Mask +// _v : Immediate value // ====================================================================== #define ALP_ACTION_NOP_SIZE (1) #define ALP_ACTION_NOP(_p,_r) do {\ @@ -405,5 +441,33 @@ ALP_OPCODE_F_RD_DATA | ALP_OPCODE_RESP,\ 0, HAL_U16_BE_DEPOSIT(0x8000), 0 } +// Simple Query actions +/// Match immediate value to file value +#define ALP_ACTION_QUERY_EQVAL_SIZE(_o,_l,_mbit) (4+ALP_LFIELD_SIZE(_o)+(1+(_mbit))*(_l)) +#define ALP_ACTION_QUERY_EQVAL(_p,_m,_v,_fid,_o,_l) do {\ + u8 _mbit = (_m) ? 1 : 0;\ + *(_p)++ = ALP_OPCODE_QUERY;\ + *(_p)++ = ALP_QCOMP(ALP_QCOMP_EQ) | ALP_QDATA(ALP_QDATA_UNSIGNED) | ALP_QMASK(_mbit) | ALP_QTYPE(ALP_QTYPE_ACOMP_IMMEDIATE);\ + *(_p)++ = _l;\ + if (_mbit) {memcpy((_p),&(_m),_l);(_p) += (_l);}\ + memcpy((_p),&(_v),_l);(_p) += (_l);\ + *(_p)++ = _fid;\ + (_p) += alp_encode_length(_p,_o);\ + } while(0) + +// Query with break actions +/// Match immediate value to file value +#define ALP_ACTION_QBREAK_EQVAL_SIZE(_o,_l,_mbit) (4+ALP_LFIELD_SIZE(_o)+(1+(_mbit))*(_l)) +#define ALP_ACTION_QBREAK_EQVAL(_p,_m,_v,_fid,_o,_l) do {\ + u8 _mbit = (_m) ? 1 : 0;\ + *(_p)++ = ALP_OPCODE_QBREAK;\ + *(_p)++ = ALP_QCOMP(ALP_QCOMP_EQ) | ALP_QDATA(ALP_QDATA_UNSIGNED) | ALP_QMASK(_mbit) | ALP_QTYPE(ALP_QTYPE_ACOMP_IMMEDIATE);\ + *(_p)++ = _l;\ + if (_mbit) {memcpy((_p),&(_m),_l);(_p) += (_l);}\ + memcpy((_p),&(_v),_l);(_p) += (_l);\ + *(_p)++ = _fid;\ + (_p) += alp_encode_length(_p,_o);\ + } while(0) + #endif // __ALP_SPEC_H__