testReadSync.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. This example connect to hid device type msp430 active bsl mode. mass erase and unlock device.
  3. */
  4. "use strict";
  5. var HID = require("node-hid");
  6. var sleep = require("sleep");
  7. var Commands = {
  8. BSL_RX_DATA_BLOCK: 0x10,
  9. BSL_RX_DATA_BLOCK_FAST: 0x1b,
  10. BSL_RX_PASSWORD: 0x11,
  11. BSL_ERASE_SEGMENT: 0x12,
  12. BSL_LOCK_INFO: 0x13,
  13. BSL_MASS_ERASE: 0x15,
  14. BSL_CRC_CHECK: 0x16,
  15. BSL_LOAD_PC: 0x17,
  16. BSL_TX_DATA_BLOCK: 0x18,
  17. BSL_VERSION: 0x19,
  18. BSL_BUFFER_SIZE: 0x1a
  19. };
  20. function GetBSL5ErrorCodeInfo(error_code) {
  21. switch (error_code) {
  22. case 0x00:
  23. return "Operation successful";
  24. case 0x01:
  25. return 'Flash write check failed';
  26. case 0x02:
  27. return 'Flash fail bit set';
  28. case 0x03:
  29. return 'Voltage change during program';
  30. case 0x04:
  31. return 'BSL locked';
  32. case 0x05:
  33. return 'BSL password error';
  34. case 0x06:
  35. return 'Byte write forbidden';
  36. case 0x07:
  37. return 'Unknown command';
  38. case 0x08:
  39. return 'Packet length exceeds buffer size';
  40. }
  41. return "Unknown error code information";
  42. }
  43. function CheckAnswer(data) {
  44. if (data[0] == 0x3b) {
  45. if (data[1] == 0x00) {
  46. return;
  47. } else {
  48. throw new Error("CheckAnswer error case 1, error info: " + GetBSL5ErrorCodeInfo(data[1]));
  49. }
  50. } else if (data[0] != 0x3a) {
  51. throw new Error("CheckAnswer error case 2");
  52. }
  53. }
  54. function Bsl(device, cmd, message, receive_response) {
  55. var txdata = [0x3f, 1 + message.length, cmd].concat(message);
  56. var padding_size = 64 - txdata.length;
  57. for (var i = 0; i < padding_size; i++) {
  58. txdata.push(0xac);
  59. }
  60. device.write(txdata);
  61. if (receive_response) {
  62. var report = device.readSync();
  63. var pi = report[0];
  64. if (pi = 0x3f) {
  65. var length = report[1];
  66. var data = report.slice(2, 2 + length);
  67. return data;
  68. } else {
  69. throw new Error("received bad PI, expected 0x3f");
  70. }
  71. }
  72. }
  73. function BslRxPassword(device, password) {
  74. var answer = Bsl(device, Commands.BSL_RX_PASSWORD, password, true);
  75. CheckAnswer(answer);
  76. }
  77. // open a device type mps430 in bsl mode
  78. var device = new HID.HID(0x2047, 0x0200);
  79. // only for test readTimeout function
  80. var data_read = device.readTimeout(1000);
  81. console.log("data_read: " + JSON.stringify(data_read));
  82. // init for mass erase password
  83. var package_erase_password = [];
  84. for (var i = 0; i < 30; i++) {
  85. package_erase_password.push(0xff);
  86. }
  87. package_erase_password.push(0x00);
  88. package_erase_password.push(0x00);
  89. // Mass erase initiated due to incorrect password
  90. try {
  91. BslRxPassword(device, package_erase_password);
  92. } catch (err) {
  93. console.log("Trace exception BslRxPassword, " + err);
  94. }
  95. sleep.sleep(1);
  96. var package_erase_password_2 = [];
  97. for (var i = 0; i < 32; i++) {
  98. package_erase_password_2.push(0xff);
  99. }
  100. // after erase, unlock device
  101. BslRxPassword(device, package_erase_password_2);