aboutsummaryrefslogtreecommitdiffstats
path: root/dfu.c
diff options
context:
space:
mode:
Diffstat (limited to 'dfu.c')
-rw-r--r--dfu.c111
1 files changed, 109 insertions, 2 deletions
diff --git a/dfu.c b/dfu.c
index 6dd835e..3d22133 100644
--- a/dfu.c
+++ b/dfu.c
@@ -1,6 +1,97 @@
#include "project.h"
#include "dfu.h"
+static int
+send_data_quickly (BLE * b, uint8_t * d, size_t sz, int pkts)
+{
+ char bs[64];
+ size_t mtu = 16;
+ size_t off = 0;
+ size_t tx, rx;
+ int sent;
+
+ ble_notify_pkts_start (b);
+
+ memset (bs, '\b', sizeof (bs));
+
+ while (off != sz)
+ {
+ fwrite (bs, 1, sizeof (bs), stdout);
+ printf ("%6u/%6u bytes", (unsigned) off, (unsigned) sz);
+ fflush (stdout);
+
+ tx = (sz - off);
+ if (tx > mtu)
+ tx = mtu;
+
+ if (ble_send_data_noresp (b, d + off, tx))
+ {
+ printf ("\nFailed\n");
+ ble_notify_pkts_stop (b);
+ return EXIT_FAILURE;
+ }
+
+ off += tx;
+ sent++;
+
+ if (sent == pkts)
+ {
+ rx = ble_notify_get_pkts (b);
+
+ if (rx != off)
+ {
+ printf ("\nFailed -Lost a packet\n");
+ ble_notify_pkts_stop (b);
+ return EXIT_FAILURE;
+ }
+ sent = 0;
+ }
+
+ }
+
+ ble_notify_pkts_stop (b);
+
+ printf ("\nDone\n");
+ return EXIT_SUCCESS;
+
+}
+
+
+static int
+send_data_slowly (BLE * b, uint8_t * d, size_t sz)
+{
+ char bs[64];
+ size_t mtu = 16;
+ size_t off = 0;
+ size_t tx;
+
+ memset (bs, '\b', sizeof (bs));
+
+ while (off != sz)
+ {
+ fwrite (bs, 1, sizeof (bs), stdout);
+ printf ("%6u/%6u bytes", (unsigned) off, (unsigned) sz);
+ fflush (stdout);
+
+ tx = (sz - off);
+ if (tx > mtu)
+ tx = mtu;
+
+ if (ble_send_data (b, d + off, tx))
+ {
+ printf ("\nFailed\n");
+ return EXIT_FAILURE;
+ }
+
+ off += tx;
+ }
+
+
+ printf ("\nDone\n");
+ return EXIT_SUCCESS;
+
+}
+
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)
@@ -69,9 +160,11 @@ dfu (const char *bdaddr, const char *type, const char *version, uint8_t * dat,
break;
+#if 1
// ble_wait_setup(b,OP_CODE_PKT_RCPT_NOTIF_REQ);
+//
buf[0] = OP_CODE_PKT_RCPT_NOTIF_REQ;
- u16 = 0x10;
+ u16 = 0x40;
memcpy (&buf[1], &u16, 2);
if (ble_send_cp (b, buf, 3))
@@ -80,19 +173,33 @@ dfu (const char *bdaddr, const char *type, const char *version, uint8_t * dat,
// 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 (send_data_quickly (b, bin, bin_sz, u16) != EXIT_SUCCESS)
+ break;
+ if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS)
+ break;
+#else
+
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))
+ if (send_data_slowly (b, bin, bin_sz) != EXIT_SUCCESS)
break;
+
if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS)
break;
+#endif
ble_wait_setup (b, OP_CODE_VALIDATE);
buf[0] = OP_CODE_VALIDATE;