diff options
author | root <root@no.no.james.local> | 2015-09-01 11:42:26 +0100 |
---|---|---|
committer | root <root@no.no.james.local> | 2015-09-01 11:42:26 +0100 |
commit | 68041c4710fc044c13f4107a74ae26badf611fd8 (patch) | |
tree | 7d86fa94ec98e2078f2b67c12d4386bf3e1899c1 /dfu.c | |
parent | 7e25356deec3369773e3949fe7336d84c10834c0 (diff) | |
download | nrfdfu-68041c4710fc044c13f4107a74ae26badf611fd8.tar.gz nrfdfu-68041c4710fc044c13f4107a74ae26badf611fd8.tar.bz2 nrfdfu-68041c4710fc044c13f4107a74ae26badf611fd8.zip |
works
Diffstat (limited to 'dfu.c')
-rw-r--r-- | dfu.c | 115 |
1 files changed, 101 insertions, 14 deletions
@@ -1,39 +1,126 @@ #include "project.h" +#include "dfu.h" void dfu (const char *bdaddr, const char *type, const char *version, uint8_t * dat, size_t dat_sz, uint8_t * bin, size_t bin_sz) { - BLE *b; - uint8_t buf[32]; + BLE *b; + uint8_t buf[32]; + uint32_t u32; + uint16_t u16; + if (strcmp (type, "application")) + { + fprintf (stderr, "only know how to flash applications\n"); + exit (EXIT_FAILURE); + } - ble_init(); + ble_init (); + do + { + b = ble_open (bdaddr); + if (!b) + break; - do { + if (ble_register_notify (b)) + break; - b=ble_open (bdaddr); - - if (!b) - break; + buf[0] = OP_CODE_START_DFU; + buf[1] = DFU_UPDATE_APP; /*bit field */ - if (ble_register_notify(b)) break; + ble_wait_setup (b, OP_CODE_START_DFU); - ble_send_cp( + if (ble_send_cp (b, buf, 2)) + break; + + /*4 bytes sd size, 4 bytes bl size, 4 bytes app size */ + + memset (buf, 0, 12); + u32 = bin_sz; + memcpy (&buf[8], &u32, 4); + + if (ble_send_data (b, buf, 12)) + break; + + if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS) + break; + + buf[0] = OP_CODE_RECEIVE_INIT; + buf[1] = DFU_INIT_RX; + + if (ble_send_cp (b, buf, 2)) + break; + + ble_wait_setup (b, OP_CODE_RECEIVE_INIT); + if (ble_send_data (b, dat, dat_sz)) + break; + + buf[0] = OP_CODE_RECEIVE_INIT; + buf[1] = DFU_INIT_COMPLETE; + if (ble_send_cp (b, buf, 2)) + break; + + if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS) + break; + + +// ble_wait_setup(b,OP_CODE_PKT_RCPT_NOTIF_REQ); + buf[0] = OP_CODE_PKT_RCPT_NOTIF_REQ; + u16 = 0x10; + memcpy (&buf[1], &u16, 2); + + if (ble_send_cp (b, buf, 3)) + break; + +// if (ble_wait_run(b)!=BLE_DFU_RESP_VAL_SUCCESS) +// break; + + + + ble_wait_setup (b, OP_CODE_RECEIVE_FW); + + buf[0] = OP_CODE_RECEIVE_FW; + if (ble_send_cp (b, buf, 1)) + break; + + if (ble_send_data (b, bin, bin_sz)) + break; + + if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS) + break; + + ble_wait_setup (b, OP_CODE_VALIDATE); + buf[0] = OP_CODE_VALIDATE; + if (ble_send_cp (b, buf, 1)) + break; + if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS) + break; + + buf[0] = OP_CODE_ACTIVATE_N_RESET; + if (ble_send_cp (b, buf, 1)) + break; + + ble_close (b); + return; - ble_close (b); - return; + } + while (0); -} while (0); + if (b) + { + buf[0] = OP_CODE_SYS_RESET; + ble_send_cp (b, buf, 1); + } ble_close (b); - exit(EXIT_FAILURE); + exit (EXIT_FAILURE); } |