Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

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__