diff --git a/dist/crc16.js b/dist/crc16.js
new file mode 100644
index 0000000..017627d
--- /dev/null
+++ b/dist/crc16.js
@@ -0,0 +1,66 @@
+/* @license
+ *
+ * CRC-CCITT (0xFFFF) library.
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2016
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+ // https://github.com/umdjs/umd
+(function(global, factory) {
+
+ if (typeof exports === 'object') {
+ // CommonJS (Node)
+ module.exports = factory();
+ } else if (typeof define === 'function' && define.amd) {
+ // AMD
+ define(factory);
+ } else {
+ // Browser global (with support for web workers)
+ global.crc16 = factory();
+ }
+
+}(this, function() {
+ 'use strict';
+
+ /**
+ * Copied from Nordic's command line tool nrf.exe.
+ * https://github.com/NordicSemiconductor/pc-nrfutil/blob/master/nordicsemi/dfu/crc16.py
+ * CRC-CCITT (0xFFFF).
+ */
+ return function (binaryData) {
+ var crc = 0xFFFF;
+ var view = new Uint8Array(binaryData);
+
+ var i;
+
+ for (i = 0; i < view.byteLength; i++) {
+ crc = (crc >> 8 & 0x00FF) | (crc << 8 & 0xFF00);
+ crc ^= view[i];
+ crc ^= (crc & 0x00FF) >> 4;
+ crc ^= (crc << 8) << 4;
+ crc ^= ((crc & 0x00FF) << 4) << 1;
+ }
+
+ return (crc & 0xFFFF);
+ };
+}));
diff --git a/dist/dfu.js b/dist/dfu.js
index 47a706d..a490392 100644
--- a/dist/dfu.js
+++ b/dist/dfu.js
@@ -162,9 +162,10 @@
return view;
}
- function provision(device, arrayBuffer, imageType) {
+ function provision(device, arrayBuffer, crc, imageType) {
return new Promise(function(resolve, reject) {
var versionChar = null;
+ initPacket.crc = crc || 0xFFFF; // Not used in mbed/ older bootloader revisions.
imageType = imageType || ImageType.Application;
connect(device)
diff --git a/example_node.js b/example_node.js
index 7bc7f72..8568252 100644
--- a/example_node.js
+++ b/example_node.js
@@ -1,5 +1,6 @@
var dfu = require('./index').dfu;
var hex2bin = require('./index').hex2bin;
+var crc16 = require('./index').crc16;
var fs = require('fs');
var log = console.log;
@@ -40,8 +41,9 @@ dfu.findDevice({ services: [0x180D] })
var hex = file.toString();
var buffer = hex2bin(hex);
log("file length: " + buffer.byteLength);
+ var crc = crc16(buffer);
- return dfu.provision(device, buffer);
+ return dfu.provision(device, buffer, crc);
})
.then(() => process.exit())
.catch(error => {
diff --git a/example_web.html b/example_web.html
index 1020141..d5a82fd 100644
--- a/example_web.html
+++ b/example_web.html
@@ -27,6 +27,7 @@
+