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.
include/alp_helpers.h@57:5444cfda9889, 2021-01-29 (annotated)
- Committer:
- Jeej
- Date:
- Fri Jan 29 16:36:32 2021 +0000
- Revision:
- 57:5444cfda9889
- Parent:
- 56:67e3d9608403
- Child:
- 59:3b38b5f499db
Sanity commit. Reworked driver version. Partially functional. To be tested with all demo applications.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Jeej | 0:027760f45e2c | 1 | /// @copyright |
| Jeej | 0:027760f45e2c | 2 | /// ========================================================================={{{ |
| Jeej | 56:67e3d9608403 | 3 | /// Copyright (c) 2012-2020 WizziLab / |
| Jeej | 0:027760f45e2c | 4 | /// All rights reserved / |
| Jeej | 0:027760f45e2c | 5 | /// / |
| Jeej | 0:027760f45e2c | 6 | /// =========================================================================}}} |
| Jeej | 0:027760f45e2c | 7 | /// @endcopyright |
| Jeej | 0:027760f45e2c | 8 | |
| Jeej | 0:027760f45e2c | 9 | // ======================================================================= |
| Jeej | 0:027760f45e2c | 10 | /// @file alp_helpers.h |
| Jeej | 0:027760f45e2c | 11 | /// @defgroup ALP |
| Jeej | 0:027760f45e2c | 12 | /// @brief ALP helpers functions |
| Jeej | 0:027760f45e2c | 13 | // ======================================================================= |
| Jeej | 0:027760f45e2c | 14 | |
| Jeej | 0:027760f45e2c | 15 | #ifndef __ALP_HELPERS_H__ |
| Jeej | 0:027760f45e2c | 16 | #define __ALP_HELPERS_H__ |
| Jeej | 0:027760f45e2c | 17 | |
| Jeej | 0:027760f45e2c | 18 | #include "hal_types.h" |
| Jeej | 56:67e3d9608403 | 19 | |
| Jeej | 0:027760f45e2c | 20 | //====================================================================== |
| Jeej | 0:027760f45e2c | 21 | //====================================================================== |
| Jeej | 0:027760f45e2c | 22 | // ALP Helpers |
| Jeej | 0:027760f45e2c | 23 | //====================================================================== |
| Jeej | 0:027760f45e2c | 24 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 25 | |
| Jeej | 56:67e3d9608403 | 26 | // Basic _public container for ALP payload. |
| Jeej | 56:67e3d9608403 | 27 | typedef struct { |
| Jeej | 56:67e3d9608403 | 28 | u32 len; |
| Jeej | 56:67e3d9608403 | 29 | u8 d[1]; |
| Jeej | 56:67e3d9608403 | 30 | } alp_pub_payload_t; |
| Jeej | 56:67e3d9608403 | 31 | |
| Jeej | 57:5444cfda9889 | 32 | // ALP payload (chained list) |
| Jeej | 57:5444cfda9889 | 33 | // Each element contains ONE ALP OP |
| Jeej | 57:5444cfda9889 | 34 | typedef struct _alp_payload_t { |
| Jeej | 57:5444cfda9889 | 35 | u32 len; |
| Jeej | 57:5444cfda9889 | 36 | _alp_payload_t* next; |
| Jeej | 57:5444cfda9889 | 37 | u8 d[1]; |
| Jeej | 57:5444cfda9889 | 38 | } alp_payload_t; |
| Jeej | 57:5444cfda9889 | 39 | |
| Jeej | 0:027760f45e2c | 40 | typedef struct { |
| Jeej | 0:027760f45e2c | 41 | u8* data; // data |
| Jeej | 0:027760f45e2c | 42 | int type; |
| Jeej | 0:027760f45e2c | 43 | union |
| Jeej | 0:027760f45e2c | 44 | { |
| Jeej | 0:027760f45e2c | 45 | struct { |
| Jeej | 0:027760f45e2c | 46 | u32 length; |
| Jeej | 0:027760f45e2c | 47 | u32 offset; |
| Jeej | 0:027760f45e2c | 48 | u8 fid; |
| Jeej | 0:027760f45e2c | 49 | } f_data; |
| Jeej | 0:027760f45e2c | 50 | struct { |
| Jeej | 0:027760f45e2c | 51 | u32 length; |
| Jeej | 0:027760f45e2c | 52 | u32 offset; |
| Jeej | 0:027760f45e2c | 53 | u8 fid; |
| Jeej | 0:027760f45e2c | 54 | } f_prop; |
| Jeej | 0:027760f45e2c | 55 | struct { |
| Jeej | 0:027760f45e2c | 56 | s8 code; |
| Jeej | 0:027760f45e2c | 57 | u8 id; // Action ID |
| Jeej | 0:027760f45e2c | 58 | } status; |
| Jeej | 0:027760f45e2c | 59 | struct { |
| Jeej | 37:f5424d109c6d | 60 | u8 itf; |
| Jeej | 37:f5424d109c6d | 61 | s8 err; |
| Jeej | 37:f5424d109c6d | 62 | } istatus; |
| Jeej | 37:f5424d109c6d | 63 | struct { |
| Jeej | 0:027760f45e2c | 64 | u32 length; |
| Jeej | 0:027760f45e2c | 65 | u8 type; |
| Jeej | 0:027760f45e2c | 66 | } itf; |
| Jeej | 0:027760f45e2c | 67 | struct { |
| Jeej | 0:027760f45e2c | 68 | u8 id; |
| Jeej | 0:027760f45e2c | 69 | u8 eop; |
| Jeej | 0:027760f45e2c | 70 | u8 err; |
| Jeej | 0:027760f45e2c | 71 | } tag; |
| Jeej | 0:027760f45e2c | 72 | struct { |
| Jeej | 41:6f83174ffed4 | 73 | u32 per; |
| Jeej | 0:027760f45e2c | 74 | u8 type; |
| Jeej | 0:027760f45e2c | 75 | u8 ifid; |
| Jeej | 0:027760f45e2c | 76 | } urc; |
| Jeej | 0:027760f45e2c | 77 | } meta; |
| Jeej | 0:027760f45e2c | 78 | } alp_parsed_chunk_t; |
| Jeej | 0:027760f45e2c | 79 | |
| Jeej | 0:027760f45e2c | 80 | //====================================================================== |
| Jeej | 0:027760f45e2c | 81 | // alp_size |
| Jeej | 0:027760f45e2c | 82 | //---------------------------------------------------------------------- |
| Jeej | 0:027760f45e2c | 83 | /// @brief Return payload length of most ALP operations |
| Jeej | 0:027760f45e2c | 84 | /// @param op : ALP Action amongst alp_opcodes_t |
| Jeej | 0:027760f45e2c | 85 | /// @param offset : Associated Offset if relevant |
| Jeej | 0:027760f45e2c | 86 | /// @param size : Associated Size if relevant |
| Jeej | 0:027760f45e2c | 87 | /// @retval payload size in bytes |
| Jeej | 0:027760f45e2c | 88 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 89 | uint alp_size(u8 op, u32 offset, u32 length); |
| Jeej | 0:027760f45e2c | 90 | |
| Jeej | 0:027760f45e2c | 91 | //====================================================================== |
| Jeej | 0:027760f45e2c | 92 | // alp_encode_length |
| Jeej | 0:027760f45e2c | 93 | //---------------------------------------------------------------------- |
| Jeej | 0:027760f45e2c | 94 | /// @brief Encodes an ALP length/offset field |
| Jeej | 0:027760f45e2c | 95 | /// @param p : pointer to the payload buffer |
| Jeej | 0:027760f45e2c | 96 | /// @param len : value to be encoded |
| Jeej | 0:027760f45e2c | 97 | /// @retval resulting payload size in bytes |
| Jeej | 0:027760f45e2c | 98 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 99 | u8 alp_encode_length(u8* p, u32 len); |
| Jeej | 0:027760f45e2c | 100 | |
| Jeej | 0:027760f45e2c | 101 | //====================================================================== |
| Jeej | 0:027760f45e2c | 102 | // alp_encode_length |
| Jeej | 0:027760f45e2c | 103 | //---------------------------------------------------------------------- |
| Jeej | 0:027760f45e2c | 104 | /// @brief Decodes an ALP length/offset field |
| Jeej | 0:027760f45e2c | 105 | /// @param p : pointer to the pointer to payload buffer |
| Jeej | 0:027760f45e2c | 106 | /// @param actp : pointer to ALP's Action Protocol Substitution flag |
| Jeej | 0:027760f45e2c | 107 | /// Result amongst alp_actp_substitution_mode_t |
| Jeej | 0:027760f45e2c | 108 | /// @retval decoded value |
| Jeej | 0:027760f45e2c | 109 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 110 | u32 alp_decode_length(u8** p, u8* actp); |
| Jeej | 0:027760f45e2c | 111 | |
| Jeej | 0:027760f45e2c | 112 | //====================================================================== |
| Jeej | 0:027760f45e2c | 113 | // alp_parse_chunk |
| Jeej | 0:027760f45e2c | 114 | //---------------------------------------------------------------------- |
| Jeej | 0:027760f45e2c | 115 | /// @brief Parses an ALP response payload to a more generic |
| Jeej | 0:027760f45e2c | 116 | /// alp_parsed_chunk_t structure. |
| Jeej | 0:027760f45e2c | 117 | /// @param payload : pointer to the pointer to payload buffer |
| Jeej | 0:027760f45e2c | 118 | /// @param resp : pointer to alp_parsed_chunk_t structure |
| Jeej | 0:027760f45e2c | 119 | /// @retval number of parsed bytes |
| Jeej | 0:027760f45e2c | 120 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 121 | int alp_parse_chunk(u8** payload, alp_parsed_chunk_t* resp); |
| Jeej | 11:a077da5fe68f | 122 | |
| Jeej | 57:5444cfda9889 | 123 | |
| Jeej | 57:5444cfda9889 | 124 | // Utils |
| Jeej | 57:5444cfda9889 | 125 | alp_payload_t* alp_payload_new(u32 size); |
| Jeej | 57:5444cfda9889 | 126 | void alp_payload_free(alp_payload_t* alp); |
| Jeej | 57:5444cfda9889 | 127 | alp_payload_t* alp_payload_append(alp_payload_t* alp_1, alp_payload_t* alp_2); |
| Jeej | 57:5444cfda9889 | 128 | int alp_payload_get_err(alp_payload_t* alp); |
| Jeej | 57:5444cfda9889 | 129 | alp_payload_t* alp_payload_parse(u8* p, int length); |
| Jeej | 57:5444cfda9889 | 130 | void alp_payload_print(alp_payload_t* alp); |
| Jeej | 57:5444cfda9889 | 131 | alp_payload_t* alp_payload_get(alp_payload_t* alp, u8 op); |
| Jeej | 57:5444cfda9889 | 132 | alp_payload_t* alp_payload_extract(alp_payload_t** alp, u8 op); |
| Jeej | 57:5444cfda9889 | 133 | u32 alp_payload_to_buf(alp_payload_t* alp, u8* buf, u32 offset, u32 max); |
| Jeej | 57:5444cfda9889 | 134 | |
| Jeej | 56:67e3d9608403 | 135 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 136 | /// @brief Creates malloc'ed ALP payload |
| Jeej | 57:5444cfda9889 | 137 | /// @param alp alp_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL |
| Jeej | 56:67e3d9608403 | 138 | /// @param ... |
| Jeej | 57:5444cfda9889 | 139 | /// @return alp_payload_t* New ALP payload |
| Jeej | 56:67e3d9608403 | 140 | /// @revent NONE |
| Jeej | 56:67e3d9608403 | 141 | //====================================================================== |
| Jeej | 57:5444cfda9889 | 142 | alp_payload_t* alp_payload_root_auth( alp_payload_t* alp); |
| Jeej | 57:5444cfda9889 | 143 | alp_payload_t* alp_payload_root_auth_enc(alp_payload_t* alp, u8* challenge); |
| Jeej | 57:5444cfda9889 | 144 | alp_payload_t* alp_payload_root_sign( alp_payload_t* alp, u8* iv); |
| Jeej | 57:5444cfda9889 | 145 | alp_payload_t* alp_payload_nop( alp_payload_t* alp); |
| Jeej | 57:5444cfda9889 | 146 | alp_payload_t* alp_payload_forward( alp_payload_t* alp, void* itf); |
| Jeej | 57:5444cfda9889 | 147 | alp_payload_t* alp_payload_tag( alp_payload_t* alp, u8 tag); |
| Jeej | 57:5444cfda9889 | 148 | alp_payload_t* alp_payload_rsp_tag( alp_payload_t* alp, u8 tag, u8 eop, u8 err); |
| Jeej | 57:5444cfda9889 | 149 | alp_payload_t* alp_payload_rsp_f_data( alp_payload_t* alp, u8 fid, void* data, u32 offset, u32 length); |
| Jeej | 57:5444cfda9889 | 150 | //alp_payload_t* alp_payload_rsp_f_data_fs(alp_payload_t* alp, u8 fid, u32 offset, u32 length); |
| Jeej | 57:5444cfda9889 | 151 | alp_payload_t* alp_payload_rsp_status( alp_payload_t* alp, u8 action, s8 status); |
| Jeej | 57:5444cfda9889 | 152 | alp_payload_t* alp_payload_rsp_fprop( alp_payload_t* alp, u8 fid, alp_file_header_t* hdr); |
| Jeej | 57:5444cfda9889 | 153 | alp_payload_t* alp_payload_f_wr_data( alp_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 154 | alp_payload_t* alp_payload_f_wr_data_nr( alp_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 155 | alp_payload_t* alp_payload_f_rd_data( alp_payload_t* alp, u8 fid, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 156 | alp_payload_t* alp_payload_f_flush( alp_payload_t* alp, u8 fid, u8 group); |
| Jeej | 57:5444cfda9889 | 157 | alp_payload_t* alp_payload_f_declare( alp_payload_t* alp, u8 fid, alp_file_header_t* hdr); |
| Jeej | 57:5444cfda9889 | 158 | alp_payload_t* alp_payload_activate_itf( alp_payload_t* alp, uint8_t type, uint8_t nb_dev, uint8_t ifid, uint8_t flags, uint8_t enable); |
| Jeej | 57:5444cfda9889 | 159 | alp_payload_t* alp_payload_urcc_en( alp_payload_t* alp, uint8_t type, uint8_t ifid, uint8_t val); |
| Jeej | 57:5444cfda9889 | 160 | alp_payload_t* alp_payload_query( alp_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 161 | alp_payload_t* alp_payload_qbreak( alp_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 162 | alp_payload_t* alp_payload_qbreak_eq( alp_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 163 | alp_payload_t* alp_payload_qbreak_ne( alp_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 164 | alp_payload_t* alp_payload_qbreak_gt( alp_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 165 | alp_payload_t* alp_payload_qbreak_gte( alp_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 166 | alp_payload_t* alp_payload_qbreak_lt( alp_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 167 | alp_payload_t* alp_payload_qbreak_lte( alp_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group); |
| Jeej | 57:5444cfda9889 | 168 | alp_payload_t* alp_payload_qbreak_eq_msk(alp_payload_t* alp, u8 fid, u32 mask, u32 data, u32 offset, u32 length, u8 group); |
| Jeej | 11:a077da5fe68f | 169 | |
| Jeej | 56:67e3d9608403 | 170 | |
| Jeej | 56:67e3d9608403 | 171 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 172 | /// @brief Parses one OP from a payload. |
| Jeej | 56:67e3d9608403 | 173 | /// Returns at first matching OP. |
| Jeej | 56:67e3d9608403 | 174 | /// Let payload untouched. |
| Jeej | 57:5444cfda9889 | 175 | /// @param alp alp_payload_t* Payload to parse from |
| Jeej | 56:67e3d9608403 | 176 | /// @param op u8 OP to look for |
| Jeej | 56:67e3d9608403 | 177 | /// @param buffer void* Parsed OP |
| Jeej | 56:67e3d9608403 | 178 | /// @return int Size of parsed OP |
| Jeej | 56:67e3d9608403 | 179 | /// @revent NONE |
| Jeej | 56:67e3d9608403 | 180 | //====================================================================== |
| Jeej | 57:5444cfda9889 | 181 | int alp_payload_get(alp_payload_t* alp, u8 op, void* buffer); |
| Jeej | 56:67e3d9608403 | 182 | |
| Jeej | 56:67e3d9608403 | 183 | //====================================================================== |
| Jeej | 56:67e3d9608403 | 184 | /// @brief Parses one OP from a payload. |
| Jeej | 56:67e3d9608403 | 185 | /// Returns at first matching OP. |
| Jeej | 56:67e3d9608403 | 186 | /// Removes parsed OP from the payload. |
| Jeej | 57:5444cfda9889 | 187 | /// @param alp alp_payload_t* Payload to parse from |
| Jeej | 56:67e3d9608403 | 188 | /// @param op u8 OP to look for |
| Jeej | 56:67e3d9608403 | 189 | /// @param buffer void* Parsed OP |
| Jeej | 56:67e3d9608403 | 190 | /// @return int Size of parsed OP |
| Jeej | 56:67e3d9608403 | 191 | /// @revent NONE |
| Jeej | 56:67e3d9608403 | 192 | //====================================================================== |
| Jeej | 57:5444cfda9889 | 193 | int alp_payload_extract(alp_payload_t* alp, u8 op, void* buffer); |
| Jeej | 56:67e3d9608403 | 194 | |
| Jeej | 56:67e3d9608403 | 195 | #endif // __ALP_HELPERS_H__ |