Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
alp_spec.h
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__
Generated on Tue Jul 12 2022 13:52:23 by
1.7.2