From 68041c4710fc044c13f4107a74ae26badf611fd8 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 1 Sep 2015 11:42:26 +0100 Subject: works --- dfu.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 101 insertions(+), 14 deletions(-) (limited to 'dfu.c') diff --git a/dfu.c b/dfu.c index be1f952..6dd835e 100644 --- a/dfu.c +++ b/dfu.c @@ -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); } -- cgit v1.2.3