@microbit/microbit-connection 0.9.0-apps.alpha.16 → 0.9.0-apps.alpha.17
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.
- package/build/{esm/bluetooth.d.ts → cjs/bluetooth/connection.d.ts} +30 -26
- package/build/cjs/{bluetooth.js → bluetooth/connection.js} +147 -104
- package/build/cjs/bluetooth/connection.js.map +1 -0
- package/build/cjs/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
- package/build/cjs/bluetooth/connection.test.js.map +1 -0
- package/build/cjs/bluetooth/device-bond-state.js.map +1 -0
- package/build/cjs/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
- package/build/cjs/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +35 -35
- package/build/cjs/bluetooth/device-wrapper.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
- package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
- package/build/cjs/bluetooth/flashing/flashing-makecode.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.js +3 -3
- package/build/cjs/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.js +5 -5
- package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -0
- package/build/cjs/bluetooth/flashing/flashing-v1.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.js +11 -8
- package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -0
- package/build/cjs/bluetooth/flashing/zip.js.map +1 -0
- package/build/cjs/bluetooth/flashing/zip.test.js.map +1 -0
- package/build/cjs/bluetooth/index.d.ts +5 -0
- package/build/cjs/bluetooth/index.js +9 -0
- package/build/cjs/bluetooth/index.js.map +1 -0
- package/build/cjs/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
- package/build/cjs/bluetooth/profile.js.map +1 -0
- package/build/cjs/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
- package/build/cjs/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +16 -12
- package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/button-service.d.ts +2 -3
- package/build/cjs/{button-service.js → bluetooth/services/button-service.js} +15 -14
- package/build/cjs/bluetooth/services/button-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/device-information-service.d.ts +1 -1
- package/build/cjs/{device-information-service.js → bluetooth/services/device-information-service.js} +2 -2
- package/build/cjs/bluetooth/services/device-information-service.js.map +1 -0
- package/build/cjs/{dfu-service.js → bluetooth/services/dfu-service.js} +2 -2
- package/build/cjs/bluetooth/services/dfu-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/led-service.d.ts +2 -3
- package/build/cjs/{led-service.js → bluetooth/services/led-service.js} +7 -7
- package/build/cjs/bluetooth/services/led-service.js.map +1 -0
- package/build/cjs/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
- package/build/cjs/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +18 -14
- package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/partial-flashing-service.d.ts +1 -1
- package/build/cjs/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +8 -8
- package/build/cjs/bluetooth/services/partial-flashing-service.js.map +1 -0
- package/build/cjs/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
- package/build/cjs/{uart-service.js → bluetooth/services/uart-service.js} +12 -9
- package/build/cjs/bluetooth/services/uart-service.js.map +1 -0
- package/build/cjs/board-id.d.ts +1 -1
- package/build/cjs/board-id.js.map +1 -1
- package/build/cjs/device.d.ts +82 -75
- package/build/cjs/device.js +40 -126
- package/build/cjs/device.js.map +1 -1
- package/build/cjs/events.d.ts +9 -108
- package/build/cjs/events.js +27 -88
- package/build/cjs/events.js.map +1 -1
- package/build/cjs/events.test.js +54 -48
- package/build/cjs/events.test.js.map +1 -1
- package/build/cjs/hex-util.d.ts +1 -0
- package/build/cjs/hex-util.js +15 -0
- package/build/cjs/hex-util.js.map +1 -0
- package/build/cjs/index.d.ts +7 -16
- package/build/cjs/index.js +6 -26
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/radio-bridge/connection.d.ts +39 -0
- package/build/cjs/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
- package/build/cjs/radio-bridge/connection.js.map +1 -0
- package/build/cjs/radio-bridge/index.d.ts +4 -0
- package/build/cjs/radio-bridge/index.js +9 -0
- package/build/cjs/radio-bridge/index.js.map +1 -0
- package/build/cjs/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
- package/build/cjs/radio-bridge/serial-protocol.js.map +1 -0
- package/build/cjs/service-events.d.ts +42 -14
- package/build/cjs/service-events.js +6 -36
- package/build/cjs/service-events.js.map +1 -1
- package/build/{esm/hex-flash-data-source.d.ts → cjs/universal-hex/flash-data-source.d.ts} +1 -2
- package/build/cjs/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +7 -15
- package/build/cjs/universal-hex/flash-data-source.js.map +1 -0
- package/build/cjs/universal-hex/index.d.ts +4 -0
- package/build/cjs/universal-hex/index.js +9 -0
- package/build/cjs/universal-hex/index.js.map +1 -0
- package/build/cjs/usb/arm-debug.d.ts +137 -0
- package/build/cjs/usb/arm-debug.js +414 -0
- package/build/cjs/usb/arm-debug.js.map +1 -0
- package/build/cjs/usb/arm-debug.test.js +333 -0
- package/build/cjs/usb/arm-debug.test.js.map +1 -0
- package/build/{esm → cjs/usb}/board-serial-info.d.ts +2 -1
- package/build/cjs/{board-serial-info.js → usb/board-serial-info.js} +10 -7
- package/build/cjs/usb/board-serial-info.js.map +1 -0
- package/build/cjs/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
- package/build/cjs/usb/board-serial-info.test.js.map +1 -0
- package/build/cjs/usb/cdc-saturation.d.ts +36 -0
- package/build/cjs/usb/cdc-saturation.js +151 -0
- package/build/cjs/usb/cdc-saturation.js.map +1 -0
- package/build/cjs/usb/cmsis-dap.d.ts +113 -0
- package/build/cjs/usb/cmsis-dap.js +349 -0
- package/build/cjs/usb/cmsis-dap.js.map +1 -0
- package/build/cjs/usb/cmsis-dap.test.js +350 -0
- package/build/cjs/usb/cmsis-dap.test.js.map +1 -0
- package/build/cjs/usb/connection.d.ts +81 -0
- package/build/cjs/{usb.js → usb/connection.js} +243 -166
- package/build/cjs/usb/connection.js.map +1 -0
- package/build/cjs/{usb.test.js → usb/connection.test.js} +52 -42
- package/build/cjs/usb/connection.test.js.map +1 -0
- package/build/cjs/usb/cortex-m.d.ts +72 -0
- package/build/cjs/usb/cortex-m.js +165 -0
- package/build/cjs/usb/cortex-m.js.map +1 -0
- package/build/cjs/usb/cortex-m.test.js +217 -0
- package/build/cjs/usb/cortex-m.test.js.map +1 -0
- package/build/cjs/usb/daplink.d.ts +69 -0
- package/build/cjs/usb/daplink.js +238 -0
- package/build/cjs/usb/daplink.js.map +1 -0
- package/build/cjs/usb/daplink.test.js +290 -0
- package/build/cjs/usb/daplink.test.js.map +1 -0
- package/build/cjs/usb/device-wrapper.d.ts +34 -0
- package/build/cjs/usb/device-wrapper.js +102 -0
- package/build/cjs/usb/device-wrapper.js.map +1 -0
- package/build/cjs/usb/index.d.ts +5 -0
- package/build/cjs/usb/index.js +10 -0
- package/build/cjs/usb/index.js.map +1 -0
- package/build/{esm/usb-partial-flashing-utils.d.ts → cjs/usb/partial-flashing-utils.d.ts} +6 -9
- package/build/cjs/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +6 -49
- package/build/cjs/usb/partial-flashing-utils.js.map +1 -0
- package/build/{esm/usb-partial-flashing.d.ts → cjs/usb/partial-flashing.d.ts} +15 -7
- package/build/cjs/{usb-partial-flashing.js → usb/partial-flashing.js} +64 -119
- package/build/cjs/usb/partial-flashing.js.map +1 -0
- package/build/cjs/usb/promise-queue.js.map +1 -0
- package/build/cjs/usb/promise-queue.test.js.map +1 -0
- package/build/cjs/usb/serial-events.d.ts +21 -0
- package/build/cjs/{led.js → usb/serial-events.js} +1 -1
- package/build/cjs/usb/serial-events.js.map +1 -0
- package/build/cjs/usb/transport.d.ts +42 -0
- package/build/cjs/usb/transport.js +155 -0
- package/build/cjs/usb/transport.js.map +1 -0
- package/build/{cjs/bluetooth.d.ts → esm/bluetooth/connection.d.ts} +30 -26
- package/build/esm/{bluetooth.js → bluetooth/connection.js} +141 -98
- package/build/esm/bluetooth/connection.js.map +1 -0
- package/build/esm/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
- package/build/esm/bluetooth/connection.test.js.map +1 -0
- package/build/esm/bluetooth/device-bond-state.js.map +1 -0
- package/build/esm/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
- package/build/esm/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +32 -32
- package/build/esm/bluetooth/device-wrapper.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
- package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
- package/build/esm/bluetooth/flashing/flashing-makecode.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.test.js +2 -2
- package/build/esm/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.js +4 -4
- package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -0
- package/build/esm/bluetooth/flashing/flashing-v1.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.js +11 -8
- package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -0
- package/build/esm/bluetooth/flashing/zip.js.map +1 -0
- package/build/esm/bluetooth/flashing/zip.test.d.ts +1 -0
- package/build/esm/bluetooth/flashing/zip.test.js.map +1 -0
- package/build/esm/bluetooth/index.d.ts +5 -0
- package/build/esm/bluetooth/index.js +5 -0
- package/build/esm/bluetooth/index.js.map +1 -0
- package/build/esm/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
- package/build/{cjs/bluetooth-profile.js.map → esm/bluetooth/profile.js.map} +1 -1
- package/build/esm/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
- package/build/esm/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +10 -6
- package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/button-service.d.ts +2 -3
- package/build/esm/{button-service.js → bluetooth/services/button-service.js} +10 -9
- package/build/esm/bluetooth/services/button-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/device-information-service.d.ts +1 -1
- package/build/esm/{device-information-service.js → bluetooth/services/device-information-service.js} +1 -1
- package/build/esm/bluetooth/services/device-information-service.js.map +1 -0
- package/build/esm/{dfu-service.js → bluetooth/services/dfu-service.js} +1 -1
- package/build/esm/bluetooth/services/dfu-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/led-service.d.ts +2 -3
- package/build/esm/{led-service.js → bluetooth/services/led-service.js} +1 -1
- package/build/esm/bluetooth/services/led-service.js.map +1 -0
- package/build/esm/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
- package/build/esm/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +10 -6
- package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/partial-flashing-service.d.ts +1 -1
- package/build/esm/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +4 -4
- package/build/esm/bluetooth/services/partial-flashing-service.js.map +1 -0
- package/build/esm/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
- package/build/esm/{uart-service.js → bluetooth/services/uart-service.js} +8 -5
- package/build/esm/bluetooth/services/uart-service.js.map +1 -0
- package/build/esm/board-id.d.ts +1 -1
- package/build/esm/board-id.js.map +1 -1
- package/build/esm/device.d.ts +82 -75
- package/build/esm/device.js +38 -120
- package/build/esm/device.js.map +1 -1
- package/build/esm/events.d.ts +9 -108
- package/build/esm/events.js +26 -86
- package/build/esm/events.js.map +1 -1
- package/build/esm/events.test.js +55 -49
- package/build/esm/events.test.js.map +1 -1
- package/build/esm/hex-util.d.ts +1 -0
- package/build/esm/hex-util.js +11 -0
- package/build/esm/hex-util.js.map +1 -0
- package/build/esm/index.d.ts +7 -16
- package/build/esm/index.js +6 -10
- package/build/esm/index.js.map +1 -1
- package/build/esm/radio-bridge/connection.d.ts +39 -0
- package/build/esm/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
- package/build/esm/radio-bridge/connection.js.map +1 -0
- package/build/esm/radio-bridge/index.d.ts +4 -0
- package/build/esm/radio-bridge/index.js +5 -0
- package/build/esm/radio-bridge/index.js.map +1 -0
- package/build/esm/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
- package/build/esm/radio-bridge/serial-protocol.js.map +1 -0
- package/build/esm/service-events.d.ts +42 -14
- package/build/esm/service-events.js +5 -34
- package/build/esm/service-events.js.map +1 -1
- package/build/{cjs/hex-flash-data-source.d.ts → esm/universal-hex/flash-data-source.d.ts} +1 -2
- package/build/esm/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -13
- package/build/esm/universal-hex/flash-data-source.js.map +1 -0
- package/build/esm/universal-hex/index.d.ts +4 -0
- package/build/esm/universal-hex/index.js +5 -0
- package/build/esm/universal-hex/index.js.map +1 -0
- package/build/esm/usb/arm-debug.d.ts +137 -0
- package/build/esm/usb/arm-debug.js +409 -0
- package/build/esm/usb/arm-debug.js.map +1 -0
- package/build/esm/usb/arm-debug.test.d.ts +1 -0
- package/build/esm/usb/arm-debug.test.js +331 -0
- package/build/esm/usb/arm-debug.test.js.map +1 -0
- package/build/{cjs → esm/usb}/board-serial-info.d.ts +2 -1
- package/build/esm/{board-serial-info.js → usb/board-serial-info.js} +10 -7
- package/build/esm/usb/board-serial-info.js.map +1 -0
- package/build/esm/usb/board-serial-info.test.d.ts +1 -0
- package/build/esm/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
- package/build/esm/usb/board-serial-info.test.js.map +1 -0
- package/build/esm/usb/cdc-saturation.d.ts +36 -0
- package/build/esm/usb/cdc-saturation.js +148 -0
- package/build/esm/usb/cdc-saturation.js.map +1 -0
- package/build/esm/usb/cmsis-dap.d.ts +113 -0
- package/build/esm/usb/cmsis-dap.js +342 -0
- package/build/esm/usb/cmsis-dap.js.map +1 -0
- package/build/esm/usb/cmsis-dap.test.d.ts +1 -0
- package/build/esm/usb/cmsis-dap.test.js +348 -0
- package/build/esm/usb/cmsis-dap.test.js.map +1 -0
- package/build/esm/usb/connection.d.ts +81 -0
- package/build/esm/{usb.js → usb/connection.js} +239 -161
- package/build/esm/usb/connection.js.map +1 -0
- package/build/esm/usb/connection.test.d.ts +1 -0
- package/build/esm/{usb.test.js → usb/connection.test.js} +47 -37
- package/build/esm/usb/connection.test.js.map +1 -0
- package/build/esm/usb/cortex-m.d.ts +72 -0
- package/build/esm/usb/cortex-m.js +161 -0
- package/build/esm/usb/cortex-m.js.map +1 -0
- package/build/esm/usb/cortex-m.test.d.ts +1 -0
- package/build/esm/usb/cortex-m.test.js +215 -0
- package/build/esm/usb/cortex-m.test.js.map +1 -0
- package/build/esm/usb/daplink.d.ts +69 -0
- package/build/esm/usb/daplink.js +231 -0
- package/build/esm/usb/daplink.js.map +1 -0
- package/build/esm/usb/daplink.test.d.ts +1 -0
- package/build/esm/usb/daplink.test.js +288 -0
- package/build/esm/usb/daplink.test.js.map +1 -0
- package/build/esm/usb/device-wrapper.d.ts +34 -0
- package/build/esm/usb/device-wrapper.js +98 -0
- package/build/esm/usb/device-wrapper.js.map +1 -0
- package/build/esm/usb/index.d.ts +5 -0
- package/build/esm/usb/index.js +5 -0
- package/build/esm/usb/index.js.map +1 -0
- package/build/{cjs/usb-partial-flashing-utils.d.ts → esm/usb/partial-flashing-utils.d.ts} +6 -9
- package/build/esm/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +4 -44
- package/build/esm/usb/partial-flashing-utils.js.map +1 -0
- package/build/{cjs/usb-partial-flashing.d.ts → esm/usb/partial-flashing.d.ts} +15 -7
- package/build/esm/{usb-partial-flashing.js → usb/partial-flashing.js} +62 -94
- package/build/esm/usb/partial-flashing.js.map +1 -0
- package/build/esm/usb/promise-queue.js.map +1 -0
- package/build/esm/usb/promise-queue.test.d.ts +1 -0
- package/build/esm/usb/promise-queue.test.js.map +1 -0
- package/build/esm/usb/serial-events.d.ts +21 -0
- package/build/esm/usb/serial-events.js +2 -0
- package/build/esm/usb/serial-events.js.map +1 -0
- package/build/esm/usb/transport.d.ts +42 -0
- package/build/esm/usb/transport.js +151 -0
- package/build/esm/usb/transport.js.map +1 -0
- package/package.json +43 -2
- package/build/cjs/accelerometer-service.js.map +0 -1
- package/build/cjs/accelerometer.d.ts +0 -9
- package/build/cjs/accelerometer.js +0 -16
- package/build/cjs/accelerometer.js.map +0 -1
- package/build/cjs/bluetooth-device-wrapper.js.map +0 -1
- package/build/cjs/bluetooth.js.map +0 -1
- package/build/cjs/bluetooth.test.js.map +0 -1
- package/build/cjs/board-serial-info.js.map +0 -1
- package/build/cjs/board-serial-info.test.js.map +0 -1
- package/build/cjs/button-service.js.map +0 -1
- package/build/cjs/buttons.d.ts +0 -10
- package/build/cjs/buttons.js +0 -22
- package/build/cjs/buttons.js.map +0 -1
- package/build/cjs/constants.d.ts +0 -48
- package/build/cjs/constants.js +0 -73
- package/build/cjs/constants.js.map +0 -1
- package/build/cjs/device-bond-state.js.map +0 -1
- package/build/cjs/device-information-service.js.map +0 -1
- package/build/cjs/dfu-service.js.map +0 -1
- package/build/cjs/flashing/flashing-full.js.map +0 -1
- package/build/cjs/flashing/flashing-makecode.js.map +0 -1
- package/build/cjs/flashing/flashing-makecode.test.js.map +0 -1
- package/build/cjs/flashing/flashing-partial.js.map +0 -1
- package/build/cjs/flashing/flashing-v1.js.map +0 -1
- package/build/cjs/flashing/nordic-dfu.js.map +0 -1
- package/build/cjs/flashing/zip.js.map +0 -1
- package/build/cjs/flashing/zip.test.js.map +0 -1
- package/build/cjs/hex-flash-data-source.js.map +0 -1
- package/build/cjs/led-service.js.map +0 -1
- package/build/cjs/led.d.ts +0 -6
- package/build/cjs/led.js.map +0 -1
- package/build/cjs/magnetometer-service.js.map +0 -1
- package/build/cjs/magnetometer.d.ts +0 -9
- package/build/cjs/magnetometer.js +0 -16
- package/build/cjs/magnetometer.js.map +0 -1
- package/build/cjs/partial-flashing-service.js.map +0 -1
- package/build/cjs/promise-queue.js.map +0 -1
- package/build/cjs/promise-queue.test.js.map +0 -1
- package/build/cjs/serial-events.d.ts +0 -20
- package/build/cjs/serial-events.js +0 -69
- package/build/cjs/serial-events.js.map +0 -1
- package/build/cjs/uart-service.js.map +0 -1
- package/build/cjs/uart.d.ts +0 -4
- package/build/cjs/uart.js +0 -16
- package/build/cjs/uart.js.map +0 -1
- package/build/cjs/usb-device-wrapper.d.ts +0 -47
- package/build/cjs/usb-device-wrapper.js +0 -437
- package/build/cjs/usb-device-wrapper.js.map +0 -1
- package/build/cjs/usb-partial-flashing-utils.js.map +0 -1
- package/build/cjs/usb-partial-flashing.js.map +0 -1
- package/build/cjs/usb-radio-bridge.d.ts +0 -24
- package/build/cjs/usb-radio-bridge.js.map +0 -1
- package/build/cjs/usb-serial-protocol.js.map +0 -1
- package/build/cjs/usb.d.ts +0 -66
- package/build/cjs/usb.js.map +0 -1
- package/build/cjs/usb.test.js.map +0 -1
- package/build/esm/accelerometer-service.js.map +0 -1
- package/build/esm/accelerometer.d.ts +0 -9
- package/build/esm/accelerometer.js +0 -12
- package/build/esm/accelerometer.js.map +0 -1
- package/build/esm/bluetooth-device-wrapper.js.map +0 -1
- package/build/esm/bluetooth-profile.js.map +0 -1
- package/build/esm/bluetooth.js.map +0 -1
- package/build/esm/bluetooth.test.js.map +0 -1
- package/build/esm/board-serial-info.js.map +0 -1
- package/build/esm/board-serial-info.test.js.map +0 -1
- package/build/esm/button-service.js.map +0 -1
- package/build/esm/buttons.d.ts +0 -10
- package/build/esm/buttons.js +0 -18
- package/build/esm/buttons.js.map +0 -1
- package/build/esm/constants.d.ts +0 -48
- package/build/esm/constants.js +0 -70
- package/build/esm/constants.js.map +0 -1
- package/build/esm/device-bond-state.js.map +0 -1
- package/build/esm/device-information-service.js.map +0 -1
- package/build/esm/dfu-service.js.map +0 -1
- package/build/esm/flashing/flashing-full.js.map +0 -1
- package/build/esm/flashing/flashing-makecode.js.map +0 -1
- package/build/esm/flashing/flashing-makecode.test.js.map +0 -1
- package/build/esm/flashing/flashing-partial.js.map +0 -1
- package/build/esm/flashing/flashing-v1.js.map +0 -1
- package/build/esm/flashing/nordic-dfu.js.map +0 -1
- package/build/esm/flashing/zip.js.map +0 -1
- package/build/esm/flashing/zip.test.js.map +0 -1
- package/build/esm/hex-flash-data-source.js.map +0 -1
- package/build/esm/led-service.js.map +0 -1
- package/build/esm/led.d.ts +0 -6
- package/build/esm/led.js +0 -2
- package/build/esm/led.js.map +0 -1
- package/build/esm/magnetometer-service.js.map +0 -1
- package/build/esm/magnetometer.d.ts +0 -9
- package/build/esm/magnetometer.js +0 -12
- package/build/esm/magnetometer.js.map +0 -1
- package/build/esm/partial-flashing-service.js.map +0 -1
- package/build/esm/promise-queue.js.map +0 -1
- package/build/esm/promise-queue.test.js.map +0 -1
- package/build/esm/serial-events.d.ts +0 -20
- package/build/esm/serial-events.js +0 -61
- package/build/esm/serial-events.js.map +0 -1
- package/build/esm/uart-service.js.map +0 -1
- package/build/esm/uart.d.ts +0 -4
- package/build/esm/uart.js +0 -12
- package/build/esm/uart.js.map +0 -1
- package/build/esm/usb-device-wrapper.d.ts +0 -47
- package/build/esm/usb-device-wrapper.js +0 -410
- package/build/esm/usb-device-wrapper.js.map +0 -1
- package/build/esm/usb-partial-flashing-utils.js.map +0 -1
- package/build/esm/usb-partial-flashing.js.map +0 -1
- package/build/esm/usb-radio-bridge.d.ts +0 -24
- package/build/esm/usb-radio-bridge.js.map +0 -1
- package/build/esm/usb-serial-protocol.js.map +0 -1
- package/build/esm/usb.d.ts +0 -66
- package/build/esm/usb.js.map +0 -1
- package/build/esm/usb.test.js.map +0 -1
- /package/build/cjs/{bluetooth.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
- /package/build/cjs/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
- /package/build/cjs/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.js +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.js +0 -0
- /package/build/cjs/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
- /package/build/cjs/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
- /package/build/cjs/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
- /package/build/cjs/{board-serial-info.test.d.ts → usb/arm-debug.test.d.ts} +0 -0
- /package/build/{esm → cjs/usb}/board-serial-info.test.d.ts +0 -0
- /package/build/cjs/{promise-queue.test.d.ts → usb/cmsis-dap.test.d.ts} +0 -0
- /package/build/cjs/{usb.test.d.ts → usb/connection.test.d.ts} +0 -0
- /package/build/{esm/bluetooth.test.d.ts → cjs/usb/cortex-m.test.d.ts} +0 -0
- /package/build/{esm/flashing/flashing-makecode.test.d.ts → cjs/usb/daplink.test.d.ts} +0 -0
- /package/build/cjs/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
- /package/build/cjs/{promise-queue.js → usb/promise-queue.js} +0 -0
- /package/build/{esm → cjs/usb}/promise-queue.test.d.ts +0 -0
- /package/build/cjs/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
- /package/build/esm/{flashing/zip.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
- /package/build/esm/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
- /package/build/esm/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
- /package/build/esm/{usb.test.d.ts → bluetooth/flashing/flashing-makecode.test.d.ts} +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.js +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.test.js +0 -0
- /package/build/esm/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
- /package/build/esm/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
- /package/build/esm/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
- /package/build/esm/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
- /package/build/esm/{promise-queue.js → usb/promise-queue.js} +0 -0
- /package/build/esm/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { DeviceError } from "../device.js";
|
|
3
|
+
import { ConsoleLogging } from "../logging.js";
|
|
4
|
+
import { ArmDebugSwd, waitFor } from "./arm-debug.js";
|
|
5
|
+
import { AP, DapResponseMismatchError, DP, READ, WRITE, } from "./cmsis-dap.js";
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Mock DAP
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/**
|
|
10
|
+
* Creates a mock Dap that records transfer calls and returns configurable
|
|
11
|
+
* values. By default all methods resolve successfully.
|
|
12
|
+
*
|
|
13
|
+
* Read operations auto-respond from a register map (keyed by "port:register")
|
|
14
|
+
* when no queued results are available, making tests resilient to changes in
|
|
15
|
+
* the number or ordering of internal transfer calls.
|
|
16
|
+
*/
|
|
17
|
+
function createMockDap() {
|
|
18
|
+
// Track all transfer calls for assertions
|
|
19
|
+
const transferCalls = [];
|
|
20
|
+
// Queue of return values for transfer() — takes priority over registers.
|
|
21
|
+
const transferResults = [];
|
|
22
|
+
// Queue of return values for transferBlockRead()
|
|
23
|
+
const blockReadResults = [];
|
|
24
|
+
// Register map for auto-responding to reads when the queue is empty.
|
|
25
|
+
const registers = new Map();
|
|
26
|
+
let _isOpen = false;
|
|
27
|
+
const mock = {
|
|
28
|
+
get isOpen() {
|
|
29
|
+
return _isOpen;
|
|
30
|
+
},
|
|
31
|
+
blockSize: 59, // same as real CmsisDapUsb (64 - 4 - 1)
|
|
32
|
+
transferCalls,
|
|
33
|
+
registers,
|
|
34
|
+
queueTransferResult(...values) {
|
|
35
|
+
transferResults.push(new Uint32Array(values));
|
|
36
|
+
},
|
|
37
|
+
queueBlockReadResult(...values) {
|
|
38
|
+
blockReadResults.push(new Uint32Array(values));
|
|
39
|
+
},
|
|
40
|
+
open: vi.fn(async () => {
|
|
41
|
+
_isOpen = true;
|
|
42
|
+
}),
|
|
43
|
+
close: vi.fn(async () => {
|
|
44
|
+
_isOpen = false;
|
|
45
|
+
}),
|
|
46
|
+
send: vi.fn(async () => new DataView(new ArrayBuffer(64))),
|
|
47
|
+
clearAbort: vi.fn(async () => { }),
|
|
48
|
+
swjSequence: vi.fn(async () => { }),
|
|
49
|
+
swjClock: vi.fn(async () => { }),
|
|
50
|
+
connect: vi.fn(async () => { }),
|
|
51
|
+
disconnect: vi.fn(async () => { }),
|
|
52
|
+
configureTransfer: vi.fn(async () => { }),
|
|
53
|
+
drainStaleResponses: vi.fn(async () => { }),
|
|
54
|
+
transfer: vi.fn(async (ops) => {
|
|
55
|
+
transferCalls.push([...ops]);
|
|
56
|
+
if (transferResults.length > 0) {
|
|
57
|
+
return transferResults.shift();
|
|
58
|
+
}
|
|
59
|
+
// Auto-respond: return values for READ ops from the register map.
|
|
60
|
+
const readValues = [];
|
|
61
|
+
for (const op of ops) {
|
|
62
|
+
if (op.mode === READ) {
|
|
63
|
+
readValues.push(registers.get(`${op.port}:${op.register}`) ?? 0);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return new Uint32Array(readValues);
|
|
67
|
+
}),
|
|
68
|
+
transferBlockRead: vi.fn(async () => {
|
|
69
|
+
return blockReadResults.shift() ?? new Uint32Array(0);
|
|
70
|
+
}),
|
|
71
|
+
transferBlockWrite: vi.fn(async () => { }),
|
|
72
|
+
};
|
|
73
|
+
return mock;
|
|
74
|
+
}
|
|
75
|
+
// CTRL/STAT power-up ACK bits (must match arm-debug.ts constants)
|
|
76
|
+
const CSYSPWRUPACK = 1 << 31;
|
|
77
|
+
const CDBGPWRUPACK = 1 << 29;
|
|
78
|
+
const POWER_UP_ACK = (CSYSPWRUPACK | CDBGPWRUPACK) >>> 0;
|
|
79
|
+
// AP registers
|
|
80
|
+
const AP_DRW = 0x0c;
|
|
81
|
+
const logging = new ConsoleLogging();
|
|
82
|
+
// DP registers (matching arm-debug.ts constants)
|
|
83
|
+
const DP_DPIDR = 0x0;
|
|
84
|
+
const DP_CTRL_STAT = 0x4;
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Helpers
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
/**
|
|
89
|
+
* Set up register map values so the SWD connect sequence succeeds.
|
|
90
|
+
* Unlike a queue-based approach, this is resilient to changes in the
|
|
91
|
+
* number or ordering of internal transfer calls during connect.
|
|
92
|
+
*/
|
|
93
|
+
function setupConnectRegisters(dap) {
|
|
94
|
+
dap.registers.set(`${DP}:${DP_DPIDR}`, 0x0bb11477);
|
|
95
|
+
dap.registers.set(`${DP}:${DP_CTRL_STAT}`, POWER_UP_ACK);
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Tests
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
describe("ArmDebugSwd", () => {
|
|
101
|
+
let dap;
|
|
102
|
+
let adi;
|
|
103
|
+
beforeEach(() => {
|
|
104
|
+
dap = createMockDap();
|
|
105
|
+
adi = new ArmDebugSwd(dap, logging);
|
|
106
|
+
});
|
|
107
|
+
describe("connect", () => {
|
|
108
|
+
it("runs the SWD init sequence", async () => {
|
|
109
|
+
setupConnectRegisters(dap);
|
|
110
|
+
await adi.connect();
|
|
111
|
+
// Transport opened
|
|
112
|
+
expect(dap.open).toHaveBeenCalled();
|
|
113
|
+
// SWD protocol setup
|
|
114
|
+
expect(dap.swjClock).toHaveBeenCalledWith(10_000_000);
|
|
115
|
+
expect(dap.connect).toHaveBeenCalled();
|
|
116
|
+
expect(dap.configureTransfer).toHaveBeenCalledWith(0, 100, 0);
|
|
117
|
+
// 4 SWJ sequences (line reset, SWD select, line reset, idle)
|
|
118
|
+
expect(dap.swjSequence).toHaveBeenCalledTimes(4);
|
|
119
|
+
// DP register operations happened
|
|
120
|
+
expect(dap.transfer).toHaveBeenCalled();
|
|
121
|
+
});
|
|
122
|
+
it("skips if already connected", async () => {
|
|
123
|
+
setupConnectRegisters(dap);
|
|
124
|
+
await adi.connect();
|
|
125
|
+
vi.mocked(dap.open).mockClear();
|
|
126
|
+
await adi.connect();
|
|
127
|
+
expect(dap.open).not.toHaveBeenCalled();
|
|
128
|
+
});
|
|
129
|
+
it("retries on DapResponseMismatchError", async () => {
|
|
130
|
+
// First attempt: swjClock throws mismatch
|
|
131
|
+
vi.mocked(dap.swjClock).mockRejectedValueOnce(new DapResponseMismatchError(0x11, 0x05));
|
|
132
|
+
// clearAbort on the failed attempt
|
|
133
|
+
vi.mocked(dap.clearAbort).mockResolvedValueOnce(undefined);
|
|
134
|
+
// Second attempt succeeds
|
|
135
|
+
setupConnectRegisters(dap);
|
|
136
|
+
await adi.connect();
|
|
137
|
+
expect(dap.drainStaleResponses).toHaveBeenCalledTimes(1);
|
|
138
|
+
expect(dap.swjClock).toHaveBeenCalledTimes(2);
|
|
139
|
+
});
|
|
140
|
+
it("throws after exhausting retries", async () => {
|
|
141
|
+
vi.mocked(dap.swjClock).mockRejectedValue(new DapResponseMismatchError(0x11, 0x05));
|
|
142
|
+
await expect(adi.connect(2)).rejects.toThrow(DapResponseMismatchError);
|
|
143
|
+
expect(dap.drainStaleResponses).toHaveBeenCalledTimes(1);
|
|
144
|
+
});
|
|
145
|
+
it("rethrows non-mismatch errors immediately", async () => {
|
|
146
|
+
vi.mocked(dap.swjClock).mockRejectedValueOnce(new Error("USB gone"));
|
|
147
|
+
await expect(adi.connect()).rejects.toThrow("USB gone");
|
|
148
|
+
expect(dap.drainStaleResponses).not.toHaveBeenCalled();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe("disconnect", () => {
|
|
152
|
+
it("disconnects and closes transport", async () => {
|
|
153
|
+
setupConnectRegisters(dap);
|
|
154
|
+
await adi.connect();
|
|
155
|
+
await adi.disconnect();
|
|
156
|
+
expect(dap.disconnect).toHaveBeenCalled();
|
|
157
|
+
expect(dap.close).toHaveBeenCalled();
|
|
158
|
+
});
|
|
159
|
+
it("is a no-op if not connected", async () => {
|
|
160
|
+
await adi.disconnect();
|
|
161
|
+
expect(dap.disconnect).not.toHaveBeenCalled();
|
|
162
|
+
expect(dap.close).not.toHaveBeenCalled();
|
|
163
|
+
});
|
|
164
|
+
it("falls back to clearAbort if disconnect fails", async () => {
|
|
165
|
+
setupConnectRegisters(dap);
|
|
166
|
+
await adi.connect();
|
|
167
|
+
vi.mocked(dap.disconnect).mockRejectedValueOnce(new Error("fail"));
|
|
168
|
+
await adi.disconnect();
|
|
169
|
+
expect(dap.clearAbort).toHaveBeenCalled();
|
|
170
|
+
expect(dap.close).toHaveBeenCalled();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe("reinit", () => {
|
|
174
|
+
it("resets state and reconnects without closing", async () => {
|
|
175
|
+
setupConnectRegisters(dap);
|
|
176
|
+
await adi.connect();
|
|
177
|
+
vi.mocked(dap.open).mockClear();
|
|
178
|
+
vi.mocked(dap.close).mockClear();
|
|
179
|
+
// reinit calls connectOnce which needs the full sequence
|
|
180
|
+
setupConnectRegisters(dap);
|
|
181
|
+
await adi.reinit();
|
|
182
|
+
// open is called again (connectOnce opens transport)
|
|
183
|
+
expect(dap.open).toHaveBeenCalled();
|
|
184
|
+
// close was NOT called (reinit doesn't close)
|
|
185
|
+
expect(dap.close).not.toHaveBeenCalled();
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe("readMem32 / writeMem32", () => {
|
|
189
|
+
beforeEach(async () => {
|
|
190
|
+
setupConnectRegisters(dap);
|
|
191
|
+
await adi.connect();
|
|
192
|
+
dap.transferCalls.length = 0;
|
|
193
|
+
});
|
|
194
|
+
it("reads a 32-bit value from memory", async () => {
|
|
195
|
+
dap.queueTransferResult(0xdeadbeef);
|
|
196
|
+
const value = await adi.readMem32(0x10000010);
|
|
197
|
+
expect(value).toBe(0xdeadbeef);
|
|
198
|
+
// Should have generated ops for CSW, TAR, and DRW read
|
|
199
|
+
const ops = dap.transferCalls[0];
|
|
200
|
+
expect(ops.some((op) => op.register === AP_DRW && op.mode === READ)).toBe(true);
|
|
201
|
+
});
|
|
202
|
+
it("writes a 32-bit value to memory", async () => {
|
|
203
|
+
await adi.writeMem32(0x10000010, 0x12345678);
|
|
204
|
+
const ops = dap.transferCalls[0];
|
|
205
|
+
const drwWrite = ops.find((op) => op.register === AP_DRW && op.mode === WRITE);
|
|
206
|
+
expect(drwWrite).toBeDefined();
|
|
207
|
+
expect(drwWrite.value).toBe(0x12345678);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe("register caching", () => {
|
|
211
|
+
beforeEach(async () => {
|
|
212
|
+
setupConnectRegisters(dap);
|
|
213
|
+
await adi.connect();
|
|
214
|
+
dap.transferCalls.length = 0;
|
|
215
|
+
});
|
|
216
|
+
it("caches DP_SELECT and skips redundant writes", async () => {
|
|
217
|
+
// First read: all ops including DP_SELECT
|
|
218
|
+
await adi.readMem32(0x10000010);
|
|
219
|
+
const firstCallOpCount = dap.transferCalls[0].length;
|
|
220
|
+
// Second read at same address: DP_SELECT should be cached
|
|
221
|
+
await adi.readMem32(0x10000010);
|
|
222
|
+
const secondCallOpCount = dap.transferCalls[1].length;
|
|
223
|
+
expect(secondCallOpCount).toBeLessThan(firstCallOpCount);
|
|
224
|
+
});
|
|
225
|
+
it("invalidates cache on transfer error", async () => {
|
|
226
|
+
// First read succeeds, populating cache
|
|
227
|
+
await adi.readMem32(0x10000010);
|
|
228
|
+
// Second read: cache is warm, fewer ops
|
|
229
|
+
await adi.readMem32(0x10000010);
|
|
230
|
+
const cachedCallOpCount = dap.transferCalls[1].length;
|
|
231
|
+
// Third read fails — this invalidates the cache
|
|
232
|
+
vi.mocked(dap.transfer).mockRejectedValueOnce(new Error("fault"));
|
|
233
|
+
await expect(adi.readMem32(0x10000010)).rejects.toThrow("fault");
|
|
234
|
+
// Fourth read: cache should be invalidated, more ops than cached
|
|
235
|
+
await adi.readMem32(0x10000010);
|
|
236
|
+
const afterErrorOpCount = dap.transferCalls[2].length;
|
|
237
|
+
expect(afterErrorOpCount).toBeGreaterThan(cachedCallOpCount);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe("readBlock", () => {
|
|
241
|
+
beforeEach(async () => {
|
|
242
|
+
setupConnectRegisters(dap);
|
|
243
|
+
await adi.connect();
|
|
244
|
+
dap.transferCalls.length = 0;
|
|
245
|
+
});
|
|
246
|
+
it("reads a small block in a single chunk", async () => {
|
|
247
|
+
dap.queueBlockReadResult(0x100, 0x200, 0x300);
|
|
248
|
+
const result = await adi.readBlock(0x20000000, 3);
|
|
249
|
+
expect(result.length).toBe(3);
|
|
250
|
+
expect(result[0]).toBe(0x100);
|
|
251
|
+
expect(result[1]).toBe(0x200);
|
|
252
|
+
expect(result[2]).toBe(0x300);
|
|
253
|
+
expect(dap.transferBlockRead).toHaveBeenCalledTimes(1);
|
|
254
|
+
});
|
|
255
|
+
it("splits reads at TAR auto-increment page boundaries", async () => {
|
|
256
|
+
// Address near a 1KB boundary: 0x200003F0 is 0x10 (16) bytes from the
|
|
257
|
+
// 1KB boundary at 0x20000400, so 4 words fit in the first page.
|
|
258
|
+
const address = 0x200003f0;
|
|
259
|
+
const count = 8; // 4 words in first page + 4 in next
|
|
260
|
+
dap.queueBlockReadResult(1, 2, 3, 4);
|
|
261
|
+
dap.queueBlockReadResult(5, 6, 7, 8);
|
|
262
|
+
const result = await adi.readBlock(address, count);
|
|
263
|
+
expect(result.length).toBe(8);
|
|
264
|
+
expect(Array.from(result)).toEqual([1, 2, 3, 4, 5, 6, 7, 8]);
|
|
265
|
+
expect(dap.transferBlockRead).toHaveBeenCalledTimes(2);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe("writeBlock", () => {
|
|
269
|
+
beforeEach(async () => {
|
|
270
|
+
setupConnectRegisters(dap);
|
|
271
|
+
await adi.connect();
|
|
272
|
+
dap.transferCalls.length = 0;
|
|
273
|
+
});
|
|
274
|
+
it("writes a small block in a single chunk", async () => {
|
|
275
|
+
await adi.writeBlock(0x20000000, new Uint32Array([0xaa, 0xbb]));
|
|
276
|
+
expect(dap.transferBlockWrite).toHaveBeenCalledTimes(1);
|
|
277
|
+
const call = vi.mocked(dap.transferBlockWrite).mock.calls[0];
|
|
278
|
+
expect(call[0]).toBe(AP);
|
|
279
|
+
expect(call[1]).toBe(AP_DRW);
|
|
280
|
+
expect(Array.from(call[2])).toEqual([0xaa, 0xbb]);
|
|
281
|
+
});
|
|
282
|
+
it("splits writes at TAR auto-increment page boundaries", async () => {
|
|
283
|
+
const address = 0x200003f0; // 16 bytes (4 words) from 1KB boundary
|
|
284
|
+
await adi.writeBlock(address, new Uint32Array([1, 2, 3, 4, 5, 6, 7, 8]));
|
|
285
|
+
expect(dap.transferBlockWrite).toHaveBeenCalledTimes(2);
|
|
286
|
+
const firstChunk = vi.mocked(dap.transferBlockWrite).mock.calls[0][2];
|
|
287
|
+
const secondChunk = vi.mocked(dap.transferBlockWrite).mock.calls[1][2];
|
|
288
|
+
expect(Array.from(firstChunk)).toEqual([1, 2, 3, 4]);
|
|
289
|
+
expect(Array.from(secondChunk)).toEqual([5, 6, 7, 8]);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
describe("transferSequence", () => {
|
|
293
|
+
beforeEach(async () => {
|
|
294
|
+
setupConnectRegisters(dap);
|
|
295
|
+
await adi.connect();
|
|
296
|
+
dap.transferCalls.length = 0;
|
|
297
|
+
});
|
|
298
|
+
it("executes groups as separate transfers and concatenates results", async () => {
|
|
299
|
+
const callsBefore = dap.transferCalls.length;
|
|
300
|
+
dap.queueTransferResult(0x11);
|
|
301
|
+
dap.queueTransferResult(0x22);
|
|
302
|
+
const result = await adi.transferSequence([
|
|
303
|
+
[{ port: DP, mode: READ, register: 0x00 }],
|
|
304
|
+
[{ port: DP, mode: READ, register: 0x04 }],
|
|
305
|
+
]);
|
|
306
|
+
// Two new transfer calls for our two groups
|
|
307
|
+
expect(dap.transferCalls.length - callsBefore).toBe(2);
|
|
308
|
+
expect(result.length).toBe(2);
|
|
309
|
+
expect(result[0]).toBe(0x11);
|
|
310
|
+
expect(result[1]).toBe(0x22);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
describe("waitFor", () => {
|
|
314
|
+
it("throws DeviceError on timeout", async () => {
|
|
315
|
+
await expect(waitFor(() => Promise.resolve(false), 1)).rejects.toThrow(DeviceError);
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
describe("resetState", () => {
|
|
319
|
+
it("allows reconnecting after reset", async () => {
|
|
320
|
+
setupConnectRegisters(dap);
|
|
321
|
+
await adi.connect();
|
|
322
|
+
adi.resetState();
|
|
323
|
+
// Should be able to connect again (connectOnce won't skip)
|
|
324
|
+
setupConnectRegisters(dap);
|
|
325
|
+
await adi.connect();
|
|
326
|
+
// open called twice
|
|
327
|
+
expect(dap.open).toHaveBeenCalledTimes(2);
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
//# sourceMappingURL=arm-debug.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arm-debug.test.js","sourceRoot":"","sources":["../../../src/usb/arm-debug.test.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 "
|
|
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 "
|
|
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
|
|
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(`
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import { BoardId } from "
|
|
6
|
+
import { BoardId } from "../board-id.js";
|
|
7
7
|
import { BoardSerialInfo } from "./board-serial-info.js";
|
|
8
8
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
9
9
|
describe("BoardSerialInfo", () => {
|
|
@@ -38,9 +38,7 @@ describe("BoardSerialInfo", () => {
|
|
|
38
38
|
familyId: "3602",
|
|
39
39
|
hic: "00097969",
|
|
40
40
|
});
|
|
41
|
-
expect(log.mock.calls).toEqual([
|
|
42
|
-
["USB serial number unexpected length: 45"],
|
|
43
|
-
]);
|
|
41
|
+
expect(log.mock.calls).toEqual([["Serial number unexpected length: 45"]]);
|
|
44
42
|
});
|
|
45
43
|
});
|
|
46
44
|
//# sourceMappingURL=board-serial-info.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-serial-info.test.js","sourceRoot":"","sources":["../../../src/usb/board-serial-info.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,KAAK,GAAG;QACZ,YAAY,EAAE,kDAAkD;KACpD,CAAC;IACf,MAAM,WAAW,GAAG;QAClB,YAAY,EAAE,+CAA+C;KACjD,CAAC;IACf,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,EAAE,EAAe,CAAC;IAClD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;QAEjE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACzB,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACzB,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (c) 2026, Micro:bit Educational Foundation and contributors
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { CoreRegister } from "./cortex-m.js";
|
|
7
|
+
const CDC_SAT_LOAD_ADDR = 0x20000000;
|
|
8
|
+
// DAPLink's UART RX ring buffer + CDC TX buffer must both fill before CDC
|
|
9
|
+
// stops consuming. Buffer sizes vary by interface chip:
|
|
10
|
+
// KL26/KL27: 64 + 64 = 128 bytes
|
|
11
|
+
// nRF52820/nRF52833: 1024 + 64 = 1088 bytes
|
|
12
|
+
// 2048 covers all known variants with headroom (~178ms at 115200 baud).
|
|
13
|
+
const CDC_SAT_BYTE_COUNT = 2048;
|
|
14
|
+
// nRF51 legacy UART registers (base 0x40002000)
|
|
15
|
+
const NRF51_UART_TASKS_STARTTX = 0x40002008;
|
|
16
|
+
const NRF51_UART_TASKS_STOPTX = 0x4000200c;
|
|
17
|
+
const NRF51_UART_EVENTS_TXDRDY = 0x4000211c;
|
|
18
|
+
const NRF51_UART_ENABLE = 0x40002500;
|
|
19
|
+
const NRF51_UART_PSEL_TXD = 0x4000250c;
|
|
20
|
+
const NRF51_UART_BAUDRATE = 0x40002524;
|
|
21
|
+
const NRF51_UART_TXD = 0x4000251c;
|
|
22
|
+
// nRF52833 UARTE registers (base 0x40002000)
|
|
23
|
+
const NRF52_UARTE_TASKS_STARTTX = 0x40002008;
|
|
24
|
+
const NRF52_UARTE_TASKS_STOPTX = 0x4000210c;
|
|
25
|
+
const NRF52_UARTE_EVENTS_ENDTX = 0x40002120;
|
|
26
|
+
const NRF52_UARTE_EVENTS_TXSTOPPED = 0x40002158;
|
|
27
|
+
const NRF52_UARTE_ENABLE = 0x40002500;
|
|
28
|
+
const NRF52_UARTE_PSEL_TXD = 0x4000250c;
|
|
29
|
+
const NRF52_UARTE_BAUDRATE = 0x40002524;
|
|
30
|
+
const NRF52_UARTE_TXD_PTR = 0x40002544;
|
|
31
|
+
const NRF52_UARTE_TXD_MAXCNT = 0x40002548;
|
|
32
|
+
// UART baud rate register value for 115200 (same encoding on nRF51 and nRF52)
|
|
33
|
+
const NRF_BAUDRATE_115200 = 0x01d7e000;
|
|
34
|
+
// micro:bit UART TX pins (target → interface chip)
|
|
35
|
+
const MICROBIT_V1_TX_PIN = 24; // P0.24
|
|
36
|
+
const MICROBIT_V2_TX_PIN = 6; // P0.06
|
|
37
|
+
/**
|
|
38
|
+
* Push dummy data through the target's UART to fill DAPLink's internal
|
|
39
|
+
* CDC buffers, preventing CDC from consuming post-flash serial output.
|
|
40
|
+
* Must be called while the target is halted.
|
|
41
|
+
*/
|
|
42
|
+
export async function saturateCdcPipeline(device, boardVersion, logging) {
|
|
43
|
+
try {
|
|
44
|
+
if (boardVersion === "V1") {
|
|
45
|
+
await saturateCdcV1(device, logging);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await saturateCdcV2(device, logging);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
logging.log(`CDC saturation failed (non-fatal): ${e instanceof Error ? e.message : e}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* V1 (nRF51): Run a Thumb blob that sends CDC_SAT_BYTE_COUNT bytes at
|
|
57
|
+
* wire speed through the legacy UART. The CPU is resumed with PRIMASK=1
|
|
58
|
+
* to prevent the halted program's ISRs from interfering.
|
|
59
|
+
*
|
|
60
|
+
* Blob register convention (values passed via writeCoreRegister):
|
|
61
|
+
* r0 = byte count, r1 = TXD addr, r2 = TXDRDY addr,
|
|
62
|
+
* r3 = data byte, r4 = 0 (for clearing events)
|
|
63
|
+
*
|
|
64
|
+
* Thumb instructions (word 0 is a BKPT pair used as the LR target):
|
|
65
|
+
* loop: str r4, [r2] // clear TXDRDY
|
|
66
|
+
* str r3, [r1] // write TXD
|
|
67
|
+
* wait: ldr r5, [r2] // read TXDRDY
|
|
68
|
+
* cmp r5, #0
|
|
69
|
+
* beq wait
|
|
70
|
+
* subs r0, #1
|
|
71
|
+
* bne loop
|
|
72
|
+
* bkpt #0
|
|
73
|
+
*/
|
|
74
|
+
async function saturateCdcV1(device, logging) {
|
|
75
|
+
const { adi, cortexM } = device;
|
|
76
|
+
// Stop any in-flight TX and fully reconfigure the UART from scratch.
|
|
77
|
+
// The previous program (e.g. MakeCode) may not have set up the UART at
|
|
78
|
+
// all, so we can't assume any registers are configured.
|
|
79
|
+
await adi.writeMem32(NRF51_UART_TASKS_STOPTX, 1);
|
|
80
|
+
await adi.writeMem32(NRF51_UART_ENABLE, 0);
|
|
81
|
+
await adi.writeMem32(NRF51_UART_PSEL_TXD, MICROBIT_V1_TX_PIN);
|
|
82
|
+
await adi.writeMem32(NRF51_UART_BAUDRATE, NRF_BAUDRATE_115200);
|
|
83
|
+
await adi.writeMem32(NRF51_UART_ENABLE, 4); // UART enable
|
|
84
|
+
await adi.writeMem32(NRF51_UART_EVENTS_TXDRDY, 0);
|
|
85
|
+
await adi.writeMem32(NRF51_UART_TASKS_STARTTX, 1);
|
|
86
|
+
const blob = new Uint32Array([
|
|
87
|
+
0xbe00be00, // BKPT (LR target) + pad
|
|
88
|
+
0x600b6014, // str r4,[r2]; str r3,[r1]
|
|
89
|
+
0x2d006815, // ldr r5,[r2]; cmp r5,#0
|
|
90
|
+
0x3801d0fc, // beq wait; subs r0,#1
|
|
91
|
+
0xbe00d1f8, // bne loop; bkpt
|
|
92
|
+
]);
|
|
93
|
+
await adi.writeBlock(CDC_SAT_LOAD_ADDR, blob);
|
|
94
|
+
await cortexM.writeCoreRegister(CoreRegister.PC, (CDC_SAT_LOAD_ADDR + 4) | 1);
|
|
95
|
+
await cortexM.writeCoreRegister(CoreRegister.LR, CDC_SAT_LOAD_ADDR | 1);
|
|
96
|
+
await cortexM.writeCoreRegister(CoreRegister.SP, 0x20004000);
|
|
97
|
+
await cortexM.writeCoreRegister(CoreRegister.PSR, 0x01000000);
|
|
98
|
+
await cortexM.writeCoreRegister(0, CDC_SAT_BYTE_COUNT);
|
|
99
|
+
await cortexM.writeCoreRegister(1, NRF51_UART_TXD);
|
|
100
|
+
await cortexM.writeCoreRegister(2, NRF51_UART_EVENTS_TXDRDY);
|
|
101
|
+
await cortexM.writeCoreRegister(3, 0x00); // NUL byte (ignored by terminals)
|
|
102
|
+
await cortexM.writeCoreRegister(4, 0);
|
|
103
|
+
await cortexM.writeCoreRegister(20, 1); // PRIMASK = 1
|
|
104
|
+
await cortexM.resume(false);
|
|
105
|
+
// Wait for blob to hit its final BKPT (~178ms for 2048 bytes at 115200).
|
|
106
|
+
for (let i = 0; i < 2000; i++) {
|
|
107
|
+
if (await cortexM.isHalted())
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
logging.log("V1 CDC saturation blob did not complete, halting");
|
|
111
|
+
await cortexM.halt();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* V2 (nRF52833): Set up a UARTE DMA transfer via SWD register writes.
|
|
115
|
+
* The DMA engine runs independently of the halted CPU.
|
|
116
|
+
*/
|
|
117
|
+
async function saturateCdcV2(device, logging) {
|
|
118
|
+
const { adi } = device;
|
|
119
|
+
// Stop any in-flight transfer cleanly
|
|
120
|
+
await adi.writeMem32(NRF52_UARTE_EVENTS_TXSTOPPED, 0);
|
|
121
|
+
await adi.writeMem32(NRF52_UARTE_TASKS_STOPTX, 1);
|
|
122
|
+
for (let i = 0; i < 100; i++) {
|
|
123
|
+
if (await adi.readMem32(NRF52_UARTE_EVENTS_TXSTOPPED))
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
// Fully reconfigure UARTE from scratch — the previous program may not
|
|
127
|
+
// have set up the peripheral at all.
|
|
128
|
+
await adi.writeMem32(NRF52_UARTE_ENABLE, 0);
|
|
129
|
+
await adi.writeMem32(NRF52_UARTE_PSEL_TXD, MICROBIT_V2_TX_PIN);
|
|
130
|
+
await adi.writeMem32(NRF52_UARTE_BAUDRATE, NRF_BAUDRATE_115200);
|
|
131
|
+
await adi.writeMem32(NRF52_UARTE_ENABLE, 8); // 8 = UARTE mode
|
|
132
|
+
// Write NUL bytes to RAM for the DMA buffer (harmless if seen by a
|
|
133
|
+
// CDC reader — terminals ignore NUL).
|
|
134
|
+
const nulBuf = new Uint32Array(CDC_SAT_BYTE_COUNT / 4);
|
|
135
|
+
await adi.writeBlock(CDC_SAT_LOAD_ADDR, nulBuf);
|
|
136
|
+
// Set up DMA and trigger
|
|
137
|
+
await adi.writeMem32(NRF52_UARTE_TXD_PTR, CDC_SAT_LOAD_ADDR);
|
|
138
|
+
await adi.writeMem32(NRF52_UARTE_TXD_MAXCNT, CDC_SAT_BYTE_COUNT);
|
|
139
|
+
await adi.writeMem32(NRF52_UARTE_EVENTS_ENDTX, 0);
|
|
140
|
+
await adi.writeMem32(NRF52_UARTE_TASKS_STARTTX, 1);
|
|
141
|
+
// Poll for ENDTX (~178ms for 2048 bytes at 115200 baud).
|
|
142
|
+
for (let i = 0; i < 2000; i++) {
|
|
143
|
+
if (await adi.readMem32(NRF52_UARTE_EVENTS_ENDTX))
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
logging.log("UARTE ENDTX not detected after polling");
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=cdc-saturation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdc-saturation.js","sourceRoot":"","sources":["../../../src/usb/cdc-saturation.ts"],"names":[],"mappings":"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"}
|