@microbit/microbit-connection 0.9.0-apps.alpha.9 → 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/README.md +106 -27
  2. package/build/cjs/async-util.d.ts +3 -1
  3. package/build/cjs/async-util.js +5 -1
  4. package/build/cjs/async-util.js.map +1 -1
  5. package/build/cjs/availability.js.map +1 -1
  6. package/build/cjs/bluetooth/ble-error.d.ts +10 -0
  7. package/build/cjs/bluetooth/ble-error.js +47 -0
  8. package/build/cjs/bluetooth/ble-error.js.map +1 -0
  9. package/build/cjs/bluetooth/connection.d.ts +378 -0
  10. package/build/cjs/bluetooth/connection.js +623 -0
  11. package/build/cjs/bluetooth/connection.js.map +1 -0
  12. package/build/cjs/bluetooth/device-bond-state.d.ts +14 -0
  13. package/build/cjs/bluetooth/device-bond-state.js +26 -0
  14. package/build/cjs/bluetooth/device-bond-state.js.map +1 -0
  15. package/build/cjs/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +36 -21
  16. package/build/cjs/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +174 -147
  17. package/build/cjs/bluetooth/device-wrapper.js.map +1 -0
  18. package/build/{esm → cjs/bluetooth}/flashing/flashing-full.d.ts +2 -2
  19. package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.js +6 -5
  20. package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -0
  21. package/build/cjs/bluetooth/flashing/flashing-makecode.d.ts +10 -0
  22. package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.js +5 -2
  23. package/build/cjs/bluetooth/flashing/flashing-makecode.js.map +1 -0
  24. package/build/cjs/bluetooth/flashing/flashing-partial.d.ts +10 -0
  25. package/build/cjs/bluetooth/flashing/flashing-partial.js +145 -0
  26. package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -0
  27. package/build/cjs/bluetooth/flashing/flashing-v1.js.map +1 -0
  28. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  29. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.js +40 -14
  30. package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -0
  31. package/build/cjs/bluetooth/flashing/zip.js.map +1 -0
  32. package/build/cjs/bluetooth/index.d.ts +5 -0
  33. package/build/cjs/bluetooth/index.js +9 -0
  34. package/build/cjs/bluetooth/index.js.map +1 -0
  35. package/build/cjs/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +8 -0
  36. package/build/cjs/{bluetooth-profile.js → bluetooth/profile.js} +7 -1
  37. package/build/cjs/bluetooth/profile.js.map +1 -0
  38. package/build/cjs/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
  39. package/build/cjs/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +17 -12
  40. package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -0
  41. package/build/{esm → cjs/bluetooth/services}/button-service.d.ts +2 -3
  42. package/build/cjs/{button-service.js → bluetooth/services/button-service.js} +24 -14
  43. package/build/cjs/bluetooth/services/button-service.js.map +1 -0
  44. package/build/{esm → cjs/bluetooth/services}/device-information-service.d.ts +1 -1
  45. package/build/cjs/bluetooth/services/device-information-service.js +29 -0
  46. package/build/cjs/bluetooth/services/device-information-service.js.map +1 -0
  47. package/build/cjs/{dfu-service.js → bluetooth/services/dfu-service.js} +2 -2
  48. package/build/cjs/bluetooth/services/dfu-service.js.map +1 -0
  49. package/build/cjs/bluetooth/services/event-service.d.ts +48 -0
  50. package/build/cjs/bluetooth/services/event-service.js +273 -0
  51. package/build/cjs/bluetooth/services/event-service.js.map +1 -0
  52. package/build/cjs/bluetooth/services/io-pin-service.d.ts +65 -0
  53. package/build/cjs/bluetooth/services/io-pin-service.js +173 -0
  54. package/build/cjs/bluetooth/services/io-pin-service.js.map +1 -0
  55. package/build/{esm → cjs/bluetooth/services}/led-service.d.ts +2 -3
  56. package/build/cjs/{led-service.js → bluetooth/services/led-service.js} +10 -7
  57. package/build/cjs/bluetooth/services/led-service.js.map +1 -0
  58. package/build/cjs/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  59. package/build/cjs/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +19 -14
  60. package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -0
  61. package/build/{esm → cjs/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  62. package/build/cjs/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +8 -8
  63. package/build/cjs/bluetooth/services/partial-flashing-service.js.map +1 -0
  64. package/build/cjs/bluetooth/services/temperature-service.d.ts +14 -0
  65. package/build/cjs/bluetooth/services/temperature-service.js +80 -0
  66. package/build/cjs/bluetooth/services/temperature-service.js.map +1 -0
  67. package/build/cjs/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  68. package/build/cjs/{uart-service.js → bluetooth/services/uart-service.js} +21 -9
  69. package/build/cjs/bluetooth/services/uart-service.js.map +1 -0
  70. package/build/cjs/board-id.d.ts +1 -1
  71. package/build/cjs/board-id.js.map +1 -1
  72. package/build/cjs/device.d.ts +191 -101
  73. package/build/cjs/device.js +47 -110
  74. package/build/cjs/device.js.map +1 -1
  75. package/build/cjs/events.d.ts +8 -108
  76. package/build/cjs/events.js +27 -88
  77. package/build/cjs/events.js.map +1 -1
  78. package/build/cjs/hex-util.d.ts +1 -0
  79. package/build/cjs/hex-util.js +15 -0
  80. package/build/cjs/hex-util.js.map +1 -0
  81. package/build/cjs/index.d.ts +8 -16
  82. package/build/cjs/index.js +9 -28
  83. package/build/cjs/index.js.map +1 -1
  84. package/build/cjs/logging.js.map +1 -1
  85. package/build/cjs/microbit-events.d.ts +67 -0
  86. package/build/cjs/microbit-events.js +55 -0
  87. package/build/cjs/microbit-events.js.map +1 -0
  88. package/build/cjs/radio-bridge/connection.d.ts +52 -0
  89. package/build/cjs/{usb-radio-bridge.js → radio-bridge/connection.js} +84 -96
  90. package/build/cjs/radio-bridge/connection.js.map +1 -0
  91. package/build/cjs/radio-bridge/index.d.ts +4 -0
  92. package/build/cjs/radio-bridge/index.js +9 -0
  93. package/build/cjs/radio-bridge/index.js.map +1 -0
  94. package/build/cjs/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  95. package/build/cjs/radio-bridge/serial-protocol.js.map +1 -0
  96. package/build/cjs/service-events.d.ts +92 -15
  97. package/build/cjs/service-events.js +6 -36
  98. package/build/cjs/service-events.js.map +1 -1
  99. package/build/{esm/hex-flash-data-source.d.ts → cjs/universal-hex/flash-data-source.d.ts} +1 -1
  100. package/build/cjs/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -3
  101. package/build/cjs/universal-hex/flash-data-source.js.map +1 -0
  102. package/build/cjs/universal-hex/index.d.ts +4 -0
  103. package/build/cjs/universal-hex/index.js +9 -0
  104. package/build/cjs/universal-hex/index.js.map +1 -0
  105. package/build/cjs/usb/arm-debug.d.ts +137 -0
  106. package/build/cjs/usb/arm-debug.js +414 -0
  107. package/build/cjs/usb/arm-debug.js.map +1 -0
  108. package/build/{esm → cjs/usb}/board-serial-info.d.ts +2 -1
  109. package/build/cjs/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  110. package/build/cjs/usb/board-serial-info.js.map +1 -0
  111. package/build/cjs/usb/cdc-saturation.d.ts +36 -0
  112. package/build/cjs/usb/cdc-saturation.js +151 -0
  113. package/build/cjs/usb/cdc-saturation.js.map +1 -0
  114. package/build/cjs/usb/cmsis-dap.d.ts +113 -0
  115. package/build/cjs/usb/cmsis-dap.js +349 -0
  116. package/build/cjs/usb/cmsis-dap.js.map +1 -0
  117. package/build/cjs/usb/connection.d.ts +96 -0
  118. package/build/cjs/{usb.js → usb/connection.js} +257 -173
  119. package/build/cjs/usb/connection.js.map +1 -0
  120. package/build/cjs/usb/cortex-m.d.ts +72 -0
  121. package/build/cjs/usb/cortex-m.js +165 -0
  122. package/build/cjs/usb/cortex-m.js.map +1 -0
  123. package/build/cjs/usb/daplink.d.ts +69 -0
  124. package/build/cjs/usb/daplink.js +238 -0
  125. package/build/cjs/usb/daplink.js.map +1 -0
  126. package/build/cjs/usb/device-wrapper.d.ts +34 -0
  127. package/build/cjs/usb/device-wrapper.js +102 -0
  128. package/build/cjs/usb/device-wrapper.js.map +1 -0
  129. package/build/cjs/usb/index.d.ts +5 -0
  130. package/build/cjs/usb/index.js +10 -0
  131. package/build/cjs/usb/index.js.map +1 -0
  132. package/build/{esm/usb-partial-flashing-utils.d.ts → cjs/usb/partial-flashing-utils.d.ts} +6 -9
  133. package/build/cjs/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +6 -49
  134. package/build/cjs/usb/partial-flashing-utils.js.map +1 -0
  135. package/build/{esm/usb-partial-flashing.d.ts → cjs/usb/partial-flashing.d.ts} +37 -11
  136. package/build/cjs/{usb-partial-flashing.js → usb/partial-flashing.js} +170 -134
  137. package/build/cjs/usb/partial-flashing.js.map +1 -0
  138. package/build/cjs/usb/promise-queue.js.map +1 -0
  139. package/build/cjs/usb/serial-events.d.ts +16 -0
  140. package/build/cjs/{led.js → usb/serial-events.js} +1 -1
  141. package/build/cjs/usb/serial-events.js.map +1 -0
  142. package/build/cjs/usb/transport.d.ts +42 -0
  143. package/build/cjs/usb/transport.js +155 -0
  144. package/build/cjs/usb/transport.js.map +1 -0
  145. package/build/esm/async-util.d.ts +3 -1
  146. package/build/esm/async-util.js +5 -1
  147. package/build/esm/async-util.js.map +1 -1
  148. package/build/esm/availability.js.map +1 -1
  149. package/build/esm/bluetooth/ble-error.d.ts +10 -0
  150. package/build/esm/bluetooth/ble-error.js +42 -0
  151. package/build/esm/bluetooth/ble-error.js.map +1 -0
  152. package/build/esm/bluetooth/connection.d.ts +378 -0
  153. package/build/esm/bluetooth/connection.js +593 -0
  154. package/build/esm/bluetooth/connection.js.map +1 -0
  155. package/build/esm/bluetooth/device-bond-state.d.ts +14 -0
  156. package/build/esm/bluetooth/device-bond-state.js +22 -0
  157. package/build/esm/bluetooth/device-bond-state.js.map +1 -0
  158. package/build/esm/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +36 -21
  159. package/build/esm/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +172 -146
  160. package/build/esm/bluetooth/device-wrapper.js.map +1 -0
  161. package/build/{cjs → esm/bluetooth}/flashing/flashing-full.d.ts +2 -2
  162. package/build/esm/{flashing → bluetooth/flashing}/flashing-full.js +6 -5
  163. package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -0
  164. package/build/esm/bluetooth/flashing/flashing-makecode.d.ts +10 -0
  165. package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.js +5 -2
  166. package/build/esm/bluetooth/flashing/flashing-makecode.js.map +1 -0
  167. package/build/esm/bluetooth/flashing/flashing-partial.d.ts +10 -0
  168. package/build/esm/bluetooth/flashing/flashing-partial.js +142 -0
  169. package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -0
  170. package/build/esm/bluetooth/flashing/flashing-v1.js.map +1 -0
  171. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  172. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.js +40 -14
  173. package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -0
  174. package/build/esm/bluetooth/flashing/zip.js.map +1 -0
  175. package/build/esm/bluetooth/index.d.ts +5 -0
  176. package/build/esm/bluetooth/index.js +5 -0
  177. package/build/esm/bluetooth/index.js.map +1 -0
  178. package/build/esm/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +8 -0
  179. package/build/esm/{bluetooth-profile.js → bluetooth/profile.js} +7 -1
  180. package/build/{cjs/bluetooth-profile.js.map → esm/bluetooth/profile.js.map} +1 -1
  181. package/build/esm/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
  182. package/build/esm/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +11 -6
  183. package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -0
  184. package/build/{cjs → esm/bluetooth/services}/button-service.d.ts +2 -3
  185. package/build/esm/{button-service.js → bluetooth/services/button-service.js} +20 -10
  186. package/build/esm/bluetooth/services/button-service.js.map +1 -0
  187. package/build/{cjs → esm/bluetooth/services}/device-information-service.d.ts +1 -1
  188. package/build/esm/bluetooth/services/device-information-service.js +25 -0
  189. package/build/esm/bluetooth/services/device-information-service.js.map +1 -0
  190. package/build/esm/{dfu-service.js → bluetooth/services/dfu-service.js} +1 -1
  191. package/build/esm/bluetooth/services/dfu-service.js.map +1 -0
  192. package/build/esm/bluetooth/services/event-service.d.ts +48 -0
  193. package/build/esm/bluetooth/services/event-service.js +269 -0
  194. package/build/esm/bluetooth/services/event-service.js.map +1 -0
  195. package/build/esm/bluetooth/services/io-pin-service.d.ts +65 -0
  196. package/build/esm/bluetooth/services/io-pin-service.js +169 -0
  197. package/build/esm/bluetooth/services/io-pin-service.js.map +1 -0
  198. package/build/{cjs → esm/bluetooth/services}/led-service.d.ts +2 -3
  199. package/build/esm/{led-service.js → bluetooth/services/led-service.js} +4 -1
  200. package/build/esm/bluetooth/services/led-service.js.map +1 -0
  201. package/build/esm/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  202. package/build/esm/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +11 -6
  203. package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -0
  204. package/build/{cjs → esm/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  205. package/build/esm/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +4 -4
  206. package/build/esm/bluetooth/services/partial-flashing-service.js.map +1 -0
  207. package/build/esm/bluetooth/services/temperature-service.d.ts +14 -0
  208. package/build/esm/bluetooth/services/temperature-service.js +76 -0
  209. package/build/esm/bluetooth/services/temperature-service.js.map +1 -0
  210. package/build/esm/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  211. package/build/esm/{uart-service.js → bluetooth/services/uart-service.js} +18 -6
  212. package/build/esm/bluetooth/services/uart-service.js.map +1 -0
  213. package/build/esm/board-id.d.ts +1 -1
  214. package/build/esm/board-id.js.map +1 -1
  215. package/build/esm/device.d.ts +191 -101
  216. package/build/esm/device.js +45 -104
  217. package/build/esm/device.js.map +1 -1
  218. package/build/esm/events.d.ts +8 -108
  219. package/build/esm/events.js +26 -86
  220. package/build/esm/events.js.map +1 -1
  221. package/build/esm/hex-util.d.ts +1 -0
  222. package/build/esm/hex-util.js +11 -0
  223. package/build/esm/hex-util.js.map +1 -0
  224. package/build/esm/index.d.ts +8 -16
  225. package/build/esm/index.js +7 -11
  226. package/build/esm/index.js.map +1 -1
  227. package/build/esm/logging.js.map +1 -1
  228. package/build/esm/microbit-events.d.ts +67 -0
  229. package/build/esm/microbit-events.js +52 -0
  230. package/build/esm/microbit-events.js.map +1 -0
  231. package/build/esm/radio-bridge/connection.d.ts +52 -0
  232. package/build/esm/{usb-radio-bridge.js → radio-bridge/connection.js} +84 -96
  233. package/build/esm/radio-bridge/connection.js.map +1 -0
  234. package/build/esm/radio-bridge/index.d.ts +4 -0
  235. package/build/esm/radio-bridge/index.js +5 -0
  236. package/build/esm/radio-bridge/index.js.map +1 -0
  237. package/build/esm/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  238. package/build/esm/radio-bridge/serial-protocol.js.map +1 -0
  239. package/build/esm/service-events.d.ts +92 -15
  240. package/build/esm/service-events.js +5 -34
  241. package/build/esm/service-events.js.map +1 -1
  242. package/build/{cjs/hex-flash-data-source.d.ts → esm/universal-hex/flash-data-source.d.ts} +1 -1
  243. package/build/esm/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -3
  244. package/build/esm/universal-hex/flash-data-source.js.map +1 -0
  245. package/build/esm/universal-hex/index.d.ts +4 -0
  246. package/build/esm/universal-hex/index.js +5 -0
  247. package/build/esm/universal-hex/index.js.map +1 -0
  248. package/build/esm/usb/arm-debug.d.ts +137 -0
  249. package/build/esm/usb/arm-debug.js +409 -0
  250. package/build/esm/usb/arm-debug.js.map +1 -0
  251. package/build/{cjs → esm/usb}/board-serial-info.d.ts +2 -1
  252. package/build/esm/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  253. package/build/esm/usb/board-serial-info.js.map +1 -0
  254. package/build/esm/usb/cdc-saturation.d.ts +36 -0
  255. package/build/esm/usb/cdc-saturation.js +148 -0
  256. package/build/esm/usb/cdc-saturation.js.map +1 -0
  257. package/build/esm/usb/cmsis-dap.d.ts +113 -0
  258. package/build/esm/usb/cmsis-dap.js +342 -0
  259. package/build/esm/usb/cmsis-dap.js.map +1 -0
  260. package/build/esm/usb/connection.d.ts +96 -0
  261. package/build/esm/{usb.js → usb/connection.js} +253 -168
  262. package/build/esm/usb/connection.js.map +1 -0
  263. package/build/esm/usb/cortex-m.d.ts +72 -0
  264. package/build/esm/usb/cortex-m.js +161 -0
  265. package/build/esm/usb/cortex-m.js.map +1 -0
  266. package/build/esm/usb/daplink.d.ts +69 -0
  267. package/build/esm/usb/daplink.js +231 -0
  268. package/build/esm/usb/daplink.js.map +1 -0
  269. package/build/esm/usb/device-wrapper.d.ts +34 -0
  270. package/build/esm/usb/device-wrapper.js +98 -0
  271. package/build/esm/usb/device-wrapper.js.map +1 -0
  272. package/build/esm/usb/index.d.ts +5 -0
  273. package/build/esm/usb/index.js +5 -0
  274. package/build/esm/usb/index.js.map +1 -0
  275. package/build/{cjs/usb-partial-flashing-utils.d.ts → esm/usb/partial-flashing-utils.d.ts} +6 -9
  276. package/build/esm/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +4 -44
  277. package/build/esm/usb/partial-flashing-utils.js.map +1 -0
  278. package/build/{cjs/usb-partial-flashing.d.ts → esm/usb/partial-flashing.d.ts} +37 -11
  279. package/build/esm/{usb-partial-flashing.js → usb/partial-flashing.js} +169 -110
  280. package/build/esm/usb/partial-flashing.js.map +1 -0
  281. package/build/esm/usb/promise-queue.js.map +1 -0
  282. package/build/esm/usb/serial-events.d.ts +16 -0
  283. package/build/esm/usb/serial-events.js +2 -0
  284. package/build/esm/usb/serial-events.js.map +1 -0
  285. package/build/esm/usb/transport.d.ts +42 -0
  286. package/build/esm/usb/transport.js +151 -0
  287. package/build/esm/usb/transport.js.map +1 -0
  288. package/package.json +61 -14
  289. package/build/cjs/accelerometer-service.js.map +0 -1
  290. package/build/cjs/accelerometer.d.ts +0 -9
  291. package/build/cjs/accelerometer.js +0 -16
  292. package/build/cjs/accelerometer.js.map +0 -1
  293. package/build/cjs/bluetooth-device-wrapper.js.map +0 -1
  294. package/build/cjs/bluetooth.d.ts +0 -112
  295. package/build/cjs/bluetooth.js +0 -457
  296. package/build/cjs/bluetooth.js.map +0 -1
  297. package/build/cjs/board-serial-info.js.map +0 -1
  298. package/build/cjs/button-service.js.map +0 -1
  299. package/build/cjs/buttons.d.ts +0 -10
  300. package/build/cjs/buttons.js +0 -22
  301. package/build/cjs/buttons.js.map +0 -1
  302. package/build/cjs/constants.d.ts +0 -48
  303. package/build/cjs/constants.js +0 -73
  304. package/build/cjs/constants.js.map +0 -1
  305. package/build/cjs/device-information-service.js +0 -34
  306. package/build/cjs/device-information-service.js.map +0 -1
  307. package/build/cjs/dfu-service.js.map +0 -1
  308. package/build/cjs/flashing/flashing-full.js.map +0 -1
  309. package/build/cjs/flashing/flashing-makecode.d.ts +0 -6
  310. package/build/cjs/flashing/flashing-makecode.js.map +0 -1
  311. package/build/cjs/flashing/flashing-partial.d.ts +0 -9
  312. package/build/cjs/flashing/flashing-partial.js +0 -98
  313. package/build/cjs/flashing/flashing-partial.js.map +0 -1
  314. package/build/cjs/flashing/flashing-v1.js.map +0 -1
  315. package/build/cjs/flashing/nordic-dfu.js.map +0 -1
  316. package/build/cjs/flashing/zip.js.map +0 -1
  317. package/build/cjs/hex-flash-data-source.js.map +0 -1
  318. package/build/cjs/led-service.js.map +0 -1
  319. package/build/cjs/led.d.ts +0 -6
  320. package/build/cjs/led.js.map +0 -1
  321. package/build/cjs/magnetometer-service.js.map +0 -1
  322. package/build/cjs/magnetometer.d.ts +0 -9
  323. package/build/cjs/magnetometer.js +0 -16
  324. package/build/cjs/magnetometer.js.map +0 -1
  325. package/build/cjs/partial-flashing-service.js.map +0 -1
  326. package/build/cjs/promise-queue.js.map +0 -1
  327. package/build/cjs/serial-events.d.ts +0 -20
  328. package/build/cjs/serial-events.js +0 -69
  329. package/build/cjs/serial-events.js.map +0 -1
  330. package/build/cjs/setupTests.d.ts +0 -6
  331. package/build/cjs/setupTests.js.map +0 -1
  332. package/build/cjs/uart-service.js.map +0 -1
  333. package/build/cjs/uart.d.ts +0 -4
  334. package/build/cjs/uart.js +0 -16
  335. package/build/cjs/uart.js.map +0 -1
  336. package/build/cjs/usb-device-wrapper.d.ts +0 -47
  337. package/build/cjs/usb-device-wrapper.js +0 -437
  338. package/build/cjs/usb-device-wrapper.js.map +0 -1
  339. package/build/cjs/usb-partial-flashing-utils.js.map +0 -1
  340. package/build/cjs/usb-partial-flashing.js.map +0 -1
  341. package/build/cjs/usb-radio-bridge.d.ts +0 -24
  342. package/build/cjs/usb-radio-bridge.js.map +0 -1
  343. package/build/cjs/usb-serial-protocol.js.map +0 -1
  344. package/build/cjs/usb.d.ts +0 -66
  345. package/build/cjs/usb.js.map +0 -1
  346. package/build/esm/accelerometer-service.js.map +0 -1
  347. package/build/esm/accelerometer.d.ts +0 -9
  348. package/build/esm/accelerometer.js +0 -12
  349. package/build/esm/accelerometer.js.map +0 -1
  350. package/build/esm/bluetooth-device-wrapper.js.map +0 -1
  351. package/build/esm/bluetooth-profile.js.map +0 -1
  352. package/build/esm/bluetooth.d.ts +0 -112
  353. package/build/esm/bluetooth.js +0 -427
  354. package/build/esm/bluetooth.js.map +0 -1
  355. package/build/esm/board-serial-info.js.map +0 -1
  356. package/build/esm/button-service.js.map +0 -1
  357. package/build/esm/buttons.d.ts +0 -10
  358. package/build/esm/buttons.js +0 -18
  359. package/build/esm/buttons.js.map +0 -1
  360. package/build/esm/constants.d.ts +0 -48
  361. package/build/esm/constants.js +0 -70
  362. package/build/esm/constants.js.map +0 -1
  363. package/build/esm/device-information-service.js +0 -30
  364. package/build/esm/device-information-service.js.map +0 -1
  365. package/build/esm/dfu-service.js.map +0 -1
  366. package/build/esm/flashing/flashing-full.js.map +0 -1
  367. package/build/esm/flashing/flashing-makecode.d.ts +0 -6
  368. package/build/esm/flashing/flashing-makecode.js.map +0 -1
  369. package/build/esm/flashing/flashing-partial.d.ts +0 -9
  370. package/build/esm/flashing/flashing-partial.js +0 -95
  371. package/build/esm/flashing/flashing-partial.js.map +0 -1
  372. package/build/esm/flashing/flashing-v1.js.map +0 -1
  373. package/build/esm/flashing/nordic-dfu.js.map +0 -1
  374. package/build/esm/flashing/zip.js.map +0 -1
  375. package/build/esm/hex-flash-data-source.js.map +0 -1
  376. package/build/esm/led-service.js.map +0 -1
  377. package/build/esm/led.d.ts +0 -6
  378. package/build/esm/led.js +0 -2
  379. package/build/esm/led.js.map +0 -1
  380. package/build/esm/magnetometer-service.js.map +0 -1
  381. package/build/esm/magnetometer.d.ts +0 -9
  382. package/build/esm/magnetometer.js +0 -12
  383. package/build/esm/magnetometer.js.map +0 -1
  384. package/build/esm/partial-flashing-service.js.map +0 -1
  385. package/build/esm/promise-queue.js.map +0 -1
  386. package/build/esm/serial-events.d.ts +0 -20
  387. package/build/esm/serial-events.js +0 -61
  388. package/build/esm/serial-events.js.map +0 -1
  389. package/build/esm/setupTests.d.ts +0 -6
  390. package/build/esm/setupTests.js.map +0 -1
  391. package/build/esm/uart-service.js.map +0 -1
  392. package/build/esm/uart.d.ts +0 -4
  393. package/build/esm/uart.js +0 -12
  394. package/build/esm/uart.js.map +0 -1
  395. package/build/esm/usb-device-wrapper.d.ts +0 -47
  396. package/build/esm/usb-device-wrapper.js +0 -410
  397. package/build/esm/usb-device-wrapper.js.map +0 -1
  398. package/build/esm/usb-partial-flashing-utils.js.map +0 -1
  399. package/build/esm/usb-partial-flashing.js.map +0 -1
  400. package/build/esm/usb-radio-bridge.d.ts +0 -24
  401. package/build/esm/usb-radio-bridge.js.map +0 -1
  402. package/build/esm/usb-serial-protocol.js.map +0 -1
  403. package/build/esm/usb.d.ts +0 -66
  404. package/build/esm/usb.js.map +0 -1
  405. package/typedoc.json +0 -14
  406. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  407. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  408. /package/build/cjs/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  409. /package/build/cjs/{flashing → bluetooth/flashing}/zip.js +0 -0
  410. /package/build/cjs/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  411. /package/build/cjs/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  412. /package/build/cjs/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  413. /package/build/cjs/{promise-queue.js → usb/promise-queue.js} +0 -0
  414. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  415. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  416. /package/build/esm/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  417. /package/build/esm/{flashing → bluetooth/flashing}/zip.js +0 -0
  418. /package/build/esm/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  419. /package/build/esm/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  420. /package/build/esm/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  421. /package/build/esm/{promise-queue.js → usb/promise-queue.js} +0 -0
@@ -0,0 +1,137 @@
1
+ /**
2
+ * (c) 2026, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * Derived from dapjs (https://github.com/ARMmbed/dapjs) which is
5
+ * Copyright (c) Arm Limited 2018
6
+ * Copyright (c) Microsoft Corporation
7
+ *
8
+ * SPDX-License-Identifier: MIT
9
+ *
10
+ * ARM Debug Interface (ADI) layer for SWD access to a Cortex-M target,
11
+ * derived from dapjs (https://github.com/ARMmbed/dapjs). This file and
12
+ * its siblings (transport.ts, cmsis-dap.ts, cortex-m.ts, daplink.ts)
13
+ * are a minimal reimplementation covering only the features needed for
14
+ * micro:bit.
15
+ *
16
+ * ArmDebugSwd manages the SWD connection lifecycle and provides
17
+ * register-level access to the Debug Port (DP) and Access Port (AP).
18
+ * It sits between CmsisDapUsb (command framing) and higher-level consumers
19
+ * like CortexM (processor control) and DAPLink (flash/serial).
20
+ *
21
+ * Key responsibilities:
22
+ * - SWD initialisation sequence (JTAG-to-SWD switch, power-up, ID read)
23
+ * - Automatic drain-and-retry on stale USB responses after page reload
24
+ * - DP_SELECT and AP_CSW register caching to reduce redundant writes
25
+ * - Memory read/write via AP_TAR + AP_DRW, handling page boundaries
26
+ * and block-transfer size limits
27
+ *
28
+ * Protocol references:
29
+ * - ARM ADI: https://developer.arm.com/documentation/ihi0031/a/
30
+ * - DAPLink: https://github.com/ARMmbed/DAPLink
31
+ *
32
+ * The dapjs license is included below:
33
+ *
34
+ * DAPjs
35
+ * Copyright (c) Arm Limited 2018
36
+ * Copyright (c) Microsoft Corporation
37
+ *
38
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
39
+ * of this software and associated documentation files (the "Software"), to deal
40
+ * in the Software without restriction, including without limitation the rights
41
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
42
+ * copies of the Software, and to permit persons to whom the Software is
43
+ * furnished to do so, subject to the following conditions:
44
+ *
45
+ * The above copyright notice and this permission notice shall be included in
46
+ * all copies or substantial portions of the Software.
47
+ *
48
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
49
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
50
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
51
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
52
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
53
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
54
+ * IN THE SOFTWARE.
55
+ */
56
+ import { Logging } from "../logging.js";
57
+ import { type CmsisDap, DapOperation } from "./cmsis-dap.js";
58
+ export declare function waitFor(fn: () => Promise<boolean>, timeout?: number, delay?: number): Promise<void>;
59
+ export interface ArmDebug {
60
+ readonly dap: CmsisDap;
61
+ readonly isOpen: boolean;
62
+ /** Read a 32-bit word from a memory-mapped address. */
63
+ readMem32(address: number): Promise<number>;
64
+ /** Write a 32-bit word to a memory-mapped address. */
65
+ writeMem32(address: number, value: number): Promise<void>;
66
+ /** Build DAP operations for reading a 32-bit word (for use with transferSequence). */
67
+ readMem32Ops(address: number): DapOperation[];
68
+ /** Build DAP operations for writing a 32-bit word (for use with transferSequence). */
69
+ writeMem32Ops(address: number, value: number): DapOperation[];
70
+ /**
71
+ * Read a block of 32-bit words from memory.
72
+ * Handles TAR auto-increment page boundaries and block size limits.
73
+ */
74
+ readBlock(address: number, count: number): Promise<Uint32Array>;
75
+ /**
76
+ * Write a block of 32-bit words to memory.
77
+ * Handles TAR auto-increment page boundaries and block size limits.
78
+ */
79
+ writeBlock(address: number, values: Uint32Array): Promise<void>;
80
+ /**
81
+ * Execute a sequence of operation groups as individual transfers.
82
+ * Each group is sent as a separate DAP_TRANSFER to guarantee that
83
+ * all operations within a group execute atomically on the wire.
84
+ */
85
+ transferSequence(groups: DapOperation[][]): Promise<Uint32Array>;
86
+ /**
87
+ * Reset cached protocol state without closing the transport.
88
+ * Call after operations that reset the target (e.g. DAPLink flash reset).
89
+ */
90
+ resetState(): void;
91
+ /**
92
+ * Connect to the target with automatic drain-and-retry on stale responses.
93
+ */
94
+ connect(maxRetries?: number): Promise<void>;
95
+ disconnect(): Promise<void>;
96
+ /**
97
+ * Reset cached state and reconnect without closing the transport.
98
+ * Use after operations like DAPLink flash that leave the protocol state
99
+ * stale but don't require full re-enumeration.
100
+ */
101
+ reinit(): Promise<void>;
102
+ }
103
+ export declare class ArmDebugSwd implements ArmDebug {
104
+ readonly dap: CmsisDap;
105
+ private logging;
106
+ private swdConnected;
107
+ private selectedAddress?;
108
+ private cswValue?;
109
+ constructor(dap: CmsisDap, logging: Logging);
110
+ get isOpen(): boolean;
111
+ /**
112
+ * Initialize SWD: connect to the target, set up the debug port,
113
+ * and power up the debug and system domains.
114
+ */
115
+ private connectOnce;
116
+ connect(maxRetries?: number): Promise<void>;
117
+ resetState(): void;
118
+ disconnect(): Promise<void>;
119
+ reinit(): Promise<void>;
120
+ private readDPOps;
121
+ private writeDPOps;
122
+ private readAPOps;
123
+ private writeAPOps;
124
+ readMem32Ops(address: number): DapOperation[];
125
+ writeMem32Ops(address: number, value: number): DapOperation[];
126
+ /**
127
+ * Execute a batch of DAP transfer operations, deduplicating writes
128
+ * to DP_SELECT and AP_CSW that match cached state.
129
+ */
130
+ private transfer;
131
+ transferSequence(groups: DapOperation[][]): Promise<Uint32Array>;
132
+ private readDP;
133
+ readMem32(address: number): Promise<number>;
134
+ writeMem32(address: number, value: number): Promise<void>;
135
+ readBlock(address: number, count: number): Promise<Uint32Array>;
136
+ writeBlock(address: number, values: Uint32Array): Promise<void>;
137
+ }
@@ -0,0 +1,409 @@
1
+ /**
2
+ * (c) 2026, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * Derived from dapjs (https://github.com/ARMmbed/dapjs) which is
5
+ * Copyright (c) Arm Limited 2018
6
+ * Copyright (c) Microsoft Corporation
7
+ *
8
+ * SPDX-License-Identifier: MIT
9
+ *
10
+ * ARM Debug Interface (ADI) layer for SWD access to a Cortex-M target,
11
+ * derived from dapjs (https://github.com/ARMmbed/dapjs). This file and
12
+ * its siblings (transport.ts, cmsis-dap.ts, cortex-m.ts, daplink.ts)
13
+ * are a minimal reimplementation covering only the features needed for
14
+ * micro:bit.
15
+ *
16
+ * ArmDebugSwd manages the SWD connection lifecycle and provides
17
+ * register-level access to the Debug Port (DP) and Access Port (AP).
18
+ * It sits between CmsisDapUsb (command framing) and higher-level consumers
19
+ * like CortexM (processor control) and DAPLink (flash/serial).
20
+ *
21
+ * Key responsibilities:
22
+ * - SWD initialisation sequence (JTAG-to-SWD switch, power-up, ID read)
23
+ * - Automatic drain-and-retry on stale USB responses after page reload
24
+ * - DP_SELECT and AP_CSW register caching to reduce redundant writes
25
+ * - Memory read/write via AP_TAR + AP_DRW, handling page boundaries
26
+ * and block-transfer size limits
27
+ *
28
+ * Protocol references:
29
+ * - ARM ADI: https://developer.arm.com/documentation/ihi0031/a/
30
+ * - DAPLink: https://github.com/ARMmbed/DAPLink
31
+ *
32
+ * The dapjs license is included below:
33
+ *
34
+ * DAPjs
35
+ * Copyright (c) Arm Limited 2018
36
+ * Copyright (c) Microsoft Corporation
37
+ *
38
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
39
+ * of this software and associated documentation files (the "Software"), to deal
40
+ * in the Software without restriction, including without limitation the rights
41
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
42
+ * copies of the Software, and to permit persons to whom the Software is
43
+ * furnished to do so, subject to the following conditions:
44
+ *
45
+ * The above copyright notice and this permission notice shall be included in
46
+ * all copies or substantial portions of the Software.
47
+ *
48
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
49
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
50
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
51
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
52
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
53
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
54
+ * IN THE SOFTWARE.
55
+ */
56
+ import { DeviceError } from "../device.js";
57
+ import { ABORT_ALL, AP, DapResponseMismatchError, DP, READ, WRITE, } from "./cmsis-dap.js";
58
+ // ---------------------------------------------------------------------------
59
+ // Constants
60
+ // ---------------------------------------------------------------------------
61
+ // DP registers
62
+ const DP_ABORT = 0x0;
63
+ const DP_DPIDR = 0x0;
64
+ const DP_CTRL_STAT = 0x4;
65
+ const DP_SELECT = 0x8;
66
+ // AP registers (values are byte addresses, pre-shifted to match the DAP
67
+ // transfer operation encoding where bits [3:2] carry A[3:2])
68
+ const AP_CSW = 0x00;
69
+ const AP_TAR = 0x04;
70
+ const AP_DRW = 0x0c;
71
+ // CSW mask values
72
+ const CSW_SIZE32 = 1 << 1;
73
+ const CSW_ADDRINC_SINGLE = 1 << 4;
74
+ const CSW_DBGSTATUS = 1 << 6;
75
+ const CSW_RESERVED = 1 << 24;
76
+ const CSW_HPROT1 = 1 << 25;
77
+ const CSW_MASTERTYPE = 1 << 29;
78
+ const CSW_VALUE = CSW_ADDRINC_SINGLE |
79
+ CSW_DBGSTATUS |
80
+ CSW_RESERVED |
81
+ CSW_HPROT1 |
82
+ CSW_MASTERTYPE;
83
+ // Bank select masks
84
+ const APSEL = 0xff000000;
85
+ const APBANKSEL = 0x000000f0;
86
+ // CTRL/STAT register bits
87
+ const CSYSPWRUPREQ = 1 << 30;
88
+ const CDBGPWRUPREQ = 1 << 28;
89
+ const CSYSPWRUPACK = 1 << 31;
90
+ const CDBGPWRUPACK = 1 << 29;
91
+ // TAR auto-increment page size (1KB, implementation-defined minimum)
92
+ const AUTOINC_PAGESIZE = 1 << 10;
93
+ // Clock frequency (10 MHz)
94
+ const CLOCK_FREQUENCY = 10_000_000;
95
+ // Wait delay for polling loops
96
+ const WAIT_DELAY = 100;
97
+ // ---------------------------------------------------------------------------
98
+ // Utilities
99
+ // ---------------------------------------------------------------------------
100
+ export async function waitFor(fn, timeout = 10_000, delay = WAIT_DELAY) {
101
+ const deadline = timeout > 0 ? Date.now() + timeout : 0;
102
+ while (true) {
103
+ if (await fn())
104
+ return;
105
+ if (deadline && Date.now() > deadline) {
106
+ throw new DeviceError({
107
+ code: "timeout",
108
+ message: "Wait timed out",
109
+ });
110
+ }
111
+ await new Promise((resolve) => setTimeout(resolve, delay));
112
+ }
113
+ }
114
+ function concatUint32Arrays(arrays) {
115
+ if (arrays.length === 1)
116
+ return arrays[0];
117
+ let length = 0;
118
+ for (const a of arrays)
119
+ length += a.length;
120
+ const result = new Uint32Array(length);
121
+ let offset = 0;
122
+ for (const a of arrays) {
123
+ result.set(a, offset);
124
+ offset += a.length;
125
+ }
126
+ return result;
127
+ }
128
+ export class ArmDebugSwd {
129
+ constructor(dap, logging) {
130
+ Object.defineProperty(this, "dap", {
131
+ enumerable: true,
132
+ configurable: true,
133
+ writable: true,
134
+ value: dap
135
+ });
136
+ Object.defineProperty(this, "logging", {
137
+ enumerable: true,
138
+ configurable: true,
139
+ writable: true,
140
+ value: logging
141
+ });
142
+ Object.defineProperty(this, "swdConnected", {
143
+ enumerable: true,
144
+ configurable: true,
145
+ writable: true,
146
+ value: false
147
+ });
148
+ // ADI state (register caching)
149
+ Object.defineProperty(this, "selectedAddress", {
150
+ enumerable: true,
151
+ configurable: true,
152
+ writable: true,
153
+ value: void 0
154
+ });
155
+ Object.defineProperty(this, "cswValue", {
156
+ enumerable: true,
157
+ configurable: true,
158
+ writable: true,
159
+ value: void 0
160
+ });
161
+ }
162
+ get isOpen() {
163
+ return this.dap.isOpen;
164
+ }
165
+ // ---- SWD lifecycle ----
166
+ /**
167
+ * Initialize SWD: connect to the target, set up the debug port,
168
+ * and power up the debug and system domains.
169
+ */
170
+ async connectOnce() {
171
+ if (this.swdConnected)
172
+ return;
173
+ await this.dap.open();
174
+ // SWD protocol setup. On failure the transport is left open so the
175
+ // caller can drain stale responses and retry without re-opening.
176
+ try {
177
+ await this.dap.swjClock(CLOCK_FREQUENCY);
178
+ await this.dap.connect();
179
+ }
180
+ catch (error) {
181
+ try {
182
+ await this.dap.clearAbort();
183
+ }
184
+ catch {
185
+ /* ignore */
186
+ }
187
+ throw error;
188
+ }
189
+ await this.dap.configureTransfer(0, 100, 0);
190
+ // Select SWD protocol
191
+ await this.dap.swjSequence(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]));
192
+ await this.dap.swjSequence(new Uint8Array([0x9e, 0xe7]));
193
+ await this.dap.swjSequence(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]));
194
+ await this.dap.swjSequence(new Uint8Array([0x00]));
195
+ this.swdConnected = true;
196
+ // Initialize debug port and power up
197
+ try {
198
+ await this.readDP(DP_DPIDR);
199
+ await this.transferSequence([
200
+ this.writeDPOps(DP_ABORT, ABORT_ALL),
201
+ this.writeDPOps(DP_SELECT, AP_CSW),
202
+ this.writeDPOps(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ),
203
+ ]);
204
+ const mask = CDBGPWRUPACK | CSYSPWRUPACK;
205
+ await waitFor(async () => {
206
+ const status = await this.readDP(DP_CTRL_STAT);
207
+ return (status & mask) === mask;
208
+ }, 5000);
209
+ }
210
+ catch (error) {
211
+ await this.disconnect();
212
+ throw error;
213
+ }
214
+ this.logging.log("SWD connected");
215
+ }
216
+ async connect(maxRetries = 3) {
217
+ let lastError;
218
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
219
+ try {
220
+ if (attempt > 0) {
221
+ this.logging.log(`Connection retry attempt ${attempt + 1}/${maxRetries}`);
222
+ await this.dap.drainStaleResponses();
223
+ }
224
+ await this.connectOnce();
225
+ return;
226
+ }
227
+ catch (e) {
228
+ if (e instanceof DapResponseMismatchError) {
229
+ lastError = e;
230
+ this.logging.log(`Stale response during connect: ${e.message}`);
231
+ continue;
232
+ }
233
+ throw e;
234
+ }
235
+ }
236
+ throw lastError || new Error("Connection failed after retries");
237
+ }
238
+ resetState() {
239
+ this.swdConnected = false;
240
+ this.selectedAddress = undefined;
241
+ this.cswValue = undefined;
242
+ }
243
+ async disconnect() {
244
+ if (!this.swdConnected)
245
+ return;
246
+ try {
247
+ await this.dap.disconnect();
248
+ }
249
+ catch {
250
+ this.logging.log("Disconnect failed, clearing abort");
251
+ try {
252
+ await this.dap.clearAbort();
253
+ }
254
+ catch {
255
+ /* ignore */
256
+ }
257
+ }
258
+ await this.dap.close();
259
+ this.resetState();
260
+ this.logging.log("SWD disconnected");
261
+ }
262
+ async reinit() {
263
+ this.logging.log("Reinitialising SWD");
264
+ this.resetState();
265
+ await this.connectOnce();
266
+ }
267
+ // ---- DP/AP register helpers ----
268
+ readDPOps(register) {
269
+ return [{ mode: READ, port: DP, register }];
270
+ }
271
+ writeDPOps(register, value) {
272
+ return [{ mode: WRITE, port: DP, register, value }];
273
+ }
274
+ readAPOps(register) {
275
+ const address = (register & APSEL) | (register & APBANKSEL);
276
+ return [
277
+ ...this.writeDPOps(DP_SELECT, address),
278
+ { mode: READ, port: AP, register },
279
+ ];
280
+ }
281
+ writeAPOps(register, value) {
282
+ const address = (register & APSEL) | (register & APBANKSEL);
283
+ return [
284
+ ...this.writeDPOps(DP_SELECT, address),
285
+ { mode: WRITE, port: AP, register, value },
286
+ ];
287
+ }
288
+ readMem32Ops(address) {
289
+ return [
290
+ ...this.writeAPOps(AP_CSW, CSW_VALUE | CSW_SIZE32),
291
+ ...this.writeAPOps(AP_TAR, address),
292
+ ...this.readAPOps(AP_DRW),
293
+ ];
294
+ }
295
+ writeMem32Ops(address, value) {
296
+ return [
297
+ ...this.writeAPOps(AP_CSW, CSW_VALUE | CSW_SIZE32),
298
+ ...this.writeAPOps(AP_TAR, address),
299
+ ...this.writeAPOps(AP_DRW, value),
300
+ ];
301
+ }
302
+ // ---- Transfer with register caching ----
303
+ /**
304
+ * Execute a batch of DAP transfer operations, deduplicating writes
305
+ * to DP_SELECT and AP_CSW that match cached state.
306
+ */
307
+ async transfer(operations) {
308
+ const filtered = operations.filter((op) => {
309
+ if (op.mode !== WRITE)
310
+ return true;
311
+ if (op.port === DP && op.register === DP_SELECT) {
312
+ return op.value !== this.selectedAddress;
313
+ }
314
+ if (op.port === AP && op.register === AP_CSW) {
315
+ return op.value !== this.cswValue;
316
+ }
317
+ return true;
318
+ });
319
+ if (filtered.length === 0) {
320
+ return new Uint32Array(0);
321
+ }
322
+ try {
323
+ const result = await this.dap.transfer(filtered);
324
+ // Update cache on success
325
+ for (const op of filtered) {
326
+ if (op.mode !== WRITE)
327
+ continue;
328
+ if (op.port === DP && op.register === DP_SELECT) {
329
+ this.selectedAddress = op.value;
330
+ }
331
+ else if (op.port === AP && op.register === AP_CSW) {
332
+ this.cswValue = op.value;
333
+ }
334
+ }
335
+ return result;
336
+ }
337
+ catch (error) {
338
+ // Transfer failed — invalidate the cache
339
+ this.selectedAddress = undefined;
340
+ this.cswValue = undefined;
341
+ throw error;
342
+ }
343
+ }
344
+ async transferSequence(groups) {
345
+ const results = [];
346
+ for (const group of groups) {
347
+ const result = await this.transfer(group);
348
+ results.push(result);
349
+ }
350
+ return concatUint32Arrays(results);
351
+ }
352
+ // ---- Memory operations ----
353
+ async readDP(register) {
354
+ const result = await this.transfer(this.readDPOps(register));
355
+ return result[0];
356
+ }
357
+ async readMem32(address) {
358
+ const result = await this.transfer(this.readMem32Ops(address));
359
+ return result[0];
360
+ }
361
+ async writeMem32(address, value) {
362
+ await this.transfer(this.writeMem32Ops(address, value));
363
+ }
364
+ async readBlock(address, count) {
365
+ const results = [];
366
+ let remaining = count;
367
+ let addr = address;
368
+ while (remaining > 0) {
369
+ const nextPageOffset = AUTOINC_PAGESIZE - (addr % AUTOINC_PAGESIZE);
370
+ const chunkWords = Math.min(remaining, nextPageOffset / 4);
371
+ await this.transferSequence([
372
+ this.writeAPOps(AP_CSW, CSW_VALUE | CSW_SIZE32),
373
+ this.writeAPOps(AP_TAR, addr),
374
+ ]);
375
+ let subRemaining = chunkWords;
376
+ while (subRemaining > 0) {
377
+ const subChunk = Math.min(subRemaining, Math.floor(this.dap.blockSize / 4));
378
+ const result = await this.dap.transferBlockRead(AP, AP_DRW, subChunk);
379
+ results.push(result);
380
+ subRemaining -= subChunk;
381
+ }
382
+ addr += chunkWords * 4;
383
+ remaining -= chunkWords;
384
+ }
385
+ return concatUint32Arrays(results);
386
+ }
387
+ async writeBlock(address, values) {
388
+ let index = 0;
389
+ let addr = address;
390
+ while (index < values.length) {
391
+ const nextPageOffset = AUTOINC_PAGESIZE - (addr % AUTOINC_PAGESIZE);
392
+ const chunkWords = Math.min(values.length - index, nextPageOffset / 4);
393
+ const chunk = values.slice(index, index + chunkWords);
394
+ await this.transferSequence([
395
+ this.writeAPOps(AP_CSW, CSW_VALUE | CSW_SIZE32),
396
+ this.writeAPOps(AP_TAR, addr),
397
+ ]);
398
+ let subIndex = 0;
399
+ while (subIndex < chunk.length) {
400
+ const subChunk = chunk.slice(subIndex, subIndex + Math.floor(this.dap.blockSize / 4));
401
+ await this.dap.transferBlockWrite(AP, AP_DRW, subChunk);
402
+ subIndex += Math.floor(this.dap.blockSize / 4);
403
+ }
404
+ addr += chunkWords * 4;
405
+ index += chunkWords;
406
+ }
407
+ }
408
+ }
409
+ //# sourceMappingURL=arm-debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arm-debug.js","sourceRoot":"","sources":["../../../src/usb/arm-debug.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,13 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { BoardId } from "./board-id.js";
6
+ import { BoardId } from "../board-id.js";
7
7
  export declare class BoardSerialInfo {
8
8
  id: BoardId;
9
9
  familyId: string;
10
10
  hic: string;
11
11
  constructor(id: BoardId, familyId: string, hic: string);
12
+ static fromSerial(serial: string, log: (msg: string) => void): BoardSerialInfo;
12
13
  static parse(device: USBDevice, log: (msg: string) => void): BoardSerialInfo;
13
14
  eq(other: BoardSerialInfo): boolean;
14
15
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { BoardId } from "./board-id.js";
6
+ import { BoardId } from "../board-id.js";
7
7
  export class BoardSerialInfo {
8
8
  constructor(id, familyId, hic) {
9
9
  Object.defineProperty(this, "id", {
@@ -25,19 +25,22 @@ export class BoardSerialInfo {
25
25
  value: hic
26
26
  });
27
27
  }
28
- static parse(device, log) {
29
- const serial = device.serialNumber;
30
- if (!serial) {
31
- throw new Error("Could not detected ID from connected board.");
32
- }
28
+ static fromSerial(serial, log) {
33
29
  if (serial.length !== 48) {
34
- log(`USB serial number unexpected length: ${serial.length}`);
30
+ log(`Serial number unexpected length: ${serial.length}`);
35
31
  }
36
32
  const id = serial.substring(0, 4);
37
33
  const familyId = serial.substring(4, 8);
38
34
  const hic = serial.slice(-8);
39
35
  return new BoardSerialInfo(BoardId.parse(id), familyId, hic);
40
36
  }
37
+ static parse(device, log) {
38
+ const serial = device.serialNumber;
39
+ if (!serial) {
40
+ throw new Error("Could not detected ID from connected board.");
41
+ }
42
+ return BoardSerialInfo.fromSerial(serial, log);
43
+ }
41
44
  eq(other) {
42
45
  return (other.id === this.id &&
43
46
  other.familyId === this.familyId &&
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-serial-info.js","sourceRoot":"","sources":["../../../src/usb/board-serial-info.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,eAAe;IAC1B,YACS,EAAW,EACX,QAAgB,EAChB,GAAW;QAFlB;;;;mBAAO,EAAE;WAAS;QAClB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,GAAG;WAAQ;IACjB,CAAC;IAEJ,MAAM,CAAC,UAAU,CAAC,MAAc,EAAE,GAA0B;QAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,GAAG,CAAC,oCAAoC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAiB,EAAE,GAA0B;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,EAAE,CAAC,KAAsB;QACvB,OAAO,CACL,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;YACpB,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAChC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CACvB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * (c) 2026, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * CDC pipeline saturation
8
+ *
9
+ * DAPLink's CDC serial path and WebUSB vendor serial reads share the same
10
+ * UART ring buffer. After a physical USB connection, CDC consumes early
11
+ * serial bytes before our vendor reads can get them, causing truncated
12
+ * output. See: https://github.com/ARMmbed/DAPLink/issues/903
13
+ *
14
+ * Workaround: before flashing, push dummy data through the target's UART
15
+ * to fill DAPLink's internal buffers. When nobody is reading from the CDC
16
+ * serial port, the CDC TX buffer fills first, then cdc_process_event()
17
+ * stops pulling from the UART RX ring buffer, and that fills too. Once
18
+ * both are full, all subsequent UART data overflows harmlessly and
19
+ * post-flash serial output is left for our vendor reads.
20
+ *
21
+ * V1 (nRF51) uses a Thumb blob for the legacy byte-at-a-time UART.
22
+ * V2 (nRF52833) uses SWD register writes to trigger a UARTE DMA transfer.
23
+ *
24
+ * V1 DAPLink defaults to 9600 baud on fresh USB connection, so we call
25
+ * setBaudrate(115200) before saturation to ensure DAPLink can decode the
26
+ * bytes we send.
27
+ */
28
+ import { BoardVersion } from "../device.js";
29
+ import { Logging } from "../logging.js";
30
+ import { type USBDeviceWrapper } from "./device-wrapper.js";
31
+ /**
32
+ * Push dummy data through the target's UART to fill DAPLink's internal
33
+ * CDC buffers, preventing CDC from consuming post-flash serial output.
34
+ * Must be called while the target is halted.
35
+ */
36
+ export declare function saturateCdcPipeline(device: USBDeviceWrapper, boardVersion: BoardVersion, logging: Logging): Promise<void>;