Helper library to use modem_ref driver.
Dependencies: WizziCom WizziDebug ram_fs modem_ref
Dependents: D7A_Localisation D7A_1x_demo_send_file_data_and_forget D7A_1x_demo_CodeUpgradeProtocol D7A_1x_demo_LoRaWAN ... more
modem_d7a.cpp@73:cf4195c72d4e, 2021-07-01 (annotated)
- Committer:
- Jeej
- Date:
- Thu Jul 01 15:23:36 2021 +0000
- Revision:
- 73:cf4195c72d4e
- Parent:
- 72:15bf99fcfed9
- Child:
- 75:dad2f09cb870
Sanity commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jeej | 69:8f2fe2426ef9 | 1 | |
Jeej | 69:8f2fe2426ef9 | 2 | #include "mbed.h" |
Jeej | 68:b2dd7309da44 | 3 | #include "modem_d7a.h" |
Jeej | 68:b2dd7309da44 | 4 | |
Jeej | 68:b2dd7309da44 | 5 | #if 0 |
Jeej | 69:8f2fe2426ef9 | 6 | #define HELPER_PRINT(...) PRINT(__VA_ARGS__) |
Jeej | 68:b2dd7309da44 | 7 | #else |
Jeej | 69:8f2fe2426ef9 | 8 | #define HELPER_PRINT(...); |
Jeej | 68:b2dd7309da44 | 9 | #endif |
Jeej | 68:b2dd7309da44 | 10 | |
Jeej | 68:b2dd7309da44 | 11 | #define MODEM_VERSION_MAJOR 5 |
Jeej | 68:b2dd7309da44 | 12 | #define MODEM_VERSION_MINOR 6 |
Jeej | 68:b2dd7309da44 | 13 | #define MODEM_VERSION_PATCH 0 |
Jeej | 68:b2dd7309da44 | 14 | #define MODEM_DEVICE_ID 0x00001001 |
Jeej | 68:b2dd7309da44 | 15 | |
Jeej | 69:8f2fe2426ef9 | 16 | Semaphore g_s[MAX_USER_NB]; |
Jeej | 68:b2dd7309da44 | 17 | |
Jeej | 68:b2dd7309da44 | 18 | static WizziCom* g_modem_com; |
Jeej | 68:b2dd7309da44 | 19 | |
Jeej | 68:b2dd7309da44 | 20 | // Callback for id User |
Jeej | 68:b2dd7309da44 | 21 | static void modem_cb(uint8_t terminal, int8_t err, uint8_t id) |
Jeej | 68:b2dd7309da44 | 22 | { |
Jeej | 68:b2dd7309da44 | 23 | (void)id; |
Jeej | 68:b2dd7309da44 | 24 | |
Jeej | 70:753b602bd7bd | 25 | //PRINT("CB EOP:%d ERR:%d ID:%d\n", terminal, err, id); |
Jeej | 69:8f2fe2426ef9 | 26 | |
Jeej | 68:b2dd7309da44 | 27 | if (terminal) |
Jeej | 68:b2dd7309da44 | 28 | { |
Jeej | 69:8f2fe2426ef9 | 29 | g_s[id].release(); |
Jeej | 68:b2dd7309da44 | 30 | } |
Jeej | 68:b2dd7309da44 | 31 | } |
Jeej | 68:b2dd7309da44 | 32 | |
Jeej | 68:b2dd7309da44 | 33 | static int g_boot_nb; |
Jeej | 68:b2dd7309da44 | 34 | static int g_read_nb; |
Jeej | 68:b2dd7309da44 | 35 | static int g_swr_nb; |
Jeej | 68:b2dd7309da44 | 36 | static int g_hwr_nb; |
Jeej | 68:b2dd7309da44 | 37 | static int g_pwc_nb; |
Jeej | 68:b2dd7309da44 | 38 | static int g_fail_nb; |
Jeej | 68:b2dd7309da44 | 39 | |
Jeej | 68:b2dd7309da44 | 40 | int modem_wait_resp(Semaphore* s, uint32_t timeout, char* function, uint32_t line) |
Jeej | 68:b2dd7309da44 | 41 | { |
Jeej | 68:b2dd7309da44 | 42 | if (!s->try_acquire_for(timeout)) |
Jeej | 68:b2dd7309da44 | 43 | { |
Jeej | 68:b2dd7309da44 | 44 | PRINT("%s:%d: Modem resp timeout after %d ms\n", function, line, timeout); |
Jeej | 68:b2dd7309da44 | 45 | return -1; |
Jeej | 68:b2dd7309da44 | 46 | } |
Jeej | 69:8f2fe2426ef9 | 47 | |
Jeej | 68:b2dd7309da44 | 48 | return 0; |
Jeej | 68:b2dd7309da44 | 49 | } |
Jeej | 68:b2dd7309da44 | 50 | |
Jeej | 68:b2dd7309da44 | 51 | int my_alp_itf_d7a_cfg_size(d7a_sp_cfg_t* cfg) |
Jeej | 68:b2dd7309da44 | 52 | { |
Jeej | 68:b2dd7309da44 | 53 | int size = sizeof(d7a_sp_cfg_t) - sizeof(d7a_addressee_t); |
Jeej | 68:b2dd7309da44 | 54 | size += D7A_ADDR_LEN(cfg->addressee.ctrl); |
Jeej | 68:b2dd7309da44 | 55 | return size; |
Jeej | 68:b2dd7309da44 | 56 | } |
Jeej | 68:b2dd7309da44 | 57 | |
Jeej | 68:b2dd7309da44 | 58 | // ============================================================}}} |
Jeej | 68:b2dd7309da44 | 59 | |
Jeej | 68:b2dd7309da44 | 60 | // Serial adapters to WizziLab's own architecture |
Jeej | 68:b2dd7309da44 | 61 | // ============================================================{{{ |
Jeej | 68:b2dd7309da44 | 62 | |
Jeej | 68:b2dd7309da44 | 63 | static void modem_serial_input(WizziCom* com, WizziComPacket_t* pkt) |
Jeej | 68:b2dd7309da44 | 64 | { |
Jeej | 68:b2dd7309da44 | 65 | modem_ref_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length); |
Jeej | 68:b2dd7309da44 | 66 | } |
Jeej | 68:b2dd7309da44 | 67 | |
Jeej | 69:8f2fe2426ef9 | 68 | static int modem_serial_send(uint8_t type, uint8_t* data, uint8_t size) |
Jeej | 68:b2dd7309da44 | 69 | { |
Jeej | 69:8f2fe2426ef9 | 70 | // Retrieve Flow ID from header and send packet |
Jeej | 69:8f2fe2426ef9 | 71 | g_modem_com->send((WizziComPacketType)type, size, data); |
Jeej | 68:b2dd7309da44 | 72 | |
Jeej | 69:8f2fe2426ef9 | 73 | return size; |
Jeej | 68:b2dd7309da44 | 74 | } |
Jeej | 68:b2dd7309da44 | 75 | |
Jeej | 68:b2dd7309da44 | 76 | Semaphore boot(0); |
Jeej | 68:b2dd7309da44 | 77 | void my_startup_boot(u8 cause, u16 number) |
Jeej | 68:b2dd7309da44 | 78 | { |
Jeej | 68:b2dd7309da44 | 79 | HELPER_PRINT("Modem BOOT[%c] #%d\r\n", cause, number); |
Jeej | 68:b2dd7309da44 | 80 | boot.release(); |
Jeej | 68:b2dd7309da44 | 81 | } |
Jeej | 68:b2dd7309da44 | 82 | |
Jeej | 68:b2dd7309da44 | 83 | int modem_open(modem_ref_callbacks_t* callbacks) |
Jeej | 68:b2dd7309da44 | 84 | { |
Jeej | 68:b2dd7309da44 | 85 | static union { |
Jeej | 68:b2dd7309da44 | 86 | uint8_t b[8]; |
Jeej | 68:b2dd7309da44 | 87 | uint32_t w[2]; |
Jeej | 68:b2dd7309da44 | 88 | } uid; |
Jeej | 68:b2dd7309da44 | 89 | revision_t rev; |
Jeej | 68:b2dd7309da44 | 90 | int err; |
Jeej | 68:b2dd7309da44 | 91 | |
Jeej | 69:8f2fe2426ef9 | 92 | //for (int i = 0; i < MAX_USER_NB; i++) |
Jeej | 69:8f2fe2426ef9 | 93 | //{ |
Jeej | 69:8f2fe2426ef9 | 94 | //g_s[i] = Semaphore(0); |
Jeej | 69:8f2fe2426ef9 | 95 | //} |
Jeej | 69:8f2fe2426ef9 | 96 | |
Jeej | 68:b2dd7309da44 | 97 | g_boot_nb++; |
Jeej | 69:8f2fe2426ef9 | 98 | |
Jeej | 68:b2dd7309da44 | 99 | // Override boot callback to catch the first boot message |
Jeej | 68:b2dd7309da44 | 100 | modem_ref_callbacks_t boot_callbacks = { |
Jeej | 68:b2dd7309da44 | 101 | .read = NULL, |
Jeej | 68:b2dd7309da44 | 102 | .write = NULL, |
Jeej | 68:b2dd7309da44 | 103 | .read_fprop = NULL, |
Jeej | 68:b2dd7309da44 | 104 | .flush = NULL, |
Jeej | 68:b2dd7309da44 | 105 | .remove = NULL, |
Jeej | 68:b2dd7309da44 | 106 | .udata = NULL, |
Jeej | 68:b2dd7309da44 | 107 | .lqual = NULL, |
Jeej | 68:b2dd7309da44 | 108 | .ldown = NULL, |
Jeej | 68:b2dd7309da44 | 109 | .reset = NULL, |
Jeej | 68:b2dd7309da44 | 110 | .boot = my_startup_boot, |
Jeej | 68:b2dd7309da44 | 111 | .busy = NULL, |
Jeej | 68:b2dd7309da44 | 112 | .itf_busy = NULL, |
Jeej | 68:b2dd7309da44 | 113 | }; |
Jeej | 69:8f2fe2426ef9 | 114 | |
Jeej | 68:b2dd7309da44 | 115 | // Open modem Com port |
Jeej | 68:b2dd7309da44 | 116 | g_modem_com = new WizziCom(MODEM_PIN_RX, MODEM_PIN_TX, MODEM_PIN_IRQ_IN, MODEM_PIN_IRQ_OUT); |
Jeej | 69:8f2fe2426ef9 | 117 | |
Jeej | 68:b2dd7309da44 | 118 | // open with user callbacks |
Jeej | 68:b2dd7309da44 | 119 | modem_ref_open(modem_serial_send, callbacks); |
Jeej | 69:8f2fe2426ef9 | 120 | |
Jeej | 68:b2dd7309da44 | 121 | // Redirect All Port traffic to modem_serial_input |
Jeej | 68:b2dd7309da44 | 122 | g_modem_com->attach(modem_serial_input, WizziComPacketUntreated); |
Jeej | 68:b2dd7309da44 | 123 | |
Jeej | 68:b2dd7309da44 | 124 | // Wait for modem power up |
Jeej | 68:b2dd7309da44 | 125 | ThisThread::sleep_for(100); |
Jeej | 69:8f2fe2426ef9 | 126 | |
Jeej | 68:b2dd7309da44 | 127 | // Try reading UID |
Jeej | 68:b2dd7309da44 | 128 | err = modem_read_file(D7A_FID_UID, uid.b, 0, 8); |
Jeej | 69:8f2fe2426ef9 | 129 | |
Jeej | 68:b2dd7309da44 | 130 | if (ALP_ERR_NONE > err) |
Jeej | 68:b2dd7309da44 | 131 | { |
Jeej | 68:b2dd7309da44 | 132 | PRINT("Trying software reset...\n"); |
Jeej | 69:8f2fe2426ef9 | 133 | |
Jeej | 68:b2dd7309da44 | 134 | // Open driver to catch boot packet |
Jeej | 68:b2dd7309da44 | 135 | modem_ref_close(); |
Jeej | 68:b2dd7309da44 | 136 | modem_ref_open(NULL, &boot_callbacks); |
Jeej | 69:8f2fe2426ef9 | 137 | |
Jeej | 68:b2dd7309da44 | 138 | // Try software reset |
Jeej | 68:b2dd7309da44 | 139 | g_modem_com->send(WizziComPacketSysReset, 0, NULL); |
Jeej | 69:8f2fe2426ef9 | 140 | |
Jeej | 68:b2dd7309da44 | 141 | if (!boot.try_acquire_for(1000)) |
Jeej | 68:b2dd7309da44 | 142 | { |
Jeej | 68:b2dd7309da44 | 143 | PRINT("Trying hardware reset...\n"); |
Jeej | 69:8f2fe2426ef9 | 144 | |
Jeej | 68:b2dd7309da44 | 145 | // Assert reset pin |
Jeej | 68:b2dd7309da44 | 146 | DigitalOut reset_low(MODEM_PIN_RESET, 0); |
Jeej | 68:b2dd7309da44 | 147 | ThisThread::sleep_for(100); |
Jeej | 69:8f2fe2426ef9 | 148 | |
Jeej | 68:b2dd7309da44 | 149 | // Release reset pin |
Jeej | 68:b2dd7309da44 | 150 | DigitalIn reset_release(MODEM_PIN_RESET); |
Jeej | 69:8f2fe2426ef9 | 151 | |
Jeej | 68:b2dd7309da44 | 152 | if (!boot.try_acquire_for(1000)) |
Jeej | 68:b2dd7309da44 | 153 | { |
Jeej | 72:15bf99fcfed9 | 154 | #if 0 |
Jeej | 68:b2dd7309da44 | 155 | // Modem not responding! |
Jeej | 68:b2dd7309da44 | 156 | PRINT("Trying power cycle.\n"); |
Jeej | 69:8f2fe2426ef9 | 157 | |
Jeej | 68:b2dd7309da44 | 158 | // Assert power pin |
Jeej | 68:b2dd7309da44 | 159 | DigitalOut power_high(D12, 1); |
Jeej | 68:b2dd7309da44 | 160 | ThisThread::sleep_for(1000); |
Jeej | 69:8f2fe2426ef9 | 161 | |
Jeej | 68:b2dd7309da44 | 162 | // Release reset pin |
Jeej | 68:b2dd7309da44 | 163 | DigitalIn power_release(D12); |
Jeej | 69:8f2fe2426ef9 | 164 | |
Jeej | 72:15bf99fcfed9 | 165 | if (boot.try_acquire_for(1000)) |
Jeej | 72:15bf99fcfed9 | 166 | { |
Jeej | 72:15bf99fcfed9 | 167 | g_pwc_nb++; |
Jeej | 72:15bf99fcfed9 | 168 | PRINT("Modem is up after power cycle.\n"); |
Jeej | 72:15bf99fcfed9 | 169 | } |
Jeej | 72:15bf99fcfed9 | 170 | else |
Jeej | 72:15bf99fcfed9 | 171 | #endif |
Jeej | 68:b2dd7309da44 | 172 | { |
Jeej | 68:b2dd7309da44 | 173 | // Modem not responding! |
Jeej | 68:b2dd7309da44 | 174 | g_fail_nb++; |
Jeej | 68:b2dd7309da44 | 175 | PRINT("Failed to open modem.\n"); |
Jeej | 68:b2dd7309da44 | 176 | return -1; |
Jeej | 68:b2dd7309da44 | 177 | } |
Jeej | 68:b2dd7309da44 | 178 | } |
Jeej | 68:b2dd7309da44 | 179 | else |
Jeej | 68:b2dd7309da44 | 180 | { |
Jeej | 68:b2dd7309da44 | 181 | g_hwr_nb++; |
Jeej | 68:b2dd7309da44 | 182 | PRINT("Modem is up after hardware reset.\n"); |
Jeej | 68:b2dd7309da44 | 183 | } |
Jeej | 68:b2dd7309da44 | 184 | } |
Jeej | 68:b2dd7309da44 | 185 | else |
Jeej | 68:b2dd7309da44 | 186 | { |
Jeej | 68:b2dd7309da44 | 187 | g_swr_nb++; |
Jeej | 68:b2dd7309da44 | 188 | PRINT("Modem is up after software reset.\n"); |
Jeej | 68:b2dd7309da44 | 189 | } |
Jeej | 69:8f2fe2426ef9 | 190 | |
Jeej | 69:8f2fe2426ef9 | 191 | // Re-open with user callbacks |
Jeej | 69:8f2fe2426ef9 | 192 | modem_ref_close(); |
Jeej | 69:8f2fe2426ef9 | 193 | modem_ref_open(modem_serial_send, callbacks); |
Jeej | 68:b2dd7309da44 | 194 | } |
Jeej | 68:b2dd7309da44 | 195 | else |
Jeej | 68:b2dd7309da44 | 196 | { |
Jeej | 68:b2dd7309da44 | 197 | g_read_nb++; |
Jeej | 68:b2dd7309da44 | 198 | PRINT("Modem is up.\n"); |
Jeej | 68:b2dd7309da44 | 199 | } |
Jeej | 69:8f2fe2426ef9 | 200 | |
Jeej | 68:b2dd7309da44 | 201 | PRINT("Boot stats: boot:%d read:%d swr:%d hwr:%d pwc:%d fail:%d\n", g_boot_nb, g_read_nb, g_swr_nb, g_hwr_nb, g_pwc_nb, g_fail_nb); |
Jeej | 69:8f2fe2426ef9 | 202 | |
Jeej | 69:8f2fe2426ef9 | 203 | ThisThread::sleep_for(100); |
Jeej | 69:8f2fe2426ef9 | 204 | |
Jeej | 68:b2dd7309da44 | 205 | modem_read_file(D7A_FID_UID, uid.b, 0, 8); |
Jeej | 68:b2dd7309da44 | 206 | modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t)); |
Jeej | 69:8f2fe2426ef9 | 207 | |
Jeej | 68:b2dd7309da44 | 208 | PRINT("------------ D7A Modem infos ------------\r\n"); |
Jeej | 68:b2dd7309da44 | 209 | PRINT_DATA(" - UID: ", "%02X", uid.b, 8, "\r\n"); |
Jeej | 68:b2dd7309da44 | 210 | PRINT(" - Manufacturer ID: %08X\r\n", rev.manufacturer_id); |
Jeej | 68:b2dd7309da44 | 211 | PRINT(" - Device ID: %08X\r\n", rev.device_id); |
Jeej | 68:b2dd7309da44 | 212 | PRINT(" - Hardware version: %08X\r\n", rev.hw_version); |
Jeej | 68:b2dd7309da44 | 213 | PRINT(" - Firmware version: v%d.%d.%d [%02X]\r\n", rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.id); |
Jeej | 68:b2dd7309da44 | 214 | PRINT(" - CUP max size: %d\r\n", rev.cup_max_size); |
Jeej | 68:b2dd7309da44 | 215 | PRINT("-----------------------------------------\r\n"); |
Jeej | 69:8f2fe2426ef9 | 216 | FLUSH(); |
Jeej | 69:8f2fe2426ef9 | 217 | |
Jeej | 68:b2dd7309da44 | 218 | if (MODEM_DEVICE_ID == rev.device_id) |
Jeej | 68:b2dd7309da44 | 219 | { |
Jeej | 68:b2dd7309da44 | 220 | // Check version |
Jeej | 68:b2dd7309da44 | 221 | uint32_t rev_sum1 = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch; |
Jeej | 68:b2dd7309da44 | 222 | uint32_t rev_sum2 = (MODEM_VERSION_MAJOR << 24) | (MODEM_VERSION_MINOR << 16) | MODEM_VERSION_PATCH; |
Jeej | 68:b2dd7309da44 | 223 | if (rev_sum1 < rev_sum2) |
Jeej | 68:b2dd7309da44 | 224 | { |
Jeej | 68:b2dd7309da44 | 225 | PRINT("\r\nYou need a modem at version %d.%d.%d or above to use this Driver.\r\n" |
Jeej | 69:8f2fe2426ef9 | 226 | "You can:\r\n" |
Jeej | 69:8f2fe2426ef9 | 227 | " - Check modem updates on the Dash7Board:\r\n" |
Jeej | 69:8f2fe2426ef9 | 228 | " Go to your site's version manager.\r\n" |
Jeej | 69:8f2fe2426ef9 | 229 | " - Check modem updates by importing:\r\n" |
Jeej | 69:8f2fe2426ef9 | 230 | " https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\r\n" |
Jeej | 69:8f2fe2426ef9 | 231 | " - Choose the right 'modem_ref_helper' revision.\r\n" |
Jeej | 69:8f2fe2426ef9 | 232 | " Right click on modem_ref_helper -> Revision.\r\n" |
Jeej | 69:8f2fe2426ef9 | 233 | , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR, MODEM_VERSION_PATCH); |
Jeej | 69:8f2fe2426ef9 | 234 | |
Jeej | 68:b2dd7309da44 | 235 | ThisThread::sleep_for(osWaitForever); |
Jeej | 68:b2dd7309da44 | 236 | } |
Jeej | 68:b2dd7309da44 | 237 | } |
Jeej | 68:b2dd7309da44 | 238 | else |
Jeej | 68:b2dd7309da44 | 239 | { |
Jeej | 68:b2dd7309da44 | 240 | // Do not check version |
Jeej | 68:b2dd7309da44 | 241 | PRINT("/!\\ Not a modem firmware /!\\\r\n"); |
Jeej | 68:b2dd7309da44 | 242 | } |
Jeej | 69:8f2fe2426ef9 | 243 | |
Jeej | 68:b2dd7309da44 | 244 | return 0; |
Jeej | 68:b2dd7309da44 | 245 | } |
Jeej | 68:b2dd7309da44 | 246 | |
Jeej | 68:b2dd7309da44 | 247 | int modem_close(void) |
Jeej | 68:b2dd7309da44 | 248 | { |
Jeej | 68:b2dd7309da44 | 249 | modem_ref_close(); |
Jeej | 68:b2dd7309da44 | 250 | delete g_modem_com; |
Jeej | 69:8f2fe2426ef9 | 251 | |
Jeej | 68:b2dd7309da44 | 252 | return 0; |
Jeej | 68:b2dd7309da44 | 253 | } |
Jeej | 68:b2dd7309da44 | 254 | |
Jeej | 69:8f2fe2426ef9 | 255 | static int _modem_d7a_send(void* itf, alp_payload_t* alp, alp_payload_t** alp_rsp, uint32_t timeout) |
Jeej | 68:b2dd7309da44 | 256 | { |
Jeej | 69:8f2fe2426ef9 | 257 | u8 id = modem_ref_get_id(modem_cb); |
Jeej | 68:b2dd7309da44 | 258 | int err = ALP_ERR_UNKNOWN; |
Jeej | 70:753b602bd7bd | 259 | |
Jeej | 70:753b602bd7bd | 260 | // Make sure Semaphore is taken |
Jeej | 70:753b602bd7bd | 261 | g_s[id].try_acquire(); |
Jeej | 69:8f2fe2426ef9 | 262 | |
Jeej | 69:8f2fe2426ef9 | 263 | modem_ref_alp(itf, alp, alp_rsp, id); |
Jeej | 69:8f2fe2426ef9 | 264 | if (!g_s[id].try_acquire_for(timeout)) |
Jeej | 69:8f2fe2426ef9 | 265 | { |
Jeej | 69:8f2fe2426ef9 | 266 | err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 267 | } |
Jeej | 69:8f2fe2426ef9 | 268 | else |
Jeej | 69:8f2fe2426ef9 | 269 | { |
Jeej | 69:8f2fe2426ef9 | 270 | err = ALP_ERR_NONE; |
Jeej | 69:8f2fe2426ef9 | 271 | } |
Jeej | 69:8f2fe2426ef9 | 272 | |
Jeej | 68:b2dd7309da44 | 273 | modem_ref_free_id(id); |
Jeej | 69:8f2fe2426ef9 | 274 | |
Jeej | 68:b2dd7309da44 | 275 | return err; |
Jeej | 68:b2dd7309da44 | 276 | } |
Jeej | 68:b2dd7309da44 | 277 | |
Jeej | 69:8f2fe2426ef9 | 278 | static int _modem_get_istatus(alp_payload_t* alp, void* istatus) |
Jeej | 69:8f2fe2426ef9 | 279 | { |
Jeej | 69:8f2fe2426ef9 | 280 | alp_payload_t* alp_tmp = alp_payload_get(alp, ALP_OPCODE_RSP_ISTATUS); |
Jeej | 69:8f2fe2426ef9 | 281 | |
Jeej | 69:8f2fe2426ef9 | 282 | if (alp_tmp) |
Jeej | 69:8f2fe2426ef9 | 283 | { |
Jeej | 69:8f2fe2426ef9 | 284 | alp_parsed_chunk_t r; |
Jeej | 69:8f2fe2426ef9 | 285 | u8* p = alp_tmp->d; |
Jeej | 69:8f2fe2426ef9 | 286 | |
Jeej | 69:8f2fe2426ef9 | 287 | alp_parse_chunk(&p, &r); |
Jeej | 69:8f2fe2426ef9 | 288 | memcpy(istatus, r.data, r.meta.itf.length); |
Jeej | 69:8f2fe2426ef9 | 289 | |
Jeej | 69:8f2fe2426ef9 | 290 | return ALP_ERR_NONE; |
Jeej | 69:8f2fe2426ef9 | 291 | } |
Jeej | 69:8f2fe2426ef9 | 292 | else |
Jeej | 69:8f2fe2426ef9 | 293 | { |
Jeej | 69:8f2fe2426ef9 | 294 | PRINT("No metadata\n"); |
Jeej | 69:8f2fe2426ef9 | 295 | } |
Jeej | 69:8f2fe2426ef9 | 296 | |
Jeej | 69:8f2fe2426ef9 | 297 | return ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 298 | } |
Jeej | 69:8f2fe2426ef9 | 299 | |
Jeej | 69:8f2fe2426ef9 | 300 | int modem_raw_alp(alp_payload_t* alp, alp_payload_t** alp_rsp, uint32_t timeout) |
Jeej | 68:b2dd7309da44 | 301 | { |
Jeej | 69:8f2fe2426ef9 | 302 | return _modem_d7a_send(NULL, alp, alp_rsp, timeout); |
Jeej | 69:8f2fe2426ef9 | 303 | } |
Jeej | 69:8f2fe2426ef9 | 304 | |
Jeej | 69:8f2fe2426ef9 | 305 | int modem_remote_raw_alp(void* itf, alp_payload_t* alp, alp_payload_t** alp_rsp, uint32_t timeout) |
Jeej | 69:8f2fe2426ef9 | 306 | { |
Jeej | 69:8f2fe2426ef9 | 307 | return _modem_d7a_send(itf, alp, alp_rsp, timeout); |
Jeej | 69:8f2fe2426ef9 | 308 | } |
Jeej | 69:8f2fe2426ef9 | 309 | |
Jeej | 69:8f2fe2426ef9 | 310 | int modem_send_alp(void* itf, void *istatus, alp_payload_t* alp, uint32_t timeout) |
Jeej | 69:8f2fe2426ef9 | 311 | { |
Jeej | 68:b2dd7309da44 | 312 | int err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 313 | alp_payload_t* alp_rsp = NULL; |
Jeej | 69:8f2fe2426ef9 | 314 | alp_payload_t* alp_tmp = NULL; |
Jeej | 69:8f2fe2426ef9 | 315 | |
Jeej | 69:8f2fe2426ef9 | 316 | err = _modem_d7a_send(NULL, alp, &alp_rsp, timeout); |
Jeej | 69:8f2fe2426ef9 | 317 | |
Jeej | 69:8f2fe2426ef9 | 318 | do { |
Jeej | 69:8f2fe2426ef9 | 319 | if (ALP_ERR_NONE > err) { PRINT("Send ALP timeout\n"); break; } |
Jeej | 69:8f2fe2426ef9 | 320 | |
Jeej | 69:8f2fe2426ef9 | 321 | err = alp_payload_get_err(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 322 | |
Jeej | 69:8f2fe2426ef9 | 323 | if (ALP_ERR_NONE > err) { PRINT("Send ALP err %d\n", err); break; } |
Jeej | 69:8f2fe2426ef9 | 324 | |
Jeej | 69:8f2fe2426ef9 | 325 | if (istatus) |
Jeej | 69:8f2fe2426ef9 | 326 | { |
Jeej | 69:8f2fe2426ef9 | 327 | _modem_get_istatus(alp_rsp, istatus); |
Jeej | 69:8f2fe2426ef9 | 328 | } |
Jeej | 68:b2dd7309da44 | 329 | |
Jeej | 69:8f2fe2426ef9 | 330 | } while (0); |
Jeej | 69:8f2fe2426ef9 | 331 | |
Jeej | 69:8f2fe2426ef9 | 332 | alp_payload_free(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 333 | |
Jeej | 69:8f2fe2426ef9 | 334 | return err; |
Jeej | 69:8f2fe2426ef9 | 335 | } |
Jeej | 69:8f2fe2426ef9 | 336 | |
Jeej | 69:8f2fe2426ef9 | 337 | static int _modem_read_file(uint8_t* itf, void *istatus, uint8_t fid, void *data, uint32_t offset, uint32_t length, uint32_t timeout) |
Jeej | 69:8f2fe2426ef9 | 338 | { |
Jeej | 69:8f2fe2426ef9 | 339 | int err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 340 | alp_payload_t* alp = NULL; |
Jeej | 69:8f2fe2426ef9 | 341 | alp_payload_t* alp_rsp = NULL; |
Jeej | 69:8f2fe2426ef9 | 342 | alp_payload_t* alp_tmp = NULL; |
Jeej | 69:8f2fe2426ef9 | 343 | |
Jeej | 69:8f2fe2426ef9 | 344 | alp = alp_payload_f_rd_data(NULL, fid, offset, length, false); |
Jeej | 69:8f2fe2426ef9 | 345 | |
Jeej | 69:8f2fe2426ef9 | 346 | err = _modem_d7a_send(NULL, alp, &alp_rsp, timeout); |
Jeej | 68:b2dd7309da44 | 347 | |
Jeej | 69:8f2fe2426ef9 | 348 | do { |
Jeej | 69:8f2fe2426ef9 | 349 | if (ALP_ERR_NONE > err) { PRINT("Read file timeout\n"); break; } |
Jeej | 69:8f2fe2426ef9 | 350 | |
Jeej | 69:8f2fe2426ef9 | 351 | err = alp_payload_get_err(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 352 | |
Jeej | 69:8f2fe2426ef9 | 353 | if (ALP_ERR_NONE > err) { PRINT("Read file err %d\n", err); break; } |
Jeej | 69:8f2fe2426ef9 | 354 | |
Jeej | 69:8f2fe2426ef9 | 355 | alp_tmp = alp_payload_get(alp_rsp, ALP_OPCODE_RSP_F_DATA); |
Jeej | 69:8f2fe2426ef9 | 356 | if (alp_tmp) |
Jeej | 69:8f2fe2426ef9 | 357 | { |
Jeej | 69:8f2fe2426ef9 | 358 | alp_parsed_chunk_t r; |
Jeej | 69:8f2fe2426ef9 | 359 | u8* p = alp_tmp->d; |
Jeej | 69:8f2fe2426ef9 | 360 | |
Jeej | 69:8f2fe2426ef9 | 361 | alp_parse_chunk(&p, &r); |
Jeej | 69:8f2fe2426ef9 | 362 | memcpy(data, r.data, r.meta.f_data.length); |
Jeej | 69:8f2fe2426ef9 | 363 | } |
Jeej | 69:8f2fe2426ef9 | 364 | else |
Jeej | 69:8f2fe2426ef9 | 365 | { |
Jeej | 69:8f2fe2426ef9 | 366 | PRINT("Read file no payload\n"); |
Jeej | 69:8f2fe2426ef9 | 367 | err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 368 | break; |
Jeej | 69:8f2fe2426ef9 | 369 | } |
Jeej | 69:8f2fe2426ef9 | 370 | |
Jeej | 69:8f2fe2426ef9 | 371 | if (istatus) |
Jeej | 69:8f2fe2426ef9 | 372 | { |
Jeej | 69:8f2fe2426ef9 | 373 | _modem_get_istatus(alp_rsp, istatus); |
Jeej | 69:8f2fe2426ef9 | 374 | } |
Jeej | 68:b2dd7309da44 | 375 | |
Jeej | 69:8f2fe2426ef9 | 376 | } while (0); |
Jeej | 69:8f2fe2426ef9 | 377 | |
Jeej | 69:8f2fe2426ef9 | 378 | alp_payload_free(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 379 | |
Jeej | 69:8f2fe2426ef9 | 380 | return err; |
Jeej | 69:8f2fe2426ef9 | 381 | } |
Jeej | 69:8f2fe2426ef9 | 382 | |
Jeej | 69:8f2fe2426ef9 | 383 | static int _modem_write_file(uint8_t* itf, void *istatus, uint8_t fid, void *data, uint32_t offset, uint32_t length, uint32_t timeout) |
Jeej | 69:8f2fe2426ef9 | 384 | { |
Jeej | 69:8f2fe2426ef9 | 385 | int err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 386 | alp_payload_t* alp = NULL; |
Jeej | 69:8f2fe2426ef9 | 387 | alp_payload_t* alp_rsp = NULL; |
Jeej | 69:8f2fe2426ef9 | 388 | alp_payload_t* alp_tmp = NULL; |
Jeej | 69:8f2fe2426ef9 | 389 | |
Jeej | 69:8f2fe2426ef9 | 390 | alp = alp_payload_f_wr_data(NULL, fid, data, offset, length, false); |
Jeej | 69:8f2fe2426ef9 | 391 | |
Jeej | 69:8f2fe2426ef9 | 392 | err = _modem_d7a_send(NULL, alp, &alp_rsp, timeout); |
Jeej | 69:8f2fe2426ef9 | 393 | |
Jeej | 69:8f2fe2426ef9 | 394 | do { |
Jeej | 69:8f2fe2426ef9 | 395 | if (ALP_ERR_NONE > err) { PRINT("Write file timeout\n"); break; } |
Jeej | 69:8f2fe2426ef9 | 396 | |
Jeej | 69:8f2fe2426ef9 | 397 | err = alp_payload_get_err(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 398 | |
Jeej | 69:8f2fe2426ef9 | 399 | if (ALP_ERR_NONE > err) { PRINT("Write file err %d\n", err); break; } |
Jeej | 69:8f2fe2426ef9 | 400 | |
Jeej | 69:8f2fe2426ef9 | 401 | if (istatus) |
Jeej | 69:8f2fe2426ef9 | 402 | { |
Jeej | 69:8f2fe2426ef9 | 403 | _modem_get_istatus(alp_rsp, istatus); |
Jeej | 69:8f2fe2426ef9 | 404 | } |
Jeej | 69:8f2fe2426ef9 | 405 | |
Jeej | 69:8f2fe2426ef9 | 406 | } while (0); |
Jeej | 69:8f2fe2426ef9 | 407 | |
Jeej | 69:8f2fe2426ef9 | 408 | alp_payload_free(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 409 | |
Jeej | 68:b2dd7309da44 | 410 | return err; |
Jeej | 68:b2dd7309da44 | 411 | } |
Jeej | 68:b2dd7309da44 | 412 | |
Jeej | 68:b2dd7309da44 | 413 | int modem_read_file(uint8_t fid, void *data, uint32_t offset, uint32_t length) |
Jeej | 68:b2dd7309da44 | 414 | { |
Jeej | 69:8f2fe2426ef9 | 415 | return _modem_read_file(NULL, NULL, fid, data, offset, length, MODEM_TIMEOUT); |
Jeej | 68:b2dd7309da44 | 416 | } |
Jeej | 68:b2dd7309da44 | 417 | |
Jeej | 69:8f2fe2426ef9 | 418 | int modem_remote_read_file(uint8_t* itf, void *istatus, uint8_t fid, void *data, uint32_t offset, uint32_t length, uint32_t timeout) |
Jeej | 68:b2dd7309da44 | 419 | { |
Jeej | 69:8f2fe2426ef9 | 420 | return _modem_read_file(itf, istatus, fid, data, offset, length, timeout); |
Jeej | 68:b2dd7309da44 | 421 | } |
Jeej | 68:b2dd7309da44 | 422 | |
Jeej | 68:b2dd7309da44 | 423 | int modem_write_file(uint8_t fid, void *data, uint32_t offset, uint32_t length) |
Jeej | 68:b2dd7309da44 | 424 | { |
Jeej | 69:8f2fe2426ef9 | 425 | return _modem_write_file(NULL, NULL, fid, data, offset, length, MODEM_TIMEOUT); |
Jeej | 68:b2dd7309da44 | 426 | } |
Jeej | 68:b2dd7309da44 | 427 | |
Jeej | 69:8f2fe2426ef9 | 428 | int modem_remote_write_file(uint8_t* itf, void *istatus , uint8_t fid, void *data, uint32_t offset, uint32_t length, uint32_t timeout) |
Jeej | 68:b2dd7309da44 | 429 | { |
Jeej | 69:8f2fe2426ef9 | 430 | return _modem_write_file(itf, istatus, fid, data, offset, length, timeout); |
Jeej | 68:b2dd7309da44 | 431 | } |
Jeej | 68:b2dd7309da44 | 432 | |
Jeej | 68:b2dd7309da44 | 433 | int modem_declare_file(uint8_t fid, alp_file_header_t* header) |
Jeej | 68:b2dd7309da44 | 434 | { |
Jeej | 68:b2dd7309da44 | 435 | int err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 436 | alp_payload_t* alp = NULL; |
Jeej | 69:8f2fe2426ef9 | 437 | alp_payload_t* alp_rsp = NULL; |
Jeej | 69:8f2fe2426ef9 | 438 | |
Jeej | 69:8f2fe2426ef9 | 439 | alp = alp_payload_f_declare(NULL, fid, header); |
Jeej | 69:8f2fe2426ef9 | 440 | |
Jeej | 69:8f2fe2426ef9 | 441 | _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT); |
Jeej | 69:8f2fe2426ef9 | 442 | |
Jeej | 69:8f2fe2426ef9 | 443 | err = alp_payload_get_err(alp_rsp); |
Jeej | 68:b2dd7309da44 | 444 | |
Jeej | 69:8f2fe2426ef9 | 445 | alp_payload_free(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 446 | |
Jeej | 69:8f2fe2426ef9 | 447 | return err; |
Jeej | 69:8f2fe2426ef9 | 448 | } |
Jeej | 69:8f2fe2426ef9 | 449 | |
Jeej | 72:15bf99fcfed9 | 450 | int modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length) |
Jeej | 72:15bf99fcfed9 | 451 | { |
Jeej | 72:15bf99fcfed9 | 452 | int err = ALP_ERR_UNKNOWN; |
Jeej | 72:15bf99fcfed9 | 453 | alp_payload_t* alp = NULL; |
Jeej | 72:15bf99fcfed9 | 454 | alp_payload_t* alp_rsp = NULL; |
Jeej | 72:15bf99fcfed9 | 455 | |
Jeej | 72:15bf99fcfed9 | 456 | alp = alp_payload_f_touch(NULL, fid, offset, length, false); |
Jeej | 72:15bf99fcfed9 | 457 | |
Jeej | 72:15bf99fcfed9 | 458 | _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT); |
Jeej | 72:15bf99fcfed9 | 459 | |
Jeej | 72:15bf99fcfed9 | 460 | err = alp_payload_get_err(alp_rsp); |
Jeej | 72:15bf99fcfed9 | 461 | |
Jeej | 72:15bf99fcfed9 | 462 | alp_payload_free(alp_rsp); |
Jeej | 72:15bf99fcfed9 | 463 | |
Jeej | 72:15bf99fcfed9 | 464 | return err; |
Jeej | 72:15bf99fcfed9 | 465 | } |
Jeej | 72:15bf99fcfed9 | 466 | |
Jeej | 69:8f2fe2426ef9 | 467 | static int _modem_d7a_itf_enable(u8 enable) |
Jeej | 69:8f2fe2426ef9 | 468 | { |
Jeej | 69:8f2fe2426ef9 | 469 | int err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 470 | alp_payload_t* alp = NULL; |
Jeej | 69:8f2fe2426ef9 | 471 | alp_payload_t* alp_rsp = NULL; |
Jeej | 69:8f2fe2426ef9 | 472 | |
Jeej | 69:8f2fe2426ef9 | 473 | alp = alp_payload_activate_itf(NULL, ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_EOP, enable); |
Jeej | 69:8f2fe2426ef9 | 474 | |
Jeej | 69:8f2fe2426ef9 | 475 | _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT); |
Jeej | 69:8f2fe2426ef9 | 476 | |
Jeej | 69:8f2fe2426ef9 | 477 | err = alp_payload_get_err(alp_rsp); |
Jeej | 68:b2dd7309da44 | 478 | |
Jeej | 69:8f2fe2426ef9 | 479 | alp_payload_free(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 480 | |
Jeej | 68:b2dd7309da44 | 481 | return err; |
Jeej | 68:b2dd7309da44 | 482 | } |
Jeej | 68:b2dd7309da44 | 483 | |
Jeej | 68:b2dd7309da44 | 484 | int modem_d7a_enable_itf(void) |
Jeej | 68:b2dd7309da44 | 485 | { |
Jeej | 69:8f2fe2426ef9 | 486 | return _modem_d7a_itf_enable(true); |
Jeej | 68:b2dd7309da44 | 487 | } |
Jeej | 68:b2dd7309da44 | 488 | |
Jeej | 68:b2dd7309da44 | 489 | int modem_d7a_disable_itf(void) |
Jeej | 68:b2dd7309da44 | 490 | { |
Jeej | 69:8f2fe2426ef9 | 491 | return _modem_d7a_itf_enable(false); |
Jeej | 69:8f2fe2426ef9 | 492 | } |
Jeej | 69:8f2fe2426ef9 | 493 | |
Jeej | 69:8f2fe2426ef9 | 494 | static int modem_lwan_set_urc(void) |
Jeej | 69:8f2fe2426ef9 | 495 | { |
Jeej | 69:8f2fe2426ef9 | 496 | int err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 497 | alp_payload_t* alp = NULL; |
Jeej | 69:8f2fe2426ef9 | 498 | alp_payload_t* alp_rsp = NULL; |
Jeej | 69:8f2fe2426ef9 | 499 | |
Jeej | 69:8f2fe2426ef9 | 500 | alp = alp_payload_urcc_en(NULL, ALP_URC_TYPE_ITF_BUSY, FID_LWAN_ITF, 1); |
Jeej | 69:8f2fe2426ef9 | 501 | |
Jeej | 69:8f2fe2426ef9 | 502 | _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT); |
Jeej | 69:8f2fe2426ef9 | 503 | |
Jeej | 69:8f2fe2426ef9 | 504 | err = alp_payload_get_err(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 505 | |
Jeej | 69:8f2fe2426ef9 | 506 | alp_payload_free(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 507 | |
Jeej | 69:8f2fe2426ef9 | 508 | return err; |
Jeej | 69:8f2fe2426ef9 | 509 | } |
Jeej | 69:8f2fe2426ef9 | 510 | |
Jeej | 69:8f2fe2426ef9 | 511 | static int modem_lwan_enable_itf(void) |
Jeej | 69:8f2fe2426ef9 | 512 | { |
Jeej | 69:8f2fe2426ef9 | 513 | int err = ALP_ERR_UNKNOWN; |
Jeej | 69:8f2fe2426ef9 | 514 | alp_payload_t* alp = NULL; |
Jeej | 69:8f2fe2426ef9 | 515 | alp_payload_t* alp_rsp = NULL; |
Jeej | 69:8f2fe2426ef9 | 516 | |
Jeej | 69:8f2fe2426ef9 | 517 | alp = alp_payload_activate_itf(NULL, ALP_ITF_TYPE_LWAN, 1, FID_LWAN_ITF, 0, true); |
Jeej | 69:8f2fe2426ef9 | 518 | |
Jeej | 69:8f2fe2426ef9 | 519 | _modem_d7a_send(NULL, alp, &alp_rsp, MODEM_TIMEOUT); |
Jeej | 69:8f2fe2426ef9 | 520 | |
Jeej | 69:8f2fe2426ef9 | 521 | err = alp_payload_get_err(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 522 | |
Jeej | 69:8f2fe2426ef9 | 523 | alp_payload_free(alp_rsp); |
Jeej | 69:8f2fe2426ef9 | 524 | |
Jeej | 69:8f2fe2426ef9 | 525 | return err; |
Jeej | 69:8f2fe2426ef9 | 526 | } |
Jeej | 69:8f2fe2426ef9 | 527 | |
Jeej | 69:8f2fe2426ef9 | 528 | int modem_lwan_open(modem_lwan_callbacks_t* callbacks) |
Jeej | 69:8f2fe2426ef9 | 529 | { |
Jeej | 68:b2dd7309da44 | 530 | int err = ALP_ERR_UNKNOWN; |
Jeej | 68:b2dd7309da44 | 531 | |
Jeej | 69:8f2fe2426ef9 | 532 | modem_ref_set_lwan_cb(callbacks); |
Jeej | 68:b2dd7309da44 | 533 | |
Jeej | 69:8f2fe2426ef9 | 534 | err = modem_lwan_set_urc(); |
Jeej | 69:8f2fe2426ef9 | 535 | if (ALP_ERR_NONE > err) { return err; } |
Jeej | 69:8f2fe2426ef9 | 536 | |
Jeej | 69:8f2fe2426ef9 | 537 | err = modem_lwan_enable_itf(); |
Jeej | 68:b2dd7309da44 | 538 | |
Jeej | 68:b2dd7309da44 | 539 | return err; |
Jeej | 68:b2dd7309da44 | 540 | } |
Jeej | 68:b2dd7309da44 | 541 | |
Jeej | 69:8f2fe2426ef9 | 542 | int modem_lwan_set_cfg(lwan_cfg_t* cfg) |
Jeej | 69:8f2fe2426ef9 | 543 | { |
Jeej | 69:8f2fe2426ef9 | 544 | return modem_write_file(FID_LWAN_CFG, cfg, 0, sizeof(lwan_cfg_t)); |
Jeej | 69:8f2fe2426ef9 | 545 | } |
Jeej | 69:8f2fe2426ef9 | 546 | |
Jeej | 69:8f2fe2426ef9 | 547 | int modem_lwan_set_nls(lwan_nls_t* nls) |
Jeej | 69:8f2fe2426ef9 | 548 | { |
Jeej | 69:8f2fe2426ef9 | 549 | return modem_write_file(FID_LWAN_NLS, nls, 0, sizeof(lwan_nls_t)); |
Jeej | 69:8f2fe2426ef9 | 550 | } |
Jeej | 69:8f2fe2426ef9 | 551 | |
Jeej | 69:8f2fe2426ef9 | 552 | int modem_lwan_send(alp_payload_t* alp) |
Jeej | 69:8f2fe2426ef9 | 553 | { |
Jeej | 69:8f2fe2426ef9 | 554 | alp_itf_lwan_cfg_t itf = { .type = ALP_ITF_TYPE_LWAN }; |
Jeej | 69:8f2fe2426ef9 | 555 | |
Jeej | 69:8f2fe2426ef9 | 556 | return modem_remote_raw_alp((void*)&itf, alp, NULL, MODEM_TIMEOUT); |
Jeej | 69:8f2fe2426ef9 | 557 | } |
Jeej | 69:8f2fe2426ef9 | 558 | |
Jeej | 69:8f2fe2426ef9 | 559 | int modem_lwan_get_status(lwan_status_t* status) |
Jeej | 69:8f2fe2426ef9 | 560 | { |
Jeej | 69:8f2fe2426ef9 | 561 | return modem_read_file(FID_LWAN_STATUS, status, 0, sizeof(lwan_status_t)); |
Jeej | 69:8f2fe2426ef9 | 562 | } |
Jeej | 69:8f2fe2426ef9 | 563 | |
Jeej | 69:8f2fe2426ef9 | 564 | void modem_print_error(uint8_t itf, int error) |
Jeej | 68:b2dd7309da44 | 565 | { |
Jeej | 68:b2dd7309da44 | 566 | if (ALP_ERR_ITF_START >= error && ALP_ERR_ITF_END < error) |
Jeej | 68:b2dd7309da44 | 567 | { |
Jeej | 68:b2dd7309da44 | 568 | error -= ALP_ERR_ITF_START; |
Jeej | 68:b2dd7309da44 | 569 | // Interface specific error |
Jeej | 68:b2dd7309da44 | 570 | if (ALP_ITF_TYPE_HOST == itf) |
Jeej | 68:b2dd7309da44 | 571 | { |
Jeej | 69:8f2fe2426ef9 | 572 | PRINT("ITF[%02X] Error %d\r\n", itf, error); |
Jeej | 68:b2dd7309da44 | 573 | } |
Jeej | 68:b2dd7309da44 | 574 | else if (ALP_ITF_TYPE_COM == itf) |
Jeej | 68:b2dd7309da44 | 575 | { |
Jeej | 69:8f2fe2426ef9 | 576 | PRINT("ITF[%02X] Error %d\r\n", itf, error); |
Jeej | 68:b2dd7309da44 | 577 | } |
Jeej | 68:b2dd7309da44 | 578 | else if (ALP_ITF_TYPE_D7A == itf) |
Jeej | 68:b2dd7309da44 | 579 | { |
Jeej | 68:b2dd7309da44 | 580 | PRINT("ITF[%02X] ", itf); |
Jeej | 68:b2dd7309da44 | 581 | switch (error) |
Jeej | 68:b2dd7309da44 | 582 | { |
Jeej | 68:b2dd7309da44 | 583 | /// No error |
Jeej | 68:b2dd7309da44 | 584 | case D7A_ERROR_NO: // = 0, |
Jeej | 68:b2dd7309da44 | 585 | PRINT("D7A_ERROR_NO\r\n"); |
Jeej | 68:b2dd7309da44 | 586 | break; |
Jeej | 69:8f2fe2426ef9 | 587 | /// Resource busy |
Jeej | 68:b2dd7309da44 | 588 | case D7A_ERROR_BUSY: // = -1, |
Jeej | 68:b2dd7309da44 | 589 | PRINT("D7A_ERROR_BUSY\r\n"); |
Jeej | 68:b2dd7309da44 | 590 | break; |
Jeej | 69:8f2fe2426ef9 | 591 | /// Bad parameter |
Jeej | 68:b2dd7309da44 | 592 | case D7A_ERROR_BAD_PARAM: // = -2, |
Jeej | 68:b2dd7309da44 | 593 | PRINT("D7A_ERROR_BAD_PARAM\r\n"); |
Jeej | 68:b2dd7309da44 | 594 | break; |
Jeej | 69:8f2fe2426ef9 | 595 | /// Duty cycle limit overflow |
Jeej | 68:b2dd7309da44 | 596 | case D7A_ERROR_DUTY_CYCLE: // = -3, |
Jeej | 68:b2dd7309da44 | 597 | PRINT("D7A_ERROR_DUTY_CYCLE\r\n"); |
Jeej | 68:b2dd7309da44 | 598 | break; |
Jeej | 69:8f2fe2426ef9 | 599 | /// CCA timeout |
Jeej | 68:b2dd7309da44 | 600 | case D7A_ERROR_CCA_TO: // = -4, |
Jeej | 68:b2dd7309da44 | 601 | PRINT("D7A_ERROR_CCA_TO\r\n"); |
Jeej | 68:b2dd7309da44 | 602 | break; |
Jeej | 69:8f2fe2426ef9 | 603 | /// Security frame counter overflow |
Jeej | 68:b2dd7309da44 | 604 | case D7A_ERROR_NLS_KEY: // = -5, |
Jeej | 68:b2dd7309da44 | 605 | PRINT("D7A_ERROR_NLS_KEY\r\n"); |
Jeej | 68:b2dd7309da44 | 606 | break; |
Jeej | 69:8f2fe2426ef9 | 607 | /// TX stream underflow |
Jeej | 68:b2dd7309da44 | 608 | case D7A_ERROR_TX_UDF: // = -6, |
Jeej | 68:b2dd7309da44 | 609 | PRINT("D7A_ERROR_TX_UDF\r\n"); |
Jeej | 68:b2dd7309da44 | 610 | break; |
Jeej | 69:8f2fe2426ef9 | 611 | /// RX stream overflow |
Jeej | 68:b2dd7309da44 | 612 | case D7A_ERROR_RX_OVF: // = -7, |
Jeej | 68:b2dd7309da44 | 613 | PRINT("D7A_ERROR_RX_OVF\r\n"); |
Jeej | 68:b2dd7309da44 | 614 | break; |
Jeej | 69:8f2fe2426ef9 | 615 | /// RX checksum |
Jeej | 68:b2dd7309da44 | 616 | case D7A_ERROR_RX_CRC: // = -8, |
Jeej | 68:b2dd7309da44 | 617 | PRINT("D7A_ERROR_RX_CRC\r\n"); |
Jeej | 68:b2dd7309da44 | 618 | break; |
Jeej | 69:8f2fe2426ef9 | 619 | /// Abort |
Jeej | 68:b2dd7309da44 | 620 | case D7A_ERROR_ABORT: // = -9, |
Jeej | 68:b2dd7309da44 | 621 | PRINT("D7A_ERROR_ABORT\r\n"); |
Jeej | 68:b2dd7309da44 | 622 | break; |
Jeej | 69:8f2fe2426ef9 | 623 | /// No ACK received |
Jeej | 68:b2dd7309da44 | 624 | case D7A_ERROR_NO_ACK: // = -10, |
Jeej | 68:b2dd7309da44 | 625 | PRINT("D7A_ERROR_NO_ACK\r\n"); |
Jeej | 68:b2dd7309da44 | 626 | break; |
Jeej | 69:8f2fe2426ef9 | 627 | /// RX timeout |
Jeej | 69:8f2fe2426ef9 | 628 | case D7A_ERROR_RX_TO: // = -11, |
Jeej | 68:b2dd7309da44 | 629 | PRINT("D7A_ERROR_RX_TO\r\n"); |
Jeej | 68:b2dd7309da44 | 630 | break; |
Jeej | 68:b2dd7309da44 | 631 | default: |
Jeej | 68:b2dd7309da44 | 632 | PRINT("Unknown Error %d\r\n", error); |
Jeej | 68:b2dd7309da44 | 633 | break; |
Jeej | 68:b2dd7309da44 | 634 | } |
Jeej | 68:b2dd7309da44 | 635 | } |
Jeej | 68:b2dd7309da44 | 636 | else if (ALP_ITF_TYPE_LWAN == itf) |
Jeej | 68:b2dd7309da44 | 637 | { |
Jeej | 69:8f2fe2426ef9 | 638 | PRINT("ITF[%02X] Error %d\r\n", itf, error); |
Jeej | 68:b2dd7309da44 | 639 | } |
Jeej | 68:b2dd7309da44 | 640 | else |
Jeej | 68:b2dd7309da44 | 641 | { |
Jeej | 69:8f2fe2426ef9 | 642 | PRINT("ITF[%02X] Error %d\r\n", itf, error); |
Jeej | 68:b2dd7309da44 | 643 | } |
Jeej | 68:b2dd7309da44 | 644 | } |
Jeej | 68:b2dd7309da44 | 645 | else |
Jeej | 68:b2dd7309da44 | 646 | { |
Jeej | 69:8f2fe2426ef9 | 647 | PRINT("ITF[%02X] ALP: ", itf); |
Jeej | 68:b2dd7309da44 | 648 | switch (error) |
Jeej | 68:b2dd7309da44 | 649 | { |
Jeej | 68:b2dd7309da44 | 650 | // Not really errors, more like status |
Jeej | 69:8f2fe2426ef9 | 651 | case ALP_ERR_ITF_FULL: // 0x02: For interfaces supporting buffering, indicates buffer reached maximum capacity (no data loss) |
Jeej | 68:b2dd7309da44 | 652 | PRINT("ALP_ERR_ITF_FULL\r\n"); |
Jeej | 68:b2dd7309da44 | 653 | break; |
Jeej | 68:b2dd7309da44 | 654 | case ALP_ERR_PARTIAL_COMPLETION: // 0x01: Action received and partially completed at response. To be completed after response |
Jeej | 68:b2dd7309da44 | 655 | PRINT("ALP_ERR_PARTIAL_COMPLETION\r\n"); |
Jeej | 68:b2dd7309da44 | 656 | break; |
Jeej | 69:8f2fe2426ef9 | 657 | |
Jeej | 69:8f2fe2426ef9 | 658 | // ALP Errors |
Jeej | 68:b2dd7309da44 | 659 | case ALP_ERR_NONE: // 0x00: Action completed (OK) |
Jeej | 68:b2dd7309da44 | 660 | PRINT("ALP_ERR_NONE\r\n"); |
Jeej | 68:b2dd7309da44 | 661 | break; |
Jeej | 68:b2dd7309da44 | 662 | case ALP_ERR_FILE_NOT_FOUND: // 0xFF: Error access file: File ID does not exist |
Jeej | 68:b2dd7309da44 | 663 | PRINT("ALP_ERR_FILE_NOT_FOUND\r\n"); |
Jeej | 68:b2dd7309da44 | 664 | break; |
Jeej | 68:b2dd7309da44 | 665 | case ALP_ERR_FILE_EXIST: // 0xFE: Error create file: File ID already exists |
Jeej | 68:b2dd7309da44 | 666 | PRINT("ALP_ERR_FILE_EXIST\r\n"); |
Jeej | 68:b2dd7309da44 | 667 | break; |
Jeej | 68:b2dd7309da44 | 668 | case ALP_ERR_FILE_NOT_RESTORABLE: // 0xFD: Error restore file: File is not restorable |
Jeej | 68:b2dd7309da44 | 669 | PRINT("ALP_ERR_FILE_NOT_RESTORABLEr\n"); |
Jeej | 68:b2dd7309da44 | 670 | break; |
Jeej | 68:b2dd7309da44 | 671 | case ALP_ERR_PERMISSION_DENIED: // 0xFC: Error access file: Insufficient permissions |
Jeej | 68:b2dd7309da44 | 672 | PRINT("ALP_ERR_PERMISSION_DENIED\r\n"); |
Jeej | 68:b2dd7309da44 | 673 | break; |
Jeej | 68:b2dd7309da44 | 674 | case ALP_ERR_LENGTH_OVERFLOW: // 0xFB: Error create file: Supplied length (in header) is beyond file limits |
Jeej | 68:b2dd7309da44 | 675 | PRINT("ALP_ERR_LENGTH_OVERFLOW\r\n"); |
Jeej | 68:b2dd7309da44 | 676 | break; |
Jeej | 68:b2dd7309da44 | 677 | case ALP_ERR_ALLOC_OVERFLOW: // 0xFA: Error create file: Supplied allocation (in header) is beyond file limits |
Jeej | 68:b2dd7309da44 | 678 | PRINT("ALP_ERR_ALLOC_OVERFLOW\r\n"); |
Jeej | 68:b2dd7309da44 | 679 | break; |
Jeej | 68:b2dd7309da44 | 680 | case ALP_ERR_OFFSET_OVERFLOW: // 0xF9: Error write: Supplied start offset is out of bounds of file allocation |
Jeej | 68:b2dd7309da44 | 681 | PRINT("ALP_ERR_OFFSET_OVERFLOW\r\n"); |
Jeej | 68:b2dd7309da44 | 682 | break; |
Jeej | 68:b2dd7309da44 | 683 | case ALP_ERR_WRITE_OVERFLOW: // 0xF8: Error complete write: Supplied data goes beyond file allocation |
Jeej | 68:b2dd7309da44 | 684 | PRINT("ALP_ERR_WRITE_OVERFLOW\r\n"); |
Jeej | 68:b2dd7309da44 | 685 | break; |
Jeej | 68:b2dd7309da44 | 686 | case ALP_ERR_WRITE_ERROR: // 0xF7: Error write: impossible to write in storage location |
Jeej | 68:b2dd7309da44 | 687 | PRINT("ALP_ERR_WRITE_ERROR\r\n"); |
Jeej | 68:b2dd7309da44 | 688 | break; |
Jeej | 68:b2dd7309da44 | 689 | case ALP_ERR_OPERATION_UNKNOWN: // 0xF6: Error unknown Operation |
Jeej | 68:b2dd7309da44 | 690 | PRINT("ALP_ERR_OPERATION_UNKNOWN\r\n"); |
Jeej | 68:b2dd7309da44 | 691 | break; |
Jeej | 68:b2dd7309da44 | 692 | case ALP_ERR_OPERAND_INCOMPLETE: // 0xF5: Error incomplete Operand |
Jeej | 68:b2dd7309da44 | 693 | PRINT("ALP_ERR_OPERAND_INCOMPLETE\r\n"); |
Jeej | 68:b2dd7309da44 | 694 | break; |
Jeej | 68:b2dd7309da44 | 695 | case ALP_ERR_OPERAND_WRONG_FORMAT: // 0xF4: Error wrong Operand format |
Jeej | 68:b2dd7309da44 | 696 | PRINT("ALP_ERR_OPERAND_WRONG_FORMAT\r\n"); |
Jeej | 68:b2dd7309da44 | 697 | break; |
Jeej | 68:b2dd7309da44 | 698 | case ALP_ERR_ITF_INVALID: // 0xF3: Error invalid interface |
Jeej | 68:b2dd7309da44 | 699 | PRINT("ALP_ERR_ITF_INVALID\r\n"); |
Jeej | 68:b2dd7309da44 | 700 | break; |
Jeej | 68:b2dd7309da44 | 701 | case ALP_ERR_ITF_OVERFLOW: // 0xF2: Error interface overflown (i.e. resources exhausted, buffer full with data discarded) |
Jeej | 68:b2dd7309da44 | 702 | PRINT("ALP_ERR_ITF_OVERFLOW\r\n"); |
Jeej | 68:b2dd7309da44 | 703 | break; |
Jeej | 68:b2dd7309da44 | 704 | case ALP_ERR_QUERY_FAIL: // 0xF1: (Group of) Query result was false (Informative error code). |
Jeej | 68:b2dd7309da44 | 705 | PRINT("ALP_ERR_QUERY_FAIL\r\n"); |
Jeej | 68:b2dd7309da44 | 706 | break; |
Jeej | 68:b2dd7309da44 | 707 | case ALP_ERR_ITF_NOT_SPECIFIED: |
Jeej | 68:b2dd7309da44 | 708 | PRINT("ALP_ERR_ITF_NOT_SPECIFIED\r\n"); |
Jeej | 68:b2dd7309da44 | 709 | break; |
Jeej | 69:8f2fe2426ef9 | 710 | |
Jeej | 69:8f2fe2426ef9 | 711 | // Other Errors |
Jeej | 68:b2dd7309da44 | 712 | case ALP_ERR_UNKNOWN: // 0x80: Unknown error |
Jeej | 68:b2dd7309da44 | 713 | PRINT("ALP_ERR_UNKNOWN\r\n"); |
Jeej | 68:b2dd7309da44 | 714 | break; |
Jeej | 68:b2dd7309da44 | 715 | case ALP_ERR_FS_TIMEOUT: // 0x81: Internal FS Error |
Jeej | 68:b2dd7309da44 | 716 | PRINT("ALP_ERR_FS_TIMEOUT\r\n"); |
Jeej | 68:b2dd7309da44 | 717 | break; |
Jeej | 68:b2dd7309da44 | 718 | case ALP_ERR_ITF_UNKNOWN: // 0x82: Unknown Interface |
Jeej | 68:b2dd7309da44 | 719 | PRINT("ALP_ERR_ITF_UNKNOWN\r\n"); |
Jeej | 68:b2dd7309da44 | 720 | break; |
Jeej | 68:b2dd7309da44 | 721 | case ALP_ERR_ITF_TIMEOUT: // 0x83: Internal ITF Error |
Jeej | 68:b2dd7309da44 | 722 | PRINT("ALP_ERR_ITF_TIMEOUT\r\n"); |
Jeej | 68:b2dd7309da44 | 723 | break; |
Jeej | 68:b2dd7309da44 | 724 | default: |
Jeej | 68:b2dd7309da44 | 725 | PRINT("Unknown Error %d\r\n", error); |
Jeej | 68:b2dd7309da44 | 726 | break; |
Jeej | 68:b2dd7309da44 | 727 | } |
Jeej | 68:b2dd7309da44 | 728 | } |
Jeej | 69:8f2fe2426ef9 | 729 | } |