WizziLab / modem_ref

Dependents:   modem_ref_helper

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers alp_spec.h Source File

alp_spec.h

Go to the documentation of this file.
00001 /// @copyright
00002 /// ========================================================================={{{
00003 /// Copyright (c) 2012-2020 WizziLab                                           /
00004 /// All rights reserved                                                        /
00005 ///                                                                            /
00006 /// Should you have any questions regarding your right to use this Software,   /
00007 /// contact WizziLab at www.wizzilab.com.                                      /
00008 ///                                                                            /
00009 /// =========================================================================}}}
00010 /// @endcopyright
00011 
00012 //  =======================================================================
00013 /// @file           alp_spec.h
00014 /// @defgroup       ALP
00015 /// @brief          ALP definitions from D7A specification
00016 //  =======================================================================
00017 
00018 #ifndef __ALP_SPEC_H__
00019 #define __ALP_SPEC_H__
00020 
00021 #include "hal_types.h"
00022 
00023 // Opcode Modifiers / Preemption flags
00024 #define ALP_OPCODE_RESP                 0x40
00025 #define ALP_OPCODE_GROUP                0x80
00026 #define ALP_OPCODE_ERR                  0x40
00027 #define ALP_OPCODE_EOP                  0x80
00028 #define ALP_OPCODE_ITF                  0x40
00029 #define ALP_OPCODE_INDIRECT             0x40
00030 #define ALP_OPCODE_OVERLOAD             0x80
00031 
00032 typedef enum {
00033 //      OPCODE                                  | OPERAND
00034     ALP_OPCODE_NOP                      = 0,  //|   -
00035 
00036     ALP_OPCODE_F_RD_DATA                = 1,  //|  FDR
00037     ALP_OPCODE_F_RD_PROP                = 2,  //|  FID
00038 
00039     ALP_OPCODE_F_WR_DATA                = 4,  //|  FD
00040     ALP_OPCODE_F_WR_FLUSH               = 5,  //|  FD
00041     ALP_OPCODE_F_WR_PROP                = 6,  //|  FD
00042     ALP_OPCODE_F_TOUCH                  = 7,  //|  FD
00043 
00044     ALP_OPCODE_QUERY                    = 8,  //|   Q
00045     ALP_OPCODE_QBREAK                   = 9,  //|   Q
00046     ALP_OPCODE_PERM_REQ                 = 10, //|   P
00047 
00048     ALP_OPCODE_CRC_CHECK                = 11, //|  Q
00049 
00050     ALP_OPCODE_F_EXIST                  = 16, //|  FID
00051     ALP_OPCODE_F_CREATE                 = 17, //|  FD
00052     ALP_OPCODE_F_DELETE                 = 18, //|  FID
00053     ALP_OPCODE_F_RESTORE                = 19, //|  FID
00054     ALP_OPCODE_F_FLUSH                  = 20, //|  FID
00055     ALP_OPCODE_F_DECLARE                = 21, //|  FH XXX Deprecated DO NOT USE !!!
00056     ALP_OPCODE_F_CLOSE                  = 22, //|  FID
00057     ALP_OPCODE_F_COPY                   = 23, //|  2xFID
00058     ALP_OPCODE_F_EXECUTE                = 31, //|  FID
00059 
00060     ALP_OPCODE_RSP_F_DATA               = 32, //|  FD
00061     ALP_OPCODE_RSP_F_PROP               = 33, //|  FH
00062     ALP_OPCODE_RSP_STATUS               = 34, //|  S
00063     ALP_OPCODE_RSP_ISTATUS              = ALP_OPCODE_RSP_STATUS + ALP_OPCODE_ITF, //|   SI
00064     ALP_OPCODE_RSP_EOPISTATUS           = ALP_OPCODE_RSP_STATUS + ALP_OPCODE_ITF + ALP_OPCODE_EOP, //|   SI
00065     ALP_OPCODE_RSP_TAG                  = 35, //|  PID
00066     ALP_OPCODE_RSP_EOPTAG               = ALP_OPCODE_RSP_TAG + ALP_OPCODE_EOP, //|   PID
00067     ALP_OPCODE_RSP_ERRTAG               = ALP_OPCODE_RSP_TAG + ALP_OPCODE_ERR, //|   PID
00068     ALP_OPCODE_RSP_URC                  = 36, //|
00069     ALP_OPCODE_RSP_SECURED              = 37, //|
00070 
00071     ALP_OPCODE_CHUNK                    = 48, //|  -
00072     ALP_OPCODE_LOGIC                    = 49, //|  -
00073     ALP_OPCODE_FORWARD                  = 50, //|  I
00074     ALP_OPCODE_IFORWARD                 = 51, //|  IFID
00075     ALP_OPCODE_TAG                      = 52, //|  PID
00076     ALP_OPCODE_URCC                     = 53, //|
00077 
00078     ALP_OPCODE_EXT                      = 63, //| OP |ARGC| ARGS       |
00079                                               //| 1B | 1B | ARGC-bytes |
00080 } alp_opcodes_t;
00081 #define ALP_OPCODE_UNKNOWN              (-1)
00082 
00083 typedef enum {
00084     ALP_ITF_TYPE_HOST                   = 0x00,
00085     ALP_ITF_TYPE_BLE                    = 0xB0,
00086     ALP_ITF_TYPE_COM                    = 0xC0,
00087     ALP_ITF_TYPE_D7A                    = 0xD7, // Only this one actually in D7A Spec
00088     ALP_ITF_TYPE_LWAN                   = 0x10,
00089 
00090     ALP_ITF_TYPE_NONE                   = 0xFF
00091 } alp_itf_type_t;
00092 
00093 // EXTOpcode Modifiers / Preemption flags
00094 #define ALP_EXTOPCODE_DISTANT           0x40 // Used w/ EXTOPCODE_F_DECLARE
00095 
00096 typedef enum {
00097 //  WIZZILAB OPCODE EXTENSION
00098     ALP_EXTOPCODE_ITF_START             = 0,  //|   'ITF' activation operations:
00099     ALP_EXTOPCODE_ITF_STOP              = 1,  //| TYPE | DEVQ | IFID | FLAGS |
00100     ALP_EXTOPCODE_ITF_PAUSE             = 2,  //|  1B  |  1B  |  1B  |  1B   |
00101                                              //| TYPE: ITF Type (D7A,LWAN,BLE...)
00102                                              //| DEVQ: ITF Max Device number if applicable
00103                                              //| IFID: ITF Config file if applicable
00104                                              //| FLAG: Additional configuration flags if applicable
00105     ALP_EXTOPCODE_F_DECLARE             = 21, //| FH
00106 } alp_ext_opcodes_t;
00107 
00108 typedef enum
00109 {
00110     ALP_ERR_ITF_FULL                    =  2, // 0x02: For interfaces supporting buffering, indicates buffer reached maximum capacity (no data loss)
00111     ALP_ERR_PARTIAL_COMPLETION          =  1, // 0x01: Action received and partially completed at response.  To be completed after response
00112 
00113     ALP_ERR_NONE                        =  0, // 0x00: Action completed (OK)
00114     ALP_ERR_FILE_NOT_FOUND              = -1, // 0xFF: Error access file: File ID does not exist
00115     ALP_ERR_FILE_EXIST                  = -2, // 0xFE: Error create file: File ID already exists
00116     ALP_ERR_FILE_NOT_RESTORABLE         = -3, // 0xFD: Error restore file: File is not restorable
00117     ALP_ERR_PERMISSION_DENIED           = -4, // 0xFC: Error access file: Insufficient permissions
00118     ALP_ERR_LENGTH_OVERFLOW             = -5, // 0xFB: Error create file: Supplied length (in header) is beyond file limits
00119     ALP_ERR_ALLOC_OVERFLOW              = -6, // 0xFA: Error create file: Supplied allocation (in header) is beyond file limits
00120     ALP_ERR_OFFSET_OVERFLOW             = -7, // 0xF9: Error write: Supplied start offset is out of bounds of file allocation
00121     ALP_ERR_WRITE_OVERFLOW              = -8, // 0xF8: Error complete write: Supplied data goes beyond file allocation
00122     ALP_ERR_WRITE_ERROR                 = -9, // 0xF7: Error write: impossible to write in storage location
00123     ALP_ERR_OPERATION_UNKNOWN           = -10,// 0xF6: Error unknown Operation
00124     ALP_ERR_OPERAND_INCOMPLETE          = -11,// 0xF5: Error incomplete Operand
00125     ALP_ERR_OPERAND_WRONG_FORMAT        = -12,// 0xF4: Error wrong Operand format
00126     ALP_ERR_ITF_INVALID                 = -13,// 0xF3: Error invalid interface
00127     ALP_ERR_ITF_OVERFLOW                = -14,// 0xF2: Error interface overflown (i.e. resources exhausted, buffer full with data discarded)
00128     ALP_ERR_QUERY_FAIL                  = -15,// 0xF1: (Group of) Query result was false (Informative error code).
00129     ALP_ERR_ITF_NOT_READY               = -16,// 0xF0: Error interface is not ready
00130 
00131     ALP_ERR_ITF_START                   = -64,// 0xC0: Interface specific error, start range
00132     ALP_ERR_ITF_END                     = -96,// 0xA0: Interface specific error, end range
00133     ALP_ERR_ITF_NOT_SPECIFIED           = ALP_ERR_ITF_END, // Not specified internal interface error.
00134 
00135     ALP_ERR_UNKNOWN                     = -128,// 0x80: Unknown error
00136     ALP_ERR_FS_TIMEOUT,                       // 0x81: Internal FS Error
00137     ALP_ERR_ITF_UNKNOWN,                      // 0x82: Unknown Interface
00138     ALP_ERR_ITF_TIMEOUT,                      // 0x83: Internal ITF Error
00139     ALP_ERR_CHAL_NOT_VALID                    // 0x84: Challenge has expired
00140 
00141 } alp_errors_t;
00142 
00143 typedef enum {
00144     ALP_QCOMP_NE                        = 0,
00145     ALP_QCOMP_EQ                        = 1,
00146     ALP_QCOMP_LT                        = 2,
00147     ALP_QCOMP_LTE                       = 3,
00148     ALP_QCOMP_GT                        = 4,
00149     ALP_QCOMP_GTE                       = 5
00150 } alp_q_comp_t;
00151 #define ALP_QCOMP(v)                   (((v) & 7) << 0)
00152 #define ALP_QSTR_PARAM(v)              (((v) & 0x0F) << 0)
00153 
00154 typedef enum {
00155     // This is not matching ALP's spec on purpose...
00156     ALP_QLOGIC_AND                      = 0,
00157     ALP_QLOGIC_OR                       = 1,
00158     ALP_QLOGIC_XOR                      = 2,
00159     ALP_QLOGIC_NOR                      = 3,
00160     ALP_QLOGIC_NAND                     = 4,
00161 } alp_q_logic_t;
00162 #define ALP_QLOGIC(v)                   (((v-1) & 0x03) << 6)
00163 
00164 typedef enum {
00165     ALP_QDATA_SIGNED                    = 0,
00166     ALP_QDATA_UNSIGNED                  = 1
00167 } alp_q_data_t;
00168 #define ALP_QDATA(v)                    (((v) & 1) << 3)
00169 #define ALP_QMASK(v)                    (((v) & 1) << 4)
00170 
00171 typedef enum {
00172     ALP_QTYPE_NONVOID                   = 0, // This is better done by "EXIST"
00173     ALP_QTYPE_ACOMP_ZERO                = 1,
00174     ALP_QTYPE_ACOMP_IMMEDIATE           = 2,
00175     ALP_QTYPE_ACOMP_FILE                = 3,
00176     ALP_QTYPE_INRANGE                   = 4,
00177     ALP_QTYPE_STR_TOKEN                 = 7  //
00178 }alp_q_type_t;
00179 #define ALP_QTYPE(v)                   (((v) & 7) << 5)
00180 
00181 typedef enum {
00182     /// Disable all URCs on requesting ITF
00183     ALP_URC_TYPE_NONE                   = 0xFF,
00184     /// Enable Link Quality (on IFID) URCs on requesting ITF
00185     ALP_URC_TYPE_LQUAL                  = 0,
00186     /// Enable Link Down (on IFID) URCs on requesting ITF
00187     ALP_URC_TYPE_LDOWN                  = 1,
00188     /// Enable system/modem URC
00189     /// XXX Could enable subtypes, but API does not allow it
00190     ALP_URC_TYPE_BUSY                   = 2,
00191     /// Enable Interface BUSY messages
00192     ALP_URC_TYPE_ITF_BUSY               = 3,
00193     /// XXX system/modem URC with parameter
00194     // ALP_URC_TYPE_SYS
00195 
00196     ALP_URC_TYPE_QTY,
00197 
00198 } alp_urc_type_t ;
00199 
00200 TYPEDEF_STRUCT_PACKED {
00201     u8                  perm;
00202     u8                  prop;
00203     u8                  afid;
00204     u8                  ifid;
00205     u32                 size; // XXX Big Endian
00206     u32                 alloc;// XXX Big Endian
00207 } alp_file_header_t;
00208 #define ALP_FILE_HEADER_SIZE    (sizeof(alp_file_header_t))
00209 
00210 // RESPONSES Building helpers
00211 // ======================================================================
00212 #define ALP_RSP_STATUS_SIZE         (3)     // OPCODE + ACTION_ID + ERR
00213 #define ALP_RSP_F_PROP_SIZE         (2+ALP_FILE_HEADER_SIZE)    // OPCODE + FID + 12xDATA
00214 #define ALP_LFIELD_SIZE(a)          (((a) <= 0x3F)      ? 1 : \
00215                                     (((a) <= 0x3FFF)    ? 2 : \
00216                                     (((a) <= 0x3FFFFF)  ? 3 : 4)))
00217 
00218 // ACTIONS Building helpers
00219 // ----------------------------------------------------------------------
00220 // Usual arguments:
00221 // _p   : pointer to the output string buffer (incremented by the macro)
00222 // _r   : ALP response Flag (true/false)
00223 // _fid : File ID
00224 // _o   : Access Offset
00225 // _l   : Access Length
00226 // _m   : Mask
00227 // _v   : Immediate value
00228 // ======================================================================
00229 #define ALP_ACTION_NOP_SIZE                     (1)
00230 #define ALP_ACTION_NOP(_p,_r,_g)   do {\
00231     *(p)++ = ALP_OPCODE_NOP | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00232     } while(0)
00233 
00234 #define ALP_ACTION_TAG_SIZE                     (2)
00235 #define ALP_ACTION_TAG(_p,_tag,_eop) do {\
00236     *(p)++ = ALP_OPCODE_TAG | ((_eop)? ALP_OPCODE_EOP: 0);\
00237     *(p)++ = (_tag);\
00238     } while(0)
00239 
00240 #define ALP_ACTION_F_RD_DATA_SIZE(_o,_l)        (2+ALP_LFIELD_SIZE(_o)+ALP_LFIELD_SIZE(_l))
00241 #define ALP_ACTION_F_RD_DATA_SIZE_MAX           (2+4+4)
00242 #define ALP_ACTION_F_RD_DATA(_p,_r,_fid,_o,_l,_g) do {\
00243     *(_p)++ = ALP_OPCODE_F_RD_DATA | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00244     *(_p)++ = (_fid);\
00245     (_p) += alp_encode_length(_p,_o);\
00246     (_p) += alp_encode_length(_p,_l);\
00247     } while(0)
00248 
00249 #define ALP_ACTION_F_RD_PROP_SIZE               (2)
00250 #define ALP_ACTION_F_RD_PROP(_p,_r,_fid,_g) do {\
00251     *(_p)++ = ALP_OPCODE_F_RD_PROP | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00252     *(_p)++ = (_fid);\
00253     } while(0)
00254 
00255 #define ALP_ACTION_F_WR_DATA_SIZE(_o,_l)        (2+ALP_LFIELD_SIZE(_o)+ALP_LFIELD_SIZE(_l)+(_l))
00256 #define ALP_ACTION_F_WR_DATA_SIZE_MAX(_l)       (2+4+4+(_l))
00257 #define ALP_ACTION_F_WR_DATA(_p,_r,_fid,_o,_l,_data,_g) do {\
00258     *(_p)++ = ALP_OPCODE_F_WR_DATA | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00259     *(_p)++ = (_fid);\
00260     (_p) += alp_encode_length(_p,_o);\
00261     (_p) += alp_encode_length(_p,_l);\
00262     memcpy((_p),_data,_l);(_p) += (_l);\
00263     } while(0)
00264 
00265 #define ALP_ACTION_F_WR_FLUSH_SIZE(_o,_l)       (2+ALP_LFIELD_SIZE(_o)+ALP_LFIELD_SIZE(_l)+(_l))
00266 #define ALP_ACTION_F_WR_FLUSH_SIZE_MAX(_l)      (2+4+(_l))
00267 #define ALP_ACTION_F_WR_FLUSH(_p,_r,_fid,_o,_l,_data,_g) do {\
00268     *(_p)++ = ALP_OPCODE_F_WR_FLUSH | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00269     *(_p)++ = (_fid);\
00270     (_p) += alp_encode_length(_p,_o);\
00271     (_p) += alp_encode_length(_p,_l);\
00272     memcpy((_p),_data,_l);(_p) += (_l);\
00273     } while(0)
00274 
00275 #define ALP_ACTION_F_WR_PROP_SIZE_MAX           (2+2+sizeof(alp_file_header_t))
00276 #define ALP_ACTION_F_WR_PROP(_p,_r,_fid,_o,_l,_data,_g)  do {\
00277     *(_p)++ = ALP_OPCODE_F_WR_PROP | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00278     *(_p)++ = (_fid);\
00279     *(_p)++ = (_o);\
00280     *(_p)++ = (_l);\
00281     memcpy((_p),(u8*)(_data),(_l));(_p) += (_l);\
00282     } while(0)
00283 
00284 #define ALP_ACTION_F_TOUCH_SIZE(_o,_l)          (2+ALP_LFIELD_SIZE(_o)+ALP_LFIELD_SIZE(_l))
00285 #define ALP_ACTION_F_TOUCH_SIZE_MAX             (2+4+4)
00286 #define ALP_ACTION_F_TOUCH(_p,_r,_fid,_o,_l,_g)   do {\
00287     *(_p)++ = ALP_OPCODE_F_TOUCH | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00288     *(_p)++ = (_fid);\
00289     (_p) += alp_encode_length(_p,_o);\
00290     (_p) += alp_encode_length(_p,_l);\
00291     } while(0)
00292 
00293 #define ALP_ACTION_F_EXIST_SIZE                 (2)
00294 #define ALP_ACTION_F_EXIST(_p,_r,_fid,_g)   do {\
00295     *(_p)++ = ALP_OPCODE_F_EXIST | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00296     *(_p)++ = (_fid);\
00297     } while(0)
00298 
00299 #define ALP_ACTION_F_DELETE_SIZE                (2)
00300 #define ALP_ACTION_F_DELETE(_p,_r,_fid,_g)  do {\
00301     *(_p)++ = ALP_OPCODE_F_DELETE | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00302     *(_p)++ = (_fid);\
00303     } while(0)
00304 
00305 #define ALP_ACTION_F_FLUSH_SIZE                 (2)
00306 #define ALP_ACTION_F_FLUSH(_p,_r,_fid,_g)   do {\
00307     *(_p)++ = ALP_OPCODE_F_FLUSH | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00308     *(_p)++ = (_fid);\
00309     } while(0)
00310 
00311 #define ALP_ACTION_F_CREATE_SIZE                (2+sizeof(alp_file_header_t))
00312 #define ALP_ACTION_F_CREATE(_p,_r,_fid,_hdr,_g)  do {\
00313     *(_p)++ = ALP_OPCODE_F_CREATE | ((_r)? ALP_OPCODE_RESP: 0) | ((_g)? ALP_OPCODE_GROUP: 0);\
00314     *(_p)++ = (_fid);\
00315     memcpy((_p),(u8*)(_hdr),sizeof(alp_file_header_t));(_p) += sizeof(alp_file_header_t);\
00316     } while(0)
00317 
00318 #define ALP_PERM_REQ_USER                       0
00319 #define ALP_PERM_REQ_ROOT                       1
00320 #define ALP_PERM_REQ_APP                        2
00321 
00322 // Authentication Protocol without initialization data
00323 #define ALP_WIZZILAB_AUTH_PROTOCOL_ID           42
00324 // Challenge Encryption-Authentication Protocol
00325 #define ALP_WIZZILAB_CHAL_PROTOCOL_ID           43
00326 // Authentication Protocol with initialization data
00327 #define ALP_WIZZILAB_SIGN_PROTOCOL_ID           44
00328 
00329 #define ALP_ACTION_PERM_REQ_TOKEN_SIZE          8
00330 #define ALP_ACTION_PERM_REQ_OFFSET              (3+ALP_ACTION_PERM_REQ_TOKEN_SIZE)
00331 #define ALP_ACTION_PERM_REQ_SIZE(_l)            (ALP_ACTION_PERM_REQ_OFFSET+(_l))
00332 #define ALP_ACTION_PERM_REQ(_p,_r,_role, _protocol)   do {\
00333     *(_p)++ = (_r)?ALP_OPCODE_PERM_REQ+ALP_OPCODE_RESP:ALP_OPCODE_PERM_REQ;\
00334     *(_p)++ = (_role);\
00335     *(_p)++ = (_protocol);\
00336     } while(0)
00337 
00338 #define ALP_SECURED_USER                        ALP_PERM_REQ_USER
00339 #define ALP_SECURED_ROOT                        ALP_PERM_REQ_ROOT
00340 #define ALP_SECURED_APP                         ALP_PERM_REQ_APP
00341 
00342 #define ALP_ACTION_SECURED_IV_SIZE              8
00343 #define ALP_ACTION_SECURED_TOKEN_SIZE           8
00344 #define ALP_ACTION_SECURED_OFFSET               (3+ALP_ACTION_SECURED_IV_SIZE+ALP_ACTION_SECURED_TOKEN_SIZE)
00345 #define ALP_ACTION_SECURED_SIZE(_l)             (ALP_ACTION_SECURED_OFFSET+(_l))
00346 #define ALP_ACTION_SECURED(_p,_role, _protocol)   do {\
00347     *(_p)++ = ALP_OPCODE_RSP_SECURED;\
00348     *(_p)++ = (_role);\
00349     *(_p)++ = (_protocol);\
00350     } while(0)
00351 
00352 #define ALP_ACTION_URCC_SIZE(t)                 ((t==ALP_URC_TYPE_NONE)?2:4)
00353 #define ALP_ACTION_URCC_EN(_p,_r,_type,_ifid,_cfg)  do {\
00354     *(_p)++ = (_r)?ALP_OPCODE_URCC+ALP_OPCODE_GROUP+ALP_OPCODE_RESP:ALP_OPCODE_URCC+ALP_OPCODE_GROUP;\
00355     *(_p)++ = (_type);\
00356     if((_type)==ALP_URC_TYPE_LQUAL || (_type)==ALP_URC_TYPE_LDOWN)\
00357     {\
00358         *(_p)++ = (_ifid);\
00359         *(_p)++ = (_cfg);\
00360     }\
00361     else if((_type)==ALP_URC_TYPE_ITF_BUSY)\
00362     {\
00363         *(_p)++ = (_ifid);\
00364     }\
00365     } while(0)
00366 
00367 #define ALP_ACTION_URCC_DIS(_p,_r,_type,_ifid,_cfg)  do {\
00368     *(_p)++ = (_r)?ALP_OPCODE_URCC+ALP_OPCODE_RESP:ALP_OPCODE_URCC;\
00369     *(_p)++ = (_type);\
00370     if((_type)==ALP_URC_TYPE_LQUAL || (_type)==ALP_URC_TYPE_LDOWN)\
00371     {\
00372         *(_p)++ = (_ifid);\
00373         *(_p)++ = (_cfg);\
00374     }\
00375     else if((_type)==ALP_URC_TYPE_ITF_BUSY)\
00376     {\
00377         *(_p)++ = (_ifid);\
00378     }\
00379     } while(0)
00380 
00381 #define ALP_ACTION_FORWARD_SIZE(s)         (1+(s))
00382 #define ALP_ACTION_FORWARD(p,itf,itfs)    do {\
00383     *(p)++ = ALP_OPCODE_FORWARD | ALP_OPCODE_RESP;\
00384     memcpy((p),(itf),(itfs));(p) += (itfs);\
00385     } while(0)
00386 
00387 #define ALP_ACTION_RSP_F_DATA_SIZE(_o,_l)           (2+ALP_LFIELD_SIZE(_o)+ALP_LFIELD_SIZE(_l)+(_l))
00388 #define ALP_ACTION_RSP_F_DATA_SIZE_MAX(_l)          (2+4+4+(_l))
00389 #define ALP_ACTION_RSP_F_DATA(_p,_fid,_o,_l,_data)  do {\
00390     *(_p)++ = ALP_OPCODE_RSP_F_DATA;\
00391     *(_p)++ = (_fid);\
00392     (_p) += alp_encode_length(_p,_o);\
00393     (_p) += alp_encode_length(_p,_l);\
00394     memcpy((_p),(u8*)(_data),(_l));(_p) += (_l);\
00395     } while(0)
00396 
00397 #define ALP_ACTION_RSP_F_PROP_SIZE                  (2+ALP_FILE_HEADER_SIZE)
00398 #define ALP_ACTION_RSP_F_PROP(_p,_fid,_hdr)  do {\
00399     *(_p)++ = ALP_OPCODE_RSP_F_PROP;\
00400     *(_p)++ = (_fid);\
00401     memcpy((_p),(u8*)(_hdr),ALP_FILE_HEADER_SIZE);(_p) += ALP_FILE_HEADER_SIZE;\
00402     } while(0)
00403 
00404 #define ALP_ACTION_RSP_STATUS_SIZE                  (3)
00405 #define ALP_ACTION_RSP_STATUS(_p,_a,_s)  do {\
00406     *(_p)++ = ALP_OPCODE_RSP_STATUS;\
00407     *(_p)++ = (_a);\
00408     *(_p)++ = (_s);\
00409     } while(0)
00410 
00411 #define ALP_ACTION_RSP_TAG_SIZE                     (2)
00412 #define ALP_ACTION_RSP_TAG(_p,_val,_eop,_err)  do {\
00413     u8 tmp = ALP_OPCODE_RSP_TAG;\
00414     tmp |= (_eop)? ALP_OPCODE_EOP: 0;\
00415     tmp |= (_err)? ALP_OPCODE_ERR: 0;\
00416     *(_p)++ = tmp;\
00417     *(_p)++ = (_val);\
00418     } while(0)
00419 
00420 #define ALP_ACTION_EXT_SIZE(_argc)                  (3+(_argc))
00421 #define ALP_ACTION_EXT(_p,_r,_op,_argc)    do {\
00422     *(_p)++ = (_r)?ALP_OPCODE_EXT+ALP_OPCODE_RESP:ALP_OPCODE_EXT;\
00423     *(_p)++ = (_op);\
00424     *(_p)++ = (_argc);\
00425     } while(0)
00426 
00427 // WIZZILAB Specific Extensions
00428 #define _ALP_ACTION_ACTIVATE_ITF_SIZE               (4)
00429 #define ALP_ACTION_ACTIVATE_ITF_SIZE                (ALP_ACTION_EXT_SIZE(_ALP_ACTION_ACTIVATE_ITF_SIZE))
00430 #define ALP_ACTION_ACTIVATE_ITF(_p,_r,_en,_type,_dev,_ifid,_flag)    do {\
00431     ALP_ACTION_EXT(_p,_r,(_en)?ALP_EXTOPCODE_ITF_START:ALP_EXTOPCODE_ITF_STOP,_ALP_ACTION_ACTIVATE_ITF_SIZE);\
00432     *(p)++ = _type;\
00433     *(p)++ = _dev;\
00434     *(p)++ = _ifid;\
00435     *(p)++ = _flag;\
00436     } while(0)
00437 
00438 #define _ALP_ACTION_F_DECLARE_SIZE                  (1+sizeof(alp_file_header_t))
00439 #define ALP_ACTION_F_DECLARE_SIZE                   (ALP_ACTION_EXT_SIZE(_ALP_ACTION_F_DECLARE_SIZE))
00440 #define ALP_ACTION_F_DECLARE(_p,_r,_fid,_hdr,_dist) do {\
00441     ALP_ACTION_EXT(_p,_r,(_dist)?ALP_EXTOPCODE_F_DECLARE+ALP_EXTOPCODE_DISTANT:ALP_EXTOPCODE_F_DECLARE,_ALP_ACTION_F_DECLARE_SIZE);\
00442     *(_p)++ = (_fid);\
00443     memcpy((_p),(u8*)(_hdr),sizeof(alp_file_header_t));(_p) += sizeof(alp_file_header_t);\
00444     } while(0)
00445 
00446 
00447 // Simple "report/notify" actions. For both, FID,Offset and size will be
00448 // substituted thanks to specific Offset-Operand token
00449 #define ALP_ACTION_REPORT_FULL_FILE { \
00450     ALP_OPCODE_F_RD_DATA | ALP_OPCODE_RESP,\
00451     0, HAL_U16_BE_DEPOSIT(0x4000), 0 }
00452 
00453 #define ALP_ACTION_REPORT_PART_FILE { \
00454     ALP_OPCODE_F_RD_DATA | ALP_OPCODE_RESP,\
00455     0, HAL_U16_BE_DEPOSIT(0x8000), 0 }
00456 
00457 // Simple Query actions
00458 /// Match immediate value to file value
00459 #define ALP_ACTION_QUERY_EQVAL_SIZE(_o,_l,_mbit)    (4+ALP_LFIELD_SIZE(_o)+(1+(_mbit))*(_l))
00460 #define ALP_ACTION_QUERY_EQVAL(_p,_m,_v,_fid,_o,_l,_g)   do {\
00461     u8 _mbit = (_m) ? 1 : 0;\
00462     *(_p)++ = ALP_OPCODE_QUERY | ((_g)? ALP_OPCODE_GROUP: 0);\
00463     *(_p)++ = ALP_QCOMP(ALP_QCOMP_EQ) | ALP_QDATA(ALP_QDATA_UNSIGNED) | ALP_QMASK(_mbit) | ALP_QTYPE(ALP_QTYPE_ACOMP_IMMEDIATE);\
00464     *(_p)++ = _l;\
00465     if (_mbit) {memcpy((_p),&(_m),_l);(_p) += (_l);}\
00466     memcpy((_p),&(_v),_l);(_p) += (_l);\
00467     *(_p)++ = (_fid);\
00468     (_p) += alp_encode_length((_p),(_o));\
00469     } while(0)
00470 
00471 #define ALP_ACTION_QUERY_SIZE(_o,_l,_mbit)    (4+ALP_LFIELD_SIZE(_o)+(1+(_mbit))*(_l))
00472 
00473 /// Match array XXX pass data pointer
00474 #define ALP_ACTION_QUERY_STRTOK(_p,_m,_d,_fid,_o,_l,_g)   do {\
00475     u8 _mbit = (_m) ? 1 : 0;\
00476     *(_p)++ = ALP_OPCODE_QUERY | ((_g)? ALP_OPCODE_GROUP: 0);\
00477     *(_p)++ = ALP_QMASK(_mbit) | ALP_QTYPE(ALP_QTYPE_STR_TOKEN) | ALP_QSTR_PARAM(0);\
00478     *(_p)++ = (_l);\
00479     if (_mbit) {memcpy((_p),&(_m),(_l)); (_p) += (_l);}\
00480     memcpy((_p),(_d),(_l)); (_p) += (_l);\
00481     *(_p)++ = (_fid);\
00482     (_p) += alp_encode_length((_p),(_o));\
00483     } while(0)
00484 
00485 // Query with break actions
00486 #define ALP_ACTION_QBREAK_SIZE(_o,_l,_mbit)    (4+ALP_LFIELD_SIZE(_o)+(1+(_mbit))*(_l))
00487 
00488 /// Compare immediate value to file value
00489 #define ALP_ACTION_QBREAK_COMP(_p,_m,_v,_c,_fid,_o,_l,_g)   do {\
00490     u8 _mbit = (_m) ? 1 : 0;\
00491     *(_p)++ = ALP_OPCODE_QBREAK | ((_g)? ALP_OPCODE_GROUP: 0);\
00492     *(_p)++ = ALP_QCOMP(_c) | ALP_QDATA(ALP_QDATA_UNSIGNED) | ALP_QMASK(_mbit) | ALP_QTYPE(ALP_QTYPE_ACOMP_IMMEDIATE);\
00493     *(_p)++ = (_l);\
00494     if (_mbit) {memcpy((_p),&(_m),(_l));(_p) += (_l);}\
00495     memcpy((_p),&(_v),(_l));(_p) += (_l);\
00496     *(_p)++ = _fid;\
00497     (_p) += alp_encode_length((_p),(_o));\
00498     } while(0)
00499 
00500 /// Match array XXX pass data pointer
00501 #define ALP_ACTION_QBREAK_STRTOK(_p,_m,_d,_fid,_o,_l,_g)   do {\
00502     u8 _mbit = (_m) ? 1 : 0;\
00503     *(_p)++ = ALP_OPCODE_QBREAK | ((_g)? ALP_OPCODE_GROUP: 0);\
00504     *(_p)++ = ALP_QMASK(_mbit) | ALP_QTYPE(ALP_QTYPE_STR_TOKEN) | ALP_QSTR_PARAM(0);\
00505     *(_p)++ = (_l);\
00506     if (_mbit) {memcpy((_p),&(_m),(_l)); (_p) += (_l);}\
00507     memcpy((_p),(_d),(_l)); (_p) += (_l);\
00508     *(_p)++ = (_fid);\
00509     (_p) += alp_encode_length((_p),(_o));\
00510     } while(0)
00511 
00512 #define ALP_ACTION_QLOGIC_SIZE   1
00513 #define ALP_ACTION_QLOGIC(_p,_l) do {\
00514         *(_p)++ = ALP_OPCODE_LOGIC | ALP_QLOGIC(_l);\
00515         } while(0)
00516 
00517 #endif // __ALP_SPEC_H__